@spotify/backstage-plugin-soundcheck 0.22.0 → 0.22.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/alpha/apis.esm.js +1 -1
  3. package/dist/alpha/plugin.esm.js +1 -1
  4. package/dist/alpha.d.ts +10 -1
  5. package/dist/api.esm.js +1 -1
  6. package/dist/blueprints/IntegrationPageBlueprint.esm.js +1 -1
  7. package/dist/components/CampaignCreatePage/CampaignCreatePage.esm.js +1 -1
  8. package/dist/components/CampaignForm/hooks/useCampaignForm.esm.js +1 -1
  9. package/dist/components/CampaignPage/CampaignPageBUI.esm.js +1 -1
  10. package/dist/components/CampaignPage/CampaignTechInsightsExplorerPage.esm.js +1 -1
  11. package/dist/components/CampaignsPage/CampaignListPageBUI.esm.js +1 -1
  12. package/dist/components/CampaignsPage/EditCampaignView.esm.js +1 -1
  13. package/dist/components/CertificationAccordion/CertificationAccordion.esm.js +1 -1
  14. package/dist/components/CertificationSidebar/CertificationSidebar.esm.js +1 -1
  15. package/dist/components/CertificationSidebar/Check.esm.js +1 -1
  16. package/dist/components/CertificationSidebar/ExemptionJustificationDialog.esm.js +1 -1
  17. package/dist/components/CertificationsPage/CertificationTab.esm.js +1 -1
  18. package/dist/components/CertificationsPage/CertificationTabs.esm.js +1 -1
  19. package/dist/components/CertificationsPage/CertificationsPage.esm.js +1 -1
  20. package/dist/components/CertificationsPage/Playlist/PlaylistContext.esm.js +1 -1
  21. package/dist/components/CheckCreatePage/CheckCreatePage.esm.js +1 -1
  22. package/dist/components/CheckDetails/CheckDetails.esm.js +1 -1
  23. package/dist/components/CheckDetails/CheckPullRequest.esm.js +2 -0
  24. package/dist/components/CheckDryRun/CheckDryRun.esm.js +1 -1
  25. package/dist/components/CheckForm/CheckForm.esm.js +1 -1
  26. package/dist/components/CheckForm/FormFields/RuleInput/Conditions/useRuleOptions.esm.js +1 -1
  27. package/dist/components/CheckForm/FormFields/RuleInput/RuleInputBox.esm.js +1 -1
  28. package/dist/components/CheckForm/Steps/CheckApplicabilityStep.esm.js +1 -1
  29. package/dist/components/CheckForm/Steps/CheckDetailsStep.esm.js +1 -1
  30. package/dist/components/CheckForm/Steps/CheckRulesStep.esm.js +1 -1
  31. package/dist/components/CheckForm/useCheckForm.esm.js +1 -1
  32. package/dist/components/CheckPage/CheckEditPage.esm.js +1 -1
  33. package/dist/components/CheckPage/CheckEditView.esm.js +1 -1
  34. package/dist/components/CheckPage/CheckPageBUI.esm.js +1 -1
  35. package/dist/components/CheckPage/ExemptionsTableBUI.esm.js +1 -1
  36. package/dist/components/CheckSelection/CheckSelection.esm.js +1 -1
  37. package/dist/components/ChecksPage/ChecksListPageBUI.esm.js +1 -1
  38. package/dist/components/ChecksTable/ChecksTable.esm.js +1 -1
  39. package/dist/components/ChecksTable/FixMeCell.esm.js +2 -0
  40. package/dist/components/ChecksTable/PullRequestsTable.esm.js +2 -0
  41. package/dist/components/CollectorPage/CollectorDetailsPageBUI.esm.js +1 -1
  42. package/dist/components/CollectorPage/CollectorDetailsPageDeprecated.esm.js +1 -1
  43. package/dist/components/CollectorPage/Configurators/AzureDevOps/AzureDevOpsConfigurator.esm.js +1 -1
  44. package/dist/components/CollectorPage/Configurators/BigQuery/BigQueryConfigurator.esm.js +1 -1
  45. package/dist/components/CollectorPage/Configurators/Catalog/CatalogConfigurator.esm.js +1 -1
  46. package/dist/components/CollectorPage/Configurators/DataDog/DataDogConfigurator.esm.js +1 -1
  47. package/dist/components/CollectorPage/Configurators/DataRegistry/DataRegistryConfigurator.esm.js +1 -1
  48. package/dist/components/CollectorPage/Configurators/Github/GithubConfigurator.esm.js +1 -1
  49. package/dist/components/CollectorPage/Configurators/Gitlab/GitlabConfigurator.esm.js +1 -1
  50. package/dist/components/CollectorPage/Configurators/HTTP/HttpConfigurator.esm.js +1 -1
  51. package/dist/components/CollectorPage/Configurators/Jira/JiraConfigurator.esm.js +1 -1
  52. package/dist/components/CollectorPage/Configurators/Kubernetes/KubernetesConfigurator.esm.js +1 -1
  53. package/dist/components/CollectorPage/Configurators/NewRelic/NewRelicConfigurator.esm.js +1 -1
  54. package/dist/components/CollectorPage/Configurators/PagerDuty/PagerDutyConfigurator.esm.js +1 -1
  55. package/dist/components/CollectorPage/Configurators/SCM/ScmConfigurator.esm.js +1 -1
  56. package/dist/components/CollectorPage/Configurators/SonarQube/SonarQubeConfigurator.esm.js +1 -1
  57. package/dist/components/CollectorsPage/IntegrationsListPageBUI.esm.js +1 -1
  58. package/dist/components/EntitySoundcheckCard/Card.esm.js +1 -1
  59. package/dist/components/FactExplorer/useFactOptions.esm.js +1 -1
  60. package/dist/components/FixMeButton/FixMeButton.esm.js +2 -0
  61. package/dist/components/FixWithAiKAButton/FixWithAiKAButton.esm.js +2 -0
  62. package/dist/components/GroupSelectorBUI/GroupSelectList.esm.js +1 -1
  63. package/dist/components/LevelUpParty/LevelUpParty.esm.js +1 -1
  64. package/dist/components/LoadingIcon/LoadingIcon.esm.js +2 -0
  65. package/dist/components/Menus/useCampaignActions.esm.js +1 -1
  66. package/dist/components/Menus/useCheckActions.esm.js +1 -1
  67. package/dist/components/Menus/useTrackActions.esm.js +1 -1
  68. package/dist/components/OverviewTable/ResultsTable.esm.js +1 -1
  69. package/dist/components/ProgressBar/ProgressBar.esm.js +2 -0
  70. package/dist/components/RefetchingIndicator/RefetchingIndicator.esm.js +1 -1
  71. package/dist/components/RelativeTime/RelativeTime.esm.js +1 -1
  72. package/dist/components/Router.esm.js +1 -1
  73. package/dist/components/SendCampaignNotificationDialog/SendCampaignNotificationDialogBUI.esm.js +1 -1
  74. package/dist/components/TableRowWithOwner/TableRowWithOwner.esm.js +1 -1
  75. package/dist/components/TechInsights/TechInsightsPageBUI.esm.js +1 -1
  76. package/dist/components/TechInsightsExplorerTable/TechInsightsExplorerTable.esm.js +1 -1
  77. package/dist/components/TopFailingChecksTable/TopFailingChecksTableBUI.esm.js +1 -1
  78. package/dist/components/TrackCreatePage/TrackCreatePage.esm.js +1 -1
  79. package/dist/components/TrackEditPage/TrackEditPage.esm.js +1 -1
  80. package/dist/components/TrackEditPage/TrackEditView.esm.js +1 -1
  81. package/dist/components/TrackForm/utils/useTrackForm.esm.js +1 -1
  82. package/dist/components/TrackPage/TrackPageBUI.esm.js +1 -1
  83. package/dist/components/TrackPage/TrackTechInsightsExplorerPage.esm.js +1 -1
  84. package/dist/components/TracksPage/TracksListPageBUI.esm.js +1 -1
  85. package/dist/components/ViewPullRequests/ViewPullRequests.esm.js +2 -0
  86. package/dist/contexts/UserProvider.esm.js +1 -1
  87. package/dist/hooks/fixMe/useFixMe.esm.js +2 -0
  88. package/dist/hooks/fixWithAika/useFixWithAika.esm.js +2 -0
  89. package/dist/hooks/groups/useGroupOptions.esm.js +1 -1
  90. package/dist/hooks/remedy/useRemediesForCheck.esm.js +2 -0
  91. package/dist/hooks/remedy/useRemediesForEntity.esm.js +2 -0
  92. package/dist/index.d.ts +23 -2
  93. package/dist/index.esm.js +1 -1
  94. package/dist/plugin.esm.js +1 -1
  95. package/package.json +2 -2
@@ -1,2 +1,2 @@
1
- import{jsx as t,jsxs as c,Fragment as v}from"react/jsx-runtime";import{useRouteRef as y}from"@backstage/core-plugin-api";import{useEntityPresentation as C}from"@backstage/plugin-catalog-react";import{TableRoot as N,TableHeader as E,Column as h,TableBody as B,TablePagination as k,Row as O,CellProfile as z,CellText as M,Flex as D,Box as w,Text as L}from"@backstage/ui";import{makeStyles as $}from"@material-ui/core";import{sortBy as j}from"lodash";import{useMemo as P}from"react";import{useNavigate as F,createSearchParams as H}from"react-router-dom";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useSearchName as A}from"../../hooks/useSearchName.esm.js";import{usePagination as G}from"../../hooks/usePagination.esm.js";import{useSortTableLocalStorage as U}from"../../hooks/useSortTableLocalStorage.esm.js";import{useProfileImages as V}from"../../hooks/catalog/useProfileImages.esm.js";import{trackOverviewRouteRef as W,campaignOverviewRouteRef as X}from"../../routes.esm.js";import{CustomCell as Y}from"../CustomCell/CustomCell.esm.js";import"../EmptyState/EmptyState.esm.js";import{EmptyStateBUI as q}from"../EmptyState/EmptyStateBUI.esm.js";import"@backstage/plugin-permission-react";import"@remixicon/react";import{LoadingTableSkeleton as J}from"../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";import{StatusBar as K}from"../StatusBar/StatusBar.esm.js";const R=10,Q=(e,m=[])=>{const o=[],a=r=>{!r.children||r.children.length===0?r.numberOfEntities>0&&o.push(r):(m.includes(r.entityRef)&&r.numberOfEntities>0&&o.push(r),r.children.forEach(l=>a(l)))};return a(e),o},Z=$(()=>({statusPercent:{width:"var(--bui-space-12)"},statusBar:{width:"100%"}})),_=({row:e,profileImageMap:m,trackId:o,campaignId:a})=>{const r=Z(),l=y(W),p=y(X),s=F(),{primaryTitle:d}=C(e.entityRef);return c(O,{onAction:()=>{o&&s({pathname:a?p({campaignId:a}):l({trackId:o}),search:`?${H({owners:[e.entityRef]})}`})},children:[t(z,{name:d,src:m[e.entityRef]??d}),t(M,{title:`${e.numberOfEntities} ${e.numberOfEntities===1?"entity":"entities"}`}),t(Y,{children:c(D,{align:"center",gap:"2",children:[t(w,{className:r.statusPercent,children:c(L,{children:[e.passPercentage,"%"]})}),t(w,{className:r.statusBar,children:t(K,{passedPercent:e.passPercentage,failedPercent:e.failPercentage,warningPercent:e.warningPercentage,notReportedPercent:e.notReportedPercentage,errorPercent:e.errorPercentage})})]})})]})},ee=({tableData:e,isLoading:m,trackId:o,selectedGroup:a,searchValue:r,campaignId:l})=>{const{order:p,orderBy:s,handleSort:d}=U({localStoragePrefix:"soundcheck-tech-insights-explorer",defaultSortBy:"entities",defaultDirection:"desc"}),f=P(()=>e?Q(e,a?[a]:[]):[],[a,e]),S=A({items:f,searchTerm:r}),g=P(()=>{const i=j(S??[],u=>s==="name"?u.name:s==="passPercentage"?u.passPercentage:s==="entities"?u.numberOfEntities:0);return p==="desc"&&i.reverse(),i},[S,p,s]),b=P(()=>f.map(i=>i.entityRef),[f]),{paginatedItems:I,paginationProps:n}=G({pageParam:"perPage",defaultPageSize:R,items:g}),x=g.length>R,{profileImageMap:T}=V(b);return m?t(J,{rowCount:10}):!m&&!g.length?t(q,{title:"No groups found",body:"No groups found for the current selection."}):c(v,{children:[c(N,{sortDescriptor:{column:s,direction:p==="asc"?"ascending":"descending"},onSortChange:i=>d(i.column),children:[c(E,{children:[t(h,{allowsSorting:!0,id:"name",isRowHeader:!0,style:{width:"75%"},children:"Name"}),t(h,{allowsSorting:!0,id:"entities",style:{width:"10%"},children:"Entities"}),t(h,{allowsSorting:!0,id:"passPercentage",style:{width:"15%"},children:"Compliance"})]}),t(B,{children:I.map(i=>t(_,{profileImageMap:T??{},row:i,trackId:o,campaignId:l},i.entityRef))})]}),x&&t(k,{totalCount:g.length,offset:n.offset,hasNextPage:n.offset+n.pageSize<(g.length??0),hasPreviousPage:n.offset>0,onNextPage:n.onNextPage,onPreviousPage:n.onPreviousPage,onPageSizeChange:n.onPageSizeChange,pageSize:n.pageSize})]})};export{ee as TechInsightsExplorerTable};
1
+ import{jsx as t,jsxs as c,Fragment as v}from"react/jsx-runtime";import{useRouteRef as y}from"@backstage/core-plugin-api";import{useEntityPresentation as C}from"@backstage/plugin-catalog-react";import{TableRoot as N,TableHeader as E,Column as h,TableBody as B,TablePagination as k,Row as O,CellProfile as z,CellText as M,Flex as D,Box as w,Text as L}from"@backstage/ui";import{makeStyles as $}from"@material-ui/core";import{sortBy as j}from"lodash";import{useMemo as P}from"react";import{useNavigate as F,createSearchParams as H}from"react-router-dom";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useSearchName as A}from"../../hooks/useSearchName.esm.js";import{usePagination as G}from"../../hooks/usePagination.esm.js";import{useSortTableLocalStorage as U}from"../../hooks/useSortTableLocalStorage.esm.js";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsync";import{useProfileImages as V}from"../../hooks/catalog/useProfileImages.esm.js";import{trackOverviewRouteRef as W,campaignOverviewRouteRef as X}from"../../routes.esm.js";import{CustomCell as Y}from"../CustomCell/CustomCell.esm.js";import"../EmptyState/EmptyState.esm.js";import{EmptyStateBUI as q}from"../EmptyState/EmptyStateBUI.esm.js";import"@backstage/plugin-permission-react";import"@remixicon/react";import{LoadingTableSkeleton as J}from"../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";import{StatusBar as K}from"../StatusBar/StatusBar.esm.js";const R=10,Q=(e,m=[])=>{const o=[],i=r=>{!r.children||r.children.length===0?r.numberOfEntities>0&&o.push(r):(m.includes(r.entityRef)&&r.numberOfEntities>0&&o.push(r),r.children.forEach(l=>i(l)))};return i(e),o},Z=$(()=>({statusPercent:{width:"var(--bui-space-12)"},statusBar:{width:"100%"}})),_=({row:e,profileImageMap:m,trackId:o,campaignId:i})=>{const r=Z(),l=y(W),p=y(X),s=F(),{primaryTitle:d}=C(e.entityRef);return c(O,{onAction:()=>{o&&s({pathname:i?p({campaignId:i}):l({trackId:o}),search:`?${H({owners:[e.entityRef]})}`})},children:[t(z,{name:d,src:m[e.entityRef]??d}),t(M,{title:`${e.numberOfEntities} ${e.numberOfEntities===1?"entity":"entities"}`}),t(Y,{children:c(D,{align:"center",gap:"2",children:[t(w,{className:r.statusPercent,children:c(L,{children:[e.passPercentage,"%"]})}),t(w,{className:r.statusBar,children:t(K,{passedPercent:e.passPercentage,failedPercent:e.failPercentage,warningPercent:e.warningPercentage,notReportedPercent:e.notReportedPercentage,errorPercent:e.errorPercentage})})]})})]})},ee=({tableData:e,isLoading:m,trackId:o,selectedGroup:i,searchValue:r,campaignId:l})=>{const{order:p,orderBy:s,handleSort:d}=U({localStoragePrefix:"soundcheck-tech-insights-explorer",defaultSortBy:"entities",defaultDirection:"desc"}),f=P(()=>e?Q(e,i?[i]:[]):[],[i,e]),S=A({items:f,searchTerm:r}),g=P(()=>{const a=j(S??[],u=>s==="name"?u.name:s==="passPercentage"?u.passPercentage:s==="entities"?u.numberOfEntities:0);return p==="desc"&&a.reverse(),a},[S,p,s]),b=P(()=>f.map(a=>a.entityRef),[f]),{paginatedItems:I,paginationProps:n}=G({pageParam:"perPage",defaultPageSize:R,items:g}),x=g.length>R,{profileImageMap:T}=V(b);return m?t(J,{rowCount:10}):!m&&!g.length?t(q,{title:"No groups found",body:"No groups found for the current selection."}):c(v,{children:[c(N,{sortDescriptor:{column:s,direction:p==="asc"?"ascending":"descending"},onSortChange:a=>d(a.column),children:[c(E,{children:[t(h,{allowsSorting:!0,id:"name",isRowHeader:!0,style:{width:"75%"},children:"Name"}),t(h,{allowsSorting:!0,id:"entities",style:{width:"10%"},children:"Entities"}),t(h,{allowsSorting:!0,id:"passPercentage",style:{width:"15%"},children:"Compliance"})]}),t(B,{children:I.map(a=>t(_,{profileImageMap:T??{},row:a,trackId:o,campaignId:l},a.entityRef))})]}),x&&t(k,{totalCount:g.length,offset:n.offset,hasNextPage:n.offset+n.pageSize<(g.length??0),hasPreviousPage:n.offset>0,onNextPage:n.onNextPage,onPreviousPage:n.onPreviousPage,onPageSizeChange:n.onPageSizeChange,pageSize:n.pageSize})]})};export{ee as TechInsightsExplorerTable};
2
2
  //# sourceMappingURL=TechInsightsExplorerTable.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as o,jsxs as g,Fragment as L}from"react/jsx-runtime";import{useRouteRef as O}from"@backstage/core-plugin-api";import{TableRoot as j,TableHeader as $,Column as P,TableBody as A,Row as H,CellText as b,TablePagination as M}from"@backstage/ui";import{makeStyles as U}from"@material-ui/core";import{sortBy as V}from"lodash";import{useState as w,useEffect as W,useCallback as q,useMemo as C}from"react";import{CircularProgressbar as G}from"react-circular-progressbar";import{useNavigate as J}from"react-router-dom";import"@backstage/catalog-model";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{usePagination as K}from"../../hooks/usePagination.esm.js";import"react-use/lib/useLocalStorage";import{useSortSearchParams as Q}from"../../hooks/useSortSearchParams.esm.js";import{trackCheckDetailsRouteRef as X}from"../../routes.esm.js";import{getPercentage as y}from"../../utils/formatters.esm.js";import"../EmptyState/EmptyState.esm.js";import{EmptyStateBUI as Y}from"../EmptyState/EmptyStateBUI.esm.js";import"@backstage/plugin-permission-react";import"@remixicon/react";import{LoadingTableSkeleton as Z}from"../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";const _=U(()=>({customCell:{padding:"0 var(--bui-space-3)"},circularProgressBg:{color:"var(--bui-fg-secondary)",opacity:.25},circularProgressOverlay:{position:"absolute",left:0,color:"var(--bui-fg-danger)"},circularProgressbar:{width:"var(--bui-space-7)"}})),T=10,ee=["compliance","name","failures"],d=a=>ee.includes(a),te=({track:a,checkStatuses:s,certificationStatus:c,searchValue:u})=>{const N=_(),{updateSortParams:v,searchParams:n}=Q(),[p,k]=w(()=>{const e=n.get("sortDirection");return e==="ascending"||e==="descending"?e:"descending"}),[l,S]=w(()=>{const e=n.get("sort");return e&&d(e)?e:"compliance"}),x=O(X),I=J();W(()=>{const e=n.get("sortDirection");(e==="ascending"||e==="descending")&&k(e);const t=n.get("sort");t&&d(t)&&S(t)},[n]);const R=q(({direction:e,column:t})=>{const r=String(t);d(r)&&S(r),k(e),v({sort:d(r)?r:"compliance",sortDirection:e})},[v]),m=C(()=>!a.levels||!s?[]:a.levels.flatMap(e=>e.checks.map(t=>{const r=s.find(({id:F})=>F===t.id),D=r?r.numberOfEntities-r.notApplicable-r.exempt:0,E=r?.failed??0;return{check:t,failedCount:E,applicableCount:D}}).filter(({failedCount:t})=>t>0)),[a.levels,s]),f=C(()=>{if(!u?.length)return m;const e=u.toLowerCase();return m.filter(({check:t})=>t.name.toLowerCase().includes(e))},[m,u]),h=C(()=>{const e=V([...f],t=>l==="compliance"?y(t.failedCount,c?.numberOfEntities??0):l==="failures"?t.failedCount:t.check.name.toLowerCase());return p==="descending"&&e.reverse(),e},[f,p,l,c]),{paginatedItems:z,paginationProps:i}=K({pageParam:"perPage",defaultPageSize:T,items:h}),B=a.levels.length>T;return s===void 0||c===void 0?o(Z,{}):!m.length||!f.length?o(Y,{title:"No failing checks",body:"There are no failing checks found."}):g(L,{children:[g(j,{onSortChange:R,sortDescriptor:{direction:p,column:l},children:[g($,{children:[o(P,{id:"compliance",allowsSorting:!0,style:{width:"8%"},children:"Compliance"}),o(P,{id:"name",allowsSorting:!0,isRowHeader:!0,style:{width:"72%"},children:"Name"}),o(P,{id:"failures",allowsSorting:!0,style:{width:"20%"},children:"Failures"})]}),o(A,{children:z.map(({check:e,failedCount:t})=>{const r=y(t,c.numberOfEntities);return g(H,{onAction:()=>I(x({trackId:a.id,checkId:e.id})),children:[o(b,{leadingIcon:o("div",{className:N.circularProgressbar,title:`${r}%`,children:o(G,{value:r,strokeWidth:12,styles:{path:{stroke:"var(--bui-fg-danger)"},trail:{stroke:'rgba(var("--bui-fg-secondary"), 0.25)'}}})}),title:`${r}%`}),o(b,{title:e.name}),o(b,{title:`${new Intl.NumberFormat().format(t??0)} failing`})]},e.id)})})]}),B&&o(M,{totalCount:h.length,offset:i.offset,hasNextPage:i.offset+i.pageSize<(h.length??0),hasPreviousPage:i.offset>0,onNextPage:i.onNextPage,onPreviousPage:i.onPreviousPage,onPageSizeChange:i.onPageSizeChange,pageSize:i.pageSize})]})};export{te as TopFailingChecksTableBUI};
1
+ import{jsx as o,jsxs as g,Fragment as L}from"react/jsx-runtime";import{useRouteRef as O}from"@backstage/core-plugin-api";import{TableRoot as j,TableHeader as $,Column as P,TableBody as A,Row as H,CellText as b,TablePagination as M}from"@backstage/ui";import{makeStyles as U}from"@material-ui/core";import{sortBy as V}from"lodash";import{useState as w,useEffect as W,useCallback as q,useMemo as C}from"react";import{CircularProgressbar as G}from"react-circular-progressbar";import{useNavigate as J}from"react-router-dom";import"@backstage/catalog-model";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{usePagination as K}from"../../hooks/usePagination.esm.js";import"react-use/lib/useLocalStorage";import{useSortSearchParams as Q}from"../../hooks/useSortSearchParams.esm.js";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsync";import{trackCheckDetailsRouteRef as X}from"../../routes.esm.js";import{getPercentage as y}from"../../utils/formatters.esm.js";import"../EmptyState/EmptyState.esm.js";import{EmptyStateBUI as Y}from"../EmptyState/EmptyStateBUI.esm.js";import"@backstage/plugin-permission-react";import"@remixicon/react";import{LoadingTableSkeleton as Z}from"../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";const _=U(()=>({customCell:{padding:"0 var(--bui-space-3)"},circularProgressBg:{color:"var(--bui-fg-secondary)",opacity:.25},circularProgressOverlay:{position:"absolute",left:0,color:"var(--bui-fg-danger)"},circularProgressbar:{width:"var(--bui-space-7)"}})),T=10,ee=["compliance","name","failures"],d=a=>ee.includes(a),te=({track:a,checkStatuses:s,certificationStatus:c,searchValue:p})=>{const N=_(),{updateSortParams:v,searchParams:n}=Q(),[u,k]=w(()=>{const e=n.get("sortDirection");return e==="ascending"||e==="descending"?e:"descending"}),[l,S]=w(()=>{const e=n.get("sort");return e&&d(e)?e:"compliance"}),x=O(X),I=J();W(()=>{const e=n.get("sortDirection");(e==="ascending"||e==="descending")&&k(e);const t=n.get("sort");t&&d(t)&&S(t)},[n]);const R=q(({direction:e,column:t})=>{const r=String(t);d(r)&&S(r),k(e),v({sort:d(r)?r:"compliance",sortDirection:e})},[v]),m=C(()=>!a.levels||!s?[]:a.levels.flatMap(e=>e.checks.map(t=>{const r=s.find(({id:F})=>F===t.id),D=r?r.numberOfEntities-r.notApplicable-r.exempt:0,E=r?.failed??0;return{check:t,failedCount:E,applicableCount:D}}).filter(({failedCount:t})=>t>0)),[a.levels,s]),f=C(()=>{if(!p?.length)return m;const e=p.toLowerCase();return m.filter(({check:t})=>t.name.toLowerCase().includes(e))},[m,p]),h=C(()=>{const e=V([...f],t=>l==="compliance"?y(t.failedCount,c?.numberOfEntities??0):l==="failures"?t.failedCount:t.check.name.toLowerCase());return u==="descending"&&e.reverse(),e},[f,u,l,c]),{paginatedItems:z,paginationProps:i}=K({pageParam:"perPage",defaultPageSize:T,items:h}),B=a.levels.length>T;return s===void 0||c===void 0?o(Z,{}):!m.length||!f.length?o(Y,{title:"No failing checks",body:"There are no failing checks found."}):g(L,{children:[g(j,{onSortChange:R,sortDescriptor:{direction:u,column:l},children:[g($,{children:[o(P,{id:"compliance",allowsSorting:!0,style:{width:"8%"},children:"Compliance"}),o(P,{id:"name",allowsSorting:!0,isRowHeader:!0,style:{width:"72%"},children:"Name"}),o(P,{id:"failures",allowsSorting:!0,style:{width:"20%"},children:"Failures"})]}),o(A,{children:z.map(({check:e,failedCount:t})=>{const r=y(t,c.numberOfEntities);return g(H,{onAction:()=>I(x({trackId:a.id,checkId:e.id})),children:[o(b,{leadingIcon:o("div",{className:N.circularProgressbar,title:`${r}%`,children:o(G,{value:r,strokeWidth:12,styles:{path:{stroke:"var(--bui-fg-danger)"},trail:{stroke:'rgba(var("--bui-fg-secondary"), 0.25)'}}})}),title:`${r}%`}),o(b,{title:e.name}),o(b,{title:`${new Intl.NumberFormat().format(t??0)} failing`})]},e.id)})})]}),B&&o(M,{totalCount:h.length,offset:i.offset,hasNextPage:i.offset+i.pageSize<(h.length??0),hasPreviousPage:i.offset>0,onNextPage:i.onNextPage,onPreviousPage:i.onPreviousPage,onPageSizeChange:i.onPageSizeChange,pageSize:i.pageSize})]})};export{te as TopFailingChecksTableBUI};
2
2
  //# sourceMappingURL=TopFailingChecksTableBUI.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsxs as p,Fragment as n,jsx as r}from"react/jsx-runtime";import{useRouteRef as f}from"@backstage/core-plugin-api";import{HeaderPage as u}from"@backstage/ui";import{useEffect as k}from"react";import{TrackFormProvider as d,useTrackFormContext as l}from"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import"@backstage/catalog-model";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{useCreateTrack as g}from"../../hooks/tracks/useCreateTrack.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as T}from"../../hooks/useNavigateBack.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import{tracksPageRouteRef as e}from"../../routes.esm.js";import{DocLinkButton as h}from"../DocLinkButton/DocLinkButton.esm.js";import{TrackForm as C}from"../TrackForm/TrackForm.esm.js";const m=()=>{const{setIsLoading:o}=l(),{mutateAsync:i,isLoading:t}=g();k(()=>{o(t)},[o,t]);const[a,c]=T(e);return r(C,{handleClose:a,onSave:async s=>{await i(s,{onSuccess:c})}})},b=()=>{const o=f(e);return p(n,{children:[r(u,{title:"Create Track",breadcrumbs:[{label:"All Tracks",href:o()}],customActions:r(h,{href:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/tracks/"})}),r(d,{children:r(m,{})})]})};export{b as TrackCreatePage,m as TrackCreateView};
1
+ import{jsxs as p,Fragment as n,jsx as r}from"react/jsx-runtime";import{useRouteRef as f}from"@backstage/core-plugin-api";import{HeaderPage as u}from"@backstage/ui";import{useEffect as k}from"react";import{TrackFormProvider as d,useTrackFormContext as l}from"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import"@backstage/catalog-model";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{useCreateTrack as g}from"../../hooks/tracks/useCreateTrack.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as T}from"../../hooks/useNavigateBack.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsync";import{tracksPageRouteRef as e}from"../../routes.esm.js";import{DocLinkButton as h}from"../DocLinkButton/DocLinkButton.esm.js";import{TrackForm as C}from"../TrackForm/TrackForm.esm.js";const m=()=>{const{setIsLoading:o}=l(),{mutateAsync:i,isLoading:t}=g();k(()=>{o(t)},[o,t]);const[a,c]=T(e);return r(C,{handleClose:a,onSave:async s=>{await i(s,{onSuccess:c})}})},b=()=>{const o=f(e);return p(n,{children:[r(u,{title:"Create Track",breadcrumbs:[{label:"All Tracks",href:o()}],customActions:r(h,{href:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/tracks/"})}),r(d,{children:r(m,{})})]})};export{b as TrackCreatePage,m as TrackCreateView};
2
2
  //# sourceMappingURL=TrackCreatePage.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsxs as n,Fragment as d,jsx as r}from"react/jsx-runtime";import{useRouteRef as s}from"@backstage/core-plugin-api";import{usePermission as f}from"@backstage/plugin-permission-react";import{HeaderPage as k}from"@backstage/ui";import{soundcheckTrackUpdatePermission as l}from"@spotify/backstage-plugin-soundcheck-common";import{useParams as u}from"react-router-dom";import{TrackFormProvider as g}from"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"react";import"../../contexts/UserProvider.esm.js";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"../../hooks/useSoundcheckAlert.esm.js";import{useTrack as h}from"../../hooks/tracks/useTrack.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-use/lib/useLocalStorage";import{trackDetailsRouteRef as P,tracksPageRouteRef as R}from"../../routes.esm.js";import{DocLinkButton as T}from"../DocLinkButton/DocLinkButton.esm.js";import{LoadingIndicator as b}from"../LoadingIndicator/LoadingIndicator.esm.js";import{PageWarningMessage as E}from"../PageWarningMessage/PageWarningMessage.esm.js";import{TrackEditView as w}from"./TrackEditView.esm.js";const I=()=>{const{trackId:o}=u(),{data:t,isLoading:i}=h(o),{loading:e,allowed:m}=f({permission:l,resourceRef:o}),a=m&&t?.isEditable,c=s(P),p=s(R);return n(d,{children:[r(k,{title:`Edit ${t?.name??o??"Track"}`,breadcrumbs:[{label:"All Tracks",href:p()},{label:"Details",href:c({trackId:o??""})}],customActions:r(T,{href:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/tracks/"})}),r(E,{entityName:"track",entityId:o,showNotFound:!i&&!t,showCannotEdit:!e&&!a}),i||e?r(b,{}):t&&a&&r(g,{children:r(w,{track:t,canEdit:m})})]})};export{I as TrackEditPage};
1
+ import{jsxs as n,Fragment as d,jsx as r}from"react/jsx-runtime";import{useRouteRef as s}from"@backstage/core-plugin-api";import{usePermission as f}from"@backstage/plugin-permission-react";import{HeaderPage as k}from"@backstage/ui";import{soundcheckTrackUpdatePermission as l}from"@spotify/backstage-plugin-soundcheck-common";import{useParams as u}from"react-router-dom";import{TrackFormProvider as g}from"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"react";import"../../contexts/UserProvider.esm.js";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"../../hooks/useSoundcheckAlert.esm.js";import{useTrack as h}from"../../hooks/tracks/useTrack.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-use/lib/useLocalStorage";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsync";import{trackDetailsRouteRef as P,tracksPageRouteRef as R}from"../../routes.esm.js";import{DocLinkButton as T}from"../DocLinkButton/DocLinkButton.esm.js";import{LoadingIndicator as b}from"../LoadingIndicator/LoadingIndicator.esm.js";import{PageWarningMessage as E}from"../PageWarningMessage/PageWarningMessage.esm.js";import{TrackEditView as w}from"./TrackEditView.esm.js";const I=()=>{const{trackId:o}=u(),{data:t,isLoading:i}=h(o),{loading:e,allowed:m}=f({permission:l,resourceRef:o}),a=m&&t?.isEditable,c=s(P),p=s(R);return n(d,{children:[r(k,{title:`Edit ${t?.name??o??"Track"}`,breadcrumbs:[{label:"All Tracks",href:p()},{label:"Details",href:c({trackId:o??""})}],customActions:r(T,{href:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/tracks/"})}),r(E,{entityName:"track",entityId:o,showNotFound:!i&&!t,showCannotEdit:!e&&!a}),i||e?r(b,{}):t&&a&&r(g,{children:r(w,{track:t,canEdit:m})})]})};export{I as TrackEditPage};
2
2
  //# sourceMappingURL=TrackEditPage.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as l}from"react/jsx-runtime";import{useEffect as i,useCallback as f}from"react";import{useTrackFormContext as g}from"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as y}from"../../hooks/useNavigateBack.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import{useUpdateTrack as E}from"../../hooks/tracks/useUpdateTrack.esm.js";import{tracksPageRouteRef as h}from"../../routes.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as T}from"../SoundcheckHeader/useHeader.esm.js";import{TrackForm as w}from"../TrackForm/TrackForm.esm.js";const b=({track:t,canEdit:p})=>{const{setSelectedItem:e,setIsLoading:m,selectedItem:n,showReadOnly:r}=g(),{mutateAsync:s,isLoading:c}=E();i(()=>m(c),[m,c]);const o=!p||!t.isEditable;i(()=>{o?r(t):e(t)},[t,e,o,r]);const[d,a]=y(h),k=f(async u=>{await s(u,{onSuccess:a})},[a,s]);return i(()=>{},[t,r,o]),T({title:`${o?"View":"Edit"} Track`,description:"Edit your track's details to match your needs.",docLink:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/tracks"}),n?l(w,{handleClose:d,onSave:k}):null};export{b as TrackEditView};
1
+ import{jsx as l}from"react/jsx-runtime";import{useEffect as i,useCallback as f}from"react";import{useTrackFormContext as g}from"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as y}from"../../hooks/useNavigateBack.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsync";import{useUpdateTrack as E}from"../../hooks/tracks/useUpdateTrack.esm.js";import{tracksPageRouteRef as h}from"../../routes.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as T}from"../SoundcheckHeader/useHeader.esm.js";import{TrackForm as w}from"../TrackForm/TrackForm.esm.js";const b=({track:t,canEdit:a})=>{const{setSelectedItem:m,setIsLoading:e,selectedItem:n,showReadOnly:r}=g(),{mutateAsync:s,isLoading:c}=E();i(()=>e(c),[e,c]);const o=!a||!t.isEditable;i(()=>{o?r(t):m(t)},[t,m,o,r]);const[d,p]=y(h),k=f(async u=>{await s(u,{onSuccess:p})},[p,s]);return i(()=>{},[t,r,o]),T({title:`${o?"View":"Edit"} Track`,description:"Edit your track's details to match your needs.",docLink:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/tracks"}),n?l(w,{handleClose:d,onSave:k}):null};export{b as TrackEditView};
2
2
  //# sourceMappingURL=TrackEditView.esm.js.map
@@ -1,2 +1,2 @@
1
- import{zodResolver as y}from"@hookform/resolvers/zod";import{useMemo as k,useEffect as R}from"react";import{useForm as T}from"react-hook-form";import{v4 as F}from"uuid";import{useTrackFormContext as g}from"../../../contexts/TrackFormContext.esm.js";import"../../../contexts/CheckFormContext.esm.js";import"../../../contexts/CampaignFormContext.esm.js";import"react/jsx-runtime";import{useLoggedInUser as h}from"../../../contexts/UserProvider.esm.js";import{BadgeVariant as E}from"../../../graphql/generated/index.esm.js";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../../api.esm.js";import"../../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../../../hooks/useSoundcheckAlert.esm.js";import{useConfirmationModal as w}from"../../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import{useGetChecksMap as L}from"../../../hooks/tracks/useGetChecksMap.esm.js";import{mapInputFilterToFormFilters as l,mapFiltersToCatalogFilter as c}from"../../Filter/utils.esm.js";import"../../Filter/FilterComponent.esm.js";import{emptyFilters as f}from"../../Filter/types.esm.js";import{trackFormSchema as M}from"./validation.esm.js";const u={detailsStep:{name:"",description:"",ownerEntityRef:"",badgeType:"status",draft:!1},levelsStep:{levels:[{name:"Level 1",description:"",checks:[]}]},filtersStep:{include:[f()],exclude:[f()]}},S=({name:e,description:i,ownerEntityRef:a,filter:r,levels:n,documentationURL:t,badge:p,exclude:o,draft:s})=>({detailsStep:{name:e,ownerEntityRef:a,description:i??"",documentationURL:t??void 0,badgeType:p?.variant===E.Status?"status":"medal",draft:s??!1},levelsStep:{levels:n?.map(m=>({name:m.name??(m.ordinal?`Level ${m.ordinal}`:"Level 1"),description:m.description??"",checks:m.checks.map(d=>({id:d.id,name:d.name??d.id,description:d.description??""}))}))||[]},filtersStep:{include:l(r),exclude:l(o)}}),v=(e,i,a)=>({id:a?.id??F(),ownerEntityRef:e.detailsStep.ownerEntityRef,description:e.detailsStep.description,name:e.detailsStep.name,documentationURL:e.detailsStep.documentationURL??"",badgeType:e.detailsStep.badgeType,type:a?.type??"standard",levels:e.levelsStep.levels?.map((r,n)=>({ordinal:n+1,name:r.name??"",description:r.description??"",checks:r.checks.map(t=>{const p=i[t.id];if(p)return p;const o=a?.levels.flatMap(s=>s.checks).find(s=>s.id===t.id);return o?{id:o.id,name:o.name??t.name,description:o.description??t.description}:{id:t.id,name:t.name,description:t.description}})})),filter:c(e.filtersStep.include),exclude:c(e.filtersStep.exclude),draft:e.detailsStep.draft??!1}),x=e=>{const{selectedItem:i}=g(),a=k(()=>i?S(i):u,[i]),r=T({defaultValues:a,mode:"onChange",resolver:y(M)}),{userEntityRef:n}=h();R(()=>{!i&&n&&!r.getValues("detailsStep.ownerEntityRef")&&r.setValue("detailsStep.ownerEntityRef",n)},[i,n,r]);const{checksMap:t}=L(),{showModal:p}=w();return{formMethods:r,onSubmit:async o=>{if(!await p({title:"Save Track",message:`Are you sure you want to save track: ${o.detailsStep.name}?`,error:!1}))return;const s=v(o,t??{},i);e(s)}}};export{u as DEFAULT_TRACK_FORM_VALUES,v as mapTrackFormToInput,S as mapTrackToFormValues,x as useTrackForm};
1
+ import{zodResolver as y}from"@hookform/resolvers/zod";import{useMemo as k,useEffect as R}from"react";import{useForm as T}from"react-hook-form";import{v4 as F}from"uuid";import{useTrackFormContext as g}from"../../../contexts/TrackFormContext.esm.js";import"../../../contexts/CheckFormContext.esm.js";import"../../../contexts/CampaignFormContext.esm.js";import"react/jsx-runtime";import{useLoggedInUser as h}from"../../../contexts/UserProvider.esm.js";import{BadgeVariant as E}from"../../../graphql/generated/index.esm.js";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../../api.esm.js";import"../../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../../../hooks/useSoundcheckAlert.esm.js";import{useConfirmationModal as w}from"../../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import"react-use/lib/useAsync";import{useGetChecksMap as L}from"../../../hooks/tracks/useGetChecksMap.esm.js";import{mapInputFilterToFormFilters as l,mapFiltersToCatalogFilter as c}from"../../Filter/utils.esm.js";import"../../Filter/FilterComponent.esm.js";import{emptyFilters as f}from"../../Filter/types.esm.js";import{trackFormSchema as M}from"./validation.esm.js";const u={detailsStep:{name:"",description:"",ownerEntityRef:"",badgeType:"status",draft:!1},levelsStep:{levels:[{name:"Level 1",description:"",checks:[]}]},filtersStep:{include:[f()],exclude:[f()]}},S=({name:e,description:i,ownerEntityRef:a,filter:r,levels:n,documentationURL:t,badge:p,exclude:o,draft:s})=>({detailsStep:{name:e,ownerEntityRef:a,description:i??"",documentationURL:t??void 0,badgeType:p?.variant===E.Status?"status":"medal",draft:s??!1},levelsStep:{levels:n?.map(m=>({name:m.name??(m.ordinal?`Level ${m.ordinal}`:"Level 1"),description:m.description??"",checks:m.checks.map(d=>({id:d.id,name:d.name??d.id,description:d.description??""}))}))||[]},filtersStep:{include:l(r),exclude:l(o)}}),v=(e,i,a)=>({id:a?.id??F(),ownerEntityRef:e.detailsStep.ownerEntityRef,description:e.detailsStep.description,name:e.detailsStep.name,documentationURL:e.detailsStep.documentationURL??"",badgeType:e.detailsStep.badgeType,type:a?.type??"standard",levels:e.levelsStep.levels?.map((r,n)=>({ordinal:n+1,name:r.name??"",description:r.description??"",checks:r.checks.map(t=>{const p=i[t.id];if(p)return p;const o=a?.levels.flatMap(s=>s.checks).find(s=>s.id===t.id);return o?{id:o.id,name:o.name??t.name,description:o.description??t.description}:{id:t.id,name:t.name,description:t.description}})})),filter:c(e.filtersStep.include),exclude:c(e.filtersStep.exclude),draft:e.detailsStep.draft??!1}),x=e=>{const{selectedItem:i}=g(),a=k(()=>i?S(i):u,[i]),r=T({defaultValues:a,mode:"onChange",resolver:y(M)}),{userEntityRef:n}=h();R(()=>{!i&&n&&!r.getValues("detailsStep.ownerEntityRef")&&r.setValue("detailsStep.ownerEntityRef",n)},[i,n,r]);const{checksMap:t}=L(),{showModal:p}=w();return{formMethods:r,onSubmit:async o=>{if(!await p({title:"Save Track",message:`Are you sure you want to save track: ${o.detailsStep.name}?`,error:!1}))return;const s=v(o,t??{},i);e(s)}}};export{u as DEFAULT_TRACK_FORM_VALUES,v as mapTrackFormToInput,S as mapTrackToFormValues,x as useTrackForm};
2
2
  //# sourceMappingURL=useTrackForm.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as t,jsxs as c,Fragment as he}from"react/jsx-runtime";import{parseEntityRef as ke}from"@backstage/catalog-model";import{useRouteRef as H}from"@backstage/core-plugin-api";import{usePermission as ge}from"@backstage/plugin-permission-react";import{Container as T,HeaderPage as Se,Box as h,Flex as G,Text as M}from"@backstage/ui";import{makeStyles as Ee}from"@material-ui/core";import{toEntityFilterQuery as Ce,soundcheckTrackReadPermission as ve}from"@spotify/backstage-plugin-soundcheck-common";import{useState as b,useMemo as y,useEffect as U}from"react";import{useSearchParams as Te,useParams as be}from"react-router-dom";import ye from"react-use/lib/useDebounce";import Le from"react-use/lib/useLocalStorage";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"../../hooks/useSoundcheckAlert.esm.js";import{useTrack as Ie}from"../../hooks/tracks/useTrack.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useCertificationStatus as we}from"../../hooks/aggregations/useCertificationStatus.esm.js";import{useCertificationStatusHistory as _e}from"../../hooks/aggregations/useCertificationStatusHistory.esm.js";import{useCheckStatuses as Ne}from"../../hooks/aggregations/useCheckStatuses.esm.js";import{useFilters as Be}from"../../hooks/filters/useFilters.esm.js";import{useLCPReporting as Fe}from"../../hooks/useLCPReporting.esm.js";import{useLoadTimeReporting as Re}from"../../hooks/useLoadTimeReporting.esm.js";import{tracksPageRouteRef as He,trackOverviewRouteRef as Oe,trackExplorerRouteRef as Pe}from"../../routes.esm.js";import"../../utils/facetFilters/types.esm.js";import{parseNumberOfDays as xe}from"../../utils/facetFilters/utils.esm.js";import{getEntitiesBucket as Ae,getChecksBucket as Ve}from"../../utils/helpers.esm.js";import{DescriptionCard as Ke}from"../Cards/DescriptionCard/DescriptionCard.esm.js";import{HistoricalTrackStatusCard as je}from"../Cards/HistoricalTrackStatusCard/HistoricalTrackStatusCard.esm.js";import{TrackStatusCard as Ye}from"../Cards/TrackStatusCard/TrackStatusCard.esm.js";import{ChecksTable as De}from"../ChecksTable/ChecksTable.esm.js";import{ChipSelector as Ge}from"../ChipSelector/ChipSelector.esm.js";import"../EmptyState/EmptyState.esm.js";import{EmptyStateBUI as $}from"../EmptyState/EmptyStateBUI.esm.js";import"@remixicon/react";import"../FilterSidebar/FilterSidebar.esm.js";import"../FilterSidebar/StateFilter.esm.js";import{useTrackFilterSidebar as Me}from"../FilterSidebar/useTrackFilterSidebar.esm.js";import{toFilter as Ue}from"../FilterSidebar/util.esm.js";import{LoadingTableSkeleton as $e}from"../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";import{SimpleMenu as Qe}from"../Menus/SimpleMenu.esm.js";import"js-yaml";import"lodash";import{useTrackActions as qe}from"../Menus/useTrackActions.esm.js";import"uuid";import"../CampaignPage/CampaignActionsContext.esm.js";import"../CampaignsPage/CampaignListPage/useArchiveConfirmationModal.esm.js";import{PageCustomActions as Je}from"../PageCustomActions/PageCustomActions.esm.js";import{TopFailingChecksTableBUI as We}from"../TopFailingChecksTable/TopFailingChecksTableBUI.esm.js";import{TrackEntitiesTableBUI as Xe}from"./TrackEntitiesTable/TrackEntitiesTableBUI.esm.js";const Ze=Ee(()=>({container:{marginBottom:"var(--bui-space-12)"},cards:{margin:"0 0 var(--bui-space-12)",display:"flex",gridGap:"var(--bui-space-4)"},tableContent:{margin:"var(--bui-space-3) 0 0"},levelSection:{margin:"0 0 var(--bui-space-6)"},levelHeading:{padding:"var(--bui-space-3)",background:"var(--bui-bg-neutral-1)"}})),o={CHECKS_BY_LEVELS:"Checks By Levels",TOP_FAILING_CHECKS:"Top Failing Checks",ENTITIES:"Entities"},ze={"checks-by-levels":o.CHECKS_BY_LEVELS,"top-failing-checks":o.TOP_FAILING_CHECKS,entities:o.ENTITIES},et={[o.CHECKS_BY_LEVELS]:"checks-by-levels",[o.TOP_FAILING_CHECKS]:"top-failing-checks",[o.ENTITIES]:"entities"},tt=()=>{const n=Ze(),[a,k]=Te(),[O,Q]=b(()=>{const e=a.get("section"),s=e?ze[e]:null;return new Set([s??o.CHECKS_BY_LEVELS])}),g=O.values().next().value??o.CHECKS_BY_LEVELS,[l,P]=b(a.get("search")||""),[x,q]=b(""),{trackId:i}=be(),{data:r,isLoading:m,isError:J}=Ie(i),W=H(He),A=qe(r??void 0),V=r?.ownerEntityRef,X=V?ke(V).name:void 0,Z=Array.from(new Set(r?.levels.flatMap(e=>e.checks).map(e=>e.id)??[])),{owners:d,lifecycles:p,types:u,systems:f}=Me(),L=y(()=>Ue({lifecycles:p,owners:d,types:u,systems:f}),[p,d,u,f]),I=y(()=>xe(a.get("numberOfDays")),[a]),[S,K]=b(!1),[w,_]=Le("track-overview-search-params","");U(()=>{!S&&a?.toString()?(w!==a.toString()&&_(a.toString()),K(!0)):S?S&&w!==a.toString()&&_(a.toString()):K(!0)},[a,k,_,w,S]),ye(()=>{q(l);const e=new URLSearchParams(a.toString());l?e.set("search",l):e.delete("search"),k(e,{replace:!0})},300,[l]);const j=y(()=>({routeName:"soundcheck-track-insights",additionalAttributes:{trackId:i||"",filtersApplied:d.length+p.length+u.length+f.length,ownersFilter:d.join(",")||"",lifecyclesFilter:p.join(",")||"",typesFilter:u.join(",")||"",systemsFilter:f.join(",")||"",numberOfDays:I,tracksSearch:x||""}}),[i,d,p,u,f,I,x]),{reportContentLoaded:Y}=Re(j),{reporter:z}=Fe(j),ee=e=>{Q(e),P("");const s=e.values().next().value,v=s?et[s]:void 0;v?k({section:v},{replace:!0}):k({},{replace:!0})},{data:E,isLoading:N,isError:te}=we({trackId:i,filter:L},!!i),{data:re,isLoading:B,isError:ie}=_e({trackId:i,filter:L,numberOfDays:I},!!i),{data:C,isLoading:F}=Ne({trackId:i,checkIds:Z,filter:L},!!r),oe=y(()=>Ce(r?.filter),[r]),R=J||te||ie,{loading:ae,allowed:se}=ge({permission:ve,resourceRef:i}),{filters:ce,selected:ne,setSelected:le,onRemoveTag:me,selectedTags:de}=Be({entityFilterQuery:oe}),pe=r?.levels.flatMap(e=>{const s=l?.trim().toLowerCase();return{...e,checks:s?e.checks.filter(({name:v})=>v.toLowerCase().includes(s)):e.checks}})??[],D=z?.getLCPValue();U(()=>{if(!m&&!F&&!N&&!B){const e=E?.certificationStatus?.numberOfEntities??0,s=C?.length??0;Y({lcp:D,numberOfEntities:e,entitiesBucket:Ae(e),numberOfChecks:s,checksBucket:Ve(s)})}},[m,F,N,B,C,E,Y,D]);const ue=H(Oe),fe=H(Pe);return m?t(T,{className:n.container,children:t($e,{})}):!m&&!r?t(T,{className:n.container,children:t($,{title:"Track not found",body:`There is no track with the requested id: ${i}.`})}):!ae&&!se?t(T,{className:n.container,children:t($,{title:"Cannot view track",body:`No permission to view track with the requested id: ${i}.`})}):c(he,{children:[t(Se,{title:r?.name,customActions:t(Qe,{label:"Track Actions",disabled:!A.length,placement:"left top",menuActions:A}),breadcrumbs:[{label:"Tracks",href:W()}],tabs:[{id:"overview",label:"Track Overview",href:i?ue({trackId:i}):""},{id:"explorer",label:"Tech Insights Explorer",href:i?fe({trackId:i}):""}]}),c(T,{className:n.container,children:[c(h,{className:n.cards,children:[t(Ke,{description:r?.description??void 0,owner:X,isError:R,isLoading:m}),t(Ye,{track:r??void 0,status:E,isError:R,isLoading:N}),t(je,{track:r??void 0,history:re,isError:R,isLoading:B})]}),r&&c(h,{children:[c(G,{justify:"between",children:[t(h,{minWidth:"18rem",children:t(Ge,{options:Object.values(o),selected:O,ariaLabel:"Sections",onSelectionChange:ee})}),t(Je,{searchValue:l,setSearchValue:e=>P(e),filters:ce,selected:ne,setSelected:le,onRemoveTag:me,selectedTags:de,showSearch:g!==o.ENTITIES})]}),c(h,{className:n.tableContent,children:[g===o.CHECKS_BY_LEVELS&&t(h,{mt:"3",children:pe.map(e=>c(h,{className:n.levelSection,children:[c(G,{align:"center",gap:"4",className:n.levelHeading,children:[c(M,{color:"secondary",children:["Level ",e.ordinal]})," ",t(M,{children:e.name})]}),t(De,{trackId:r.id,checks:e.checks,checkStatuses:C,isLoading:m||F,levelOrdinal:e.ordinal})]},e.ordinal))}),g===o.TOP_FAILING_CHECKS&&t(We,{track:r,checkStatuses:C,certificationStatus:E?.certificationStatus,searchValue:l}),g===o.ENTITIES&&t(Xe,{track:r,lifecycles:p,owners:d,types:u,systems:f,searchValue:l})]})]})]})]})};export{tt as TrackPageBUI};
1
+ import{jsx as t,jsxs as c,Fragment as he}from"react/jsx-runtime";import{parseEntityRef as ke}from"@backstage/catalog-model";import{useRouteRef as H}from"@backstage/core-plugin-api";import{usePermission as ge}from"@backstage/plugin-permission-react";import{Container as T,HeaderPage as Se,Box as h,Flex as G,Text as M}from"@backstage/ui";import{makeStyles as Ee}from"@material-ui/core";import{toEntityFilterQuery as Ce,soundcheckTrackReadPermission as ve}from"@spotify/backstage-plugin-soundcheck-common";import{useState as b,useMemo as y,useEffect as U}from"react";import{useSearchParams as Te,useParams as be}from"react-router-dom";import ye from"react-use/lib/useDebounce";import Le from"react-use/lib/useLocalStorage";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"../../hooks/useSoundcheckAlert.esm.js";import{useTrack as Ie}from"../../hooks/tracks/useTrack.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useCertificationStatus as we}from"../../hooks/aggregations/useCertificationStatus.esm.js";import{useCertificationStatusHistory as _e}from"../../hooks/aggregations/useCertificationStatusHistory.esm.js";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsync";import{useCheckStatuses as Ne}from"../../hooks/aggregations/useCheckStatuses.esm.js";import{useFilters as Be}from"../../hooks/filters/useFilters.esm.js";import{useLCPReporting as Fe}from"../../hooks/useLCPReporting.esm.js";import{useLoadTimeReporting as Re}from"../../hooks/useLoadTimeReporting.esm.js";import{tracksPageRouteRef as He,trackOverviewRouteRef as Oe,trackExplorerRouteRef as Pe}from"../../routes.esm.js";import"../../utils/facetFilters/types.esm.js";import{parseNumberOfDays as xe}from"../../utils/facetFilters/utils.esm.js";import{getEntitiesBucket as Ae,getChecksBucket as Ve}from"../../utils/helpers.esm.js";import{DescriptionCard as Ke}from"../Cards/DescriptionCard/DescriptionCard.esm.js";import{HistoricalTrackStatusCard as je}from"../Cards/HistoricalTrackStatusCard/HistoricalTrackStatusCard.esm.js";import{TrackStatusCard as Ye}from"../Cards/TrackStatusCard/TrackStatusCard.esm.js";import{ChecksTable as De}from"../ChecksTable/ChecksTable.esm.js";import{ChipSelector as Ge}from"../ChipSelector/ChipSelector.esm.js";import"../EmptyState/EmptyState.esm.js";import{EmptyStateBUI as $}from"../EmptyState/EmptyStateBUI.esm.js";import"@remixicon/react";import"../FilterSidebar/FilterSidebar.esm.js";import"../FilterSidebar/StateFilter.esm.js";import{useTrackFilterSidebar as Me}from"../FilterSidebar/useTrackFilterSidebar.esm.js";import{toFilter as Ue}from"../FilterSidebar/util.esm.js";import{LoadingTableSkeleton as $e}from"../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";import{SimpleMenu as Qe}from"../Menus/SimpleMenu.esm.js";import"js-yaml";import"lodash";import{useTrackActions as qe}from"../Menus/useTrackActions.esm.js";import"uuid";import"../CampaignPage/CampaignActionsContext.esm.js";import"../CampaignsPage/CampaignListPage/useArchiveConfirmationModal.esm.js";import{PageCustomActions as Je}from"../PageCustomActions/PageCustomActions.esm.js";import{TopFailingChecksTableBUI as We}from"../TopFailingChecksTable/TopFailingChecksTableBUI.esm.js";import{TrackEntitiesTableBUI as Xe}from"./TrackEntitiesTable/TrackEntitiesTableBUI.esm.js";const Ze=Ee(()=>({container:{marginBottom:"var(--bui-space-12)"},cards:{margin:"0 0 var(--bui-space-12)",display:"flex",gridGap:"var(--bui-space-4)"},tableContent:{margin:"var(--bui-space-3) 0 0"},levelSection:{margin:"0 0 var(--bui-space-6)"},levelHeading:{padding:"var(--bui-space-3)",background:"var(--bui-bg-neutral-1)"}})),o={CHECKS_BY_LEVELS:"Checks By Levels",TOP_FAILING_CHECKS:"Top Failing Checks",ENTITIES:"Entities"},ze={"checks-by-levels":o.CHECKS_BY_LEVELS,"top-failing-checks":o.TOP_FAILING_CHECKS,entities:o.ENTITIES},et={[o.CHECKS_BY_LEVELS]:"checks-by-levels",[o.TOP_FAILING_CHECKS]:"top-failing-checks",[o.ENTITIES]:"entities"},tt=()=>{const n=Ze(),[a,k]=Te(),[O,Q]=b(()=>{const e=a.get("section"),s=e?ze[e]:null;return new Set([s??o.CHECKS_BY_LEVELS])}),g=O.values().next().value??o.CHECKS_BY_LEVELS,[l,P]=b(a.get("search")||""),[x,q]=b(""),{trackId:i}=be(),{data:r,isLoading:m,isError:J}=Ie(i),W=H(He),A=qe(r??void 0),V=r?.ownerEntityRef,X=V?ke(V).name:void 0,Z=Array.from(new Set(r?.levels.flatMap(e=>e.checks).map(e=>e.id)??[])),{owners:p,lifecycles:d,types:u,systems:f}=Me(),L=y(()=>Ue({lifecycles:d,owners:p,types:u,systems:f}),[d,p,u,f]),I=y(()=>xe(a.get("numberOfDays")),[a]),[S,K]=b(!1),[w,_]=Le("track-overview-search-params","");U(()=>{!S&&a?.toString()?(w!==a.toString()&&_(a.toString()),K(!0)):S?S&&w!==a.toString()&&_(a.toString()):K(!0)},[a,k,_,w,S]),ye(()=>{q(l);const e=new URLSearchParams(a.toString());l?e.set("search",l):e.delete("search"),k(e,{replace:!0})},300,[l]);const j=y(()=>({routeName:"soundcheck-track-insights",additionalAttributes:{trackId:i||"",filtersApplied:p.length+d.length+u.length+f.length,ownersFilter:p.join(",")||"",lifecyclesFilter:d.join(",")||"",typesFilter:u.join(",")||"",systemsFilter:f.join(",")||"",numberOfDays:I,tracksSearch:x||""}}),[i,p,d,u,f,I,x]),{reportContentLoaded:Y}=Re(j),{reporter:z}=Fe(j),ee=e=>{Q(e),P("");const s=e.values().next().value,v=s?et[s]:void 0;v?k({section:v},{replace:!0}):k({},{replace:!0})},{data:E,isLoading:N,isError:te}=we({trackId:i,filter:L},!!i),{data:re,isLoading:B,isError:ie}=_e({trackId:i,filter:L,numberOfDays:I},!!i),{data:C,isLoading:F}=Ne({trackId:i,checkIds:Z,filter:L},!!r),oe=y(()=>Ce(r?.filter),[r]),R=J||te||ie,{loading:ae,allowed:se}=ge({permission:ve,resourceRef:i}),{filters:ce,selected:ne,setSelected:le,onRemoveTag:me,selectedTags:pe}=Be({entityFilterQuery:oe}),de=r?.levels.flatMap(e=>{const s=l?.trim().toLowerCase();return{...e,checks:s?e.checks.filter(({name:v})=>v.toLowerCase().includes(s)):e.checks}})??[],D=z?.getLCPValue();U(()=>{if(!m&&!F&&!N&&!B){const e=E?.certificationStatus?.numberOfEntities??0,s=C?.length??0;Y({lcp:D,numberOfEntities:e,entitiesBucket:Ae(e),numberOfChecks:s,checksBucket:Ve(s)})}},[m,F,N,B,C,E,Y,D]);const ue=H(Oe),fe=H(Pe);return m?t(T,{className:n.container,children:t($e,{})}):!m&&!r?t(T,{className:n.container,children:t($,{title:"Track not found",body:`There is no track with the requested id: ${i}.`})}):!ae&&!se?t(T,{className:n.container,children:t($,{title:"Cannot view track",body:`No permission to view track with the requested id: ${i}.`})}):c(he,{children:[t(Se,{title:r?.name,customActions:t(Qe,{label:"Track Actions",disabled:!A.length,placement:"left top",menuActions:A}),breadcrumbs:[{label:"Tracks",href:W()}],tabs:[{id:"overview",label:"Track Overview",href:i?ue({trackId:i}):""},{id:"explorer",label:"Tech Insights Explorer",href:i?fe({trackId:i}):""}]}),c(T,{className:n.container,children:[c(h,{className:n.cards,children:[t(Ke,{description:r?.description??void 0,owner:X,isError:R,isLoading:m}),t(Ye,{track:r??void 0,status:E,isError:R,isLoading:N}),t(je,{track:r??void 0,history:re,isError:R,isLoading:B})]}),r&&c(h,{children:[c(G,{justify:"between",children:[t(h,{minWidth:"18rem",children:t(Ge,{options:Object.values(o),selected:O,ariaLabel:"Sections",onSelectionChange:ee})}),t(Je,{searchValue:l,setSearchValue:e=>P(e),filters:ce,selected:ne,setSelected:le,onRemoveTag:me,selectedTags:pe,showSearch:g!==o.ENTITIES})]}),c(h,{className:n.tableContent,children:[g===o.CHECKS_BY_LEVELS&&t(h,{mt:"3",children:de.map(e=>c(h,{className:n.levelSection,children:[c(G,{align:"center",gap:"4",className:n.levelHeading,children:[c(M,{color:"secondary",children:["Level ",e.ordinal]})," ",t(M,{children:e.name})]}),t(De,{trackId:r.id,checks:e.checks,checkStatuses:C,isLoading:m||F,levelOrdinal:e.ordinal})]},e.ordinal))}),g===o.TOP_FAILING_CHECKS&&t(We,{track:r,checkStatuses:C,certificationStatus:E?.certificationStatus,searchValue:l}),g===o.ENTITIES&&t(Xe,{track:r,lifecycles:d,owners:p,types:u,systems:f,searchValue:l})]})]})]})]})};export{tt as TrackPageBUI};
2
2
  //# sourceMappingURL=TrackPageBUI.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as r,jsxs as p,Fragment as j}from"react/jsx-runtime";import{useRouteRef as k,useApi as q}from"@backstage/core-plugin-api";import{entityPresentationApiRef as D}from"@backstage/plugin-catalog-react";import{usePermission as M}from"@backstage/plugin-permission-react";import{Container as l,HeaderPage as U,Box as b,Flex as $,SearchField as z}from"@backstage/ui";import{makeStyles as J}from"@material-ui/core";import{soundcheckTrackReadPermission as K}from"@spotify/backstage-plugin-soundcheck-common";import{useState as I,useMemo as T,useEffect as Q}from"react";import{useSearchParams as W,useParams as X}from"react-router-dom";import Y from"react-use/lib/useDebounce";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import{useGetAllTracks as Z}from"../../hooks/tracks/useGetAllTracks.esm.js";import{useTrack as _}from"../../hooks/tracks/useTrack.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-use/lib/useLocalStorage";import{useHierarchicalTrackStatus as ee}from"../../hooks/heirarchy/useHierarchicalTrackStatus.esm.js";import{useGroupHierarchy as re}from"../../hooks/heirarchy/useGroupHierarchy.esm.js";import{useLCPReporting as te}from"../../hooks/useLCPReporting.esm.js";import{useLoadTimeReporting as oe}from"../../hooks/useLoadTimeReporting.esm.js";import{tracksPageRouteRef as ie,trackOverviewRouteRef as ae,trackExplorerRouteRef as me}from"../../routes.esm.js";import{getAllOwnedEntityCount as se}from"../../utils/getAllOwnedEntityCount.esm.js";import{getEntitiesBucket as ne,getTracksBucket as ce}from"../../utils/helpers.esm.js";import"../EmptyState/EmptyState.esm.js";import{EmptyStateBUI as A}from"../EmptyState/EmptyStateBUI.esm.js";import"@remixicon/react";import"../HierarchicalTechInsightsPage/visualizations/NivoCirclePacking.esm.js";import"../HierarchicalTechInsightsPage/visualizations/NivoHeatmap.esm.js";import"../HierarchicalTechInsightsPage/visualizations/NivoIcicle.esm.js";import"../HierarchicalTechInsightsPage/visualizations/NivoSunburst.esm.js";import"../HierarchicalTechInsightsPage/visualizations/NivoTreemap.esm.js";import"../HierarchicalTechInsightsPage/visualizations/VisualizationBreadcrumb.esm.js";import{hierarchyToNivo as pe}from"../HierarchicalTechInsightsPage/visualizations/hierarchyToNivo.esm.js";import{LoadingTableSkeleton as le}from"../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";import{SimpleMenu as de}from"../Menus/SimpleMenu.esm.js";import"js-yaml";import"lodash";import{useTrackActions as ue}from"../Menus/useTrackActions.esm.js";import"uuid";import"../CampaignPage/CampaignActionsContext.esm.js";import"../CampaignsPage/CampaignListPage/useArchiveConfirmationModal.esm.js";import{TechInsightsExplorerTable as fe}from"../TechInsightsExplorerTable/TechInsightsExplorerTable.esm.js";import{TechInsightsGroupSelector as he}from"../TechInsightsGroupSelector/TechInsightsGroupSelector.esm.js";import{TopAndBottomPerformingTeams as ge}from"../TopAndBottomPerformingTeams/TopAndBottomPerformingTeams.esm.js";const ke=J(()=>({container:{marginBottom:"var(--bui-space-12)"},teams:{margin:"0 0 var(--bui-space-12)"},tableContent:{margin:"var(--bui-space-3) 0 0"},filters:{width:"25rem",marginLeft:"auto"}})),be=()=>{const i=ke(),[d,N]=W(),[a,y]=I(d.get("search")||""),t=d.get("group"),[u,C]=I(""),{trackId:e}=X(),{data:f,isLoading:s}=_(e),v=ue(f??void 0),E=k(ie);Y(()=>{C(a);const o=new URLSearchParams(d.toString());a?o.set("search",a):o.delete("search"),N(o,{replace:!0})},300,[a]);const R=T(()=>({routeName:"soundcheck-tech-insights-explorer",additionalAttributes:{trackId:e||"",group:t||"",groupsSearch:u||""}}),[e,t,u]),{reportContentLoaded:S}=oe(R),{reporter:B}=te(R),{loading:O,allowed:F}=M({permission:K,resourceRef:e}),{data:h,isLoading:n}=ee({trackId:e??"",groupRef:t??"",skip:!e}),{data:L}=Z({}),m=T(()=>L?.edges.find(o=>o.node.id===e)?.node,[L?.edges,e]),{data:c,isLoading:g}=re(t||void 0,{enabled:!!t&&!!e&&!!m,ownedEntitiesFilter:m?.filter??void 0}),P=q(D),G=T(()=>{if(!t)return;const o=c?.[t];return o?pe(o,h||null,()=>"var(--bui-fg-primary)",P,void 0):void 0},[c,P,t,h]),w=B?.getLCPValue();Q(()=>{if(!s&&!g&&!n){const o=t?se(c?.[t]):0,x=m?1:0;S({lcp:w,numberOfEntities:o,entitiesBucket:ne(o),numberOfTracks:x,tracksBucket:ce(x)})}},[s,S,g,n,c,t,m,w]);const H=k(ae),V=k(me);return s?r(l,{className:i.container,children:r(le,{})}):!s&&!f?r(l,{className:i.container,children:r(A,{title:"Track not found",body:`There is no track with the requested id: ${e}.`})}):!O&&!F?r(l,{className:i.container,children:r(A,{title:"Cannot view track",body:`No permission to view track with the requested id: ${e}.`})}):p(j,{children:[r(U,{title:f?.name,customActions:r(de,{label:"Track Actions",disabled:!v.length,placement:"left top",menuActions:v}),breadcrumbs:[{label:"Tracks",href:E()}],tabs:[{id:"overview",label:"Track Overview",href:e?H({trackId:e}):""},{id:"explorer",label:"Tech Insights Explorer",href:e?V({trackId:e}):""}]}),p(l,{className:i.container,children:[r(b,{className:i.teams,children:r(ge,{trackStatus:h??void 0,isLoading:n})}),p(b,{children:[p($,{align:"center",gap:"3",className:i.filters,children:[r(he,{}),r(z,{value:a,onChange:y,"aria-label":"Search",placeholder:"Search"})]}),r(b,{className:i.tableContent,children:r(fe,{tableData:G,isLoading:g||n,selectedGroup:t??void 0,searchValue:u,trackId:m?.id})})]})]})]})};export{be as TrackTechInsightsExplorerPage};
1
+ import{jsx as r,jsxs as p,Fragment as j}from"react/jsx-runtime";import{useRouteRef as k,useApi as q}from"@backstage/core-plugin-api";import{entityPresentationApiRef as D}from"@backstage/plugin-catalog-react";import{usePermission as M}from"@backstage/plugin-permission-react";import{Container as l,HeaderPage as U,Box as b,Flex as $,SearchField as z}from"@backstage/ui";import{makeStyles as J}from"@material-ui/core";import{soundcheckTrackReadPermission as K}from"@spotify/backstage-plugin-soundcheck-common";import{useState as I,useMemo as T,useEffect as Q}from"react";import{useSearchParams as W,useParams as X}from"react-router-dom";import Y from"react-use/lib/useDebounce";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import{useGetAllTracks as Z}from"../../hooks/tracks/useGetAllTracks.esm.js";import{useTrack as _}from"../../hooks/tracks/useTrack.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-use/lib/useLocalStorage";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsync";import{useHierarchicalTrackStatus as ee}from"../../hooks/heirarchy/useHierarchicalTrackStatus.esm.js";import{useGroupHierarchy as re}from"../../hooks/heirarchy/useGroupHierarchy.esm.js";import{useLCPReporting as te}from"../../hooks/useLCPReporting.esm.js";import{useLoadTimeReporting as oe}from"../../hooks/useLoadTimeReporting.esm.js";import{tracksPageRouteRef as ie,trackOverviewRouteRef as ae,trackExplorerRouteRef as me}from"../../routes.esm.js";import{getAllOwnedEntityCount as se}from"../../utils/getAllOwnedEntityCount.esm.js";import{getEntitiesBucket as ne,getTracksBucket as ce}from"../../utils/helpers.esm.js";import"../EmptyState/EmptyState.esm.js";import{EmptyStateBUI as A}from"../EmptyState/EmptyStateBUI.esm.js";import"@remixicon/react";import"../HierarchicalTechInsightsPage/visualizations/NivoCirclePacking.esm.js";import"../HierarchicalTechInsightsPage/visualizations/NivoHeatmap.esm.js";import"../HierarchicalTechInsightsPage/visualizations/NivoIcicle.esm.js";import"../HierarchicalTechInsightsPage/visualizations/NivoSunburst.esm.js";import"../HierarchicalTechInsightsPage/visualizations/NivoTreemap.esm.js";import"../HierarchicalTechInsightsPage/visualizations/VisualizationBreadcrumb.esm.js";import{hierarchyToNivo as pe}from"../HierarchicalTechInsightsPage/visualizations/hierarchyToNivo.esm.js";import{LoadingTableSkeleton as le}from"../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";import{SimpleMenu as de}from"../Menus/SimpleMenu.esm.js";import"js-yaml";import"lodash";import{useTrackActions as ue}from"../Menus/useTrackActions.esm.js";import"uuid";import"../CampaignPage/CampaignActionsContext.esm.js";import"../CampaignsPage/CampaignListPage/useArchiveConfirmationModal.esm.js";import{TechInsightsExplorerTable as fe}from"../TechInsightsExplorerTable/TechInsightsExplorerTable.esm.js";import{TechInsightsGroupSelector as he}from"../TechInsightsGroupSelector/TechInsightsGroupSelector.esm.js";import{TopAndBottomPerformingTeams as ge}from"../TopAndBottomPerformingTeams/TopAndBottomPerformingTeams.esm.js";const ke=J(()=>({container:{marginBottom:"var(--bui-space-12)"},teams:{margin:"0 0 var(--bui-space-12)"},tableContent:{margin:"var(--bui-space-3) 0 0"},filters:{width:"25rem",marginLeft:"auto"}})),be=()=>{const i=ke(),[d,N]=W(),[a,y]=I(d.get("search")||""),t=d.get("group"),[u,C]=I(""),{trackId:e}=X(),{data:f,isLoading:s}=_(e),v=ue(f??void 0),E=k(ie);Y(()=>{C(a);const o=new URLSearchParams(d.toString());a?o.set("search",a):o.delete("search"),N(o,{replace:!0})},300,[a]);const R=T(()=>({routeName:"soundcheck-tech-insights-explorer",additionalAttributes:{trackId:e||"",group:t||"",groupsSearch:u||""}}),[e,t,u]),{reportContentLoaded:S}=oe(R),{reporter:B}=te(R),{loading:O,allowed:F}=M({permission:K,resourceRef:e}),{data:h,isLoading:n}=ee({trackId:e??"",groupRef:t??"",skip:!e}),{data:L}=Z({}),m=T(()=>L?.edges.find(o=>o.node.id===e)?.node,[L?.edges,e]),{data:c,isLoading:g}=re(t||void 0,{enabled:!!t&&!!e&&!!m,ownedEntitiesFilter:m?.filter??void 0}),P=q(D),G=T(()=>{if(!t)return;const o=c?.[t];return o?pe(o,h||null,()=>"var(--bui-fg-primary)",P,void 0):void 0},[c,P,t,h]),w=B?.getLCPValue();Q(()=>{if(!s&&!g&&!n){const o=t?se(c?.[t]):0,x=m?1:0;S({lcp:w,numberOfEntities:o,entitiesBucket:ne(o),numberOfTracks:x,tracksBucket:ce(x)})}},[s,S,g,n,c,t,m,w]);const H=k(ae),V=k(me);return s?r(l,{className:i.container,children:r(le,{})}):!s&&!f?r(l,{className:i.container,children:r(A,{title:"Track not found",body:`There is no track with the requested id: ${e}.`})}):!O&&!F?r(l,{className:i.container,children:r(A,{title:"Cannot view track",body:`No permission to view track with the requested id: ${e}.`})}):p(j,{children:[r(U,{title:f?.name,customActions:r(de,{label:"Track Actions",disabled:!v.length,placement:"left top",menuActions:v}),breadcrumbs:[{label:"Tracks",href:E()}],tabs:[{id:"overview",label:"Track Overview",href:e?H({trackId:e}):""},{id:"explorer",label:"Tech Insights Explorer",href:e?V({trackId:e}):""}]}),p(l,{className:i.container,children:[r(b,{className:i.teams,children:r(ge,{trackStatus:h??void 0,isLoading:n})}),p(b,{children:[p($,{align:"center",gap:"3",className:i.filters,children:[r(he,{}),r(z,{value:a,onChange:y,"aria-label":"Search",placeholder:"Search"})]}),r(b,{className:i.tableContent,children:r(fe,{tableData:G,isLoading:g||n,selectedGroup:t??void 0,searchValue:u,trackId:m?.id})})]})]})]})};export{be as TrackTechInsightsExplorerPage};
2
2
  //# sourceMappingURL=TrackTechInsightsExplorerPage.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as t,jsxs as d,Fragment as Y}from"react/jsx-runtime";import{useApi as z,useRouteRef as B}from"@backstage/core-plugin-api";import{entityPresentationApiRef as _}from"@backstage/plugin-catalog-react";import{usePermission as q}from"@backstage/plugin-permission-react";import{HeaderPage as X,Flex as Z,Container as ee,TableRoot as te,TableHeader as re,Column as m,TableBody as oe,TablePagination as ae}from"@backstage/ui";import{makeStyles as ie}from"@material-ui/core";import{soundcheckTrackCreatePermission as ne}from"@spotify/backstage-plugin-soundcheck-common";import{sortBy as se,isEmpty as R}from"lodash";import{useState as T,useMemo as u,useEffect as me}from"react";import{useSearchParams as ce}from"react-router-dom";import le from"react-use/lib/useDebounce";import{soundcheckApiRef as pe}from"../../api.esm.js";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../hooks/graphqlKeys.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import{useGetAllTracks as de}from"../../hooks/tracks/useGetAllTracks.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{usePagination as fe}from"../../hooks/usePagination.esm.js";import"react-use/lib/useLocalStorage";import{useProfileImages as ge}from"../../hooks/catalog/useProfileImages.esm.js";import{useImportTracks as ue}from"../../hooks/tracks/useImportTracks.esm.js";import{useLCPReporting as he}from"../../hooks/useLCPReporting.esm.js";import{useLoadTimeReporting as Pe}from"../../hooks/useLoadTimeReporting.esm.js";import{useSearchNameOwner as we}from"../../hooks/useSearchNameOwner.esm.js";import{newTrackRouteRef as ye,trackDetailsRouteRef as ke}from"../../routes.esm.js";import{exportTracks as Se}from"../../utils/export.esm.js";import"../EmptyState/EmptyState.esm.js";import{EmptyStateBUI as Re}from"../EmptyState/EmptyStateBUI.esm.js";import{EmptyStateNoTracks as Te}from"../EmptyState/EmptyStateNoTracks.esm.js";import"@remixicon/react";import{ImportExportPanelBUI as ve}from"../ImportExportPanel/ImportExportPanelBUI.esm.js";import"../ImportExportPanel/ImportExportPanelDeprecated.esm.js";import{ListPageCustomActions as Ce}from"../ListPageCustomActions/ListPageCustomActions.esm.js";import{LoadingTableSkeleton as Le}from"../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";import"../Menus/SimpleMenu.esm.js";import{useTrackActions as Ie}from"../Menus/useTrackActions.esm.js";import"uuid";import"../CampaignPage/CampaignActionsContext.esm.js";import"../CampaignsPage/CampaignListPage/useArchiveConfirmationModal.esm.js";import{TableRowWithOwner as Ee}from"../TableRowWithOwner/TableRowWithOwner.esm.js";const D=10,Ae=["name","status","owner"],be=({track:r,profileImageMap:i})=>{const c=u(()=>r.levels.reduce((l,P)=>l+(P.checks?.length??0),0),[r.levels]),o=B(ke),h=Ie(r);return t(Ee,{ownerEntityRef:r.ownerEntityRef,href:o({trackId:r.id}),menuActions:h,profileImageSrc:i[r.ownerEntityRef],name:r.name??r.id,description:r.description??"",documentationURL:r.documentationURL??void 0,cells:[{title:r.draft?"Draft":"Active"},{title:`${r.levels.length} Level${r.levels.length===1?"":"s"}`},{title:`${c} Check${c===1?"":"s"}`}]})},xe=ie(()=>({container:{marginBottom:"var(--bui-space-12)"}})),Ne=()=>{const r=xe(),[i,c]=ce(),[o,h]=T(()=>i.get("search")??""),[l,P]=T(()=>i.get("sortDirection")==="descending"?"descending":"ascending"),[p,H]=T(()=>{const e=i.get("sort");return e&&Ae.includes(e)?e:""}),v=u(()=>({routeName:"soundcheck-tracks"}),[]),{reportContentLoaded:C}=Pe(v),{reporter:M}=he(v),{data:L,isLoading:n}=de({types:["standard","playlist"]}),w=u(()=>L?.edges?.map(e=>e.node)??[],[L?.edges]),{profileImageMap:$}=ge(w.map(e=>e.ownerEntityRef)),I=z(_),y=we(w,o),f=u(()=>{if(!p)return y;const e=se(y,s=>p==="owner"?I.forEntity(s.ownerEntityRef).snapshot.primaryTitle.toLowerCase():p==="status"?s.draft?"draft":"active":s.name.toLowerCase());return l==="descending"&&e.reverse(),e},[I,p,l,y]),{paginatedItems:k,reset:E,paginationProps:a}=fe({pageParam:"perPage",defaultPageSize:D,items:f});le(()=>{E();const e=new URLSearchParams(i.toString());o?e.set("search",o):e.delete("search"),c(e,{replace:!0})},300,[o]);const V=({direction:e,column:s})=>{const S=String(s);H(S),P(e),E();const g=new URLSearchParams(i);S?g.set("sort",S):g.delete("sort"),g.set("sortDirection",e),c(g,{replace:!0})},A=M?.getLCPValue();me(()=>{n||C({lcp:A})},[n,C,A]);const F=B(ye),{loading:b,allowed:x}=q({permission:ne}),O=z(pe),{mutateAsync:j}=ue(),G=async e=>j(e),W=async()=>{const e=await O.getTracks({orderAlphabetical:"asc"});return Se(e.edges.map(s=>s.node))},J=!n&&!R(k),K=f.length>D,N=!n&&R(k),Q=n;let U=null;return N&&(U=o?t(Re,{title:"No tracks found",body:"Your current search term did not return any tracks. Please try a different search term."}):t(Te,{})),d(Y,{children:[t(X,{title:"Tracks",customActions:d(Z,{gap:"2",align:"center",children:[t(ve,{resourceType:"track",disableImport:!b&&!x,disableExport:n||R(w),onImport:G,onExport:W}),t(Ce,{searchValue:o,setSearchValue:h,canCreate:!b&&x,createHref:F()})]})}),d(ee,{className:r.container,children:[Q&&t(Le,{rowCount:10}),N&&U,J&&d(te,{onSortChange:V,sortDescriptor:{direction:l,column:p},children:[d(re,{children:[t(m,{id:"name",allowsSorting:!0,isRowHeader:!0,style:{width:"50%"},children:"Track Name"}),t(m,{allowsSorting:!0,id:"status",style:{width:"10%"},children:"Status"}),t(m,{id:"levels",style:{width:"10%"},children:"Levels"}),t(m,{id:"checks",style:{width:"10%"},children:"Checks"}),t(m,{id:"owner",allowsSorting:!0,style:{width:"15%"},children:"Track Owner"}),t(m,{id:"actions",style:{width:"3%"}})]}),t(oe,{children:!n&&k.map(e=>t(be,{track:e,profileImageMap:$??{}},e.id))})]}),K&&t(ae,{totalCount:f.length,offset:a.offset,hasNextPage:a.offset+a.pageSize<(f.length??0),hasPreviousPage:a.offset>0,onNextPage:a.onNextPage,onPreviousPage:a.onPreviousPage,onPageSizeChange:a.onPageSizeChange,pageSize:a.pageSize})]})]})};export{Ne as TracksListPageBUI};
1
+ import{jsx as t,jsxs as d,Fragment as Y}from"react/jsx-runtime";import{useApi as z,useRouteRef as B}from"@backstage/core-plugin-api";import{entityPresentationApiRef as _}from"@backstage/plugin-catalog-react";import{usePermission as q}from"@backstage/plugin-permission-react";import{HeaderPage as X,Flex as Z,Container as ee,TableRoot as te,TableHeader as re,Column as m,TableBody as oe,TablePagination as ie}from"@backstage/ui";import{makeStyles as ae}from"@material-ui/core";import{soundcheckTrackCreatePermission as ne}from"@spotify/backstage-plugin-soundcheck-common";import{sortBy as se,isEmpty as R}from"lodash";import{useState as T,useMemo as u,useEffect as me}from"react";import{useSearchParams as ce}from"react-router-dom";import le from"react-use/lib/useDebounce";import{soundcheckApiRef as pe}from"../../api.esm.js";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../hooks/graphqlKeys.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import{useGetAllTracks as de}from"../../hooks/tracks/useGetAllTracks.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{usePagination as fe}from"../../hooks/usePagination.esm.js";import"react-use/lib/useLocalStorage";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsync";import{useProfileImages as ge}from"../../hooks/catalog/useProfileImages.esm.js";import{useImportTracks as ue}from"../../hooks/tracks/useImportTracks.esm.js";import{useLCPReporting as he}from"../../hooks/useLCPReporting.esm.js";import{useLoadTimeReporting as Pe}from"../../hooks/useLoadTimeReporting.esm.js";import{useSearchNameOwner as we}from"../../hooks/useSearchNameOwner.esm.js";import{newTrackRouteRef as ye,trackDetailsRouteRef as ke}from"../../routes.esm.js";import{exportTracks as Se}from"../../utils/export.esm.js";import"../EmptyState/EmptyState.esm.js";import{EmptyStateBUI as Re}from"../EmptyState/EmptyStateBUI.esm.js";import{EmptyStateNoTracks as Te}from"../EmptyState/EmptyStateNoTracks.esm.js";import"@remixicon/react";import{ImportExportPanelBUI as ve}from"../ImportExportPanel/ImportExportPanelBUI.esm.js";import"../ImportExportPanel/ImportExportPanelDeprecated.esm.js";import{ListPageCustomActions as Ce}from"../ListPageCustomActions/ListPageCustomActions.esm.js";import{LoadingTableSkeleton as Le}from"../LoadingTableSkeleton/LoadingTableSkeleton.esm.js";import"../Menus/SimpleMenu.esm.js";import{useTrackActions as Ie}from"../Menus/useTrackActions.esm.js";import"uuid";import"../CampaignPage/CampaignActionsContext.esm.js";import"../CampaignsPage/CampaignListPage/useArchiveConfirmationModal.esm.js";import{TableRowWithOwner as Ee}from"../TableRowWithOwner/TableRowWithOwner.esm.js";const D=10,Ae=["name","status","owner"],be=({track:r,profileImageMap:a})=>{const c=u(()=>r.levels.reduce((l,P)=>l+(P.checks?.length??0),0),[r.levels]),o=B(ke),h=Ie(r);return t(Ee,{ownerEntityRef:r.ownerEntityRef,href:o({trackId:r.id}),menuActions:h,profileImageSrc:a[r.ownerEntityRef],name:r.name??r.id,description:r.description??"",documentationURL:r.documentationURL??void 0,cells:[{title:r.draft?"Draft":"Active"},{title:`${r.levels.length} Level${r.levels.length===1?"":"s"}`},{title:`${c} Check${c===1?"":"s"}`}]})},xe=ae(()=>({container:{marginBottom:"var(--bui-space-12)"}})),Ne=()=>{const r=xe(),[a,c]=ce(),[o,h]=T(()=>a.get("search")??""),[l,P]=T(()=>a.get("sortDirection")==="descending"?"descending":"ascending"),[p,H]=T(()=>{const e=a.get("sort");return e&&Ae.includes(e)?e:""}),v=u(()=>({routeName:"soundcheck-tracks"}),[]),{reportContentLoaded:C}=Pe(v),{reporter:M}=he(v),{data:L,isLoading:n}=de({types:["standard","playlist"]}),w=u(()=>L?.edges?.map(e=>e.node)??[],[L?.edges]),{profileImageMap:$}=ge(w.map(e=>e.ownerEntityRef)),I=z(_),y=we(w,o),f=u(()=>{if(!p)return y;const e=se(y,s=>p==="owner"?I.forEntity(s.ownerEntityRef).snapshot.primaryTitle.toLowerCase():p==="status"?s.draft?"draft":"active":s.name.toLowerCase());return l==="descending"&&e.reverse(),e},[I,p,l,y]),{paginatedItems:k,reset:E,paginationProps:i}=fe({pageParam:"perPage",defaultPageSize:D,items:f});le(()=>{E();const e=new URLSearchParams(a.toString());o?e.set("search",o):e.delete("search"),c(e,{replace:!0})},300,[o]);const V=({direction:e,column:s})=>{const S=String(s);H(S),P(e),E();const g=new URLSearchParams(a);S?g.set("sort",S):g.delete("sort"),g.set("sortDirection",e),c(g,{replace:!0})},A=M?.getLCPValue();me(()=>{n||C({lcp:A})},[n,C,A]);const F=B(ye),{loading:b,allowed:x}=q({permission:ne}),O=z(pe),{mutateAsync:j}=ue(),G=async e=>j(e),W=async()=>{const e=await O.getTracks({orderAlphabetical:"asc"});return Se(e.edges.map(s=>s.node))},J=!n&&!R(k),K=f.length>D,N=!n&&R(k),Q=n;let U=null;return N&&(U=o?t(Re,{title:"No tracks found",body:"Your current search term did not return any tracks. Please try a different search term."}):t(Te,{})),d(Y,{children:[t(X,{title:"Tracks",customActions:d(Z,{gap:"2",align:"center",children:[t(ve,{resourceType:"track",disableImport:!b&&!x,disableExport:n||R(w),onImport:G,onExport:W}),t(Ce,{searchValue:o,setSearchValue:h,canCreate:!b&&x,createHref:F()})]})}),d(ee,{className:r.container,children:[Q&&t(Le,{rowCount:10}),N&&U,J&&d(te,{onSortChange:V,sortDescriptor:{direction:l,column:p},children:[d(re,{children:[t(m,{id:"name",allowsSorting:!0,isRowHeader:!0,style:{width:"50%"},children:"Track Name"}),t(m,{allowsSorting:!0,id:"status",style:{width:"10%"},children:"Status"}),t(m,{id:"levels",style:{width:"10%"},children:"Levels"}),t(m,{id:"checks",style:{width:"10%"},children:"Checks"}),t(m,{id:"owner",allowsSorting:!0,style:{width:"15%"},children:"Track Owner"}),t(m,{id:"actions",style:{width:"3%"}})]}),t(oe,{children:!n&&k.map(e=>t(be,{track:e,profileImageMap:$??{}},e.id))})]}),K&&t(ie,{totalCount:f.length,offset:i.offset,hasNextPage:i.offset+i.pageSize<(f.length??0),hasPreviousPage:i.offset>0,onNextPage:i.onNextPage,onPreviousPage:i.onPreviousPage,onPageSizeChange:i.onPageSizeChange,pageSize:i.pageSize})]})]})};export{Ne as TracksListPageBUI};
2
2
  //# sourceMappingURL=TracksListPageBUI.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{jsxs as r,Fragment as a,jsx as e}from"react/jsx-runtime";import{Button as p,Dialog as c,DialogHeader as m,DialogBody as d}from"@backstage/ui";import{useState as h}from"react";import{PullRequestsTable as q}from"../ChecksTable/PullRequestsTable.esm.js";const R=({checkName:l,pullRequests:i})=>{const[o,n]=h(!1),u=l?`${l} - Pull Requests`:"Pull Requests",s=t=>{n(t)};return r(a,{children:[e(p,{variant:"tertiary",onClick:t=>{t.stopPropagation(),s(!0)},children:"View Pull Requests"}),r(c,{isOpen:o,onOpenChange:s,width:"60%",children:[e(m,{children:u}),e(d,{children:e(q,{pullRequests:i})})]})]})};export{R as ViewPullRequests};
2
+ //# sourceMappingURL=ViewPullRequests.esm.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as d}from"react/jsx-runtime";import{stringifyEntityRef as g}from"@backstage/catalog-model";import{useApi as a,identityApiRef as p}from"@backstage/core-plugin-api";import{catalogApiRef as y}from"@backstage/plugin-catalog-react";import{createContext as R,useState as E,useEffect as v,useContext as x}from"react";import C from"react-use/lib/useAsync";const f={loading:!0},l=R(f),A=()=>x(l),P=({children:u})=>{const[m,n]=E(f),s=a(y),t=a(p),{value:e,loading:r,error:o}=C(async()=>{const[{token:i},c]=await Promise.all([t.getCredentials(),t.getBackstageIdentity()]);return i?await s.getEntityByRef(c.userEntityRef):null},[s,t]);return v(()=>{if(e){const i=g(e);n({user:e,userEntityRef:i,loading:r,error:o})}else n({loading:r,error:o})},[e,r,o]),d(l.Provider,{value:m,children:u})};export{P as UserProvider,A as useLoggedInUser};
1
+ import{jsx as d}from"react/jsx-runtime";import{stringifyEntityRef as g}from"@backstage/catalog-model";import{useApi as a,identityApiRef as p}from"@backstage/core-plugin-api";import{catalogApiRef as y}from"@backstage/plugin-catalog-react";import{createContext as R,useState as E,useEffect as v,useContext as x}from"react";import A from"react-use/lib/useAsync";const f={loading:!0},l=R(f),C=()=>x(l),P=({children:u})=>{const[m,n]=E(f),s=a(y),t=a(p),{value:e,loading:r,error:o}=A(async()=>{const[{token:i},c]=await Promise.all([t.getCredentials(),t.getBackstageIdentity()]);return i?await s.getEntityByRef(c.userEntityRef):null},[s,t]);return v(()=>{if(e){const i=g(e);n({user:e,userEntityRef:i,loading:r,error:o})}else n({loading:r,error:o})},[e,r,o]),d(l.Provider,{value:m,children:u})};export{P as UserProvider,C as useLoggedInUser};
2
2
  //# sourceMappingURL=UserProvider.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{REMEDY_STATUS as r}from"@spotify/backstage-plugin-soundcheck-common";import{CheckerType as C}from"../../graphql/generated/index.esm.js";import{useRemediesForCheck as E}from"../remedy/useRemediesForCheck.esm.js";import"@backstage/core-plugin-api";import"react-use/lib/useAsync";import"../../api.esm.js";import{useFeatureFlag as p}from"../useFeatureFlag.esm.js";const f=l=>(l?.failed??0)>0;function R({isPortal:l,isPortalAiFm:u,type:i,rule:o,checkStatus:a}){const n=i===C.Manual,e=!!o&&!n;return l&&u&&f(a)&&e}const d=({type:l,rule:u,checkStatus:i,checkId:o})=>{const a=p("portal"),n=p("portal-ai-fm"),{value:e}=E(o),h=(e?.length??0)>0,S=e?.some(({status:t})=>t===r.IN_PROGRESS)??!1,s=e?.filter(({prUrl:t})=>t),g=s?.length,F=s?.filter(({status:t})=>t===r.RESOLVED).length,P=s?.filter(({status:t})=>t===r.FAILED).length,k=s?.filter(({status:t})=>t===r.IN_PROGRESS).length,c=R({isPortal:a,isPortalAiFm:n,type:l,rule:u,checkStatus:i,hasShift:h});let m;return c&&(m=e?.find(({jobUrl:t})=>t)?.jobUrl),{showFixMeButton:c,hasShift:h,isRunning:S,href:m,pullRequests:s,pullRequestsCount:g,mergedPullRequestsCount:F,failedPullRequestsCount:P,openPullRequestsCount:k}};export{f as isCheckFailed,R as isFixMeEligible,d as useFixMe};
2
+ //# sourceMappingURL=useFixMe.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{ResultState as k,CheckerType as h}from"../../graphql/generated/index.esm.js";import{useFeatureFlag as e}from"../useFeatureFlag.esm.js";import"@backstage/core-plugin-api";import"react-use/lib/useAsync";import"../../api.esm.js";import{useRemediesForEntity as y}from"../remedy/useRemediesForEntity.esm.js";const F=({result:t,type:r,rule:i,entityRef:o,checkId:p})=>{const u=e("portal"),a=e("portal-ai-fm"),l=t===k.Failed,m=r===h.Manual,s=u&&a&&l&&!!i&&!m,{value:n}=y({entityRef:o??"",checkId:p??""}),c=n?.filter(({prUrl:f})=>f)[0];return{showAikaButton:s,pullRequest:c}};export{F as useFixWithAika};
2
+ //# sourceMappingURL=useFixWithAika.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useMemo as c}from"react";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../graphqlKeys.esm.js";import{useAllGroups as d}from"./useAllGroups.esm.js";import{useUsersGroupClaims as f}from"./useUsersGroupClaims.esm.js";import"../useSoundcheckAlert.esm.js";import"../useConfirmationModal.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";const y=()=>{const{data:i,isLoading:m,isError:n}=f(),{data:e,isLoading:a,isError:u}=d();return{options:c(()=>{const o=new Map;return i&&i.forEach(({name:t,description:s,ref:r,type:p})=>{o.set(`${r}`,{name:t,description:s,ref:r,type:p,key:"My Groups"})}),e&&e.forEach(({name:t,description:s,ref:r,type:p})=>{o.has(`${r}`)||o.set(`${r}`,{name:t,description:s,ref:r,type:p,key:"All Groups"})}),[...o.values()]},[i,e]),isLoading:m||a,isError:n||u}};export{y as useGroupOptions};
1
+ import{useMemo as c}from"react";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../graphqlKeys.esm.js";import{useAllGroups as d}from"./useAllGroups.esm.js";import{useUsersGroupClaims as f}from"./useUsersGroupClaims.esm.js";import"../useSoundcheckAlert.esm.js";import"../useConfirmationModal.esm.js";import"react-router-dom";import"react-use/lib/useLocalStorage";import"@spotify/backstage-plugin-soundcheck-common";import"../../graphql/generated/index.esm.js";import"react-use/lib/useAsync";const y=()=>{const{data:i,isLoading:m,isError:n}=f(),{data:t,isLoading:a,isError:u}=d();return{options:c(()=>{const o=new Map;return i&&i.forEach(({name:e,description:p,ref:r,type:s})=>{o.set(`${r}`,{name:e,description:p,ref:r,type:s,key:"My Groups"})}),t&&t.forEach(({name:e,description:p,ref:r,type:s})=>{o.has(`${r}`)||o.set(`${r}`,{name:e,description:p,ref:r,type:s,key:"All Groups"})}),[...o.values()]},[i,t]),isLoading:m||a,isError:n||u}};export{y as useGroupOptions};
2
2
  //# sourceMappingURL=useGroupOptions.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{useApi as o}from"@backstage/core-plugin-api";import i from"react-use/lib/useAsync";import{remedyTrackerApiRef as m}from"../../api.esm.js";function t(e){const r=o(m);return i(()=>r.getRemediesForCheck(e),[e])}export{t as useRemediesForCheck};
2
+ //# sourceMappingURL=useRemediesForCheck.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{useApi as t}from"@backstage/core-plugin-api";import i from"react-use/lib/useAsync";import{remedyTrackerApiRef as o}from"../../api.esm.js";function m(r){const e=t(o);return i(()=>e.getRemediesForEntity(r),[r.entityRef,r.checkId,r.trackId])}export{m as useRemediesForEntity};
2
+ //# sourceMappingURL=useRemediesForEntity.esm.js.map
package/dist/index.d.ts CHANGED
@@ -1,8 +1,9 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
3
- import * as react from 'react';
4
3
  import * as _backstage_frontend_plugin_api from '@backstage/frontend-plugin-api';
5
4
  import { RouteRef } from '@backstage/frontend-plugin-api';
5
+ import { RemedyTrackerApi, Remedy, CheckReference } from '@spotify/backstage-plugin-soundcheck-common';
6
+ import * as react from 'react';
6
7
  import * as _tanstack_react_query from '@tanstack/react-query';
7
8
  import { JsonObject } from '@backstage/types';
8
9
 
@@ -72,6 +73,26 @@ interface EntitySoundcheckCardProps {
72
73
  title?: string;
73
74
  }
74
75
 
76
+ /**
77
+ * API reference for the RemedyTrackerApi.
78
+ *
79
+ * Provider plugins (e.g. Fleetshift) override this by registering their own
80
+ * ApiBlueprint targeting the same ref.
81
+ *
82
+ * @public
83
+ */
84
+ declare const remedyTrackerApiRef: _backstage_frontend_plugin_api.ApiRef<RemedyTrackerApi>;
85
+ /**
86
+ * No-op implementation of RemedyTrackerApi that returns empty arrays.
87
+ * Used as the default fallback when no provider (e.g. Fleetshift) is installed.
88
+ *
89
+ * @public
90
+ */
91
+ declare class NoOpRemedyTrackerClient implements RemedyTrackerApi {
92
+ getRemediesForCheck(_checkId: string): Promise<Array<Remedy>>;
93
+ getRemediesForEntity(_ref: CheckReference): Promise<Array<Remedy>>;
94
+ }
95
+
75
96
  /**
76
97
  * Create Soundcheck integration extensions that are routable React page components.
77
98
  *
@@ -181,4 +202,4 @@ declare function useUpdateCollectorConfig(): _tanstack_react_query.UseMutationRe
181
202
  config?: JsonObject;
182
203
  }, unknown>;
183
204
 
184
- export { CampaignActionBlueprint, EntitySoundcheckCard, type EntitySoundcheckCardProps, EntitySoundcheckContent, GroupSoundcheckContent, IntegrationPageBlueprint, type OverviewPageProps, SoundcheckOverviewPage, SoundcheckRoutingPage, soundcheckPlugin, useGetCollectors, useUpdateCollectorConfig };
205
+ export { CampaignActionBlueprint, EntitySoundcheckCard, type EntitySoundcheckCardProps, EntitySoundcheckContent, GroupSoundcheckContent, IntegrationPageBlueprint, NoOpRemedyTrackerClient, type OverviewPageProps, SoundcheckOverviewPage, SoundcheckRoutingPage, remedyTrackerApiRef, soundcheckPlugin, useGetCollectors, useUpdateCollectorConfig };
package/dist/index.esm.js CHANGED
@@ -1,2 +1,2 @@
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};
1
+ import{EntitySoundcheckCard as u,EntitySoundcheckContent as a,GroupSoundcheckContent as d,SoundcheckOverviewPage as f,SoundcheckRoutingPage as g,soundcheckPlugin as k}from"./plugin.esm.js";import"react/jsx-runtime";import"./components/SoundcheckQueryClientProvider/SoundcheckQueryClientProvider.esm.js";import"./components/EntitySoundcheckCard/Card.esm.js";import{NoOpRemedyTrackerClient as C,remedyTrackerApiRef as h}from"./api.esm.js";import{IntegrationPageBlueprint as S}from"./blueprints/IntegrationPageBlueprint.esm.js";import{CampaignActionBlueprint as y}from"./blueprints/CampaignActionBlueprint.esm.js";import{useGetCollectors as R}from"./hooks/collectors/useGetCollectors.esm.js";import{useUpdateCollectorConfig as A}from"./hooks/collectors/useUpdateCollectorConfig.esm.js";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"./hooks/graphqlKeys.esm.js";import"./hooks/useSoundcheckAlert.esm.js";export{y as CampaignActionBlueprint,u as EntitySoundcheckCard,a as EntitySoundcheckContent,d as GroupSoundcheckContent,S as IntegrationPageBlueprint,C as NoOpRemedyTrackerClient,f as SoundcheckOverviewPage,g as SoundcheckRoutingPage,h as remedyTrackerApiRef,k as soundcheckPlugin,R as useGetCollectors,A as useUpdateCollectorConfig};
2
2
  //# sourceMappingURL=index.esm.js.map
@@ -1,2 +1,2 @@
1
- import{createPlugin as c,createApiFactory as r,discoveryApiRef as u,fetchApiRef as p,createRoutableExtension as t,createComponentExtension as d}from"@backstage/core-plugin-api";import{soundcheckApiRef as a,SoundcheckApi as m}from"./api.esm.js";import{entityRootRouteRef as n,certificationRouteRef as h,groupRootRouteRef as R,rootRouteRef as i}from"./routes.esm.js";const o=c({id:"soundcheck",apis:[r({api:a,deps:{discoveryApi:u,fetchApi:p},factory:e=>new m(e)})],routes:{entityContent:n,entityCertification:h}}),k=o.provide(t({name:"EntitySoundcheckContent",component:()=>import("./components/EntitySoundcheckContent.esm.js").then(e=>e.EntitySoundcheckContent),mountPoint:n})),f=o.provide(d({name:"EntitySoundcheckCard",component:{lazy:()=>import("./components/EntitySoundcheckCard/index.esm.js").then(e=>e.EntitySoundcheckCard)}})),v=o.provide(t({name:"GroupSoundcheckContent",component:()=>import("./components/OverviewPage/index.esm.js").then(e=>e.FixedGroupOverviewPage),mountPoint:R})),y=o.provide(t({name:"SoundcheckOverviewPage",component:()=>import("./components/OverviewPage/index.esm.js").then(e=>e.OverviewPage),mountPoint:i})),g=o.provide(t({name:"SoundcheckRoutingPage",component:()=>import("./components/RoutingPage/index.esm.js").then(e=>e.RoutingPage),mountPoint:i}));export{f as EntitySoundcheckCard,k as EntitySoundcheckContent,v as GroupSoundcheckContent,y as SoundcheckOverviewPage,g as SoundcheckRoutingPage,o as soundcheckPlugin};
1
+ import{createPlugin as r,createApiFactory as n,discoveryApiRef as p,fetchApiRef as u,createRoutableExtension as t,createComponentExtension as d}from"@backstage/core-plugin-api";import{soundcheckApiRef as a,SoundcheckApi as m,remedyTrackerApiRef as h,NoOpRemedyTrackerClient as R}from"./api.esm.js";import{entityRootRouteRef as i,certificationRouteRef as k,groupRootRouteRef as f,rootRouteRef as c}from"./routes.esm.js";const o=r({id:"soundcheck",apis:[n({api:a,deps:{discoveryApi:p,fetchApi:u},factory:e=>new m(e)}),n({api:h,deps:{},factory:()=>new R})],routes:{entityContent:i,entityCertification:k}}),y=o.provide(t({name:"EntitySoundcheckContent",component:()=>import("./components/EntitySoundcheckContent.esm.js").then(e=>e.EntitySoundcheckContent),mountPoint:i})),v=o.provide(d({name:"EntitySoundcheckCard",component:{lazy:()=>import("./components/EntitySoundcheckCard/index.esm.js").then(e=>e.EntitySoundcheckCard)}})),g=o.provide(t({name:"GroupSoundcheckContent",component:()=>import("./components/OverviewPage/index.esm.js").then(e=>e.FixedGroupOverviewPage),mountPoint:f})),P=o.provide(t({name:"SoundcheckOverviewPage",component:()=>import("./components/OverviewPage/index.esm.js").then(e=>e.OverviewPage),mountPoint:c})),S=o.provide(t({name:"SoundcheckRoutingPage",component:()=>import("./components/RoutingPage/index.esm.js").then(e=>e.RoutingPage),mountPoint:c}));export{v as EntitySoundcheckCard,y as EntitySoundcheckContent,g as GroupSoundcheckContent,P as SoundcheckOverviewPage,S as SoundcheckRoutingPage,o as soundcheckPlugin};
2
2
  //# sourceMappingURL=plugin.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.22.0",
4
+ "version": "0.22.1",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "homepage": "https://backstage.spotify.com",
7
7
  "main": "./dist/index.esm.js",
@@ -85,7 +85,7 @@
85
85
  "@nivo/treemap": "^0.99.0",
86
86
  "@remixicon/react": "^4.6.0",
87
87
  "@spotify/backstage-plugin-core": "^0.8.15",
88
- "@spotify/backstage-plugin-soundcheck-common": "^0.21.0",
88
+ "@spotify/backstage-plugin-soundcheck-common": "^0.21.1",
89
89
  "@tanstack/react-query": "^4.6.1",
90
90
  "@uiw/react-md-editor": "3.20.10",
91
91
  "classnames": "^2.3.2",