@spotify/backstage-plugin-soundcheck 0.2.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,40 @@
1
1
  # @spotify/backstage-plugin-soundcheck
2
2
 
3
+ ## 0.4.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 07770382: Upgrade to Backstage 1.12.0
8
+ - 1d2bfc05: Added a virtualizeOverviewPage configuration option to only render parts of the Soundcheck overview
9
+ page that are in-view. This improves performance for teams that have a large amount of entities.
10
+
11
+ To enable this option, add the configuration to your app-config.yaml:
12
+
13
+ ```yaml
14
+ soundcheck:
15
+ virtualizeOverviewPage: true
16
+ ```
17
+
18
+ ### Patch Changes
19
+
20
+ - 7e1032fb: Updated dependency `graphql-request` to `5.1.0`
21
+ - 68db7129: Filter entity types out of Soundcheck overview page if the have no associated entities
22
+ - 179888c1: Program descriptions now support markdown content.
23
+ - Updated dependencies [31ac4320]
24
+ - @spotify/backstage-plugin-core@0.5.0
25
+
26
+ ## 0.3.0
27
+
28
+ ### Minor Changes
29
+
30
+ - 7488dd5e: Updated to Backstage release `1.11.0`.
31
+
32
+ ### Patch Changes
33
+
34
+ - 3da31b35: Updated dependency `@material-ui/core` to `^4.12.2`.
35
+ - Updated dependencies [7488dd5e]
36
+ - @spotify/backstage-plugin-core@0.4.0
37
+
3
38
  ## 0.2.1
4
39
 
5
40
  ### Patch Changes
package/config.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ export interface Config {
2
+ /**
3
+ * Configuration options for the soundcheck plugin.
4
+ */
5
+ soundcheck?: {
6
+ /**
7
+ * @visibility frontend
8
+ */
9
+ virtualizeOverviewPage?: boolean;
10
+ };
11
+ }
@@ -0,0 +1,2 @@
1
+ import{stringifyEntityRef as y}from"@backstage/catalog-model";import{useApi as v,useRouteRef as U}from"@backstage/core-plugin-api";import{useQuery as b}from"@tanstack/react-query";import{s as k,a as $}from"./index-d6a5b7f6.esm.js";import t from"react";import{makeStyles as d,Tooltip as D,Typography as i,alpha as p,Box as F}from"@material-ui/core";import{useEntity as G}from"@backstage/plugin-catalog-react";import{Link as H}from"react-router-dom";import{useAutoUpdatingRelativeTime as M}from"@spotify/backstage-plugin-core";import W from"@material-ui/icons/Schedule";import{DateTime as N}from"luxon";import j from"classnames";import{C as O,L as S,N as P,F as E,A as Q}from"./SoundcheckQueryClientProvider-04f7e1dc.esm.js";import{Skeleton as c}from"@material-ui/lab";import{MarkdownContent as C,Link as _}from"@backstage/core-components";function q(e){const a=v(k),r=y(e);return b(["soundcheck/certifications",r],async()=>a.getAllCertifications(r))}function T(e,a){const r=v(k),n=y(e);return b(["soundcheck/certifications",n,a],async()=>r.getCertificationDetails(n,a),{enabled:!!a})}const J=d(e=>({root:{display:"inline-flex",alignItems:"center",gap:e.spacing(1)}})),x=({timestamp:e,description:a})=>{const r=J(),n=N.fromISO(e).toLocaleString(N.DATETIME_FULL),l=M(e),o=a?`${a}: ${l}`:void 0;return t.createElement("div",{className:r.root},t.createElement(D,{title:n},t.createElement(i,{variant:"caption","aria-label":o},l)),t.createElement(W,null))},L=d(e=>({root:{display:"grid",width:"100%",gridTemplateColumns:"auto 1fr auto",gridColumnGap:e.spacing(1),padding:e.spacing(1),alignItems:"center","&.selected":{backgroundColor:p(e.palette.primary[e.palette.type],.2)},"&:hover, &:active, &:focus":{backgroundColor:p(e.palette.primary[e.palette.type],.3)}}})),K=({className:e,href:a,children:r})=>a?t.createElement(H,{to:a,className:e},r):t.createElement("div",{className:e},r),V=({result:e,name:a,timestamp:r,selected:n=!1,href:l})=>{const o=L(),u=j(o.root,{selected:n});return t.createElement(K,{href:l,className:u},t.createElement(O,{result:e}),t.createElement(i,{variant:"body2"},a),r?t.createElement(x,{timestamp:r}):null)},A=d(e=>{const a=e.palette.type==="dark"?e.palette.grey[700]:e.palette.grey[100];return{wrapper:{backgroundColor:a,color:p(e.palette.getContrastText(a),.7),fontSize:e.typography.caption.fontSize,minHeight:"auto",borderTop:`1px solid ${e.palette.divider}`,borderBottom:`1px solid ${e.palette.divider}`,padding:e.spacing(1),display:"grid",gridTemplateAreas:({badge:r})=>[`"${r?"badge":"title"} title"`,`"${r?".":"description"} description"`].join(" "),gridTemplateColumns:"auto 1fr"},title:{gridArea:"title",textTransform:"uppercase",fontWeight:"bold",color:p(e.palette.getContrastText(a),.7),fontSize:e.typography.body2.fontSize,paddingTop:e.spacing(.5),paddingBottom:e.spacing(.5),lineHeight:1},badge:{gridArea:"badge",marginRight:e.spacing(1)},description:{gridArea:"description",color:p(e.palette.getContrastText(a),.7),fontSize:e.typography.subtitle2.fontSize,marginTop:e.spacing(1)}}}),X=e=>{const a=A({badge:e.badge});return t.createElement("div",{className:a.wrapper},e.badge?t.createElement(S,{className:a.badge,badge:e.badge}):null,t.createElement(i,{className:a.title},e.title),e.description?t.createElement(i,{className:a.description},e.description):null)},f=d(e=>({description:{padding:0,margin:0,display:"block","& p":{margin:0}},root:{padding:e.spacing(2),margin:0,display:"grid",gridTemplateColumns:"min-content auto",gridGap:e.spacing(2)},title:{fontSize:e.typography.pxToRem(18)},level:{textTransform:"uppercase",color:e.palette.text.secondary,fontWeight:700,letterSpacing:"1px"}}));function Y({description:e,documentationUrl:a}){const r=f();return a?t.createElement("div",{className:r.description},t.createElement(C,{content:e}),t.createElement(_,{to:a},"Learn more")):t.createElement("div",{className:r.description},t.createElement(C,{content:e}))}const I=({name:e,level:a,badge:r,description:n,documentationUrl:l})=>{const o=f();return t.createElement("div",{className:o.root},r?t.createElement(S,{size:"large",badge:r}):t.createElement(P,{size:"large"}),t.createElement("div",null,t.createElement(i,{variant:"caption",className:o.level},a!=null?a:"No Level"),t.createElement(i,{variant:"h4",className:o.title},e),n&&t.createElement(Y,{description:n,documentationUrl:l})))},R=({hideDescription:e=!1})=>{const a=f();return t.createElement(E,null,t.createElement("div",{className:a.root},t.createElement(c,{width:44,height:44}),t.createElement("div",null,t.createElement(i,{variant:"caption",className:a.level},t.createElement(c,{width:100})),t.createElement(i,{variant:"h4",className:a.title},t.createElement(c,{width:300})),!e&&t.createElement(i,{variant:"body2"},t.createElement(c,null)))))},Z=()=>{const e=A({});return t.createElement(E,null,t.createElement("div",{className:e.wrapper},t.createElement(c,{className:e.title}),t.createElement(i,{className:e.description},t.createElement(c,null))))},h=()=>{const e=L();return t.createElement(E,null,t.createElement("div",{className:e.root},t.createElement(c,{width:24,height:24}),t.createElement(i,{variant:"body2"},t.createElement(c,null)),t.createElement(c,{width:100,height:24})))},ee=()=>{const e=w();return t.createElement("div",{className:e.root},t.createElement(R,null),new Array(3).fill(null).map((a,r)=>t.createElement(t.Fragment,{key:`skeleton-level-${r}`},t.createElement(Z,null),t.createElement("ul",{className:e.checks},t.createElement(h,null),t.createElement(h,null),t.createElement(h,null)))))},w=d(e=>({root:{borderRight:`1px solid ${e.palette.divider}`},checks:{padding:0,margin:0,flex:1,listStyle:"none"},checkItem:{borderBottom:`1px solid ${e.palette.divider}`,"&:last-of-type":{borderBottom:"0"}}})),te=({programId:e,checkId:a})=>{var r,n;const l=w(),{entity:o}=G(),u=U($),{data:s,isLoading:z,isError:B}=T(o,e);return B?t.createElement("div",{className:l.root},t.createElement(F,{padding:2},t.createElement(Q,{severity:"error",title:"Error loading certification"}))):z||!e?t.createElement(ee,null):s?t.createElement("div",{className:l.root},t.createElement(I,{name:s.program.name,level:(r=s.highestLevel)==null?void 0:r.name,badge:(n=s.highestLevel)==null?void 0:n.badge,description:s.program.description,documentationUrl:s.program.documentationUrl}),s==null?void 0:s.levels.map(m=>t.createElement(t.Fragment,{key:m.ordinal},t.createElement(X,{key:m.ordinal,badge:m.badge,title:m.name,description:m.description}),t.createElement("ul",{className:l.checks},m.checks.map(g=>t.createElement("li",{key:g.id,className:l.checkItem},t.createElement(V,{...g,selected:g.id===a,href:u({programId:e,checkId:g.id})}))))))):null};export{te as C,x as R,q as a,R as b,I as c,T as u};
2
+ //# sourceMappingURL=CertificationSidebar-276909f2.esm.js.map
@@ -0,0 +1,2 @@
1
+ import e,{useState as W,useEffect as M}from"react";import{Link as O,useParams as Q,Routes as j,Route as k,Navigate as I}from"react-router-dom";import{makeStyles as p,Typography as f,Box as U,Tab as L,Tabs as T,Paper as V,Divider as Y}from"@material-ui/core";import{SpotifyLicenseBanner as q}from"@spotify/backstage-plugin-core";import{useEntity as u}from"@backstage/plugin-catalog-react";import{R as G}from"./RefetchingIndicator-b6c3da0a.esm.js";import{R as H,u as P,a as y,C as J}from"./CertificationSidebar-276909f2.esm.js";import{Skeleton as c}from"@material-ui/lab";import{MarkdownContent as x}from"@backstage/core-components";import{stringifyEntityRef as K}from"@backstage/catalog-model";import{useApi as X,useRouteRef as b,useRouteRefParams as Z}from"@backstage/core-plugin-api";import{useQuery as _}from"@tanstack/react-query";import{s as ee,R as s,c as g,a as B}from"./index-d6a5b7f6.esm.js";import{A as C,F,L as te,N as ae,a as re,S as ne}from"./SoundcheckQueryClientProvider-04f7e1dc.esm.js";import ie from"react-use/lib/useMeasure";import $ from"react-use/lib/usePrevious";import le from"react-confetti";import"react-use/lib/useDebounce";import"@material-ui/icons/Schedule";import"luxon";import"classnames";import"graphql-request";import"graphql-tag";import"@material-ui/icons/Check";import"@material-ui/icons/Close";import"@material-ui/icons/RemoveCircleOutline";import"@material-ui/icons/HelpOutline";import"lodash";function oe(t,r,a){const n=X(ee),i=K(t);return _(["soundcheck/check-details",i,r,a],async()=>n.getCheckResultDetails(i,r,a),{enabled:!!r&&!!a})}const ce=p({markdownContent:{"& :last-child":{marginBottom:0}}}),se=({state:t,notes:r})=>{const a=ce(),n={[s.Passed]:"success",[s.Failed]:"error",[s.NotReported]:"info",[s.NotApplicable]:"info"}[t],i={[s.Passed]:"Check passed",[s.Failed]:"Check did not pass",[s.NotReported]:"Check not reported",[s.NotApplicable]:"Check not applicable"}[t];return e.createElement(C,{severity:n,title:i},r?e.createElement(x,{className:a.markdownContent,content:r}):null)},me=()=>{const t=A();return e.createElement(F,null,e.createElement("div",{className:t.root,"data-testid":"check-details-view"},e.createElement("div",{className:t.topBar},e.createElement(f,{variant:"h2",className:t.title},e.createElement(c,{width:300,height:32})),e.createElement(c,{width:100,height:32})),e.createElement(c,{variant:"rect",height:120}),e.createElement("div",{"data-testid":"soundcheck-check-details-description"},e.createElement(f,{variant:"h3"},e.createElement(c,null)),e.createElement(c,null),e.createElement(c,null),e.createElement(c,null))))},A=p(t=>({root:{padding:`${t.spacing(3)}px ${t.spacing(5)}px`},title:{fontWeight:"normal",fontSize:t.typography.h5.fontSize},description:{padding:`${t.spacing(3)}px 0`},subtitle:{fontWeight:"normal",fontSize:t.typography.h6.fontSize},topBar:{display:"flex",justifyContent:"space-between",marginBottom:t.spacing(2)}})),de=({programId:t,checkId:r})=>{const a=A(),{entity:n}=u(),{data:i,isLoading:l,isError:o}=oe(n,t,r);if(o)return e.createElement(U,{padding:2},e.createElement(C,{severity:"error",title:"Error loading check details"}));if(l||!t||!r)return e.createElement(me,null);if(!i)return null;const{name:h,description:d,result:v,timestamp:m,notes:E}=i;return e.createElement("div",{className:a.root,"data-testid":"check-details-view"},e.createElement("div",{className:a.topBar},e.createElement(f,{variant:"h2",className:a.title},h),m?e.createElement(H,{timestamp:m,description:"Last updated"}):null),e.createElement(se,{state:v,notes:E}),e.createElement("div",{className:a.description,"data-testid":"soundcheck-check-details-description"},e.createElement(f,{variant:"h3",className:a.subtitle},"Description"),e.createElement(x,{content:d})))},pe=p(()=>({root:{position:"absolute",width:"100%",height:"100%"}})),ue=({programId:t})=>{var r,a;const n=pe(),{entity:i}=u(),{data:l,isLoading:o}=P(i,t),[h,{width:d,height:v}]=ie(),m=o?void 0:(a=(r=l==null?void 0:l.highestLevel)==null?void 0:r.ordinal)!=null?a:-1,E=$(m),R=$(t),[z,S]=W(!1);return M(()=>{typeof E!="undefined"&&typeof m!="undefined"&&t===R&&m>E&&S(!0)},[m,E,t,R]),z?e.createElement("div",{ref:h,className:n.root},e.createElement(le,{width:d,height:v,numberOfPieces:1e3,gravity:1,initialVelocityY:20,recycle:!1,onConfettiComplete:()=>S(!1)})):null},D=p(t=>({root:{maxWidth:"80ch",textTransform:"uppercase",paddingTop:t.spacing(2),paddingBottom:t.spacing(2)},wrapper:{display:"inline-block",textOverflow:"ellipsis",whiteSpace:"nowrap",overflow:"hidden"},badge:{marginRight:t.spacing(1)}})),he=({id:t,name:r,badge:a,href:n,selected:i=!1})=>{const l=D();return e.createElement(L,{className:l.root,classes:{wrapper:l.wrapper},value:t,label:e.createElement(e.Fragment,null,a?e.createElement(te,{badge:a,className:l.badge}):e.createElement(ae,{className:l.badge}),r),component:O,to:n,selected:i})},w=()=>{const t=D();return e.createElement(L,{className:t.root,classes:{wrapper:t.wrapper},label:e.createElement(c,{width:180})})},Ee=()=>e.createElement(F,null,e.createElement(T,{value:!1,indicatorColor:"primary"},e.createElement(w,null),e.createElement(w,null),e.createElement(w,null)));function fe(t=[],r){const a=t.findIndex(n=>n.program.id===r);return a<0?!1:a}const ge=({programId:t})=>{const{entity:r}=u(),{isLoading:a,data:n}=y(r),i=b(g);if(a||!t)return e.createElement(Ee,null);const l=fe(n,t);return e.createElement(T,{value:l,indicatorColor:"primary","aria-label":"Certifications",variant:"scrollable"},n&&n.map(({program:{id:o,name:h},highestLevel:d})=>e.createElement(he,{key:o,id:o,name:h,badge:d==null?void 0:d.badge,selected:o===t,href:i({programId:o})})))},ve=p({paper:{overflow:"hidden",position:"relative"},view:{display:"grid",gridTemplateColumns:"1fr 2fr"}}),ke=()=>{const{programId:t,checkId:r}=Q(),a=ve(),{entity:n}=u(),{isError:i,isFetched:l,data:o}=y(n);return i?e.createElement(C,{severity:"error",title:"Error loading certifications"}):l&&!(o!=null&&o.length)?e.createElement(re,null):e.createElement(V,{className:a.paper},e.createElement(G,null),e.createElement(ge,{programId:t}),e.createElement(Y,null),e.createElement("div",{"data-testid":"soundcheck-certification-view",className:a.view},e.createElement(J,{programId:t,checkId:r}),e.createElement(de,{programId:t,checkId:r}),e.createElement(ue,{programId:t})))},ye=p(t=>({root:{"&:not(:first-child)":{marginTop:t.spacing(2)}}})),N=()=>{const t=ye();return e.createElement(e.Fragment,null,e.createElement(q,{backend:"soundcheck",invalidLicenseMessage:"Submitted check results will still be stored, but it will not be possible to view certifications or individual results until a valid license is present.",inline:!0}),e.createElement("div",{className:t.root},e.createElement(ke,null)))},be=()=>{var t;const{entity:r}=u(),a=b(g),{data:n}=y(r),i=(t=n==null?void 0:n[0])==null?void 0:t.program.id;return i?e.createElement(I,{to:a({programId:i}),replace:!0}):null},Ce=()=>{var t,r;const{entity:a}=u(),{programId:n}=Z(g),i=b(B),{data:l}=P(a,n),o=(r=(t=l==null?void 0:l.levels[0])==null?void 0:t.checks[0])==null?void 0:r.id;return o?e.createElement(I,{to:i({programId:n,checkId:o}),replace:!0}):null},we=()=>e.createElement(j,null,e.createElement(k,{path:"/",element:e.createElement(e.Fragment,null,e.createElement(N,null),e.createElement(be,null))}),e.createElement(k,{path:g.path,element:e.createElement(e.Fragment,null,e.createElement(N,null),e.createElement(Ce,null))}),e.createElement(k,{path:B.path,element:e.createElement(N,null)})),Ne=()=>e.createElement(ne,null,e.createElement(we,null));export{Ne as EntitySoundcheckContent};
2
+ //# sourceMappingURL=EntitySoundcheckContent-931d8ed8.esm.js.map
@@ -0,0 +1,2 @@
1
+ import e,{useState as n}from"react";import{makeStyles as a,LinearProgress as m}from"@material-ui/core";import s from"react-use/lib/useDebounce";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import{useIsFetching as c}from"@tanstack/react-query";import"./index-d6a5b7f6.esm.js";import"@backstage/plugin-catalog-react";import"react-router-dom";import{F as d}from"./SoundcheckQueryClientProvider-04f7e1dc.esm.js";const p=a(t=>({indicator:{position:"absolute",width:"100%",zIndex:t.zIndex.speedDial}})),l=()=>{const t=c(),i=p(),[r,o]=n(!!t);return s(()=>{o(!!t)},250,[t]),r?e.createElement(d,null,e.createElement("div",{className:i.indicator},e.createElement(m,{variant:"indeterminate","data-testid":"refetching-indicator"}))):null};export{l as R};
2
+ //# sourceMappingURL=RefetchingIndicator-b6c3da0a.esm.js.map
@@ -0,0 +1,2 @@
1
+ import r,{useState as u,useEffect as f}from"react";import{Fade as h,withStyles as s,makeStyles as i,Typography as b}from"@material-ui/core";import g from"@material-ui/icons/Check";import y from"@material-ui/icons/Close";import E from"@material-ui/icons/RemoveCircleOutline";import N from"@material-ui/icons/HelpOutline";import{R as a}from"./index-d6a5b7f6.esm.js";import l from"classnames";import{Alert as x}from"@material-ui/lab";import{EmptyState as m}from"@backstage/core-components";import{humanizeEntityRef as C}from"@backstage/plugin-catalog-react";import{parseEntityRef as v}from"@backstage/catalog-model";import{QueryClient as k,QueryClientProvider as z}from"@tanstack/react-query";import{memoize as $}from"lodash";import{useApi as S,errorApiRef as w}from"@backstage/core-plugin-api";const R=({children:e})=>{const[t,o]=u(!1);return f(()=>{const n=setTimeout(()=>{o(!0)},250);return()=>clearTimeout(n)},[]),r.createElement(h,{in:t,timeout:250},e)},A=e=>({[a.Passed]:"Check passed",[a.NotReported]:"Check not reported",[a.Failed]:"Check failed",[a.NotApplicable]:"Check not applicable"})[e],F=s(e=>({root:{color:e.palette.success.main}}))(g),T=s(e=>({root:{color:e.palette.error.main}}))(y),I=s(e=>({root:{color:e.palette.info.main}}))(N),L=s(e=>({root:{color:e.palette.text.disabled}}))(E),P=({result:e,className:t})=>{const o={className:t,"aria-label":A(e),"aria-hidden":!1};return e===a.Passed?r.createElement(F,{...o}):e===a.NotReported?r.createElement(I,{...o}):e===a.Failed?r.createElement(T,{...o}):e===a.NotApplicable?r.createElement(L,{...o}):null},p=24,B=11,c=e=>e==="small"?1:2,M=i({root:{position:"relative",display:"inline-flex",alignItems:"center",justifyContent:"center",borderRadius:"50%",borderWidth:"2px",fontWeight:700,width:({size:e})=>`${p*c(e)}px`,height:({size:e})=>`${p*c(e)}px`,fontSize:({size:e})=>`${B*c(e)}px`}}),d=({className:e,label:t,size:o="small"})=>{const n=M({size:o});return r.createElement("span",{className:l(e,n.root),role:"img","aria-label":`${t} badge`},t)},W=i(e=>({root:{background:({color:t})=>t,color:({color:t})=>e.palette.getContrastText(t),borderColor:e.palette.common.black,borderStyle:"solid","&::after":{position:"absolute",display:"block",content:'""',top:0,left:0,width:"100%",height:"100%",borderRadius:"50%",boxShadow:["inset 0 -0.18em 0 0 rgba(0, 0, 0, 0.25)","inset 0px 0.18em 0px 0px rgba(255, 255, 255, 0.5)","inset 0px 1.3em 0px -0.5em rgba(255, 255, 255, 0.2)"].join(",")}}})),Q=({className:e,badge:t,size:o="small"})=>{const n=W({color:t.options.color,size:o});return r.createElement(d,{className:l(e,n.root),size:o,label:`L${t.options.level}`})},j=i({root:{borderColor:"currentColor",borderStyle:"dashed"}}),O=({className:e,size:t="small"})=>{const o=j();return r.createElement(d,{className:l(e,o.root),size:t,label:"NL"})},q=i(e=>({root:{padding:e.spacing(3)},icon:{display:"none"},message:{padding:0},type:{fontWeight:700}})),D=e=>{const{type:t,...o}=q();return r.createElement(x,{severity:e.severity,elevation:1,classes:o},r.createElement(b,{variant:"subtitle1",classes:{root:t}},e.title),e.children)},G=({className:e})=>r.createElement("div",{className:e},r.createElement(m,{title:"No certifications available",missing:"data",description:"There are no programs configured that apply to this entity."})),K=({ownerEntityRef:e})=>e?r.createElement(m,{missing:"data",title:"Missing entities",description:r.createElement(r.Fragment,null,"Looks like the group"," ",C(v(e),{defaultKind:"Group"})," ","doesn't own any entities.",r.createElement("br",null),r.createElement("br",null),"Please select another group from the dropdown in the corner of the header.")}):null,H=$(e=>new k({defaultOptions:{queries:{refetchInterval:6e4,refetchIntervalInBackground:!1,refetchOnWindowFocus:"always",retry:2,retryDelay:t=>{const o=450+Math.ceil(Math.random()*100);return Math.min(o*2**t,3e4)},onError:t=>e.post(t)}}})),J=e=>{const t=S(w),o=H(t);return r.createElement(z,{client:o},e.children)};export{D as A,P as C,R as F,Q as L,O as N,J as S,G as a,K as b};
2
+ //# sourceMappingURL=SoundcheckQueryClientProvider-04f7e1dc.esm.js.map
@@ -1,2 +1,2 @@
1
- import e,{Fragment as f}from"react";import{A as g,a as E,S as y}from"./SoundcheckQueryClientProvider-4f7596d6.esm.js";import v from"@material-ui/core/styles/makeStyles";import{Divider as k}from"@material-ui/core";import{useRouteRef as C}from"@backstage/core-plugin-api";import{Link as S,InfoCard as b}from"@backstage/core-components";import{useEntity as h}from"@backstage/plugin-catalog-react";import{SpotifyLicenseBanner as w}from"@spotify/backstage-plugin-core";import{c as R}from"./index-338d0659.esm.js";import{b as m,a as L,c as D}from"./CertificationSidebar-2302311d.esm.js";import"@backstage/catalog-model";import"@tanstack/react-query";import"react-router-dom";import"@material-ui/lab";import"@material-ui/icons/Check";import"@material-ui/icons/Close";import"@material-ui/icons/RemoveCircleOutline";import"@material-ui/icons/HelpOutline";import"classnames";import"lodash";import"graphql-request";import"graphql-tag";import"@material-ui/icons/Schedule";import"luxon";const I=()=>e.createElement(e.Fragment,null,e.createElement(m,{hideDescription:!0}),e.createElement(m,{hideDescription:!0})),s=v(t=>({certificationWrapper:{display:"flex",justifyContent:"space-between",alignItems:"center"},infoCard:{display:"grid",gridRowGap:t.spacing(2)},emptyState:{"& > div":{backgroundColor:t.palette.background.paper}}})),a=({children:t})=>{const i=s();return e.createElement(b,{title:"Soundcheck"},e.createElement("div",{className:i.infoCard},e.createElement(w,{inline:!0,backend:"soundcheck",invalidLicenseMessage:"Submitted check results will still be stored, but it will not be possible to view certifications or individual results until a valid license is present."}),t))},N=()=>{const{entity:t}=h(),i=s(),{data:n,isError:c,isLoading:p}=L(t),u=C(R);return c?e.createElement(a,null,e.createElement(g,{severity:"error",title:"Error loading certifications"})):p||!n?e.createElement(a,null,e.createElement(I,null)):n.length===0?e.createElement(a,null,e.createElement(E,{className:i.emptyState})):e.createElement(a,null,n.map((r,d)=>{var o,l;return e.createElement(f,{key:r.program.name},e.createElement("div",{className:i.certificationWrapper,"data-testid":"soundcheck-program-row"},e.createElement(D,{key:r.program.id,name:r.program.name,badge:(o=r.highestLevel)==null?void 0:o.badge,level:(l=r.highestLevel)==null?void 0:l.name}),e.createElement(S,{to:u({programId:r.program.id})},"View Details")),d<n.length-1?e.createElement(k,null):null)}))},P=()=>e.createElement(y,null,e.createElement(N,null));export{P as EntitySoundcheckCard};
2
- //# sourceMappingURL=index-afed4896.esm.js.map
1
+ import e,{Fragment as f}from"react";import{A as g,a as E,S as v}from"./SoundcheckQueryClientProvider-04f7e1dc.esm.js";import y from"@material-ui/core/styles/makeStyles";import{Divider as h}from"@material-ui/core";import{useRouteRef as k}from"@backstage/core-plugin-api";import{Link as C,InfoCard as S}from"@backstage/core-components";import{useEntity as b}from"@backstage/plugin-catalog-react";import{SpotifyLicenseBanner as w}from"@spotify/backstage-plugin-core";import{c as L}from"./index-d6a5b7f6.esm.js";import{b as m,a as R,c as D}from"./CertificationSidebar-276909f2.esm.js";import"@backstage/catalog-model";import"@tanstack/react-query";import"react-router-dom";import"@material-ui/lab";import"@material-ui/icons/Check";import"@material-ui/icons/Close";import"@material-ui/icons/RemoveCircleOutline";import"@material-ui/icons/HelpOutline";import"classnames";import"lodash";import"graphql-request";import"graphql-tag";import"@material-ui/icons/Schedule";import"luxon";const N=()=>e.createElement(e.Fragment,null,e.createElement(m,{hideDescription:!0}),e.createElement(m,{hideDescription:!0})),c=y(t=>({certificationWrapper:{display:"flex",justifyContent:"space-between",alignItems:"center"},infoCard:{display:"grid",gridRowGap:t.spacing(2)},emptyState:{"& > div":{backgroundColor:t.palette.background.paper}}})),a=({children:t})=>{const i=c();return e.createElement(S,{title:"Soundcheck"},e.createElement("div",{className:i.infoCard},e.createElement(w,{inline:!0,backend:"soundcheck",invalidLicenseMessage:"Submitted check results will still be stored, but it will not be possible to view certifications or individual results until a valid license is present."}),t))},A=()=>{const{entity:t}=b(),i=c(),{data:n,isError:s,isLoading:p}=R(t),d=k(L);return s?e.createElement(a,null,e.createElement(g,{severity:"error",title:"Error loading certifications"})):p||!n?e.createElement(a,null,e.createElement(N,null)):n.length===0?e.createElement(a,null,e.createElement(E,{className:i.emptyState})):e.createElement(a,null,n.map((r,u)=>{var o,l;return e.createElement(f,{key:r.program.name},e.createElement("div",{className:i.certificationWrapper,"data-testid":"soundcheck-program-row"},e.createElement(D,{key:r.program.id,name:r.program.name,badge:(o=r.highestLevel)==null?void 0:o.badge,level:(l=r.highestLevel)==null?void 0:l.name}),e.createElement(C,{to:d({programId:r.program.id})},"View Details")),u<n.length-1?e.createElement(h,null):null)}))},I=()=>e.createElement(v,null,e.createElement(A,null));export{I as EntitySoundcheckCard};
2
+ //# sourceMappingURL=index-0f37ee61.esm.js.map
@@ -0,0 +1,2 @@
1
+ import t,{useState as x,useEffect as C,useMemo as O,useCallback as H,memo as b,Fragment as ee}from"react";import{HeaderTabs as B,Link as T,EmptyState as te,Page as re,Header as ae,Content as le}from"@backstage/core-components";import{SpotifyLicenseBanner as ne}from"@spotify/backstage-plugin-core";import{makeStyles as g,alpha as W,TextField as oe,CircularProgress as ie,Tooltip as se,LinearProgress as ce,Typography as N,Grid as I}from"@material-ui/core";import{C as pe,L as G,S as de,b as me,A as ue}from"./SoundcheckQueryClientProvider-04f7e1dc.esm.js";import ge from"@material-ui/lab/Autocomplete";import{stringifyEntityRef as V,parseEntityRef as w}from"@backstage/catalog-model";import{useApi as $,identityApiRef as he,useRouteRef as L}from"@backstage/core-plugin-api";import{useQuery as P}from"@tanstack/react-query";import{s as j,R as k}from"./index-d6a5b7f6.esm.js";import{catalogApiRef as M,entityRouteRef as S,humanizeEntityRef as z}from"@backstage/plugin-catalog-react";import{useSearchParams as fe}from"react-router-dom";import{Skeleton as y}from"@material-ui/lab";import{R as ye}from"./RefetchingIndicator-b6c3da0a.esm.js";import{countBy as K}from"lodash";import{VariableSizeGrid as ve}from"react-window";import"@material-ui/icons/Check";import"@material-ui/icons/Close";import"@material-ui/icons/RemoveCircleOutline";import"@material-ui/icons/HelpOutline";import"classnames";import"graphql-request";import"graphql-tag";import"react-use/lib/useDebounce";function Ee(e){const r=$(j);return P(["soundcheck/facets-for-owner",e],async()=>r.getFacetsForOwner(e),{enabled:!!e})}function Q(e,r){const a=$(j);return P(["soundcheck/program-overview-for-owner",e,r],async()=>a.getProgramOverviewForOwner(e,r),{enabled:!!e&&!!(r!=null&&r.type)})}function be(){const e=$(he),r=$(M);return P(["soundcheck/user-groups-claims"],async()=>{const{ownershipEntityRefs:a}=await e.getBackstageIdentity();return(await r.getEntitiesByRefs({entityRefs:a})).items.filter(l=>(l==null?void 0:l.kind)==="Group").map(l=>{var n,s,i,o;return{name:(o=(i=(s=(n=l.spec)==null?void 0:n.profile)==null?void 0:s.displayName)!=null?i:l.metadata.title)!=null?o:l.metadata.name,ref:V(l)}})})}function ke(){const e=$(M);return P(["soundcheck/all-groups"],async()=>{const{items:r}=await e.getEntities({filter:{kind:"Group"}});return r.filter(a=>(a==null?void 0:a.kind)==="Group").map(a=>{var l,n,s,i;return{name:(i=(s=(n=(l=a.spec)==null?void 0:l.profile)==null?void 0:n.displayName)!=null?s:a.metadata.title)!=null?i:a.metadata.name,ref:V(a)}})})}const Ce=()=>{const[e,r]=fe(),a=Object.fromEntries(e.entries()),[l,n]=x(a);return C(()=>{r(l,{replace:!0})},[l,r]),[l,n]},Ne=()=>{const{data:e,isLoading:r,isError:a}=be(),{data:l,isLoading:n,isError:s}=ke();return{options:O(()=>{const i=[];return e&&i.push(...e.map(({name:o,ref:d})=>({name:o,ref:d,key:"My Groups"}))),l&&i.push(...l.map(({name:o,ref:d})=>({name:o,ref:d,key:"All Groups"}))),i},[e,l]),isLoading:r||n,isError:a||s}},we=g(e=>({root:{width:"100%",minWidth:250},textField:{"& $notchedOutline":{borderColor:W(e.page.fontColor,.25)},"&:hover $notchedOutline":{borderColor:e.page.fontColor}},input:{backgroundColor:"transparent",color:e.page.fontColor},clearIndicator:{color:e.page.fontColor},popupIndicator:{color:e.page.fontColor},notchedOutline:{}})),Re=e=>{const{onChange:r,initialValue:a,setError:l}=e,{options:n,isLoading:s,isError:i}=Ne(),o=we(),[d,c]=x(null);C(()=>{if(!s&&n!=null&&n.length&&!d){const p=a?n.find(m=>m.ref===a):n[0];p&&(c(p),r==null||r(p.ref))}},[s,n,d,r,a]);const u=H((p,m)=>{c(m),r==null||r(m==null?void 0:m.ref)},[r,c]);return C(()=>{l==null||l(i?new Error("Error loading groups"):void 0)},[i,l]),i?null:t.createElement(ge,{"aria-label":"Current group",className:o.root,classes:{clearIndicator:o.clearIndicator,popupIndicator:o.popupIndicator},disableClearable:!0,options:n!=null?n:[],loading:s,groupBy:p=>p.key,value:d,freeSolo:!1,onChange:u,getOptionLabel:p=>p.name,renderInput:p=>t.createElement(oe,{...p,variant:"outlined",placeholder:s?"Loading":"Select a group",className:o.textField,InputProps:{...p.InputProps,className:o.input,classes:{notchedOutline:o.notchedOutline},endAdornment:t.createElement(t.Fragment,null,s?t.createElement(ie,{color:"inherit",size:20}):null,p.InputProps.endAdornment)}})})},$e=()=>t.createElement(B,{tabs:[{label:t.createElement(y,{width:180})},{label:t.createElement(y,{width:180})},{label:t.createElement(y,{width:180})},{label:t.createElement(y,{width:180})}]}),xe=g(e=>({root:{borderTop:`1px solid ${e.palette.divider}`,borderBottom:`1px solid ${e.palette.divider}`},tab:{textTransform:"uppercase",paddingTop:e.spacing(2),paddingBottom:e.spacing(2)}})),Te=({unfilteredFacets:e,onChange:r,type:a})=>{var l,n,s;const i=xe(),o={types:(l=e==null?void 0:e.types.filter(({count:p})=>p>0))!=null?l:[]},d=H(p=>{var m;r((m=o==null?void 0:o.types[p].value)!=null?m:"")},[o==null?void 0:o.types,r]);C(()=>{var p,m;const h=(o==null?void 0:o.types)&&o.types.length>=0,f=!a&&h,R=a&&h&&!(o!=null&&o.types.find(({value:E})=>E===a));(f||R)&&r((m=(p=o==null?void 0:o.types[0])==null?void 0:p.value)!=null?m:"")},[a,o==null?void 0:o.types,r]);const c=(n=o==null?void 0:o.types.map(({value:p,count:m})=>({key:p,label:`${p} (${m>50?"50+":m})`,id:p,tabProps:{className:i.tab}})))!=null?n:[];if(!c.length)return null;const u=(s=o==null?void 0:o.types.findIndex(p=>p.value===a))!=null?s:-1;return t.createElement(t.Fragment,null,t.createElement(ye,null),t.createElement(B,{onChange:d,tabs:c,selectedIndex:u>-1?u:void 0}))},Ie=g(e=>({root:{height:"8px",minWidth:"64px",marginLeft:e.spacing(2),borderRadius:"100vh",backgroundColor:e.palette.background.default},bar:{backgroundColor:e.palette.success.main,transition:"none"}})),D=e=>{var r,a;const l=Ie(e),n=O(()=>Object.entries(e.progress).reduce((i,[,o])=>i+o,0),[e.progress]);if(n===0)return null;const s=(r=e.progress[k.Passed])!=null?r:0;return t.createElement(se,{arrow:!0,title:`Check passing for ${s} of ${n} ${n===1?"entity":"entities"}`,enterDelay:0,placement:"top"},t.createElement(ce,{variant:"determinate",value:((a=e.progress[k.Passed])!=null?a:0)/n*100,classes:{root:l.root,bar:l.bar}}))},Le=g(e=>({root:{padding:0},iconWrapper:{padding:e.spacing(1.5),display:"flex",alignItems:"center",justifyContent:"center"},link:{"&:hover $iconWrapper, &:active $iconWrapper, &:focus $iconWrapper":{backgroundColor:e.palette.infoBackground}},icon:{width:"0.75em",height:"0.75em"},empty:{width:e.spacing(2),height:e.spacing(2)},virtualized:{borderBottom:`1px solid ${e.palette.divider}`,borderRight:`1px solid ${e.palette.divider}`}})),U=b(({programId:e,checkId:r,entityRef:a,result:l,entityRoute:n,isVirtualized:s})=>{const i=Le();if(typeof a!="string")return t.createElement("td",{className:`${i.root} ${s?i.virtualized:""}`,"aria-hidden":!0},t.createElement("div",{className:i.iconWrapper},t.createElement("div",{className:i.empty})));const o=t.createElement("div",{className:i.iconWrapper},t.createElement(pe,{className:i.icon,result:l!=null?l:k.NotReported})),d=l&&l===k.NotApplicable?o:t.createElement(T,{className:i.link,to:`${n(w(a))}/soundcheck/${e}/${r}`},o);return t.createElement("td",{className:`${i.root} ${s?i.virtualized:""}`},d)}),Pe=g(e=>({virtualized:{borderRight:`1px solid ${e.palette.divider}`,height:`${v.programTitle}px`,display:"flex",justifyContent:"center",alignItems:"center"}})),Se=b(({entityRef:e,highestLevels:r})=>{const a=r.find(l=>l.entityRef===e);return a!=null&&a.badge?t.createElement(G,{badge:a.badge,size:"small"}):null}),Ae=({highestLevel:e})=>{const r=Pe();return e!=null&&e.badge?t.createElement("div",{className:r.virtualized},t.createElement(G,{badge:e.badge,size:"small"})):t.createElement("div",{className:r.virtualized},"\xA0")},q=g(e=>({programNameCell:{padding:0,position:"sticky",backgroundColor:e.palette.background.paper},programNameContent:{padding:e.spacing(2)},programNameTypography:{overflow:"hidden",textOverflow:"ellipsis"},badgeCellContent:{display:"flex",justifyContent:"center",alignItems:"center"},programNameCellVirtualized:{borderRight:`1px solid ${e.palette.divider}`}})),Oe=b(({program:e,entityRefs:r,highestLevels:a})=>{const l=q();return t.createElement("tr",{"data-testid":"program-title-row"},t.createElement("th",{scope:"row",className:l.programNameCell},t.createElement("div",{className:l.programNameContent},t.createElement(N,{className:l.programNameTypography,variant:"h5",component:"p"},e.name))),r.map((n,s)=>typeof n!="string"?t.createElement("td",{key:s,"aria-hidden":!0}):t.createElement("td",{key:s,"data-testid":"program-certification-cell"},t.createElement("div",{className:l.badgeCellContent},t.createElement(Se,{entityRef:n,highestLevels:a})))))}),ze=b(({name:e})=>{const r=q();return t.createElement("div",{className:`${r.programNameCell} ${r.programNameCellVirtualized}`},t.createElement("div",{className:r.programNameContent},t.createElement(N,{className:r.programNameTypography,variant:"h5",component:"p"},e)))}),F=g(e=>{const r=e.palette.type==="dark"?e.palette.grey[700]:e.palette.grey[100];return{root:{color:W(e.palette.getContrastText(r),.7),backgroundColor:r},levelContent:{padding:`${e.spacing(.5)}px ${e.spacing(2)}px`,backgroundColor:r},levelTypography:{overflow:"hidden",textOverflow:"ellipsis"},levelHeaderCell:{padding:`${e.spacing(.5)}px ${e.spacing(2)}px`,borderRight:`1px solid ${e.palette.divider}`,height:`${v.levelTitle}px`}}}),Fe=b(({level:e,entityRefs:r,programName:a})=>{const l=F();return t.createElement("tr",{className:l.root,"data-testid":"program-level-row"},t.createElement("th",{scope:"row",className:l.root},t.createElement("div",{className:l.levelContent},t.createElement(N,{className:l.levelTypography,variant:"subtitle2",component:"p","aria-label":`${e.name} for ${a} program`},e.name))),r.map((n,s)=>t.createElement("td",{key:s,className:l.root,"aria-hidden":!0})))}),He=({name:e})=>{const r=F();return t.createElement("div",{className:`${r.levelHeaderCell} ${r.root}`,"aria-label":`${e}`},t.createElement(N,{variant:"subtitle2",component:"p",className:r.levelTypography},e))},Be=()=>{const e=F();return t.createElement("div",{className:`${e.levelHeaderCell} ${e.root}`},"\xA0")},J=g(e=>({root:{position:"sticky",bottom:"-1px",backgroundColor:e.palette.background.default,boxShadow:`0 -1px ${e.palette.divider}`,"& td$cell, & th$cell":{border:0,padding:e.spacing(1)},"& td$cell":{backgroundColor:e.palette.background.default}},row:{boxShadow:`1px 0 ${e.palette.background.default}, -1px 0 ${e.palette.background.default}`},cell:{verticalAlign:"top"},cellInner:{textOrientation:"mixed",writingMode:"vertical-lr",transform:"rotate(-20deg)",transformOrigin:`100% ${e.spacing(1)}px`,wordBreak:"keep-all",fontWeight:"bold",overflow:"hidden",textOverflow:"ellipsis",maxHeight:"15vh"}})),We=({entityRefs:e})=>{const r=L(S),a=J();return t.createElement("tfoot",{className:a.root,"data-testid":"results-table-footer"},t.createElement("tr",{className:a.row},t.createElement("td",{className:a.cell}),e.map((l,n)=>typeof l!="string"?t.createElement("th",{key:n,className:a.cell,"aria-hidden":!0}):t.createElement("th",{scope:"col",key:n,className:a.cell},t.createElement("div",{className:a.cellInner},t.createElement(T,{to:r(w(l))},z(w(l),{defaultKind:"component"})))))))},Ge=({entityRef:e})=>{const r=L(S),a=J(),l=e?t.createElement(T,{to:r(w(e))},z(w(e),{defaultKind:"component"})):t.createElement(t.Fragment,null);return t.createElement("div",{className:a.cell},t.createElement("div",{className:a.cellInner},l))},Ve=e=>t.createElement(ze,{name:e}),je=e=>({type:"ProgramHeader",render:()=>Ve(e)}),Me=e=>e?t.createElement(He,{name:e}):t.createElement(Be,null),X=e=>({type:"LevelHeader",render:()=>Me(e)}),Ke=(e,r)=>t.createElement(et,{name:e,progress:r}),Qe=(e,r)=>({type:"CheckTitle",render:()=>Ke(e,r)}),De=(e,r,a,l,n)=>t.createElement(U,{checkId:r,entityRef:a,entityRoute:n,programId:e,result:l,isVirtualized:!0}),Ue=(e,r,a,l,n)=>({type:"CheckResult",render:()=>De(e,r,a,l,n)}),qe=e=>t.createElement(Ge,{entityRef:e}),Y=e=>({type:"EntityHeader",render:()=>qe(e)}),Je=e=>t.createElement(Ae,{highestLevel:e}),Xe=e=>({type:"LevelBadge",render:()=>Je(e)}),Ye=e=>r=>{const a=e[r.rowIndex].cells[r.columnIndex];return a?t.createElement("div",{style:r.style},a.render()):t.createElement("div",{style:r.style})},v={programTitle:70,levelTitle:30,check:42,entityRefFooter:100},Ze=(e,r,a)=>{const l=[];for(const{program:n,levels:s,highestLevels:i}of e){l.push({height:v.programTitle,cells:[je(n.name),...r.map(o=>{const d=i.find(c=>c.entityRef===o);return Xe(d)})]});for(const o of s){l.push({height:v.levelTitle,cells:[X(o.name),...r.map(d=>X(""))]});for(const{check:d,results:c}of o.checks)l.push({height:v.check,cells:[Qe(d.name,K(c.filter(({result:u})=>u!==k.NotApplicable),"result")),...r.map(u=>{var p,m;return Ue(n.id,d.id,u,(m=(p=c.find(h=>h.entityRef===u))==null?void 0:p.result)!=null?m:k.NotApplicable,a)})]})}}return l.push({height:v.entityRefFooter,cells:[Y(""),...r.map(n=>Y(n||""))]}),l},Z=g(e=>({checkNameCell:{padding:0,backgroundColor:e.palette.background.paper},checkNameContent:{padding:`0 ${e.spacing(2)}px`,display:"flex",justifyContent:"space-between",alignItems:"center"},checkNameTypography:{overflow:"hidden",textOverflow:"ellipsis"},checkIndicator:{flexBasis:e.spacing(8)},checkNameCellVirtualized:{height:`${v.check}px`,lineHeight:`${v.check}px`,borderBottom:`1px solid ${e.palette.divider}`,borderRight:`1px solid ${e.palette.divider}`}})),_e=b(({programId:e,programName:r,check:a,entityRefs:l,results:n,entityRoute:s})=>{const i=Z(),o=O(()=>K(n.filter(({result:c})=>c!==k.NotApplicable),"result"),[n]),d=new Map(n.map(c=>[c.entityRef,c.result]));return t.createElement("tr",{"data-testid":"program-check-row"},t.createElement("th",{scope:"row",className:i.checkNameCell,"aria-label":`${a.name} check for ${r} program`},t.createElement("div",{className:i.checkNameContent},t.createElement(N,{className:i.checkNameTypography,variant:"subtitle2",component:"p"},a.name),t.createElement(D,{className:i.checkIndicator,progress:o}))),l.map((c,u)=>t.createElement(U,{key:u,programId:e,checkId:a.id,entityRef:c,result:typeof c=="string"?d.get(c):void 0,entityRoute:s})))}),et=({name:e,progress:r})=>{const a=Z();return t.createElement("div",{className:a.checkNameCell,"aria-label":`${e} check`},t.createElement("div",{className:`${a.checkNameContent} ${a.checkNameCellVirtualized}`},t.createElement(N,{variant:"subtitle2",component:"p",className:a.checkNameTypography},e),t.createElement(D,{className:a.checkIndicator,progress:r})))},tt=({program:e,highestLevels:r,levels:a,entityRefs:l,entityRoute:n})=>t.createElement("tbody",null,t.createElement(Oe,{program:e,entityRefs:l,highestLevels:r}),a.map((s,i)=>t.createElement(ee,{key:i},t.createElement(Fe,{entityRefs:l,level:s,programName:e.name}),s.checks.map(({check:o,results:d},c)=>t.createElement(_e,{key:c,check:o,programId:e.id,programName:e.name,entityRefs:l,results:d,entityRoute:n}))))),rt=g(e=>({table:{backgroundColor:e.palette.background.paper,borderCollapse:"collapse",whiteSpace:"nowrap","& th, & td":{border:`1px solid ${e.palette.divider}`,borderCollapse:"collapse"},paddingBottom:e.spacing(2)},programTitle:{padding:e.spacing(2)},checkResult:{padding:e.spacing(1.5)},title:{padding:`${e.spacing(1)}px ${e.spacing(2)}px`},header:{backgroundColor:e.palette.type==="dark"?e.palette.grey[700]:e.palette.grey[100]}})),_=()=>{const e=rt(),r=new Array(25).fill(void 0),a=new Array(5).fill(void 0),l=new Array(3).fill(void 0);return t.createElement("table",{className:e.table},t.createElement("tbody",null,t.createElement("tr",null,t.createElement("td",{className:e.programTitle},t.createElement(y,{width:180,height:40})),r.map((n,s)=>t.createElement("td",{key:s}))),l.map((n,s)=>t.createElement(t.Fragment,{key:s},t.createElement("tr",{className:e.header},t.createElement("td",{className:e.title},t.createElement(y,{width:180})),r.map((i,o)=>t.createElement("td",{key:o}))),a.map((i,o)=>t.createElement("tr",{key:o},t.createElement("td",{className:e.title},t.createElement(y,{width:240})),r.map((d,c)=>t.createElement("td",{key:c,className:e.checkResult},t.createElement(y,{width:18,height:18,variant:"rect"})))))))))},at=g(e=>({root:{width:"100%"},table:{overflow:"auto",backgroundColor:e.palette.background.paper,borderCollapse:"collapse",whiteSpace:"nowrap",textAlign:"left","& th, & td":{border:`1px solid ${e.palette.divider}`,borderCollapse:"collapse"},"& th:first-of-type":{position:"sticky",left:0,zIndex:1,maxWidth:"60ch"},"& tfoot":{bottom:0,zIndex:1e3},"& tbody td:first-of-type":{border:`1px solid ${e.palette.divider}`,boxShadow:`1px 0 ${e.palette.background.default}, -1px 0 ${e.palette.background.default}`}}})),lt=b(e=>{const{setError:r,type:a,ownerEntityRef:l}=e,n=at(),s=L(S),{data:i,isLoading:o,isError:d}=Q(l,{type:a});if(C(()=>{r==null||r(d?new Error("Error loading program overview"):void 0)},[d,r]),o)return t.createElement(_,null);if(!i||!l)return null;const{programs:c,entityRefs:u}=i;if(!o&&!c.length)return t.createElement(te,{missing:"data",title:"Missing programs",description:t.createElement(t.Fragment,null,"Looks like the group"," ",z(w(l),{defaultKind:"Group"})," ","doesn't own any ",a," components that have Soundcheck programs set up.",t.createElement("br",null),t.createElement("br",null),"If you're an administrator, you can learn more about configuring and filtering programs in the"," ",t.createElement(T,{to:"https://www.npmjs.com/package/@spotify/backstage-plugin-soundcheck-backend#entity-filter"},"docs"),".")});if(d)return null;const p=u.length>=25?u:[...u,...Array.from({length:25-u.length},()=>{})];return t.createElement("div",{className:n.root},t.createElement("table",{className:n.table,"aria-label":"Check results"},c.map(({program:m,levels:h,highestLevels:f},R)=>t.createElement(tt,{key:R,program:m,entityRefs:p,levels:h,highestLevels:f,entityRoute:s})),t.createElement(We,{entityRefs:p})))}),nt=g(e=>({table:{backgroundColor:e.palette.background.paper,borderCollapse:"collapse",whiteSpace:"nowrap",textAlign:"left"}})),ot=e=>{let r=0;return e.forEach(a=>{r+=a.height}),r},A={programTitle:350,checkResult:42},it=e=>e*A.checkResult+A.programTitle,st=e=>{const{setError:r,type:a,ownerEntityRef:l}=e,n=nt(),s=L(S),{data:i,isLoading:o,isError:d}=Q(l,{type:a});if(C(()=>{r==null||r(d?new Error("Error loading program overview"):void 0)},[d,r]),o)return t.createElement(_,null);if(!i||!l)return null;const{programs:c,entityRefs:u}=i,p=u.length>=25?u:[...u,...Array.from({length:25-u.length},()=>{})],m=Ze(c,p,s),h=Ye(m);return t.createElement(ve,{className:n.table,columnCount:p.length+1,columnWidth:f=>f===0?A.programTitle:A.checkResult,rowCount:m.length,rowHeight:f=>m[f].height,height:ot(m),width:it(p.length)},h)},ct=g(e=>({tableContainer:{padding:e.spacing(3),backgroundColor:"transparent"},scrollContainer:{overflow:"scroll",height:`calc(100vh - 86px - 68px - ${e.spacing(3)*2}px)`}})),pt=(e,r,a,l,n,s)=>{var i;if(((i=e==null?void 0:e.types)==null?void 0:i.length)<1)return t.createElement(me,{ownerEntityRef:r});if(a)return t.createElement(ue,{severity:"error",title:a.message});if(s){const o=[];if(e&&e.types)for(let d=0;d<e.types.length;d++){const c=e.types[d].value;o.push(t.createElement(I,{"aria-label":`Check results for ${c}`,key:c,item:!0,xs:12,style:c===l?{}:{display:"none"}},t.createElement(st,{ownerEntityRef:r,type:c,setError:n})))}return t.createElement("div",null,o)}return t.createElement(lt,{ownerEntityRef:r,type:l,setError:n})},dt=({useVirtualizedResultsTable:e})=>{const[r,a]=Ce(),{group:l,type:n}=r,[s,i]=x(void 0),[o,d]=x(void 0),{data:c,isLoading:u}=Ee(l),p=s||o,m=E=>{E&&a({...r,group:E})},h=E=>{E&&a({...r,type:E})},f=ct(),R=pt(c,l,p,n,d,e);return t.createElement(re,{themeId:"website"},t.createElement(ne,{backend:"soundcheck",invalidLicenseMessage:"Submitted check results will still be stored, but it will not be possible to view certifications or individual results until a valid license is present."}),t.createElement(ae,{title:"Soundcheck"},t.createElement(Re,{onChange:m,initialValue:l,setError:i})),t.createElement(le,{noPadding:!0,stretch:!0},t.createElement(I,{container:!0,spacing:0},t.createElement(I,{item:!0,xs:12},u?t.createElement($e,null):t.createElement(Te,{unfilteredFacets:c,type:n,onChange:h})),t.createElement(I,{item:!0,xs:12,className:f.tableContainer},t.createElement("div",{className:f.scrollContainer},R)))))},mt=e=>t.createElement(de,null,t.createElement(dt,{useVirtualizedResultsTable:e}));export{mt as overviewPage};
2
+ //# sourceMappingURL=index-41e242ce.esm.js.map
@@ -0,0 +1,161 @@
1
+ import{createApiRef as F,createRouteRef as y,createSubRouteRef as R,createPlugin as S,createApiFactory as D,discoveryApiRef as $,fetchApiRef as E,createRoutableExtension as w,createComponentExtension as A,useApi as P,configApiRef as I}from"@backstage/core-plugin-api";import{GraphQLClient as q}from"graphql-request";import o from"graphql-tag";var L=(e=>(e.Medal="MEDAL",e))(L||{}),k=(e=>(e.Failed="FAILED",e.NotApplicable="NOT_APPLICABLE",e.NotReported="NOT_REPORTED",e.Passed="PASSED",e))(k||{});const M=o`
2
+ fragment CertificationSummary on Certification {
3
+ entityRef
4
+ program {
5
+ id
6
+ name
7
+ }
8
+ highestLevel {
9
+ ordinal
10
+ name
11
+ description
12
+ badge {
13
+ ... on BadgeVariantMedal {
14
+ variant
15
+ options {
16
+ level
17
+ color
18
+ }
19
+ }
20
+ }
21
+ }
22
+ }
23
+ `,b=o`
24
+ fragment CheckResultSummary on CheckResult {
25
+ id
26
+ name
27
+ result
28
+ timestamp
29
+ }
30
+ `,B=o`
31
+ fragment CheckResultDetails on CheckResult {
32
+ id
33
+ name
34
+ description
35
+ result
36
+ timestamp
37
+ notes
38
+ }
39
+ `,G=o`
40
+ fragment OverviewLevelResult on OverviewLevelResult {
41
+ ordinal
42
+ name
43
+ checks {
44
+ check {
45
+ id
46
+ name
47
+ }
48
+ results {
49
+ id
50
+ entityRef
51
+ result
52
+ }
53
+ }
54
+ }
55
+ `,W=o`
56
+ fragment HighestLevel on LevelResult {
57
+ entityRef
58
+ ordinal
59
+ name
60
+ badge {
61
+ ... on BadgeVariantMedal {
62
+ variant
63
+ options {
64
+ color
65
+ level
66
+ }
67
+ }
68
+ }
69
+ }
70
+ `,T=o`
71
+ query getAllCertifications($entityRef: String!) {
72
+ certifications(entityRef: $entityRef, includeFilteredChecks: false) {
73
+ ...CertificationSummary
74
+ }
75
+ }
76
+ ${M}`,V=o`
77
+ query getCertificationDetails($entityRef: String!, $programId: String!) {
78
+ programCertification(
79
+ entityRef: $entityRef
80
+ programId: $programId
81
+ includeFilteredChecks: false
82
+ ) {
83
+ program {
84
+ id
85
+ name
86
+ description
87
+ documentationUrl
88
+ }
89
+ highestLevel {
90
+ name
91
+ ordinal
92
+ badge {
93
+ ... on BadgeVariantMedal {
94
+ variant
95
+ options {
96
+ level
97
+ color
98
+ }
99
+ }
100
+ }
101
+ }
102
+ levels {
103
+ ordinal
104
+ name
105
+ description
106
+ badge {
107
+ ... on BadgeVariantMedal {
108
+ variant
109
+ options {
110
+ level
111
+ color
112
+ }
113
+ }
114
+ }
115
+ certified
116
+ checks {
117
+ ...CheckResultSummary
118
+ }
119
+ }
120
+ }
121
+ }
122
+ ${b}`,N=o`
123
+ query getCheckResultDetails($entityRef: String!, $programId: String!, $checkId: String!) {
124
+ checkResult(entityRef: $entityRef, programId: $programId, checkId: $checkId) {
125
+ ...CheckResultDetails
126
+ }
127
+ }
128
+ ${B}`,x=o`
129
+ query getFacetsForOwner($ownerEntityRef: String!) {
130
+ facetsForOwner(ownerEntityRef: $ownerEntityRef) {
131
+ types {
132
+ value
133
+ count
134
+ }
135
+ }
136
+ }
137
+ `,H=o`
138
+ query getProgramOverviewForOwner($ownerEntityRef: String!, $facet: FacetInput) {
139
+ programOverviewForOwner(
140
+ ownerEntityRef: $ownerEntityRef
141
+ facet: $facet
142
+ includeFilteredChecks: false
143
+ ) {
144
+ programs {
145
+ program {
146
+ id
147
+ name
148
+ }
149
+ highestLevels {
150
+ ...HighestLevel
151
+ }
152
+ levels {
153
+ ...OverviewLevelResult
154
+ }
155
+ }
156
+ entityRefs
157
+ }
158
+ }
159
+ ${W}
160
+ ${G}`,z=(e,t,r)=>e();function U(e,t=z){return{getAllCertifications(r,i){return t(n=>e.request(T,r,{...i,...n}),"getAllCertifications","query")},getCertificationDetails(r,i){return t(n=>e.request(V,r,{...i,...n}),"getCertificationDetails","query")},getCheckResultDetails(r,i){return t(n=>e.request(N,r,{...i,...n}),"getCheckResultDetails","query")},getFacetsForOwner(r,i){return t(n=>e.request(x,r,{...i,...n}),"getFacetsForOwner","query")},getProgramOverviewForOwner(r,i){return t(n=>e.request(H,r,{...i,...n}),"getProgramOverviewForOwner","query")}}}var C=(e,t,r)=>{if(!t.has(e))throw TypeError("Cannot "+r)},a=(e,t,r)=>(C(e,t,"read from private field"),r?r.call(e):t.get(e)),l=(e,t,r)=>{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,r)},f=(e,t,r,i)=>(C(e,t,"write to private field"),i?i.call(e,r):t.set(e,r),r),d,h,c,p,s;const O=F({id:"plugin.soundcheck"}),_=e=>"response"in e&&"errors"in e.response,Q=e=>"response"in e&&"message"in e.response;class j{constructor(t){l(this,d,void 0),l(this,h,void 0),l(this,c,void 0),l(this,p,i=>{var n,u,v;return _(i)?(v=(u=(n=i.response)==null?void 0:n.errors)==null?void 0:u[0].message)!=null?v:`${i}`:Q(i)?i.response.message:`${i}`}),l(this,s,async i=>{try{return await i()}catch(n){throw new Error(`Error from Soundcheck backend: ${a(this,p).call(this,n)}`)}}),f(this,d,t.fetchApi),f(this,h,t.discoveryApi);const r=new q("/graphql",{fetch:async(i,n)=>{const u=`${await a(this,h).getBaseUrl("soundcheck")}${i}`;return a(this,d).fetch(u,n)}});f(this,c,U(r))}async getAllCertifications(t){return a(this,s).call(this,async()=>{const{certifications:r}=await a(this,c).getAllCertifications({entityRef:t});return r})}async getCertificationDetails(t,r){return a(this,s).call(this,async()=>{const{programCertification:i}=await a(this,c).getCertificationDetails({entityRef:t,programId:r});return i})}async getCheckResultDetails(t,r,i){return a(this,s).call(this,async()=>{const{checkResult:n}=await a(this,c).getCheckResultDetails({entityRef:t,programId:r,checkId:i});return n})}async getFacetsForOwner(t){return a(this,s).call(this,async()=>{const{facetsForOwner:r}=await a(this,c).getFacetsForOwner({ownerEntityRef:t});return r})}async getProgramOverviewForOwner(t,r){return a(this,s).call(this,async()=>{const{programOverviewForOwner:i}=await a(this,c).getProgramOverviewForOwner({ownerEntityRef:t,facet:r});return i})}}d=new WeakMap,h=new WeakMap,c=new WeakMap,p=new WeakMap,s=new WeakMap;const g=y({id:"soundcheck-entity"}),J=R({id:"soundcheck-entity-certification-program-redirect",parent:g,path:"/:programId"}),K=R({id:"soundcheck-entity-certification",parent:g,path:"/:programId/:checkId"}),X=y({id:"soundcheck-overview"}),m=S({id:"soundcheck",apis:[D({api:O,deps:{discoveryApi:$,fetchApi:E},factory:e=>new j(e)})],routes:{entityContent:g}}),Y=m.provide(w({name:"EntitySoundcheckContent",component:()=>import("./EntitySoundcheckContent-931d8ed8.esm.js").then(e=>e.EntitySoundcheckContent),mountPoint:g})),Z=m.provide(A({name:"EntitySoundcheckCard",component:{lazy:()=>import("./index-0f37ee61.esm.js").then(e=>e.EntitySoundcheckCard)}})),ee=m.provide(w({name:"SoundcheckOverviewPage",component:()=>import("./index-41e242ce.esm.js").then(e=>()=>{var t;return e.overviewPage((t=P(I).getOptionalBoolean("soundcheck.virtualizeOverviewPage"))!=null?t:!1)}),mountPoint:X}));export{Y as E,k as R,ee as S,K as a,m as b,J as c,Z as d,O as s};
161
+ //# sourceMappingURL=index-d6a5b7f6.esm.js.map
package/dist/index.esm.js CHANGED
@@ -1,2 +1,2 @@
1
- import{d as i,E as r,S as a,b as d}from"./esm/index-338d0659.esm.js";import"@backstage/core-plugin-api";import"graphql-request";import"graphql-tag";export{i as EntitySoundcheckCard,r as EntitySoundcheckContent,a as SoundcheckOverviewPage,d as soundcheckPlugin};
1
+ import{d as i,E as r,S as a,b as d}from"./esm/index/index-d6a5b7f6.esm.js";import"@backstage/core-plugin-api";import"graphql-request";import"graphql-tag";export{i as EntitySoundcheckCard,r as EntitySoundcheckContent,a as SoundcheckOverviewPage,d as soundcheckPlugin};
2
2
  //# sourceMappingURL=index.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.2.1",
4
+ "version": "0.4.0",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "homepage": "https://backstage.spotify.com/",
7
7
  "main": "dist/index.esm.js",
@@ -26,51 +26,56 @@
26
26
  "prepare": "yarn generate"
27
27
  },
28
28
  "dependencies": {
29
- "@backstage/catalog-model": "^1.1.5",
30
- "@backstage/core-components": "^0.12.3",
31
- "@backstage/core-plugin-api": "^1.3.0",
32
- "@backstage/plugin-catalog-react": "^1.2.4",
33
- "@backstage/theme": "^0.2.16",
29
+ "@backstage/catalog-model": "^1.2.1",
30
+ "@backstage/core-components": "^0.12.5",
31
+ "@backstage/core-plugin-api": "^1.5.0",
32
+ "@backstage/plugin-catalog-react": "^1.4.0",
33
+ "@backstage/theme": "^0.2.18",
34
34
  "@backstage/types": "^1.0.2",
35
- "@material-ui/core": "^4.9.13",
35
+ "@material-ui/core": "^4.12.2",
36
36
  "@material-ui/icons": "^4.9.1",
37
37
  "@material-ui/lab": "4.0.0-alpha.61",
38
- "@spotify/backstage-plugin-core": "^0.3.1",
38
+ "@spotify/backstage-plugin-core": "^0.5.0",
39
39
  "@tanstack/react-query": "^4.6.1",
40
40
  "classnames": "^2.3.2",
41
- "graphql-request": "^5.0.0",
41
+ "graphql-request": "5.1.0",
42
42
  "lodash": "^4.17.21",
43
43
  "luxon": "^3.1.1",
44
44
  "react-confetti": "^6.1.0",
45
- "react-use": "^17.2.4"
45
+ "react-use": "^17.2.4",
46
+ "react-window": "^1.8.8"
46
47
  },
47
48
  "peerDependencies": {
48
49
  "react": "^16.13.1 || ^17.0.0",
49
50
  "react-router-dom": "6.0.0-beta.0 || ^6.3.0"
50
51
  },
51
52
  "devDependencies": {
52
- "@backstage/cli": "^0.22.1",
53
- "@backstage/core-app-api": "^1.4.0",
54
- "@backstage/dev-utils": "^1.0.11",
55
- "@backstage/test-utils": "^1.2.4",
56
- "@graphql-codegen/cli": "^2.13.1",
57
- "@graphql-codegen/typescript": "^2.7.3",
53
+ "@backstage/cli": "^0.22.4",
54
+ "@backstage/core-app-api": "^1.6.0",
55
+ "@backstage/dev-utils": "^1.0.13",
56
+ "@backstage/test-utils": "^1.2.6",
57
+ "@graphql-codegen/cli": "^3.0.0",
58
+ "@graphql-codegen/typescript": "^3.0.0",
58
59
  "@graphql-codegen/typescript-graphql-request": "^4.5.5",
59
- "@graphql-codegen/typescript-operations": "^2.5.3",
60
- "@spotify/backstage-plugin-core-common": "^0.3.0",
61
- "@spotify/backstage-plugin-soundcheck-common": "^0.2.0",
60
+ "@graphql-codegen/typescript-operations": "^3.0.0",
61
+ "@spotify/backstage-plugin-core-common": "^0.5.0",
62
+ "@spotify/backstage-plugin-soundcheck-common": "^0.4.0",
62
63
  "@testing-library/jest-dom": "^5.10.1",
63
- "@testing-library/react": "^12.1.3",
64
+ "@testing-library/react": "^12.1.5",
64
65
  "@testing-library/react-hooks": "^8.0.1",
65
66
  "@testing-library/user-event": "^14.0.0",
66
- "@types/jest": "*",
67
+ "@types/jest": "^29.4.0",
67
68
  "@types/luxon": "^3.0.1",
68
- "@types/node": "*",
69
+ "@types/node": "^16.18.11",
70
+ "@types/react-window": "^1.8.5",
69
71
  "cross-fetch": "^3.1.5",
70
- "msw": "^0.49.0"
72
+ "msw": "^1.0.0"
71
73
  },
72
74
  "files": [
73
75
  "dist",
74
- "!dist/**/*.map"
75
- ]
76
+ "!dist/**/*.map",
77
+ "config.d.ts"
78
+ ],
79
+ "configSchema": "config.d.ts",
80
+ "module": "./dist/index.esm.js"
76
81
  }
@@ -1,2 +0,0 @@
1
- import{stringifyEntityRef as y}from"@backstage/catalog-model";import{useApi as v,useRouteRef as B}from"@backstage/core-plugin-api";import{useQuery as b}from"@tanstack/react-query";import{s as k,a as I}from"./index-338d0659.esm.js";import t from"react";import{makeStyles as d,Tooltip as D,Typography as r,alpha as p,Box as F}from"@material-ui/core";import{useEntity as _}from"@backstage/plugin-catalog-react";import{Link as U}from"react-router-dom";import{useAutoUpdatingRelativeTime as W}from"@spotify/backstage-plugin-core";import G from"@material-ui/icons/Schedule";import{DateTime as S}from"luxon";import H from"classnames";import{C as j,L as N,N as M,F as E,A as O}from"./SoundcheckQueryClientProvider-4f7596d6.esm.js";import{Skeleton as c}from"@material-ui/lab";import{Link as P}from"@backstage/core-components";function Q(e){const a=v(k),n=y(e);return b(["soundcheck/certifications",n],async()=>a.getAllCertifications(n))}function C(e,a){const n=v(k),l=y(e);return b(["soundcheck/certifications",l,a],async()=>n.getCertificationDetails(l,a),{enabled:!!a})}const q=d(e=>({root:{display:"inline-flex",alignItems:"center",gap:e.spacing(1)}})),T=({timestamp:e,description:a})=>{const n=q(),l=S.fromISO(e).toLocaleString(S.DATETIME_FULL),i=W(e),o=a?`${a}: ${i}`:void 0;return t.createElement("div",{className:n.root},t.createElement(D,{title:l},t.createElement(r,{variant:"caption","aria-label":o},i)),t.createElement(G,null))},h=d(e=>({root:{display:"grid",width:"100%",gridTemplateColumns:"auto 1fr auto",gridColumnGap:e.spacing(1),padding:e.spacing(1),alignItems:"center","&.selected":{backgroundColor:p(e.palette.primary[e.palette.type],.2)},"&:hover, &:active, &:focus":{backgroundColor:p(e.palette.primary[e.palette.type],.3)}}})),J=({className:e,href:a,children:n})=>a?t.createElement(U,{to:a,className:e},n):t.createElement("div",{className:e},n),K=({result:e,name:a,timestamp:n,selected:l=!1,href:i})=>{const o=h(),g=H(o.root,{selected:l});return t.createElement(J,{href:i,className:g},t.createElement(j,{result:e}),t.createElement(r,{variant:"body2"},a),n?t.createElement(T,{timestamp:n}):null)},L=d(e=>{const a=e.palette.type==="dark"?e.palette.grey[700]:e.palette.grey[100];return{wrapper:{backgroundColor:a,color:p(e.palette.getContrastText(a),.7),fontSize:e.typography.caption.fontSize,minHeight:"auto",borderTop:`1px solid ${e.palette.divider}`,borderBottom:`1px solid ${e.palette.divider}`,padding:e.spacing(1),display:"grid",gridTemplateAreas:({badge:n})=>[`"${n?"badge":"title"} title"`,`"${n?".":"description"} description"`].join(" "),gridTemplateColumns:"auto 1fr"},title:{gridArea:"title",textTransform:"uppercase",fontWeight:"bold",color:p(e.palette.getContrastText(a),.7),fontSize:e.typography.body2.fontSize,paddingTop:e.spacing(.5),paddingBottom:e.spacing(.5),lineHeight:1},badge:{gridArea:"badge",marginRight:e.spacing(1)},description:{gridArea:"description",color:p(e.palette.getContrastText(a),.7),fontSize:e.typography.subtitle2.fontSize,marginTop:e.spacing(1)}}}),V=e=>{const a=L({badge:e.badge});return t.createElement("div",{className:a.wrapper},e.badge?t.createElement(N,{className:a.badge,badge:e.badge}):null,t.createElement(r,{className:a.title},e.title),e.description?t.createElement(r,{className:a.description},e.description):null)},x=d(e=>({root:{padding:e.spacing(2),margin:0,display:"grid",gridTemplateColumns:"min-content auto",gridGap:e.spacing(2)},title:{fontSize:e.typography.pxToRem(18)},level:{textTransform:"uppercase",color:e.palette.text.secondary,fontWeight:700,letterSpacing:"1px"}}));function X({description:e,documentationUrl:a}){return a?t.createElement(r,{variant:"body2"},e," ",t.createElement(P,{to:a},"Learn more")):t.createElement(r,{variant:"body2"},e)}const A=({name:e,level:a,badge:n,description:l,documentationUrl:i})=>{const o=x();return t.createElement("div",{className:o.root},n?t.createElement(N,{size:"large",badge:n}):t.createElement(M,{size:"large"}),t.createElement("div",null,t.createElement(r,{variant:"caption",className:o.level},a??"No Level"),t.createElement(r,{variant:"h4",className:o.title},e),l&&t.createElement(X,{description:l,documentationUrl:i})))},R=({hideDescription:e=!1})=>{const a=x();return t.createElement(E,null,t.createElement("div",{className:a.root},t.createElement(c,{width:44,height:44}),t.createElement("div",null,t.createElement(r,{variant:"caption",className:a.level},t.createElement(c,{width:100})),t.createElement(r,{variant:"h4",className:a.title},t.createElement(c,{width:300})),!e&&t.createElement(r,{variant:"body2"},t.createElement(c,null)))))},Y=()=>{const e=L({});return t.createElement(E,null,t.createElement("div",{className:e.wrapper},t.createElement(c,{className:e.title}),t.createElement(r,{className:e.description},t.createElement(c,null))))},f=()=>{const e=h();return t.createElement(E,null,t.createElement("div",{className:e.root},t.createElement(c,{width:24,height:24}),t.createElement(r,{variant:"body2"},t.createElement(c,null)),t.createElement(c,{width:100,height:24})))},Z=()=>{const e=$();return t.createElement("div",{className:e.root},t.createElement(R,null),new Array(3).fill(null).map((a,n)=>t.createElement(t.Fragment,{key:`skeleton-level-${n}`},t.createElement(Y,null),t.createElement("ul",{className:e.checks},t.createElement(f,null),t.createElement(f,null),t.createElement(f,null)))))},$=d(e=>({root:{borderRight:`1px solid ${e.palette.divider}`},checks:{padding:0,margin:0,flex:1,listStyle:"none"},checkItem:{borderBottom:`1px solid ${e.palette.divider}`,"&:last-of-type":{borderBottom:"0"}}})),ee=({programId:e,checkId:a})=>{var n,l;const i=$(),{entity:o}=_(),g=B(I),{data:s,isLoading:w,isError:z}=C(o,e);return z?t.createElement("div",{className:i.root},t.createElement(F,{padding:2},t.createElement(O,{severity:"error",title:"Error loading certification"}))):w||!e?t.createElement(Z,null):s?t.createElement("div",{className:i.root},t.createElement(A,{name:s.program.name,level:(n=s.highestLevel)==null?void 0:n.name,badge:(l=s.highestLevel)==null?void 0:l.badge,description:s.program.description,documentationUrl:s.program.documentationUrl}),s?.levels.map(m=>t.createElement(t.Fragment,{key:m.ordinal},t.createElement(V,{key:m.ordinal,badge:m.badge,title:m.name,description:m.description}),t.createElement("ul",{className:i.checks},m.checks.map(u=>t.createElement("li",{key:u.id,className:i.checkItem},t.createElement(K,{...u,selected:u.id===a,href:g({programId:e,checkId:u.id})}))))))):null};export{ee as C,T as R,Q as a,R as b,A as c,C as u};
2
- //# sourceMappingURL=CertificationSidebar-2302311d.esm.js.map
@@ -1,2 +0,0 @@
1
- import e,{useState as I,useEffect as M}from"react";import{Link as W,useParams as O,Routes as Q,Route as y,Navigate as P}from"react-router-dom";import{makeStyles as d,Typography as h,Box as j,Tab as x,Tabs as T,Paper as H,Divider as U}from"@material-ui/core";import{SpotifyLicenseBanner as V}from"@spotify/backstage-plugin-core";import{useEntity as p}from"@backstage/plugin-catalog-react";import{R as Y}from"./RefetchingIndicator-a345c84e.esm.js";import{R as q,u as L,a as k,C as G}from"./CertificationSidebar-2302311d.esm.js";import{Skeleton as s}from"@material-ui/lab";import{MarkdownContent as B}from"@backstage/core-components";import{stringifyEntityRef as J}from"@backstage/catalog-model";import{useApi as K,useRouteRef as C,useRouteRefParams as X}from"@backstage/core-plugin-api";import{useQuery as Z}from"@tanstack/react-query";import{s as ee,R as c,c as v,a as F}from"./index-338d0659.esm.js";import{A as b,F as A,L as te,N as ne,a as ae,S as re}from"./SoundcheckQueryClientProvider-4f7596d6.esm.js";import ie from"react-use/lib/useMeasure";import D from"react-use/lib/usePrevious";import le from"react-confetti";import"react-use/lib/useDebounce";import"@material-ui/icons/Schedule";import"luxon";import"classnames";import"graphql-request";import"graphql-tag";import"@material-ui/icons/Check";import"@material-ui/icons/Close";import"@material-ui/icons/RemoveCircleOutline";import"@material-ui/icons/HelpOutline";import"lodash";function oe(t,a,n){const r=K(ee),i=J(t);return Z(["soundcheck/check-details",i,a,n],async()=>r.getCheckResultDetails(i,a,n),{enabled:!!a&&!!n})}const se=d({markdownContent:{"& :last-child":{marginBottom:0}}}),ce=({state:t,notes:a})=>{const n=se(),r={[c.Passed]:"success",[c.Failed]:"error",[c.NotReported]:"info",[c.NotApplicable]:"info"}[t],i={[c.Passed]:"Check passed",[c.Failed]:"Check did not pass",[c.NotReported]:"Check not reported",[c.NotApplicable]:"Check not applicable"}[t];return e.createElement(b,{severity:r,title:i},a?e.createElement(B,{className:n.markdownContent,content:a}):null)},me=()=>{const t=$();return e.createElement(A,null,e.createElement("div",{className:t.root,"data-testid":"check-details-view"},e.createElement("div",{className:t.topBar},e.createElement(h,{variant:"h2",className:t.title},e.createElement(s,{width:300,height:32})),e.createElement(s,{width:100,height:32})),e.createElement(s,{variant:"rect",height:120}),e.createElement("div",{"data-testid":"soundcheck-check-details-description"},e.createElement(h,{variant:"h3"},e.createElement(s,null)),e.createElement(s,null),e.createElement(s,null),e.createElement(s,null))))},$=d(t=>({root:{padding:`${t.spacing(3)}px ${t.spacing(5)}px`},title:{fontWeight:"normal",fontSize:t.typography.h5.fontSize},description:{padding:`${t.spacing(3)}px 0`},subtitle:{fontWeight:"normal",fontSize:t.typography.h6.fontSize},topBar:{display:"flex",justifyContent:"space-between",marginBottom:t.spacing(2)}})),ue=({programId:t,checkId:a})=>{const n=$(),{entity:r}=p(),{data:i,isLoading:l,isError:o}=oe(r,t,a);if(o)return e.createElement(j,{padding:2},e.createElement(b,{severity:"error",title:"Error loading check details"}));if(l||!t||!a)return e.createElement(me,null);if(!i)return null;const{name:f,description:u,result:g,timestamp:m,notes:E}=i;return e.createElement("div",{className:n.root,"data-testid":"check-details-view"},e.createElement("div",{className:n.topBar},e.createElement(h,{variant:"h2",className:n.title},f),m?e.createElement(q,{timestamp:m,description:"Last updated"}):null),e.createElement(ce,{state:g,notes:E}),e.createElement("div",{className:n.description,"data-testid":"soundcheck-check-details-description"},e.createElement(h,{variant:"h3",className:n.subtitle},"Description"),e.createElement(B,{content:u})))},de=d(()=>({root:{position:"absolute",width:"100%",height:"100%"}})),pe=({programId:t})=>{var a,n;const r=de(),{entity:i}=p(),{data:l,isLoading:o}=L(i,t),[f,{width:u,height:g}]=ie(),m=o?void 0:(n=(a=l?.highestLevel)==null?void 0:a.ordinal)!=null?n:-1,E=D(m),S=D(t),[z,N]=I(!1);return M(()=>{typeof E<"u"&&typeof m<"u"&&t===S&&m>E&&N(!0)},[m,E,t,S]),z?e.createElement("div",{ref:f,className:r.root},e.createElement(le,{width:u,height:g,numberOfPieces:1e3,gravity:1,initialVelocityY:20,recycle:!1,onConfettiComplete:()=>N(!1)})):null},_=d(t=>({root:{maxWidth:"80ch",textTransform:"uppercase",paddingTop:t.spacing(2),paddingBottom:t.spacing(2)},wrapper:{display:"inline-block",textOverflow:"ellipsis",whiteSpace:"nowrap",overflow:"hidden"},badge:{marginRight:t.spacing(1)}})),fe=({id:t,name:a,badge:n,href:r,selected:i=!1})=>{const l=_();return e.createElement(x,{className:l.root,classes:{wrapper:l.wrapper},value:t,label:e.createElement(e.Fragment,null,n?e.createElement(te,{badge:n,className:l.badge}):e.createElement(ne,{className:l.badge}),a),component:W,to:r,selected:i})},R=()=>{const t=_();return e.createElement(x,{className:t.root,classes:{wrapper:t.wrapper},label:e.createElement(s,{width:180})})},Ee=()=>e.createElement(A,null,e.createElement(T,{value:!1,indicatorColor:"primary"},e.createElement(R,null),e.createElement(R,null),e.createElement(R,null)));function he(t=[],a){const n=t.findIndex(r=>r.program.id===a);return n<0?!1:n}const ve=({programId:t})=>{const{entity:a}=p(),{isLoading:n,data:r}=k(a),i=C(v);if(n||!t)return e.createElement(Ee,null);const l=he(r,t);return e.createElement(T,{value:l,indicatorColor:"primary","aria-label":"Certifications",variant:"scrollable"},r&&r.map(({program:{id:o,name:f},highestLevel:u})=>e.createElement(fe,{key:o,id:o,name:f,badge:u?.badge,selected:o===t,href:i({programId:o})})))},ge=d({paper:{overflow:"hidden",position:"relative"},view:{display:"grid",gridTemplateColumns:"1fr 2fr"}}),ye=()=>{const{programId:t,checkId:a}=O(),n=ge(),{entity:r}=p(),{isError:i,isFetched:l,data:o}=k(r);return i?e.createElement(b,{severity:"error",title:"Error loading certifications"}):l&&!o?.length?e.createElement(ae,null):e.createElement(H,{className:n.paper},e.createElement(Y,null),e.createElement(ve,{programId:t}),e.createElement(U,null),e.createElement("div",{"data-testid":"soundcheck-certification-view",className:n.view},e.createElement(G,{programId:t,checkId:a}),e.createElement(ue,{programId:t,checkId:a}),e.createElement(pe,{programId:t})))},ke=d(t=>({root:{"&:not(:first-child)":{marginTop:t.spacing(2)}}})),w=()=>{const t=ke();return e.createElement(e.Fragment,null,e.createElement(V,{backend:"soundcheck",invalidLicenseMessage:"Submitted check results will still be stored, but it will not be possible to view certifications or individual results until a valid license is present.",inline:!0}),e.createElement("div",{className:t.root},e.createElement(ye,null)))},Ce=()=>{var t;const{entity:a}=p(),n=C(v),{data:r}=k(a),i=(t=r?.[0])==null?void 0:t.program.id;return i?e.createElement(P,{to:n({programId:i}),replace:!0}):null},be=()=>{var t,a;const{entity:n}=p(),{programId:r}=X(v),i=C(F),{data:l}=L(n,r),o=(a=(t=l?.levels[0])==null?void 0:t.checks[0])==null?void 0:a.id;return o?e.createElement(P,{to:i({programId:r,checkId:o}),replace:!0}):null},Re=()=>e.createElement(Q,null,e.createElement(y,{path:"/",element:e.createElement(e.Fragment,null,e.createElement(w,null),e.createElement(Ce,null))}),e.createElement(y,{path:v.path,element:e.createElement(e.Fragment,null,e.createElement(w,null),e.createElement(be,null))}),e.createElement(y,{path:F.path,element:e.createElement(w,null)})),we=()=>e.createElement(re,null,e.createElement(Re,null));export{we as EntitySoundcheckContent};
2
- //# sourceMappingURL=EntitySoundcheckContent-75f7b6be.esm.js.map
@@ -1,2 +0,0 @@
1
- import t,{useState as n}from"react";import{makeStyles as s,LinearProgress as a}from"@material-ui/core";import m from"react-use/lib/useDebounce";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import{useIsFetching as c}from"@tanstack/react-query";import"./index-338d0659.esm.js";import"@backstage/plugin-catalog-react";import"react-router-dom";import{F as d}from"./SoundcheckQueryClientProvider-4f7596d6.esm.js";const l=s(e=>({indicator:{position:"absolute",width:"100%",zIndex:e.zIndex.speedDial}})),p=()=>{const e=c(),i=l(),[r,o]=n(!!e);return m(()=>{o(!!e)},250,[e]),r?t.createElement(d,null,t.createElement("div",{className:i.indicator},t.createElement(a,{variant:"indeterminate","data-testid":"refetching-indicator"}))):null};export{p as R};
2
- //# sourceMappingURL=RefetchingIndicator-a345c84e.esm.js.map
@@ -1,2 +0,0 @@
1
- import r,{useState as u,useEffect as f}from"react";import{Fade as h,withStyles as s,makeStyles as l,Typography as y}from"@material-ui/core";import b from"@material-ui/icons/Check";import g from"@material-ui/icons/Close";import E from"@material-ui/icons/RemoveCircleOutline";import C from"@material-ui/icons/HelpOutline";import{R as n}from"./index-338d0659.esm.js";import i from"classnames";import{Alert as S}from"@material-ui/lab";import{EmptyState as m}from"@backstage/core-components";import{humanizeEntityRef as N}from"@backstage/plugin-catalog-react";import{parseEntityRef as v}from"@backstage/catalog-model";import{QueryClient as x,QueryClientProvider as I}from"@tanstack/react-query";import{memoize as k}from"lodash";import{useApi as A,errorApiRef as F}from"@backstage/core-plugin-api";const R=({children:e})=>{const[t,o]=u(!1);return f(()=>{const a=setTimeout(()=>{o(!0)},250);return()=>clearTimeout(a)},[]),r.createElement(h,{in:t,timeout:250},e)},T=e=>({[n.Passed]:"Check passed",[n.NotReported]:"Check not reported",[n.Failed]:"Check failed",[n.NotApplicable]:"Check not applicable"})[e],w=s(e=>({root:{color:e.palette.success.main}}))(b),$=s(e=>({root:{color:e.palette.error.main}}))(g),B=s(e=>({root:{color:e.palette.info.main}}))(C),P=s(e=>({root:{color:e.palette.text.disabled}}))(E),L=({result:e,className:t})=>{const o={className:t,"aria-label":T(e),"aria-hidden":!1};return e===n.Passed?r.createElement(w,{...o}):e===n.NotReported?r.createElement(B,{...o}):e===n.Failed?r.createElement($,{...o}):e===n.NotApplicable?r.createElement(P,{...o}):null},p=24,O=11,c=e=>e==="small"?1:2,D=l({root:{position:"relative",display:"inline-flex",alignItems:"center",justifyContent:"center",borderRadius:"50%",borderWidth:"2px",fontWeight:700,width:({size:e})=>`${p*c(e)}px`,height:({size:e})=>`${p*c(e)}px`,fontSize:({size:e})=>`${O*c(e)}px`}}),d=({className:e,label:t,size:o="small"})=>{const a=D({size:o});return r.createElement("span",{className:i(e,a.root),role:"img","aria-label":`${t} badge`},t)},M=l(e=>({root:{background:({color:t})=>t,color:({color:t})=>e.palette.getContrastText(t),borderColor:e.palette.common.black,borderStyle:"solid","&::after":{position:"absolute",display:"block",content:'""',top:0,left:0,width:"100%",height:"100%",borderRadius:"50%",boxShadow:["inset 0 -0.18em 0 0 rgba(0, 0, 0, 0.25)","inset 0px 0.18em 0px 0px rgba(255, 255, 255, 0.5)","inset 0px 1.3em 0px -0.5em rgba(255, 255, 255, 0.2)"].join(",")}}})),W=({className:e,badge:t,size:o="small"})=>{const a=M({color:t.options.color,size:o});return r.createElement(d,{className:i(e,a.root),size:o,label:`L${t.options.level}`})},q=l({root:{borderColor:"currentColor",borderStyle:"dashed"}}),G=({className:e,size:t="small"})=>{const o=q();return r.createElement(d,{className:i(e,o.root),size:t,label:"NL"})},Q=l(e=>({root:{padding:e.spacing(3)},icon:{display:"none"},message:{padding:0},type:{fontWeight:700}})),_=e=>{const{type:t,...o}=Q();return r.createElement(S,{severity:e.severity,elevation:1,classes:o},r.createElement(y,{variant:"subtitle1",classes:{root:t}},e.title),e.children)},j=({className:e})=>r.createElement("div",{className:e},r.createElement(m,{title:"No certifications available",missing:"data",description:"There are no programs configured that apply to this entity."})),z=({ownerEntityRef:e})=>e?r.createElement(m,{missing:"data",title:"Missing entities",description:r.createElement(r.Fragment,null,"Looks like the group"," ",N(v(e),{defaultKind:"Group"})," ","doesn't own any entities.",r.createElement("br",null),r.createElement("br",null),"Please select another group from the dropdown in the corner of the header.")}):null,Z=k(e=>new x({defaultOptions:{queries:{refetchInterval:6e4,refetchIntervalInBackground:!1,refetchOnWindowFocus:"always",retry:2,retryDelay:t=>{const o=450+Math.ceil(Math.random()*100);return Math.min(o*2**t,3e4)},onError:t=>e.post(t)}}})),H=e=>{const t=A(F),o=Z(t);return r.createElement(I,{client:o},e.children)};export{_ as A,L as C,R as F,W as L,G as N,H as S,j as a,z as b};
2
- //# sourceMappingURL=SoundcheckQueryClientProvider-4f7596d6.esm.js.map
@@ -1,161 +0,0 @@
1
- import{createApiRef as O,createRouteRef as y,createSubRouteRef as R,createPlugin as D,createApiFactory as E,discoveryApiRef as S,fetchApiRef as $,createRoutableExtension as k,createComponentExtension as A}from"@backstage/core-plugin-api";import{GraphQLClient as _}from"graphql-request";import o from"graphql-tag";var w=(e=>(e.Failed="FAILED",e.NotApplicable="NOT_APPLICABLE",e.NotReported="NOT_REPORTED",e.Passed="PASSED",e))(w||{});const P=o`
2
- fragment CertificationSummary on Certification {
3
- entityRef
4
- program {
5
- id
6
- name
7
- }
8
- highestLevel {
9
- ordinal
10
- name
11
- description
12
- badge {
13
- ... on BadgeVariantMedal {
14
- variant
15
- options {
16
- level
17
- color
18
- }
19
- }
20
- }
21
- }
22
- }
23
- `,L=o`
24
- fragment CheckResultSummary on CheckResult {
25
- id
26
- name
27
- result
28
- timestamp
29
- }
30
- `,q=o`
31
- fragment CheckResultDetails on CheckResult {
32
- id
33
- name
34
- description
35
- result
36
- timestamp
37
- notes
38
- }
39
- `,I=o`
40
- fragment OverviewLevelResult on OverviewLevelResult {
41
- ordinal
42
- name
43
- checks {
44
- check {
45
- id
46
- name
47
- }
48
- results {
49
- id
50
- entityRef
51
- result
52
- }
53
- }
54
- }
55
- `,M=o`
56
- fragment HighestLevel on LevelResult {
57
- entityRef
58
- ordinal
59
- name
60
- badge {
61
- ... on BadgeVariantMedal {
62
- variant
63
- options {
64
- color
65
- level
66
- }
67
- }
68
- }
69
- }
70
- `,G=o`
71
- query getAllCertifications($entityRef: String!) {
72
- certifications(entityRef: $entityRef, includeFilteredChecks: false) {
73
- ...CertificationSummary
74
- }
75
- }
76
- ${P}`,B=o`
77
- query getCertificationDetails($entityRef: String!, $programId: String!) {
78
- programCertification(
79
- entityRef: $entityRef
80
- programId: $programId
81
- includeFilteredChecks: false
82
- ) {
83
- program {
84
- id
85
- name
86
- description
87
- documentationUrl
88
- }
89
- highestLevel {
90
- name
91
- ordinal
92
- badge {
93
- ... on BadgeVariantMedal {
94
- variant
95
- options {
96
- level
97
- color
98
- }
99
- }
100
- }
101
- }
102
- levels {
103
- ordinal
104
- name
105
- description
106
- badge {
107
- ... on BadgeVariantMedal {
108
- variant
109
- options {
110
- level
111
- color
112
- }
113
- }
114
- }
115
- certified
116
- checks {
117
- ...CheckResultSummary
118
- }
119
- }
120
- }
121
- }
122
- ${L}`,T=o`
123
- query getCheckResultDetails($entityRef: String!, $programId: String!, $checkId: String!) {
124
- checkResult(entityRef: $entityRef, programId: $programId, checkId: $checkId) {
125
- ...CheckResultDetails
126
- }
127
- }
128
- ${q}`,N=o`
129
- query getFacetsForOwner($ownerEntityRef: String!) {
130
- facetsForOwner(ownerEntityRef: $ownerEntityRef) {
131
- types {
132
- value
133
- count
134
- }
135
- }
136
- }
137
- `,x=o`
138
- query getProgramOverviewForOwner($ownerEntityRef: String!, $facet: FacetInput) {
139
- programOverviewForOwner(
140
- ownerEntityRef: $ownerEntityRef
141
- facet: $facet
142
- includeFilteredChecks: false
143
- ) {
144
- programs {
145
- program {
146
- id
147
- name
148
- }
149
- highestLevels {
150
- ...HighestLevel
151
- }
152
- levels {
153
- ...OverviewLevelResult
154
- }
155
- }
156
- entityRefs
157
- }
158
- }
159
- ${M}
160
- ${I}`,V=(e,r,t)=>e();function H(e,r=V){return{getAllCertifications(t,n){return r(i=>e.request(G,t,{...n,...i}),"getAllCertifications","query")},getCertificationDetails(t,n){return r(i=>e.request(B,t,{...n,...i}),"getCertificationDetails","query")},getCheckResultDetails(t,n){return r(i=>e.request(T,t,{...n,...i}),"getCheckResultDetails","query")},getFacetsForOwner(t,n){return r(i=>e.request(N,t,{...n,...i}),"getFacetsForOwner","query")},getProgramOverviewForOwner(t,n){return r(i=>e.request(x,t,{...n,...i}),"getProgramOverviewForOwner","query")}}}var C=(e,r,t)=>{if(!r.has(e))throw TypeError("Cannot "+t)},a=(e,r,t)=>(C(e,r,"read from private field"),t?t.call(e):r.get(e)),l=(e,r,t)=>{if(r.has(e))throw TypeError("Cannot add the same private member more than once");r instanceof WeakSet?r.add(e):r.set(e,t)},m=(e,r,t,n)=>(C(e,r,"write to private field"),n?n.call(e,t):r.set(e,t),t),d,h,c,p,s;const F=O({id:"plugin.soundcheck"}),Q=e=>"response"in e&&"errors"in e.response,W=e=>"response"in e&&"message"in e.response;class U{constructor(r){l(this,d,void 0),l(this,h,void 0),l(this,c,void 0),l(this,p,n=>{var i,u,v;return Q(n)?(v=(u=(i=n.response)==null?void 0:i.errors)==null?void 0:u[0].message)!=null?v:`${n}`:W(n)?n.response.message:`${n}`}),l(this,s,async n=>{try{return await n()}catch(i){throw new Error(`Error from Soundcheck backend: ${a(this,p).call(this,i)}`)}}),m(this,d,r.fetchApi),m(this,h,r.discoveryApi);const t=new _("/graphql",{fetch:async(n,i)=>{const u=`${await a(this,h).getBaseUrl("soundcheck")}${n}`;return a(this,d).fetch(u,i)}});m(this,c,H(t))}async getAllCertifications(r){return a(this,s).call(this,async()=>{const{certifications:t}=await a(this,c).getAllCertifications({entityRef:r});return t})}async getCertificationDetails(r,t){return a(this,s).call(this,async()=>{const{programCertification:n}=await a(this,c).getCertificationDetails({entityRef:r,programId:t});return n})}async getCheckResultDetails(r,t,n){return a(this,s).call(this,async()=>{const{checkResult:i}=await a(this,c).getCheckResultDetails({entityRef:r,programId:t,checkId:n});return i})}async getFacetsForOwner(r){return a(this,s).call(this,async()=>{const{facetsForOwner:t}=await a(this,c).getFacetsForOwner({ownerEntityRef:r});return t})}async getProgramOverviewForOwner(r,t){return a(this,s).call(this,async()=>{const{programOverviewForOwner:n}=await a(this,c).getProgramOverviewForOwner({ownerEntityRef:r,facet:t});return n})}}d=new WeakMap,h=new WeakMap,c=new WeakMap,p=new WeakMap,s=new WeakMap;const g=y({id:"soundcheck-entity"}),z=R({id:"soundcheck-entity-certification-program-redirect",parent:g,path:"/:programId"}),b=R({id:"soundcheck-entity-certification",parent:g,path:"/:programId/:checkId"}),J=y({id:"soundcheck-overview"}),f=D({id:"soundcheck",apis:[E({api:F,deps:{discoveryApi:S,fetchApi:$},factory:e=>new U(e)})],routes:{entityContent:g}}),K=f.provide(k({name:"EntitySoundcheckContent",component:()=>import("./EntitySoundcheckContent-75f7b6be.esm.js").then(e=>e.EntitySoundcheckContent),mountPoint:g})),X=f.provide(A({name:"EntitySoundcheckCard",component:{lazy:()=>import("./index-afed4896.esm.js").then(e=>e.EntitySoundcheckCard)}})),Y=f.provide(k({name:"SoundcheckOverviewPage",component:()=>import("./index-f59e3aca.esm.js").then(e=>e.OverviewPage),mountPoint:J}));export{K as E,w as R,Y as S,b as a,f as b,z as c,X as d,F as s};
161
- //# sourceMappingURL=index-338d0659.esm.js.map
@@ -1,2 +0,0 @@
1
- import t,{useState as C,useEffect as v,useMemo as N,useCallback as T,memo as b,Fragment as j}from"react";import{HeaderTabs as A,Link as I,EmptyState as M,Page as z,Header as H,Content as D}from"@backstage/core-components";import{SpotifyLicenseBanner as K}from"@spotify/backstage-plugin-core";import{makeStyles as g,alpha as O,TextField as Q,CircularProgress as V,Tooltip as U,LinearProgress as q,Typography as P,Grid as R}from"@material-ui/core";import{C as J,L as X,S as Y,b as Z,A as ee}from"./SoundcheckQueryClientProvider-4f7596d6.esm.js";import te from"@material-ui/lab/Autocomplete";import{stringifyEntityRef as L,parseEntityRef as x}from"@backstage/catalog-model";import{useApi as h,identityApiRef as re,useRouteRef as _}from"@backstage/core-plugin-api";import{useQuery as $}from"@tanstack/react-query";import{s as G,R as k}from"./index-338d0659.esm.js";import{catalogApiRef as F,entityRouteRef as B,humanizeEntityRef as W}from"@backstage/plugin-catalog-react";import{useSearchParams as ae}from"react-router-dom";import{Skeleton as E}from"@material-ui/lab";import{R as ne}from"./RefetchingIndicator-a345c84e.esm.js";import{countBy as oe}from"lodash";import"@material-ui/icons/Check";import"@material-ui/icons/Close";import"@material-ui/icons/RemoveCircleOutline";import"@material-ui/icons/HelpOutline";import"classnames";import"graphql-request";import"graphql-tag";import"react-use/lib/useDebounce";function le(e){const a=h(G);return $(["soundcheck/facets-for-owner",e],async()=>a.getFacetsForOwner(e),{enabled:!!e})}function se(e,a){const n=h(G);return $(["soundcheck/program-overview-for-owner",e,a],async()=>n.getProgramOverviewForOwner(e,a),{enabled:!!e&&!!a?.type})}function ie(){const e=h(re),a=h(F);return $(["soundcheck/user-groups-claims"],async()=>{const{ownershipEntityRefs:n}=await e.getBackstageIdentity();return(await a.getEntitiesByRefs({entityRefs:n})).items.filter(o=>o?.kind==="Group").map(o=>{var c,i,d,s;return{name:(s=(d=(i=(c=o.spec)==null?void 0:c.profile)==null?void 0:i.displayName)!=null?d:o.metadata.title)!=null?s:o.metadata.name,ref:L(o)}})})}function ce(){const e=h(F);return $(["soundcheck/all-groups"],async()=>{const{items:a}=await e.getEntities({filter:{kind:"Group"}});return a.filter(n=>n?.kind==="Group").map(n=>{var r,l,o,c;return{name:(c=(o=(l=(r=n.spec)==null?void 0:r.profile)==null?void 0:l.displayName)!=null?o:n.metadata.title)!=null?c:n.metadata.name,ref:L(n)}})})}const de=()=>{const[e,a]=ae(),n=Object.fromEntries(e.entries()),[r,l]=C(n);return v(()=>{a(r,{replace:!0})},[r,a]),[r,l]},pe=()=>{const{data:e,isLoading:a,isError:n}=ie(),{data:r,isLoading:l,isError:o}=ce();return{options:N(()=>{const i=[];return e&&i.push(...e.map(({name:d,ref:s})=>({name:d,ref:s,key:"My Groups"}))),r&&i.push(...r.map(({name:d,ref:s})=>({name:d,ref:s,key:"All Groups"}))),i},[e,r]),isLoading:a||l,isError:n||o}},ue=g(e=>({root:{width:"100%",minWidth:250},textField:{"& $notchedOutline":{borderColor:O(e.page.fontColor,.25)},"&:hover $notchedOutline":{borderColor:e.page.fontColor}},input:{backgroundColor:"transparent",color:e.page.fontColor},clearIndicator:{color:e.page.fontColor},popupIndicator:{color:e.page.fontColor},notchedOutline:{}})),me=e=>{const{onChange:a,initialValue:n,setError:r}=e,{options:l,isLoading:o,isError:c}=pe(),i=ue(),[d,s]=C(null);v(()=>{if(!o&&l?.length&&!d){const p=n?l.find(m=>m.ref===n):l[0];p&&(s(p),a?.(p.ref))}},[o,l,d,a,n]);const u=T((p,m)=>{s(m),a?.(m?.ref)},[a,s]);return v(()=>{r?.(c?new Error("Error loading groups"):void 0)},[c,r]),c?null:t.createElement(te,{"aria-label":"Current group",className:i.root,classes:{clearIndicator:i.clearIndicator,popupIndicator:i.popupIndicator},disableClearable:!0,options:l??[],loading:o,groupBy:p=>p.key,value:d,freeSolo:!1,onChange:u,getOptionLabel:p=>p.name,renderInput:p=>t.createElement(Q,{...p,variant:"outlined",placeholder:o?"Loading":"Select a group",className:i.textField,InputProps:{...p.InputProps,className:i.input,classes:{notchedOutline:i.notchedOutline},endAdornment:t.createElement(t.Fragment,null,o?t.createElement(V,{color:"inherit",size:20}):null,p.InputProps.endAdornment)}})})},ge=()=>{const e=[{label:t.createElement(E,{width:180})},{label:t.createElement(E,{width:180})},{label:t.createElement(E,{width:180})},{label:t.createElement(E,{width:180})}];return t.createElement(A,{tabs:e})},fe=g(e=>({root:{borderTop:`1px solid ${e.palette.divider}`,borderBottom:`1px solid ${e.palette.divider}`},tab:{textTransform:"uppercase",paddingTop:e.spacing(2),paddingBottom:e.spacing(2)}})),Ee=({facets:e,onChange:a,type:n})=>{var r,l;const o=fe(),c=T(s=>{var u;a((u=e?.types[s].value)!=null?u:"")},[e?.types,a]);v(()=>{var s;const u=e?.types&&e.types.length>=0,p=!n&&u,m=n&&u&&!e.types.find(({value:y})=>y===n);(p||m)&&a((s=e.types[0])==null?void 0:s.value)},[n,e?.types,a]);const i=(r=e?.types.map(({value:s,count:u})=>({key:s,label:`${s} (${u>50?"50+":u})`,id:s,tabProps:{className:o.tab}})))!=null?r:[];if(!i.length)return null;const d=(l=e?.types.findIndex(s=>s.value===n))!=null?l:-1;return t.createElement(t.Fragment,null,t.createElement(ne,null),t.createElement(A,{onChange:c,tabs:i,selectedIndex:d>-1?d:void 0}))},be=g(e=>({root:{height:"8px",minWidth:"64px",marginLeft:e.spacing(2),borderRadius:"100vh",backgroundColor:e.palette.background.default},bar:{backgroundColor:e.palette.success.main,transition:"none"}})),ye=e=>{var a,n;const r=be(e),l=N(()=>Object.entries(e.progress).reduce((c,[,i])=>c+i,0),[e.progress]);if(l===0)return null;const o=(a=e.progress[k.Passed])!=null?a:0;return t.createElement(U,{arrow:!0,title:`Check passing for ${o} of ${l} ${l===1?"entity":"entities"}`,enterDelay:0,placement:"top"},t.createElement(q,{variant:"determinate",value:((n=e.progress[k.Passed])!=null?n:0)/l*100,classes:{root:r.root,bar:r.bar}}))},ve=g(e=>({root:{padding:0},iconWrapper:{padding:e.spacing(1.5),display:"flex",alignItems:"center",justifyContent:"center"},link:{"&:hover $iconWrapper, &:active $iconWrapper, &:focus $iconWrapper":{backgroundColor:e.palette.infoBackground}},icon:{width:"0.75em",height:"0.75em"},empty:{width:e.spacing(2),height:e.spacing(2)}})),he=b(({programId:e,checkId:a,entityRef:n,result:r,entityRoute:l})=>{const o=ve();if(typeof n!="string")return t.createElement("td",{className:`${o.root}`,"aria-hidden":!0},t.createElement("div",{className:o.iconWrapper},t.createElement("div",{className:o.empty})));const c=t.createElement("div",{className:o.iconWrapper},t.createElement(J,{className:o.icon,result:r??k.NotReported})),i=r&&r===k.NotApplicable?c:t.createElement(I,{className:o.link,to:`${l(x(n))}/soundcheck/${e}/${a}`},c);return t.createElement("td",{className:o.root},i)}),ke=g(e=>({checkNameCell:{padding:0,backgroundColor:e.palette.background.paper},checkNameContent:{padding:`0 ${e.spacing(2)}px`,display:"flex",justifyContent:"space-between",alignItems:"center"},checkNameTypography:{overflow:"hidden",textOverflow:"ellipsis"},checkIndicator:{flexBasis:e.spacing(8)}})),we=b(({programId:e,programName:a,check:n,entityRefs:r,results:l,entityRoute:o})=>{const c=ke(),i=N(()=>oe(l.filter(({result:s})=>s!==k.NotApplicable),"result"),[l]),d=new Map(l.map(s=>[s.entityRef,s.result]));return t.createElement("tr",{"data-testid":"program-check-row"},t.createElement("th",{scope:"row",className:c.checkNameCell,"aria-label":`${n.name} check for ${a} program`},t.createElement("div",{className:c.checkNameContent},t.createElement(P,{className:c.checkNameTypography,variant:"subtitle2",component:"p"},n.name),t.createElement(ye,{className:c.checkIndicator,progress:i}))),r.map((s,u)=>t.createElement(he,{key:u,programId:e,checkId:n.id,entityRef:s,result:typeof s=="string"?d.get(s):void 0,entityRoute:o})))}),Ce=b(({entityRef:e,highestLevels:a})=>{const n=a.find(r=>r.entityRef===e);return n?.badge?t.createElement(X,{badge:n.badge,size:"small"}):null}),Ne=g(e=>({programNameCell:{padding:0,position:"sticky",backgroundColor:e.palette.background.paper},programNameContent:{padding:e.spacing(2)},programNameTypography:{overflow:"hidden",textOverflow:"ellipsis"},badgeCellContent:{display:"flex",justifyContent:"center",alignItems:"center"}})),xe=b(({program:e,entityRefs:a,highestLevels:n})=>{const r=Ne();return t.createElement("tr",{"data-testid":"program-title-row"},t.createElement("th",{scope:"row",className:r.programNameCell},t.createElement("div",{className:r.programNameContent},t.createElement(P,{className:r.programNameTypography,variant:"h5",component:"p"},e.name))),a.map((l,o)=>typeof l!="string"?t.createElement("td",{key:o,"aria-hidden":!0}):t.createElement("td",{key:o,"data-testid":"program-certification-cell"},t.createElement("div",{className:r.badgeCellContent},t.createElement(Ce,{entityRef:l,highestLevels:n})))))}),$e=g(e=>{const a=e.palette.type==="dark"?e.palette.grey[700]:e.palette.grey[100];return{root:{color:O(e.palette.getContrastText(a),.7),backgroundColor:a},levelContent:{padding:`${e.spacing(.5)}px ${e.spacing(2)}px`,backgroundColor:a},levelTypography:{overflow:"hidden",textOverflow:"ellipsis"}}}),Se=b(({level:e,entityRefs:a,programName:n})=>{const r=$e();return t.createElement("tr",{className:r.root,"data-testid":"program-level-row"},t.createElement("th",{scope:"row",className:r.root},t.createElement("div",{className:r.levelContent},t.createElement(P,{className:r.levelTypography,variant:"subtitle2",component:"p","aria-label":`${e.name} for ${n} program`},e.name))),a.map((l,o)=>t.createElement("td",{key:o,className:r.root,"aria-hidden":!0})))}),Ie=({program:e,highestLevels:a,levels:n,entityRefs:r,entityRoute:l})=>t.createElement("tbody",null,t.createElement(xe,{program:e,entityRefs:r,highestLevels:a}),n.map((o,c)=>t.createElement(j,{key:c},t.createElement(Se,{entityRefs:r,level:o,programName:e.name}),o.checks.map(({check:i,results:d},s)=>t.createElement(we,{key:s,check:i,programId:e.id,programName:e.name,entityRefs:r,results:d,entityRoute:l}))))),Pe=g(e=>({root:{position:"sticky",bottom:"-1px",backgroundColor:e.palette.background.default,boxShadow:`0 -1px ${e.palette.divider}`,"& td$cell, & th$cell":{border:0,padding:e.spacing(1)},"& td$cell":{backgroundColor:e.palette.background.default}},row:{boxShadow:`1px 0 ${e.palette.background.default}, -1px 0 ${e.palette.background.default}`},cell:{verticalAlign:"top"},cellInner:{textOrientation:"mixed",writingMode:"vertical-lr",transform:"rotate(-20deg)",transformOrigin:`100% ${e.spacing(1)}px`,wordBreak:"keep-all",fontWeight:"bold",overflow:"hidden",textOverflow:"ellipsis",maxHeight:"15vh"}})),Re=({entityRefs:e})=>{const a=_(B),n=Pe();return t.createElement("tfoot",{className:n.root,"data-testid":"results-table-footer"},t.createElement("tr",{className:n.row},t.createElement("td",{className:n.cell}),e.map((r,l)=>typeof r!="string"?t.createElement("th",{key:l,className:n.cell,"aria-hidden":!0}):t.createElement("th",{scope:"col",key:l,className:n.cell},t.createElement("div",{className:n.cellInner},t.createElement(I,{to:a(x(r))},W(x(r),{defaultKind:"component"})))))))},Te=g(e=>({table:{backgroundColor:e.palette.background.paper,borderCollapse:"collapse",whiteSpace:"nowrap","& th, & td":{border:`1px solid ${e.palette.divider}`,borderCollapse:"collapse"},paddingBottom:e.spacing(2)},programTitle:{padding:e.spacing(2)},checkResult:{padding:e.spacing(1.5)},title:{padding:`${e.spacing(1)}px ${e.spacing(2)}px`},header:{backgroundColor:e.palette.type==="dark"?e.palette.grey[700]:e.palette.grey[100]}})),Ae=()=>{const e=Te(),a=new Array(25).fill(void 0),n=new Array(5).fill(void 0),r=new Array(3).fill(void 0);return t.createElement("table",{className:e.table},t.createElement("tbody",null,t.createElement("tr",null,t.createElement("td",{className:e.programTitle},t.createElement(E,{width:180,height:40})),a.map((l,o)=>t.createElement("td",{key:o}))),r.map((l,o)=>t.createElement(t.Fragment,{key:o},t.createElement("tr",{className:e.header},t.createElement("td",{className:e.title},t.createElement(E,{width:180})),a.map((c,i)=>t.createElement("td",{key:i}))),n.map((c,i)=>t.createElement("tr",{key:i},t.createElement("td",{className:e.title},t.createElement(E,{width:240})),a.map((d,s)=>t.createElement("td",{key:s,className:e.checkResult},t.createElement(E,{width:18,height:18,variant:"rect"})))))))))},Oe=g(e=>({root:{width:"100%"},table:{overflow:"auto",backgroundColor:e.palette.background.paper,borderCollapse:"collapse",whiteSpace:"nowrap",textAlign:"left","& th, & td":{border:`1px solid ${e.palette.divider}`,borderCollapse:"collapse"},"& th:first-of-type":{position:"sticky",left:0,zIndex:1,maxWidth:"60ch"},"& tfoot":{bottom:0,zIndex:1e3},"& tbody td:first-of-type":{border:`1px solid ${e.palette.divider}`,boxShadow:`1px 0 ${e.palette.background.default}, -1px 0 ${e.palette.background.default}`}}})),Le=b(e=>{const{setError:a,type:n,ownerEntityRef:r}=e,l=Oe(),o=_(B),{data:c,isLoading:i,isError:d}=se(r,{type:n});if(v(()=>{a?.(d?new Error("Error loading program overview"):void 0)},[d,a]),i)return t.createElement(Ae,null);if(!c||!r)return null;const{programs:s,entityRefs:u}=c;if(!i&&!s.length)return t.createElement(M,{missing:"data",title:"Missing programs",description:t.createElement(t.Fragment,null,"Looks like the group"," ",W(x(r),{defaultKind:"Group"})," ","doesn't own any ",n," components that have Soundcheck programs set up.",t.createElement("br",null),t.createElement("br",null),"If you're an administrator, you can learn more about configuring and filtering programs in the"," ",t.createElement(I,{to:"https://www.npmjs.com/package/@spotify/backstage-plugin-soundcheck-backend#entity-filter"},"docs"),".")});if(d)return null;const p=u.length>=25?u:[...u,...Array.from({length:25-u.length},()=>{})];return t.createElement("div",{className:l.root},t.createElement("table",{className:l.table,"aria-label":"Check results"},s.map(({program:m,levels:y,highestLevels:w},S)=>t.createElement(Ie,{key:S,program:m,entityRefs:p,levels:y,highestLevels:w,entityRoute:o})),t.createElement(Re,{entityRefs:p})))}),_e=g(e=>({tableContainer:{padding:e.spacing(3),backgroundColor:"transparent"},scrollContainer:{overflow:"scroll",height:`calc(100vh - 86px - 68px - ${e.spacing(3)*2}px)`}})),Ge=()=>{var e;const[a,n]=de(),{group:r,type:l}=a,[o,c]=C(void 0),[i,d]=C(void 0),{data:s,isLoading:u}=le(r),p=o||i,m=f=>{f&&n({...a,group:f})},y=f=>{f&&n({...a,type:f})},w=_e(),S=N(()=>{var f;return((f=s?.types)==null?void 0:f.length)<1?t.createElement(Z,{ownerEntityRef:r}):p?t.createElement(ee,{severity:"error",title:p.message}):t.createElement(Le,{ownerEntityRef:r,type:l,setError:d})},[(e=s?.types)==null?void 0:e.length,p,r,l]);return t.createElement(z,{themeId:"website"},t.createElement(K,{backend:"soundcheck",invalidLicenseMessage:"Submitted check results will still be stored, but it will not be possible to view certifications or individual results until a valid license is present."}),t.createElement(H,{title:"Soundcheck"},t.createElement(me,{onChange:m,initialValue:r,setError:c})),t.createElement(D,{noPadding:!0,stretch:!0},t.createElement(R,{container:!0,spacing:0},t.createElement(R,{item:!0,xs:12},u?t.createElement(ge,null):t.createElement(Ee,{facets:s,type:l,onChange:y})),t.createElement(R,{item:!0,xs:12,className:w.tableContainer},t.createElement("div",{className:w.scrollContainer},S)))))},Fe=()=>t.createElement(Y,null,t.createElement(Ge,null));export{Fe as OverviewPage};
2
- //# sourceMappingURL=index-f59e3aca.esm.js.map