@spotify/backstage-plugin-soundcheck 0.14.3 → 0.14.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/dist/components/CampaignInsightsPage/CampaignInsightsPage.esm.js +1 -1
- package/dist/components/CampaignInsightsPage/CampaignStatusHistoryTile.esm.js +1 -1
- package/dist/components/CampaignInsightsPage/CampaignStatusTile.esm.js +1 -1
- package/dist/components/CheckCard/CheckCard.esm.js +1 -1
- package/dist/components/CheckPage/CheckInsightsPage.esm.js +1 -1
- package/dist/components/LevelCard/LevelCard.esm.js +1 -1
- package/dist/components/TrackPage/FilterBar/util.esm.js +2 -0
- package/dist/components/TrackPage/TrackPage.esm.js +1 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# @spotify/backstage-plugin-soundcheck
|
|
2
2
|
|
|
3
|
+
## 0.14.4
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Resolved issue with combining multiple catalog filters.
|
|
8
|
+
- Campaign Insight tiles now respect the user's filters.
|
|
9
|
+
- Updated dependencies
|
|
10
|
+
- @spotify/backstage-plugin-soundcheck-common@0.14.4
|
|
11
|
+
|
|
3
12
|
## 0.14.3
|
|
4
13
|
|
|
5
14
|
### Patch Changes
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{MarkdownContent as
|
|
1
|
+
import{MarkdownContent as z,Content as F}from"@backstage/core-components";import{useRouteRef as G}from"@backstage/core-plugin-api";import{EntityRefLink as O}from"@backstage/plugin-catalog-react";import{usePermission as w}from"@backstage/plugin-permission-react";import{makeStyles as H,Button as U,Paper as V,Grid as i,Typography as N,Box as W}from"@material-ui/core";import{soundcheckCampaignReadPermission as $,soundcheckCampaignUpdatePermission as j}from"@spotify/backstage-plugin-soundcheck-common";import{DateTime as R}from"luxon";import t,{useMemo as l}from"react";import{useParams as q,useNavigate as A}from"react-router-dom";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import{useGetCampaigns as J}from"../../hooks/campaigns/useGetCampaigns.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useSearchParam as p}from"../../hooks/useSearchParam.esm.js";import{campaignEditRouteRef as K}from"../../routes.esm.js";import{CheckCard as Q}from"../CheckCard/CheckCard.esm.js";import{LoadingIndicator as X}from"../LoadingIndicator/LoadingIndicator.esm.js";import{PageWarningMessage as Y}from"../PageWarningMessage/PageWarningMessage.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as Z}from"../SoundcheckHeader/useHeader.esm.js";import{FilterBar as _}from"../TrackPage/FilterBar/FilterBar.esm.js";import{toFilter as ee}from"../TrackPage/FilterBar/util.esm.js";import{TrackEntitiesTable as te}from"../TrackPage/TrackEntitiesTable/TrackEntitiesTable.esm.js";import{CampaignStatusHistoryTile as ae}from"./CampaignStatusHistoryTile.esm.js";import{CampaignStatusTile as re}from"./CampaignStatusTile.esm.js";import{DaysRemainingTile as ne}from"./DaysRemainingTile.esm.js";const ie=H(e=>({root:{height:"100%",background:e.palette.background.default},header:{backgroundColor:e.palette.background.paper,borderRadius:0,marginBottom:e.spacing(2),paddingLeft:e.spacing(1),borderLeft:"none",borderRight:"none"},progressContainer:{display:"flex",marginBottom:e.spacing(3)},trackContainerContent:{paddingTop:e.spacing(1),paddingBottom:e.spacing(1),backgroundColor:e.palette.background.paper},editButton:{marginLeft:"auto"},checksContainer:{},entitiesContainer:{marginTop:e.spacing(3)},headerDescription:{fontSize:e.typography.body2.fontSize,margin:e.spacing(.5,0,0),"& p":{margin:0},"& a":{color:"inherit",textDecoration:"underline"}},content:{paddingTop:0},ownerLink:{"& span":{color:"inherit","&:hover":{textDecoration:"underline"}}},sectionTitle:{paddingBottom:e.spacing(1)}})),oe=()=>{const e=ie(),[o,b]=p("owners"),[s,T]=p("lifecycles"),[m,v]=p("types"),[c,x]=p("systems"),d=l(()=>ee({lifecycles:s,owners:o,types:m,systems:c}),[s,o,m,c]),{campaignId:n}=q(),{data:B,isLoading:g}=J({ids:[n],first:1}),r=B?.edges?.[0]?.node,a=r?.track,f=a?.levels?.[0],{loading:L,allowed:S}=w({permission:$,resourceRef:n}),{loading:u,allowed:y}=w({permission:j,resourceRef:n}),E=r?R.fromISO(r.startDate):void 0,D=E?Math.max(Math.ceil(R.now().diff(E,"days").days),1):void 0,h=A(),k=G(K),P=l(()=>a?.ownerEntityRef?t.createElement(O,{color:"inherit",entityRef:a.ownerEntityRef,className:e.ownerLink}):null,[a?.ownerEntityRef,e.ownerLink]),I=l(()=>!u&&y&&a?.isEditable?t.createElement(U,{className:e.editButton,variant:"contained",color:"primary",onClick:()=>{h(k({campaignId:n}))}},"Edit Campaign"):null,[y,e.editButton,k,u,h,a,n]),M=l(()=>a?.description?t.createElement(z,{className:e.headerDescription,content:a.description}):null,[e.headerDescription,a?.description]);return Z({title:a?.name,description:M,customSubtitle:P,sectionRight:I}),t.createElement("div",null,t.createElement(Y,{entityName:"track",entityId:n,showNotFound:!g&&!r,showCannotView:!L&&!S}),g&&t.createElement(X,null),a&&t.createElement("div",{className:e.root},t.createElement(V,{elevation:1,className:e.header},t.createElement(_,{track:a,owners:o,setOwners:b,lifecycles:s,setLifecycles:T,types:m,setTypes:v,systems:c,setSystems:x})),t.createElement(F,{className:e.content},t.createElement("div",{className:e.progressContainer},t.createElement(i,{container:!0,spacing:2},t.createElement(i,{item:!0,xs:2},t.createElement(ne,{campaign:r})),t.createElement(i,{item:!0,xs:4},t.createElement(re,{campaign:r,filter:d})),t.createElement(i,{item:!0,xs:6},t.createElement(ae,{campaign:r,filter:d})))),t.createElement("div",{className:e.checksContainer},t.createElement(N,{variant:"h3",className:e.sectionTitle},"Checks"),f&&t.createElement(W,{className:e.content},t.createElement(i,{container:!0,spacing:1},f.checks.map(C=>t.createElement(i,{item:!0,xs:12,sm:6,md:4,key:C.id},t.createElement(Q,{track:a,check:C,filter:d,numberOfDays:D}))))),a&&t.createElement("div",{className:e.entitiesContainer},t.createElement(N,{variant:"h3",className:e.sectionTitle},"Entities"),t.createElement(te,{track:a,initialPageSize:10,lifecycles:s,owners:o,types:m,systems:c}))))))};export{oe as CampaignInsightsPage};
|
|
2
2
|
//# sourceMappingURL=CampaignInsightsPage.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{useTheme as
|
|
1
|
+
import{useTheme as l,Paper as f,Box as u}from"@material-ui/core";import{makeStyles as h}from"@material-ui/core/styles";import{DateTime as m}from"luxon";import i,{useMemo as y}from"react";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useCertificationStatusHistory as g}from"../../hooks/aggregations/useCertificationStatusHistory.esm.js";import"react-router-dom";import{AreaChart as x}from"../AreaChart/AreaChart.esm.js";const S=h(t=>({card:{display:"flex",flexDirection:"column",border:`1px solid ${t.palette.divider}`,height:"100%",width:"100%"},title:{fontWeight:"bold",fontSize:"1.1rem",lineHeight:`${t.typography.h5.fontSize}px`,cursor:"default"},content:{padding:t.spacing(1,2,1,0),width:"100%",height:"100%"}}));function H({campaign:t,filter:n}){const p=l(),a=S(),c=m.fromISO(t.startDate),d=Math.max(Math.ceil(m.now().diff(c,"days").days),1),{data:e}=g({trackId:t.track.id,filter:n,numberOfDays:d},!!t),r=e?.certificationStatusHistory.numberOfEntities,o=y(()=>e?.certificationStatusHistory.history.map(s=>({date:s.date,Passed:s.statusByLevel[0].passed/r*100})),[r,e]);return i.createElement(f,{className:a.card},i.createElement(u,{className:a.content},o&&i.createElement(x,{data:o,categories:["Passed"],categoryColors:{Passed:p.palette.success.main},index:"date",minValue:0,maxValue:100,showLegend:!1})))}export{H as CampaignStatusHistoryTile};
|
|
2
2
|
//# sourceMappingURL=CampaignStatusHistoryTile.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{useTheme as
|
|
1
|
+
import{useTheme as F,Paper as S,Box as c,Grid as x,Typography as f}from"@material-ui/core";import{makeStyles as C}from"@material-ui/core/styles";import T from"@material-ui/icons/TrendingDown";import k from"@material-ui/icons/TrendingFlat";import B from"@material-ui/icons/TrendingUp";import{DateTime as v}from"luxon";import t,{useMemo as D}from"react";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useCertificationStatus as I}from"../../hooks/aggregations/useCertificationStatus.esm.js";import{useCertificationStatusHistory as N}from"../../hooks/aggregations/useCertificationStatusHistory.esm.js";import"react-router-dom";import{CategoryBar as R}from"../CategoryBar/CategoryBar.esm.js";const E=C(e=>({card:{display:"flex",flexDirection:"column",border:`1px solid ${e.palette.divider}`},content:{padding:e.spacing(1),display:"flex",margin:e.spacing(1),gap:e.spacing(1)},item:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:e.spacing(.5)},legendDash:{width:e.spacing(2),height:e.spacing(1),borderRadius:e.spacing(.375),marginRight:e.spacing(1)},category:{display:"flex",alignItems:"center",flex:1,marginRight:e.spacing(2)}}));function y({label:e,value:n,total:r,color:p,valueFormatter:s}){const a=E();return t.createElement(x,{item:!0,xs:12,className:a.item},t.createElement(c,{className:a.category},t.createElement("span",{className:a.legendDash,style:{backgroundColor:p}}),t.createElement(f,null,e)),r&&t.createElement(f,null,s(n)," of ",s(r)," (",Math.round(n/r*100),"%)"))}function $({campaign:e,filter:n}){const r=F(),p=E(),{data:s}=I({trackId:e.track.id,filter:n},!0),a=s?.certificationStatus.statusByLevel[0],h=Math.max(Math.ceil(v.now().diff(v.fromISO(e.startDate),"days").days),1),{data:g}=N({trackId:e.track.id,filter:n,numberOfDays:h},!!e),o=s?.certificationStatus.numberOfEntities??0,m=D(()=>{if(o===void 0||g===void 0||a===void 0)return;const i=g.certificationStatusHistory.history[0].statusByLevel[0].passed/o*100;return a.passed/o*100-i},[g,a,o]),d=i=>i>=1e6?`${(i/1e6).toFixed(1)}M`:i>=1e3?`${(i/1e3).toFixed(1)}K`:i.toString();let u=k,l;return m!==void 0&&(l=`${m.toFixed(0)}% since campaign start`,m<=-1?(u=T,l=`-${l}`):m>=1&&(u=B,l=`+${l}`)),t.createElement(S,{className:p.card},t.createElement(c,{className:p.content},a&&t.createElement(c,{width:"100%"},t.createElement(R,{data:a,valueFormatter:d,categories:["passed","failed","notReported"],categoryFormatter:i=>i.replace(/\b\w/g,b=>b.toUpperCase()),colors:[r.palette.success.main,r.palette.error.main,r.palette.text.disabled]}),t.createElement(c,{paddingTop:"12px"},t.createElement(x,{spacing:2},t.createElement(y,{label:"Passing",value:a.passed,total:o,color:r.palette.success.main,valueFormatter:d}),t.createElement(y,{label:"Failing",value:a.failed,total:o,color:r.palette.error.main,valueFormatter:d}),t.createElement(y,{label:"Not Reported",value:a.notReported,total:o,color:r.palette.text.disabled,valueFormatter:d}),m!==void 0&&t.createElement(c,{display:"flex",alignItems:"center",paddingTop:"12px"},t.createElement(u,null),t.createElement(f,{style:{marginLeft:r.spacing(1)}},l)))))))}export{$ as CampaignStatusTile};
|
|
2
2
|
//# sourceMappingURL=CampaignStatusTile.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{makeStyles as
|
|
1
|
+
import{makeStyles as b,useTheme as D,Box as r,Paper as R,Typography as $,Tooltip as B}from"@material-ui/core";import x from"@material-ui/lab/Skeleton";import{DateTime as I}from"luxon";import t from"react";import{CircularProgressbar as O,buildStyles as P}from"react-circular-progressbar";import{useCheckStatus as T}from"../../hooks/aggregations/useCheckStatus.esm.js";import{useCheckStatusHistory as W}from"../../hooks/aggregations/useCheckStatusHistory.esm.js";import{getChartFontColor as y,formatDate as M}from"../Charts/chartUtils.esm.js";import{getApplicableCheckCount as p}from"../TrackPage/TrackEntitiesTable/utils.esm.js";import{getProgressColor as C}from"../TrackPage/utils.esm.js";import{CheckHistoryChart as j}from"./CheckHistoryChart.esm.js";import{getCheckName as z}from"./utils.esm.js";const S=b(e=>({card:{display:"flex",flexDirection:"column",border:`1px solid ${e.palette.divider}`,width:"99%"},title:{fontWeight:"bold",fontSize:"0.9rem",cursor:"default",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},headerRow:{display:"flex",padding:e.spacing(1,1),borderBottom:`1px solid ${e.palette.divider}`,width:"100%"},headerSection:{display:"flex",flexDirection:"column",gap:e.spacing(.5),flexGrow:1,width:"100%"},contentRow:{padding:e.spacing(1,1,0),display:"flex"},leftSection:{width:"75px",minWidth:"75px"},summaryCard:{height:"100%",display:"flex",flexDirection:"column",justifyContent:"space-between"},chartSection:{flex:1,width:"100%",minWidth:"150px"},chartSkeletonSection:{flex:1,width:"100%",minWidth:"150px",padding:e.spacing(0,0,1,1)},overallSummaryBox:{display:"flex",flexDirection:"column",height:"100%",color:y(e),textAlign:"center",gap:e.spacing(2)}})),A=()=>{const e=S();return t.createElement(r,{className:e.contentRow},t.createElement(r,{className:e.leftSection},t.createElement(r,{className:e.summaryCard},t.createElement(x,{variant:"circle",height:75}))),t.createElement(r,{className:e.chartSkeletonSection},t.createElement(x,{variant:"rect",height:92})))};function H(e){if(!e)return[];const{history:o}=e,i=I.utc();return o.map((l,a)=>{const n=p(l);return{name:M(i,o.length-a-1),passRate:n?Math.round(l.passed/n*100):100}})}function L(e){if(!e)return 0;const{passed:o}=e,i=p(e);return i?Math.round(o/i*100):100}function F(e){if(!e)return{numerator:0,denominator:0};const{passed:o}=e,i=p(e);return{numerator:o,denominator:i}}const G=({check:e,track:o,filter:i,numberOfDays:l=30})=>{const a=S(),n=D(),{data:c,isLoading:E}=T({checkId:e.id,trackId:o.id,filter:i}),{data:f,isLoading:w}=W({checkId:e.id,trackId:o.id,numberOfDays:l,filter:i}),N={dataKey:"passRate",name:"Pass rate"},k=f?.history?.length??0,v=H(f),s=L(c);let d;c?d=`${s}%`:d="No Data";let m;if(!c)m="No Data";else{const{numerator:u,denominator:g}=F(c);g>0?m=`${u} of ${g} entities passing`:m=`${u} entities passing`}const h=t.createElement(r,{className:a.overallSummaryBox},t.createElement(O,{value:s,text:d,styles:P({textColor:y(n),pathColor:C(n,s),trailColor:n.palette.divider,textSize:k?void 0:10})}));return t.createElement(R,{className:a.card,elevation:0},t.createElement(r,{className:a.headerRow},t.createElement(r,{className:a.headerSection},t.createElement($,{className:a.title},z(o,e)))),w||E?t.createElement(A,null):t.createElement(B,{title:m},t.createElement(r,{className:a.contentRow},h&&t.createElement(r,{className:a.leftSection},t.createElement(r,{className:a.summaryCard},h)),t.createElement(r,{className:a.chartSection},t.createElement(j,{data:v,lineConfig:N,color:C(n,s)})))))};export{G as CheckCard};
|
|
2
2
|
//# sourceMappingURL=CheckCard.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{MarkdownContent as j,Content as x}from"@backstage/core-components";import{useRouteRef as q}from"@backstage/core-plugin-api";import{EntityRefLink as J}from"@backstage/plugin-catalog-react";import{usePermission as L}from"@backstage/plugin-permission-react";import{makeStyles as K,useTheme as X,Button as Y,Paper as Z,Grid as y,Card as E,CardHeader as k,CardContent as C}from"@material-ui/core";import{soundcheckCheckReadPermission as _,soundcheckCheckUpdatePermission as $,toEntityFilterQuery as w,combineEntityFilterQueries as ee}from"@spotify/backstage-plugin-soundcheck-common";import e,{useMemo as S}from"react";import{useParams as te,useNavigate as re}from"react-router-dom";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import{useGetChecks as ie}from"../../hooks/checks/useGetChecks.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import{useGetAllTracks as ne}from"../../hooks/tracks/useGetAllTracks.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useCheckStatus as oe}from"../../hooks/aggregations/useCheckStatus.esm.js";import{useSearchParam as l}from"../../hooks/useSearchParam.esm.js";import{checkEditRouteRef as ae}from"../../routes.esm.js";import{LoadingIndicator as se}from"../LoadingIndicator/LoadingIndicator.esm.js";import{PageWarningMessage as P}from"../PageWarningMessage/PageWarningMessage.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as ce}from"../SoundcheckHeader/useHeader.esm.js";import{CheckEntitiesTable as le}from"./CheckEntitiesTable/CheckEntitiesTable.esm.js";import{CheckStatusBar as me}from"./CheckStatusBar.esm.js";import{CheckStatusHistoryChart as de}from"./CheckStatusHistoryChart.esm.js";import{CheckStatusTable as pe}from"./CheckStatusTable.esm.js";import{FilterBar as fe}from"./FilterBar/FilterBar.esm.js";const ue=t=>{const{lifecycles:n,owners:r,types:o,systems:m}=t,a=n?.length?{"spec.lifecycle":n}:void 0,d=r?.length?{"relations.ownedBy":r}:void 0,s=o?.length?{"spec.type":o}:void 0,p=m?.length?{"relations.partOf":m}:void 0;if(a||d||s||p)return{...a,...d,...s,...p}};function he(t,n){for(const r of t.levels)for(const o of r.checks)if(o.id===n)return o;return null}const ge=K(t=>({root:{height:"100%",background:t.palette.background.default},header:{backgroundColor:t.palette.background.paper,borderRadius:0,marginBottom:t.spacing(2)},content:{display:"flex",flexDirection:"column",gap:t.spacing(2),paddingTop:t.spacing(0)},editButton:{marginLeft:"auto"},filterBar:{paddingTop:t.spacing(1),paddingBottom:t.spacing(1)},headerDescription:{fontSize:t.typography.body2.fontSize,margin:t.spacing(.5,0,0),"& p":{margin:0},"& a":{color:"inherit",textDecoration:"underline"}},ownerLink:{"& span":{color:"inherit","&:hover":{textDecoration:"underline"}}}})),ye=()=>{const t=ge(),{trackId:n,checkId:r}=te(),[o,m]=l("states"),[a,d]=l("owners"),[s,p]=l("lifecycles"),[v,T]=l("types"),[I,D]=l("systems"),f=ue({lifecycles:s,owners:a,types:v,systems:I}),{data:F,isLoading:H}=ne({ids:[n??""],first:1},{enabled:!!n}),c=F?.edges?.[0]?.node,{data:G,isLoading:u}=ie({ids:[r??""],first:1}),i=G?.edges?.[0]?.node,{loading:M,allowed:z}=L({permission:_,resourceRef:r}),{loading:b,allowed:R}=L({permission:$,resourceRef:r}),B=re(),N=q(ae),O=X();let h;if(r)if(c){const V=w(c.filter),W=w(he(c,r)?.filter);h=ee(V,W
|
|
1
|
+
import{MarkdownContent as j,Content as x}from"@backstage/core-components";import{useRouteRef as q}from"@backstage/core-plugin-api";import{EntityRefLink as J}from"@backstage/plugin-catalog-react";import{usePermission as L}from"@backstage/plugin-permission-react";import{makeStyles as K,useTheme as X,Button as Y,Paper as Z,Grid as y,Card as E,CardHeader as k,CardContent as C}from"@material-ui/core";import{soundcheckCheckReadPermission as _,soundcheckCheckUpdatePermission as $,toEntityFilterQuery as w,combineEntityFilterQueries as ee}from"@spotify/backstage-plugin-soundcheck-common";import e,{useMemo as S}from"react";import{useParams as te,useNavigate as re}from"react-router-dom";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import{useGetChecks as ie}from"../../hooks/checks/useGetChecks.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import{useGetAllTracks as ne}from"../../hooks/tracks/useGetAllTracks.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useCheckStatus as oe}from"../../hooks/aggregations/useCheckStatus.esm.js";import{useSearchParam as l}from"../../hooks/useSearchParam.esm.js";import{checkEditRouteRef as ae}from"../../routes.esm.js";import{LoadingIndicator as se}from"../LoadingIndicator/LoadingIndicator.esm.js";import{PageWarningMessage as P}from"../PageWarningMessage/PageWarningMessage.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as ce}from"../SoundcheckHeader/useHeader.esm.js";import{CheckEntitiesTable as le}from"./CheckEntitiesTable/CheckEntitiesTable.esm.js";import{CheckStatusBar as me}from"./CheckStatusBar.esm.js";import{CheckStatusHistoryChart as de}from"./CheckStatusHistoryChart.esm.js";import{CheckStatusTable as pe}from"./CheckStatusTable.esm.js";import{FilterBar as fe}from"./FilterBar/FilterBar.esm.js";const ue=t=>{const{lifecycles:n,owners:r,types:o,systems:m}=t,a=n?.length?{"spec.lifecycle":n}:void 0,d=r?.length?{"relations.ownedBy":r}:void 0,s=o?.length?{"spec.type":o}:void 0,p=m?.length?{"relations.partOf":m}:void 0;if(a||d||s||p)return{...a,...d,...s,...p}};function he(t,n){for(const r of t.levels)for(const o of r.checks)if(o.id===n)return o;return null}const ge=K(t=>({root:{height:"100%",background:t.palette.background.default},header:{backgroundColor:t.palette.background.paper,borderRadius:0,marginBottom:t.spacing(2)},content:{display:"flex",flexDirection:"column",gap:t.spacing(2),paddingTop:t.spacing(0)},editButton:{marginLeft:"auto"},filterBar:{paddingTop:t.spacing(1),paddingBottom:t.spacing(1)},headerDescription:{fontSize:t.typography.body2.fontSize,margin:t.spacing(.5,0,0),"& p":{margin:0},"& a":{color:"inherit",textDecoration:"underline"}},ownerLink:{"& span":{color:"inherit","&:hover":{textDecoration:"underline"}}}})),ye=()=>{const t=ge(),{trackId:n,checkId:r}=te(),[o,m]=l("states"),[a,d]=l("owners"),[s,p]=l("lifecycles"),[v,T]=l("types"),[I,D]=l("systems"),f=ue({lifecycles:s,owners:a,types:v,systems:I}),{data:F,isLoading:H}=ne({ids:[n??""],first:1},{enabled:!!n}),c=F?.edges?.[0]?.node,{data:G,isLoading:u}=ie({ids:[r??""],first:1}),i=G?.edges?.[0]?.node,{loading:M,allowed:z}=L({permission:_,resourceRef:r}),{loading:b,allowed:R}=L({permission:$,resourceRef:r}),B=re(),N=q(ae),O=X();let h;if(r)if(c){const V=w(c.filter),W=w(he(c,r)?.filter);h=ee(V,W)}else i&&(h=w(i.filter));const{data:g}=oe({checkId:r,trackId:n,filter:f,states:o?.length?o:void 0},!!r),Q=S(()=>i?.ownerEntityRef?e.createElement(J,{color:"inherit",entityRef:i.ownerEntityRef,className:t.ownerLink}):null,[i?.ownerEntityRef,t.ownerLink]),A=S(()=>!b&&R&&i?.isEditable?e.createElement(Y,{className:t.editButton,variant:"contained",color:"primary",onClick:()=>{B(N({checkId:i.id}))}},"Edit Check"):null,[R,i?.id,i?.isEditable,t.editButton,N,b,B]),U=S(()=>i?.description?e.createElement(j,{className:t.headerDescription,content:i.description}):null,[t.headerDescription,i?.description]);return ce({title:i?.name??r??"Soundcheck",description:U,customSubtitle:Q,sectionRight:A}),e.createElement("div",null,e.createElement(P,{entityName:"track",entityId:n,showNotFound:!!n&&!H&&!c}),e.createElement(P,{entityName:"check",entityId:r,showNotFound:!u&&!i,showCannotView:i&&!M&&!z}),u&&e.createElement(se,null),!u&&!!i&&e.createElement("div",{className:t.root},e.createElement(Z,{elevation:3,className:t.header},e.createElement(x,{className:t.filterBar},e.createElement(fe,{filter:h,states:o,setStates:m,owners:a,setOwners:d,lifecycles:s,setLifecycles:p,types:v,setTypes:T,systems:I,setSystems:D}))),e.createElement(x,{className:t.content},e.createElement(y,{container:!0,spacing:2},e.createElement(y,{item:!0,xs:4},e.createElement(E,{style:{height:"100%"}},e.createElement(k,{title:"Current Status"}),e.createElement(C,null,e.createElement("div",{style:{width:"100%",height:30,display:"flex",alignItems:"flex-start"}},e.createElement(me,{checkStatus:g})),e.createElement("div",{style:{paddingTop:O.spacing(1)}},e.createElement(pe,{checkStatus:g}))))),e.createElement(y,{item:!0,xs:8},e.createElement(E,{style:{height:"100%"}},e.createElement(k,{title:"Historical Status"}),e.createElement(C,{style:{height:"90%",paddingBottom:0}},e.createElement(de,{checkId:r,trackId:n,checkStatus:g,filter:f,states:o}))))),e.createElement(E,null,e.createElement(k,{title:"Entities"}),e.createElement(C,null,e.createElement(le,{checkId:r,trackId:c?.id,filter:f,states:o}))))))};export{ye as CheckInsightsPage};
|
|
2
2
|
//# sourceMappingURL=CheckInsightsPage.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{LinearGauge as
|
|
1
|
+
import{LinearGauge as v}from"@backstage/core-components";import{useTheme as h,Paper as E,Grid as c,Typography as d,Box as y}from"@material-ui/core";import{makeStyles as C}from"@material-ui/core/styles";import a from"react";import{LevelBadge as N}from"../Badges/LevelBadge.esm.js";import"../Badges/NoLevelBadge.esm.js";import"../Badges/CampaignBadge.esm.js";import{generateBadge as S}from"../Badges/badge.esm.js";import{getChartColors as b}from"../Charts/chartUtils.esm.js";import{CheckCard as L}from"../CheckCard/CheckCard.esm.js";import{LevelTooltip as x}from"./LevelTooltip.esm.js";const p=(e,i)=>{if(!e?.certificationStatus?.numberOfEntities||i===void 0)return;const o=e.certificationStatus.statusByLevel.findIndex(t=>t.ordinal===i);if(o===-1)return;const n=e.certificationStatus.numberOfEntities,r=[];for(const t of e.certificationStatus.statusByLevel){const s=t.cumulativelyPassed;r.push(n?Math.round(s/n*100):100)}return r[o]},u=(e,i)=>{if(!e?.certificationStatus?.numberOfEntities||i===void 0)return;const o=e.certificationStatus.statusByLevel.findIndex(r=>r.ordinal===i);if(o===-1)return 0;const n=[];for(const r of e.certificationStatus.statusByLevel){const t=r.cumulativelyPassed;n.push(t)}for(let r=n.length-2;r>=0;r--)n[r]=Math.min(n[r]+n[r+1],100);return n[o]},B=C(e=>({card:{border:`1px solid ${e.palette.divider}`},title:{fontWeight:"bold",fontSize:"1.1rem",cursor:"default"},header:{borderBottom:`1px solid ${e.palette.divider}`,width:"100%",padding:e.spacing(1,2),margin:0},levelNameContainer:{gridGap:e.spacing(1),width:"fit-content",padding:0},passRate:{fontWeight:"bold",fontSize:e.typography.overline.fontSize,cursor:"default"},gaugeContainer:{width:200,paddingLeft:e.spacing(.75),paddingRight:e.spacing(.75),paddingTop:2},content:{padding:e.spacing(2.5,2),display:"flex",gap:e.spacing(2)},description:{padding:0},gridItem:{padding:0}})),I=({track:e,level:i,index:o,data:n,filter:r})=>{const t=B(),s=b(h()),l=p(n,i.ordinal),f=u(n,i.ordinal),g=l!==void 0?`${l}%`:"";return a.createElement(E,{elevation:1,className:t.card},a.createElement(c,{container:!0,alignItems:"center",justifyContent:"space-between",direction:"row",className:t.header},a.createElement(c,{item:!0,container:!0,alignItems:"center",direction:"row",className:t.levelNameContainer},a.createElement(N,{badge:i.badge??S(i.ordinal,e)}),a.createElement(x,{level:i,numerator:f??0,denominator:n?.certificationStatus?.numberOfEntities??0},a.createElement(d,{className:t.title},i.name??`Level ${i.ordinal}`))),a.createElement(c,{item:!0,className:t.gridItem},a.createElement(c,{container:!0,item:!0,className:t.gridItem},a.createElement(d,{variant:"overline",className:t.passRate},g),a.createElement("div",{className:t.gaugeContainer},a.createElement(v,{value:(l??0)/100,getColor:m=>s[o]}))))),a.createElement(y,{className:t.content},a.createElement(c,{container:!0,spacing:1},i.checks.map(m=>a.createElement(c,{item:!0,xs:12,sm:6,md:4,className:t.gridItem,key:m.id},a.createElement(L,{track:e,check:m,filter:r}))))))};export{I as LevelCard,p as calculateCumulativePassRate,u as calculateCumulativePassRateNumerator};
|
|
2
2
|
//# sourceMappingURL=LevelCard.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const p=r=>{const{lifecycles:e,owners:t,types:s,systems:l}=r,n=e?.length?{"spec.lifecycle":e}:void 0,o=t?.length?{"relations.ownedBy":t}:void 0,i=s?.length?{"spec.type":s}:void 0,c=l?.length?{"relations.partOf":l}:void 0;if(n||o||i||c)return{...n,...o,...i,...c}};export{p as toFilter};
|
|
2
|
+
//# sourceMappingURL=util.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{MarkdownContent as
|
|
1
|
+
import{MarkdownContent as V,Content as b}from"@backstage/core-components";import{useRouteRef as W}from"@backstage/core-plugin-api";import{EntityRefLink as $}from"@backstage/plugin-catalog-react";import{usePermission as w}from"@backstage/plugin-permission-react";import{makeStyles as j,Button as q,Paper as J,Tabs as K,Tab as L}from"@material-ui/core";import{soundcheckTrackReadPermission as Q,soundcheckTrackUpdatePermission as X}from"@spotify/backstage-plugin-soundcheck-common";import t,{useState as Y,useMemo as d}from"react";import{useParams as Z,useNavigate as _}from"react-router-dom";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import{useGetAllTracks as ee}from"../../hooks/tracks/useGetAllTracks.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useCertificationStatus as te}from"../../hooks/aggregations/useCertificationStatus.esm.js";import{useCertificationStatusHistory as re}from"../../hooks/aggregations/useCertificationStatusHistory.esm.js";import{useSearchParam as p}from"../../hooks/useSearchParam.esm.js";import{trackEditRouteRef as ae}from"../../routes.esm.js";import{LevelCard as ie}from"../LevelCard/LevelCard.esm.js";import{LoadingIndicator as ne}from"../LoadingIndicator/LoadingIndicator.esm.js";import{PageWarningMessage as oe}from"../PageWarningMessage/PageWarningMessage.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as se}from"../SoundcheckHeader/useHeader.esm.js";import{FilterBar as ce}from"./FilterBar/FilterBar.esm.js";import{toFilter as me}from"./FilterBar/util.esm.js";import{TrackEntitiesTable as le}from"./TrackEntitiesTable/TrackEntitiesTable.esm.js";import{TrackProgressCard as de}from"./TrackProgressCard.esm.js";const pe=j(e=>({root:{height:"100%",background:e.palette.background.default},header:{backgroundColor:e.palette.background.paper,borderRadius:0,marginBottom:e.spacing(2)},trackProgressContainer:{marginBottom:e.spacing(3)},trackContainerContent:{paddingTop:e.spacing(1),paddingBottom:e.spacing(1),backgroundColor:e.palette.background.paper},levelCard:{margin:e.spacing(1,0,2)},editButton:{marginLeft:"auto"},tabsContainer:{margin:e.spacing(3,0)},trackEntitiesContainer:{marginTop:e.spacing(1)},headerDescription:{fontSize:e.typography.body2.fontSize,margin:e.spacing(.5,0,0),"& p":{margin:0},"& a":{color:"inherit",textDecoration:"underline"}},content:{paddingTop:0},ownerLink:{"& span":{color:"inherit","&:hover":{textDecoration:"underline"}}}}));function N({children:e,value:i,index:n}){return t.createElement("div",{hidden:i!==n},i===n&&e)}const ue=()=>{const e=pe(),[i,n]=Y(0),[o,T]=p("owners"),[s,R]=p("lifecycles"),[c,P]=p("types"),[m,S]=p("systems"),B=(f,g)=>{n(g)},{trackId:a}=Z(),u=d(()=>me({lifecycles:s,owners:o,types:c,systems:m}),[s,o,c,m]),{data:x,isLoading:l,isError:D}=ee({ids:[a??""],first:1}),r=x?.edges?.[0]?.node,{data:k,isLoading:E,isError:I}=te({trackId:a,filter:u},!!a),{data:F,isLoading:M,isError:z}=re({trackId:a,filter:u,numberOfDays:30},!!a),{loading:H,allowed:O}=w({permission:Q,resourceRef:a}),{loading:y,allowed:C}=w({permission:X,resourceRef:a}),h=_(),v=W(ae),A=d(()=>r?.ownerEntityRef?t.createElement($,{color:"inherit",entityRef:r.ownerEntityRef,className:e.ownerLink}):null,[r?.ownerEntityRef,e.ownerLink]),G=d(()=>!y&&C&&r?.isEditable?t.createElement(q,{className:e.editButton,variant:"contained",color:"primary",onClick:()=>{h(v({trackId:r.id}))}},"Edit Track"):null,[C,e.editButton,v,y,h,r]),U=d(()=>r?.description?t.createElement(V,{className:e.headerDescription,content:r.description}):null,[e.headerDescription,r?.description]);return se({title:r?.name,description:U,customSubtitle:A,sectionRight:G}),t.createElement("div",null,t.createElement(oe,{entityName:"track",entityId:a,showNotFound:!l&&!r,showCannotView:!H&&!O}),l&&t.createElement(ne,null),r&&t.createElement("div",{className:e.root},t.createElement(J,{elevation:1,className:e.header},t.createElement(b,{className:e.trackContainerContent},t.createElement(ce,{track:r,owners:o,setOwners:T,lifecycles:s,setLifecycles:R,types:c,setTypes:P,systems:m,setSystems:S}))),t.createElement(b,{className:e.content},t.createElement("div",{className:e.trackProgressContainer},t.createElement(de,{track:r,status:k,history:F,isLoading:l||E||M,isError:D||I||z})),t.createElement("div",{className:e.tabsContainer},t.createElement(K,{value:i,onChange:B},t.createElement(L,{label:"Levels"}),t.createElement(L,{label:"Entities"})),t.createElement(N,{value:i,index:0},r&&r.levels?.map((f,g)=>t.createElement("div",{className:e.levelCard,key:f.ordinal},t.createElement(ie,{track:r,filter:u,level:f,index:g,data:k,isLoading:l||E})))),t.createElement(N,{value:i,index:1},r&&t.createElement("div",{className:e.trackEntitiesContainer},t.createElement(le,{track:r,lifecycles:s,owners:o,types:c,systems:m})))))))};export{ue as TrackPage};
|
|
2
2
|
//# sourceMappingURL=TrackPage.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.14.
|
|
4
|
+
"version": "0.14.4",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
6
6
|
"homepage": "https://backstage.spotify.com",
|
|
7
7
|
"main": "./dist/index.esm.js",
|
|
@@ -73,7 +73,7 @@
|
|
|
73
73
|
"@material-ui/pickers": "3.3.11",
|
|
74
74
|
"@mui/styles": "^5.14.7",
|
|
75
75
|
"@spotify/backstage-plugin-core": "^0.8.3",
|
|
76
|
-
"@spotify/backstage-plugin-soundcheck-common": "^0.14.
|
|
76
|
+
"@spotify/backstage-plugin-soundcheck-common": "^0.14.4",
|
|
77
77
|
"@tanstack/react-query": "^4.6.1",
|
|
78
78
|
"@types/react-csv": "^1.1.6",
|
|
79
79
|
"@uiw/react-md-editor": "3.20.10",
|
|
@@ -120,7 +120,7 @@
|
|
|
120
120
|
"@playwright/test": "^1.32.3",
|
|
121
121
|
"@sp4b-dev/test-utils": "^0.0.9",
|
|
122
122
|
"@spotify/backstage-plugin-core-common": "^0.6.3",
|
|
123
|
-
"@spotify/backstage-plugin-soundcheck-node": "^0.8.
|
|
123
|
+
"@spotify/backstage-plugin-soundcheck-node": "^0.8.5",
|
|
124
124
|
"@testing-library/jest-dom": "^6.0.0",
|
|
125
125
|
"@testing-library/react": "^14.0.0",
|
|
126
126
|
"@testing-library/user-event": "^14.0.0",
|