@kuadrant/kuadrant-backstage-plugin-frontend 0.2.1 → 0.3.0-aaa46b4
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/dist/api.esm.js +40 -2
- package/dist/api.esm.js.map +1 -1
- package/dist/components/ApiAccessCard/ApiAccessCard.esm.js +20 -85
- package/dist/components/ApiAccessCard/ApiAccessCard.esm.js.map +1 -1
- package/dist/components/ApiKeyApprovalPage/ApiKeyApprovalPageWithPermissions.esm.js +18 -0
- package/dist/components/ApiKeyApprovalPage/ApiKeyApprovalPageWithPermissions.esm.js.map +1 -0
- package/dist/components/ApiKeyApprovalPage/index.esm.js +1 -0
- package/dist/components/ApiKeyApprovalPage/index.esm.js.map +1 -1
- package/dist/components/ApiKeyDetailPage/ApiKeyDetailPage.esm.js +19 -60
- package/dist/components/ApiKeyDetailPage/ApiKeyDetailPage.esm.js.map +1 -1
- package/dist/components/ApiKeyManagementTab/ApiKeyManagementTab.esm.js +45 -110
- package/dist/components/ApiKeyManagementTab/ApiKeyManagementTab.esm.js.map +1 -1
- package/dist/components/ApiProductInfoCard/ApiProductInfoCard.esm.js +3 -2
- package/dist/components/ApiProductInfoCard/ApiProductInfoCard.esm.js.map +1 -1
- package/dist/components/ApprovalQueueTable/ApprovalQueueTable.esm.js +16 -15
- package/dist/components/ApprovalQueueTable/ApprovalQueueTable.esm.js.map +1 -1
- package/dist/components/EditAPIProductDialog/EditAPIProductDialog.esm.js +2 -3
- package/dist/components/EditAPIProductDialog/EditAPIProductDialog.esm.js.map +1 -1
- package/dist/components/KuadrantPage/ApiProductsPage.esm.js +5 -18
- package/dist/components/KuadrantPage/ApiProductsPage.esm.js.map +1 -1
- package/dist/components/MyApiKeysTable/MyApiKeysTable.esm.js +28 -138
- package/dist/components/MyApiKeysTable/MyApiKeysTable.esm.js.map +1 -1
- package/dist/components/PermissionGate/PermissionGate.esm.js +2 -2
- package/dist/components/PermissionGate/PermissionGate.esm.js.map +1 -1
- package/dist/components/RequestAccessDialog/RequestAccessDialog.esm.js +32 -18
- package/dist/components/RequestAccessDialog/RequestAccessDialog.esm.js.map +1 -1
- package/dist/components/SimpleRequestAccessDialog/SimpleRequestAccessDialog.esm.js +13 -2
- package/dist/components/SimpleRequestAccessDialog/SimpleRequestAccessDialog.esm.js.map +1 -1
- package/dist/index.d.ts +47 -6
- package/dist/index.esm.js +1 -1
- package/dist/plugin.esm.js +2 -10
- package/dist/plugin.esm.js.map +1 -1
- package/dist/utils/apikeys.esm.js +21 -0
- package/dist/utils/apikeys.esm.js.map +1 -0
- package/dist/utils/styles.esm.js +5 -2
- package/dist/utils/styles.esm.js.map +1 -1
- package/dist-scalprum/internal.plugin-kuadrant.7f1de85661b1b848af15.js +2 -0
- package/dist-scalprum/internal.plugin-kuadrant.7f1de85661b1b848af15.js.map +1 -0
- package/dist-scalprum/plugin-manifest.json +3 -3
- package/dist-scalprum/static/1340.7c4f4722.chunk.js +3 -0
- package/dist-scalprum/static/1340.7c4f4722.chunk.js.map +1 -0
- package/dist-scalprum/static/1719.52ca7daf.chunk.js +2 -0
- package/dist-scalprum/static/1719.52ca7daf.chunk.js.map +1 -0
- package/dist-scalprum/static/{1881.56cde36b.chunk.js → 1931.f6a5edbb.chunk.js} +2 -2
- package/dist-scalprum/static/1931.f6a5edbb.chunk.js.map +1 -0
- package/dist-scalprum/static/20.b3a37d1d.chunk.js +3 -0
- package/dist-scalprum/static/20.b3a37d1d.chunk.js.map +1 -0
- package/dist-scalprum/static/2251.08f3db99.chunk.js +2 -0
- package/dist-scalprum/static/2251.08f3db99.chunk.js.map +1 -0
- package/dist-scalprum/static/2769.e09b0ab0.chunk.js +2 -0
- package/dist-scalprum/static/2769.e09b0ab0.chunk.js.map +1 -0
- package/dist-scalprum/static/2821.1ac360ec.chunk.js +2 -0
- package/dist-scalprum/static/2821.1ac360ec.chunk.js.map +1 -0
- package/dist-scalprum/static/2967.004a950e.chunk.js +2 -0
- package/dist-scalprum/static/2967.004a950e.chunk.js.map +1 -0
- package/dist-scalprum/static/327.74ecd572.chunk.js +2 -0
- package/dist-scalprum/static/327.74ecd572.chunk.js.map +1 -0
- package/dist-scalprum/static/3658.104704cc.chunk.js +2 -0
- package/dist-scalprum/static/3658.104704cc.chunk.js.map +1 -0
- package/dist-scalprum/static/3917.888fba36.chunk.js +2 -0
- package/dist-scalprum/static/3917.888fba36.chunk.js.map +1 -0
- package/dist-scalprum/static/3947.f5320e89.chunk.js +2 -0
- package/dist-scalprum/static/3947.f5320e89.chunk.js.map +1 -0
- package/dist-scalprum/static/438.4335b833.chunk.js +2 -0
- package/dist-scalprum/static/438.4335b833.chunk.js.map +1 -0
- package/dist-scalprum/static/4908.4f21d453.chunk.js +2 -0
- package/dist-scalprum/static/4908.4f21d453.chunk.js.map +1 -0
- package/dist-scalprum/static/5197.53535ff4.chunk.js +2 -0
- package/dist-scalprum/static/5197.53535ff4.chunk.js.map +1 -0
- package/dist-scalprum/static/5289.6c803140.chunk.js +2 -0
- package/dist-scalprum/static/5289.6c803140.chunk.js.map +1 -0
- package/dist-scalprum/static/5943.4e1dedc5.chunk.js +2 -0
- package/dist-scalprum/static/5943.4e1dedc5.chunk.js.map +1 -0
- package/dist-scalprum/static/6311.da1849d1.chunk.js +2 -0
- package/dist-scalprum/static/6311.da1849d1.chunk.js.map +1 -0
- package/dist-scalprum/static/6371.02375475.chunk.js +3 -0
- package/dist-scalprum/static/6371.02375475.chunk.js.map +1 -0
- package/dist-scalprum/static/6837.6252b97a.chunk.js +2 -0
- package/dist-scalprum/static/6837.6252b97a.chunk.js.map +1 -0
- package/dist-scalprum/static/7270.8ee9d452.chunk.js +2 -0
- package/dist-scalprum/static/7270.8ee9d452.chunk.js.map +1 -0
- package/dist-scalprum/static/980.744a4d36.chunk.js +2 -0
- package/dist-scalprum/static/980.744a4d36.chunk.js.map +1 -0
- package/dist-scalprum/static/exposed-KuadrantPage.f123b200.chunk.js +2 -0
- package/dist-scalprum/static/exposed-KuadrantPage.f123b200.chunk.js.map +1 -0
- package/dist-scalprum/static/exposed-PluginRoot.3a5f9157.chunk.js +2 -0
- package/dist-scalprum/static/exposed-PluginRoot.3a5f9157.chunk.js.map +1 -0
- package/package.json +1 -1
- package/dist/components/EntityApiApprovalTab/EntityApiApprovalTab.esm.js +0 -265
- package/dist/components/EntityApiApprovalTab/EntityApiApprovalTab.esm.js.map +0 -1
- package/dist/components/EntityApiApprovalTab/index.esm.js +0 -2
- package/dist/components/EntityApiApprovalTab/index.esm.js.map +0 -1
- package/dist-scalprum/internal.plugin-kuadrant.c4fb9c2347d3ad03a5d0.js +0 -2
- package/dist-scalprum/internal.plugin-kuadrant.c4fb9c2347d3ad03a5d0.js.map +0 -1
- package/dist-scalprum/static/1584.1e45e570.chunk.js +0 -3
- package/dist-scalprum/static/1584.1e45e570.chunk.js.map +0 -1
- package/dist-scalprum/static/1719.246c020d.chunk.js +0 -2
- package/dist-scalprum/static/1719.246c020d.chunk.js.map +0 -1
- package/dist-scalprum/static/1881.56cde36b.chunk.js.map +0 -1
- package/dist-scalprum/static/286.ee43f560.chunk.js +0 -2
- package/dist-scalprum/static/286.ee43f560.chunk.js.map +0 -1
- package/dist-scalprum/static/2967.0c2ef90e.chunk.js +0 -2
- package/dist-scalprum/static/2967.0c2ef90e.chunk.js.map +0 -1
- package/dist-scalprum/static/3581.ebe5968a.chunk.js +0 -2
- package/dist-scalprum/static/3581.ebe5968a.chunk.js.map +0 -1
- package/dist-scalprum/static/369.2374941c.chunk.js +0 -2
- package/dist-scalprum/static/369.2374941c.chunk.js.map +0 -1
- package/dist-scalprum/static/3947.4f4aa8c2.chunk.js +0 -2
- package/dist-scalprum/static/3947.4f4aa8c2.chunk.js.map +0 -1
- package/dist-scalprum/static/3976.e8a8fda2.chunk.js +0 -2
- package/dist-scalprum/static/3976.e8a8fda2.chunk.js.map +0 -1
- package/dist-scalprum/static/4434.f92f6ba4.chunk.js +0 -2
- package/dist-scalprum/static/4434.f92f6ba4.chunk.js.map +0 -1
- package/dist-scalprum/static/4908.196a4425.chunk.js +0 -2
- package/dist-scalprum/static/4908.196a4425.chunk.js.map +0 -1
- package/dist-scalprum/static/512.d592d164.chunk.js +0 -2
- package/dist-scalprum/static/512.d592d164.chunk.js.map +0 -1
- package/dist-scalprum/static/5289.55069930.chunk.js +0 -2
- package/dist-scalprum/static/5289.55069930.chunk.js.map +0 -1
- package/dist-scalprum/static/5605.430f697e.chunk.js +0 -2
- package/dist-scalprum/static/5605.430f697e.chunk.js.map +0 -1
- package/dist-scalprum/static/5978.bf347a09.chunk.js +0 -2
- package/dist-scalprum/static/5978.bf347a09.chunk.js.map +0 -1
- package/dist-scalprum/static/6371.7b57ac27.chunk.js +0 -3
- package/dist-scalprum/static/6371.7b57ac27.chunk.js.map +0 -1
- package/dist-scalprum/static/6426.4c18bab5.chunk.js +0 -2
- package/dist-scalprum/static/6426.4c18bab5.chunk.js.map +0 -1
- package/dist-scalprum/static/6777.a2b77ec5.chunk.js +0 -2
- package/dist-scalprum/static/6777.a2b77ec5.chunk.js.map +0 -1
- package/dist-scalprum/static/6800.a45da2f4.chunk.js +0 -2
- package/dist-scalprum/static/6800.a45da2f4.chunk.js.map +0 -1
- package/dist-scalprum/static/7005.8190ad95.chunk.js +0 -2
- package/dist-scalprum/static/7005.8190ad95.chunk.js.map +0 -1
- package/dist-scalprum/static/7057.fcd688c7.chunk.js +0 -2
- package/dist-scalprum/static/7057.fcd688c7.chunk.js.map +0 -1
- package/dist-scalprum/static/7270.d52407cd.chunk.js +0 -2
- package/dist-scalprum/static/7270.d52407cd.chunk.js.map +0 -1
- package/dist-scalprum/static/7717.6f5b9dd7.chunk.js +0 -3
- package/dist-scalprum/static/7717.6f5b9dd7.chunk.js.map +0 -1
- package/dist-scalprum/static/9079.2ddaea57.chunk.js +0 -2
- package/dist-scalprum/static/9079.2ddaea57.chunk.js.map +0 -1
- package/dist-scalprum/static/9239.1acfe112.chunk.js +0 -2
- package/dist-scalprum/static/9239.1acfe112.chunk.js.map +0 -1
- package/dist-scalprum/static/9625.b0c6610a.chunk.js +0 -2
- package/dist-scalprum/static/9625.b0c6610a.chunk.js.map +0 -1
- package/dist-scalprum/static/exposed-KuadrantPage.5ae00605.chunk.js +0 -2
- package/dist-scalprum/static/exposed-KuadrantPage.5ae00605.chunk.js.map +0 -1
- package/dist-scalprum/static/exposed-PluginRoot.949381c2.chunk.js +0 -2
- package/dist-scalprum/static/exposed-PluginRoot.949381c2.chunk.js.map +0 -1
- /package/dist-scalprum/static/{1584.1e45e570.chunk.js.LICENSE.txt → 1340.7c4f4722.chunk.js.LICENSE.txt} +0 -0
- /package/dist-scalprum/static/{7717.6f5b9dd7.chunk.js.LICENSE.txt → 20.b3a37d1d.chunk.js.LICENSE.txt} +0 -0
- /package/dist-scalprum/static/{6371.7b57ac27.chunk.js.LICENSE.txt → 6371.02375475.chunk.js.LICENSE.txt} +0 -0
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[3947],{71255:(e,a,i)=>{i.d(a,{n:()=>d});var s=i(31085),n=(i(95478),i(82300)),t=i(37725),l=i(96040),c=i(10394),r=i(42899),o=i(72501);const d=({issuerUrl:e,tokenEndpoint:a})=>{const i=a||e;return(0,s.jsx)(l.n,{title:"OIDC Provider Discovery",children:(0,s.jsx)(c.A,{p:2,children:(0,s.jsxs)(r.A,{container:!0,spacing:2,children:[(0,s.jsx)(r.A,{item:!0,xs:12,children:(0,s.jsx)(o.A,{variant:"body2",children:"This API uses OIDC authentication. Obtain a token from the identity provider below."})}),(0,s.jsx)(r.A,{item:!0,xs:12,children:(0,s.jsxs)(o.A,{variant:"body2",children:[(0,s.jsx)("strong",{children:"Identity Provider: "}),(0,s.jsx)(t.N_,{to:e,target:"_blank",children:e})]})}),a&&(0,s.jsx)(r.A,{item:!0,xs:12,children:(0,s.jsxs)(o.A,{variant:"body2",children:[(0,s.jsx)("strong",{children:"Token Endpoint: "}),(0,s.jsx)(t.N_,{to:a,target:"_blank",children:a})]})}),(0,s.jsx)(r.A,{item:!0,xs:12,children:(0,s.jsx)(n.z,{text:`# Example (Client Credentials Flow):\ncurl -X POST \\\n -d "grant_type=client_credentials" \\\n -d "client_id=YOUR_CLIENT_ID" \\\n -d "client_secret=YOUR_CLIENT_SECRET" \\\n ${i}`,language:"bash",showCopyCodeButton:!0})})]})})})}},89509:(e,a,i)=>{i.d(a,{O:()=>v});var s=i(31085),n=(i(95478),i(10394)),t=i(72501),l=i(67720),c=i(61009),r=i(47625),o=i(9719),d=i(54801),m=i(13677),h=i(42899),p=i(58837),x=i(37725),j=i(46299);const A=(0,p.A)(e=>({label:{fontWeight:600,color:e.palette.text.secondary,marginBottom:e.spacing(.5),fontSize:"0.75rem",textTransform:"uppercase"},tierChip:{marginRight:e.spacing(.5),marginBottom:e.spacing(.5)},statusChipPublished:{backgroundColor:e.palette.primary.main,color:e.palette.primary.contrastText},statusChipDraft:{backgroundColor:e.palette.grey[600],color:e.palette.common.white},infoGrid:{display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(180px, 1fr))",gap:e.spacing(3),marginBottom:e.spacing(3)},infoItem:{minWidth:0},apiLink:{color:e.palette.primary.main,textDecoration:"none","&:hover":{textDecoration:"underline"}}})),v=({product:e,showStatus:a=!0,showCatalogLink:i=!0,httpRouteHostnames:p})=>{var v,u,b,g,N,y,f,I,C,_,k,P,R,D,L,S,T,w,O;const U=A(),E=(null===(v=e.spec)||void 0===v?void 0:v.publishStatus)||"Draft",z="Published"===E,B=(null===(u=e.status)||void 0===u?void 0:u.discoveredPlans)||[],G=(null===(g=e.status)||void 0===g||null===(b=g.discoveredAuthScheme)||void 0===b?void 0:b.authentication)||{},H=Object.values(G).some(e=>e.hasOwnProperty("apiKey"));return(0,s.jsxs)(s.Fragment,{children:[(null===(N=e.spec)||void 0===N?void 0:N.description)&&(0,s.jsxs)(n.A,{mb:3,children:[(0,s.jsx)(t.A,{variant:"caption",className:U.label,children:"Description"}),(0,s.jsx)(t.A,{variant:"body1",children:e.spec.description})]}),(0,s.jsxs)(n.A,{className:U.infoGrid,children:[a&&(0,s.jsxs)(n.A,{className:U.infoItem,children:[(0,s.jsx)(t.A,{variant:"caption",className:U.label,children:"Publish Status"}),(0,s.jsx)(n.A,{children:(0,s.jsx)(l.A,{label:E,size:"small",className:z?U.statusChipPublished:U.statusChipDraft,"data-testid":"publish-status-chip"})})]}),(null===(y=e.metadata.labels)||void 0===y?void 0:y.lifecycle)&&(0,s.jsxs)(n.A,{className:U.infoItem,children:[(0,s.jsx)(t.A,{variant:"caption",className:U.label,children:"Lifecycle"}),(0,s.jsx)(n.A,{children:(0,s.jsx)(l.A,{label:e.metadata.labels.lifecycle,size:"small",style:(0,j.ee)(e.metadata.labels.lifecycle),"data-testid":"lifecycle-chip"})})]}),(0,s.jsxs)(n.A,{className:U.infoItem,children:[(0,s.jsx)(t.A,{variant:"caption",className:U.label,children:"Version"}),(0,s.jsx)(t.A,{variant:"body2",children:(null===(f=e.spec)||void 0===f?void 0:f.version)||"v1"})]}),(0,s.jsxs)(n.A,{className:U.infoItem,children:[(0,s.jsx)(t.A,{variant:"caption",className:U.label,children:"Namespace"}),(0,s.jsx)(t.A,{variant:"body2",children:e.metadata.namespace})]}),H&&(0,s.jsxs)(n.A,{className:U.infoItem,children:[(0,s.jsx)(t.A,{variant:"caption",className:U.label,children:"API Key Approval"}),(0,s.jsx)(t.A,{variant:"body2",children:"automatic"===(null===(I=e.spec)||void 0===I?void 0:I.approvalMode)?"Automatic":"Need manual approval"})]}),(null===(C=e.spec)||void 0===C?void 0:C.tags)&&e.spec.tags.length>0&&(0,s.jsxs)(n.A,{className:U.infoItem,children:[(0,s.jsx)(t.A,{variant:"caption",className:U.label,children:"Tags"}),(0,s.jsx)(n.A,{children:e.spec.tags.map(e=>(0,s.jsx)(l.A,{label:e,size:"small",variant:"outlined",className:U.tierChip},e))})]})]}),(0,s.jsxs)(n.A,{className:U.infoGrid,children:[(0,s.jsxs)(n.A,{className:U.infoItem,children:[(0,s.jsx)(t.A,{variant:"caption",className:U.label,children:"API"}),(0,s.jsx)("br",{}),i?(0,s.jsx)(x.N_,{to:`/catalog/default/api/${e.metadata.name}`,className:U.apiLink,children:e.metadata.name}):(0,s.jsx)(t.A,{variant:"body2",children:e.metadata.name})]}),(0,s.jsxs)(n.A,{className:U.infoItem,children:[(0,s.jsx)(t.A,{variant:"caption",className:U.label,children:"Route"}),(0,s.jsx)(t.A,{variant:"body2",children:(null===(k=e.spec)||void 0===k||null===(_=k.targetRef)||void 0===_?void 0:_.name)||"-"})]}),p&&p.length>0&&(0,s.jsxs)(n.A,{className:U.infoItem,children:[(0,s.jsx)(t.A,{variant:"caption",className:U.label,children:p.length>1?"Hostnames":"Hostname"}),p.map((e,a)=>(0,s.jsx)(t.A,{variant:"body2",children:e},a))]})]}),B.length>0&&(0,s.jsxs)(n.A,{mb:3,children:[(0,s.jsx)(t.A,{variant:"caption",className:U.label,children:"Available Tiers"}),(0,s.jsxs)(c.A,{size:"small",children:[(0,s.jsx)(r.A,{children:(0,s.jsxs)(o.A,{children:[(0,s.jsx)(d.A,{children:"Tier"}),(0,s.jsx)(d.A,{children:"Rate Limits"})]})}),(0,s.jsx)(m.A,{children:B.map(e=>(0,s.jsxs)(o.A,{children:[(0,s.jsx)(d.A,{children:(0,s.jsx)(l.A,{label:e.tier,size:"small"})}),(0,s.jsx)(d.A,{children:e.limits&&Object.entries(e.limits).map(([e,a])=>(0,s.jsxs)(t.A,{variant:"body2",children:[String(a)," per ",e]},e))})]},e.tier))})]})]}),(0,s.jsxs)(h.A,{container:!0,spacing:3,children:[((null===(R=e.spec)||void 0===R||null===(P=R.contact)||void 0===P?void 0:P.email)||(null===(L=e.spec)||void 0===L||null===(D=L.contact)||void 0===D?void 0:D.team))&&(0,s.jsxs)(h.A,{item:!0,xs:12,md:6,children:[(0,s.jsx)(t.A,{variant:"caption",className:U.label,children:"Contact Information"}),(0,s.jsxs)(n.A,{mt:1,children:[e.spec.contact.team&&(0,s.jsxs)(t.A,{variant:"body2",children:[(0,s.jsx)("strong",{children:"Team:"})," ",e.spec.contact.team]}),e.spec.contact.email&&(0,s.jsxs)(t.A,{variant:"body2",children:[(0,s.jsx)("strong",{children:"Email:"})," ",(0,s.jsx)(x.N_,{to:`mailto:${e.spec.contact.email}`,children:e.spec.contact.email})]})]})]}),((null===(T=e.spec)||void 0===T||null===(S=T.documentation)||void 0===S?void 0:S.docsURL)||(null===(O=e.spec)||void 0===O||null===(w=O.documentation)||void 0===w?void 0:w.openAPISpecURL))&&(0,s.jsxs)(h.A,{item:!0,xs:12,md:6,children:[(0,s.jsx)(t.A,{variant:"caption",className:U.label,children:"Documentation"}),(0,s.jsxs)(n.A,{mt:1,children:[e.spec.documentation.docsURL&&(0,s.jsxs)(t.A,{variant:"body2",children:[(0,s.jsx)("strong",{children:"Docs:"})," ",(0,s.jsx)(x.N_,{to:e.spec.documentation.docsURL,target:"_blank",children:"View Documentation"})]}),e.spec.documentation.openAPISpecURL&&(0,s.jsxs)(t.A,{variant:"body2",children:[(0,s.jsx)("strong",{children:"OpenAPI Spec:"})," ",(0,s.jsx)(x.N_,{to:e.spec.documentation.openAPISpecURL,target:"_blank",children:"View Spec"})]})]})]})]})]})}}}]);
|
|
2
|
-
//# sourceMappingURL=3947.4f4aa8c2.chunk.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"static/3947.4f4aa8c2.chunk.js","mappings":"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","sources":["webpack://internal.plugin-kuadrant/./src/components/OidcProviderCard/OidcProviderCard.tsx","webpack://internal.plugin-kuadrant/./src/components/ApiProductDetails/ApiProductDetails.tsx"],"sourcesContent":["import React from 'react';\nimport { InfoCard, CodeSnippet, Link } from '@backstage/core-components';\nimport { Typography, Box, Grid } from '@material-ui/core';\n\ninterface OidcProviderCardProps {\n issuerUrl: string;\n tokenEndpoint?: string;\n}\n\nexport const OidcProviderCard = ({ issuerUrl, tokenEndpoint }: OidcProviderCardProps) => {\n const effectiveTokenEndpoint = tokenEndpoint || issuerUrl;\n\n return (\n <InfoCard title=\"OIDC Provider Discovery\">\n <Box p={2}>\n <Grid container spacing={2}>\n <Grid item xs={12}>\n <Typography variant=\"body2\">\n This API uses OIDC authentication. Obtain a token from the identity provider below.\n </Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"body2\">\n <strong>Identity Provider: </strong>\n <Link to={issuerUrl} target=\"_blank\">\n {issuerUrl}\n </Link>\n </Typography>\n </Grid>\n {tokenEndpoint && (\n <Grid item xs={12}>\n <Typography variant=\"body2\">\n <strong>Token Endpoint: </strong>\n <Link to={tokenEndpoint} target=\"_blank\">\n {tokenEndpoint}\n </Link>\n </Typography>\n </Grid>\n )}\n <Grid item xs={12}>\n <CodeSnippet\n text={`# Example (Client Credentials Flow):\ncurl -X POST \\\\\n -d \"grant_type=client_credentials\" \\\\\n -d \"client_id=YOUR_CLIENT_ID\" \\\\\n -d \"client_secret=YOUR_CLIENT_SECRET\" \\\\\n ${effectiveTokenEndpoint}`}\n language=\"bash\"\n showCopyCodeButton\n />\n </Grid>\n </Grid>\n </Box>\n </InfoCard>\n );\n};\n","import React from \"react\";\nimport {\n Box,\n Typography,\n Chip,\n makeStyles,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Grid,\n} from \"@material-ui/core\";\nimport { Link } from \"@backstage/core-components\";\nimport { APIProduct, Plan } from \"../../types/api-management\";\nimport { getLifecycleChipStyle } from \"../../utils/styles\";\n\nconst useStyles = makeStyles((theme) => ({\n label: {\n fontWeight: 600,\n color: theme.palette.text.secondary,\n marginBottom: theme.spacing(0.5),\n fontSize: \"0.75rem\",\n textTransform: \"uppercase\",\n },\n tierChip: {\n marginRight: theme.spacing(0.5),\n marginBottom: theme.spacing(0.5),\n },\n statusChipPublished: {\n backgroundColor: theme.palette.primary.main,\n color: theme.palette.primary.contrastText,\n },\n statusChipDraft: {\n backgroundColor: theme.palette.grey[600],\n color: theme.palette.common.white,\n },\n infoGrid: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(180px, 1fr))\",\n gap: theme.spacing(3),\n marginBottom: theme.spacing(3),\n },\n infoItem: {\n minWidth: 0,\n },\n apiLink: {\n color: theme.palette.primary.main,\n textDecoration: \"none\",\n \"&:hover\": {\n textDecoration: \"underline\",\n },\n },\n}));\n\ninterface ApiProductDetailsProps {\n product: APIProduct;\n showStatus?: boolean;\n showCatalogLink?: boolean;\n httpRouteHostnames?: string[] | null;\n}\n\nexport const ApiProductDetails = ({\n product,\n showStatus = true,\n showCatalogLink = true,\n httpRouteHostnames,\n}: ApiProductDetailsProps) => {\n const classes = useStyles();\n\n const publishStatus = product.spec?.publishStatus || \"Draft\";\n const isPublished = publishStatus === \"Published\";\n const tiers = product.status?.discoveredPlans || [];\n\n // check if product has API key auth\n const authSchemes = product.status?.discoveredAuthScheme?.authentication || {};\n const schemeObjects = Object.values(authSchemes);\n const hasApiKey = schemeObjects.some(\n (scheme: any) => scheme.hasOwnProperty(\"apiKey\"),\n );\n\n return (\n <>\n {product.spec?.description && (\n <Box mb={3}>\n <Typography variant=\"caption\" className={classes.label}>\n Description\n </Typography>\n <Typography variant=\"body1\">{product.spec.description}</Typography>\n </Box>\n )}\n\n <Box className={classes.infoGrid}>\n {showStatus && (\n <Box className={classes.infoItem}>\n <Typography variant=\"caption\" className={classes.label}>\n Publish Status\n </Typography>\n <Box>\n <Chip\n label={publishStatus}\n size=\"small\"\n className={\n isPublished\n ? classes.statusChipPublished\n : classes.statusChipDraft\n }\n data-testid=\"publish-status-chip\"\n />\n </Box>\n </Box>\n )}\n {product.metadata.labels?.lifecycle && (\n <Box className={classes.infoItem}>\n <Typography variant=\"caption\" className={classes.label}>\n Lifecycle\n </Typography>\n <Box>\n <Chip\n label={product.metadata.labels.lifecycle}\n size=\"small\"\n style={getLifecycleChipStyle(product.metadata.labels.lifecycle)}\n data-testid=\"lifecycle-chip\"\n />\n </Box>\n </Box>\n )}\n <Box className={classes.infoItem}>\n <Typography variant=\"caption\" className={classes.label}>\n Version\n </Typography>\n <Typography variant=\"body2\">\n {product.spec?.version || \"v1\"}\n </Typography>\n </Box>\n <Box className={classes.infoItem}>\n <Typography variant=\"caption\" className={classes.label}>\n Namespace\n </Typography>\n <Typography variant=\"body2\">{product.metadata.namespace}</Typography>\n </Box>\n {hasApiKey && (\n <Box className={classes.infoItem}>\n <Typography variant=\"caption\" className={classes.label}>\n API Key Approval\n </Typography>\n <Typography variant=\"body2\">\n {product.spec?.approvalMode === \"automatic\"\n ? \"Automatic\"\n : \"Need manual approval\"}\n </Typography>\n </Box>\n )}\n {product.spec?.tags && product.spec.tags.length > 0 && (\n <Box className={classes.infoItem}>\n <Typography variant=\"caption\" className={classes.label}>\n Tags\n </Typography>\n <Box>\n {product.spec.tags.map((tag) => (\n <Chip\n key={tag}\n label={tag}\n size=\"small\"\n variant=\"outlined\"\n className={classes.tierChip}\n />\n ))}\n </Box>\n </Box>\n )}\n </Box>\n\n <Box className={classes.infoGrid}>\n <Box className={classes.infoItem}>\n <Typography variant=\"caption\" className={classes.label}>\n API\n </Typography>\n <br />\n {showCatalogLink ? (\n <Link\n to={`/catalog/default/api/${product.metadata.name}`}\n className={classes.apiLink}\n >\n {product.metadata.name}\n </Link>\n ) : (\n <Typography variant=\"body2\">{product.metadata.name}</Typography>\n )}\n </Box>\n <Box className={classes.infoItem}>\n <Typography variant=\"caption\" className={classes.label}>\n Route\n </Typography>\n <Typography variant=\"body2\">\n {product.spec?.targetRef?.name || \"-\"}\n </Typography>\n </Box>\n {httpRouteHostnames && httpRouteHostnames.length > 0 && (\n <Box className={classes.infoItem}>\n <Typography variant=\"caption\" className={classes.label}>\n {httpRouteHostnames.length > 1 ? \"Hostnames\" : \"Hostname\"}\n </Typography>\n {httpRouteHostnames.map((hostname, index) => (\n <Typography key={index} variant=\"body2\">\n {hostname}\n </Typography>\n ))}\n </Box>\n )}\n </Box>\n\n {tiers.length > 0 && (\n <Box mb={3}>\n <Typography variant=\"caption\" className={classes.label}>\n Available Tiers\n </Typography>\n <Table size=\"small\">\n <TableHead>\n <TableRow>\n <TableCell>Tier</TableCell>\n <TableCell>Rate Limits</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {tiers.map((plan: Plan) => (\n <TableRow key={plan.tier}>\n <TableCell>\n <Chip label={plan.tier} size=\"small\" />\n </TableCell>\n <TableCell>\n {plan.limits &&\n Object.entries(plan.limits).map(([key, value]) => (\n <Typography key={key} variant=\"body2\">\n {String(value)} per {key}\n </Typography>\n ))}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </Box>\n )}\n\n <Grid container spacing={3}>\n {(product.spec?.contact?.email || product.spec?.contact?.team) && (\n <Grid item xs={12} md={6}>\n <Typography variant=\"caption\" className={classes.label}>\n Contact Information\n </Typography>\n <Box mt={1}>\n {product.spec.contact.team && (\n <Typography variant=\"body2\">\n <strong>Team:</strong> {product.spec.contact.team}\n </Typography>\n )}\n {product.spec.contact.email && (\n <Typography variant=\"body2\">\n <strong>Email:</strong>{\" \"}\n <Link to={`mailto:${product.spec.contact.email}`}>\n {product.spec.contact.email}\n </Link>\n </Typography>\n )}\n </Box>\n </Grid>\n )}\n\n {(product.spec?.documentation?.docsURL ||\n product.spec?.documentation?.openAPISpecURL) && (\n <Grid item xs={12} md={6}>\n <Typography variant=\"caption\" className={classes.label}>\n Documentation\n </Typography>\n <Box mt={1}>\n {product.spec.documentation.docsURL && (\n <Typography variant=\"body2\">\n <strong>Docs:</strong>{\" \"}\n <Link to={product.spec.documentation.docsURL} target=\"_blank\">\n View Documentation\n </Link>\n </Typography>\n )}\n {product.spec.documentation.openAPISpecURL && (\n <Typography variant=\"body2\">\n <strong>OpenAPI Spec:</strong>{\" \"}\n <Link\n to={product.spec.documentation.openAPISpecURL}\n target=\"_blank\"\n >\n View Spec\n </Link>\n </Typography>\n )}\n </Box>\n </Grid>\n )}\n </Grid>\n </>\n );\n};\n"],"names":["OidcProviderCard","issuerUrl","tokenEndpoint","effectiveTokenEndpoint","InfoCard","title","Box","p","Grid","container","spacing","item","xs","Typography","variant","strong","Link","to","target","CodeSnippet","text","language","showCopyCodeButton","useStyles","makeStyles","theme","label","fontWeight","color","palette","secondary","marginBottom","fontSize","textTransform","tierChip","marginRight","statusChipPublished","backgroundColor","primary","main","contrastText","statusChipDraft","grey","common","white","infoGrid","display","gridTemplateColumns","gap","infoItem","minWidth","apiLink","textDecoration","ApiProductDetails","product","showStatus","showCatalogLink","httpRouteHostnames","classes","publishStatus","spec","isPublished","tiers","status","discoveredPlans","authSchemes","discoveredAuthScheme","authentication","hasApiKey","Object","values","some","scheme","hasOwnProperty","description","mb","className","Chip","size","data-testid","metadata","labels","lifecycle","style","getLifecycleChipStyle","version","namespace","approvalMode","tags","length","map","tag","br","name","targetRef","hostname","index","Table","TableHead","TableRow","TableCell","TableBody","plan","tier","limits","entries","key","value","String","contact","email","team","md","mt","documentation","docsURL","openAPISpecURL"],"sourceRoot":""}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[3976],{12229:(e,t,s)=>{s.d(t,{Z:()=>A});var n=s(31085),r=s(95478),a=s.n(r),i=s(10394),o=s(72501),l=s(64947),c=s(37197),d=s(69621),p=s(12981),u=s(86901),m=s(69076),g=s(58837),h=s(6924),v=s(23164);const x=(0,g.A)(e=>({root:{width:240,minWidth:240,padding:e.spacing(2),borderRight:`1px solid ${e.palette.divider}`,backgroundColor:e.palette.background.paper,height:"100%",overflowY:"auto"},sectionTitle:{fontWeight:600,fontSize:"0.75rem",textTransform:"uppercase",letterSpacing:"0.05em",color:e.palette.text.secondary,marginBottom:e.spacing(1),display:"flex",alignItems:"center",justifyContent:"space-between",cursor:"pointer",userSelect:"none"},filterSection:{marginBottom:e.spacing(2)},checkbox:{padding:e.spacing(.5)},checkboxLabel:{fontSize:"0.875rem"},clearButton:{marginTop:e.spacing(2)},count:{fontSize:"0.75rem",color:e.palette.text.secondary,marginLeft:e.spacing(1)}})),A=({sections:e,filters:t,onChange:s,onClear:r})=>{const g=x(),[A,j]=a().useState(new Set(e.filter(e=>e.collapsed).map(e=>e.id))),f=Object.values(t).some(e=>e.length>0);return(0,n.jsxs)(i.A,{className:g.root,children:[(0,n.jsxs)(i.A,{display:"flex",justifyContent:"space-between",alignItems:"center",mb:2,children:[(0,n.jsx)(o.A,{variant:"subtitle2",children:"Filters"}),f&&(0,n.jsx)(l.A,{size:"small",color:"primary",onClick:()=>{const t={};e.forEach(e=>{t[e.id]=[]}),s(t),null==r||r()},children:"Clear all"})]}),(0,n.jsx)(c.A,{}),e.map(e=>{const r=A.has(e.id),a=(t[e.id]||[]).length;return(0,n.jsxs)(i.A,{className:g.filterSection,mt:2,children:[(0,n.jsxs)(i.A,{className:g.sectionTitle,onClick:()=>{return t=e.id,void j(e=>{const s=new Set(e);return s.has(t)?s.delete(t):s.add(t),s});var t},children:[(0,n.jsxs)(i.A,{display:"flex",alignItems:"center",children:[(0,n.jsx)("span",{children:e.title}),a>0&&(0,n.jsxs)("span",{className:g.count,children:["(",a,")"]})]}),r?(0,n.jsx)(h.A,{fontSize:"small"}):(0,n.jsx)(v.A,{fontSize:"small"})]}),(0,n.jsx)(d.A,{in:!r,children:(0,n.jsx)(p.A,{children:e.options.map(r=>(0,n.jsx)(u.A,{control:(0,n.jsx)(m.A,{checked:(t[e.id]||[]).includes(r.value),onChange:()=>((e,n)=>{const r=t[e]||[],a=r.includes(n)?r.filter(e=>e!==n):[...r,n];s({...t,[e]:a})})(e.id,r.value),size:"small",className:g.checkbox,color:"primary"}),label:(0,n.jsxs)(i.A,{display:"flex",alignItems:"center",children:[(0,n.jsx)("span",{className:g.checkboxLabel,children:r.label}),void 0!==r.count&&(0,n.jsxs)("span",{className:g.count,children:["(",r.count,")"]})]})},r.value))})})]},e.id)})]})}},23164:(e,t,s)=>{var n=s(4293),r=s(78920);t.A=void 0;var a=r(s(95478)),i=(0,n(s(74044)).default)(a.createElement("path",{d:"M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z"}),"ExpandLess");t.A=i},27799:(e,t,s)=>{var n=s(4293),r=s(78920);t.A=void 0;var a=r(s(95478)),i=(0,n(s(74044)).default)(a.createElement("path",{d:"M21 5v6.59l-3-3.01-4 4.01-4-4-4 4-3-3.01V5c0-1.1.9-2 2-2h14c1.1 0 2 .9 2 2zm-3 6.42l3 3.01V19c0 1.1-.9 2-2 2H5c-1.1 0-2-.9-2-2v-6.58l3 2.99 4-4 4 4 4-3.99z"}),"BrokenImage");t.A=i},43976:(e,t,s)=>{s.r(t),s.d(t,{ApiKeyApprovalPage:()=>O});var n=s(31085),r=s(95478),a=s.n(r),i=s(289),o=s(15831),l=s(45210),c=s(46681),d=s(22097),p=s(70980),u=s(35015),m=s(37725),g=s(42367),h=s(25010),v=s(34955),x=s(46205),A=s(58837),j=s(76891),f=s(61477),y=s(10394),b=s(46805),k=s(72501),C=s(16249),w=s(93453),S=s(64947),R=s(78467),P=s(67720),q=s(4387),I=s(55429),B=s(92399),N=s(12229),z=s(46299);const $=(0,A.A)(e=>({container:{display:"flex",height:"100%",minHeight:400},tableContainer:{flex:1,overflow:"auto",padding:10},useCasePanel:{padding:e.spacing(2),backgroundColor:e.palette.background.default},useCaseLabel:{fontWeight:600,marginBottom:e.spacing(1),color:e.palette.text.secondary,textTransform:"uppercase",fontSize:"0.75rem"},bulkActions:{padding:e.spacing(2),backgroundColor:e.palette.background.default,borderBottom:`1px solid ${e.palette.divider}`,display:"flex",alignItems:"center",justifyContent:"space-between"}})),T=({open:e,request:t,action:s,processing:r,onClose:i,onConfirm:o})=>{var l,c;const[d,p]=a().useState(""),u="approve"===s?"Approve":"Reject",m="approve"===s?"Approving...":"Rejecting...",g="reject"===s,h=(null==t||null===(l=t.spec.requestedBy)||void 0===l?void 0:l.userId)||"",v=!g||d===h;return a().useEffect(()=>{e||p("")},[e]),(0,n.jsxs)(j.A,{open:e,onClose:r?void 0:i,maxWidth:"sm",fullWidth:!0,children:[(0,n.jsx)(f.A,{children:g?(0,n.jsxs)(y.A,{display:"flex",alignItems:"center",style:{gap:8},children:[(0,n.jsx)(B.A,{color:"error"}),(0,n.jsxs)("span",{children:[u," API Key"]})]}):(0,n.jsxs)("span",{children:[u," API Key"]})}),(0,n.jsx)(b.A,{children:t&&(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("p",{children:[(0,n.jsx)("strong",{children:"User:"})," ",t.spec.requestedBy.userId]}),(0,n.jsxs)("p",{children:[(0,n.jsx)("strong",{children:"API:"})," ",(null===(c=t.spec.apiProductRef)||void 0===c?void 0:c.name)||"unknown"]}),(0,n.jsxs)("p",{children:[(0,n.jsx)("strong",{children:"Tier:"})," ",t.spec.planTier]}),(0,n.jsxs)(y.A,{mb:2,children:[(0,n.jsx)(k.A,{variant:"body2",component:"span",style:{fontWeight:"bold"},children:"Use Case:"})," ",(0,n.jsx)(k.A,{variant:"body2",component:"span",style:{whiteSpace:"pre-wrap"},children:t.spec.useCase||"-"})]}),g&&(0,n.jsxs)(y.A,{mt:2,children:[(0,n.jsxs)(k.A,{variant:"body2",color:"textSecondary",gutterBottom:!0,children:["Type ",(0,n.jsx)("strong",{children:h})," to confirm rejection:"]}),(0,n.jsx)(C.A,{fullWidth:!0,variant:"outlined",size:"small",value:d,onChange:e=>p(e.target.value),disabled:r,autoFocus:!0,placeholder:h})]})]})}),(0,n.jsxs)(w.A,{children:[(0,n.jsx)(S.A,{onClick:i,disabled:r,children:"Cancel"}),(0,n.jsx)(S.A,{onClick:o,color:"approve"===s?"primary":"secondary",variant:"contained",disabled:r||!v,startIcon:r?(0,n.jsx)(R.A,{size:16,color:"inherit"}):void 0,children:r?m:u})]})]})},W=({open:e,requests:t,action:s,processing:r,onClose:a,onConfirm:i})=>{const o="approve"===s,l=o?"Approve All":"Reject All",c=o?"Approving...":"Rejecting...";return(0,n.jsxs)(j.A,{open:e,onClose:r?void 0:a,maxWidth:"md",fullWidth:!0,children:[(0,n.jsxs)(f.A,{children:[o?"Approve":"Reject"," ",t.length," API Keys"]}),(0,n.jsxs)(b.A,{children:[(0,n.jsxs)(k.A,{variant:"body2",paragraph:!0,children:["You are about to ",o?"approve":"reject"," the following API keys:"]}),(0,n.jsx)(y.A,{mb:2,maxHeight:200,overflow:"auto",children:t.map(e=>{var t;return(0,n.jsx)(y.A,{mb:1,p:1,bgcolor:"background.default",children:(0,n.jsxs)(k.A,{variant:"body2",children:[(0,n.jsx)("strong",{children:e.spec.requestedBy.userId})," -"," ",(null===(t=e.spec.apiProductRef)||void 0===t?void 0:t.name)||"unknown"," (",e.spec.planTier,")"]})},`${e.metadata.namespace}/${e.metadata.name}`)})})]}),(0,n.jsxs)(w.A,{children:[(0,n.jsx)(S.A,{onClick:a,disabled:r,children:"Cancel"}),(0,n.jsx)(S.A,{onClick:i,color:o?"primary":"secondary",variant:"contained",disabled:r,startIcon:r?(0,n.jsx)(R.A,{size:16,color:"inherit"}):void 0,children:r?c:l})]})]})},F=({request:e})=>{const t=$();return(0,n.jsxs)(y.A,{className:t.useCasePanel,onClick:e=>e.stopPropagation(),children:[(0,n.jsx)(k.A,{className:t.useCaseLabel,children:"Use Case"}),(0,n.jsx)(k.A,{variant:"body2",children:e.spec.useCase||"No use case provided"})]})},L=(0,A.A)(e=>({successSection:{padding:e.spacing(2),backgroundColor:e.palette.success.main+"14",borderRadius:e.shape.borderRadius,marginBottom:e.spacing(2),border:`1px solid ${e.palette.success.main}40`},failureSection:{padding:e.spacing(2),backgroundColor:e.palette.error.main+"14",borderRadius:e.shape.borderRadius,marginBottom:e.spacing(2),border:`1px solid ${e.palette.error.main}40`},warningSection:{padding:e.spacing(2),backgroundColor:e.palette.warning.main+"14",borderRadius:e.shape.borderRadius,marginBottom:e.spacing(2),border:`1px solid ${e.palette.warning.main}40`},statRow:{display:"flex",alignItems:"center",gap:e.spacing(1)},errorList:{marginTop:e.spacing(2),padding:0,listStyle:"none"},errorItem:{padding:e.spacing(1.5),marginBottom:e.spacing(1),backgroundColor:e.palette.background.paper,borderRadius:e.shape.borderRadius,border:`1px solid ${e.palette.divider}`},errorName:{fontWeight:600,fontSize:"0.875rem",marginBottom:e.spacing(.5)},errorMessage:{fontSize:"0.813rem",color:e.palette.error.main,fontFamily:"monospace",wordBreak:"break-word"},expandButton:{marginTop:e.spacing(1),padding:e.spacing(.5)}})),E=({open:e,results:t,isApprove:s,onClose:a})=>{const i=L(),[o,l]=(0,r.useState)(!0),c=t.filter(e=>e.success),d=t.filter(e=>!e.success),p=c.length>0;return(0,n.jsxs)(j.A,{open:e,onClose:a,maxWidth:"md",fullWidth:!0,children:[(0,n.jsx)(f.A,{children:(0,n.jsx)(y.A,{display:"flex",alignItems:"center",style:{gap:8},children:p?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(B.A,{style:{color:"#ff9800"}}),(0,n.jsxs)("span",{children:["Bulk ",s?"Approve":"Reject"," Completed with Issues"]})]}):(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(B.A,{color:"error"}),(0,n.jsxs)("span",{children:["Bulk ",s?"Approve":"Reject"," Failed"]})]})})}),(0,n.jsxs)(b.A,{children:[p&&(0,n.jsx)(y.A,{className:i.successSection,children:(0,n.jsxs)(y.A,{className:i.statRow,children:[(0,n.jsx)(I.A,{style:{color:"#4caf50"}}),(0,n.jsxs)(k.A,{variant:"body1",children:[(0,n.jsx)("strong",{children:c.length})," API key",1!==c.length?"s":""," ",s?"approved":"rejected"," successfully"]})]})}),(0,n.jsxs)(y.A,{className:p?i.warningSection:i.failureSection,children:[(0,n.jsxs)(y.A,{className:i.statRow,children:[(0,n.jsx)(B.A,{color:"error"}),(0,n.jsxs)(k.A,{variant:"body1",children:[(0,n.jsx)("strong",{children:d.length})," request",1!==d.length?"s":""," failed"]})]}),(0,n.jsxs)(S.A,{size:"small",className:i.expandButton,onClick:()=>l(!o),children:[o?"Hide":"Show"," Error Details"]}),o&&(0,n.jsx)("ul",{className:i.errorList,children:d.map((e,t)=>(0,n.jsxs)("li",{className:i.errorItem,children:[(0,n.jsxs)("div",{className:i.errorName,children:[e.namespace,"/",e.name]}),(0,n.jsx)("div",{className:i.errorMessage,children:e.error||"Unknown error"})]},e.name||t))})]})]}),(0,n.jsx)(w.A,{children:(0,n.jsx)(S.A,{onClick:a,color:"primary",variant:"contained",children:"Close"})})]})},M=()=>{var e;const t=$(),s=(0,d.useApi)(d.identityApiRef),a=(0,d.useApi)(d.alertApiRef),i=(0,d.useApi)(p.s),[o,l]=(0,r.useState)(0),[c,A]=(0,r.useState)([]),[j,f]=(0,r.useState)({open:!1,request:null,action:"approve",processing:!1}),[b,C]=(0,r.useState)({open:!1,requests:[],action:"approve",processing:!1}),[w,R]=(0,r.useState)({open:!1,results:[],isApprove:!0}),[L,M]=(0,r.useState)({status:[],apiProduct:[],tier:[]}),{allowed:O,loading:U,error:_}=(0,x.l)(v.z4),{allowed:Y,loading:D,error:H}=(0,x.l)(v.q0),K=U||D,V=_||H,{value:Z,loading:G,error:X}=(0,u.A)(async()=>{const e=(await s.getBackstageIdentity()).userEntityRef;try{const[s,r]=await Promise.all([i.getAllRequests(),i.getApiProducts()]),a=s.items||[],o=new Set;for(const s of r.items||[]){var t,n;(null===(n=s.metadata)||void 0===n||null===(t=n.annotations)||void 0===t?void 0:t["backstage.io/owner"])===e&&o.add(`${s.metadata.namespace}/${s.metadata.name}`)}return{allRequests:a,reviewedBy:e,ownedApiProducts:o}}catch(t){const s=t instanceof Error?t.message:"unknown error occurred";return a.post({message:`Failed to get resources. ${s}`,display:"transient",severity:"error"}),{allRequests:[],reviewedBy:e,ownedApiProducts:new Set}}},[i,s,o]),J=(0,r.useMemo)(()=>{if(!(null==Z?void 0:Z.allRequests))return[];const e={Approved:0,Pending:0,Rejected:0},t=new Map,s=new Map;return Z.allRequests.forEach(n=>{var r,a;const i=(null===(r=n.status)||void 0===r?void 0:r.phase)||"Pending";e[i]++;const o=(null===(a=n.spec.apiProductRef)||void 0===a?void 0:a.name)||"unknown";t.set(o,(t.get(o)||0)+1);const l=n.spec.planTier||"unknown";s.set(l,(s.get(l)||0)+1)}),[{id:"status",title:"Status",options:[{value:"Pending",label:"Pending",count:e.Pending},{value:"Approved",label:"Approved",count:e.Approved},{value:"Rejected",label:"Rejected",count:e.Rejected}]},{id:"apiProduct",title:"API Product",options:Array.from(t.entries()).map(([e,t])=>({value:e,label:e,count:t})),collapsed:t.size>5},{id:"tier",title:"Tier",options:Array.from(s.entries()).map(([e,t])=>({value:e,label:e.charAt(0).toUpperCase()+e.slice(1),count:t}))}]},[null==Z?void 0:Z.allRequests]),Q=(0,r.useMemo)(()=>(null==Z?void 0:Z.allRequests)?Z.allRequests.filter(e=>{if(L.status.length>0){var t;const s=(null===(t=e.status)||void 0===t?void 0:t.phase)||"Pending";if(!L.status.includes(s))return!1}if(L.apiProduct.length>0){var s;const t=(null===(s=e.spec.apiProductRef)||void 0===s?void 0:s.name)||"unknown";if(!L.apiProduct.includes(t))return!1}if(L.tier.length>0){const t=e.spec.planTier||"unknown";if(!L.tier.includes(t))return!1}return!0}):[],[null==Z?void 0:Z.allRequests,L]),ee=e=>new Date(e).toLocaleDateString("en-GB",{year:"numeric",month:"short",day:"numeric"}),te=[{title:"Requester",field:"spec.requestedBy.userId",render:e=>(0,n.jsx)(k.A,{variant:"body2",children:e.spec.requestedBy.userId})},{title:"API Product",field:"spec.apiProductRef.name",render:e=>{var t;const s=(null===(t=e.spec.apiProductRef)||void 0===t?void 0:t.name)||"unknown";return(0,n.jsx)(m.N_,{to:`/catalog/default/api/${s}`,children:(0,n.jsx)("strong",{children:s})})}},{title:"Status",field:"status.phase",render:e=>{var t;const s=(null===(t=e.status)||void 0===t?void 0:t.phase)||"Pending";return(0,n.jsx)(P.A,{label:s,size:"small",style:(0,z.uU)(s)})}},{title:"Tier",field:"spec.planTier",render:e=>(0,n.jsx)(P.A,{label:e.spec.planTier,size:"small",variant:"outlined"})},{title:"Requested",field:"metadata.creationTimestamp",render:e=>(0,n.jsx)(k.A,{variant:"body2",children:e.metadata.creationTimestamp?ee(e.metadata.creationTimestamp):"-"})},{title:"Reviewed By",field:"status.reviewedBy",render:e=>{var t;if(!(null===(t=e.status)||void 0===t?void 0:t.reviewedBy))return(0,n.jsx)(k.A,{variant:"body2",color:"textSecondary",children:"-"});const s=e.status.reviewedBy.replace(/^user:default\//,""),r="system"===s;return(0,n.jsxs)(y.A,{children:[(0,n.jsx)(k.A,{variant:"body2",children:r?"Automatic":s}),e.status.reviewedAt&&(0,n.jsx)(k.A,{variant:"caption",color:"textSecondary",children:ee(e.status.reviewedAt)})]})}},{title:"Actions",filtering:!1,render:e=>{var t,s,r;if("Pending"!==((null===(t=e.status)||void 0===t?void 0:t.phase)||"Pending"))return null;const a=`${e.metadata.namespace}/${(null===(s=e.spec.apiProductRef)||void 0===s?void 0:s.name)||"unknown"}`;var i;const o=null!==(i=null==Z||null===(r=Z.ownedApiProducts)||void 0===r?void 0:r.has(a))&&void 0!==i&&i;return O||Y&&o?(0,n.jsxs)(y.A,{display:"flex",style:{gap:8},children:[(0,n.jsx)(S.A,{size:"small",startIcon:(0,n.jsx)(I.A,{}),onClick:()=>{f({open:!0,request:e,action:"approve",processing:!1})},color:"primary",variant:"outlined",children:"Approve"}),(0,n.jsx)(S.A,{size:"small",startIcon:(0,n.jsx)(B.A,{}),onClick:()=>{f({open:!0,request:e,action:"reject",processing:!1})},color:"secondary",variant:"outlined",children:"Reject"})]}):null}}],se=(0,r.useMemo)(()=>[{render:e=>{var t;const s=e.rowData;return(null==s||null===(t=s.metadata)||void 0===t?void 0:t.name)?(0,n.jsx)(F,{request:s}):(0,n.jsx)(y.A,{})}}],[]);if(G||K)return(0,n.jsx)(y.A,{p:2,children:[...Array(5)].map((e,t)=>(0,n.jsx)(y.A,{p:2,children:(0,n.jsx)(q.A,{variant:"text",width:"100%"})},t))});if(X)return(0,n.jsx)(g._,{error:X});if(V)return(0,n.jsx)(y.A,{p:2,children:(0,n.jsxs)(k.A,{color:"error",children:["Unable to check permissions: ",V.message]})});const ne=O||Y;return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(y.A,{className:t.container,children:[(0,n.jsx)(N.Z,{sections:J,filters:L,onChange:M}),(0,n.jsxs)(y.A,{className:t.tableContainer,children:[c.length>0&&(0,n.jsxs)(y.A,{className:t.bulkActions,children:[(0,n.jsxs)(k.A,{variant:"body2",children:[c.length," request",1!==c.length?"s":""," selected"]}),(0,n.jsxs)(y.A,{display:"flex",style:{gap:8},children:[(0,n.jsx)(S.A,{size:"small",variant:"contained",color:"primary",startIcon:(0,n.jsx)(I.A,{}),onClick:()=>{0!==c.length&&C({open:!0,requests:c,action:"approve",processing:!1})},children:"Approve Selected"}),(0,n.jsx)(S.A,{size:"small",variant:"contained",color:"secondary",startIcon:(0,n.jsx)(B.A,{}),onClick:()=>{0!==c.length&&C({open:!0,requests:c,action:"reject",processing:!1})},children:"Reject Selected"})]})]}),0===Q.length?(0,n.jsx)(y.A,{p:4,textAlign:"center",children:(0,n.jsx)(k.A,{variant:"body1",color:"textSecondary",children:0===(null==Z||null===(e=Z.allRequests)||void 0===e?void 0:e.length)?"No API keys found.":"No API keys match the selected filters."})}):(0,n.jsx)(h.X,{options:{selection:ne,showSelectAllCheckbox:Q.some(e=>{var t;return!(null===(t=e.status)||void 0===t?void 0:t.phase)||"Pending"===e.status.phase}),selectionProps:e=>{var t,s;return{disabled:"Pending"!==(null===(t=e.status)||void 0===t?void 0:t.phase)&&void 0!==(null===(s=e.status)||void 0===s?void 0:s.phase)}},paging:Q.length>10,pageSize:20,search:!0,filtering:!1,debounceInterval:300,showTextRowsSelected:!1,toolbar:!0,emptyRowsWhenPaging:!1},columns:te,data:Q.map(e=>{const t=c.some(t=>t.metadata.name===e.metadata.name&&t.metadata.namespace===e.metadata.namespace);return{...e,id:e.metadata.name,tableData:{checked:t}}}),onSelectionChange:e=>{const t=e.filter(e=>{var t;return!(null===(t=e.status)||void 0===t?void 0:t.phase)||"Pending"===e.status.phase});A(t)},detailPanel:se})]})]}),(0,n.jsx)(T,{open:j.open,request:j.request,action:j.action,processing:j.processing,onClose:()=>f({open:!1,request:null,action:"approve",processing:!1}),onConfirm:async()=>{if(!j.request||!Z)return;f(e=>({...e,processing:!0}));const e="approve"===j.action?(e,t,s)=>i.approveRequest(e,t,s):(e,t,s)=>i.rejectRequest(e,t,s);try{await e(j.request.metadata.namespace,j.request.metadata.name,Z.reviewedBy),f({open:!1,request:null,action:"approve",processing:!1}),A(e=>e.filter(e=>{var t,s;return e.metadata.name!==(null===(t=j.request)||void 0===t?void 0:t.metadata.name)||e.metadata.namespace!==(null===(s=j.request)||void 0===s?void 0:s.metadata.namespace)})),l(e=>e+1);const t="approve"===j.action?"approved":"rejected";a.post({message:`API key ${t}`,severity:"success",display:"transient"})}catch(e){console.error(`error ${j.action}ing request:`,e),f(e=>({...e,processing:!1}));const t=e instanceof Error?e.message:"unknown error occurred";a.post({message:`Failed to ${j.action} API key. ${t}`,severity:"error",display:"transient"})}}}),(0,n.jsx)(W,{open:b.open,requests:b.requests,action:b.action,processing:b.processing,onClose:()=>C({open:!1,requests:[],action:"approve",processing:!1}),onConfirm:async()=>{if(!Z||0===b.requests.length)return;C(e=>({...e,processing:!0})),R({open:!1,results:[],isApprove:!0});const e="approve"===b.action,t=e?(e,t)=>i.bulkApproveRequests(e,t):(e,t)=>i.bulkRejectRequests(e,t);try{const s=b.requests.map(e=>({namespace:e.metadata.namespace,name:e.metadata.name})),n=await t(s,Z.reviewedBy)||[],r=n.filter(e=>e.success),i=0===n.filter(e=>!e.success).length,o=e?"approved":"rejected";C({open:!1,requests:[],action:"approve",processing:!1}),R({open:!i,results:n,isApprove:e}),A([]),l(e=>e+1),i&&a.post({message:`${r.length} API keys ${o}`,severity:"success",display:"transient"})}catch(e){console.error(`error bulk ${b.action}ing requests:`,e),C(e=>({...e,processing:!1}));const t=e instanceof Error?e.message:"unknown error occurred";a.post({message:`Failed to bulk ${b.action} API keys. ${t}`,severity:"error",display:"transient"})}}}),(0,n.jsx)(E,{open:w.open,results:w.results,isApprove:w.isApprove,onClose:()=>R({open:!1,results:[],isApprove:!0})})]})},O=()=>(0,n.jsxs)(i.Y,{themeId:"tool",children:[(0,n.jsx)(o.Y,{title:"API Key Approval",subtitle:"Review and approve API key requests",children:(0,n.jsx)(l.Y,{children:"Approve or reject API key access requests"})}),(0,n.jsx)(c.U,{children:(0,n.jsx)(M,{})})]})},45210:(e,t,s)=>{s.d(t,{Y:()=>q});var n=s(31085),r=s(22097),a=s(10394),i=s(64947),o=s(93453),l=s(29365),c=s(46423),d=s(5951),p=s(26343),u=s(28233),m=s(55197),g=s(37976),h=s(72501),v=s(5893),x=s(95478),A=(s(45250),s(49634),s(21006)),j=s(67550);const f=()=>{const{t:e}=(0,j.i)(A.O);return{url:"https://github.com/backstage/backstage/issues",items:[{title:e("supportConfig.default.title"),icon:"warning",links:[{title:e("supportConfig.default.linkTitle"),url:"https://github.com/backstage/backstage/blob/master/app-config.yaml"}]}]}};var y=s(27799);function b(e){const{id:t,Fallback:s=y.A,...a}=e,i=(0,r.useApp)().getSystemIcon(t)??s;return(0,n.jsx)(i,{...a})}function k(e){return(0,n.jsx)(b,{id:"help",...e})}var C=s(37725);const w=(0,g.makeStyles)({popoverList:{minWidth:260,maxWidth:400},menuItem:{whiteSpace:"normal"}},{name:"BackstageSupportButton"}),S=({icon:e})=>{const t=(0,r.useApp)(),s=e?t.getSystemIcon(e)??k:k;return(0,n.jsx)(s,{})},R=({link:e})=>(0,n.jsx)(C.N_,{to:e.url,children:e.title??e.url}),P=({item:e})=>(0,n.jsxs)(p.A,{button:!1,children:[(0,n.jsx)(c.A,{children:(0,n.jsx)(S,{icon:e.icon})}),(0,n.jsx)(d.A,{primary:e.title,secondary:e.links?.reduce((e,t,s)=>[...e,s>0&&(0,n.jsx)("br",{},s),(0,n.jsx)(R,{link:t},t.url)],[])})]});function q(e){const{t}=(0,j.i)(A.O),{title:s,items:c,children:d}=e,{items:g}=function(){const e=(0,r.useApiHolder)().get(r.configApiRef),t=e?.getOptionalConfig("app.support"),s=f();return t?{url:t.getString("url"),items:t.getConfigArray("items").flatMap(e=>({title:e.getString("title"),icon:e.getOptionalString("icon"),links:(e.getOptionalConfigArray("links")??[]).flatMap(e=>({url:e.getString("url"),title:e.getOptionalString("title")??""}))}))}:s}(),[y,b]=(0,x.useState)(!1),[C,S]=(0,x.useState)(null),R=w(),q=(0,r.useApi)(r.configApiRef).getOptionalConfig("app.support"),I=(0,v.A)(e=>e.breakpoints.down("sm")),B=e=>{S(e.currentTarget),b(!0)},N=()=>{b(!1)};return q?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(a.A,{display:"flex",ml:1,children:I?(0,n.jsx)(l.A,{color:"primary",size:"small",onClick:B,"data-testid":"support-button","aria-label":"Support",children:(0,n.jsx)(k,{})}):(0,n.jsx)(i.A,{"data-testid":"support-button","aria-label":"Support",color:"primary",onClick:B,startIcon:(0,n.jsx)(k,{}),children:t("supportButton.title")})}),(0,n.jsxs)(m.Ay,{"data-testid":"support-button-popover",open:y,anchorEl:C,anchorOrigin:{vertical:"bottom",horizontal:"right"},transformOrigin:{vertical:"top",horizontal:"right"},onClose:N,children:[(0,n.jsxs)(u.A,{className:R.popoverList,autoFocusItem:Boolean(C),children:[s&&(0,n.jsx)(p.A,{button:!1,alignItems:"flex-start",className:R.menuItem,children:(0,n.jsx)(h.A,{variant:"subtitle1",children:s})}),x.Children.map(d,(e,t)=>(0,n.jsx)(p.A,{button:!1,alignItems:"flex-start",className:R.menuItem,children:e},`child-${t}`)),(c??g).map((e,t)=>(0,n.jsx)(P,{item:e},`item-${t}`))]}),(0,n.jsx)(o.A,{children:(0,n.jsx)(i.A,{color:"primary",onClick:N,"aria-label":"Close",children:t("supportButton.close")})})]})]}):null}}}]);
|
|
2
|
-
//# sourceMappingURL=3976.e8a8fda2.chunk.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"static/3976.e8a8fda2.chunk.js","mappings":"iTAeA,MAAMA,GAAYC,EAAAA,EAAAA,GAAWC,IAAU,CACrCC,KAAM,CACJC,MAAO,IACPC,SAAU,IACVC,QAASJ,EAAMK,QAAQ,GACvBC,YAAa,aAAaN,EAAMO,QAAQC,UACxCC,gBAAiBT,EAAMO,QAAQG,WAAWC,MAC1CC,OAAQ,OACRC,UAAW,QAEbC,aAAc,CACZC,WAAY,IACZC,SAAU,UACVC,cAAe,YACfC,cAAe,SACfC,MAAOnB,EAAMO,QAAQa,KAAKC,UAC1BC,aAActB,EAAMK,QAAQ,GAC5BkB,QAAS,OACTC,WAAY,SACZC,eAAgB,gBAChBC,OAAQ,UACRC,WAAY,QAEdC,cAAe,CACbN,aAActB,EAAMK,QAAQ,IAE9BwB,SAAU,CACRzB,QAASJ,EAAMK,QAAQ,KAEzByB,cAAe,CACbd,SAAU,YAEZe,YAAa,CACXC,UAAWhC,EAAMK,QAAQ,IAE3B4B,MAAO,CACLjB,SAAU,UACVG,MAAOnB,EAAMO,QAAQa,KAAKC,UAC1Ba,WAAYlC,EAAMK,QAAQ,OA4BjB8B,EAAc,EACzBC,WACAC,UACAC,WACAC,cAEA,MAAMC,EAAU1C,KACT2C,EAAmBC,GAAwBC,IAAAA,SAChD,IAAIC,IAAIR,EAASS,OAAOC,GAAKA,EAAEC,WAAWC,IAAIF,GAAKA,EAAEG,MA2BjDC,EAAmBC,OAAOC,OAAOf,GAASgB,KAC9CD,GAAUA,EAAOE,OAAS,GAY5B,OACE,UAACC,EAAAA,EAAGA,CAACC,UAAWhB,EAAQvC,K,WACtB,UAACsD,EAAAA,EAAGA,CAAChC,QAAQ,OAAOE,eAAe,gBAAgBD,WAAW,SAASiC,GAAI,E,WACzE,SAACC,EAAAA,EAAUA,CAACC,QAAQ,Y,SAAY,YAC/BT,IACC,SAACU,EAAAA,EAAMA,CACLC,KAAK,QACL1C,MAAM,UACN2C,QAjBU,KAClB,MAAMC,EAA8B,CAAC,EACrC3B,EAAS4B,QAAQC,IACfF,EAAeE,EAAQhB,IAAM,KAE/BX,EAASyB,GACTxB,SAAAA,K,SAYO,kBAML,SAAC2B,EAAAA,EAAOA,CAAAA,GAEP9B,EAASY,IAAIiB,IACZ,MAAME,EAAc1B,EAAkB2B,IAAIH,EAAQhB,IAC5CoB,GAAiBhC,EAAQ4B,EAAQhB,KAAO,IAAIK,OAElD,OACE,UAACC,EAAAA,EAAGA,CAAkBC,UAAWhB,EAAQZ,cAAe0C,GAAI,E,WAC1D,UAACf,EAAAA,EAAGA,CACFC,UAAWhB,EAAQ1B,aACnBgD,QAAS,KAAMS,OA9DJC,EA8DkBP,EAAQhB,QA7D/CP,EAAqB+B,IACnB,MAAMC,EAAO,IAAI9B,IAAI6B,GAMrB,OALIC,EAAKN,IAAII,GACXE,EAAKC,OAAOH,GAEZE,EAAKE,IAAIJ,GAEJE,IARW,IAACF,G,WAgEX,UAACjB,EAAAA,EAAGA,CAAChC,QAAQ,OAAOC,WAAW,S,WAC7B,SAACqD,OAAAA,C,SAAMZ,EAAQa,QACdT,EAAgB,IACf,UAACQ,OAAAA,CAAKrB,UAAWhB,EAAQP,M,UAAO,IAAEoC,EAAc,UAGnDF,GACC,SAACY,EAAAA,EAAcA,CAAC/D,SAAS,WAEzB,SAACgE,EAAAA,EAAcA,CAAChE,SAAS,cAI7B,SAACiE,EAAAA,EAAQA,CAACC,IAAKf,E,UACb,SAACgB,EAAAA,EAASA,C,SACPlB,EAAQmB,QAAQpC,IAAIqC,IACnB,SAACC,EAAAA,EAAgBA,CAEfC,SACE,SAACC,EAAAA,EAAQA,CACPC,SAAUpD,EAAQ4B,EAAQhB,KAAO,IAAIyC,SAASL,EAAOM,OACrDrD,SAAU,IAzEH,EAACkC,EAAmBmB,KAC/C,MAAMC,EAAgBvD,EAAQmC,IAAc,GACtCqB,EAAYD,EAAcF,SAASC,GACrCC,EAAc/C,OAAOiD,GAAKA,IAAMH,GAChC,IAAIC,EAAeD,GAEvBrD,EAAS,IACJD,EACH,CAACmC,GAAYqB,KAkEOE,CAAqB9B,EAAQhB,GAAIoC,EAAOM,OAE1C9B,KAAK,QACLL,UAAWhB,EAAQX,SACnBV,MAAM,YAGV6E,OACE,UAACzC,EAAAA,EAAGA,CAAChC,QAAQ,OAAOC,WAAW,S,WAC7B,SAACqD,OAAAA,CAAKrB,UAAWhB,EAAQV,c,SACtBuD,EAAOW,aAEQC,IAAjBZ,EAAOpD,QACN,UAAC4C,OAAAA,CAAKrB,UAAWhB,EAAQP,M,UAAO,IAAEoD,EAAOpD,MAAM,WAlBhDoD,EAAOM,cAtBZ1B,EAAQhB,S,sBCrJxBiD,EAAyB,EAAQ,MAEjCC,EAA0B,EAAQ,OAKtCC,EAAQ,OAAU,EAElB,IAAIzD,EAAQwD,EAAwB,EAAQ,QAIxCE,GAAW,EAFMH,EAAuB,EAAQ,QAElBI,SAAuB3D,EAAM4D,cAAc,OAAQ,CACnFC,EAAG,mDACD,cAEJJ,EAAQ,EAAUC,C,sBCjBdH,EAAyB,EAAQ,MAEjCC,EAA0B,EAAQ,OAKtCC,EAAQ,OAAU,EAElB,IAAIzD,EAAQwD,EAAwB,EAAQ,QAIxCE,GAAW,EAFMH,EAAuB,EAAQ,QAElBI,SAAuB3D,EAAM4D,cAAc,OAAQ,CACnFC,EAAG,gKACD,eAEJJ,EAAQ,EAAUC,C,+YCoBlB,MAAMvG,GAAYC,EAAAA,EAAAA,GAAYC,IAAW,CACvCyG,UAAW,CACTlF,QAAS,OACTX,OAAQ,OACR8F,UAAW,KAEbC,eAAgB,CACdC,KAAM,EACNC,SAAU,OACVzG,QAAS,IAEX0G,aAAc,CACZ1G,QAASJ,EAAMK,QAAQ,GACvBI,gBAAiBT,EAAMO,QAAQG,WAAW4F,SAE5CS,aAAc,CACZhG,WAAY,IACZO,aAActB,EAAMK,QAAQ,GAC5Bc,MAAOnB,EAAMO,QAAQa,KAAKC,UAC1BJ,cAAe,YACfD,SAAU,WAEZgG,YAAa,CACX5G,QAASJ,EAAMK,QAAQ,GACvBI,gBAAiBT,EAAMO,QAAQG,WAAW4F,QAC1CW,aAAc,aAAajH,EAAMO,QAAQC,UACzCe,QAAS,OACTC,WAAY,SACZC,eAAgB,oBAadyF,EAAiB,EACrBC,OACAC,UACAC,SACAC,aACAC,UACAC,gB,IAQoBJ,EAmCPA,EAzCb,MAAOK,EAAcC,GAAmB/E,IAAAA,SAAe,IACjDgF,EAAyB,YAAXN,EAAuB,UAAY,SACjDO,EACO,YAAXP,EAAuB,eAAiB,eAEpCQ,EAAsB,WAAXR,EACXS,GAAcV,SAAyB,QAAzBA,EAAAA,EAASW,KAAKC,mBAAdZ,IAAAA,OAAAA,EAAAA,EAA2Ba,SAAU,GACnDC,GAAaL,GAAWJ,IAAiBK,EAS/C,OANAnF,IAAAA,UAAgB,KACTwE,GACHO,EAAgB,KAEjB,CAACP,KAGF,UAACgB,EAAAA,EAAMA,CACLhB,KAAMA,EACNI,QAASD,OAAarB,EAAYsB,EAClCa,SAAS,KACTC,WAAS,E,WAET,SAACC,EAAAA,EAAWA,C,SACTT,GACC,UAACtE,EAAAA,EAAGA,CAAChC,QAAQ,OAAOC,WAAW,SAAS+G,MAAO,CAAEC,IAAK,G,WACpD,SAACC,EAAAA,EAAUA,CAACtH,MAAM,WAClB,UAAC0D,OAAAA,C,UAAM8C,EAAY,kBAGrB,UAAC9C,OAAAA,C,UAAM8C,EAAY,iBAGvB,SAACe,EAAAA,EAAaA,C,SACXtB,IACC,sB,WACE,UAACuB,IAAAA,C,WACC,SAACC,SAAAA,C,SAAO,UAAc,IAAExB,EAAQW,KAAKC,YAAYC,WAEnD,UAACU,IAAAA,C,WACC,SAACC,SAAAA,C,SAAO,SAAc,KACK,QAA1BxB,EAAAA,EAAQW,KAAKc,qBAAbzB,IAAAA,OAAAA,EAAAA,EAA4B0B,OAAQ,cAEvC,UAACH,IAAAA,C,WACC,SAACC,SAAAA,C,SAAO,UAAc,IAAExB,EAAQW,KAAKgB,aAEvC,UAACxF,EAAAA,EAAGA,CAACE,GAAI,E,WACP,SAACC,EAAAA,EAAUA,CACTC,QAAQ,QACRqF,UAAU,OACVT,MAAO,CAAExH,WAAY,Q,SACtB,cAEa,KACd,SAAC2C,EAAAA,EAAUA,CACTC,QAAQ,QACRqF,UAAU,OACVT,MAAO,CAAEU,WAAY,Y,SAEpB7B,EAAQW,KAAKmB,SAAW,SAG5BrB,IACC,UAACtE,EAAAA,EAAGA,CAACe,GAAI,E,WACP,UAACZ,EAAAA,EAAUA,CAACC,QAAQ,QAAQxC,MAAM,gBAAgBgI,cAAY,E,UAAC,SACxD,SAACP,SAAAA,C,SAAQd,IAAqB,6BAErC,SAACsB,EAAAA,EAASA,CACRf,WAAS,EACT1E,QAAQ,WACRE,KAAK,QACL8B,MAAO8B,EACPnF,SAAW+G,GAAM3B,EAAgB2B,EAAEC,OAAO3D,OAC1C4D,SAAUjC,EACVkC,WAAS,EACTC,YAAa3B,aAOzB,UAAC4B,EAAAA,EAAaA,C,WACZ,SAAC9F,EAAAA,EAAMA,CAACE,QAASyD,EAASgC,SAAUjC,E,SAAY,YAGhD,SAAC1D,EAAAA,EAAMA,CACLE,QAAS0D,EACTrG,MAAkB,YAAXkG,EAAuB,UAAY,YAC1C1D,QAAQ,YACR4F,SAAUjC,IAAeY,EACzByB,UACErC,GACE,SAACsC,EAAAA,EAAgBA,CAAC/F,KAAM,GAAI1C,MAAM,iBAChC8E,E,SAGLqB,EAAaM,EAAkBD,WAgBpCkC,EAAmB,EACvB1C,OACA2C,WACAzC,SACAC,aACAC,UACAC,gBAEA,MAAMuC,EAAuB,YAAX1C,EACZM,EAAcoC,EAAY,cAAgB,aAC1CnC,EAAkBmC,EAAY,eAAiB,eAErD,OACE,UAAC5B,EAAAA,EAAMA,CACLhB,KAAMA,EACNI,QAASD,OAAarB,EAAYsB,EAClCa,SAAS,KACTC,WAAS,E,WAET,UAACC,EAAAA,EAAWA,C,UACTyB,EAAY,UAAY,SAAS,IAAED,EAASxG,OAAO,gBAEtD,UAACoF,EAAAA,EAAaA,C,WACZ,UAAChF,EAAAA,EAAUA,CAACC,QAAQ,QAAQqG,WAAS,E,UAAC,oBAClBD,EAAY,UAAY,SAAS,+BAGrD,SAACxG,EAAAA,EAAGA,CAACE,GAAI,EAAGwG,UAAW,IAAKpD,SAAS,O,SAClCiD,EAAS9G,IAAKoE,I,IASRA,E,OARL,SAAC7D,EAAAA,EAAGA,CAEFE,GAAI,EACJkF,EAAG,EACHuB,QAAQ,qB,UAER,UAACxG,EAAAA,EAAUA,CAACC,QAAQ,Q,WAClB,SAACiF,SAAAA,C,SAAQxB,EAAQW,KAAKC,YAAYC,SAAgB,KAAG,KAC1B,QAA1Bb,EAAAA,EAAQW,KAAKc,qBAAbzB,IAAAA,OAAAA,EAAAA,EAA4B0B,OAAQ,UAAU,KAC9C1B,EAAQW,KAAKgB,SAAS,QARpB,GAAG3B,EAAQ+C,SAASC,aAAahD,EAAQ+C,SAASrB,gBAc/D,UAACY,EAAAA,EAAaA,C,WACZ,SAAC9F,EAAAA,EAAMA,CAACE,QAASyD,EAASgC,SAAUjC,E,SAAY,YAGhD,SAAC1D,EAAAA,EAAMA,CACLE,QAAS0D,EACTrG,MAAO4I,EAAY,UAAY,YAC/BpG,QAAQ,YACR4F,SAAUjC,EACVqC,UACErC,GACE,SAACsC,EAAAA,EAAgBA,CAAC/F,KAAM,GAAI1C,MAAM,iBAChC8E,E,SAGLqB,EAAaM,EAAkBD,WAWpC0C,EAAqB,EAAGjD,cAC5B,MAAM5E,EAAU1C,IAEhB,OACE,UAACyD,EAAAA,EAAGA,CAACC,UAAWhB,EAAQsE,aAAchD,QAAUuF,GAAMA,EAAEiB,kB,WACtD,SAAC5G,EAAAA,EAAUA,CAACF,UAAWhB,EAAQuE,a,SAAc,cAC7C,SAACrD,EAAAA,EAAUA,CAACC,QAAQ,Q,SACjByD,EAAQW,KAAKmB,SAAW,6BAa3BqB,GAAqBxK,EAAAA,EAAAA,GAAYC,IAAW,CAChDwK,eAAgB,CACdpK,QAASJ,EAAMK,QAAQ,GACvBI,gBAAiBT,EAAMO,QAAQkK,QAAQC,KAAO,KAC9CC,aAAc3K,EAAM4K,MAAMD,aAC1BrJ,aAActB,EAAMK,QAAQ,GAC5BwK,OAAQ,aAAa7K,EAAMO,QAAQkK,QAAQC,UAE7CI,eAAgB,CACd1K,QAASJ,EAAMK,QAAQ,GACvBI,gBAAiBT,EAAMO,QAAQwK,MAAML,KAAO,KAC5CC,aAAc3K,EAAM4K,MAAMD,aAC1BrJ,aAActB,EAAMK,QAAQ,GAC5BwK,OAAQ,aAAa7K,EAAMO,QAAQwK,MAAML,UAE3CM,eAAgB,CACd5K,QAASJ,EAAMK,QAAQ,GACvBI,gBAAiBT,EAAMO,QAAQ0K,QAAQP,KAAO,KAC9CC,aAAc3K,EAAM4K,MAAMD,aAC1BrJ,aAActB,EAAMK,QAAQ,GAC5BwK,OAAQ,aAAa7K,EAAMO,QAAQ0K,QAAQP,UAE7CQ,QAAS,CACP3J,QAAS,OACTC,WAAY,SACZgH,IAAKxI,EAAMK,QAAQ,IAErB8K,UAAW,CACTnJ,UAAWhC,EAAMK,QAAQ,GACzBD,QAAS,EACTgL,UAAW,QAEbC,UAAW,CACTjL,QAASJ,EAAMK,QAAQ,KACvBiB,aAActB,EAAMK,QAAQ,GAC5BI,gBAAiBT,EAAMO,QAAQG,WAAWC,MAC1CgK,aAAc3K,EAAM4K,MAAMD,aAC1BE,OAAQ,aAAa7K,EAAMO,QAAQC,WAErC8K,UAAW,CACTvK,WAAY,IACZC,SAAU,WACVM,aAActB,EAAMK,QAAQ,KAE9BkL,aAAc,CACZvK,SAAU,WACVG,MAAOnB,EAAMO,QAAQwK,MAAML,KAC3Bc,WAAY,YACZC,UAAW,cAEbC,aAAc,CACZ1J,UAAWhC,EAAMK,QAAQ,GACzBD,QAASJ,EAAMK,QAAQ,QAIrBsL,EAAkB,EACtBxE,OACAyE,UACA7B,YACAxC,cAEA,MAAM/E,EAAU+H,KACTsB,EAAYC,IAAiBC,EAAAA,EAAAA,WAAS,GACvCC,EAAiBJ,EAAQ/I,OAAQoJ,GAAaA,EAAIxB,SAClDyB,EAAgBN,EAAQ/I,OAAQoJ,IAAcA,EAAIxB,SAClD0B,EAAoBH,EAAe1I,OAAS,EAElD,OACE,UAAC6E,EAAAA,EAAMA,CACLhB,KAAMA,EACNI,QAASA,EACTa,SAAS,KACTC,WAAS,E,WAET,SAACC,EAAAA,EAAWA,C,UACV,SAAC/E,EAAAA,EAAGA,CAAChC,QAAQ,OAAOC,WAAW,SAAS+G,MAAO,CAAEC,IAAK,G,SACnD2D,GACC,sB,WACE,SAAC1D,EAAAA,EAAUA,CAACF,MAAO,CAAEpH,MAAO,cAC5B,UAAC0D,OAAAA,C,UAAK,QAAMkF,EAAY,UAAY,SAAS,gCAG/C,sB,WACE,SAACtB,EAAAA,EAAUA,CAACtH,MAAM,WAClB,UAAC0D,OAAAA,C,UAAK,QAAMkF,EAAY,UAAY,SAAS,qBAKrD,UAACrB,EAAAA,EAAaA,C,UACXyD,IACC,SAAC5I,EAAAA,EAAGA,CAACC,UAAWhB,EAAQgI,e,UACtB,UAACjH,EAAAA,EAAGA,CAACC,UAAWhB,EAAQ0I,Q,WACtB,SAACkB,EAAAA,EAAeA,CAAC7D,MAAO,CAAEpH,MAAO,cACjC,UAACuC,EAAAA,EAAUA,CAACC,QAAQ,Q,WAClB,SAACiF,SAAAA,C,SAAQoD,EAAe1I,SAAgB,WAAmC,IAA1B0I,EAAe1I,OAAe,IAAM,GAAG,IAAEyG,EAAY,WAAa,WAAW,yBAMtI,UAACxG,EAAAA,EAAGA,CAACC,UAAW2I,EAAoB3J,EAAQwI,eAAiBxI,EAAQsI,e,WACnE,UAACvH,EAAAA,EAAGA,CAACC,UAAWhB,EAAQ0I,Q,WACtB,SAACzC,EAAAA,EAAUA,CAACtH,MAAM,WAClB,UAACuC,EAAAA,EAAUA,CAACC,QAAQ,Q,WAClB,SAACiF,SAAAA,C,SAAQsD,EAAc5I,SAAgB,WAAkC,IAAzB4I,EAAc5I,OAAe,IAAM,GAAG,iBAI1F,UAACM,EAAAA,EAAMA,CACLC,KAAK,QACLL,UAAWhB,EAAQkJ,aACnB5H,QAAS,IAAMgI,GAAeD,G,UAE7BA,EAAa,OAAS,OAAO,oBAG/BA,IACC,SAACQ,KAAAA,CAAG7I,UAAWhB,EAAQ2I,U,SACpBe,EAAclJ,IAAI,CAACsJ,EAAQC,KAC1B,UAACC,KAAAA,CAA8BhJ,UAAWhB,EAAQ6I,U,WAChD,UAACoB,MAAAA,CAAIjJ,UAAWhB,EAAQ8I,U,UACrBgB,EAAOlC,UAAU,IAAEkC,EAAOxD,SAE7B,SAAC2D,MAAAA,CAAIjJ,UAAWhB,EAAQ+I,a,SACrBe,EAAOvB,OAAS,oBALZuB,EAAOxD,MAAQyD,aAalC,SAAC7C,EAAAA,EAAaA,C,UACZ,SAAC9F,EAAAA,EAAMA,CAACE,QAASyD,EAASpG,MAAM,UAAUwC,QAAQ,Y,SAAY,gBAQzD+I,EAAqB,K,IAihBjB/G,EAhhBf,MAAMnD,EAAU1C,IACV6M,GAAcC,EAAAA,EAAAA,QAAOC,EAAAA,gBACrBC,GAAWF,EAAAA,EAAAA,QAAOG,EAAAA,aAClBC,GAAcJ,EAAAA,EAAAA,QAAOK,EAAAA,IACpBC,EAASC,IAAcpB,EAAAA,EAAAA,UAAS,IAChCqB,EAAkBC,IAAuBtB,EAAAA,EAAAA,UAAmB,KAC5DuB,EAAaC,IAAkBxB,EAAAA,EAAAA,UAKnC,CACD5E,MAAM,EACNC,QAAS,KACTC,OAAQ,UACRC,YAAY,KAEPkG,EAAiBC,IAAsB1B,EAAAA,EAAAA,UAK3C,CACD5E,MAAM,EACN2C,SAAU,GACVzC,OAAQ,UACRC,YAAY,KAEPoG,EAAsBC,IAA2B5B,EAAAA,EAAAA,UAIrD,CACD5E,MAAM,EACNyE,QAAS,GACT7B,WAAW,KAEN1H,EAASuL,IAAc7B,EAAAA,EAAAA,UAAsB,CAClD8B,OAAQ,GACRC,WAAY,GACZC,KAAM,MAINC,QAASC,EACTC,QAASC,EACTpD,MAAOqD,IACLC,EAAAA,EAAAA,GAAsBC,EAAAA,KAGxBN,QAASO,EACTL,QAASM,EACTzD,MAAO0D,IACLJ,EAAAA,EAAAA,GAAsBK,EAAAA,IAEpBC,EACJR,GAA8BK,EAC1BI,EACJR,GAA4BK,GAExB,MAAE9I,EAAK,QAAEuI,EAAO,MAAEnD,IAAU8D,EAAAA,EAAAA,GAASC,UACzC,MACMC,SADiBpC,EAAYqC,wBACPC,cAE5B,IACE,MAAOC,EAAgBC,SAAqBC,QAAQC,IAAI,CACtDrC,EAAYsC,iBACZtC,EAAYuC,mBAGRC,EAAcN,EAAeO,OAAS,GACtCC,EAAmB,IAAI9M,IAE7B,IAAK,MAAM+M,KAAWR,EAAYM,OAAS,GAAI,C,IAC/BE,EAAAA,GAAgB,QAAhBA,EAAAA,EAAQxF,gBAARwF,IAAAA,GAA6B,QAA7BA,EAAAA,EAAkBC,mBAAlBD,IAAAA,OAAAA,EAAAA,EAAgC,yBAChCZ,GACZW,EAAiB9K,IACf,GAAG+K,EAAQxF,SAASC,aAAauF,EAAQxF,SAASrB,OAGxD,CAEA,MAAO,CAAE0G,cAAaT,aAAYW,mBAEpC,CAAE,MAAMG,GACN,MAAMtE,EAAesE,aAAeC,MAAQD,EAAIE,QAAU,yBAM1D,OALAjD,EAASkD,KAAK,CACZD,QAAS,4BAA4BxE,IACrChK,QAAS,YACT0O,SAAU,UAEL,CACLT,YAAa,GACbT,aACAW,iBAAkB,IAAI9M,IAE1B,GACC,CAACoK,EAAaL,EAAaO,IAExBgD,GAAkCC,EAAAA,EAAAA,SAAQ,KAC9C,KAAKxK,aAAAA,EAAAA,EAAO6J,aAAa,MAAO,GAEhC,MAAMY,EAAe,CAAEC,SAAU,EAAGC,QAAS,EAAGC,SAAU,GACpDC,EAAmB,IAAIC,IACvBC,EAAa,IAAID,IAgBvB,OAdA9K,EAAM6J,YAAYxL,QAAS2M,I,IACVA,EAGIA,EAHnB,MAAM9C,GAAiB,QAAR8C,EAAAA,EAAE9C,cAAF8C,IAAAA,OAAAA,EAAAA,EAAUC,QAAS,UAClCR,EAAavC,KAEb,MAAMC,GAAiC,QAApB6C,EAAAA,EAAE5I,KAAKc,qBAAP8H,IAAAA,OAAAA,EAAAA,EAAsB7H,OAAQ,UACjD0H,EAAiBK,IACf/C,GACC0C,EAAiBM,IAAIhD,IAAe,GAAK,GAG5C,MAAMC,EAAO4C,EAAE5I,KAAKgB,UAAY,UAChC2H,EAAWG,IAAI9C,GAAO2C,EAAWI,IAAI/C,IAAS,GAAK,KAG9C,CACL,CACE9K,GAAI,SACJ6B,MAAO,SACPM,QAAS,CACP,CAAEO,MAAO,UAAWK,MAAO,UAAW/D,MAAOmO,EAAaE,SAC1D,CACE3K,MAAO,WACPK,MAAO,WACP/D,MAAOmO,EAAaC,UAEtB,CACE1K,MAAO,WACPK,MAAO,WACP/D,MAAOmO,EAAaG,YAI1B,CACEtN,GAAI,aACJ6B,MAAO,cACPM,QAAS2L,MAAMC,KAAKR,EAAiBS,WAAWjO,IAC9C,EAAE8F,EAAM7G,MAAY,CAClB0D,MAAOmD,EACP9C,MAAO8C,EACP7G,WAGJc,UAAWyN,EAAiB3M,KAAO,GAErC,CACEZ,GAAI,OACJ6B,MAAO,OACPM,QAAS2L,MAAMC,KAAKN,EAAWO,WAAWjO,IAAI,EAAE+K,EAAM9L,MAAY,CAChE0D,MAAOoI,EACP/H,MAAO+H,EAAKmD,OAAO,GAAGC,cAAgBpD,EAAKqD,MAAM,GACjDnP,cAIL,CAAC0D,aAAAA,EAAAA,EAAO6J,cAEL6B,GAAmBlB,EAAAA,EAAAA,SAAQ,KAC1BxK,aAAAA,EAAAA,EAAO6J,aAEL7J,EAAM6J,YAAY3M,OAAQ8N,IAC/B,GAAItO,EAAQwL,OAAOvK,OAAS,EAAG,C,IACdqN,EAAf,MAAM9C,GAAiB,QAAR8C,EAAAA,EAAE9C,cAAF8C,IAAAA,OAAAA,EAAAA,EAAUC,QAAS,UAClC,IAAKvO,EAAQwL,OAAOnI,SAASmI,GAAS,OAAO,CAC/C,CACA,GAAIxL,EAAQyL,WAAWxK,OAAS,EAAG,C,IACdqN,EAAnB,MAAM7C,GAAiC,QAApB6C,EAAAA,EAAE5I,KAAKc,qBAAP8H,IAAAA,OAAAA,EAAAA,EAAsB7H,OAAQ,UACjD,IAAKzG,EAAQyL,WAAWpI,SAASoI,GAAa,OAAO,CACvD,CACA,GAAIzL,EAAQ0L,KAAKzK,OAAS,EAAG,CAC3B,MAAMyK,EAAO4C,EAAE5I,KAAKgB,UAAY,UAChC,IAAK1G,EAAQ0L,KAAKrI,SAASqI,GAAO,OAAO,CAC3C,CACA,OAAO,IAfuB,GAiB/B,CAACpI,aAAAA,EAAAA,EAAO6J,YAAanN,IA6IlBiP,GAAcC,GACL,IAAIC,KAAKD,GACVE,mBAAmB,QAAS,CACtCC,KAAM,UACNC,MAAO,QACPC,IAAK,YAIHC,GAAiC,CACrC,CACE/M,MAAO,YACPgN,MAAO,0BACPC,OAASC,IACP,SAACtO,EAAAA,EAAUA,CAACC,QAAQ,Q,SAASqO,EAAIjK,KAAKC,YAAYC,UAGtD,CACEnD,MAAO,cACPgN,MAAO,0BACPC,OAASC,I,IACMA,EAAb,MAAMlJ,GAA6B,QAAtBkJ,EAAAA,EAAIjK,KAAKc,qBAATmJ,IAAAA,OAAAA,EAAAA,EAAwBlJ,OAAQ,UAC7C,OACE,SAACmJ,EAAAA,GAAIA,CAACC,GAAI,wBAAwBpJ,I,UAChC,SAACF,SAAAA,C,SAAQE,QAKjB,CACEhE,MAAO,SACPgN,MAAO,eACPC,OAASC,I,IACOA,EAAd,MAAMpB,GAAkB,QAAVoB,EAAAA,EAAInE,cAAJmE,IAAAA,OAAAA,EAAAA,EAAYpB,QAAS,UACnC,OACE,SAACuB,EAAAA,EAAIA,CAACnM,MAAO4K,EAAO/M,KAAK,QAAQ0E,OAAO6J,EAAAA,EAAAA,IAAgCxB,OAI9E,CACE9L,MAAO,OACPgN,MAAO,gBACPC,OAASC,IACP,SAACG,EAAAA,EAAIA,CAACnM,MAAOgM,EAAIjK,KAAKgB,SAAUlF,KAAK,QAAQF,QAAQ,cAGzD,CACEmB,MAAO,YACPgN,MAAO,6BACPC,OAASC,IACP,SAACtO,EAAAA,EAAUA,CAACC,QAAQ,Q,SACjBqO,EAAI7H,SAASkI,kBACVf,GAAWU,EAAI7H,SAASkI,mBACxB,OAIV,CACEvN,MAAO,cACPgN,MAAO,oBACPC,OAASC,I,IACFA,EAAL,KAAe,QAAVA,EAAAA,EAAInE,cAAJmE,IAAAA,OAAAA,EAAAA,EAAYjD,YACf,OACE,SAACrL,EAAAA,EAAUA,CAACC,QAAQ,QAAQxC,MAAM,gB,SAAgB,MAItD,MAAMmR,EAAWN,EAAInE,OAAOkB,WAAWwD,QAAQ,kBAAmB,IAC5DC,EAA2B,WAAbF,EACpB,OACE,UAAC/O,EAAAA,EAAGA,C,WACF,SAACG,EAAAA,EAAUA,CAACC,QAAQ,Q,SACjB6O,EAAc,YAAcF,IAE9BN,EAAInE,OAAO4E,aACV,SAAC/O,EAAAA,EAAUA,CAACC,QAAQ,UAAUxC,MAAM,gB,SACjCmQ,GAAWU,EAAInE,OAAO4E,mBAOnC,CACE3N,MAAO,UACP4N,WAAW,EACXX,OAASC,I,IACOA,EAGqCA,EAEjDrM,EAJF,GAAc,cADU,QAAVqM,EAAAA,EAAInE,cAAJmE,IAAAA,OAAAA,EAAAA,EAAYpB,QAAS,WACV,OAAO,KAEhC,MAAM+B,EAAgB,GAAGX,EAAI7H,SAASC,cAAmC,QAAtB4H,EAAAA,EAAIjK,KAAKc,qBAATmJ,IAAAA,OAAAA,EAAAA,EAAwBlJ,OAAQ,Y,IAEjFnD,EADF,MAAMiN,EACyBD,QAA7BhN,EAAAA,SAAuB,QAAvBA,EAAAA,EAAO+J,wBAAP/J,IAAAA,OAAAA,EAAAA,EAAyBvB,IAAIuO,UAA7BhN,IAAAA,GAAAA,EAGF,OADEsI,GAAyBM,GAAwBqE,GAIjD,UAACrP,EAAAA,EAAGA,CAAChC,QAAQ,OAAOgH,MAAO,CAAEC,IAAK,G,WAChC,SAAC5E,EAAAA,EAAMA,CACLC,KAAK,QACL8F,WAAW,SAACyC,EAAAA,EAAeA,CAAAA,GAC3BtI,QAAS,KAhPnByJ,EAAe,CACbpG,MAAM,EACNC,QA8OqC4K,EA7OrC3K,OAAQ,UACRC,YAAY,KA6OJnG,MAAM,UACNwC,QAAQ,W,SACT,aAGD,SAACC,EAAAA,EAAMA,CACLC,KAAK,QACL8F,WAAW,SAAClB,EAAAA,EAAUA,CAAAA,GACtB3E,QAAS,KAhPnByJ,EAAe,CACbpG,MAAM,EACNC,QA8OoC4K,EA7OpC3K,OAAQ,SACRC,YAAY,KA6OJnG,MAAM,YACNwC,QAAQ,W,SACT,cAnBkB,QA4BvBkP,IAAoB1C,EAAAA,EAAAA,SACxB,IAAM,CACJ,CACE4B,OAASe,I,IAEF1L,EADL,MAAMA,EAAU0L,EAAKC,QACrB,OAAK3L,SAAiB,QAAjBA,EAAAA,EAAS+C,gBAAT/C,IAAAA,OAAAA,EAAAA,EAAmB0B,OAGjB,SAACuB,EAAAA,CAAmBjD,QAASA,KAF3B,SAAC7D,EAAAA,EAAGA,CAAAA,MAMnB,IAGF,GAAI2K,GAAWS,EACb,OACE,SAACpL,EAAAA,EAAGA,CAACoF,EAAG,E,SACL,IAAIoI,MAAM,IAAI/N,IAAI,CAACgQ,EAAGC,KACrB,SAAC1P,EAAAA,EAAGA,CAASoF,EAAG,E,UACd,SAACuK,EAAAA,EAAQA,CAACvP,QAAQ,OAAOzD,MAAM,UADvB+S,MAQlB,GAAIlI,EACF,OAAO,SAACoI,EAAAA,EAAkBA,CAACpI,MAAOA,IAGpC,GAAI6D,EACF,OACE,SAACrL,EAAAA,EAAGA,CAACoF,EAAG,E,UACN,UAACjF,EAAAA,EAAUA,CAACvC,MAAM,Q,UAAQ,gCACMyN,EAAsBmB,aAM5D,MAAMqD,GAAgBnF,GAAwBM,EAE9C,OACE,sB,WACE,UAAChL,EAAAA,EAAGA,CAACC,UAAWhB,EAAQiE,U,WACtB,SAACtE,EAAAA,EAAWA,CACVC,SAAU8N,EACV7N,QAASA,EACTC,SAAUsL,KAEZ,UAACrK,EAAAA,EAAGA,CAACC,UAAWhB,EAAQmE,e,UACrByG,EAAiB9J,OAAS,IACzB,UAACC,EAAAA,EAAGA,CAACC,UAAWhB,EAAQwE,Y,WACtB,UAACtD,EAAAA,EAAUA,CAACC,QAAQ,Q,UACjByJ,EAAiB9J,OAAO,WACI,IAA5B8J,EAAiB9J,OAAe,IAAM,GAAG,gBAE5C,UAACC,EAAAA,EAAGA,CAAChC,QAAQ,OAAOgH,MAAO,CAAEC,IAAK,G,WAChC,SAAC5E,EAAAA,EAAMA,CACLC,KAAK,QACLF,QAAQ,YACRxC,MAAM,UACNwI,WAAW,SAACyC,EAAAA,EAAeA,CAAAA,GAC3BtI,QAxQU,KACQ,IAA5BsJ,EAAiB9J,QACrBmK,EAAmB,CACjBtG,MAAM,EACN2C,SAAUsD,EACV/F,OAAQ,UACRC,YAAY,K,SAmQD,sBAGD,SAAC1D,EAAAA,EAAMA,CACLC,KAAK,QACLF,QAAQ,YACRxC,MAAM,YACNwI,WAAW,SAAClB,EAAAA,EAAUA,CAAAA,GACtB3E,QAvQS,KACS,IAA5BsJ,EAAiB9J,QACrBmK,EAAmB,CACjBtG,MAAM,EACN2C,SAAUsD,EACV/F,OAAQ,SACRC,YAAY,K,SAkQD,0BAOsB,IAA5B+J,EAAiB/N,QAChB,SAACC,EAAAA,EAAGA,CAACoF,EAAG,EAAG0K,UAAU,S,UACnB,SAAC3P,EAAAA,EAAUA,CAACC,QAAQ,QAAQxC,MAAM,gB,SACA,KAA/BwE,SAAkB,QAAlBA,EAAAA,EAAO6J,mBAAP7J,IAAAA,OAAAA,EAAAA,EAAoBrC,QACjB,qBACA,+CAIR,SAACgQ,EAAAA,EAAKA,CACJlO,QAAS,CACPmO,UAAWH,GACXI,sBAAuBnC,EAAiBhO,KACrCsN,I,IACEA,E,QAAQ,QAARA,EAAAA,EAAE9C,cAAF8C,IAAAA,OAAAA,EAAAA,EAAUC,QAA4B,YAAnBD,EAAE9C,OAAO+C,QAEjC6C,eAAiBzB,I,IAEbA,EACAA,E,MAH8B,CAChCzI,SACwB,aAAZ,QAAVyI,EAAAA,EAAInE,cAAJmE,IAAAA,OAAAA,EAAAA,EAAYpB,aACU3K,KAAZ,QAAV+L,EAAAA,EAAInE,cAAJmE,IAAAA,OAAAA,EAAAA,EAAYpB,SAEhB8C,OAAQrC,EAAiB/N,OAAS,GAClCqQ,SAAU,GACVC,QAAQ,EACRlB,WAAW,EACXmB,iBAAkB,IAClBC,sBAAsB,EACtBC,SAAS,EACTC,qBAAqB,GAEvBnC,QAASA,GACTiB,KAAMzB,EAAiBrO,IAAKiR,IAC1B,MAAMC,EAAa9G,EAAiB/J,KACjC8Q,GACCA,EAAShK,SAASrB,OAASmL,EAAK9J,SAASrB,MACzCqL,EAAShK,SAASC,YAAc6J,EAAK9J,SAASC,WAElD,MAAO,IACF6J,EACHhR,GAAIgR,EAAK9J,SAASrB,KAClBsL,UAAW,CAAE3O,QAASyO,MAG1BG,kBAAoBC,IAElB,MAAMC,EAAc,EAAmB1R,OACpC8N,I,IAAOA,E,QAAQ,QAARA,EAAAA,EAAE9C,cAAF8C,IAAAA,OAAAA,EAAAA,EAAUC,QAA4B,YAAnBD,EAAE9C,OAAO+C,QAEtCvD,EAAoBkH,IAEtBC,YAAa3B,YAMrB,SAAC3L,EAAAA,CACCC,KAAMmG,EAAYnG,KAClBC,QAASkG,EAAYlG,QACrBC,OAAQiG,EAAYjG,OACpBC,WAAYgG,EAAYhG,WACxBC,QAAS,IACPgG,EAAe,CACbpG,MAAM,EACNC,QAAS,KACTC,OAAQ,UACRC,YAAY,IAGhBE,UA1YgBsH,UACpB,IAAKxB,EAAYlG,UAAYzB,EAAO,OAEpC4H,EAAgB9I,IAAU,IAAKA,EAAM6C,YAAY,KAEjD,MAAMmN,EAAyC,YAAvBnH,EAAYjG,OAChC,CAACqN,EAAYC,EAAWhE,IAAc3D,EAAY4H,eAAeF,EAAIC,EAAGhE,GACxE,CAAC+D,EAAYC,EAAWhE,IAAc3D,EAAY6H,cAAcH,EAAIC,EAAGhE,GAC3E,UACQ8D,EAAgBnH,EAAYlG,QAAQ+C,SAASC,UAAWkD,EAAYlG,QAAQ+C,SAASrB,KAAMnD,EAAMoJ,YAEvGxB,EAAe,CACbpG,MAAM,EACNC,QAAS,KACTC,OAAQ,UACRC,YAAY,IAGd+F,EAAqB5I,GACnBA,EAAK5B,OACF8N,I,IACqBrD,EACKA,E,OADzBqD,EAAExG,SAASrB,QAA4B,QAAnBwE,EAAAA,EAAYlG,eAAZkG,IAAAA,OAAAA,EAAAA,EAAqBnD,SAASrB,OAClD6H,EAAExG,SAASC,aAAiC,QAAnBkD,EAAAA,EAAYlG,eAAZkG,IAAAA,OAAAA,EAAAA,EAAqBnD,SAASC,cAG7D+C,EAAYwD,GAAMA,EAAI,GACtB,MAAMtJ,EAAgC,YAAvBiG,EAAYjG,OAAuB,WAAa,WAC/DyF,EAASkD,KAAK,CACZD,QAAS,WAAW1I,IACpB4I,SAAU,UACV1O,QAAS,aAEb,CAAE,MAAOsO,GACPiF,QAAQ/J,MAAM,SAASuC,EAAYjG,qBAAsBwI,GACzDtC,EAAgB9I,IAAU,IAAKA,EAAM6C,YAAY,KACjD,MAAMiE,EAAesE,aAAeC,MAAQD,EAAIE,QAAU,yBAC1DjD,EAASkD,KAAK,CACZD,QAAS,aAAazC,EAAYjG,mBAAmBkE,IACrD0E,SAAU,QACV1O,QAAS,aAEb,MAmWE,SAACsI,EAAAA,CACC1C,KAAMqG,EAAgBrG,KACtB2C,SAAU0D,EAAgB1D,SAC1BzC,OAAQmG,EAAgBnG,OACxBC,WAAYkG,EAAgBlG,WAC5BC,QAAS,IACPkG,EAAmB,CACjBtG,MAAM,EACN2C,SAAU,GACVzC,OAAQ,UACRC,YAAY,IAGhBE,UAzVoBsH,UACxB,IAAKnJ,GAA6C,IAApC6H,EAAgB1D,SAASxG,OAAc,OAErDmK,EAAoBhJ,IAAU,IAAKA,EAAM6C,YAAY,KACrDqG,EAAwB,CAAExG,MAAM,EAAOyE,QAAS,GAAI7B,WAAW,IAE/D,MAAMA,EAAuC,YAA3ByD,EAAgBnG,OAC5B0N,EAAmBhL,EACrB,CAACiL,EAA4CC,IAAejI,EAAYkI,oBAAoBF,EAAKC,GACjG,CAACD,EAA4CC,IAAejI,EAAYmI,mBAAmBH,EAAKC,GAEpG,IACE,MAAMnL,EAAW0D,EAAgB1D,SAAS9G,IAAK2N,IAAO,CACpDvG,UAAWuG,EAAExG,SAASC,UACtBtB,KAAM6H,EAAExG,SAASrB,QAEbsM,QAAqBL,EAAiBjL,EAAUnE,EAAMoJ,aAAe,GAErEsG,EAAkBD,EAAavS,OAAQoJ,GAAaA,EAAIxB,SAExD6K,EAAsC,IADxBF,EAAavS,OAAQoJ,IAAcA,EAAIxB,SAC1BnH,OAE3B+D,EAAS0C,EAAY,WAAa,WAExC0D,EAAmB,CACjBtG,MAAM,EACN2C,SAAU,GACVzC,OAAQ,UACRC,YAAY,IAEdqG,EAAwB,CACtBxG,MAAOmO,EACP1J,QAASwJ,EACTrL,cAEFsD,EAAoB,IACpBF,EAAYwD,GAAMA,EAAI,GAElB2E,GACFxI,EAASkD,KAAK,CACZD,QAAS,GAAGsF,EAAgB/R,mBAAmB+D,IAC/C4I,SAAU,UACV1O,QAAS,aAGf,CAAE,MAAOsO,GACPiF,QAAQ/J,MAAM,cAAcyC,EAAgBnG,sBAAuBwI,GACnEpC,EAAoBhJ,IAAU,IAAKA,EAAM6C,YAAY,KACrD,MAAMiE,EAAesE,aAAeC,MAAQD,EAAIE,QAAU,yBAC1DjD,EAASkD,KAAK,CACZD,QAAS,kBAAkBvC,EAAgBnG,oBAAoBkE,IAC/D0E,SAAU,QACV1O,QAAS,aAEb,MAqSE,SAACoK,EAAAA,CACCxE,KAAMuG,EAAqBvG,KAC3ByE,QAAS8B,EAAqB9B,QAC9B7B,UAAW2D,EAAqB3D,UAChCxC,QAAS,IACPoG,EAAwB,CACtBxG,MAAM,EACNyE,QAAS,GACT7B,WAAW,UCrhCVwL,EAAqB,KAE9B,UAACC,EAAAA,EAAIA,CAACC,QAAQ,O,WACZ,SAACC,EAAAA,EAAMA,CAAC5Q,MAAM,mBAAmB6Q,SAAS,sC,UACxC,SAACC,EAAAA,EAAaA,C,SAAC,iDAEjB,SAACC,EAAAA,EAAOA,C,UACN,SAACnJ,EAAkBA,CAAAA,O,oPCZ3B,MAAMoJ,EAA0B,KAC9B,MAAM,EAAEC,IAAM,OAAkB,KAChC,MAAO,CACLC,IAAK,gDACLvG,MAAO,CACL,CACE3K,MAAOiR,EAAE,+BACTE,KAAM,UACNC,MAAO,CACL,CAEEpR,MAAOiR,EAAE,mCACTC,IAAK,2E,eCZjB,SAASG,EAAQC,GACf,MAAQnT,GAAIoT,EAAG,SAAEC,EAAW,OAAuBC,GAASH,EAEtDI,GADM,IAAAC,UACKC,cAAcL,IAAQC,EACvC,OAAuB,IAAAK,KAAIH,EAAM,IAAKD,GACxC,CAyBA,SAASK,EAASR,GAChB,OAAuB,IAAAO,KAAIR,EAAS,CAAElT,GAAI,UAAWmT,GACvD,C,eCXA,MAAMtW,GAAY,IAAAC,YAChB,CACE8W,YAAa,CACX1W,SAAU,IACViI,SAAU,KAEZ0O,SAAU,CACR7N,WAAY,WAGhB,CAAEH,KAAM,2BAEJiO,EAAc,EAAGd,WACrB,MAAMe,GAAM,IAAAP,UACND,EAAOP,EAAOe,EAAIN,cAAcT,IAASW,EAAWA,EAC1D,OAAuB,IAAAD,KAAIH,EAAM,CAAC,IAE9BS,EAAc,EAAGC,WAA2B,IAAAP,KAAI,KAAM,CAAEzE,GAAIgF,EAAKlB,IAAKmB,SAAUD,EAAKpS,OAASoS,EAAKlB,MACnGoB,EAAkB,EAAGnD,WACF,IAAAoD,MAAKC,EAAA,EAAU,CAAEC,QAAQ,EAAOJ,SAAU,EAC/C,IAAAR,KAAIa,EAAA,EAAc,CAAEL,UAA0B,IAAAR,KAAII,EAAa,CAAEd,KAAMhC,EAAKgC,UAC5E,IAAAU,KACdc,EAAA,EACA,CACEC,QAASzD,EAAKnP,MACdzD,UAAW4S,EAAKiC,OAAOyB,OACrB,CAAClT,EAAMyS,EAAMU,IAAQ,IAChBnT,EACHmT,EAAM,IAAqB,IAAAjB,KAAI,KAAM,CAAC,EAAGiB,IACzB,IAAAjB,KAAIM,EAAa,CAAEC,QAAQA,EAAKlB,MAElD,SAMV,SAASJ,EAAcQ,GACrB,MAAM,IAAQ,OAAkB,MAC1B,MAAEtR,EAAK,MAAE2K,EAAK,SAAE0H,GAAaf,GAC3B3G,MAAOoI,GF1CjB,WACE,MACMC,GADY,IAAAC,gBACOjH,IAAI,EAAAkH,cACvBC,EAAgBH,GAAQI,kBAAkB,eAC1CC,EAAuBrC,IAC7B,OAAKmC,EAGE,CACLjC,IAAKiC,EAAcG,UAAU,OAC7B3I,MAAOwI,EAAcI,eAAe,SAASC,QAASC,IAAa,CACjEzT,MAAOyT,EAASH,UAAU,SAC1BnC,KAAMsC,EAASC,kBAAkB,QACjCtC,OAAQqC,EAASE,uBAAuB,UAAY,IAAIH,QACrDI,IAAa,CACZ1C,IAAK0C,EAASN,UAAU,OACxBtT,MAAO4T,EAASF,kBAAkB,UAAY,UAV7CL,CAeX,CEqBiCQ,IACxBC,EAAaC,IAAkB,IAAA9M,WAAS,IACxC+M,EAAUC,IAAe,IAAAhN,UAAS,MACnCvJ,EAAU1C,IACVmY,GAAgB,IAAArL,QAAO,EAAAoL,cAAcE,kBAAkB,eACvDc,GAAgB,EAAAC,EAAA,GACnBjZ,GAAUA,EAAMkZ,YAAYC,KAAK,OAE9BC,EAAkBC,IACtBN,EAAYM,EAAMC,eAClBT,GAAe,IAEXU,EAAsB,KAC1BV,GAAe,IAEjB,OAAKZ,GAGkB,IAAAZ,MAAK,EAAAmC,SAAU,CAAErC,SAAU,EAChC,IAAAR,KAAIpT,EAAA,EAAK,CAAEhC,QAAS,OAAQkY,GAAI,EAAGtC,SAAU6B,GAAgC,IAAArC,KAC3F+C,EAAA,EACA,CACEvY,MAAO,UACP0C,KAAM,QACNC,QAASsV,EACT,cAAe,iBACf,aAAc,UACdjC,UAA0B,IAAAR,KAAIC,EAAU,CAAC,MAEzB,IAAAD,KAClB/S,EAAA,EACA,CACE,cAAe,iBACf,aAAc,UACdzC,MAAO,UACP2C,QAASsV,EACTzP,WAA2B,IAAAgN,KAAIC,EAAU,CAAC,GAC1CO,SAAUpB,EAAE,4BAGA,IAAAsB,MACdsC,EAAA,GACA,CACE,cAAe,yBACfxS,KAAMyR,EACNE,WACAc,aAAc,CACZC,SAAU,SACVC,WAAY,SAEdC,gBAAiB,CACfF,SAAU,MACVC,WAAY,SAEdvS,QAASgS,EACTpC,SAAU,EACQ,IAAAE,MACd2C,EAAA,EACA,CACExW,UAAWhB,EAAQqU,YACnBoD,cAAeC,QAAQpB,GACvB3B,SAAU,CACRrS,IAAyB,IAAA6R,KACvBW,EAAA,EACA,CACEC,QAAQ,EACR/V,WAAY,aACZgC,UAAWhB,EAAQsU,SACnBK,UAA0B,IAAAR,KAAIjT,EAAA,EAAY,CAAEC,QAAS,YAAawT,SAAUrS,MAGhF,EAAAqV,SAASnX,IAAImU,EAAU,CAACiD,EAAOnH,KAAsB,IAAA0D,KACnDW,EAAA,EACA,CACEC,QAAQ,EACR/V,WAAY,aACZgC,UAAWhB,EAAQsU,SACnBK,SAAUiD,GAEZ,SAASnH,OAEVxD,GAASoI,GAAa7U,IAAI,CAACiR,EAAMhB,KAAsB,IAAA0D,KAAIS,EAAiB,CAAEnD,QAAQ,QAAQhB,UAIrF,IAAA0D,KAAIjN,EAAA,EAAe,CAAEyN,UAA0B,IAAAR,KAC7D/S,EAAA,EACA,CACEzC,MAAO,UACP2C,QAASyV,EACT,aAAc,QACdpC,SAAUpB,EAAE,iCA3Ef,IAkFX,C","sources":["webpack://internal.plugin-kuadrant/./src/components/FilterPanel/FilterPanel.tsx","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/ExpandLess.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/BrokenImage.js","webpack://internal.plugin-kuadrant/./src/components/ApprovalQueueTable/ApprovalQueueTable.tsx","webpack://internal.plugin-kuadrant/./src/components/ApiKeyApprovalPage/ApiKeyApprovalPage.tsx","webpack://internal.plugin-kuadrant/./node_modules/@backstage/core-components/dist/hooks/useSupportConfig.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/core-components/dist/icons/icons.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/core-components/dist/components/SupportButton/SupportButton.esm.js"],"sourcesContent":["import React from 'react';\nimport {\n Box,\n Typography,\n Checkbox,\n FormControlLabel,\n FormGroup,\n Divider,\n Button,\n Collapse,\n makeStyles,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport ExpandLessIcon from '@material-ui/icons/ExpandLess';\n\nconst useStyles = makeStyles(theme => ({\n root: {\n width: 240,\n minWidth: 240,\n padding: theme.spacing(2),\n borderRight: `1px solid ${theme.palette.divider}`,\n backgroundColor: theme.palette.background.paper,\n height: '100%',\n overflowY: 'auto',\n },\n sectionTitle: {\n fontWeight: 600,\n fontSize: '0.75rem',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n color: theme.palette.text.secondary,\n marginBottom: theme.spacing(1),\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n cursor: 'pointer',\n userSelect: 'none',\n },\n filterSection: {\n marginBottom: theme.spacing(2),\n },\n checkbox: {\n padding: theme.spacing(0.5),\n },\n checkboxLabel: {\n fontSize: '0.875rem',\n },\n clearButton: {\n marginTop: theme.spacing(2),\n },\n count: {\n fontSize: '0.75rem',\n color: theme.palette.text.secondary,\n marginLeft: theme.spacing(1),\n },\n}));\n\nexport interface FilterOption {\n value: string;\n label: string;\n count?: number;\n}\n\nexport interface FilterSection {\n id: string;\n title: string;\n options: FilterOption[];\n collapsed?: boolean;\n}\n\nexport interface FilterState {\n [sectionId: string]: string[];\n}\n\ninterface FilterPanelProps {\n sections: FilterSection[];\n filters: FilterState;\n onChange: (filters: FilterState) => void;\n onClear?: () => void;\n}\n\nexport const FilterPanel = ({\n sections,\n filters,\n onChange,\n onClear,\n}: FilterPanelProps) => {\n const classes = useStyles();\n const [collapsedSections, setCollapsedSections] = React.useState<Set<string>>(\n new Set(sections.filter(s => s.collapsed).map(s => s.id)),\n );\n\n const toggleSection = (sectionId: string) => {\n setCollapsedSections(prev => {\n const next = new Set(prev);\n if (next.has(sectionId)) {\n next.delete(sectionId);\n } else {\n next.add(sectionId);\n }\n return next;\n });\n };\n\n const handleCheckboxChange = (sectionId: string, value: string) => {\n const currentValues = filters[sectionId] || [];\n const newValues = currentValues.includes(value)\n ? currentValues.filter(v => v !== value)\n : [...currentValues, value];\n\n onChange({\n ...filters,\n [sectionId]: newValues,\n });\n };\n\n const hasActiveFilters = Object.values(filters).some(\n values => values.length > 0,\n );\n\n const handleClear = () => {\n const clearedFilters: FilterState = {};\n sections.forEach(section => {\n clearedFilters[section.id] = [];\n });\n onChange(clearedFilters);\n onClear?.();\n };\n\n return (\n <Box className={classes.root}>\n <Box display=\"flex\" justifyContent=\"space-between\" alignItems=\"center\" mb={2}>\n <Typography variant=\"subtitle2\">Filters</Typography>\n {hasActiveFilters && (\n <Button\n size=\"small\"\n color=\"primary\"\n onClick={handleClear}\n >\n Clear all\n </Button>\n )}\n </Box>\n\n <Divider />\n\n {sections.map(section => {\n const isCollapsed = collapsedSections.has(section.id);\n const selectedCount = (filters[section.id] || []).length;\n\n return (\n <Box key={section.id} className={classes.filterSection} mt={2}>\n <Box\n className={classes.sectionTitle}\n onClick={() => toggleSection(section.id)}\n >\n <Box display=\"flex\" alignItems=\"center\">\n <span>{section.title}</span>\n {selectedCount > 0 && (\n <span className={classes.count}>({selectedCount})</span>\n )}\n </Box>\n {isCollapsed ? (\n <ExpandMoreIcon fontSize=\"small\" />\n ) : (\n <ExpandLessIcon fontSize=\"small\" />\n )}\n </Box>\n\n <Collapse in={!isCollapsed}>\n <FormGroup>\n {section.options.map(option => (\n <FormControlLabel\n key={option.value}\n control={\n <Checkbox\n checked={(filters[section.id] || []).includes(option.value)}\n onChange={() =>\n handleCheckboxChange(section.id, option.value)\n }\n size=\"small\"\n className={classes.checkbox}\n color=\"primary\"\n />\n }\n label={\n <Box display=\"flex\" alignItems=\"center\">\n <span className={classes.checkboxLabel}>\n {option.label}\n </span>\n {option.count !== undefined && (\n <span className={classes.count}>({option.count})</span>\n )}\n </Box>\n }\n />\n ))}\n </FormGroup>\n </Collapse>\n </Box>\n );\n })}\n </Box>\n );\n};\n","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z\"\n}), 'ExpandLess');\n\nexports.default = _default;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M21 5v6.59l-3-3.01-4 4.01-4-4-4 4-3-3.01V5c0-1.1.9-2 2-2h14c1.1 0 2 .9 2 2zm-3 6.42l3 3.01V19c0 1.1-.9 2-2 2H5c-1.1 0-2-.9-2-2v-6.58l3 2.99 4-4 4 4 4-3.99z\"\n}), 'BrokenImage');\n\nexports.default = _default;","import React, { useState, useMemo } from \"react\";\nimport {\n useApi,\n identityApiRef,\n alertApiRef,\n} from \"@backstage/core-plugin-api\";\nimport { kuadrantApiRef } from '../../api';\nimport { useAsync } from \"react-use\";\nimport {\n Table,\n TableColumn,\n ResponseErrorPanel,\n Link,\n} from \"@backstage/core-components\";\nimport {\n kuadrantApiKeyUpdateAllPermission,\n kuadrantApiKeyUpdateOwnPermission,\n} from \"../../permissions\";\nimport { useKuadrantPermission } from \"../../utils/permissions\";\nimport {\n Button,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Chip,\n Typography,\n Box,\n CircularProgress,\n TextField,\n makeStyles,\n} from \"@material-ui/core\";\nimport { Skeleton } from \"@material-ui/lab\";\nimport CheckCircleIcon from \"@material-ui/icons/CheckCircle\";\nimport CancelIcon from \"@material-ui/icons/Cancel\";\nimport { FilterPanel, FilterSection, FilterState } from \"../FilterPanel\";\nimport {APIKey, BulkOperationResult} from \"../../types/api-management\";\nimport { getApprovalQueueStatusChipStyle } from \"../../utils/styles\";\n\nconst useStyles = makeStyles((theme) => ({\n container: {\n display: \"flex\",\n height: \"100%\",\n minHeight: 400,\n },\n tableContainer: {\n flex: 1,\n overflow: \"auto\",\n padding: 10,\n },\n useCasePanel: {\n padding: theme.spacing(2),\n backgroundColor: theme.palette.background.default,\n },\n useCaseLabel: {\n fontWeight: 600,\n marginBottom: theme.spacing(1),\n color: theme.palette.text.secondary,\n textTransform: \"uppercase\",\n fontSize: \"0.75rem\",\n },\n bulkActions: {\n padding: theme.spacing(2),\n backgroundColor: theme.palette.background.default,\n borderBottom: `1px solid ${theme.palette.divider}`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n },\n}));\n\ninterface ApprovalDialogProps {\n open: boolean;\n request: APIKey | null;\n action: \"approve\" | \"reject\";\n processing: boolean;\n onClose: () => void;\n onConfirm: () => void;\n}\n\nconst ApprovalDialog = ({\n open,\n request,\n action,\n processing,\n onClose,\n onConfirm,\n}: ApprovalDialogProps) => {\n const [confirmInput, setConfirmInput] = React.useState(\"\");\n const actionLabel = action === \"approve\" ? \"Approve\" : \"Reject\";\n const processingLabel =\n action === \"approve\" ? \"Approving...\" : \"Rejecting...\";\n\n const isReject = action === \"reject\";\n const confirmText = request?.spec.requestedBy?.userId || \"\";\n const canConfirm = isReject ? confirmInput === confirmText : true;\n\n // reset input when dialog closes\n React.useEffect(() => {\n if (!open) {\n setConfirmInput(\"\");\n }\n }, [open]);\n\n return (\n <Dialog\n open={open}\n onClose={processing ? undefined : onClose}\n maxWidth=\"sm\"\n fullWidth\n >\n <DialogTitle>\n {isReject ? (\n <Box display=\"flex\" alignItems=\"center\" style={{ gap: 8 }}>\n <CancelIcon color=\"error\" />\n <span>{actionLabel} API Key</span>\n </Box>\n ) : (\n <span>{actionLabel} API Key</span>\n )}\n </DialogTitle>\n <DialogContent>\n {request && (\n <>\n <p>\n <strong>User:</strong> {request.spec.requestedBy.userId}\n </p>\n <p>\n <strong>API:</strong>{\" \"}\n {request.spec.apiProductRef?.name || \"unknown\"}\n </p>\n <p>\n <strong>Tier:</strong> {request.spec.planTier}\n </p>\n <Box mb={2}>\n <Typography\n variant=\"body2\"\n component=\"span\"\n style={{ fontWeight: \"bold\" }}\n >\n Use Case:\n </Typography>{\" \"}\n <Typography\n variant=\"body2\"\n component=\"span\"\n style={{ whiteSpace: \"pre-wrap\" }}\n >\n {request.spec.useCase || \"-\"}\n </Typography>\n </Box>\n {isReject && (\n <Box mt={2}>\n <Typography variant=\"body2\" color=\"textSecondary\" gutterBottom>\n Type <strong>{confirmText}</strong> to confirm rejection:\n </Typography>\n <TextField\n fullWidth\n variant=\"outlined\"\n size=\"small\"\n value={confirmInput}\n onChange={(e) => setConfirmInput(e.target.value)}\n disabled={processing}\n autoFocus\n placeholder={confirmText}\n />\n </Box>\n )}\n </>\n )}\n </DialogContent>\n <DialogActions>\n <Button onClick={onClose} disabled={processing}>\n Cancel\n </Button>\n <Button\n onClick={onConfirm}\n color={action === \"approve\" ? \"primary\" : \"secondary\"}\n variant=\"contained\"\n disabled={processing || !canConfirm}\n startIcon={\n processing ? (\n <CircularProgress size={16} color=\"inherit\" />\n ) : undefined\n }\n >\n {processing ? processingLabel : actionLabel}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n\ninterface BulkActionDialogProps {\n open: boolean;\n requests: APIKey[];\n action: \"approve\" | \"reject\";\n processing: boolean;\n onClose: () => void;\n onConfirm: () => void;\n}\n\nconst BulkActionDialog = ({\n open,\n requests,\n action,\n processing,\n onClose,\n onConfirm,\n}: BulkActionDialogProps) => {\n const isApprove = action === \"approve\";\n const actionLabel = isApprove ? \"Approve All\" : \"Reject All\";\n const processingLabel = isApprove ? \"Approving...\" : \"Rejecting...\";\n\n return (\n <Dialog\n open={open}\n onClose={processing ? undefined : onClose}\n maxWidth=\"md\"\n fullWidth\n >\n <DialogTitle>\n {isApprove ? \"Approve\" : \"Reject\"} {requests.length} API Keys\n </DialogTitle>\n <DialogContent>\n <Typography variant=\"body2\" paragraph>\n You are about to {isApprove ? \"approve\" : \"reject\"} the following API\n keys:\n </Typography>\n <Box mb={2} maxHeight={200} overflow=\"auto\">\n {requests.map((request) => (\n <Box\n key={`${request.metadata.namespace}/${request.metadata.name}`}\n mb={1}\n p={1}\n bgcolor=\"background.default\"\n >\n <Typography variant=\"body2\">\n <strong>{request.spec.requestedBy.userId}</strong> -{\" \"}\n {request.spec.apiProductRef?.name || \"unknown\"} (\n {request.spec.planTier})\n </Typography>\n </Box>\n ))}\n </Box>\n </DialogContent>\n <DialogActions>\n <Button onClick={onClose} disabled={processing}>\n Cancel\n </Button>\n <Button\n onClick={onConfirm}\n color={isApprove ? \"primary\" : \"secondary\"}\n variant=\"contained\"\n disabled={processing}\n startIcon={\n processing ? (\n <CircularProgress size={16} color=\"inherit\" />\n ) : undefined\n }\n >\n {processing ? processingLabel : actionLabel}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n\ninterface ExpandedRowProps {\n request: APIKey;\n}\n\nconst ExpandedRowContent = ({ request }: ExpandedRowProps) => {\n const classes = useStyles();\n\n return (\n <Box className={classes.useCasePanel} onClick={(e) => e.stopPropagation()}>\n <Typography className={classes.useCaseLabel}>Use Case</Typography>\n <Typography variant=\"body2\">\n {request.spec.useCase || \"No use case provided\"}\n </Typography>\n </Box>\n );\n};\n\ninterface AlertDialogProps {\n open: boolean;\n results: BulkOperationResult[];\n isApprove: boolean;\n onClose: () => void;\n}\n\nconst useBulkAlertStyles = makeStyles((theme) => ({\n successSection: {\n padding: theme.spacing(2),\n backgroundColor: theme.palette.success.main + '14',\n borderRadius: theme.shape.borderRadius,\n marginBottom: theme.spacing(2),\n border: `1px solid ${theme.palette.success.main}40`,\n },\n failureSection: {\n padding: theme.spacing(2),\n backgroundColor: theme.palette.error.main + '14',\n borderRadius: theme.shape.borderRadius,\n marginBottom: theme.spacing(2),\n border: `1px solid ${theme.palette.error.main}40`,\n },\n warningSection: {\n padding: theme.spacing(2),\n backgroundColor: theme.palette.warning.main + '14',\n borderRadius: theme.shape.borderRadius,\n marginBottom: theme.spacing(2),\n border: `1px solid ${theme.palette.warning.main}40`,\n },\n statRow: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n },\n errorList: {\n marginTop: theme.spacing(2),\n padding: 0,\n listStyle: 'none',\n },\n errorItem: {\n padding: theme.spacing(1.5),\n marginBottom: theme.spacing(1),\n backgroundColor: theme.palette.background.paper,\n borderRadius: theme.shape.borderRadius,\n border: `1px solid ${theme.palette.divider}`,\n },\n errorName: {\n fontWeight: 600,\n fontSize: '0.875rem',\n marginBottom: theme.spacing(0.5),\n },\n errorMessage: {\n fontSize: '0.813rem',\n color: theme.palette.error.main,\n fontFamily: 'monospace',\n wordBreak: 'break-word',\n },\n expandButton: {\n marginTop: theme.spacing(1),\n padding: theme.spacing(0.5),\n },\n}));\n\nconst BulkAlertDialog = ({\n open,\n results,\n isApprove,\n onClose,\n}: AlertDialogProps) => {\n const classes = useBulkAlertStyles();\n const [showErrors, setShowErrors] = useState(true);\n const successResults = results.filter((res: any) => res.success);\n const failedResults = results.filter((res: any) => !res.success);\n const hasPartialSuccess = successResults.length > 0;\n\n return (\n <Dialog\n open={open}\n onClose={onClose}\n maxWidth=\"md\"\n fullWidth\n >\n <DialogTitle>\n <Box display=\"flex\" alignItems=\"center\" style={{ gap: 8 }}>\n {hasPartialSuccess ? (\n <>\n <CancelIcon style={{ color: '#ff9800' }} />\n <span>Bulk {isApprove ? \"Approve\" : \"Reject\"} Completed with Issues</span>\n </>\n ) : (\n <>\n <CancelIcon color=\"error\" />\n <span>Bulk {isApprove ? \"Approve\" : \"Reject\"} Failed</span>\n </>\n )}\n </Box>\n </DialogTitle>\n <DialogContent>\n {hasPartialSuccess && (\n <Box className={classes.successSection}>\n <Box className={classes.statRow}>\n <CheckCircleIcon style={{ color: '#4caf50' }} />\n <Typography variant=\"body1\">\n <strong>{successResults.length}</strong> API key{successResults.length !== 1 ? 's' : ''} {isApprove ? 'approved' : 'rejected'} successfully\n </Typography>\n </Box>\n </Box>\n )}\n\n <Box className={hasPartialSuccess ? classes.warningSection : classes.failureSection}>\n <Box className={classes.statRow}>\n <CancelIcon color=\"error\" />\n <Typography variant=\"body1\">\n <strong>{failedResults.length}</strong> request{failedResults.length !== 1 ? 's' : ''} failed\n </Typography>\n </Box>\n\n <Button\n size=\"small\"\n className={classes.expandButton}\n onClick={() => setShowErrors(!showErrors)}\n >\n {showErrors ? 'Hide' : 'Show'} Error Details\n </Button>\n\n {showErrors && (\n <ul className={classes.errorList}>\n {failedResults.map((result, index) => (\n <li key={result.name || index} className={classes.errorItem}>\n <div className={classes.errorName}>\n {result.namespace}/{result.name}\n </div>\n <div className={classes.errorMessage}>\n {result.error || 'Unknown error'}\n </div>\n </li>\n ))}\n </ul>\n )}\n </Box>\n </DialogContent>\n <DialogActions>\n <Button onClick={onClose} color=\"primary\" variant=\"contained\">\n Close\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n\nexport const ApprovalQueueTable = () => {\n const classes = useStyles();\n const identityApi = useApi(identityApiRef);\n const alertApi = useApi(alertApiRef);\n const kuadrantApi = useApi(kuadrantApiRef);\n const [refresh, setRefresh] = useState(0);\n const [selectedRequests, setSelectedRequests] = useState<APIKey[]>([]);\n const [dialogState, setDialogState] = useState<{\n open: boolean;\n request: APIKey | null;\n action: \"approve\" | \"reject\";\n processing: boolean;\n }>({\n open: false,\n request: null,\n action: \"approve\",\n processing: false,\n });\n const [bulkDialogState, setBulkDialogState] = useState<{\n open: boolean;\n requests: APIKey[];\n action: \"approve\" | \"reject\";\n processing: boolean;\n }>({\n open: false,\n requests: [],\n action: \"approve\",\n processing: false,\n });\n const [bulkAlertDialogState, setBulkAlertDialogState] = useState<{\n open: boolean;\n results: BulkOperationResult[];\n isApprove: boolean;\n }>({\n open: false,\n results: [],\n isApprove: true,\n });\n const [filters, setFilters] = useState<FilterState>({\n status: [],\n apiProduct: [],\n tier: [],\n });\n\n const {\n allowed: canUpdateAllRequests,\n loading: updateAllPermissionLoading,\n error: updateAllPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyUpdateAllPermission);\n\n const {\n allowed: canUpdateOwnRequests,\n loading: updateOwnPermissionLoading,\n error: updateOwnPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyUpdateOwnPermission);\n\n const updatePermissionLoading =\n updateAllPermissionLoading || updateOwnPermissionLoading;\n const updatePermissionError =\n updateAllPermissionError || updateOwnPermissionError;\n\n const { value, loading, error } = useAsync(async () => {\n const identity = await identityApi.getBackstageIdentity();\n const reviewedBy = identity.userEntityRef;\n\n try {\n const [apiKeyRequests, apiProducts] = await Promise.all([\n kuadrantApi.getAllRequests(),\n kuadrantApi.getApiProducts(),\n ]);\n\n const allRequests = apiKeyRequests.items || [];\n const ownedApiProducts = new Set<string>();\n\n for (const product of apiProducts.items || []) {\n const owner = product.metadata?.annotations?.[\"backstage.io/owner\"];\n if (owner === reviewedBy) {\n ownedApiProducts.add(\n `${product.metadata.namespace}/${product.metadata.name}`,\n );\n }\n }\n\n return { allRequests, reviewedBy, ownedApiProducts };\n\n } catch(err) {\n const errorMessage = err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to get resources. ${errorMessage}`,\n display: \"transient\",\n severity: \"error\",\n });\n return {\n allRequests: [] as APIKey[],\n reviewedBy,\n ownedApiProducts: new Set<string>(),\n };\n }\n }, [kuadrantApi, identityApi, refresh]);\n\n const filterSections: FilterSection[] = useMemo(() => {\n if (!value?.allRequests) return [];\n\n const statusCounts = { Approved: 0, Pending: 0, Rejected: 0 };\n const apiProductCounts = new Map<string, number>();\n const tierCounts = new Map<string, number>();\n\n value.allRequests.forEach((r: APIKey) => {\n const status = r.status?.phase || \"Pending\";\n statusCounts[status as keyof typeof statusCounts]++;\n\n const apiProduct = r.spec.apiProductRef?.name || \"unknown\";\n apiProductCounts.set(\n apiProduct,\n (apiProductCounts.get(apiProduct) || 0) + 1,\n );\n\n const tier = r.spec.planTier || \"unknown\";\n tierCounts.set(tier, (tierCounts.get(tier) || 0) + 1);\n });\n\n return [\n {\n id: \"status\",\n title: \"Status\",\n options: [\n { value: \"Pending\", label: \"Pending\", count: statusCounts.Pending },\n {\n value: \"Approved\",\n label: \"Approved\",\n count: statusCounts.Approved,\n },\n {\n value: \"Rejected\",\n label: \"Rejected\",\n count: statusCounts.Rejected,\n },\n ],\n },\n {\n id: \"apiProduct\",\n title: \"API Product\",\n options: Array.from(apiProductCounts.entries()).map(\n ([name, count]) => ({\n value: name,\n label: name,\n count,\n }),\n ),\n collapsed: apiProductCounts.size > 5,\n },\n {\n id: \"tier\",\n title: \"Tier\",\n options: Array.from(tierCounts.entries()).map(([tier, count]) => ({\n value: tier,\n label: tier.charAt(0).toUpperCase() + tier.slice(1),\n count,\n })),\n },\n ];\n }, [value?.allRequests]);\n\n const filteredRequests = useMemo(() => {\n if (!value?.allRequests) return [];\n\n return value.allRequests.filter((r: APIKey) => {\n if (filters.status.length > 0) {\n const status = r.status?.phase || \"Pending\";\n if (!filters.status.includes(status)) return false;\n }\n if (filters.apiProduct.length > 0) {\n const apiProduct = r.spec.apiProductRef?.name || \"unknown\";\n if (!filters.apiProduct.includes(apiProduct)) return false;\n }\n if (filters.tier.length > 0) {\n const tier = r.spec.planTier || \"unknown\";\n if (!filters.tier.includes(tier)) return false;\n }\n return true;\n });\n }, [value?.allRequests, filters]);\n\n const handleApprove = (request: APIKey) => {\n setDialogState({\n open: true,\n request,\n action: \"approve\",\n processing: false,\n });\n };\n\n const handleReject = (request: APIKey) => {\n setDialogState({\n open: true,\n request,\n action: \"reject\",\n processing: false,\n });\n };\n\n const handleConfirm = async () => {\n if (!dialogState.request || !value) return;\n\n setDialogState((prev) => ({ ...prev, processing: true }));\n\n const apikeyRequestFn = dialogState.action === \"approve\"\n ? (ns: string, n: string, r: string) => kuadrantApi.approveRequest(ns, n, r)\n : (ns: string, n: string, r: string) => kuadrantApi.rejectRequest(ns, n, r)\n try {\n await apikeyRequestFn(dialogState.request.metadata.namespace, dialogState.request.metadata.name, value.reviewedBy);\n\n setDialogState({\n open: false,\n request: null,\n action: \"approve\",\n processing: false,\n });\n // remove the processed request from selection\n setSelectedRequests((prev) =>\n prev.filter(\n (r) =>\n r.metadata.name !== dialogState.request?.metadata.name ||\n r.metadata.namespace !== dialogState.request?.metadata.namespace,\n ),\n );\n setRefresh((r) => r + 1);\n const action = dialogState.action === \"approve\" ? \"approved\" : \"rejected\";\n alertApi.post({\n message: `API key ${action}`,\n severity: \"success\",\n display: \"transient\",\n });\n } catch (err) {\n console.error(`error ${dialogState.action}ing request:`, err);\n setDialogState((prev) => ({ ...prev, processing: false }));\n const errorMessage = err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to ${dialogState.action} API key. ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\n }\n };\n\n const handleBulkApprove = () => {\n if (selectedRequests.length === 0) return;\n setBulkDialogState({\n open: true,\n requests: selectedRequests,\n action: \"approve\",\n processing: false,\n });\n };\n\n const handleBulkReject = () => {\n if (selectedRequests.length === 0) return;\n setBulkDialogState({\n open: true,\n requests: selectedRequests,\n action: \"reject\",\n processing: false,\n });\n };\n\n const handleBulkConfirm = async () => {\n if (!value || bulkDialogState.requests.length === 0) return;\n\n setBulkDialogState((prev) => ({ ...prev, processing: true }));\n setBulkAlertDialogState({ open: false, results: [], isApprove: true, });\n\n const isApprove = bulkDialogState.action === \"approve\";\n const apiKeyRequestsFn = isApprove\n ? (req: { namespace: string, name: string }[], rb: string) => kuadrantApi.bulkApproveRequests(req, rb)\n : (req: { namespace: string, name: string }[], rb: string) => kuadrantApi.bulkRejectRequests(req, rb)\n\n try {\n const requests = bulkDialogState.requests.map((r) => ({\n namespace: r.metadata.namespace,\n name: r.metadata.name,\n }))\n const bulkResponse = await apiKeyRequestsFn(requests, value.reviewedBy) || [];\n\n const successfulItems = bulkResponse.filter((res: any) => res.success);\n const failedItems = bulkResponse.filter((res: any) => !res.success);\n const totalSuccess = failedItems.length === 0;\n\n const action = isApprove ? \"approved\" : \"rejected\";\n\n setBulkDialogState({\n open: false,\n requests: [],\n action: \"approve\",\n processing: false,\n });\n setBulkAlertDialogState({\n open: !totalSuccess,\n results: bulkResponse,\n isApprove,\n });\n setSelectedRequests([]);\n setRefresh((r) => r + 1);\n\n if (totalSuccess) {\n alertApi.post({\n message: `${successfulItems.length} API keys ${action}`,\n severity: \"success\",\n display: \"transient\",\n });\n }\n } catch (err) {\n console.error(`error bulk ${bulkDialogState.action}ing requests:`, err);\n setBulkDialogState((prev) => ({ ...prev, processing: false }));\n const errorMessage = err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to bulk ${bulkDialogState.action} API keys. ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\n }\n };\n\n const formatDate = (dateString: string) => {\n const date = new Date(dateString);\n return date.toLocaleDateString(\"en-GB\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n };\n\n const columns: TableColumn<APIKey>[] = [\n {\n title: \"Requester\",\n field: \"spec.requestedBy.userId\",\n render: (row) => (\n <Typography variant=\"body2\">{row.spec.requestedBy.userId}</Typography>\n ),\n },\n {\n title: \"API Product\",\n field: \"spec.apiProductRef.name\",\n render: (row) => {\n const name = row.spec.apiProductRef?.name || \"unknown\";\n return (\n <Link to={`/catalog/default/api/${name}`}>\n <strong>{name}</strong>\n </Link>\n );\n },\n },\n {\n title: \"Status\",\n field: \"status.phase\",\n render: (row) => {\n const phase = row.status?.phase || \"Pending\";\n return (\n <Chip label={phase} size=\"small\" style={getApprovalQueueStatusChipStyle(phase)} />\n );\n },\n },\n {\n title: \"Tier\",\n field: \"spec.planTier\",\n render: (row) => (\n <Chip label={row.spec.planTier} size=\"small\" variant=\"outlined\" />\n ),\n },\n {\n title: \"Requested\",\n field: \"metadata.creationTimestamp\",\n render: (row) => (\n <Typography variant=\"body2\">\n {row.metadata.creationTimestamp\n ? formatDate(row.metadata.creationTimestamp)\n : \"-\"}\n </Typography>\n ),\n },\n {\n title: \"Reviewed By\",\n field: \"status.reviewedBy\",\n render: (row) => {\n if (!row.status?.reviewedBy)\n return (\n <Typography variant=\"body2\" color=\"textSecondary\">\n -\n </Typography>\n );\n const reviewer = row.status.reviewedBy.replace(/^user:default\\//, \"\");\n const isAutomatic = reviewer === \"system\";\n return (\n <Box>\n <Typography variant=\"body2\">\n {isAutomatic ? \"Automatic\" : reviewer}\n </Typography>\n {row.status.reviewedAt && (\n <Typography variant=\"caption\" color=\"textSecondary\">\n {formatDate(row.status.reviewedAt)}\n </Typography>\n )}\n </Box>\n );\n },\n },\n {\n title: \"Actions\",\n filtering: false,\n render: (row) => {\n const phase = row.status?.phase || \"Pending\";\n if (phase !== \"Pending\") return null;\n\n const apiProductKey = `${row.metadata.namespace}/${row.spec.apiProductRef?.name || \"unknown\"}`;\n const ownsApiProduct =\n value?.ownedApiProducts?.has(apiProductKey) ?? false;\n const canUpdate =\n canUpdateAllRequests || (canUpdateOwnRequests && ownsApiProduct);\n if (!canUpdate) return null;\n\n return (\n <Box display=\"flex\" style={{ gap: 8 }}>\n <Button\n size=\"small\"\n startIcon={<CheckCircleIcon />}\n onClick={() => handleApprove(row)}\n color=\"primary\"\n variant=\"outlined\"\n >\n Approve\n </Button>\n <Button\n size=\"small\"\n startIcon={<CancelIcon />}\n onClick={() => handleReject(row)}\n color=\"secondary\"\n variant=\"outlined\"\n >\n Reject\n </Button>\n </Box>\n );\n },\n },\n ];\n\n const detailPanelConfig = useMemo(\n () => [\n {\n render: (data: any) => {\n const request = data.rowData as APIKey;\n if (!request?.metadata?.name) {\n return <Box />;\n }\n return <ExpandedRowContent request={request} />;\n },\n },\n ],\n [],\n );\n\n if (loading || updatePermissionLoading) {\n return (\n <Box p={2}>\n {[...Array(5)].map((_, i) => (\n <Box key={i} p={2}>\n <Skeleton variant=\"text\" width=\"100%\" />\n </Box>\n ))}\n </Box>\n );\n }\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n if (updatePermissionError) {\n return (\n <Box p={2}>\n <Typography color=\"error\">\n Unable to check permissions: {updatePermissionError.message}\n </Typography>\n </Box>\n );\n }\n\n const canSelectRows = canUpdateAllRequests || canUpdateOwnRequests;\n\n return (\n <>\n <Box className={classes.container}>\n <FilterPanel\n sections={filterSections}\n filters={filters}\n onChange={setFilters}\n />\n <Box className={classes.tableContainer}>\n {selectedRequests.length > 0 && (\n <Box className={classes.bulkActions}>\n <Typography variant=\"body2\">\n {selectedRequests.length} request\n {selectedRequests.length !== 1 ? \"s\" : \"\"} selected\n </Typography>\n <Box display=\"flex\" style={{ gap: 8 }}>\n <Button\n size=\"small\"\n variant=\"contained\"\n color=\"primary\"\n startIcon={<CheckCircleIcon />}\n onClick={handleBulkApprove}\n >\n Approve Selected\n </Button>\n <Button\n size=\"small\"\n variant=\"contained\"\n color=\"secondary\"\n startIcon={<CancelIcon />}\n onClick={handleBulkReject}\n >\n Reject Selected\n </Button>\n </Box>\n </Box>\n )}\n\n {filteredRequests.length === 0 ? (\n <Box p={4} textAlign=\"center\">\n <Typography variant=\"body1\" color=\"textSecondary\">\n {value?.allRequests?.length === 0\n ? \"No API keys found.\"\n : \"No API keys match the selected filters.\"}\n </Typography>\n </Box>\n ) : (\n <Table\n options={{\n selection: canSelectRows,\n showSelectAllCheckbox: filteredRequests.some(\n (r: APIKey) =>\n !r.status?.phase || r.status.phase === \"Pending\",\n ),\n selectionProps: (row: APIKey) => ({\n disabled:\n row.status?.phase !== \"Pending\" &&\n row.status?.phase !== undefined,\n }),\n paging: filteredRequests.length > 10,\n pageSize: 20,\n search: true,\n filtering: false,\n debounceInterval: 300,\n showTextRowsSelected: false,\n toolbar: true,\n emptyRowsWhenPaging: false,\n }}\n columns={columns}\n data={filteredRequests.map((item: APIKey) => {\n const isSelected = selectedRequests.some(\n (selected) =>\n selected.metadata.name === item.metadata.name &&\n selected.metadata.namespace === item.metadata.namespace,\n );\n return {\n ...item,\n id: item.metadata.name,\n tableData: { checked: isSelected },\n };\n })}\n onSelectionChange={(rows) => {\n // only allow selecting pending requests\n const pendingOnly = (rows as APIKey[]).filter(\n (r) => !r.status?.phase || r.status.phase === \"Pending\",\n );\n setSelectedRequests(pendingOnly);\n }}\n detailPanel={detailPanelConfig}\n />\n )}\n </Box>\n </Box>\n\n <ApprovalDialog\n open={dialogState.open}\n request={dialogState.request}\n action={dialogState.action}\n processing={dialogState.processing}\n onClose={() =>\n setDialogState({\n open: false,\n request: null,\n action: \"approve\",\n processing: false,\n })\n }\n onConfirm={handleConfirm}\n />\n <BulkActionDialog\n open={bulkDialogState.open}\n requests={bulkDialogState.requests}\n action={bulkDialogState.action}\n processing={bulkDialogState.processing}\n onClose={() =>\n setBulkDialogState({\n open: false,\n requests: [],\n action: \"approve\",\n processing: false,\n })\n }\n onConfirm={handleBulkConfirm}\n />\n <BulkAlertDialog\n open={bulkAlertDialogState.open}\n results={bulkAlertDialogState.results}\n isApprove={bulkAlertDialogState.isApprove}\n onClose={() =>\n setBulkAlertDialogState({\n open: false,\n results: [],\n isApprove: true,\n })\n }\n />\n </>\n );\n};\n","import React from 'react';\nimport {\n Header,\n Page,\n Content,\n SupportButton,\n} from '@backstage/core-components';\nimport { ApprovalQueueTable } from '../ApprovalQueueTable';\n\nexport const ApiKeyApprovalPage = () => {\n return (\n <Page themeId=\"tool\">\n <Header title=\"API Key Approval\" subtitle=\"Review and approve API key requests\">\n <SupportButton>Approve or reject API key access requests</SupportButton>\n </Header>\n <Content>\n <ApprovalQueueTable />\n </Content>\n </Page>\n );\n};\n","import { useApiHolder, configApiRef } from '@backstage/core-plugin-api';\nimport { coreComponentsTranslationRef } from '../translation.esm.js';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\nconst useDefaultSupportConfig = () => {\n const { t } = useTranslationRef(coreComponentsTranslationRef);\n return {\n url: \"https://github.com/backstage/backstage/issues\",\n items: [\n {\n title: t(\"supportConfig.default.title\"),\n icon: \"warning\",\n links: [\n {\n // TODO: Update to dedicated support page on backstage.io/docs\n title: t(\"supportConfig.default.linkTitle\"),\n url: \"https://github.com/backstage/backstage/blob/master/app-config.yaml\"\n }\n ]\n }\n ]\n };\n};\nfunction useSupportConfig() {\n const apiHolder = useApiHolder();\n const config = apiHolder.get(configApiRef);\n const supportConfig = config?.getOptionalConfig(\"app.support\");\n const defaultSupportConfig = useDefaultSupportConfig();\n if (!supportConfig) {\n return defaultSupportConfig;\n }\n return {\n url: supportConfig.getString(\"url\"),\n items: supportConfig.getConfigArray(\"items\").flatMap((itemConf) => ({\n title: itemConf.getString(\"title\"),\n icon: itemConf.getOptionalString(\"icon\"),\n links: (itemConf.getOptionalConfigArray(\"links\") ?? []).flatMap(\n (linkConf) => ({\n url: linkConf.getString(\"url\"),\n title: linkConf.getOptionalString(\"title\") ?? \"\"\n })\n )\n }))\n };\n}\n\nexport { useSupportConfig };\n//# sourceMappingURL=useSupportConfig.esm.js.map\n","import { jsx } from 'react/jsx-runtime';\nimport { useApp } from '@backstage/core-plugin-api';\nimport MuiBrokenImageIcon from '@material-ui/icons/BrokenImage';\n\nfunction AppIcon(props) {\n const { id: key, Fallback = MuiBrokenImageIcon, ...rest } = props;\n const app = useApp();\n const Icon = app.getSystemIcon(key) ?? Fallback;\n return /* @__PURE__ */ jsx(Icon, { ...rest });\n}\nfunction BrokenImageIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"brokenImage\", ...props });\n}\nfunction CatalogIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"catalog\", ...props });\n}\nfunction ChatIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"chat\", ...props });\n}\nfunction DashboardIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"dashboard\", ...props });\n}\nfunction DocsIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"docs\", ...props });\n}\nfunction EmailIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"email\", ...props });\n}\nfunction GitHubIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"github\", ...props });\n}\nfunction GroupIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"group\", ...props });\n}\nfunction HelpIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"help\", ...props });\n}\nfunction UserIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"user\", ...props });\n}\nfunction WarningIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"warning\", ...props });\n}\nfunction StarIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"star\", ...props });\n}\nfunction UnstarredIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"unstarred\", ...props });\n}\n\nexport { AppIcon, BrokenImageIcon, CatalogIcon, ChatIcon, DashboardIcon, DocsIcon, EmailIcon, GitHubIcon, GroupIcon, HelpIcon, StarIcon, UnstarredIcon, UserIcon, WarningIcon };\n//# sourceMappingURL=icons.esm.js.map\n","import { jsxs, Fragment, jsx } from 'react/jsx-runtime';\nimport { useApi, configApiRef, useApp } from '@backstage/core-plugin-api';\nimport Box from '@material-ui/core/Box';\nimport Button from '@material-ui/core/Button';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport IconButton from '@material-ui/core/IconButton';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport MenuList from '@material-ui/core/MenuList';\nimport Popover from '@material-ui/core/Popover';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\nimport { useState, Children } from 'react';\nimport 'lodash';\nimport 'qs';\nimport 'react-router-dom';\nimport '@react-hookz/web';\nimport { useSupportConfig } from '../../hooks/useSupportConfig.esm.js';\nimport { HelpIcon } from '../../icons/icons.esm.js';\nimport { Link } from '../Link/Link.esm.js';\nimport { coreComponentsTranslationRef } from '../../translation.esm.js';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\nconst useStyles = makeStyles(\n {\n popoverList: {\n minWidth: 260,\n maxWidth: 400\n },\n menuItem: {\n whiteSpace: \"normal\"\n }\n },\n { name: \"BackstageSupportButton\" }\n);\nconst SupportIcon = ({ icon }) => {\n const app = useApp();\n const Icon = icon ? app.getSystemIcon(icon) ?? HelpIcon : HelpIcon;\n return /* @__PURE__ */ jsx(Icon, {});\n};\nconst SupportLink = ({ link }) => /* @__PURE__ */ jsx(Link, { to: link.url, children: link.title ?? link.url });\nconst SupportListItem = ({ item }) => {\n return /* @__PURE__ */ jsxs(MenuItem, { button: false, children: [\n /* @__PURE__ */ jsx(ListItemIcon, { children: /* @__PURE__ */ jsx(SupportIcon, { icon: item.icon }) }),\n /* @__PURE__ */ jsx(\n ListItemText,\n {\n primary: item.title,\n secondary: item.links?.reduce(\n (prev, link, idx) => [\n ...prev,\n idx > 0 && /* @__PURE__ */ jsx(\"br\", {}, idx),\n /* @__PURE__ */ jsx(SupportLink, { link }, link.url)\n ],\n []\n )\n }\n )\n ] });\n};\nfunction SupportButton(props) {\n const { t } = useTranslationRef(coreComponentsTranslationRef);\n const { title, items, children } = props;\n const { items: configItems } = useSupportConfig();\n const [popoverOpen, setPopoverOpen] = useState(false);\n const [anchorEl, setAnchorEl] = useState(null);\n const classes = useStyles();\n const supportConfig = useApi(configApiRef).getOptionalConfig(\"app.support\");\n const isSmallScreen = useMediaQuery(\n (theme) => theme.breakpoints.down(\"sm\")\n );\n const onClickHandler = (event) => {\n setAnchorEl(event.currentTarget);\n setPopoverOpen(true);\n };\n const popoverCloseHandler = () => {\n setPopoverOpen(false);\n };\n if (!supportConfig) {\n return null;\n }\n return /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(Box, { display: \"flex\", ml: 1, children: isSmallScreen ? /* @__PURE__ */ jsx(\n IconButton,\n {\n color: \"primary\",\n size: \"small\",\n onClick: onClickHandler,\n \"data-testid\": \"support-button\",\n \"aria-label\": \"Support\",\n children: /* @__PURE__ */ jsx(HelpIcon, {})\n }\n ) : /* @__PURE__ */ jsx(\n Button,\n {\n \"data-testid\": \"support-button\",\n \"aria-label\": \"Support\",\n color: \"primary\",\n onClick: onClickHandler,\n startIcon: /* @__PURE__ */ jsx(HelpIcon, {}),\n children: t(\"supportButton.title\")\n }\n ) }),\n /* @__PURE__ */ jsxs(\n Popover,\n {\n \"data-testid\": \"support-button-popover\",\n open: popoverOpen,\n anchorEl,\n anchorOrigin: {\n vertical: \"bottom\",\n horizontal: \"right\"\n },\n transformOrigin: {\n vertical: \"top\",\n horizontal: \"right\"\n },\n onClose: popoverCloseHandler,\n children: [\n /* @__PURE__ */ jsxs(\n MenuList,\n {\n className: classes.popoverList,\n autoFocusItem: Boolean(anchorEl),\n children: [\n title && /* @__PURE__ */ jsx(\n MenuItem,\n {\n button: false,\n alignItems: \"flex-start\",\n className: classes.menuItem,\n children: /* @__PURE__ */ jsx(Typography, { variant: \"subtitle1\", children: title })\n }\n ),\n Children.map(children, (child, i) => /* @__PURE__ */ jsx(\n MenuItem,\n {\n button: false,\n alignItems: \"flex-start\",\n className: classes.menuItem,\n children: child\n },\n `child-${i}`\n )),\n (items ?? configItems).map((item, i) => /* @__PURE__ */ jsx(SupportListItem, { item }, `item-${i}`))\n ]\n }\n ),\n /* @__PURE__ */ jsx(DialogActions, { children: /* @__PURE__ */ jsx(\n Button,\n {\n color: \"primary\",\n onClick: popoverCloseHandler,\n \"aria-label\": \"Close\",\n children: t(\"supportButton.close\")\n }\n ) })\n ]\n }\n )\n ] });\n}\n\nexport { SupportButton };\n//# sourceMappingURL=SupportButton.esm.js.map\n"],"names":["useStyles","makeStyles","theme","root","width","minWidth","padding","spacing","borderRight","palette","divider","backgroundColor","background","paper","height","overflowY","sectionTitle","fontWeight","fontSize","textTransform","letterSpacing","color","text","secondary","marginBottom","display","alignItems","justifyContent","cursor","userSelect","filterSection","checkbox","checkboxLabel","clearButton","marginTop","count","marginLeft","FilterPanel","sections","filters","onChange","onClear","classes","collapsedSections","setCollapsedSections","React","Set","filter","s","collapsed","map","id","hasActiveFilters","Object","values","some","length","Box","className","mb","Typography","variant","Button","size","onClick","clearedFilters","forEach","section","Divider","isCollapsed","has","selectedCount","mt","toggleSection","sectionId","prev","next","delete","add","span","title","ExpandMoreIcon","ExpandLessIcon","Collapse","in","FormGroup","options","option","FormControlLabel","control","Checkbox","checked","includes","value","currentValues","newValues","v","handleCheckboxChange","label","undefined","_interopRequireDefault","_interopRequireWildcard","exports","_default","default","createElement","d","container","minHeight","tableContainer","flex","overflow","useCasePanel","useCaseLabel","bulkActions","borderBottom","ApprovalDialog","open","request","action","processing","onClose","onConfirm","confirmInput","setConfirmInput","actionLabel","processingLabel","isReject","confirmText","spec","requestedBy","userId","canConfirm","Dialog","maxWidth","fullWidth","DialogTitle","style","gap","CancelIcon","DialogContent","p","strong","apiProductRef","name","planTier","component","whiteSpace","useCase","gutterBottom","TextField","e","target","disabled","autoFocus","placeholder","DialogActions","startIcon","CircularProgress","BulkActionDialog","requests","isApprove","paragraph","maxHeight","bgcolor","metadata","namespace","ExpandedRowContent","stopPropagation","useBulkAlertStyles","successSection","success","main","borderRadius","shape","border","failureSection","error","warningSection","warning","statRow","errorList","listStyle","errorItem","errorName","errorMessage","fontFamily","wordBreak","expandButton","BulkAlertDialog","results","showErrors","setShowErrors","useState","successResults","res","failedResults","hasPartialSuccess","CheckCircleIcon","ul","result","index","li","div","ApprovalQueueTable","identityApi","useApi","identityApiRef","alertApi","alertApiRef","kuadrantApi","kuadrantApiRef","refresh","setRefresh","selectedRequests","setSelectedRequests","dialogState","setDialogState","bulkDialogState","setBulkDialogState","bulkAlertDialogState","setBulkAlertDialogState","setFilters","status","apiProduct","tier","allowed","canUpdateAllRequests","loading","updateAllPermissionLoading","updateAllPermissionError","useKuadrantPermission","kuadrantApiKeyUpdateAllPermission","canUpdateOwnRequests","updateOwnPermissionLoading","updateOwnPermissionError","kuadrantApiKeyUpdateOwnPermission","updatePermissionLoading","updatePermissionError","useAsync","async","reviewedBy","getBackstageIdentity","userEntityRef","apiKeyRequests","apiProducts","Promise","all","getAllRequests","getApiProducts","allRequests","items","ownedApiProducts","product","annotations","err","Error","message","post","severity","filterSections","useMemo","statusCounts","Approved","Pending","Rejected","apiProductCounts","Map","tierCounts","r","phase","set","get","Array","from","entries","charAt","toUpperCase","slice","filteredRequests","formatDate","dateString","Date","toLocaleDateString","year","month","day","columns","field","render","row","Link","to","Chip","getApprovalQueueStatusChipStyle","creationTimestamp","reviewer","replace","isAutomatic","reviewedAt","filtering","apiProductKey","ownsApiProduct","detailPanelConfig","data","rowData","_","i","Skeleton","ResponseErrorPanel","canSelectRows","textAlign","Table","selection","showSelectAllCheckbox","selectionProps","paging","pageSize","search","debounceInterval","showTextRowsSelected","toolbar","emptyRowsWhenPaging","item","isSelected","selected","tableData","onSelectionChange","rows","pendingOnly","detailPanel","apikeyRequestFn","ns","n","approveRequest","rejectRequest","console","apiKeyRequestsFn","req","rb","bulkApproveRequests","bulkRejectRequests","bulkResponse","successfulItems","totalSuccess","ApiKeyApprovalPage","Page","themeId","Header","subtitle","SupportButton","Content","useDefaultSupportConfig","t","url","icon","links","AppIcon","props","key","Fallback","rest","Icon","useApp","getSystemIcon","jsx","HelpIcon","popoverList","menuItem","SupportIcon","app","SupportLink","link","children","SupportListItem","jsxs","MenuItem","button","ListItemIcon","ListItemText","primary","reduce","idx","configItems","config","useApiHolder","configApiRef","supportConfig","getOptionalConfig","defaultSupportConfig","getString","getConfigArray","flatMap","itemConf","getOptionalString","getOptionalConfigArray","linkConf","useSupportConfig","popoverOpen","setPopoverOpen","anchorEl","setAnchorEl","isSmallScreen","useMediaQuery","breakpoints","down","onClickHandler","event","currentTarget","popoverCloseHandler","Fragment","ml","IconButton","Popover","anchorOrigin","vertical","horizontal","transformOrigin","MenuList","autoFocusItem","Boolean","Children","child"],"sourceRoot":""}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[4434],{4313:(e,n,t)=>{t.d(n,{A:()=>E});var o=t(39850),r=t(89575),i=t(95478),a=t(40484),l=t(11942),c=t(76446),s=t(41883),d=t(37260),u=t(19878),p=t(70020),f=t(26931),v=t(22702),h=t(64927),m={root:{zIndex:-1,position:"fixed",right:0,bottom:0,top:0,left:0,backgroundColor:"rgba(0, 0, 0, 0.5)",WebkitTapHighlightColor:"transparent"},invisible:{backgroundColor:"transparent"}};const g=i.forwardRef(function(e,n){var t=e.invisible,a=void 0!==t&&t,l=e.open,c=(0,o.A)(e,["invisible","open"]);return l?i.createElement("div",(0,r.A)({"aria-hidden":!0,ref:n},c,{style:(0,r.A)({},m.root,a?m.invisible:{},c.style)})):null});var b=new v.A;const E=i.forwardRef(function(e,n){var t=(0,l.useTheme)(),m=(0,l.getThemeProps)({name:"MuiModal",props:(0,r.A)({},e),theme:t}),E=m.BackdropComponent,A=void 0===E?g:E,y=m.BackdropProps,x=m.children,k=m.closeAfterTransition,w=void 0!==k&&k,C=m.container,R=m.disableAutoFocus,T=void 0!==R&&R,S=m.disableBackdropClick,P=void 0!==S&&S,W=m.disableEnforceFocus,N=void 0!==W&&W,B=m.disableEscapeKeyDown,D=void 0!==B&&B,M=m.disablePortal,I=void 0!==M&&M,O=m.disableRestoreFocus,F=void 0!==O&&O,z=m.disableScrollLock,L=void 0!==z&&z,H=m.hideBackdrop,K=void 0!==H&&H,Y=m.keepMounted,$=void 0!==Y&&Y,j=m.manager,_=void 0===j?b:j,X=m.onBackdropClick,q=m.onClose,U=m.onEscapeKeyDown,G=m.onRendered,J=m.open,Q=(0,o.A)(m,["BackdropComponent","BackdropProps","children","closeAfterTransition","container","disableAutoFocus","disableBackdropClick","disableEnforceFocus","disableEscapeKeyDown","disablePortal","disableRestoreFocus","disableScrollLock","hideBackdrop","keepMounted","manager","onBackdropClick","onClose","onEscapeKeyDown","onRendered","open"]),V=i.useState(!0),Z=V[0],ee=V[1],ne=i.useRef({}),te=i.useRef(null),oe=i.useRef(null),re=(0,u.A)(oe,n),ie=function(e){return!!e.children&&e.children.props.hasOwnProperty("in")}(m),ae=function(){return(0,c.A)(te.current)},le=function(){return ne.current.modalRef=oe.current,ne.current.mountNode=te.current,ne.current},ce=function(){_.mount(le(),{disableScrollLock:L}),oe.current.scrollTop=0},se=(0,p.A)(function(){var e=function(e){return e="function"==typeof e?e():e,a.findDOMNode(e)}(C)||ae().body;_.add(le(),e),oe.current&&ce()}),de=i.useCallback(function(){return _.isTopModal(le())},[_]),ue=(0,p.A)(function(e){te.current=e,e&&(G&&G(),J&&de()?ce():(0,v.M)(oe.current,!0))}),pe=i.useCallback(function(){_.remove(le())},[_]);if(i.useEffect(function(){return function(){pe()}},[pe]),i.useEffect(function(){J?se():ie&&w||pe()},[J,pe,ie,w,se]),!$&&!J&&(!ie||Z))return null;var fe=function(e){return{root:{position:"fixed",zIndex:e.zIndex.modal,right:0,bottom:0,top:0,left:0},hidden:{visibility:"hidden"}}}(t||{zIndex:f.A}),ve={};return void 0===x.props.tabIndex&&(ve.tabIndex=x.props.tabIndex||"-1"),ie&&(ve.onEnter=(0,d.A)(function(){ee(!1)},x.props.onEnter),ve.onExited=(0,d.A)(function(){ee(!0),w&&pe()},x.props.onExited)),i.createElement(s.A,{ref:ue,container:C,disablePortal:I},i.createElement("div",(0,r.A)({ref:re,onKeyDown:function(e){"Escape"===e.key&&de()&&(U&&U(e),D||(e.stopPropagation(),q&&q(e,"escapeKeyDown")))},role:"presentation"},Q,{style:(0,r.A)({},fe.root,!J&&Z?fe.hidden:{},Q.style)}),K?null:i.createElement(A,(0,r.A)({open:J,onClick:function(e){e.target===e.currentTarget&&(X&&X(e),!P&&q&&q(e,"backdropClick"))}},y)),i.createElement(h.A,{disableEnforceFocus:N,disableAutoFocus:T,disableRestoreFocus:F,getDoc:ae,isEnabled:de,open:J},i.cloneElement(x,ve))))})},18171:(e,n,t)=>{t.d(n,{A:()=>v});var o=t(89575),r=t(90689),i=t(39850),a=t(95478),l=t(79392),c=t(43457),s=t(54917),d=t(41188),u=t(19878),p={entering:{opacity:1},entered:{opacity:1}},f={enter:c.p0.enteringScreen,exit:c.p0.leavingScreen};const v=a.forwardRef(function(e,n){var t=e.children,c=e.disableStrictModeCompat,v=void 0!==c&&c,h=e.in,m=e.onEnter,g=e.onEntered,b=e.onEntering,E=e.onExit,A=e.onExited,y=e.onExiting,x=e.style,k=e.TransitionComponent,w=void 0===k?l.Ay:k,C=e.timeout,R=void 0===C?f:C,T=(0,i.A)(e,["children","disableStrictModeCompat","in","onEnter","onEntered","onEntering","onExit","onExited","onExiting","style","TransitionComponent","timeout"]),S=(0,s.A)(),P=S.unstable_strictMode&&!v,W=a.useRef(null),N=(0,u.A)(t.ref,n),B=(0,u.A)(P?W:void 0,N),D=function(e){return function(n,t){if(e){var o=P?[W.current,n]:[n,t],i=(0,r.A)(o,2),a=i[0],l=i[1];void 0===l?e(a):e(a,l)}}},M=D(b),I=D(function(e,n){(0,d.q)(e);var t=(0,d.c)({style:x,timeout:R},{mode:"enter"});e.style.webkitTransition=S.transitions.create("opacity",t),e.style.transition=S.transitions.create("opacity",t),m&&m(e,n)}),O=D(g),F=D(y),z=D(function(e){var n=(0,d.c)({style:x,timeout:R},{mode:"exit"});e.style.webkitTransition=S.transitions.create("opacity",n),e.style.transition=S.transitions.create("opacity",n),E&&E(e)}),L=D(A);return a.createElement(w,(0,o.A)({appear:!0,in:h,nodeRef:P?W:void 0,onEnter:I,onEntered:O,onEntering:M,onExit:z,onExited:L,onExiting:F,timeout:R},T),function(e,n){return a.cloneElement(t,(0,o.A)({style:(0,o.A)({opacity:0,visibility:"exited"!==e||h?void 0:"hidden"},p[e],x,t.props.style),ref:B},n))})})},18977:(e,n,t)=>{function o(){var e=document.createElement("div");e.style.width="99px",e.style.height="99px",e.style.position="absolute",e.style.top="-9999px",e.style.overflow="scroll",document.body.appendChild(e);var n=e.offsetWidth-e.clientWidth;return document.body.removeChild(e),n}t.d(n,{A:()=>o})},22702:(e,n,t)=>{t.d(n,{A:()=>f,M:()=>s});var o=t(55152),r=t(30414),i=t(83705),a=t(18977),l=t(76446),c=t(82431);function s(e,n){n?e.setAttribute("aria-hidden","true"):e.removeAttribute("aria-hidden")}function d(e){return parseInt(window.getComputedStyle(e)["padding-right"],10)||0}function u(e,n,t){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],r=arguments.length>4?arguments[4]:void 0,a=[n,t].concat((0,i.A)(o)),l=["TEMPLATE","SCRIPT","STYLE"];[].forEach.call(e.children,function(e){1===e.nodeType&&-1===a.indexOf(e)&&-1===l.indexOf(e.tagName)&&s(e,r)})}function p(e,n){var t=-1;return e.some(function(e,o){return!!n(e)&&(t=o,!0)}),t}var f=function(){function e(){(0,o.A)(this,e),this.modals=[],this.containers=[]}return(0,r.A)(e,[{key:"add",value:function(e,n){var t=this.modals.indexOf(e);if(-1!==t)return t;t=this.modals.length,this.modals.push(e),e.modalRef&&s(e.modalRef,!1);var o=function(e){var n=[];return[].forEach.call(e.children,function(e){e.getAttribute&&"true"===e.getAttribute("aria-hidden")&&n.push(e)}),n}(n);u(n,e.mountNode,e.modalRef,o,!0);var r=p(this.containers,function(e){return e.container===n});return-1!==r?(this.containers[r].modals.push(e),t):(this.containers.push({modals:[e],container:n,restore:null,hiddenSiblingNodes:o}),t)}},{key:"mount",value:function(e,n){var t=p(this.containers,function(n){return-1!==n.modals.indexOf(e)}),o=this.containers[t];o.restore||(o.restore=function(e,n){var t,o=[],r=[],i=e.container;if(!n.disableScrollLock){if(function(e){var n=(0,l.A)(e);return n.body===e?(0,c.A)(n).innerWidth>n.documentElement.clientWidth:e.scrollHeight>e.clientHeight}(i)){var s=(0,a.A)();o.push({value:i.style.paddingRight,key:"padding-right",el:i}),i.style["padding-right"]="".concat(d(i)+s,"px"),t=(0,l.A)(i).querySelectorAll(".mui-fixed"),[].forEach.call(t,function(e){r.push(e.style.paddingRight),e.style.paddingRight="".concat(d(e)+s,"px")})}var u=i.parentElement,p="HTML"===u.nodeName&&"scroll"===window.getComputedStyle(u)["overflow-y"]?u:i;o.push({value:p.style.overflow,key:"overflow",el:p}),p.style.overflow="hidden"}return function(){t&&[].forEach.call(t,function(e,n){r[n]?e.style.paddingRight=r[n]:e.style.removeProperty("padding-right")}),o.forEach(function(e){var n=e.value,t=e.el,o=e.key;n?t.style.setProperty(o,n):t.style.removeProperty(o)})}}(o,n))}},{key:"remove",value:function(e){var n=this.modals.indexOf(e);if(-1===n)return n;var t=p(this.containers,function(n){return-1!==n.modals.indexOf(e)}),o=this.containers[t];if(o.modals.splice(o.modals.indexOf(e),1),this.modals.splice(n,1),0===o.modals.length)o.restore&&o.restore(),e.modalRef&&s(e.modalRef,!0),u(o.container,e.mountNode,e.modalRef,o.hiddenSiblingNodes,!1),this.containers.splice(t,1);else{var r=o.modals[o.modals.length-1];r.modalRef&&s(r.modalRef,!1)}return n}},{key:"isTopModal",value:function(e){return this.modals.length>0&&this.modals[this.modals.length-1]===e}}]),e}()},46805:(e,n,t)=>{t.d(n,{A:()=>s});var o=t(89575),r=t(39850),i=t(95478),a=t(36274),l=t(7031),c=i.forwardRef(function(e,n){var t=e.classes,l=e.className,c=e.dividers,s=void 0!==c&&c,d=(0,r.A)(e,["classes","className","dividers"]);return i.createElement("div",(0,o.A)({className:(0,a.A)(t.root,l,s&&t.dividers),ref:n},d))});const s=(0,l.A)(function(e){return{root:{flex:"1 1 auto",WebkitOverflowScrolling:"touch",overflowY:"auto",padding:"8px 24px","&:first-child":{paddingTop:20}},dividers:{padding:"16px 24px",borderTop:"1px solid ".concat(e.palette.divider),borderBottom:"1px solid ".concat(e.palette.divider)}}},{name:"MuiDialogContent"})(c)},55197:(e,n,t)=>{t.d(n,{Ay:()=>y});var o=t(89575),r=t(39850),i=t(95478),a=t(40484),l=t(2589),c=t(36274),s=t(76446),d=t(82431),u=t(37260),p=t(7031),f=t(4313),v=t(33145),h=t(4321);function m(e,n){var t=0;return"number"==typeof n?t=n:"center"===n?t=e.height/2:"bottom"===n&&(t=e.height),t}function g(e,n){var t=0;return"number"==typeof n?t=n:"center"===n?t=e.width/2:"right"===n&&(t=e.width),t}function b(e){return[e.horizontal,e.vertical].map(function(e){return"number"==typeof e?"".concat(e,"px"):e}).join(" ")}function E(e){return"function"==typeof e?e():e}var A=i.forwardRef(function(e,n){var t=e.action,p=e.anchorEl,A=e.anchorOrigin,y=void 0===A?{vertical:"top",horizontal:"left"}:A,x=e.anchorPosition,k=e.anchorReference,w=void 0===k?"anchorEl":k,C=e.children,R=e.classes,T=e.className,S=e.container,P=e.elevation,W=void 0===P?8:P,N=e.getContentAnchorEl,B=e.marginThreshold,D=void 0===B?16:B,M=e.onEnter,I=e.onEntered,O=e.onEntering,F=e.onExit,z=e.onExited,L=e.onExiting,H=e.open,K=e.PaperProps,Y=void 0===K?{}:K,$=e.transformOrigin,j=void 0===$?{vertical:"top",horizontal:"left"}:$,_=e.TransitionComponent,X=void 0===_?v.A:_,q=e.transitionDuration,U=void 0===q?"auto":q,G=e.TransitionProps,J=void 0===G?{}:G,Q=(0,r.A)(e,["action","anchorEl","anchorOrigin","anchorPosition","anchorReference","children","classes","className","container","elevation","getContentAnchorEl","marginThreshold","onEnter","onEntered","onEntering","onExit","onExited","onExiting","open","PaperProps","transformOrigin","TransitionComponent","transitionDuration","TransitionProps"]),V=i.useRef(),Z=i.useCallback(function(e){if("anchorPosition"===w)return x;var n=E(p),t=(n&&1===n.nodeType?n:(0,s.A)(V.current).body).getBoundingClientRect(),o=0===e?y.vertical:"center";return{top:t.top+m(t,o),left:t.left+g(t,y.horizontal)}},[p,y.horizontal,y.vertical,x,w]),ee=i.useCallback(function(e){var n=0;if(N&&"anchorEl"===w){var t=N(e);if(t&&e.contains(t)){var o=function(e,n){for(var t=n,o=0;t&&t!==e;)o+=(t=t.parentElement).scrollTop;return o}(e,t);n=t.offsetTop+t.clientHeight/2-o||0}}return n},[y.vertical,w,N]),ne=i.useCallback(function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return{vertical:m(e,j.vertical)+n,horizontal:g(e,j.horizontal)}},[j.horizontal,j.vertical]),te=i.useCallback(function(e){var n=ee(e),t={width:e.offsetWidth,height:e.offsetHeight},o=ne(t,n);if("none"===w)return{top:null,left:null,transformOrigin:b(o)};var r=Z(n),i=r.top-o.vertical,a=r.left-o.horizontal,l=i+t.height,c=a+t.width,s=(0,d.A)(E(p)),u=s.innerHeight-D,f=s.innerWidth-D;if(i<D){var v=i-D;i-=v,o.vertical+=v}else if(l>u){var h=l-u;i-=h,o.vertical+=h}if(a<D){var m=a-D;a-=m,o.horizontal+=m}else if(c>f){var g=c-f;a-=g,o.horizontal+=g}return{top:"".concat(Math.round(i),"px"),left:"".concat(Math.round(a),"px"),transformOrigin:b(o)}},[p,w,Z,ee,ne,D]),oe=i.useCallback(function(){var e=V.current;if(e){var n=te(e);null!==n.top&&(e.style.top=n.top),null!==n.left&&(e.style.left=n.left),e.style.transformOrigin=n.transformOrigin}},[te]),re=i.useCallback(function(e){V.current=a.findDOMNode(e)},[]);i.useEffect(function(){H&&oe()}),i.useImperativeHandle(t,function(){return H?{updatePosition:function(){oe()}}:null},[H,oe]),i.useEffect(function(){if(H){var e=(0,l.A)(function(){oe()});return window.addEventListener("resize",e),function(){e.clear(),window.removeEventListener("resize",e)}}},[H,oe]);var ie=U;"auto"!==U||X.muiSupportAuto||(ie=void 0);var ae=S||(p?(0,s.A)(E(p)).body:void 0);return i.createElement(f.A,(0,o.A)({container:ae,open:H,ref:n,BackdropProps:{invisible:!0},className:(0,c.A)(R.root,T)},Q),i.createElement(X,(0,o.A)({appear:!0,in:H,onEnter:M,onEntered:I,onExit:F,onExited:z,onExiting:L,timeout:ie},J,{onEntering:(0,u.A)(function(e,n){O&&O(e,n),oe()},J.onEntering)}),i.createElement(h.A,(0,o.A)({elevation:W,ref:re},Y,{className:(0,c.A)(R.paper,Y.className)}),C)))});const y=(0,p.A)({root:{},paper:{position:"absolute",overflowY:"auto",overflowX:"hidden",minWidth:16,minHeight:16,maxWidth:"calc(100% - 32px)",maxHeight:"calc(100% - 32px)",outline:0}},{name:"MuiPopover"})(A)},57384:(e,n,t)=>{function o(e){var n,t,r="";if("string"==typeof e||"number"==typeof e)r+=e;else if("object"==typeof e)if(Array.isArray(e))for(n=0;n<e.length;n++)e[n]&&(t=o(e[n]))&&(r&&(r+=" "),r+=t);else for(n in e)e[n]&&(r&&(r+=" "),r+=n);return r}t.d(n,{A:()=>r});const r=function(){for(var e,n,t=0,r="";t<arguments.length;)(e=arguments[t++])&&(n=o(e))&&(r&&(r+=" "),r+=n);return r}},61477:(e,n,t)=>{t.d(n,{A:()=>d});var o=t(89575),r=t(39850),i=t(95478),a=t(36274),l=t(7031),c=t(72501),s=i.forwardRef(function(e,n){var t=e.children,l=e.classes,s=e.className,d=e.disableTypography,u=void 0!==d&&d,p=(0,r.A)(e,["children","classes","className","disableTypography"]);return i.createElement("div",(0,o.A)({className:(0,a.A)(l.root,s),ref:n},p),u?t:i.createElement(c.A,{component:"h2",variant:"h6"},t))});const d=(0,l.A)({root:{margin:0,padding:"16px 24px",flex:"0 0 auto"}},{name:"MuiDialogTitle"})(s)},64163:(e,n,t)=>{t.d(n,{A:()=>d});var o=t(89575),r=t(39850),i=t(95478),a=t(36274),l=t(7031),c=t(18171),s=i.forwardRef(function(e,n){var t=e.children,l=e.classes,s=e.className,d=e.invisible,u=void 0!==d&&d,p=e.open,f=e.transitionDuration,v=e.TransitionComponent,h=void 0===v?c.A:v,m=(0,r.A)(e,["children","classes","className","invisible","open","transitionDuration","TransitionComponent"]);return i.createElement(h,(0,o.A)({in:p,timeout:f},m),i.createElement("div",{className:(0,a.A)(l.root,s,u&&l.invisible),"aria-hidden":!0,ref:n},t))});const d=(0,l.A)({root:{zIndex:-1,position:"fixed",display:"flex",alignItems:"center",justifyContent:"center",right:0,bottom:0,top:0,left:0,backgroundColor:"rgba(0, 0, 0, 0.5)",WebkitTapHighlightColor:"transparent"},invisible:{backgroundColor:"transparent"}},{name:"MuiBackdrop"})(s)},64927:(e,n,t)=>{t.d(n,{A:()=>l});var o=t(95478),r=t(40484),i=t(76446),a=t(19878);const l=function(e){var n=e.children,t=e.disableAutoFocus,l=void 0!==t&&t,c=e.disableEnforceFocus,s=void 0!==c&&c,d=e.disableRestoreFocus,u=void 0!==d&&d,p=e.getDoc,f=e.isEnabled,v=e.open,h=o.useRef(),m=o.useRef(null),g=o.useRef(null),b=o.useRef(),E=o.useRef(null),A=o.useCallback(function(e){E.current=r.findDOMNode(e)},[]),y=(0,a.A)(n.ref,A),x=o.useRef();return o.useEffect(function(){x.current=v},[v]),!x.current&&v&&"undefined"!=typeof window&&(b.current=p().activeElement),o.useEffect(function(){if(v){var e=(0,i.A)(E.current);l||!E.current||E.current.contains(e.activeElement)||(E.current.hasAttribute("tabIndex")||E.current.setAttribute("tabIndex",-1),E.current.focus());var n=function(){null!==E.current&&(e.hasFocus()&&!s&&f()&&!h.current?E.current&&!E.current.contains(e.activeElement)&&E.current.focus():h.current=!1)},t=function(n){!s&&f()&&9===n.keyCode&&e.activeElement===E.current&&(h.current=!0,n.shiftKey?g.current.focus():m.current.focus())};e.addEventListener("focus",n,!0),e.addEventListener("keydown",t,!0);var o=setInterval(function(){n()},50);return function(){clearInterval(o),e.removeEventListener("focus",n,!0),e.removeEventListener("keydown",t,!0),u||(b.current&&b.current.focus&&b.current.focus(),b.current=null)}}},[l,s,u,f,v]),o.createElement(o.Fragment,null,o.createElement("div",{tabIndex:0,ref:m,"data-test":"sentinelStart"}),o.cloneElement(n,{ref:y}),o.createElement("div",{tabIndex:0,ref:g,"data-test":"sentinelEnd"}))}},76891:(e,n,t)=>{t.d(n,{A:()=>g});var o=t(89575),r=t(39850),i=t(24586),a=t(95478),l=t(36274),c=t(7031),s=t(11192),d=t(4313),u=t(64163),p=t(18171),f=t(43457),v=t(4321),h={enter:f.p0.enteringScreen,exit:f.p0.leavingScreen},m=a.forwardRef(function(e,n){var t=e.BackdropProps,i=e.children,c=e.classes,f=e.className,m=e.disableBackdropClick,g=void 0!==m&&m,b=e.disableEscapeKeyDown,E=void 0!==b&&b,A=e.fullScreen,y=void 0!==A&&A,x=e.fullWidth,k=void 0!==x&&x,w=e.maxWidth,C=void 0===w?"sm":w,R=e.onBackdropClick,T=e.onClose,S=e.onEnter,P=e.onEntered,W=e.onEntering,N=e.onEscapeKeyDown,B=e.onExit,D=e.onExited,M=e.onExiting,I=e.open,O=e.PaperComponent,F=void 0===O?v.A:O,z=e.PaperProps,L=void 0===z?{}:z,H=e.scroll,K=void 0===H?"paper":H,Y=e.TransitionComponent,$=void 0===Y?p.A:Y,j=e.transitionDuration,_=void 0===j?h:j,X=e.TransitionProps,q=e["aria-describedby"],U=e["aria-labelledby"],G=(0,r.A)(e,["BackdropProps","children","classes","className","disableBackdropClick","disableEscapeKeyDown","fullScreen","fullWidth","maxWidth","onBackdropClick","onClose","onEnter","onEntered","onEntering","onEscapeKeyDown","onExit","onExited","onExiting","open","PaperComponent","PaperProps","scroll","TransitionComponent","transitionDuration","TransitionProps","aria-describedby","aria-labelledby"]),J=a.useRef();return a.createElement(d.A,(0,o.A)({className:(0,l.A)(c.root,f),BackdropComponent:u.A,BackdropProps:(0,o.A)({transitionDuration:_},t),closeAfterTransition:!0},g?{disableBackdropClick:g}:{},{disableEscapeKeyDown:E,onEscapeKeyDown:N,onClose:T,open:I,ref:n},G),a.createElement($,(0,o.A)({appear:!0,in:I,timeout:_,onEnter:S,onEntering:W,onEntered:P,onExit:B,onExiting:M,onExited:D,role:"none presentation"},X),a.createElement("div",{className:(0,l.A)(c.container,c["scroll".concat((0,s.A)(K))]),onMouseUp:function(e){e.target===e.currentTarget&&e.target===J.current&&(J.current=null,R&&R(e),!g&&T&&T(e,"backdropClick"))},onMouseDown:function(e){J.current=e.target}},a.createElement(F,(0,o.A)({elevation:24,role:"dialog","aria-describedby":q,"aria-labelledby":U},L,{className:(0,l.A)(c.paper,c["paperScroll".concat((0,s.A)(K))],c["paperWidth".concat((0,s.A)(String(C)))],L.className,y&&c.paperFullScreen,k&&c.paperFullWidth)}),i))))});const g=(0,c.A)(function(e){return{root:{"@media print":{position:"absolute !important"}},scrollPaper:{display:"flex",justifyContent:"center",alignItems:"center"},scrollBody:{overflowY:"auto",overflowX:"hidden",textAlign:"center","&:after":{content:'""',display:"inline-block",verticalAlign:"middle",height:"100%",width:"0"}},container:{height:"100%","@media print":{height:"auto"},outline:0},paper:{margin:32,position:"relative",overflowY:"auto","@media print":{overflowY:"visible",boxShadow:"none"}},paperScrollPaper:{display:"flex",flexDirection:"column",maxHeight:"calc(100% - 64px)"},paperScrollBody:{display:"inline-block",verticalAlign:"middle",textAlign:"left"},paperWidthFalse:{maxWidth:"calc(100% - 64px)"},paperWidthXs:{maxWidth:Math.max(e.breakpoints.values.xs,444),"&$paperScrollBody":(0,i.A)({},e.breakpoints.down(Math.max(e.breakpoints.values.xs,444)+64),{maxWidth:"calc(100% - 64px)"})},paperWidthSm:{maxWidth:e.breakpoints.values.sm,"&$paperScrollBody":(0,i.A)({},e.breakpoints.down(e.breakpoints.values.sm+64),{maxWidth:"calc(100% - 64px)"})},paperWidthMd:{maxWidth:e.breakpoints.values.md,"&$paperScrollBody":(0,i.A)({},e.breakpoints.down(e.breakpoints.values.md+64),{maxWidth:"calc(100% - 64px)"})},paperWidthLg:{maxWidth:e.breakpoints.values.lg,"&$paperScrollBody":(0,i.A)({},e.breakpoints.down(e.breakpoints.values.lg+64),{maxWidth:"calc(100% - 64px)"})},paperWidthXl:{maxWidth:e.breakpoints.values.xl,"&$paperScrollBody":(0,i.A)({},e.breakpoints.down(e.breakpoints.values.xl+64),{maxWidth:"calc(100% - 64px)"})},paperFullWidth:{width:"calc(100% - 64px)"},paperFullScreen:{margin:0,width:"100%",maxWidth:"100%",height:"100%",maxHeight:"none",borderRadius:0,"&$paperScrollBody":{margin:0,maxWidth:"100%"}}}},{name:"MuiDialog"})(m)},93453:(e,n,t)=>{t.d(n,{A:()=>s});var o=t(89575),r=t(39850),i=t(95478),a=t(36274),l=t(7031),c=i.forwardRef(function(e,n){var t=e.disableSpacing,l=void 0!==t&&t,c=e.classes,s=e.className,d=(0,r.A)(e,["disableSpacing","classes","className"]);return i.createElement("div",(0,o.A)({className:(0,a.A)(c.root,s,!l&&c.spacing),ref:n},d))});const s=(0,l.A)({root:{display:"flex",alignItems:"center",padding:8,justifyContent:"flex-end",flex:"0 0 auto"},spacing:{"& > :not(:first-child)":{marginLeft:8}}},{name:"MuiDialogActions"})(c)}}]);
|
|
2
|
-
//# sourceMappingURL=4434.f92f6ba4.chunk.js.map
|