@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([[879,6921],{19833:(e,t,a)=>{a.d(t,{m:()=>r});var n=a(31085),i=(a(95478),a(23015));const r=e=>(0,n.jsxs)(i.A,{...e,viewBox:"0 0 1024 1024",sx:{transform:"scale(0.85)",marginLeft:"4px",...e.sx},children:[(0,n.jsx)("path",{d:"M809,1C993.59,183.56 1065.7,449.65 998.12,699.05C964.778,821.823 899.519,933.607 809,1023L292.27,512L809,1Z",fill:"currentColor"}),(0,n.jsx)("rect",{x:"1",y:"1",width:"218",height:"1022",fill:"currentColor"})]})},34541:(e,t,a)=>{a.d(t,{G:()=>x});var n=a(31085),i=(a(95478),a(25467)),r=a(22097),o=a(42367),s=a(86687),d=a(96040),l=a(72501),c=a(10394),p=a(58837),u=a(91638),A=a(46205),m=a(34955),y=a(89509),P=a(71255),h=a(70980);const v=(0,p.A)(e=>({label:{fontWeight:600,color:e.palette.text.secondary,marginBottom:e.spacing(.5),fontSize:"0.75rem",textTransform:"uppercase"}})),x=()=>{var e,t,a,p,x,g,f,K,j,b;const k=v(),{entity:w}=(0,i.tN)(),I=(0,r.useApi)(h.s),E=(0,r.useApi)(r.identityApiRef),{allowed:C,loading:S}=(0,A.l)(m.Al),R=null===(e=w.metadata.annotations)||void 0===e?void 0:e["kuadrant.io/namespace"],z=null===(t=w.metadata.annotations)||void 0===t?void 0:t["kuadrant.io/apiproduct"],{value:D}=(0,u.A)(async()=>(await E.getBackstageIdentity()).userEntityRef.split("/")[1]||"guest",[E]),{value:M,loading:O,error:T}=(0,u.A)(async()=>R&&z?I.getApiProduct(R,z):null,[I,R,z]),L=null==M||null===(p=M.metadata)||void 0===p||null===(a=p.annotations)||void 0===a?void 0:a["backstage.io/owner"],$=null==L?void 0:L.split("/")[1],_=C||D&&$===D;if(!R||!z)return(0,n.jsx)(d.n,{title:"API Product Information",children:(0,n.jsx)(l.A,{children:"No APIProduct linked to this API entity"})});if(O||S)return(0,n.jsx)(d.n,{title:"API Product Information",children:(0,n.jsx)(s.k,{})});if(M&&!_)return(0,n.jsx)(d.n,{title:"API Product Information",children:(0,n.jsx)(c.A,{p:2,children:(0,n.jsx)(l.A,{variant:"body2",color:"textSecondary",children:"You don't have permission to view this API product's details. Only the API owner or users with admin permissions can view this information."})})});if(T&&T.message.includes("you can only read your own"))return(0,n.jsx)(d.n,{title:"API Product Information",children:(0,n.jsx)(c.A,{p:2,children:(0,n.jsx)(l.A,{variant:"body2",color:"textSecondary",children:"You don't have permission to view this API product's details. Only the API owner or users with admin permissions can view this information."})})});if(T)return(0,n.jsx)(d.n,{title:"API Product Information",children:(0,n.jsx)(o._,{error:T})});if(!M)return(0,n.jsx)(d.n,{title:"API Product Information",children:(0,n.jsx)(l.A,{children:"APIProduct not found"})});const B=(null===(g=M.status)||void 0===g||null===(x=g.discoveredAuthScheme)||void 0===x?void 0:x.authentication)||{},F=Object.values(B).find(e=>e.hasOwnProperty("jwt")),N=Boolean(F),U=null==F||null===(f=F.jwt)||void 0===f?void 0:f.issuerUrl,q=null===(j=M.status)||void 0===j||null===(K=j.oidcDiscovery)||void 0===K?void 0:K.tokenEndpoint;return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(d.n,{title:"API Product Details",children:[(0,n.jsxs)(c.A,{mb:2,children:[(0,n.jsx)(l.A,{variant:"caption",className:k.label,children:"Product Name"}),(0,n.jsx)(l.A,{variant:"h6",children:(null===(b=M.spec)||void 0===b?void 0:b.displayName)||z})]}),(0,n.jsx)(y.O,{product:M,showStatus:!1,showCatalogLink:!1})]}),N&&U&&(0,n.jsx)(c.A,{mt:2,children:(0,n.jsx)(P.n,{issuerUrl:U,tokenEndpoint:q})})]})}},57349:(e,t,a)=>{a.d(t,{z:()=>S});var n=a(31085),i=a(95478),r=a(35015),o=a(42367),s=a(96040),d=a(10394),l=a(72501),c=a(67720),p=a(71677),u=a(29365),A=a(64947),m=a(76891),y=a(61477),P=a(46805),h=a(93453),v=a(4387),x=a(18466),g=a(32269),f=a(61524),K=a(99594),j=a(77225),b=a(22097),k=a(70980),w=a(25467),I=a(14933),E=a(46205),C=a(34955);const S=({namespace:e})=>{var t,a,S;const{entity:R}=(0,w.tN)(),z=(0,b.useApi)(k.s),D=(0,b.useApi)(b.identityApiRef),M=(0,b.useApi)(b.alertApiRef),[O,T]=(0,i.useState)(""),[L,$]=(0,i.useState)(!1),[_,B]=(0,i.useState)(0),[F,N]=(0,i.useState)(new Set),[U,q]=(0,i.useState)(new Map),[V,W]=(0,i.useState)(new Set),[Y,G]=(0,i.useState)(new Set),[H,J]=(0,i.useState)(!1),[Z,Q]=(0,i.useState)(null),X=(null===(t=R.metadata.annotations)||void 0===t?void 0:t["kuadrant.io/apiproduct"])||R.metadata.name,ee=(null===(a=R.metadata.annotations)||void 0===a?void 0:a["kuadrant.io/namespace"])||e||"default";(0,r.A)(async()=>{const e=await D.getProfileInfo();T(e.email||"")},[D]);const{value:te,loading:ae,error:ne}=(0,r.A)(async()=>((await z.getRequestsByNamespace(ee)).items||[]).filter(e=>{var t,a;return(null===(t=e.spec.apiProductRef)||void 0===t?void 0:t.name)===X&&"Approved"===(null===(a=e.status)||void 0===a?void 0:a.phase)}),[ee,X,z,_]),{value:ie,loading:re}=(0,r.A)(async()=>{try{var e;return null===(e=(await z.getApiProducts()).items)||void 0===e?void 0:e.find(e=>e.metadata.namespace===ee&&e.metadata.name===X)}catch(e){return null}},[ee,X,z]),oe=ie?`apiproduct:${ie.metadata.namespace}/${ie.metadata.name}`:void 0,{allowed:se,loading:de}=(0,E.l)(C.dp,oe),le=e=>{N(t=>{const a=new Set(t);return a.has(e)?a.delete(e):a.add(e),a})};if(ae||re||de)return(0,n.jsx)(s.n,{title:"Kuadrant API Keys",children:(0,n.jsxs)(d.A,{p:2,children:[(0,n.jsx)(v.A,{variant:"text",width:"80%"}),(0,n.jsx)(v.A,{variant:"text",width:"60%"}),(0,n.jsx)(v.A,{variant:"text",width:"70%"})]})});if(ne)return(0,n.jsx)(o._,{error:ne});const ce=te||[],pe=(null==ie||null===(S=ie.status)||void 0===S?void 0:S.discoveredPlans)||[],ue=se&&pe.length>0;return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.n,{title:"Kuadrant API Keys",children:(0,n.jsxs)(d.A,{p:2,children:[ce.length>0?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(l.A,{variant:"body2",color:"textSecondary",gutterBottom:!0,children:[ce.length," active key",1!==ce.length?"s":""]}),ce.map(e=>{var t,a,i;const r=`${e.metadata.namespace}/${e.metadata.name}`,o=F.has(e.metadata.name),s=V.has(r),A=U.get(r),m=null===(a=e.status)||void 0===a||null===(t=a.secretRef)||void 0===t?void 0:t.name,y=!1!==(null===(i=e.status)||void 0===i?void 0:i.canReadSecret),P=Y.has(r)||!y;return(0,n.jsxs)(d.A,{mb:1,p:1.5,border:1,borderColor:"grey.300",borderRadius:4,children:[(0,n.jsxs)(d.A,{display:"flex",justifyContent:"space-between",alignItems:"center",mb:1,children:[(0,n.jsx)(l.A,{variant:"body2",style:{fontWeight:500},children:e.metadata.name}),(0,n.jsx)(c.A,{label:e.spec.planTier,color:"primary",size:"small"})]}),m&&(0,n.jsxs)(d.A,{display:"flex",alignItems:"center",children:[(0,n.jsx)(l.A,{variant:"body2",style:{fontFamily:"monospace",fontSize:"0.8rem",flex:1,overflow:"hidden",textOverflow:"ellipsis"},children:s?"Loading...":o&&A?A:P&&!A?"Already viewed":"••••••••••••••••"}),o&&A&&(0,n.jsx)(p.Ay,{title:"Copy to clipboard",children:(0,n.jsx)(u.A,{size:"small",onClick:async()=>{A&&(await navigator.clipboard.writeText(A),M.post({message:"API key copied to clipboard",severity:"success",display:"transient"}))},children:(0,n.jsx)(K.A,{fontSize:"small"})})}),(0,n.jsx)(p.Ay,{title:P&&!A?"Key already viewed":o?"Hide API key":"Reveal API key (one-time only)",children:(0,n.jsx)("span",{children:(0,n.jsx)(u.A,{size:"small",onClick:()=>{o?(((e,t)=>{const a=`${e}/${t}`;q(e=>{const t=new Map(e);return t.delete(a),t})})(e.metadata.namespace,e.metadata.name),le(e.metadata.name)):P||(Q({namespace:e.metadata.namespace,name:e.metadata.name}),J(!0))},disabled:s||P&&!A,children:o?(0,n.jsx)(f.A,{fontSize:"small"}):(0,n.jsx)(g.A,{fontSize:"small"})})})})]})]},e.metadata.name)})]}):(0,n.jsx)(l.A,{variant:"body1",gutterBottom:!0,children:"You don't have any API keys for this API yet"}),(0,n.jsx)(d.A,{mt:2,children:ue?(0,n.jsx)(A.A,{variant:"contained",color:"primary",size:"small",startIcon:(0,n.jsx)(x.A,{}),onClick:()=>$(!0),"data-testid":"request-api-access-button",children:"Request API Access"}):(0,n.jsx)(l.A,{variant:"caption",color:"textSecondary",children:"Visit the API Keys tab to view and manage access"})})]})}),(0,n.jsx)(I.c,{open:L,onClose:()=>$(!1),onSuccess:()=>{$(!1),B(e=>e+1)},apiProductName:X,namespace:ee,userEmail:O,plans:pe}),(0,n.jsxs)(m.A,{open:H,onClose:()=>{J(!1),Q(null)},maxWidth:"sm",children:[(0,n.jsx)(y.A,{children:(0,n.jsxs)(d.A,{display:"flex",alignItems:"center",children:[(0,n.jsx)(j.A,{color:"primary",style:{marginRight:8}}),"View API Key"]})}),(0,n.jsxs)(P.A,{children:[(0,n.jsxs)(l.A,{variant:"body1",paragraph:!0,children:["This API key can only be viewed ",(0,n.jsx)("strong",{children:"once"}),". After you reveal it, you will not be able to retrieve it again."]}),(0,n.jsx)(l.A,{variant:"body2",color:"textSecondary",children:"Make sure to copy and store it securely before closing this view."})]}),(0,n.jsxs)(h.A,{children:[(0,n.jsx)(A.A,{onClick:()=>{J(!1),Q(null)},children:"Cancel"}),(0,n.jsx)(A.A,{variant:"contained",color:"primary",onClick:()=>{Z&&((async(e,t)=>{const a=`${e}/${t}`;if(!V.has(a)){W(e=>new Set(e).add(a));try{const n=await z.getApiKeySecret(e,t);q(e=>new Map(e).set(a,n.apiKey)),G(e=>new Set(e).add(a))}catch(e){console.error("failed to fetch api key:",e);const t=e instanceof Error?e.message:"unknown error occurred";t.includes("403")||t.includes("already been viewed")?(G(e=>new Set(e).add(a)),M.post({message:"This API key has already been viewed and cannot be retrieved again.",severity:"warning",display:"transient"})):M.post({message:`Failed to fetch APIKey. ${t}`,severity:"error",display:"transient"})}finally{W(e=>{const t=new Set(e);return t.delete(a),t})}}})(Z.namespace,Z.name),le(Z.name)),J(!1),Q(null)},children:"Reveal API Key"})]})]})]})}},58373:(e,t,a)=>{a.r(t),a.d(t,{ApiAccessCard:()=>i.z,ApiIcon:()=>u,ApiKeyApprovalPage:()=>n.ApiKeyApprovalPage,ApiKeyDetailPage:()=>n.ApiKeyDetailPage,ApiKeyManagementTab:()=>r._,ApiProductDetailPage:()=>n.ApiProductDetailPage,ApiProductInfoCard:()=>o.G,ApiProductsPage:()=>n.ApiProductsPage,ApprovalIcon:()=>m,EntityKuadrantApiAccessCard:()=>n.EntityKuadrantApiAccessCard,EntityKuadrantApiApprovalTab:()=>n.EntityKuadrantApiApprovalTab,EntityKuadrantApiKeyManagementTab:()=>n.EntityKuadrantApiKeyManagementTab,EntityKuadrantApiKeysContent:()=>n.EntityKuadrantApiKeysContent,EntityKuadrantApiProductInfoContent:()=>n.EntityKuadrantApiProductInfoContent,EntityKuadrantApiProductOpenApiAlert:()=>n.EntityKuadrantApiProductOpenApiAlert,KeyIcon:()=>A,KuadrantIcon:()=>s.m,KuadrantPage:()=>n.KuadrantPage,MyApiKeysPage:()=>n.MyApiKeysPage,kuadrantApiFactory:()=>v,kuadrantApiKeyApprovePermission:()=>y.KV,kuadrantApiKeyCreatePermission:()=>y.dp,kuadrantApiKeyDeleteAllPermission:()=>y.jH,kuadrantApiKeyDeleteOwnPermission:()=>y.uL,kuadrantApiKeyReadAllPermission:()=>y.kd,kuadrantApiKeyReadOwnPermission:()=>y.DS,kuadrantApiKeyUpdateAllPermission:()=>y.z4,kuadrantApiKeyUpdateOwnPermission:()=>y.q0,kuadrantApiProductCreatePermission:()=>y.FL,kuadrantApiProductDeleteAllPermission:()=>y.R_,kuadrantApiProductDeleteOwnPermission:()=>y.EM,kuadrantApiProductListPermission:()=>y.vs,kuadrantApiProductReadAllPermission:()=>y.Al,kuadrantApiProductReadOwnPermission:()=>y.T0,kuadrantApiProductUpdateAllPermission:()=>y.v_,kuadrantApiProductUpdateOwnPermission:()=>y.U3,kuadrantApiRef:()=>P.s,kuadrantAuthPolicyListPermission:()=>y.WE,kuadrantPermissions:()=>y.L5,kuadrantPlanPolicyCreatePermission:()=>y.Lb,kuadrantPlanPolicyDeletePermission:()=>y.Kx,kuadrantPlanPolicyListPermission:()=>y.J,kuadrantPlanPolicyReadPermission:()=>y.VS,kuadrantPlanPolicyUpdatePermission:()=>y.sB,kuadrantPlugin:()=>n.kuadrantPlugin,kuadrantRateLimitPolicyListPermission:()=>y.xO});var n=a(72627),i=a(57349),r=a(56777),o=a(34541),s=a(19833),d=a(31085),l=(a(95478),a(2350)),c=a(86733),p=a(98899);const u=e=>(0,d.jsx)(l.A,{...e}),A=e=>(0,d.jsx)(c.A,{...e}),m=e=>(0,d.jsx)(p.A,{...e});var y=a(34955),P=a(70980),h=a(22097);const v=(0,h.createApiFactory)({api:P.s,deps:{discoveryApi:h.discoveryApiRef,fetchApi:h.fetchApiRef,identityApi:h.identityApiRef},factory:({discoveryApi:e,fetchApi:t,identityApi:a})=>new P.y({discoveryApi:e,fetchApi:t,identityApi:a})})},72627:(e,t,a)=>{a.r(t),a.d(t,{ApiKeyApprovalPage:()=>c,ApiKeyDetailPage:()=>y,ApiProductDetailPage:()=>v,ApiProductsPage:()=>d,EntityKuadrantApiAccessCard:()=>p,EntityKuadrantApiApprovalTab:()=>P,EntityKuadrantApiKeyManagementTab:()=>u,EntityKuadrantApiKeysContent:()=>A,EntityKuadrantApiProductInfoContent:()=>m,EntityKuadrantApiProductOpenApiAlert:()=>h,KuadrantPage:()=>s,MyApiKeysPage:()=>l,kuadrantPlugin:()=>o});var n=a(22097);const i=(0,n.createRouteRef)({id:"kuadrant"}),r=(0,n.createSubRouteRef)({id:"kuadrant/resource",parent:i,path:"/:kind/:namespace/:name"}),o=(0,n.createPlugin)({id:"kuadrant",routes:{root:i,resource:r}}),s=o.provide((0,n.createRoutableExtension)({name:"KuadrantPage",component:()=>Promise.all([a.e(4083),a.e(9400),a.e(7717),a.e(1584),a.e(4434),a.e(369),a.e(7293),a.e(7076),a.e(9625),a.e(7057),a.e(5010),a.e(8563),a.e(1881),a.e(5478),a.e(5427),a.e(9634),a.e(484),a.e(1942),a.e(7976),a.e(5978),a.e(5289),a.e(7005)]).then(a.bind(a,94251)).then(e=>e.ApiProductsPage),mountPoint:i})),d=o.provide((0,n.createRoutableExtension)({name:"ApiProductsPage",component:()=>Promise.all([a.e(4083),a.e(9400),a.e(7717),a.e(1584),a.e(4434),a.e(369),a.e(7293),a.e(7076),a.e(9625),a.e(7057),a.e(5010),a.e(8563),a.e(1881),a.e(5478),a.e(5427),a.e(9634),a.e(484),a.e(1942),a.e(7976),a.e(5978),a.e(5289),a.e(7005)]).then(a.bind(a,94251)).then(e=>e.ApiProductsPage),mountPoint:i})),l=o.provide((0,n.createRoutableExtension)({name:"MyApiKeysPage",component:()=>Promise.all([a.e(4083),a.e(9400),a.e(7717),a.e(1584),a.e(4434),a.e(369),a.e(7076),a.e(9625),a.e(7057),a.e(5010),a.e(8563),a.e(6426),a.e(5478),a.e(5427),a.e(9634),a.e(484),a.e(1942),a.e(7976),a.e(7270)]).then(a.bind(a,37270)).then(e=>e.MyApiKeysPage),mountPoint:i})),c=o.provide((0,n.createRoutableExtension)({name:"ApiKeyApprovalPage",component:()=>Promise.all([a.e(4083),a.e(9400),a.e(7717),a.e(1584),a.e(4434),a.e(369),a.e(7293),a.e(7076),a.e(9625),a.e(7057),a.e(5010),a.e(8563),a.e(5478),a.e(5427),a.e(9634),a.e(484),a.e(1942),a.e(7976),a.e(286),a.e(3976)]).then(a.bind(a,43976)).then(e=>e.ApiKeyApprovalPage),mountPoint:i})),p=o.provide((0,n.createComponentExtension)({name:"EntityKuadrantApiAccessCard",component:{lazy:()=>Promise.all([a.e(4083),a.e(9400),a.e(7717),a.e(1584),a.e(4434),a.e(369),a.e(7293),a.e(512),a.e(5478),a.e(5427),a.e(9634),a.e(484),a.e(1942),a.e(7976),a.e(1719)]).then(a.bind(a,11719)).then(e=>e.ApiAccessCard)}})),u=o.provide((0,n.createComponentExtension)({name:"EntityKuadrantApiKeyManagementTab",component:{lazy:()=>Promise.all([a.e(4083),a.e(9400),a.e(7717),a.e(1584),a.e(4434),a.e(369),a.e(7293),a.e(7076),a.e(9625),a.e(7057),a.e(5010),a.e(5478),a.e(5427),a.e(484),a.e(1942),a.e(7976),a.e(6777),a.e(9239)]).then(a.bind(a,42708)).then(e=>e.ApiKeyManagementTab)}})),A=o.provide((0,n.createComponentExtension)({name:"EntityKuadrantApiKeysContent",component:{lazy:()=>Promise.all([a.e(4083),a.e(9400),a.e(7717),a.e(1584),a.e(4434),a.e(369),a.e(7293),a.e(7076),a.e(9625),a.e(7057),a.e(5010),a.e(5478),a.e(5427),a.e(484),a.e(1942),a.e(7976),a.e(6777),a.e(9239)]).then(a.bind(a,42708)).then(e=>e.ApiKeyManagementTab)}})),m=o.provide((0,n.createComponentExtension)({name:"EntityKuadrantApiProductInfoContent",component:{lazy:()=>Promise.all([a.e(4083),a.e(9400),a.e(7717),a.e(1584),a.e(7293),a.e(9625),a.e(3581),a.e(5478),a.e(5427),a.e(9634),a.e(484),a.e(1942),a.e(7976),a.e(5978),a.e(3947),a.e(4908)]).then(a.bind(a,34908)).then(e=>e.ApiProductInfoCard)}})),y=o.provide((0,n.createRoutableExtension)({name:"ApiKeyDetailPage",component:()=>Promise.all([a.e(4083),a.e(9400),a.e(7717),a.e(1584),a.e(4434),a.e(7076),a.e(8563),a.e(5478),a.e(5427),a.e(9634),a.e(484),a.e(1942),a.e(7976),a.e(2967)]).then(a.bind(a,72967)).then(e=>e.ApiKeyDetailPage),mountPoint:i})),P=o.provide((0,n.createComponentExtension)({name:"EntityKuadrantApiApprovalTab",component:{lazy:()=>Promise.all([a.e(4083),a.e(9400),a.e(7717),a.e(1584),a.e(4434),a.e(369),a.e(7293),a.e(7076),a.e(9625),a.e(7057),a.e(5010),a.e(5478),a.e(5427),a.e(484),a.e(1942),a.e(7976),a.e(286),a.e(6800)]).then(a.bind(a,46800)).then(e=>e.EntityApiApprovalTab)}})),h=o.provide((0,n.createComponentExtension)({name:"EntityKuadrantApiProductOpenApiAlert",component:{lazy:()=>Promise.all([a.e(9400),a.e(7717),a.e(5478),a.e(5427),a.e(9634),a.e(484),a.e(1942),a.e(7976),a.e(6371)]).then(a.bind(a,36371)).then(e=>e.ApiProductOpenApiAlert)}})),v=o.provide((0,n.createRoutableExtension)({name:"ApiProductDetailPage",component:()=>Promise.all([a.e(4083),a.e(9400),a.e(7717),a.e(1584),a.e(4434),a.e(369),a.e(7293),a.e(7076),a.e(9625),a.e(7057),a.e(8563),a.e(9079),a.e(5478),a.e(5427),a.e(9634),a.e(484),a.e(1942),a.e(7976),a.e(5978),a.e(3947),a.e(5289),a.e(7791)]).then(a.bind(a,57791)).then(e=>e.ApiProductDetailPage),mountPoint:i}))}}]);
|
|
2
|
-
//# sourceMappingURL=exposed-PluginRoot.949381c2.chunk.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"static/exposed-PluginRoot.949381c2.chunk.js","mappings":"+LAGO,MAAMA,EAAgBC,IAC3B,UAACC,EAAAA,EAAOA,IACFD,EACJE,QAAQ,gBACRC,GAAI,CAAEC,UAAW,cAAeC,WAAY,SAAUL,EAAMG,I,WAE5D,SAACG,OAAAA,CACCC,EAAE,8GACFC,KAAK,kBAEP,SAACC,OAAAA,CAAKC,EAAE,IAAIC,EAAE,IAAIC,MAAM,MAAMC,OAAO,OAAOL,KAAK,mB,uNCDrD,MAAMM,GAAYC,EAAAA,EAAAA,GAAYC,IAAW,CACvCC,MAAO,CACLC,WAAY,IACZC,MAAOH,EAAMI,QAAQC,KAAKC,UAC1BC,aAAcP,EAAMQ,QAAQ,IAC5BC,SAAU,UACVC,cAAe,gBAINC,EAAqB,K,IAUdC,EACKA,EAgBTC,EAAAA,EA+DMA,EAAAA,EAIF,EACOA,EAAAA,EAUdA,EAxGX,MAAMC,EAAUhB,KACV,OAAEc,IAAWG,EAAAA,EAAAA,MACbC,GAAcC,EAAAA,EAAAA,QAAOC,EAAAA,GACrBC,GAAcF,EAAAA,EAAAA,QAAOG,EAAAA,iBAEnBC,QAASC,EAAYC,QAASC,IAAgBC,EAAAA,EAAAA,GACpDC,EAAAA,IAGIC,EAAuC,QAA3Bf,EAAAA,EAAOgB,SAASC,mBAAhBjB,IAAAA,OAAAA,EAAAA,EAA8B,yBAC1CkB,EAA4C,QAA3BlB,EAAAA,EAAOgB,SAASC,mBAAhBjB,IAAAA,OAAAA,EAAAA,EAA8B,2BAE7CmB,MAAOC,IAAkBC,EAAAA,EAAAA,GAASC,gBACjBf,EAAYgB,wBACnBC,cAAcC,MAAM,KAAK,IAAM,QAC9C,CAAClB,KAEIY,MAAOlB,EAAU,QAAEU,EAAO,MAAEe,IAAUL,EAAAA,EAAAA,GAASC,SAChDP,GAAcG,EAIZd,EAAYuB,cAAcZ,EAAWG,GAHnC,KAIR,CAACd,EAAaW,EAAWG,IAGtBU,EAAQ3B,SAAoB,QAApBA,EAAAA,EAAYe,gBAAZf,IAAAA,GAAiC,QAAjCA,EAAAA,EAAsBgB,mBAAtBhB,IAAAA,OAAAA,EAAAA,EAAoC,sBAC5C4B,EAAcD,aAAAA,EAAAA,EAAOH,MAAM,KAAK,GAChCK,EAAUpB,GAAeU,GAAiBS,IAAgBT,EAEhE,IAAKL,IAAcG,EACjB,OACE,SAACa,EAAAA,EAAQA,CAACC,MAAM,0B,UACd,SAACC,EAAAA,EAAUA,C,SAAC,8CAKlB,GAAItB,GAAWC,EACb,OACE,SAACmB,EAAAA,EAAQA,CAACC,MAAM,0B,UACd,SAACE,EAAAA,EAAQA,CAAAA,KAMf,GAAIjC,IAAe6B,EACjB,OACE,SAACC,EAAAA,EAAQA,CAACC,MAAM,0B,UACd,SAACG,EAAAA,EAAGA,CAACC,EAAG,E,UACN,SAACH,EAAAA,EAAUA,CAACI,QAAQ,QAAQ9C,MAAM,gB,SAAgB,oJAS1D,GAAImC,GAASA,EAAMY,QAAQC,SAAS,8BAClC,OACE,SAACR,EAAAA,EAAQA,CAACC,MAAM,0B,UACd,SAACG,EAAAA,EAAGA,CAACC,EAAG,E,UACN,SAACH,EAAAA,EAAUA,CAACI,QAAQ,QAAQ9C,MAAM,gB,SAAgB,oJAQ1D,GAAImC,EACF,OACE,SAACK,EAAAA,EAAQA,CAACC,MAAM,0B,UACd,SAACQ,EAAAA,EAAkBA,CAACd,MAAOA,MAKjC,IAAKzB,EACH,OACE,SAAC8B,EAAAA,EAAQA,CAACC,MAAM,0B,UACd,SAACC,EAAAA,EAAUA,C,SAAC,2BAMlB,MAAMQ,GAA+B,QAAjBxC,EAAAA,EAAWyC,cAAXzC,IAAAA,GAAuC,QAAvCA,EAAAA,EAAmB0C,4BAAnB1C,IAAAA,OAAAA,EAAAA,EAAyC2C,iBAAkB,CAAC,EAE1EC,EADgBC,OAAOC,OAAON,GACJO,KAAMC,GAAgBA,EAAOC,eAAe,QACtEC,EAAUC,QAAQP,GAClBQ,EAAaR,SAAsB,QAAvB,IAAoBS,WAApB,WAACT,EAAD,EAAyBU,UACrCC,EAAoC,QAAjBvD,EAAAA,EAAWyC,cAAXzC,IAAAA,GAAgC,QAAhCA,EAAAA,EAAmBwD,qBAAnBxD,IAAAA,OAAAA,EAAAA,EAAkCyD,cAE3D,OACE,sB,WACE,UAAC3B,EAAAA,EAAQA,CAACC,MAAM,sB,WACd,UAACG,EAAAA,EAAGA,CAACwB,GAAI,E,WACP,SAAC1B,EAAAA,EAAUA,CAACI,QAAQ,UAAUuB,UAAW1D,EAAQb,M,SAAO,kBAGxD,SAAC4C,EAAAA,EAAUA,CAACI,QAAQ,K,UACF,QAAfpC,EAAAA,EAAW4D,YAAX5D,IAAAA,OAAAA,EAAAA,EAAiB6D,cAAe5C,QAGrC,SAAC6C,EAAAA,EAAiBA,CAChBC,QAAS/D,EACTgE,YAAY,EACZC,iBAAiB,OAGpBf,GAAWE,IACV,SAAClB,EAAAA,EAAGA,CAACgC,GAAI,E,UACP,SAACC,EAAAA,EAAgBA,CACfb,UAAWF,EACXK,cAAeF,S,+UCvGpB,MAAMa,EAAgB,EAAGtD,UAAWuD,M,IAqBlBtE,EACLA,EAqHHC,EA1If,MAAM,OAAED,IAAWG,EAAAA,EAAAA,MACbC,GAAcC,EAAAA,EAAAA,QAAOC,EAAAA,GACrBC,GAAcF,EAAAA,EAAAA,QAAOG,EAAAA,gBACrB+D,GAAWlE,EAAAA,EAAAA,QAAOmE,EAAAA,cACjBC,EAAWC,IAAgBC,EAAAA,EAAAA,UAAiB,KAC5CC,EAAmBC,IAAwBF,EAAAA,EAAAA,WAAS,IACpDG,EAASC,IAAcJ,EAAAA,EAAAA,UAAS,IAGhCK,EAAaC,IAAkBN,EAAAA,EAAAA,UAAsB,IAAIO,MACzDC,EAAcC,IAAmBT,EAAAA,EAAAA,UAA8B,IAAIU,MACnEC,EAAeC,IAAoBZ,EAAAA,EAAAA,UAAsB,IAAIO,MAC7DM,EAAiBC,IAAsBd,EAAAA,EAAAA,UAAsB,IAAIO,MACjEQ,EAAqBC,IAA0BhB,EAAAA,EAAAA,WAAS,IACxDiB,EAAkBC,IAAuBlB,EAAAA,EAAAA,UAGtC,MAGJzD,GAA4C,QAA3BlB,EAAAA,EAAOgB,SAASC,mBAAhBjB,IAAAA,OAAAA,EAAAA,EAA8B,4BAA6BA,EAAOgB,SAAS8E,KAC5F/E,IAAuC,QAA3Bf,EAAAA,EAAOgB,SAASC,mBAAhBjB,IAAAA,OAAAA,EAAAA,EAA8B,2BAA4BsE,GAAiB,WAG7FjD,EAAAA,EAAAA,GAASC,UACP,MAAMyE,QAAgBxF,EAAYyF,iBAClCtB,EAAaqB,EAAQE,OAAS,KAC7B,CAAC1F,IAGJ,MAAQY,MAAO+E,GAAUvF,QAASwF,GAAazE,MAAO0E,KAAc/E,EAAAA,EAAAA,GAASC,iBACxDlB,EAAYiG,uBAAuBtF,KAC7BuF,OAAS,IACfC,OAAQC,I,IACzBA,EAAiDA,E,OAA7B,QAApBA,EAAAA,EAAE3C,KAAK4C,qBAAPD,IAAAA,OAAAA,EAAAA,EAAsBV,QAAS5E,GAAsC,cAAZ,QAARsF,EAAAA,EAAE9D,cAAF8D,IAAAA,OAAAA,EAAAA,EAAUE,SAE5D,CAAC3F,GAAWG,EAAgBd,EAAa0E,KAGpC3D,MAAOlB,GAAYU,QAASgG,KAAmBtF,EAAAA,EAAAA,GAASC,UAC9D,I,IAESsF,EAAP,OAAiB,QAAVA,SADYxG,EAAYyG,kBACnBP,aAALM,IAAAA,OAAAA,EAAAA,EAAY5D,KAChBZ,GACCA,EAAEpB,SAASD,YAAcA,IACzBqB,EAAEpB,SAAS8E,OAAS5E,EAE1B,CAAE,MAAO4F,GACP,OAAO,IACT,GACC,CAAC/F,GAAWG,EAAgBd,IAEzB2G,GAAc9G,GAChB,cAAcA,GAAWe,SAASD,aAAad,GAAWe,SAAS8E,YACnEkB,GAEIvG,QAASwG,GAAkBtG,QAASuG,KAAsBrG,EAAAA,EAAAA,GAChEsG,EAAAA,GACAJ,IAiDIK,GAAoBC,IACxBpC,EAAgBqC,IACd,MAAMC,EAAS,IAAIrC,IAAIoC,GAMvB,OALIC,EAAOC,IAAIH,GACbE,EAAOE,OAAOJ,GAEdE,EAAOG,IAAIL,GAENE,KAMX,GAFgBpB,IAAeQ,IAAkBO,GAG/C,OACE,SAACnF,EAAAA,EAAQA,CAACC,MAAM,oB,UACd,UAACG,EAAAA,EAAGA,CAACC,EAAG,E,WACN,SAACuF,EAAAA,EAAQA,CAACtF,QAAQ,OAAOrD,MAAM,SAC/B,SAAC2I,EAAAA,EAAQA,CAACtF,QAAQ,OAAOrD,MAAM,SAC/B,SAAC2I,EAAAA,EAAQA,CAACtF,QAAQ,OAAOrD,MAAM,aAMvC,GAAIoH,GACF,OAAO,SAAC5D,EAAAA,EAAkBA,CAACd,MAAO0E,KAGpC,MAAMwB,GAAO,IAA0B,GACjCC,IAAS5H,UAAkB,QAAlBA,EAAAA,GAAYyC,cAAZzC,IAAAA,OAAAA,EAAAA,EAAoB6H,kBAAmB,GAChDC,GAAad,IAAoBY,GAAMG,OAAS,EAsGtD,OACE,sB,WACE,SAACjG,EAAAA,EAAQA,CAACC,MAAM,oB,UACd,UAACG,EAAAA,EAAGA,CAACC,EAAG,E,UACLwF,GAAKI,OAAS,GACb,sB,WACE,UAAC/F,EAAAA,EAAUA,CAACI,QAAQ,QAAQ9C,MAAM,gBAAgB0I,cAAY,E,UAC3DL,GAAKI,OAAO,cAA4B,IAAhBJ,GAAKI,OAAe,IAAM,MAEpDJ,GAAKM,IA7GIC,I,IAKCA,EAAAA,EACCA,EALtB,MAAMC,EAAM,GAAGD,EAAQnH,SAASD,aAAaoH,EAAQnH,SAAS8E,OACxDuC,EAAYrD,EAAYwC,IAAIW,EAAQnH,SAAS8E,MAC7CwC,EAAYhD,EAAckC,IAAIY,GAC9BG,EAAcpD,EAAaqD,IAAIJ,GAC/BK,EAA6B,QAAdN,EAAAA,EAAQzF,cAARyF,IAAAA,GAAyB,QAAzBA,EAAAA,EAAgBO,iBAAhBP,IAAAA,OAAAA,EAAAA,EAA2BrC,KAC1C6C,GAAkD,KAApB,QAAdR,EAAAA,EAAQzF,cAARyF,IAAAA,OAAAA,EAAAA,EAAgBQ,eAChCC,EAAgBpD,EAAgBgC,IAAIY,KAASO,EA0BnD,OACE,UAACxG,EAAAA,EAAGA,CAEFwB,GAAI,EACJvB,EAAG,IACHyG,OAAQ,EACRC,YAAY,WACZC,aAAc,E,WAEd,UAAC5G,EAAAA,EAAGA,CAAC6G,QAAQ,OAAOC,eAAe,gBAAgBC,WAAW,SAASvF,GAAI,E,WACzE,SAAC1B,EAAAA,EAAUA,CAACI,QAAQ,QAAQ8G,MAAO,CAAE7J,WAAY,K,SAC9C6I,EAAQnH,SAAS8E,QAEpB,SAACsD,EAAAA,EAAIA,CAAC/J,MAAO8I,EAAQtE,KAAKwF,SAAU9J,MAAM,UAAU+J,KAAK,aAE1Db,IACC,UAACtG,EAAAA,EAAGA,CAAC6G,QAAQ,OAAOE,WAAW,S,WAC7B,SAACjH,EAAAA,EAAUA,CACTI,QAAQ,QACR8G,MAAO,CACLI,WAAY,YACZ1J,SAAU,SACV2J,KAAM,EACNC,SAAU,SACVC,aAAc,Y,SAGfpB,EACG,aACAD,GAAaE,EACXA,EACAK,IAAkBL,EAChB,iBACA,qBAETF,GAAaE,IACZ,SAACoB,EAAAA,GAAOA,CAAC3H,MAAM,oB,UACb,SAAC4H,EAAAA,EAAUA,CAACN,KAAK,QAAQO,QAhDlBvI,UACbiH,UACIuB,UAAUC,UAAUC,UAAUzB,GACpChE,EAAS0F,KAAK,CACZ3H,QAAS,8BACT4H,SAAU,UACVlB,QAAS,gB,UA2CD,SAACmB,EAAAA,EAAYA,CAACtK,SAAS,eAI7B,SAAC8J,EAAAA,GAAOA,CACN3H,MACE4G,IAAkBL,EACd,qBACAF,EACE,eACA,iC,UAGR,SAAC+B,OAAAA,C,UACC,SAACR,EAAAA,EAAUA,CACTN,KAAK,QACLO,QA9EY,KACpBxB,GArDiB,EAACgC,EAA0BC,KAClD,MAAMlC,EAAM,GAAGiC,KAAoBC,IACnClF,EAAiBkC,IACf,MAAMiD,EAAO,IAAIlF,IAAIiC,GAErB,OADAiD,EAAK9C,OAAOW,GACLmC,KAiDLC,CAAiBrC,EAAQnH,SAASD,UAAWoH,EAAQnH,SAAS8E,MAC9DsB,GAAiBe,EAAQnH,SAAS8E,OACxB8C,IACV/C,EAAoB,CAClB9E,UAAWoH,EAAQnH,SAASD,UAC5B+E,KAAMqC,EAAQnH,SAAS8E,OAEzBH,GAAuB,KAsEb8E,SAAUnC,GAAcM,IAAkBL,E,SAEzCF,GAAY,SAACqC,EAAAA,EAAiBA,CAAC7K,SAAS,WAAa,SAAC8K,EAAAA,EAAcA,CAAC9K,SAAS,qBAvDpFsI,EAAQnH,SAAS8E,YA6ElB,SAAC7D,EAAAA,EAAUA,CAACI,QAAQ,QAAQ4F,cAAY,E,SAAC,kDAI3C,SAAC9F,EAAAA,EAAGA,CAACgC,GAAI,E,SACN4D,IACC,SAAC6C,EAAAA,EAAMA,CACLvI,QAAQ,YACR9C,MAAM,UACN+J,KAAK,QACLuB,WAAW,SAACC,EAAAA,EAAOA,CAAAA,GACnBjB,QAAS,IAAMhF,GAAqB,GACpCkG,cAAY,4B,SACb,wBAID,SAAC9I,EAAAA,EAAUA,CAACI,QAAQ,UAAU9C,MAAM,gB,SAAgB,6DAQ5D,SAACyL,EAAAA,EAAmBA,CAClBC,KAAMrG,EACNsG,QAAS,IAAMrG,GAAqB,GACpCsG,UAAW,KACTtG,GAAqB,GACrBE,EAAYyB,GAAMA,EAAI,IAExBtF,eAAgBA,EAChBH,UAAWA,GACX0D,UAAWA,EACXoD,MAAOA,MAGT,UAACuD,EAAAA,EAAMA,CACLH,KAAMvF,EACNwF,QAAS,KACPvF,GAAuB,GACvBE,EAAoB,OAEtBwF,SAAS,K,WAET,SAACC,EAAAA,EAAWA,C,UACV,UAACnJ,EAAAA,EAAGA,CAAC6G,QAAQ,OAAOE,WAAW,S,WAC7B,SAACqC,EAAAA,EAAWA,CAAChM,MAAM,UAAU4J,MAAO,CAAEqC,YAAa,KAAO,qBAI9D,UAACC,EAAAA,EAAaA,C,WACZ,UAACxJ,EAAAA,EAAUA,CAACI,QAAQ,QAAQqJ,WAAS,E,UAAC,oCACJ,SAACC,SAAAA,C,SAAO,SAAa,wEAGvD,SAAC1J,EAAAA,EAAUA,CAACI,QAAQ,QAAQ9C,MAAM,gB,SAAgB,0EAIpD,UAACqM,EAAAA,EAAaA,C,WACZ,SAAChB,EAAAA,EAAMA,CACLf,QAAS,KACPlE,GAAuB,GACvBE,EAAoB,O,SAEvB,YAGD,SAAC+E,EAAAA,EAAMA,CACLvI,QAAQ,YACR9C,MAAM,UACNsK,QAAS,KACHjE,IA1QctE,OAAO+I,EAA0BC,KAC7D,MAAMlC,EAAM,GAAGiC,KAAoBC,IACnC,IAAIhF,EAAckC,IAAIY,GAAtB,CAIA7C,EAAkB+B,GAAS,IAAIpC,IAAIoC,GAAMI,IAAIU,IAC7C,IACE,MAAMxB,QAAaxG,EAAYyL,gBAAgBxB,EAAkBC,GACjElF,EAAiBkC,GAAS,IAAIjC,IAAIiC,GAAMwE,IAAI1D,EAAKxB,EAAKmF,SACtDtG,EAAoB6B,GAAS,IAAIpC,IAAIoC,GAAMI,IAAIU,GACjD,CAAE,MAAOtB,GACPkF,QAAQtK,MAAM,2BAA4BoF,GAC1C,MAAMmF,EAAenF,aAAeoF,MAAQpF,EAAIxE,QAAU,yBACtD2J,EAAa1J,SAAS,QAAU0J,EAAa1J,SAAS,wBACxDkD,EAAoB6B,GAAS,IAAIpC,IAAIoC,GAAMI,IAAIU,IAC/C7D,EAAS0F,KAAK,CACZ3H,QAAS,sEACT4H,SAAU,UACVlB,QAAS,eAGXzE,EAAS0F,KAAK,CACZ3H,QAAS,2BAA2B2J,IACpC/B,SAAU,QACVlB,QAAS,aAGf,CAAE,QACAzD,EAAkB+B,IAChB,MAAMiD,EAAO,IAAIrF,IAAIoC,GAErB,OADAiD,EAAK9C,OAAOW,GACLmC,GAEX,CA9BA,GAuQY4B,CACEvG,EAAiB7E,UACjB6E,EAAiBE,MAEnBsB,GAAiBxB,EAAiBE,OAEpCH,GAAuB,GACvBE,EAAoB,O,SAEvB,4B,khECjXJ,MAAMuG,EAAWhO,IAAwB,SAACiO,EAAAA,EAAWA,IAAKjO,IACpDkO,EAAWlO,IAAwB,SAACmO,EAAAA,EAAWA,IAAKnO,IACpDoO,EAAgBpO,IAAwB,SAACqO,EAAAA,EAAgBA,IAAKrO,I,qCCIpE,MAAMsO,GAAqBC,EAAAA,EAAAA,kBAAiB,CACjDC,IAAKtM,EAAAA,EACLuM,KAAM,CACJC,aAAcC,EAAAA,gBACdC,SAAUC,EAAAA,YACV1M,YAAaC,EAAAA,gBAEf0M,QAAS,EAAGJ,eAAcE,WAAUzM,iBAClC,IAAI4M,EAAAA,EAAkB,CAAEL,eAAcE,WAAUzM,iB,mbClB7C,MAAM6M,GAAeC,EAAAA,EAAAA,gBAAe,CACzCC,GAAI,aAGOC,GAAmBC,EAAAA,EAAAA,mBAAkB,CAChDF,GAAI,oBACJG,OAAQL,EACR1O,KAAM,4BCDKgP,GAAiBC,EAAAA,EAAAA,cAAa,CACzCL,GAAI,WACJM,OAAQ,CACNC,KAAMT,EACNU,SAAUP,KAIDQ,EAAeL,EAAeM,SACzCC,EAAAA,EAAAA,yBAAwB,CACtBnI,KAAM,eACNoI,UAAW,IACT,+PAAoCC,KAAKC,GAAKA,EAAEC,iBAClDC,WAAYlB,KAIHiB,EAAkBX,EAAeM,SAC5CC,EAAAA,EAAAA,yBAAwB,CACtBnI,KAAM,kBACNoI,UAAW,IACT,+PAAoCC,KAAKC,GAAKA,EAAEC,iBAClDC,WAAYlB,KAIHmB,EAAgBb,EAAeM,SAC1CC,EAAAA,EAAAA,yBAAwB,CACtBnI,KAAM,gBACNoI,UAAW,IACT,iOAAqCC,KAAKC,GAAKA,EAAEG,eACnDD,WAAYlB,KAIHoB,EAAqBd,EAAeM,SAC/CC,EAAAA,EAAAA,yBAAwB,CACtBnI,KAAM,qBACNoI,UAAW,IACT,0OAA0CC,KAAKC,GAAKA,EAAEI,oBACxDF,WAAYlB,KAIHqB,EAA8Bf,EAAeM,SACxDU,EAAAA,EAAAA,0BAAyB,CACvB5I,KAAM,8BACNoI,UAAW,CACTS,KAAM,IACJ,wLAAqCR,KAAKC,GAAKA,EAAE/J,mBAK5CuK,EAAoClB,EAAeM,SAC9DU,EAAAA,EAAAA,0BAAyB,CACvB5I,KAAM,oCACNoI,UAAW,CACTS,KAAM,IACJ,uNAA2CR,KAAKC,GAAKA,EAAES,yBAMlDC,EAA+BpB,EAAeM,SACzDU,EAAAA,EAAAA,0BAAyB,CACvB5I,KAAM,+BACNoI,UAAW,CACTS,KAAM,IACJ,uNAA2CR,KAAKC,GAAKA,EAAES,yBAKlDE,EAAsCrB,EAAeM,SAChEU,EAAAA,EAAAA,0BAAyB,CACvB5I,KAAM,sCACNoI,UAAW,CACTS,KAAM,IACJ,oMAA0CR,KAAKC,GAAKA,EAAErO,wBAKjDiP,EAAmBtB,EAAeM,SAC7CC,EAAAA,EAAAA,yBAAwB,CACtBnI,KAAM,mBACNoI,UAAW,IACT,gLAAwCC,KAAKC,GAAKA,EAAEY,kBACtDV,WAAYlB,KAIH6B,EAA+BvB,EAAeM,SACzDU,EAAAA,EAAAA,0BAAyB,CACvB5I,KAAM,+BACNoI,UAAW,CACTS,KAAM,IACJ,sNAA4CR,KAAKC,GAAKA,EAAEc,0BAKnDC,EAAuCzB,EAAeM,SACjEU,EAAAA,EAAAA,0BAAyB,CACvB5I,KAAM,uCACNoI,UAAW,CACTS,KAAM,IACJ,8HAA8CR,KAAKC,GAAKA,EAAEgB,4BAKrDC,EAAuB3B,EAAeM,SACjDC,EAAAA,EAAAA,yBAAwB,CACtBnI,KAAM,uBACNoI,UAAW,IACT,+PAA4CC,KAAKC,GAAKA,EAAEiB,sBAC1Df,WAAYlB,I","sources":["webpack://internal.plugin-kuadrant/./src/components/KuadrantIcon/KuadrantIcon.tsx","webpack://internal.plugin-kuadrant/./src/components/ApiProductInfoCard/ApiProductInfoCard.tsx","webpack://internal.plugin-kuadrant/./src/components/ApiAccessCard/ApiAccessCard.tsx","webpack://internal.plugin-kuadrant/./src/components/icons.tsx","webpack://internal.plugin-kuadrant/./src/apis.ts","webpack://internal.plugin-kuadrant/./src/routes.ts","webpack://internal.plugin-kuadrant/./src/plugin.ts"],"sourcesContent":["import React from 'react';\nimport SvgIcon, { SvgIconProps } from '@mui/material/SvgIcon';\n\nexport const KuadrantIcon = (props: SvgIconProps) => (\n <SvgIcon\n {...props}\n viewBox=\"0 0 1024 1024\"\n sx={{ transform: 'scale(0.85)', marginLeft: '4px', ...props.sx }}\n >\n <path\n d=\"M809,1C993.59,183.56 1065.7,449.65 998.12,699.05C964.778,821.823 899.519,933.607 809,1023L292.27,512L809,1Z\"\n fill=\"currentColor\"\n />\n <rect x=\"1\" y=\"1\" width=\"218\" height=\"1022\" fill=\"currentColor\" />\n </SvgIcon>\n);\n","import React from 'react';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { useApi, identityApiRef } from '@backstage/core-plugin-api';\nimport { InfoCard, Progress, ResponseErrorPanel } from '@backstage/core-components';\nimport { Typography, Box, makeStyles } from '@material-ui/core';\nimport useAsync from 'react-use/lib/useAsync';\nimport { useKuadrantPermission } from '../../utils/permissions';\nimport { kuadrantApiProductReadAllPermission } from '../../permissions';\nimport { ApiProductDetails } from '../ApiProductDetails';\nimport { OidcProviderCard } from '../OidcProviderCard';\nimport { kuadrantApiRef } from '../../api';\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}));\n\nexport const ApiProductInfoCard = () => {\n const classes = useStyles();\n const { entity } = useEntity();\n const kuadrantApi = useApi(kuadrantApiRef);\n const identityApi = useApi(identityApiRef);\n\n const { allowed: canReadAll, loading: permLoading } = useKuadrantPermission(\n kuadrantApiProductReadAllPermission\n );\n\n const namespace = entity.metadata.annotations?.['kuadrant.io/namespace'];\n const apiProductName = entity.metadata.annotations?.['kuadrant.io/apiproduct'];\n\n const { value: currentUserId } = useAsync(async () => {\n const identity = await identityApi.getBackstageIdentity();\n return identity.userEntityRef.split('/')[1] || 'guest';\n }, [identityApi]);\n\n const { value: apiProduct, loading, error } = useAsync(async () => {\n if (!namespace || !apiProductName) {\n return null;\n }\n\n return kuadrantApi.getApiProduct(namespace, apiProductName);\n }, [kuadrantApi, namespace, apiProductName]);\n\n // check if user has permission to view this api product\n const owner = apiProduct?.metadata?.annotations?.['backstage.io/owner'];\n const ownerUserId = owner?.split('/')[1];\n const canView = canReadAll || (currentUserId && ownerUserId === currentUserId);\n\n if (!namespace || !apiProductName) {\n return (\n <InfoCard title=\"API Product Information\">\n <Typography>No APIProduct linked to this API entity</Typography>\n </InfoCard>\n );\n }\n\n if (loading || permLoading) {\n return (\n <InfoCard title=\"API Product Information\">\n <Progress />\n </InfoCard>\n );\n }\n\n // show permission message if user doesn't have permission\n if (apiProduct && !canView) {\n return (\n <InfoCard title=\"API Product Information\">\n <Box p={2}>\n <Typography variant=\"body2\" color=\"textSecondary\">\n You don't have permission to view this API product's details. Only the API owner or users with admin permissions can view this information.\n </Typography>\n </Box>\n </InfoCard>\n );\n }\n\n // also show permission message if we got a permission error from the backend\n if (error && error.message.includes('you can only read your own')) {\n return (\n <InfoCard title=\"API Product Information\">\n <Box p={2}>\n <Typography variant=\"body2\" color=\"textSecondary\">\n You don't have permission to view this API product's details. Only the API owner or users with admin permissions can view this information.\n </Typography>\n </Box>\n </InfoCard>\n );\n }\n\n if (error) {\n return (\n <InfoCard title=\"API Product Information\">\n <ResponseErrorPanel error={error} />\n </InfoCard>\n );\n }\n\n if (!apiProduct) {\n return (\n <InfoCard title=\"API Product Information\">\n <Typography>APIProduct not found</Typography>\n </InfoCard>\n );\n }\n\n // check for OIDC auth scheme\n const authSchemes = apiProduct.status?.discoveredAuthScheme?.authentication || {};\n const schemeObjects = Object.values(authSchemes);\n const jwtScheme = schemeObjects.find((scheme: any) => scheme.hasOwnProperty('jwt'));\n const hasOidc = Boolean(jwtScheme);\n const jwtIssuer = (jwtScheme as any)?.jwt?.issuerUrl;\n const jwtTokenEndpoint = apiProduct.status?.oidcDiscovery?.tokenEndpoint;\n\n return (\n <>\n <InfoCard title=\"API Product Details\">\n <Box mb={2}>\n <Typography variant=\"caption\" className={classes.label}>\n Product Name\n </Typography>\n <Typography variant=\"h6\">\n {apiProduct.spec?.displayName || apiProductName}\n </Typography>\n </Box>\n <ApiProductDetails\n product={apiProduct}\n showStatus={false}\n showCatalogLink={false}\n />\n </InfoCard>\n {hasOidc && jwtIssuer && (\n <Box mt={2}>\n <OidcProviderCard\n issuerUrl={jwtIssuer}\n tokenEndpoint={jwtTokenEndpoint}\n />\n </Box>\n )}\n </>\n );\n};\n","import React, { useState } from 'react';\nimport { useAsync } from 'react-use';\nimport {\n InfoCard,\n ResponseErrorPanel,\n} from '@backstage/core-components';\nimport {\n Typography,\n Box,\n Chip,\n Button,\n IconButton,\n Tooltip,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n} from '@material-ui/core';\nimport { Skeleton } from '@material-ui/lab';\nimport AddIcon from '@material-ui/icons/Add';\nimport VisibilityIcon from '@material-ui/icons/Visibility';\nimport VisibilityOffIcon from '@material-ui/icons/VisibilityOff';\nimport FileCopyIcon from '@material-ui/icons/FileCopy';\nimport WarningIcon from '@material-ui/icons/Warning';\nimport { useApi, identityApiRef, alertApiRef } from '@backstage/core-plugin-api';\nimport { kuadrantApiRef } from '../../api';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { RequestAccessDialog } from '../RequestAccessDialog';\nimport { useKuadrantPermission } from '../../utils/permissions';\nimport { kuadrantApiKeyCreatePermission } from '../../permissions';\nimport { APIKey, APIProduct, Plan } from \"../../types/api-management.ts\";\n\nexport interface ApiAccessCardProps {\n // deprecated: use entity annotations instead\n namespace?: string;\n}\n\nexport const ApiAccessCard = ({ namespace: propNamespace }: ApiAccessCardProps) => {\n const { entity } = useEntity();\n const kuadrantApi = useApi(kuadrantApiRef);\n const identityApi = useApi(identityApiRef);\n const alertApi = useApi(alertApiRef);\n const [userEmail, setUserEmail] = useState<string>('');\n const [requestDialogOpen, setRequestDialogOpen] = useState(false);\n const [refresh, setRefresh] = useState(0);\n\n // key reveal state\n const [visibleKeys, setVisibleKeys] = useState<Set<string>>(new Set());\n const [apiKeyValues, setApiKeyValues] = useState<Map<string, string>>(new Map());\n const [apiKeyLoading, setApiKeyLoading] = useState<Set<string>>(new Set());\n const [alreadyReadKeys, setAlreadyReadKeys] = useState<Set<string>>(new Set());\n const [showOnceWarningOpen, setShowOnceWarningOpen] = useState(false);\n const [pendingKeyReveal, setPendingKeyReveal] = useState<{\n namespace: string;\n name: string;\n } | null>(null);\n\n // get apiproduct name from entity annotation (set by entity provider)\n const apiProductName = entity.metadata.annotations?.['kuadrant.io/apiproduct'] || entity.metadata.name;\n const namespace = entity.metadata.annotations?.['kuadrant.io/namespace'] || propNamespace || 'default';\n\n // get current user identity\n useAsync(async () => {\n const profile = await identityApi.getProfileInfo();\n setUserEmail(profile.email || '');\n }, [identityApi]);\n\n // fetch user's approved keys\n const { value: requests, loading: keysLoading, error: keysError } = useAsync(async () => {\n const data = await kuadrantApi.getRequestsByNamespace(namespace)\n const allRequests = data.items || [];\n return allRequests.filter((r: APIKey) =>\n r.spec.apiProductRef?.name === apiProductName && r.status?.phase === 'Approved'\n );\n }, [namespace, apiProductName, kuadrantApi, refresh]);\n\n // fetch apiproduct to get available plans\n const { value: apiProduct, loading: productLoading } = useAsync(async () => {\n try {\n const data = await kuadrantApi.getApiProducts();\n return data.items?.find(\n (p: APIProduct) =>\n p.metadata.namespace === namespace &&\n p.metadata.name === apiProductName,\n );\n } catch (err) {\n return null;\n }\n }, [namespace, apiProductName, kuadrantApi]);\n\n const resourceRef = apiProduct\n ? `apiproduct:${apiProduct.metadata.namespace}/${apiProduct.metadata.name}`\n : undefined;\n\n const { allowed: canCreateRequest, loading: permissionLoading } = useKuadrantPermission(\n kuadrantApiKeyCreatePermission,\n resourceRef,\n );\n\n const fetchApiKeyFromSecret = async (requestNamespace: string, requestName: string) => {\n const key = `${requestNamespace}/${requestName}`;\n if (apiKeyLoading.has(key)) {\n return;\n }\n\n setApiKeyLoading((prev) => new Set(prev).add(key));\n try {\n const data = await kuadrantApi.getApiKeySecret(requestNamespace, requestName);\n setApiKeyValues((prev) => new Map(prev).set(key, data.apiKey));\n setAlreadyReadKeys((prev) => new Set(prev).add(key));\n } catch (err) {\n console.error('failed to fetch api key:', err);\n const errorMessage = err instanceof Error ? err.message : \"unknown error occurred\";\n if (errorMessage.includes(\"403\") || errorMessage.includes(\"already been viewed\")) {\n setAlreadyReadKeys((prev) => new Set(prev).add(key));\n alertApi.post({\n message: 'This API key has already been viewed and cannot be retrieved again.',\n severity: 'warning',\n display: 'transient',\n });\n } else {\n alertApi.post({\n message: `Failed to fetch APIKey. ${errorMessage}`,\n severity: 'error',\n display: 'transient',\n });\n }\n } finally {\n setApiKeyLoading((prev) => {\n const next = new Set(prev);\n next.delete(key);\n return next;\n });\n }\n };\n\n const clearApiKeyValue = (requestNamespace: string, requestName: string) => {\n const key = `${requestNamespace}/${requestName}`;\n setApiKeyValues((prev) => {\n const next = new Map(prev);\n next.delete(key);\n return next;\n });\n };\n\n const toggleVisibility = (keyName: string) => {\n setVisibleKeys((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(keyName)) {\n newSet.delete(keyName);\n } else {\n newSet.add(keyName);\n }\n return newSet;\n });\n };\n\n const loading = keysLoading || productLoading || permissionLoading;\n\n if (loading) {\n return (\n <InfoCard title=\"Kuadrant API Keys\">\n <Box p={2}>\n <Skeleton variant=\"text\" width=\"80%\" />\n <Skeleton variant=\"text\" width=\"60%\" />\n <Skeleton variant=\"text\" width=\"70%\" />\n </Box>\n </InfoCard>\n );\n }\n\n if (keysError) {\n return <ResponseErrorPanel error={keysError} />;\n }\n\n const keys = (requests as APIKey[]) || [];\n const plans = (apiProduct?.status?.discoveredPlans || []) as Plan[];\n const canRequest = canCreateRequest && plans.length > 0;\n\n const renderKeyRow = (request: APIKey) => {\n const key = `${request.metadata.namespace}/${request.metadata.name}`;\n const isVisible = visibleKeys.has(request.metadata.name);\n const isLoading = apiKeyLoading.has(key);\n const apiKeyValue = apiKeyValues.get(key);\n const hasSecretRef = request.status?.secretRef?.name;\n const canReadSecret = request.status?.canReadSecret !== false;\n const isAlreadyRead = alreadyReadKeys.has(key) || !canReadSecret;\n\n const handleRevealClick = () => {\n if (isVisible) {\n clearApiKeyValue(request.metadata.namespace, request.metadata.name);\n toggleVisibility(request.metadata.name);\n } else if (!isAlreadyRead) {\n setPendingKeyReveal({\n namespace: request.metadata.namespace,\n name: request.metadata.name,\n });\n setShowOnceWarningOpen(true);\n }\n };\n\n const handleCopy = async () => {\n if (apiKeyValue) {\n await navigator.clipboard.writeText(apiKeyValue);\n alertApi.post({\n message: 'API key copied to clipboard',\n severity: 'success',\n display: 'transient',\n });\n }\n };\n\n return (\n <Box\n key={request.metadata.name}\n mb={1}\n p={1.5}\n border={1}\n borderColor=\"grey.300\"\n borderRadius={4}\n >\n <Box display=\"flex\" justifyContent=\"space-between\" alignItems=\"center\" mb={1}>\n <Typography variant=\"body2\" style={{ fontWeight: 500 }}>\n {request.metadata.name}\n </Typography>\n <Chip label={request.spec.planTier} color=\"primary\" size=\"small\" />\n </Box>\n {hasSecretRef && (\n <Box display=\"flex\" alignItems=\"center\">\n <Typography\n variant=\"body2\"\n style={{\n fontFamily: 'monospace',\n fontSize: '0.8rem',\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {isLoading\n ? 'Loading...'\n : isVisible && apiKeyValue\n ? apiKeyValue\n : isAlreadyRead && !apiKeyValue\n ? 'Already viewed'\n : '••••••••••••••••'}\n </Typography>\n {isVisible && apiKeyValue && (\n <Tooltip title=\"Copy to clipboard\">\n <IconButton size=\"small\" onClick={handleCopy}>\n <FileCopyIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n <Tooltip\n title={\n isAlreadyRead && !apiKeyValue\n ? 'Key already viewed'\n : isVisible\n ? 'Hide API key'\n : 'Reveal API key (one-time only)'\n }\n >\n <span>\n <IconButton\n size=\"small\"\n onClick={handleRevealClick}\n disabled={isLoading || (isAlreadyRead && !apiKeyValue)}\n >\n {isVisible ? <VisibilityOffIcon fontSize=\"small\" /> : <VisibilityIcon fontSize=\"small\" />}\n </IconButton>\n </span>\n </Tooltip>\n </Box>\n )}\n </Box>\n );\n };\n\n return (\n <>\n <InfoCard title=\"Kuadrant API Keys\">\n <Box p={2}>\n {keys.length > 0 ? (\n <>\n <Typography variant=\"body2\" color=\"textSecondary\" gutterBottom>\n {keys.length} active key{keys.length !== 1 ? 's' : ''}\n </Typography>\n {keys.map(renderKeyRow)}\n </>\n ) : (\n <Typography variant=\"body1\" gutterBottom>\n You don't have any API keys for this API yet\n </Typography>\n )}\n <Box mt={2}>\n {canRequest ? (\n <Button\n variant=\"contained\"\n color=\"primary\"\n size=\"small\"\n startIcon={<AddIcon />}\n onClick={() => setRequestDialogOpen(true)}\n data-testid=\"request-api-access-button\"\n >\n Request API Access\n </Button>\n ) : (\n <Typography variant=\"caption\" color=\"textSecondary\">\n Visit the API Keys tab to view and manage access\n </Typography>\n )}\n </Box>\n </Box>\n </InfoCard>\n\n <RequestAccessDialog\n open={requestDialogOpen}\n onClose={() => setRequestDialogOpen(false)}\n onSuccess={() => {\n setRequestDialogOpen(false);\n setRefresh((r) => r + 1);\n }}\n apiProductName={apiProductName}\n namespace={namespace}\n userEmail={userEmail}\n plans={plans}\n />\n\n <Dialog\n open={showOnceWarningOpen}\n onClose={() => {\n setShowOnceWarningOpen(false);\n setPendingKeyReveal(null);\n }}\n maxWidth=\"sm\"\n >\n <DialogTitle>\n <Box display=\"flex\" alignItems=\"center\">\n <WarningIcon color=\"primary\" style={{ marginRight: 8 }} />\n View API Key\n </Box>\n </DialogTitle>\n <DialogContent>\n <Typography variant=\"body1\" paragraph>\n This API key can only be viewed <strong>once</strong>. After you\n reveal it, you will not be able to retrieve it again.\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Make sure to copy and store it securely before closing this view.\n </Typography>\n </DialogContent>\n <DialogActions>\n <Button\n onClick={() => {\n setShowOnceWarningOpen(false);\n setPendingKeyReveal(null);\n }}\n >\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={() => {\n if (pendingKeyReveal) {\n fetchApiKeyFromSecret(\n pendingKeyReveal.namespace,\n pendingKeyReveal.name,\n );\n toggleVisibility(pendingKeyReveal.name);\n }\n setShowOnceWarningOpen(false);\n setPendingKeyReveal(null);\n }}\n >\n Reveal API Key\n </Button>\n </DialogActions>\n </Dialog>\n </>\n );\n};\n","import React from 'react';\nimport ApiOutlined from '@mui/icons-material/ApiOutlined';\nimport KeyOutlined from '@mui/icons-material/KeyOutlined';\nimport ApprovalOutlined from '@mui/icons-material/ApprovalOutlined';\nimport { SvgIconProps } from '@mui/material/SvgIcon';\n\nexport const ApiIcon = (props: SvgIconProps) => <ApiOutlined {...props} />;\nexport const KeyIcon = (props: SvgIconProps) => <KeyOutlined {...props} />;\nexport const ApprovalIcon = (props: SvgIconProps) => <ApprovalOutlined {...props} />;\n","import {\n createApiFactory,\n discoveryApiRef,\n fetchApiRef,\n identityApiRef,\n} from '@backstage/core-plugin-api';\nimport { kuadrantApiRef, KuadrantApiClient } from './api';\n\n/**\n * API factory for the Kuadrant plugin\n * This factory creates and configures the KuadrantApiClient with required dependencies\n */\nexport const kuadrantApiFactory = createApiFactory({\n api: kuadrantApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n fetchApi: fetchApiRef,\n identityApi: identityApiRef,\n },\n factory: ({ discoveryApi, fetchApi, identityApi }) =>\n new KuadrantApiClient({ discoveryApi, fetchApi, identityApi }),\n});\n","import { createRouteRef, createSubRouteRef } from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n id: 'kuadrant',\n});\n\nexport const resourceRouteRef = createSubRouteRef({\n id: 'kuadrant/resource',\n parent: rootRouteRef,\n path: '/:kind/:namespace/:name',\n});\n","import {\n createPlugin,\n createRoutableExtension,\n createComponentExtension,\n} from '@backstage/core-plugin-api';\n\nimport { rootRouteRef, resourceRouteRef } from './routes';\n\nexport const kuadrantPlugin = createPlugin({\n id: 'kuadrant',\n routes: {\n root: rootRouteRef,\n resource: resourceRouteRef,\n },\n});\n\nexport const KuadrantPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'KuadrantPage',\n component: () =>\n import('./components/KuadrantPage').then(m => m.ApiProductsPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const ApiProductsPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiProductsPage',\n component: () =>\n import('./components/KuadrantPage').then(m => m.ApiProductsPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const MyApiKeysPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'MyApiKeysPage',\n component: () =>\n import('./components/MyApiKeysPage').then(m => m.MyApiKeysPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const ApiKeyApprovalPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiKeyApprovalPage',\n component: () =>\n import('./components/ApiKeyApprovalPage').then(m => m.ApiKeyApprovalPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const EntityKuadrantApiAccessCard = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiAccessCard',\n component: {\n lazy: () =>\n import('./components/ApiAccessCard').then(m => m.ApiAccessCard),\n },\n }),\n);\n\nexport const EntityKuadrantApiKeyManagementTab = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiKeyManagementTab',\n component: {\n lazy: () =>\n import('./components/ApiKeyManagementTab').then(m => m.ApiKeyManagementTab),\n },\n }),\n);\n\n// entity content extension for api keys tab\nexport const EntityKuadrantApiKeysContent = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiKeysContent',\n component: {\n lazy: () =>\n import('./components/ApiKeyManagementTab').then(m => m.ApiKeyManagementTab),\n },\n }),\n);\n\nexport const EntityKuadrantApiProductInfoContent = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiProductInfoContent',\n component: {\n lazy: () =>\n import('./components/ApiProductInfoCard').then(m => m.ApiProductInfoCard),\n },\n }),\n);\n\nexport const ApiKeyDetailPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiKeyDetailPage',\n component: () =>\n import('./components/ApiKeyDetailPage').then(m => m.ApiKeyDetailPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const EntityKuadrantApiApprovalTab = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiApprovalTab',\n component: {\n lazy: () =>\n import('./components/EntityApiApprovalTab').then(m => m.EntityApiApprovalTab),\n },\n }),\n);\n\nexport const EntityKuadrantApiProductOpenApiAlert = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiProductOpenApiAlert',\n component: {\n lazy: () =>\n import('./components/ApiProductOpenApiAlert').then(m => m.ApiProductOpenApiAlert),\n },\n }),\n);\n\nexport const ApiProductDetailPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiProductDetailPage',\n component: () =>\n import('./components/ApiProductDetailPage').then(m => m.ApiProductDetailPage),\n mountPoint: rootRouteRef,\n }),\n);\n"],"names":["KuadrantIcon","props","SvgIcon","viewBox","sx","transform","marginLeft","path","d","fill","rect","x","y","width","height","useStyles","makeStyles","theme","label","fontWeight","color","palette","text","secondary","marginBottom","spacing","fontSize","textTransform","ApiProductInfoCard","entity","apiProduct","classes","useEntity","kuadrantApi","useApi","kuadrantApiRef","identityApi","identityApiRef","allowed","canReadAll","loading","permLoading","useKuadrantPermission","kuadrantApiProductReadAllPermission","namespace","metadata","annotations","apiProductName","value","currentUserId","useAsync","async","getBackstageIdentity","userEntityRef","split","error","getApiProduct","owner","ownerUserId","canView","InfoCard","title","Typography","Progress","Box","p","variant","message","includes","ResponseErrorPanel","authSchemes","status","discoveredAuthScheme","authentication","jwtScheme","Object","values","find","scheme","hasOwnProperty","hasOidc","Boolean","jwtIssuer","jwt","issuerUrl","jwtTokenEndpoint","oidcDiscovery","tokenEndpoint","mb","className","spec","displayName","ApiProductDetails","product","showStatus","showCatalogLink","mt","OidcProviderCard","ApiAccessCard","propNamespace","alertApi","alertApiRef","userEmail","setUserEmail","useState","requestDialogOpen","setRequestDialogOpen","refresh","setRefresh","visibleKeys","setVisibleKeys","Set","apiKeyValues","setApiKeyValues","Map","apiKeyLoading","setApiKeyLoading","alreadyReadKeys","setAlreadyReadKeys","showOnceWarningOpen","setShowOnceWarningOpen","pendingKeyReveal","setPendingKeyReveal","name","profile","getProfileInfo","email","requests","keysLoading","keysError","getRequestsByNamespace","items","filter","r","apiProductRef","phase","productLoading","data","getApiProducts","err","resourceRef","undefined","canCreateRequest","permissionLoading","kuadrantApiKeyCreatePermission","toggleVisibility","keyName","prev","newSet","has","delete","add","Skeleton","keys","plans","discoveredPlans","canRequest","length","gutterBottom","map","request","key","isVisible","isLoading","apiKeyValue","get","hasSecretRef","secretRef","canReadSecret","isAlreadyRead","border","borderColor","borderRadius","display","justifyContent","alignItems","style","Chip","planTier","size","fontFamily","flex","overflow","textOverflow","Tooltip","IconButton","onClick","navigator","clipboard","writeText","post","severity","FileCopyIcon","span","requestNamespace","requestName","next","clearApiKeyValue","disabled","VisibilityOffIcon","VisibilityIcon","Button","startIcon","AddIcon","data-testid","RequestAccessDialog","open","onClose","onSuccess","Dialog","maxWidth","DialogTitle","WarningIcon","marginRight","DialogContent","paragraph","strong","DialogActions","getApiKeySecret","set","apiKey","console","errorMessage","Error","fetchApiKeyFromSecret","ApiIcon","ApiOutlined","KeyIcon","KeyOutlined","ApprovalIcon","ApprovalOutlined","kuadrantApiFactory","createApiFactory","api","deps","discoveryApi","discoveryApiRef","fetchApi","fetchApiRef","factory","KuadrantApiClient","rootRouteRef","createRouteRef","id","resourceRouteRef","createSubRouteRef","parent","kuadrantPlugin","createPlugin","routes","root","resource","KuadrantPage","provide","createRoutableExtension","component","then","m","ApiProductsPage","mountPoint","MyApiKeysPage","ApiKeyApprovalPage","EntityKuadrantApiAccessCard","createComponentExtension","lazy","EntityKuadrantApiKeyManagementTab","ApiKeyManagementTab","EntityKuadrantApiKeysContent","EntityKuadrantApiProductInfoContent","ApiKeyDetailPage","EntityKuadrantApiApprovalTab","EntityApiApprovalTab","EntityKuadrantApiProductOpenApiAlert","ApiProductOpenApiAlert","ApiProductDetailPage"],"sourceRoot":""}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|