@spotify/backstage-plugin-soundcheck 0.7.0 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,388 @@
1
+ import{createApiRef as Oe,createRouteRef as $,createSubRouteRef as R,createPlugin as Ne,createApiFactory as qe,discoveryApiRef as Te,fetchApiRef as Ge,createRoutableExtension as b,createComponentExtension as Le,useApi as x,errorApiRef as Ae,useRouteRef as j}from"@backstage/core-plugin-api";import{GraphQLClient as xe}from"graphql-request";import c from"graphql-tag";import a,{createContext as V,useState as S,useCallback as C,useContext as K,useRef as Be,useEffect as Me,Fragment as ze}from"react";import{QueryClient as Ue,QueryClientProvider as He,useQuery as _}from"@tanstack/react-query";import{memoize as We}from"lodash";import Qe from"@material-ui/core/styles/makeStyles";import{makeStyles as p,Typography as m,Modal as je,Box as J,Button as X,Fade as Ve,alpha as E,Tooltip as Ke,withStyles as I,Divider as _e}from"@material-ui/core";import{MarkdownContent as Y,Link as Z,EmptyState as ee,InfoCard as Je}from"@backstage/core-components";import{useEntity as te,humanizeEntityRef as Xe}from"@backstage/plugin-catalog-react";import{useAutoUpdatingRelativeTime as Ye,SpotifyLicenseBanner as Ze}from"@spotify/backstage-plugin-core";import{stringifyEntityRef as re,parseEntityRef as et}from"@backstage/catalog-model";import{Alert as tt,Skeleton as f}from"@material-ui/lab";import{Link as rt}from"react-router-dom";import F from"classnames";import at from"@material-ui/icons/Schedule";import{DateTime as ae}from"luxon";import nt from"@material-ui/icons/Check";import it from"@material-ui/icons/Close";import st from"@material-ui/icons/RemoveCircleOutline";import ct from"@material-ui/icons/HelpOutline";var ne=(e=>(e.Medal="MEDAL",e))(ne||{}),g=(e=>(e.Failed="FAILED",e.NotApplicable="NOT_APPLICABLE",e.NotReported="NOT_REPORTED",e.Passed="PASSED",e))(g||{});const ot=c`
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
+ `,lt=c`
24
+ fragment check on Check {
25
+ id
26
+ name
27
+ description
28
+ }
29
+ `,dt=c`
30
+ fragment level on Level {
31
+ ordinal
32
+ name
33
+ description
34
+ checks {
35
+ ...check
36
+ }
37
+ }
38
+ ${lt}`,ut=c`
39
+ fragment CheckResultSummary on CheckResult {
40
+ id
41
+ name
42
+ result
43
+ timestamp
44
+ }
45
+ `,mt=c`
46
+ fragment LevelResultDetails on LevelResult {
47
+ ordinal
48
+ name
49
+ description
50
+ badge {
51
+ ... on BadgeVariantMedal {
52
+ variant
53
+ options {
54
+ level
55
+ color
56
+ }
57
+ }
58
+ }
59
+ certified
60
+ checks {
61
+ ...CheckResultSummary
62
+ }
63
+ }
64
+ ${ut}`,pt=c`
65
+ fragment CheckResultDetails on CheckResult {
66
+ id
67
+ name
68
+ description
69
+ result
70
+ timestamp
71
+ notes
72
+ }
73
+ `,ht=c`
74
+ fragment OverviewLevelResult on OverviewLevelResult {
75
+ ordinal
76
+ name
77
+ checks {
78
+ check {
79
+ id
80
+ name
81
+ description
82
+ }
83
+ results {
84
+ id
85
+ entityRef
86
+ result
87
+ }
88
+ }
89
+ }
90
+ `,ie=c`
91
+ fragment HighestLevel on LevelResult {
92
+ entityRef
93
+ ordinal
94
+ name
95
+ badge {
96
+ ... on BadgeVariantMedal {
97
+ variant
98
+ options {
99
+ color
100
+ level
101
+ }
102
+ }
103
+ }
104
+ }
105
+ `,gt=c`
106
+ mutation createCheck($input: CheckerInput!) {
107
+ check: createChecker(input: $input) {
108
+ id
109
+ filter
110
+ name
111
+ description
112
+ }
113
+ }
114
+ `,ft=c`
115
+ mutation createProgram($input: ProgramInput!) {
116
+ program: createProgram(input: $input) {
117
+ id
118
+ ownerEntityRef
119
+ name
120
+ description
121
+ documentationURL
122
+ }
123
+ }
124
+ `,yt=c`
125
+ mutation deleteChecker($checkerId: String!) {
126
+ deleteChecker(checkerId: $checkerId)
127
+ }
128
+ `,kt=c`
129
+ mutation deleteProgram($programId: String!) {
130
+ programDeleted: deleteProgram(programId: $programId)
131
+ }
132
+ `,vt=c`
133
+ mutation updateCheck($input: CheckerInput!) {
134
+ check: updateChecker(input: $input) {
135
+ id
136
+ filter
137
+ name
138
+ description
139
+ }
140
+ }
141
+ `,Rt=c`
142
+ mutation updateCollectorConfig($input: CollectorConfigInput!) {
143
+ collector: setCollectorConfig(input: $input) {
144
+ id
145
+ factNames
146
+ collectionConfigs {
147
+ factRefs
148
+ filter
149
+ frequency
150
+ cache
151
+ }
152
+ config
153
+ configSchema
154
+ }
155
+ }
156
+ `,Ct=c`
157
+ mutation updateProgram($input: ProgramInput!) {
158
+ program: updateProgram(input: $input) {
159
+ id
160
+ ownerEntityRef
161
+ name
162
+ description
163
+ documentationURL
164
+ }
165
+ }
166
+ `,Et=c`
167
+ query getAllCertifications($entityRef: String!) {
168
+ certifications(entityRef: $entityRef, includeFilteredChecks: false) {
169
+ ...CertificationSummary
170
+ }
171
+ }
172
+ ${ot}`,Pt=c`
173
+ query getAllPrograms($programIds: [String!], $first: Int, $after: String) {
174
+ programs(programIds: $programIds, first: $first, after: $after) {
175
+ totalCount
176
+ endCursor
177
+ hasNextPage
178
+ edges {
179
+ cursor
180
+ program {
181
+ id
182
+ ownerEntityRef
183
+ name
184
+ description
185
+ documentationURL
186
+ filter
187
+ levels {
188
+ ...level
189
+ }
190
+ isEditable
191
+ }
192
+ }
193
+ }
194
+ }
195
+ ${dt}`,wt=c`
196
+ query getCertificationDetails($entityRef: String!, $programId: String!) {
197
+ programCertification(
198
+ entityRef: $entityRef
199
+ programId: $programId
200
+ includeFilteredChecks: false
201
+ ) {
202
+ program {
203
+ id
204
+ name
205
+ description
206
+ documentationURL
207
+ }
208
+ highestLevel {
209
+ ...HighestLevel
210
+ }
211
+ levels {
212
+ ...LevelResultDetails
213
+ }
214
+ }
215
+ }
216
+ ${ie}
217
+ ${mt}`,$t=c`
218
+ query getCheckResultDetails($entityRef: String!, $programId: String!, $checkId: String!) {
219
+ checkResult(entityRef: $entityRef, programId: $programId, checkId: $checkId) {
220
+ ...CheckResultDetails
221
+ }
222
+ }
223
+ ${pt}`,bt=c`
224
+ query getCheckers($ids: [String!], $first: Int, $after: String, $orderAlphabetical: String, $searchByOwner: String, $searchByName: String) {
225
+ checkers(
226
+ ids: $ids
227
+ first: $first
228
+ after: $after
229
+ orderAlphabetical: $orderAlphabetical
230
+ searchByOwner: $searchByOwner
231
+ searchByName: $searchByName
232
+ ) {
233
+ totalCount
234
+ endCursor
235
+ hasNextPage
236
+ edges {
237
+ cursor
238
+ checker {
239
+ id
240
+ ownerEntityRef
241
+ supportChannel
242
+ name
243
+ description
244
+ rule
245
+ passedMessage
246
+ failedMessage
247
+ filter
248
+ isEditable
249
+ schedule
250
+ }
251
+ }
252
+ }
253
+ }
254
+ `,St=c`
255
+ query getEntityRefsForTechHealthFilter($ownerEntityRef: String) {
256
+ entityRefsForTechHealthFilter(ownerEntityRef: $ownerEntityRef)
257
+ }
258
+ `,It=c`
259
+ query getFacetsForOwner($ownerEntityRef: String!) {
260
+ facetsForOwner(ownerEntityRef: $ownerEntityRef) {
261
+ types {
262
+ kind
263
+ type
264
+ count
265
+ }
266
+ }
267
+ }
268
+ `,Ft=c`
269
+ query getCollectors($ids: [String!]) {
270
+ collectors(ids: $ids) {
271
+ id
272
+ name
273
+ description
274
+ factNames
275
+ config
276
+ isConfigurable
277
+ isEditable
278
+ collectionConfigs {
279
+ factRefs
280
+ filter
281
+ frequency
282
+ cache
283
+ }
284
+ }
285
+ }
286
+ `,Dt=c`
287
+ query getFactSchemas($collectorId: String!, $factName: String!) {
288
+ factSchema(collectorId: $collectorId, factName: $factName) {
289
+ schema
290
+ }
291
+ }
292
+ `,Ot=c`
293
+ query getIndividualCheckPassRates($filter: Filter) {
294
+ individualCheckPassRates(filter: $filter) {
295
+ id
296
+ checkName
297
+ checkDescription
298
+ checkOwnerRef
299
+ snapshotPassRate
300
+ trendPassRates
301
+ }
302
+ }
303
+ `,Nt=c`
304
+ query getIndividualEntityPassRates($filter: Filter) {
305
+ individualEntityPassRates(filter: $filter) {
306
+ id
307
+ entityDescription
308
+ entityOwnerRef
309
+ snapshotPassRate
310
+ trendPassRates
311
+ }
312
+ }
313
+ `,qt=c`
314
+ query getIndividualGroupPassRates($filter: Filter) {
315
+ groupPassRates(filter: $filter) {
316
+ id
317
+ groupTitle
318
+ memberRefs
319
+ snapshotPassRate
320
+ trendPassRates
321
+ }
322
+ }
323
+ `,Tt=c`
324
+ query getIndividualTrackPassRate($filter: Filter) {
325
+ individualTrackPassRate(filter: $filter) {
326
+ id
327
+ trackName
328
+ trackDescription
329
+ trackOwnerRef
330
+ levels {
331
+ levelOrdinal
332
+ snapshotPassRate
333
+ trendPassRates
334
+ }
335
+ }
336
+ }
337
+ `,Gt=c`
338
+ query getOverallCheckPassRates($filter: Filter) {
339
+ overallCheckPassRates(filter: $filter)
340
+ }
341
+ `,Lt=c`
342
+ query getOverallEntityPassRates($filter: Filter) {
343
+ overallEntityPassRates(filter: $filter) {
344
+ id
345
+ trendPassRates
346
+ }
347
+ }
348
+ `,At=c`
349
+ query getOverallGroupPassRates($filter: Filter) {
350
+ groupPassRates(filter: $filter, limit: 5) {
351
+ id
352
+ groupTitle
353
+ snapshotPassRate
354
+ }
355
+ }
356
+ `,xt=c`
357
+ query getOverallTrackPassRate($filter: Filter) {
358
+ overallTrackPassRate(filter: $filter) {
359
+ levelOrdinal
360
+ snapshotPassRate
361
+ trendPassRates
362
+ }
363
+ }
364
+ `,Bt=c`
365
+ query getProgramOverviewForOwner($ownerEntityRef: String!, $facet: FacetInput) {
366
+ programOverviewForOwner(
367
+ ownerEntityRef: $ownerEntityRef
368
+ facet: $facet
369
+ includeFilteredChecks: false
370
+ ) {
371
+ programs {
372
+ program {
373
+ id
374
+ name
375
+ }
376
+ highestLevels {
377
+ ...HighestLevel
378
+ }
379
+ levels {
380
+ ...OverviewLevelResult
381
+ }
382
+ }
383
+ entityRefs
384
+ }
385
+ }
386
+ ${ie}
387
+ ${ht}`,Mt=(e,t,r)=>e();function zt(e,t=Mt){return{createCheck(r,n){return t(i=>e.request(gt,r,{...n,...i}),"createCheck","mutation")},createProgram(r,n){return t(i=>e.request(ft,r,{...n,...i}),"createProgram","mutation")},deleteChecker(r,n){return t(i=>e.request(yt,r,{...n,...i}),"deleteChecker","mutation")},deleteProgram(r,n){return t(i=>e.request(kt,r,{...n,...i}),"deleteProgram","mutation")},updateCheck(r,n){return t(i=>e.request(vt,r,{...n,...i}),"updateCheck","mutation")},updateCollectorConfig(r,n){return t(i=>e.request(Rt,r,{...n,...i}),"updateCollectorConfig","mutation")},updateProgram(r,n){return t(i=>e.request(Ct,r,{...n,...i}),"updateProgram","mutation")},getAllCertifications(r,n){return t(i=>e.request(Et,r,{...n,...i}),"getAllCertifications","query")},getAllPrograms(r,n){return t(i=>e.request(Pt,r,{...n,...i}),"getAllPrograms","query")},getCertificationDetails(r,n){return t(i=>e.request(wt,r,{...n,...i}),"getCertificationDetails","query")},getCheckResultDetails(r,n){return t(i=>e.request($t,r,{...n,...i}),"getCheckResultDetails","query")},getCheckers(r,n){return t(i=>e.request(bt,r,{...n,...i}),"getCheckers","query")},getEntityRefsForTechHealthFilter(r,n){return t(i=>e.request(St,r,{...n,...i}),"getEntityRefsForTechHealthFilter","query")},getFacetsForOwner(r,n){return t(i=>e.request(It,r,{...n,...i}),"getFacetsForOwner","query")},getCollectors(r,n){return t(i=>e.request(Ft,r,{...n,...i}),"getCollectors","query")},getFactSchemas(r,n){return t(i=>e.request(Dt,r,{...n,...i}),"getFactSchemas","query")},getIndividualCheckPassRates(r,n){return t(i=>e.request(Ot,r,{...n,...i}),"getIndividualCheckPassRates","query")},getIndividualEntityPassRates(r,n){return t(i=>e.request(Nt,r,{...n,...i}),"getIndividualEntityPassRates","query")},getIndividualGroupPassRates(r,n){return t(i=>e.request(qt,r,{...n,...i}),"getIndividualGroupPassRates","query")},getIndividualTrackPassRate(r,n){return t(i=>e.request(Tt,r,{...n,...i}),"getIndividualTrackPassRate","query")},getOverallCheckPassRates(r,n){return t(i=>e.request(Gt,r,{...n,...i}),"getOverallCheckPassRates","query")},getOverallEntityPassRates(r,n){return t(i=>e.request(Lt,r,{...n,...i}),"getOverallEntityPassRates","query")},getOverallGroupPassRates(r,n){return t(i=>e.request(At,r,{...n,...i}),"getOverallGroupPassRates","query")},getOverallTrackPassRate(r,n){return t(i=>e.request(xt,r,{...n,...i}),"getOverallTrackPassRate","query")},getProgramOverviewForOwner(r,n){return t(i=>e.request(Bt,r,{...n,...i}),"getProgramOverviewForOwner","query")}}}var se=(e,t,r)=>{if(!t.has(e))throw TypeError("Cannot "+r)},s=(e,t,r)=>(se(e,t,"read from private field"),r?r.call(e):t.get(e)),P=(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)},B=(e,t,r,n)=>(se(e,t,"write to private field"),n?n.call(e,r):t.set(e,r),r),D,O,o,M,l;const N=Oe({id:"plugin.soundcheck"}),Ut=e=>"response"in e&&"errors"in e.response,Ht=e=>"response"in e&&"message"in e.response;class Wt{constructor(t){P(this,D,void 0),P(this,O,void 0),P(this,o,void 0),P(this,M,n=>{var i,d,u;return Ut(n)?(u=(d=(i=n.response)==null?void 0:i.errors)==null?void 0:d[0].message)!=null?u:`${n}`:Ht(n)?n.response.message:`${n}`}),P(this,l,async n=>{try{return await n()}catch(i){throw new Error(`Error from Soundcheck backend: ${s(this,M).call(this,i)}`)}}),B(this,D,t.fetchApi),B(this,O,t.discoveryApi);const r=new xe("/graphql",{fetch:async(n,i)=>{const d=`${await s(this,O).getBaseUrl("soundcheck")}${n}`;return s(this,D).fetch(d,i)}});B(this,o,zt(r))}async getAllCertifications(t){return s(this,l).call(this,async()=>{const{certifications:r}=await s(this,o).getAllCertifications({entityRef:t});return r})}async getCertificationDetails(t,r){return s(this,l).call(this,async()=>{const{programCertification:n}=await s(this,o).getCertificationDetails({entityRef:t,programId:r});return n})}async getCheckResultDetails(t,r,n){return s(this,l).call(this,async()=>{const{checkResult:i}=await s(this,o).getCheckResultDetails({entityRef:t,programId:r,checkId:n});return i})}async getFacetsForOwner(t){return s(this,l).call(this,async()=>{const{facetsForOwner:r}=await s(this,o).getFacetsForOwner({ownerEntityRef:t});return r})}async getProgramOverviewForOwner(t,r){return s(this,l).call(this,async()=>{const{programOverviewForOwner:n}=await s(this,o).getProgramOverviewForOwner({ownerEntityRef:t,facet:r});return n})}async getAllPrograms(t,r,n){return s(this,l).call(this,async()=>{const{programs:i}=await s(this,o).getAllPrograms({programIds:t,first:r,after:n});return i})}async createProgram(t){return s(this,l).call(this,async()=>{const{program:r}=await s(this,o).createProgram({input:t});return r})}async updateProgram(t){return s(this,l).call(this,async()=>{const{program:r}=await s(this,o).updateProgram({input:t});return r})}async deleteProgram(t){return s(this,l).call(this,async()=>{const{programDeleted:r}=await s(this,o).deleteProgram({programId:t});return r})}async getChecks(t,r,n){return s(this,l).call(this,async()=>{const{checkers:i}=await s(this,o).getCheckers({ids:t,first:r,after:n});return i})}async createCheck(t){return s(this,l).call(this,async()=>{const{check:r}=await s(this,o).createCheck({input:t});return r})}async updateCheck(t){return s(this,l).call(this,async()=>{const{check:r}=await s(this,o).updateCheck({input:t});return r})}async deleteCheck(t){return s(this,l).call(this,async()=>await s(this,o).deleteChecker({checkerId:t}))}async getCollectors(t){return s(this,l).call(this,async()=>{const{collectors:r}=await s(this,o).getCollectors({ids:t});return r})}async getFactSchema(t,r){if(!(!t||!r))return s(this,l).call(this,async()=>{const{factSchema:n}=await s(this,o).getFactSchemas({collectorId:t,factName:r});return n})}async updateCollectorConfig(t){return s(this,l).call(this,async()=>{const{collector:r}=await s(this,o).updateCollectorConfig({input:t});return r})}async getOverallCheckPassRates(t){return s(this,l).call(this,async()=>await s(this,o).getOverallCheckPassRates({filter:t}))}async getIndividualCheckPassRates(t){return s(this,l).call(this,async()=>await s(this,o).getIndividualCheckPassRates({filter:t}))}async getOverallTrackPassRate(t){return s(this,l).call(this,async()=>await s(this,o).getOverallTrackPassRate({filter:t}))}async getIndividualTrackPassRate(t){return s(this,l).call(this,async()=>await s(this,o).getIndividualTrackPassRate({filter:t}))}async getOverallEntityPassRates(t){return s(this,l).call(this,async()=>await s(this,o).getOverallEntityPassRates({filter:t}))}async getIndividualEntityPassRates(t){return s(this,l).call(this,async()=>await s(this,o).getIndividualEntityPassRates({filter:t}))}async getOverallGroupPassRates(t){return s(this,l).call(this,async()=>await s(this,o).getOverallGroupPassRates({filter:t}))}async getIndividualGroupPassRates(t){return s(this,l).call(this,async()=>await s(this,o).getIndividualGroupPassRates({filter:t}))}async getEntityRefsForTechHealthFilter(t){return s(this,l).call(this,async()=>await s(this,o).getEntityRefsForTechHealthFilter({ownerEntityRef:t}))}}D=new WeakMap,O=new WeakMap,o=new WeakMap,M=new WeakMap,l=new WeakMap;const q=$({id:"soundcheck-entity"}),Qt=$({id:"soundcheck-group"}),ce=R({id:"soundcheck-entity-certification-track-redirect",parent:q,path:"/:trackId"}),oe=R({id:"soundcheck-entity-certification",parent:q,path:"/:trackId/:checkId"}),jt=$({id:"soundcheck-overview"}),T=$({id:"soundcheck"}),Vt=R({id:"soundcheck-checks",parent:T,path:"/checks"});R({id:"soundcheck-tracks",parent:T,path:"/tracks"});const Kt=R({id:"soundcheck-track-details",parent:T,path:"/tracks/:trackId"}),k=Ne({id:"soundcheck",apis:[qe({api:N,deps:{discoveryApi:Te,fetchApi:Ge},factory:e=>new Wt(e)})],routes:{entityContent:q}}),_t=k.provide(b({name:"EntitySoundcheckContent",component:()=>import("./EntitySoundcheckContent-592fa779.esm.js").then(e=>e.EntitySoundcheckContent),mountPoint:q})),Jt=k.provide(Le({name:"EntitySoundcheckCard",component:{lazy:()=>import("./index-540b325c.esm.js").then(e=>e.EntitySoundcheckCard)}})),Xt=k.provide(b({name:"GroupSoundcheckContent",component:()=>import("./index-fcd50c7d.esm.js").then(e=>e.FixedGroupOverviewPage),mountPoint:Qt})),Yt=k.provide(b({name:"SoundcheckOverviewPage",component:()=>import("./index-fcd50c7d.esm.js").then(e=>e.OverviewPage),mountPoint:jt})),Zt=k.provide(b({name:"SoundcheckRoutingPage",component:()=>import("./index-100619e3.esm.js").then(e=>e.RoutingPage),mountPoint:T})),er=We(e=>new Ue({defaultOptions:{queries:{refetchInterval:6e4,refetchIntervalInBackground:!1,refetchOnWindowFocus:"always",retry:2,retryDelay:t=>{const r=450+Math.ceil(Math.random()*100);return Math.min(r*2**t,3e4)},onError:t=>e.post(t)}}})),tr=e=>{const t=x(Ae),r=er(t);return a.createElement(He,{client:r},e.children)};function le(e){const t=x(N),r=re(e);return _(["soundcheck/certifications",r],async()=>t.getAllCertifications(r))}function de(e,t){const r=x(N),n=re(e);return _(["soundcheck/certifications",n,t],async()=>r.getCertificationDetails(n,t),{enabled:!!t})}var ue=(e=>(e.GetAllPrograms="soundcheck/programs",e.GetChecks="soundcheck/checks",e.GetCollectors="soundcheck/collectors",e.GetFactSchema="soundcheck/collectors/schema",e.GetEntityFacets="soundcheck/catalog/facets",e.GetSoftwareEntityRefsForUser="soundcheck/entities/softwareEntityRefsForUser",e.GetOverallCheckPassRates="soundcheck/charts/overallCheckPassRates",e.GetIndividualCheckPassRate="soundcheck/charts/getIndividualCheckPassRate",e.GetOverallTrackPassRate="soundcheck/charts/overallTrackPassRate",e.GetIndividualTrackPassRate="soundcheck/charts/individualTrackPassRate",e.GetOverallEntityPassRates="soundcheck/charts/overallEntityPassRates",e.GetIndividualEntityPassRate="soundcheck/charts/individualEntityPassRate",e.GetOverallGroupPassRates="soundcheck/charts/overallGroupPassRates",e.GetIndividualGroupPassRates="soundcheck/charts/individualGroupPassRates",e.EntityByRef="soundcheck/catalog/entityByRef",e))(ue||{}),me=(e=>(e.DeleteCheck="soundcheck/deleteCheck",e.CreateCheck="soundcheck/createCheck",e.UpdateCheck="soundcheck/updateCheck",e.DeleteProgram="soundcheck/deleteProgram",e.CreateProgram="soundcheck/createProgram",e.UpdateProgram="soundcheck/updateProgram",e.UpdateCollectorConfig="soundcheck/updateCollectorConfig",e))(me||{});const rr=p(e=>({root:{padding:e.spacing(3)},icon:{display:"none"},message:{padding:0},type:{fontWeight:700,lineHeight:1.75}})),G=e=>{const{type:t,...r}=rr();return a.createElement(tt,{severity:e.severity,elevation:1,classes:r,onClose:e.onClose},a.createElement(m,{classes:{root:t}},e.title),e.children)},pe=V({}),ar=e=>{const[t,r]=S(),n=C(d=>{r(d)},[]),i=C(()=>{r(null)},[]);return a.createElement(pe.Provider,{value:{showAlert:n,clearAlert:i}},t&&a.createElement(G,{severity:t.severity,title:t.title,onClose:i},t.message),e.children)},nr=()=>K(pe),ir=p(e=>({modalContent:{position:"absolute",top:"50%",left:"50%",transform:"translate(-50%, -50%)",padding:"25px",backgroundColor:e.palette.type==="dark"?e.palette.grey[800]:e.palette.grey[200]},modalButtons:{display:"flex",justifyContent:"space-evenly","& button":{width:"40%",maxWidth:"185px"}},modalMessage:{margin:"15px 0 35px"}})),he=V({}),sr=e=>{const t=ir(),[r,n]=S(!1),[i,d]=S(),u=Be(),h=C(({title:w,message:Ie,error:Fe})=>(d({title:w,message:Ie,error:Fe}),n(!0),new Promise(De=>{u.current=De})),[]),v=C(()=>{u.current&&u.current(!0),n(!1)},[]),y=C(()=>{u.current&&u.current(!1),n(!1)},[]);return a.createElement(he.Provider,{value:{showModal:h}},e.children,i&&a.createElement(je,{open:r,onClose:y,"aria-labelledby":"confirmation-modal-title","aria-describedby":"confirmation-modal-description"},a.createElement(J,{className:t.modalContent},a.createElement(m,{id:"confirmation-modal-title",variant:"h6"},i.title),a.createElement(m,{className:t.modalMessage,id:"confirmation-modal-description",variant:"body1"},i.message),a.createElement("div",{className:t.modalButtons},!i.error&&a.createElement(X,{onClick:y,variant:"contained","aria-label":"cancel"},"Cancel"),a.createElement(X,{color:"primary",onClick:v,variant:"contained","aria-label":"confirm"},i.error?"Ok":"Confirm")))))},cr=()=>K(he),ge=24,or=11,z=e=>e==="small"?1:2,lr=p({root:{position:"relative",display:"inline-flex",alignItems:"center",justifyContent:"center",borderRadius:"50%",borderWidth:"2px",fontWeight:700,width:({size:e})=>`${ge*z(e)}px`,height:({size:e})=>`${ge*z(e)}px`,fontSize:({size:e})=>`${or*z(e)}px`}}),fe=({className:e,label:t,size:r="small"})=>{const n=lr({size:r});return a.createElement("span",{className:F(e,n.root),role:"img","aria-label":`${t} badge`},t)},dr=p(e=>({root:{background:({color:t})=>t,color:e.palette.common.black,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(",")}}})),U=({className:e,badge:t,size:r="small"})=>{const n=dr({color:t.options.color,size:r});return a.createElement(fe,{className:F(e,n.root),size:r,label:`L${t.options.level}`})},ur=p({root:{borderColor:"currentColor",borderStyle:"dashed"}}),ye=({className:e,size:t="small"})=>{const r=ur();return a.createElement(fe,{className:F(e,r.root),size:t,label:"NL"})},H=p(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),fontWeight:700,lineHeight:1.235,marginBottom:"6px"},level:{textTransform:"uppercase",color:e.palette.text.secondary,fontWeight:700,letterSpacing:"1px"}}));function mr({description:e,documentationUrl:t}){const r=H();return t?a.createElement("div",{className:r.description},a.createElement(Y,{content:e}),a.createElement(Z,{to:t},"Learn more")):a.createElement("div",{className:r.description},a.createElement(Y,{content:e}))}const ke=({name:e,level:t,badge:r,description:n,documentationUrl:i})=>{const d=H();return a.createElement("div",{className:d.root},r?a.createElement(U,{size:"large",badge:r}):a.createElement(ye,{size:"large"}),a.createElement("div",null,a.createElement(m,{variant:"caption",className:d.level},t!=null?t:"No Level"),a.createElement(m,{className:d.title},e),n&&a.createElement(mr,{description:n,documentationUrl:i})))},L=({children:e})=>{const[t,r]=S(!1);return Me(()=>{const n=setTimeout(()=>{r(!0)},250);return()=>clearTimeout(n)},[]),a.createElement(Ve,{in:t,timeout:250},e)},W=({hideDescription:e=!1})=>{const t=H();return a.createElement(L,null,a.createElement("div",{className:t.root},a.createElement(f,{width:44,height:44}),a.createElement("div",null,a.createElement(m,{variant:"caption",className:t.level},a.createElement(f,{width:100})),a.createElement(m,{variant:"h4",className:t.title},a.createElement(f,{width:300})),!e&&a.createElement(m,{variant:"body2"},a.createElement(f,null)))))},ve=p(e=>{const t=e.palette.type==="dark"?e.palette.grey[700]:e.palette.grey[100];return{wrapper:{backgroundColor:t,color:E(e.palette.getContrastText(t),.8),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:E(e.palette.getContrastText(t),.8),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:E(e.palette.getContrastText(t),.8),fontSize:e.typography.subtitle2.fontSize,marginTop:e.spacing(1)}}}),pr=e=>{const t=ve({badge:e.badge});return a.createElement("div",{className:t.wrapper},e.badge?a.createElement(U,{className:t.badge,badge:e.badge}):null,a.createElement(m,{className:t.title},e.title),e.description?a.createElement(m,{className:t.description},e.description):null)},hr=()=>{const e=ve({});return a.createElement(L,null,a.createElement("div",{className:e.wrapper},a.createElement(f,{className:e.title}),a.createElement(m,{className:e.description},a.createElement(f,null))))},gr=p(e=>({root:{display:"inline-flex",alignItems:"center",gap:e.spacing(1)}})),Re=({timestamp:e,description:t})=>{const r=gr(),n=ae.fromISO(e).toLocaleString(ae.DATETIME_FULL),i=Ye(e),d=t?`${t}: ${i}`:void 0;return a.createElement("div",{className:r.root},a.createElement(Ke,{title:n},a.createElement(m,{variant:"caption","aria-label":d},i)),a.createElement(at,null))},fr=e=>({[g.Passed]:"Check passed",[g.NotReported]:"Check not reported",[g.Failed]:"Check failed",[g.NotApplicable]:"Check not applicable"})[e],yr=I(e=>({root:{color:e.palette.success.main}}))(nt),kr=I(e=>({root:{color:e.palette.error.main}}))(it),vr=I(e=>({root:{color:e.palette.info.main}}))(ct),Rr=I(e=>({root:{color:e.palette.text.disabled}}))(st),Ce=({result:e,className:t})=>{const r={className:t,"aria-label":fr(e),"aria-hidden":!1};return e===g.Passed?a.createElement(yr,{...r}):e===g.NotReported?a.createElement(vr,{...r}):e===g.Failed?a.createElement(kr,{...r}):e===g.NotApplicable?a.createElement(Rr,{...r}):null},Ee=p(e=>({root:{display:"grid",width:"100%",gridTemplateColumns:"auto 1fr auto",gridColumnGap:e.spacing(1),padding:e.spacing(1),alignItems:"center","&.selected":{backgroundColor:E(e.palette.primary[e.palette.type],.2)},"&:hover, &:active, &:focus":{backgroundColor:E(e.palette.primary[e.palette.type],.3)}}})),Cr=({className:e,href:t,children:r})=>t?a.createElement(rt,{to:t,className:e},r):a.createElement("div",{className:e},r),Er=({result:e,name:t,timestamp:r,selected:n=!1,href:i})=>{const d=Ee(),u=F(d.root,{selected:n});return a.createElement(Cr,{href:i,className:u},a.createElement(Ce,{result:e}),a.createElement(m,{variant:"body2"},t),r?a.createElement(Re,{timestamp:r}):null)},Q=()=>{const e=Ee();return a.createElement(L,null,a.createElement("div",{className:e.root},a.createElement(f,{width:24,height:24}),a.createElement(m,{variant:"body2"},a.createElement(f,null)),a.createElement(f,{width:100,height:24})))},Pr=()=>{const e=Pe();return a.createElement("div",{className:e.root},a.createElement(W,null),new Array(3).fill(null).map((t,r)=>a.createElement(a.Fragment,{key:`skeleton-level-${r}`},a.createElement(hr,null),a.createElement("ul",{className:e.checks},a.createElement(Q,null),a.createElement(Q,null),a.createElement(Q,null)))))},wr=p(e=>({noChecks:{padding:e.spacing(1)},checks:{padding:0,margin:0,flex:1,listStyle:"none"},checkItem:{borderBottom:`1px solid ${e.palette.divider}`,"&:last-of-type":{borderBottom:"0"}}})),$r=({checks:e,trackId:t,checkId:r})=>{const n=wr(),i=j(oe);return e.length?a.createElement("ul",{className:n.checks},e.map(d=>a.createElement("li",{key:d.id,className:n.checkItem},a.createElement(Er,{...d,selected:d.id===r,href:i({trackId:t,checkId:d.id})})))):a.createElement(m,{variant:"body2",className:n.noChecks},"No applicable checks at this level.")},br=({level:e,checkId:t,trackId:r})=>{var n;return a.createElement(a.Fragment,null,a.createElement(pr,{badge:e.badge,title:e.name,description:e.description}),a.createElement($r,{checks:(n=e.checks)!=null?n:[],trackId:r,checkId:t}))},Pe=p(e=>({root:{borderRight:`1px solid ${e.palette.divider}`},checks:{padding:0,margin:0,flex:1,listStyle:"none"}})),Sr=({trackId:e,checkId:t})=>{var r,n;const i=Pe(),{entity:d}=te(),{data:u,isLoading:h,isError:v}=de(d,e);return v?a.createElement("div",{className:i.root},a.createElement(J,{padding:2},a.createElement(G,{severity:"error",title:"Error loading certification"}))):h||!e?a.createElement(Pr,null):u?a.createElement("div",{className:i.root},a.createElement(ke,{name:u.program.name,level:(r=u.highestLevel)==null?void 0:r.name,badge:(n=u.highestLevel)==null?void 0:n.badge,description:u.program.description,documentationUrl:u.program.documentationURL}),u==null?void 0:u.levels.map(y=>a.createElement(br,{key:y.ordinal,level:y,checkId:t,trackId:e}))):null},Ir=()=>a.createElement(a.Fragment,null,a.createElement(W,{hideDescription:!0}),a.createElement(W,{hideDescription:!0})),we=({className:e,description:t="There are no tracks configured that apply to this entity."})=>a.createElement("div",{className:e},a.createElement(ee,{title:"No certifications available",missing:"data",description:t})),Fr=({ownerEntityRef:e,selectGroupHint:t})=>e?a.createElement(ee,{missing:"data",title:"Missing entities",description:a.createElement(a.Fragment,null,"The group '",Xe(et(e),{defaultKind:"Group"}),"' doesn't own any entities.",t&&a.createElement(a.Fragment,null,a.createElement("br",null),a.createElement("br",null),t))}):null,$e="soundcheck",be="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.",Se=Qe(e=>({certificationWrapper:{display:"flex",justifyContent:"space-between",alignItems:"center"},infoCard:{display:"grid",gridRowGap:e.spacing(2)},emptyState:{"& > div":{backgroundColor:e.palette.background.paper}}})),A=({children:e,title:t})=>{const r=Se();return a.createElement(Je,{title:t},a.createElement("div",{className:r.infoCard},a.createElement(Ze,{inline:!0,backend:$e,invalidLicenseMessage:be}),e))},Dr=({title:e="Soundcheck"})=>{const{entity:t}=te(),r=Se(),{data:n,isError:i,isLoading:d}=le(t),u=j(ce);return i?a.createElement(A,{title:e},a.createElement(G,{severity:"error",title:"Error loading certifications"})):d||!n?a.createElement(A,{title:e},a.createElement(Ir,null)):n.length===0?a.createElement(A,{title:e},a.createElement(we,{className:r.emptyState})):a.createElement(A,{title:e},n.map((h,v)=>{var y,w;return a.createElement(ze,{key:h.program.name},a.createElement("div",{className:r.certificationWrapper,"data-testid":"soundcheck-track-row"},a.createElement(ke,{key:h.program.id,name:h.program.name,badge:(y=h.highestLevel)==null?void 0:y.badge,level:(w=h.highestLevel)==null?void 0:w.name}),a.createElement(Z,{to:u({trackId:h.program.id})},"View Details")),v<n.length-1?a.createElement(_e,null):null)}))};export{G as A,ne as B,Sr as C,_t as E,L as F,Xt as G,U as L,me as M,ye as N,ue as Q,g as R,tr as S,Re as a,le as b,ce as c,we as d,$e as e,oe as f,Dr as g,Ce as h,be as i,Fr as j,nr as k,cr as l,Vt as m,ar as n,k as o,Jt as p,Yt as q,Zt as r,N as s,Kt as t,de as u,sr as w};
388
+ //# sourceMappingURL=index-95ae147b.esm.js.map
@@ -1,2 +1,2 @@
1
- import e,{useState as n}from"react";import{Page as g,Header as f}from"@backstage/core-components";import{SpotifyLicenseBanner as s}from"@spotify/backstage-plugin-core";import{u as h,U as P,G as S,O as c}from"./OverviewPageContent-dbbba0be.esm.js";import{S as l,w as y,e as p,i as u}from"./index-37aedac7.esm.js";import{stringifyEntityRef as k}from"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import{useEntity as w}from"@backstage/plugin-catalog-react";import{makeStyles as C}from"@material-ui/core";import{Routes as L,Route as O}from"react-router-dom";import"@material-ui/lab/Autocomplete";import"react-use/lib/useAsync";import"./RefetchingIndicator-7160bb11.esm.js";import"react-use/lib/useDebounce";import"lodash";import"@material-ui/lab";import"react-window";import"graphql-request";import"graphql-tag";import"@material-ui/core/styles/makeStyles";import"classnames";import"@material-ui/icons/Schedule";import"luxon";import"@material-ui/icons/Check";import"@material-ui/icons/Close";import"@material-ui/icons/RemoveCircleOutline";import"@material-ui/icons/HelpOutline";const b=C(t=>({overviewContainer:{padding:t.spacing(1,3)}})),G=t=>{const{title:i="Soundcheck"}=t,o=b(),[r,a]=h(),{group:d}=r,[E,v]=n(void 0);return e.createElement(l,null,e.createElement(P,null,e.createElement(y,null,e.createElement(g,{themeId:"website"},e.createElement(s,{backend:p,invalidLicenseMessage:u}),e.createElement(f,{title:i},e.createElement(S,{onChange:m=>{m&&a({...r,group:m})},initialValue:d,setError:v})),e.createElement("div",{className:o.overviewContainer},e.createElement(c,{groupSelectorError:E,searchParams:r,setSearchParams:a}))))))},M=()=>{const{entity:t}=w(),i={group:k(t)},[o,r]=n(i);return e.createElement(l,null,e.createElement(L,null,e.createElement(O,{path:"/*",element:e.createElement(e.Fragment,null,e.createElement(s,{backend:p,invalidLicenseMessage:u,inline:!0}),e.createElement(c,{searchParams:o,setSearchParams:r}))})))};export{M as FixedGroupOverviewPage,G as OverviewPage};
2
- //# sourceMappingURL=index-829d0670.esm.js.map
1
+ import e,{useState as n}from"react";import{Page as g,Header as f}from"@backstage/core-components";import{SpotifyLicenseBanner as s}from"@spotify/backstage-plugin-core";import{u as h,U as P,G as S,O as c}from"./OverviewPageContent-7cf86a3a.esm.js";import{S as l,w as y,e as p,i as u}from"./index-95ae147b.esm.js";import{stringifyEntityRef as k}from"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import{useEntity as w}from"@backstage/plugin-catalog-react";import{makeStyles as C}from"@material-ui/core";import{Routes as G,Route as L}from"react-router-dom";import"@material-ui/lab/Autocomplete";import"react-use/lib/useAsync";import"./RefetchingIndicator-b042ec49.esm.js";import"react-use/lib/useDebounce";import"lodash";import"@material-ui/lab";import"react-window";import"graphql-request";import"graphql-tag";import"@material-ui/core/styles/makeStyles";import"classnames";import"@material-ui/icons/Schedule";import"luxon";import"@material-ui/icons/Check";import"@material-ui/icons/Close";import"@material-ui/icons/RemoveCircleOutline";import"@material-ui/icons/HelpOutline";const O=C(t=>({overviewContainer:{padding:t.spacing(1,3)}})),b=t=>{const{title:i="Soundcheck"}=t,o=O(),[r,a]=h(),{group:d}=r,[E,v]=n(void 0);return e.createElement(l,null,e.createElement(P,null,e.createElement(y,null,e.createElement(g,{themeId:"website"},e.createElement(s,{backend:p,invalidLicenseMessage:u}),e.createElement(f,{title:i},e.createElement(S,{onChange:m=>{m&&a({...r,group:m})},initialValue:d,setError:v})),e.createElement("div",{className:o.overviewContainer},e.createElement(c,{groupSelectorError:E,searchParams:r,setSearchParams:a}))))))},x=()=>{const{entity:t}=w(),i={group:k(t)},[o,r]=n(i);return e.createElement(l,null,e.createElement(G,null,e.createElement(L,{path:"/*",element:e.createElement(e.Fragment,null,e.createElement(s,{backend:p,invalidLicenseMessage:u,inline:!0}),e.createElement(c,{searchParams:o,setSearchParams:r,isFixedGroup:!0}))})))};export{x as FixedGroupOverviewPage,b as OverviewPage};
2
+ //# sourceMappingURL=index-fcd50c7d.esm.js.map
package/dist/index.esm.js CHANGED
@@ -1,2 +1,2 @@
1
- import{o as f,E as l,G as q,p as w,q as x,n as O}from"./esm/index-37aedac7.esm.js";import"react";import"@backstage/core-plugin-api";import"graphql-request";import"graphql-tag";import"@tanstack/react-query";import"lodash";import"@material-ui/core/styles/makeStyles";import"@material-ui/core";import"@backstage/core-components";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-core";import"@backstage/catalog-model";import"@material-ui/lab";import"react-router-dom";import"classnames";import"@material-ui/icons/Schedule";import"luxon";import"@material-ui/icons/Check";import"@material-ui/icons/Close";import"@material-ui/icons/RemoveCircleOutline";import"@material-ui/icons/HelpOutline";export{f as EntitySoundcheckCard,l as EntitySoundcheckContent,q as GroupSoundcheckContent,w as SoundcheckOverviewPage,x as SoundcheckRoutingPage,O as soundcheckPlugin};
1
+ import{p as f,E as l,G as q,q as w,r as x,o as O}from"./esm/index-95ae147b.esm.js";import"react";import"@backstage/core-plugin-api";import"graphql-request";import"graphql-tag";import"@tanstack/react-query";import"lodash";import"@material-ui/core/styles/makeStyles";import"@material-ui/core";import"@backstage/core-components";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-core";import"@backstage/catalog-model";import"@material-ui/lab";import"react-router-dom";import"classnames";import"@material-ui/icons/Schedule";import"luxon";import"@material-ui/icons/Check";import"@material-ui/icons/Close";import"@material-ui/icons/RemoveCircleOutline";import"@material-ui/icons/HelpOutline";export{f as EntitySoundcheckCard,l as EntitySoundcheckContent,q as GroupSoundcheckContent,w as SoundcheckOverviewPage,x as SoundcheckRoutingPage,O 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.7.0",
4
+ "version": "0.8.1",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "homepage": "https://backstage.spotify.com",
7
7
  "main": "dist/index.esm.js",
@@ -13,6 +13,7 @@
13
13
  "backstage": {
14
14
  "role": "frontend-plugin"
15
15
  },
16
+ "sideEffects": false,
16
17
  "scripts": {
17
18
  "start": "backstage-cli package start",
18
19
  "build": "backstage-cli package build --minify",
@@ -26,32 +27,35 @@
26
27
  "prepare": "yarn generate"
27
28
  },
28
29
  "dependencies": {
29
- "@backstage/catalog-model": "^1.4.1",
30
- "@backstage/core-components": "^0.13.4",
31
- "@backstage/core-plugin-api": "^1.5.3",
32
- "@backstage/plugin-catalog-react": "^1.8.1",
33
- "@backstage/plugin-permission-react": "^0.4.14",
34
- "@backstage/theme": "^0.4.1",
35
- "@backstage/types": "^1.1.0",
30
+ "@backstage/catalog-client": "^1.4.4",
31
+ "@backstage/catalog-model": "^1.4.2",
32
+ "@backstage/core-components": "^0.13.5",
33
+ "@backstage/core-plugin-api": "^1.6.0",
34
+ "@backstage/plugin-catalog-react": "^1.8.4",
35
+ "@backstage/plugin-permission-react": "^0.4.15",
36
+ "@backstage/theme": "^0.4.2",
37
+ "@backstage/types": "^1.1.1",
36
38
  "@material-ui/core": "^4.12.2",
37
39
  "@material-ui/icons": "^4.9.1",
38
40
  "@material-ui/lab": "4.0.0-alpha.61",
39
- "@spotify/backstage-plugin-core": "^0.5.5",
40
- "@spotify/backstage-plugin-soundcheck-common": "^0.7.1",
41
+ "@spotify/backstage-plugin-core": "^0.5.6",
42
+ "@spotify/backstage-plugin-soundcheck-common": "^0.8.1",
41
43
  "@tanstack/react-query": "^4.6.1",
42
44
  "classnames": "^2.3.2",
43
45
  "cron-validate": "^1.4.5",
44
46
  "cronstrue": "^2.28.0",
47
+ "framer-motion": "^6.0.0",
45
48
  "graphql-request": "6.1.0",
46
49
  "lodash": "^4.17.21",
47
50
  "luxon": "^3.1.1",
51
+ "react-circular-progressbar": "^2.1.0",
48
52
  "react-confetti": "^6.1.0",
49
53
  "react-dnd": "^16.0.1",
50
54
  "react-dnd-html5-backend": "^16.0.1",
51
55
  "react-hook-form": "^7.19.5",
52
56
  "react-use": "^17.2.4",
53
57
  "react-window": "^1.8.8",
54
- "recharts": "2.7.3",
58
+ "recharts": "^2.8.0",
55
59
  "uuid": "^9.0.0"
56
60
  },
57
61
  "peerDependencies": {
@@ -59,16 +63,18 @@
59
63
  "react-router-dom": "6.0.0-beta.0 || ^6.3.0"
60
64
  },
61
65
  "devDependencies": {
62
- "@backstage/cli": "^0.22.10",
63
- "@backstage/core-app-api": "^1.9.1",
64
- "@backstage/dev-utils": "^1.0.18",
65
- "@backstage/test-utils": "^1.4.2",
66
+ "@backstage/cli": "^0.22.13",
67
+ "@backstage/core-app-api": "^1.10.0",
68
+ "@backstage/dev-utils": "^1.0.21",
69
+ "@backstage/test-utils": "^1.4.3",
66
70
  "@graphql-codegen/cli": "^5.0.0",
67
71
  "@graphql-codegen/typescript": "^4.0.0",
68
72
  "@graphql-codegen/typescript-graphql-request": "^5.0.0",
69
73
  "@graphql-codegen/typescript-operations": "^4.0.0",
70
- "@spotify/backstage-plugin-core-common": "^0.5.5",
71
- "@testing-library/jest-dom": "^5.10.1",
74
+ "@playwright/test": "^1.32.3",
75
+ "@sp4b-dev/e2e-test-utils": "^0.0.0",
76
+ "@spotify/backstage-plugin-core-common": "^0.5.6",
77
+ "@testing-library/jest-dom": "^6.0.0",
72
78
  "@testing-library/react": "^12.1.5",
73
79
  "@testing-library/react-hooks": "^8.0.1",
74
80
  "@testing-library/user-event": "^14.0.0",
@@ -1,2 +0,0 @@
1
- import t,{useState as I,useEffect as k,useMemo as P,useCallback as j,createContext as pe,useContext as me,memo as b,Fragment as ue}from"react";import{useSearchParams as ge}from"react-router-dom";import{makeStyles as f,alpha as M,TextField as he,CircularProgress as fe,Tooltip as K,LinearProgress as ye,withStyles as ve,Grid as C,Typography as v}from"@material-ui/core";import ke from"@material-ui/lab/Autocomplete";import{stringifyEntityRef as H,parseEntityRef as w}from"@backstage/catalog-model";import{useApi as E,identityApiRef as U,useRouteRef as O,configApiRef as Ee}from"@backstage/core-plugin-api";import{useQuery as A}from"@tanstack/react-query";import{s as D,R as N,h as be,B as Ce,L as _,N as Q,A as we,d as Ne,j as Re}from"./index-37aedac7.esm.js";import{catalogApiRef as W,humanizeEntityRef as x,entityRouteRef as B}from"@backstage/plugin-catalog-react";import $e from"react-use/lib/useAsync";import{HeaderTabs as q,Link as S,EmptyState as xe}from"@backstage/core-components";import{R as Te}from"./RefetchingIndicator-7160bb11.esm.js";import{countBy as J}from"lodash";import{Skeleton as F}from"@material-ui/lab";import{VariableSizeGrid as Le}from"react-window";function Ie(){const e=E(W);return A(["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 n,l,o,i;return{name:(i=(o=(l=(n=a.spec)==null?void 0:n.profile)==null?void 0:l.displayName)!=null?o:a.metadata.title)!=null?i:a.metadata.name,ref:H(a)}})})}function Pe(e){const r=E(D);return A(["soundcheck/facets-for-owner",e],async()=>r.getFacetsForOwner(e),{enabled:!!e})}function X(e,r){const a=E(D);return A(["soundcheck/track-overview-for-owner",e,r],async()=>a.getProgramOverviewForOwner(e,r),{enabled:!!e&&!!(r!=null&&r.kind)})}function Oe(){const e=E(U),r=E(W);return A(["soundcheck/user-groups-claims"],async()=>{const{ownershipEntityRefs:a}=await e.getBackstageIdentity();return(await r.getEntitiesByRefs({entityRefs:a})).items.filter(n=>(n==null?void 0:n.kind)==="Group").map(n=>{var l,o,i,s;return{name:(s=(i=(o=(l=n.spec)==null?void 0:l.profile)==null?void 0:o.displayName)!=null?i:n.metadata.title)!=null?s:n.metadata.name,ref:H(n)}})})}const Ae=()=>{const[e,r]=ge(),a=Object.fromEntries(e.entries()),[n,l]=I(a);return k(()=>{r(n,{replace:!0})},[n]),[n,l]},Y=()=>{const{data:e,isLoading:r,isError:a}=Oe(),{data:n,isLoading:l,isError:o}=Ie();return{options:P(()=>{const i=[];return e&&i.push(...e.map(({name:s,ref:c})=>({name:s,ref:c,key:"My Groups"}))),n&&i.push(...n.map(({name:s,ref:c})=>({name:s,ref:c,key:"All Groups"}))),i},[e,n]),isLoading:r||l,isError:a||o}},Be=f(e=>({root:{width:"100%",minWidth:250},textField:{"& $notchedOutline":{borderColor:M(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:{}})),Se=e=>{const{onChange:r,initialValue:a,setError:n}=e,{options:l,isLoading:o,isError:i}=Y(),s=Be(),[c,d]=I(null);k(()=>{if(!o&&l!=null&&l.length&&!c){const p=a?l.find(m=>m.ref===a):l[0];p&&(d(p),r==null||r(p.ref))}},[o,l,c,r,a]);const u=j((p,m)=>{d(m),r==null||r(m==null?void 0:m.ref)},[r,d]);return k(()=>{n==null||n(i?new Error("Error loading groups"):void 0)},[i,n]),i?null:t.createElement(ke,{"aria-label":"Current group",className:s.root,classes:{clearIndicator:s.clearIndicator,popupIndicator:s.popupIndicator},disableClearable:!0,options:l!=null?l:[],loading:o,groupBy:p=>p.key,value:c,freeSolo:!1,onChange:u,getOptionLabel:p=>p.name,renderInput:p=>t.createElement(he,{...p,variant:"outlined",placeholder:o?"Loading":"Select a group",className:s.textField,InputProps:{...p.InputProps,className:s.input,classes:{notchedOutline:s.notchedOutline},endAdornment:t.createElement(t.Fragment,null,o?t.createElement(fe,{color:"inherit",size:20}):null,p.InputProps.endAdornment)}})})},Z={loading:!1},ee=pe(Z),Fe=()=>me(ee),ze=({children:e})=>{const[r,a]=I(Z),n=E(W),l=E(U),{value:o,loading:i,error:s}=$e(async()=>{const[{token:c},d]=await Promise.all([l.getCredentials(),l.getBackstageIdentity()]);return c?await n.getEntityByRef(d.userEntityRef):null},[n,l]);return k(()=>{if(o){const c=H(o);a({user:o,userEntityRef:c,loading:i,error:s})}else a({loading:i,error:s})},[o,i,s]),t.createElement(ee.Provider,{value:r},e)},He=e=>({key:`skeleton${e}`,label:"",id:`skeleton${e}`}),We=()=>{const e=Array.from({length:4},(r,a)=>He(a));return t.createElement(q,{tabs:e})},Ge=f(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)}})),Ve=({unfilteredFacets:e,onChange:r,kind:a,type:n})=>{var l,o,i;const s=Ge(),c={types:(l=e==null?void 0:e.types.filter(({count:m})=>m>0))!=null?l:[]},d=j(m=>{var g;r((g=c==null?void 0:c.types[m].kind)!=null?g:"",c==null?void 0:c.types[m].type)},[c==null?void 0:c.types,r]);k(()=>{var m,g,y;const h=(c==null?void 0:c.types)&&c.types.length>=0,T=!a&&h,$=a&&h&&!(c!=null&&c.types.find(({kind:L,type:V})=>a===L&&(!n&&!V||n===V)));(T||$)&&r((g=(m=c==null?void 0:c.types[0])==null?void 0:m.kind)!=null?g:"",(y=c==null?void 0:c.types[0])==null?void 0:y.type)},[a,n,c==null?void 0:c.types,r]);const u=(o=c==null?void 0:c.types.map(({kind:m,type:g,count:y})=>{const h=`${m}|${g!=null?g:""}`;return{key:h,label:`${g!=null?g:m} (${y>50?"50+":y})`,id:h,tabProps:{className:s.tab}}}))!=null?o:[];if(!u.length)return null;const p=(i=c==null?void 0:c.types.findIndex(m=>m.kind===a&&(!m.type&&!n||m.type===n)))!=null?i:-1;return t.createElement(t.Fragment,null,t.createElement(Te,null),t.createElement(q,{onChange:d,tabs:u,selectedIndex:p>-1?p:void 0}))},je=f(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"}})),te=e=>{var r,a;const n=je(e),l=P(()=>Object.entries(e.progress).reduce((i,[,s])=>i+s,0),[e.progress]);if(l===0)return null;const o=(r=e.progress[N.Passed])!=null?r:0;return t.createElement(K,{arrow:!0,title:`Check passing for ${o} of ${l} ${l===1?"entity":"entities"}`,enterDelay:0,placement:"top"},t.createElement(ye,{variant:"determinate",value:((a=e.progress[N.Passed])!=null?a:0)/l*100,classes:{root:n.root,bar:n.bar}}))},Me=f(e=>({headerWrapper:{marginTop:e.spacing(.5)},entityRefName:{fontWeight:"bold"},iconWrapper:{padding:e.spacing(1.5,.5),display:"flex",alignItems:"center",justifyContent:"center"}})),Ke=({check:{name:e,description:r},icon:a,entityRef:n})=>{const l=Me(),o=w(n);return t.createElement(C,{spacing:1},t.createElement(C,{container:!0,direction:"row",spacing:1,wrap:"nowrap"},t.createElement("div",{className:l.iconWrapper},a),t.createElement(v,{variant:"h6",className:l.headerWrapper,noWrap:!0},e)),t.createElement(C,{item:!0,wrap:"nowrap"},t.createElement(v,{variant:"subtitle2",className:l.entityRefName},x(o,{defaultKind:o.kind}))),t.createElement(v,{variant:"caption"},r))},Ue=ve(e=>{const r=e.palette.type==="dark"?e.palette.common.black:e.palette.grey[300];return{tooltip:{backgroundColor:r,color:e.palette.type==="dark"?e.palette.common.white:e.palette.grey[700]},arrow:{color:r}}})(K),De=({children:e,check:r,icon:a,entityRef:n})=>t.createElement(Ue,{arrow:!0,title:t.createElement(Ke,{check:r,icon:a,entityRef:n}),enterDelay:150,placement:"top"},e),_e=f(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:"17px",height:"17px"},virtualized:{borderBottom:`1px solid ${e.palette.divider}`,borderRight:`1px solid ${e.palette.divider}`}})),re=b(({programId:e,check:r,entityRef:a,result:n,entityRoute:l,isVirtualized:o})=>{const i=_e();if(typeof a!="string"){const u=t.createElement("div",{className:i.iconWrapper},t.createElement("div",{className:i.icon}));return o?t.createElement("div",{className:`${i.root} ${i.virtualized}`,"aria-hidden":!0},u):t.createElement("td",{className:i.root,"aria-hidden":!0},u)}const s=t.createElement(be,{className:i.icon,result:n!=null?n:N.NotReported}),c=t.createElement("div",{className:i.iconWrapper},s),d=n&&n===N.NotApplicable?c:t.createElement(S,{className:i.link,to:`${l(w(a))}/soundcheck/${e}/${r.id}`},c);return o?t.createElement("div",{className:`${i.root} ${i.virtualized}`},t.createElement(De,{check:r,icon:s,entityRef:a},d)):t.createElement("td",{className:`${i.root}`},d)}),ae=8,Qe=16,R={programTitle:70,levelTitle:30,check:42,entityRefFooter:100},z={programTitle:350+Qe*2,checkResult:42},qe=e=>e.reduce((r,a)=>r+a.height,0),Je=e=>e*z.checkResult+z.programTitle,Xe=e=>e.filter(r=>r!==void 0).map(r=>{const a=w(r);return x(a,{defaultKind:a.kind})}).reduce((r,a)=>r.length>a.length?r:a,""),Ye=e=>ae*e+ae,ne="NoLevel",Ze=e=>({name:ne,badge:{options:{level:0,color:""},variant:Ce.Medal},entityRef:e,ordinal:0}),le=f(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:`${R.check}px`,lineHeight:`${R.check}px`,borderBottom:`1px solid ${e.palette.divider}`,borderRight:`1px solid ${e.palette.divider}`}})),et=b(({programId:e,programName:r,check:a,entityRefs:n,results:l,entityRoute:o})=>{const i=le(),s=P(()=>J(l.filter(({result:d})=>d!==N.NotApplicable),"result"),[l]),c=new Map(l.map(d=>[d.entityRef,d.result]));return t.createElement("tr",{"data-testid":"track-check-row"},t.createElement("th",{scope:"row",className:i.checkNameCell,"aria-label":`${a.name} check for ${r} track`},t.createElement("div",{className:i.checkNameContent},t.createElement(v,{className:i.checkNameTypography,variant:"subtitle2",component:"p"},a.name),t.createElement(te,{className:i.checkIndicator,progress:s}))),n.map((d,u)=>t.createElement(re,{key:u,programId:e,check:a,entityRef:d,result:typeof d=="string"?c.get(d):void 0,entityRoute:o})))}),tt=({name:e,progress:r})=>{const a=le();return t.createElement("div",{className:a.checkNameCell,"aria-label":`${e} check`},t.createElement("div",{className:`${a.checkNameContent} ${a.checkNameCellVirtualized}`},t.createElement(v,{variant:"subtitle2",component:"p",className:a.checkNameTypography},e),t.createElement(te,{className:a.checkIndicator,progress:r})))},rt=f(e=>({virtualized:{borderRight:`1px solid ${e.palette.divider}`,height:`${R.programTitle}px`,display:"flex",justifyContent:"center",alignItems:"center"}})),at=b(({entityRef:e,highestLevels:r})=>{const a=r.find(n=>n.entityRef===e);return t.createElement(t.Fragment,null,a!=null&&a.badge?t.createElement(_,{badge:a.badge}):t.createElement(Q,null))}),nt=({highestLevel:e})=>{const r=rt();if(!(e!=null&&e.badge))return t.createElement("div",{className:r.virtualized},"\xA0");const a=e.name!==ne;return t.createElement("div",{className:r.virtualized},a?t.createElement(_,{badge:e.badge}):t.createElement(Q,null))},oe=f(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}`}})),lt=b(({program:e,entityRefs:r,highestLevels:a})=>{const n=oe();return t.createElement("tr",{"data-testid":"track-title-row"},t.createElement("th",{scope:"row",className:n.programNameCell},t.createElement("div",{className:n.programNameContent},t.createElement(v,{className:n.programNameTypography,variant:"h5",component:"p"},e.name))),r.map((l,o)=>typeof l!="string"?t.createElement("td",{key:o,"aria-hidden":!0}):t.createElement("td",{key:o,"data-testid":"track-certification-cell"},t.createElement("div",{className:n.badgeCellContent},t.createElement(at,{entityRef:l,highestLevels:a})))))}),ot=b(({name:e})=>{const r=oe();return t.createElement("div",{className:`${r.programNameCell} ${r.programNameCellVirtualized}`},t.createElement("div",{className:r.programNameContent},t.createElement(v,{className:r.programNameTypography,variant:"h5",component:"p"},e)))}),G=f(e=>{const r=e.palette.type==="dark"?e.palette.grey[700]:e.palette.grey[100];return{root:{color:M(e.palette.getContrastText(r),.8),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:`${R.levelTitle}px`}}}),it=b(({level:e,entityRefs:r,programName:a})=>{const n=G();return t.createElement("tr",{className:n.root,"data-testid":"track-level-row"},t.createElement("th",{scope:"row",className:n.root},t.createElement("div",{className:n.levelContent},t.createElement(v,{className:n.levelTypography,variant:"subtitle2",component:"p","aria-label":`${e.name} for ${a} track`},e.name))),r.map((l,o)=>t.createElement("td",{key:o,className:n.root,"aria-hidden":!0})))}),st=({name:e})=>{const r=G();return t.createElement("div",{className:`${r.levelHeaderCell} ${r.root}`,"aria-label":`${e}`},t.createElement(v,{variant:"subtitle2",component:"p",className:r.levelTypography},e))},ct=()=>{const e=G();return t.createElement("div",{className:`${e.levelHeaderCell} ${e.root}`},"\xA0")},dt=({program:e,highestLevels:r,levels:a,entityRefs:n,entityRoute:l})=>t.createElement("tbody",null,t.createElement(lt,{program:e,entityRefs:n,highestLevels:r}),a.map((o,i)=>t.createElement(ue,{key:i},t.createElement(it,{entityRefs:n,level:o,programName:e.name}),o.checks.map(({check:s,results:c},d)=>t.createElement(et,{key:d,check:s,programId:e.id,programName:e.name,entityRefs:n,results:c,entityRoute:l}))))),ie=f(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:"max(15vh, 175px)"}})),pt=({entityRefs:e})=>{const r=O(B),a=ie();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((n,l)=>{if(typeof n!="string")return t.createElement("th",{key:l,className:a.cell,"aria-hidden":!0});const o=w(n);return t.createElement("th",{scope:"col",key:l,className:a.cell},t.createElement("div",{className:a.cellInner},t.createElement(S,{to:r(o)},x(o,{defaultKind:o.kind}))))})))},mt=({entityRef:e})=>{const r=O(B),a=ie(),n=e?w(e):void 0,l=n?t.createElement(S,{to:r(n)},x(n,{defaultKind:n.kind})):t.createElement(t.Fragment,null);return t.createElement("div",{className:a.cell},t.createElement("div",{className:a.cellInner},l))},ut=f(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]}})),se=()=>{const e=ut(),r=new Array(25).fill(void 0),a=new Array(5).fill(void 0),n=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(F,{width:180,height:40})),r.map((l,o)=>t.createElement("td",{key:o}))),n.map((l,o)=>t.createElement(t.Fragment,{key:o},t.createElement("tr",{className:e.header},t.createElement("td",{className:e.title},t.createElement(F,{width:180})),r.map((i,s)=>t.createElement("td",{key:s}))),a.map((i,s)=>t.createElement("tr",{key:s},t.createElement("td",{className:e.title},t.createElement(F,{width:240})),r.map((c,d)=>t.createElement("td",{key:d,className:e.checkResult},t.createElement(F,{width:18,height:18,variant:"rect"})))))))))},gt=f(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}`}}})),ht=b(e=>{const{setError:r,kind:a,type:n,ownerEntityRef:l}=e,o=gt(),i=O(B),{data:s,isLoading:c,isError:d}=X(l,{kind:a,type:n});if(k(()=>{r==null||r(d?new Error("Error loading track overview"):void 0)},[d,r]),c)return t.createElement(se,null);if(!s||!l)return null;const{programs:u,entityRefs:p}=s;if(!c&&!u.length)return t.createElement(xe,{missing:"data",title:"Missing tracks",description:t.createElement(t.Fragment,null,"Looks like the group"," ",x(w(l),{defaultKind:"Group"})," ","doesn't own any ",n!=null?n:a," components that have Soundcheck tracks set up.",t.createElement("br",null),t.createElement("br",null),"If you're an administrator, you can learn more about configuring and filtering tracks in the"," ",t.createElement(S,{to:"https://www.npmjs.com/package/@spotify/backstage-plugin-soundcheck-backend#entity-filter"},"docs"),".")});if(d)return null;const m=p.length>=25?p:[...p,...Array.from({length:25-p.length},()=>{})];return t.createElement("div",{className:o.root},t.createElement("table",{className:o.table,"aria-label":"Check results"},u.map(({program:g,levels:y,highestLevels:h},T)=>t.createElement(dt,{key:T,program:g,entityRefs:m,levels:y,highestLevels:h,entityRoute:i})),t.createElement(pt,{entityRefs:m})))}),ft=e=>t.createElement(ot,{name:e}),yt=e=>({type:"ProgramHeader",render:()=>ft(e)}),vt=e=>e?t.createElement(st,{name:e}):t.createElement(ct,null),ce=e=>({type:"LevelHeader",render:()=>vt(e)}),kt=(e,r)=>t.createElement(tt,{name:e,progress:r}),Et=(e,r)=>({type:"CheckTitle",render:()=>kt(e,r)}),bt=(e,r,a,n,l)=>t.createElement(re,{check:r,entityRef:a,entityRoute:l,programId:e,result:n,isVirtualized:!0}),Ct=(e,r,a,n,l)=>({type:"CheckResult",render:()=>bt(e,r,a,n,l)}),wt=e=>t.createElement(mt,{entityRef:e}),de=e=>({type:"EntityHeader",render:()=>wt(e)}),Nt=e=>t.createElement(nt,{highestLevel:e}),Rt=e=>({type:"LevelBadge",render:()=>Nt(e)}),$t=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})},xt=(e,r,a)=>{var n;const l=[];for(const{program:i,levels:s,highestLevels:c}of e){l.push({height:R.programTitle,cells:[yt(i.name),...r.map(d=>{const u=d?c.find(p=>p.entityRef===d)||Ze(d):void 0;return Rt(u)})]});for(const d of s){l.push({height:R.levelTitle,cells:[ce(d.name),...r.map(u=>ce(""))]});for(const{check:u,results:p}of d.checks)l.push({height:R.check,cells:[Et(u.name,J(p.filter(({result:m})=>m!==N.NotApplicable),"result")),...r.map(m=>{var g,y;return Ct(i.id,u,m,(y=(g=p.find(h=>h.entityRef===m))==null?void 0:g.result)!=null?y:N.NotApplicable,a)})]})}}const o=Xe(r!=null?r:[]);return l.push({height:Ye((n=o.length)!=null?n:1),cells:[de(""),...r.map(i=>de(i||""))]}),l},Tt=f(e=>({table:{backgroundColor:e.palette.background.paper,borderCollapse:"collapse",whiteSpace:"nowrap",textAlign:"left",overflow:"auto"}})),Lt=e=>{const{setError:r,kind:a,type:n,ownerEntityRef:l}=e,o=Tt(),i=O(B),{data:s,isLoading:c,isError:d}=X(l,{kind:a,type:n});if(k(()=>{r==null||r(d?new Error("Error loading program overview"):void 0)},[d,r]),c)return t.createElement(se,null);if(!s||!l)return null;const{programs:u,entityRefs:p}=s,m=p.length>=25?p:[...p,...Array.from({length:25-p.length},()=>{})],g=xt(u,m,i),y=$t(g);return t.createElement(C,{"aria-label":`Check results for ${n!=null?n:a}`,key:`${a}|${n!=null?n:""}`,item:!0,xs:12},t.createElement(Le,{className:o.table,columnCount:m.length+1,columnWidth:h=>h===0?z.programTitle:z.checkResult,rowCount:g.length,rowHeight:h=>g[h].height,height:qe(g),width:Je(m.length)},y))},It=({facets:e,ownerEntityRef:r,kind:a,type:n,setError:l})=>{const o=P(()=>{const i=new Map;return e.types.forEach(({kind:s,type:c})=>{const d=`${s}|${c!=null?c:""}`;i.set(d,t.createElement(Lt,{key:d,ownerEntityRef:r,kind:s,type:c,setError:l}))}),i},[e,r,l]);return t.createElement("div",null,o.get(`${a}|${n!=null?n:""}`))},Pt=f(()=>({scrollContainer:{overflow:"auto"}})),Ot=({facets:e,ownerEntityRef:r,hasError:a,kind:n,type:l,setError:o,useVirtualizedResultsTable:i})=>{var s,c,d;const u=Pt();return a?t.createElement(we,{severity:"error",title:a.message}):e&&((c=(s=e.types)==null?void 0:s.length)!=null?c:0)>0?(d=e.types)!=null&&d.find(p=>p.count>0)?t.createElement("div",{className:u.scrollContainer},i?t.createElement(It,{facets:e,kind:n,type:l,setError:o,ownerEntityRef:r,hasError:a}):t.createElement(ht,{ownerEntityRef:r,kind:n,type:l,setError:o})):t.createElement(Ne,{description:t.createElement(t.Fragment,null,"Looks like the group"," ",x(w(r),{defaultKind:"Group"})," ","doesn't own any entities that have any applicable tracks configured.",t.createElement("br",null),t.createElement("br",null),"Please select another group from the dropdown in the corner of the header.")}):t.createElement(Re,{ownerEntityRef:r})},At=f(()=>({tableContainer:{padding:0,backgroundColor:"transparent"}})),Bt=({groupSelectorError:e,searchParams:r,setSearchParams:a})=>{var n;const{group:l,kind:o,type:i}=r,[s,c]=I(void 0),[d,u]=I(void 0);k(()=>{((s==null?void 0:s.kind)!==o||(s==null?void 0:s.type)!==i)&&c({kind:o,type:i})},[o,i,s]);const{data:p,isLoading:m}=Pe(l),g=(n=E(Ee).getOptionalBoolean("soundcheck.virtualizeOverviewPage"))!=null?n:!0,y=d||e,h=($,L)=>{$&&(c({kind:$,type:L}),L?a({...r,kind:$,type:L}):(r!=null&&r.hasOwnProperty("type")&&delete r.type,a({...r,kind:$})))},T=At();return t.createElement(C,{container:!0,spacing:0},t.createElement(C,{item:!0,xs:12},m?t.createElement(We,null):t.createElement(Ve,{unfilteredFacets:p,kind:s==null?void 0:s.kind,type:s==null?void 0:s.type,onChange:h})),t.createElement(C,{item:!0,xs:12,className:T.tableContainer},!m&&t.createElement(Ot,{facets:p,kind:s==null?void 0:s.kind,type:s==null?void 0:s.type,setError:u,hasError:y,ownerEntityRef:l,useVirtualizedResultsTable:g})))};export{Se as G,Bt as O,ze as U,Y as a,Fe as b,Ae as u};
2
- //# sourceMappingURL=OverviewPageContent-dbbba0be.esm.js.map