@kuadrant/kuadrant-backstage-plugin-frontend 0.0.2-dev-7d09bfa → 0.0.2-dev-e6e0dbf
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/index.d.ts +1 -4
- package/dist/index.esm.js +1 -2
- package/dist/index.esm.js.map +1 -1
- package/dist/plugin.esm.js +1 -9
- package/dist/plugin.esm.js.map +1 -1
- package/dist-scalprum/internal.plugin-kuadrant.1ec7b1dc71663b4b9a17.js +2 -0
- package/dist-scalprum/internal.plugin-kuadrant.1ec7b1dc71663b4b9a17.js.map +1 -0
- package/dist-scalprum/plugin-manifest.json +2 -2
- package/dist-scalprum/static/1085.d17e689a.chunk.js +3 -0
- package/dist-scalprum/static/1085.d17e689a.chunk.js.map +1 -0
- package/dist-scalprum/static/1645.db086648.chunk.js +3 -0
- package/dist-scalprum/static/{5568.5dbce633.chunk.js.LICENSE.txt → 1645.db086648.chunk.js.LICENSE.txt} +0 -9
- package/dist-scalprum/static/1645.db086648.chunk.js.map +1 -0
- package/dist-scalprum/static/2233.bf0c10d7.chunk.js +3 -0
- package/dist-scalprum/static/2233.bf0c10d7.chunk.js.LICENSE.txt +9 -0
- package/dist-scalprum/static/2233.bf0c10d7.chunk.js.map +1 -0
- package/dist-scalprum/static/2628.20156dc1.chunk.js +3 -0
- package/dist-scalprum/static/2628.20156dc1.chunk.js.map +1 -0
- package/dist-scalprum/static/2946.a35243f1.chunk.js +3 -0
- package/dist-scalprum/static/{9510.e4112e19.chunk.js.LICENSE.txt → 2946.a35243f1.chunk.js.LICENSE.txt} +10 -0
- package/dist-scalprum/static/2946.a35243f1.chunk.js.map +1 -0
- package/dist-scalprum/static/2952.b3c7e41c.chunk.js +2 -0
- package/dist-scalprum/static/2952.b3c7e41c.chunk.js.map +1 -0
- package/dist-scalprum/static/{2967.8d9c1b1f.chunk.js → 2967.6a1db3ad.chunk.js} +2 -2
- package/dist-scalprum/static/2967.6a1db3ad.chunk.js.map +1 -0
- package/dist-scalprum/static/3091.9a74ea5f.chunk.js +2 -0
- package/dist-scalprum/static/{65.0e01be7c.chunk.js.map → 3091.9a74ea5f.chunk.js.map} +1 -1
- package/dist-scalprum/static/{327.cd6b3fee.chunk.js → 327.a9a99299.chunk.js} +2 -2
- package/dist-scalprum/static/327.a9a99299.chunk.js.map +1 -0
- package/dist-scalprum/static/3504.1c2f2e54.chunk.js +3 -0
- package/dist-scalprum/static/3504.1c2f2e54.chunk.js.LICENSE.txt +9 -0
- package/dist-scalprum/static/3504.1c2f2e54.chunk.js.map +1 -0
- package/dist-scalprum/static/3657.882640ca.chunk.js +3 -0
- package/dist-scalprum/static/3657.882640ca.chunk.js.LICENSE.txt +8 -0
- package/dist-scalprum/static/3657.882640ca.chunk.js.map +1 -0
- package/dist-scalprum/static/3954.12dd8006.chunk.js +3 -0
- package/dist-scalprum/static/3954.12dd8006.chunk.js.LICENSE.txt +9 -0
- package/dist-scalprum/static/3954.12dd8006.chunk.js.map +1 -0
- package/dist-scalprum/static/3984.647ef00c.chunk.js +2 -0
- package/dist-scalprum/static/3984.647ef00c.chunk.js.map +1 -0
- package/dist-scalprum/static/4026.d652a7a1.chunk.js +2 -0
- package/dist-scalprum/static/4026.d652a7a1.chunk.js.map +1 -0
- package/dist-scalprum/static/{6386.6386.ce38cef3.css → 4093.4093.3597955d.css} +1 -1
- package/dist-scalprum/static/4093.4093.3597955d.css.map +1 -0
- package/dist-scalprum/static/4093.ee6f0452.chunk.js +3 -0
- package/dist-scalprum/static/4093.ee6f0452.chunk.js.map +1 -0
- package/dist-scalprum/static/4382.a7363415.chunk.js +3 -0
- package/dist-scalprum/static/4382.a7363415.chunk.js.map +1 -0
- package/dist-scalprum/static/4614.23f2a85b.chunk.js +2 -0
- package/dist-scalprum/static/4614.23f2a85b.chunk.js.map +1 -0
- package/dist-scalprum/static/{4682.3c7098a8.chunk.js → 4682.bd2dfccd.chunk.js} +2 -2
- package/dist-scalprum/static/4682.bd2dfccd.chunk.js.map +1 -0
- package/dist-scalprum/static/4935.e14465ff.chunk.js +3 -0
- package/dist-scalprum/static/4935.e14465ff.chunk.js.LICENSE.txt +9 -0
- package/dist-scalprum/static/4935.e14465ff.chunk.js.map +1 -0
- package/dist-scalprum/static/5010.0cd6c959.chunk.js +3 -0
- package/dist-scalprum/static/5010.0cd6c959.chunk.js.map +1 -0
- package/dist-scalprum/static/{5203.43732b3f.chunk.js → 5203.539ed3ec.chunk.js} +2 -2
- package/dist-scalprum/static/{5203.43732b3f.chunk.js.map → 5203.539ed3ec.chunk.js.map} +1 -1
- package/dist-scalprum/static/{5453.b3ee2392.chunk.js → 5453.ecdee66d.chunk.js} +2 -2
- package/dist-scalprum/static/{5453.b3ee2392.chunk.js.map → 5453.ecdee66d.chunk.js.map} +1 -1
- package/dist-scalprum/static/6038.63d1f832.chunk.js +3 -0
- package/dist-scalprum/static/6038.63d1f832.chunk.js.LICENSE.txt +8 -0
- package/dist-scalprum/static/6038.63d1f832.chunk.js.map +1 -0
- package/dist-scalprum/static/635.e030b18a.chunk.js +3 -0
- package/dist-scalprum/static/635.e030b18a.chunk.js.LICENSE.txt +9 -0
- package/dist-scalprum/static/635.e030b18a.chunk.js.map +1 -0
- package/dist-scalprum/static/6371.d45f37cc.chunk.js +2 -0
- package/dist-scalprum/static/6371.d45f37cc.chunk.js.map +1 -0
- package/dist-scalprum/static/{6800.8ec3a2eb.chunk.js → 6800.6e2a08fe.chunk.js} +2 -2
- package/dist-scalprum/static/{6800.8ec3a2eb.chunk.js.map → 6800.6e2a08fe.chunk.js.map} +1 -1
- package/dist-scalprum/static/{6840.6cc88a16.chunk.js → 6840.3bd67cf4.chunk.js} +2 -2
- package/dist-scalprum/static/{6840.6cc88a16.chunk.js.map → 6840.3bd67cf4.chunk.js.map} +1 -1
- package/dist-scalprum/static/7164.5dc4bc72.chunk.js +2 -0
- package/dist-scalprum/static/7164.5dc4bc72.chunk.js.map +1 -0
- package/dist-scalprum/static/{7791.55db7365.chunk.js → 7791.8135d440.chunk.js} +2 -2
- package/dist-scalprum/static/{7791.55db7365.chunk.js.map → 7791.8135d440.chunk.js.map} +1 -1
- package/dist-scalprum/static/8083.4763f88b.chunk.js +206 -0
- package/dist-scalprum/static/8083.4763f88b.chunk.js.LICENSE.txt +9 -0
- package/dist-scalprum/static/8083.4763f88b.chunk.js.map +1 -0
- package/dist-scalprum/static/{8172.e89bbae7.chunk.js → 8172.cbe1f2c4.chunk.js} +2 -2
- package/dist-scalprum/static/8172.cbe1f2c4.chunk.js.map +1 -0
- package/dist-scalprum/static/{8799.4ea4639c.chunk.js → 8799.83d049f3.chunk.js} +2 -2
- package/dist-scalprum/static/{8799.4ea4639c.chunk.js.map → 8799.83d049f3.chunk.js.map} +1 -1
- package/dist-scalprum/static/{3587.490690d6.chunk.js → 9316.d9f2fe18.chunk.js} +2 -2
- package/dist-scalprum/static/{3587.490690d6.chunk.js.map → 9316.d9f2fe18.chunk.js.map} +1 -1
- package/dist-scalprum/static/{5568.5dbce633.chunk.js → 9655.db0c82b2.chunk.js} +3 -3
- package/dist-scalprum/static/9655.db0c82b2.chunk.js.LICENSE.txt +8 -0
- package/dist-scalprum/static/9655.db0c82b2.chunk.js.map +1 -0
- package/dist-scalprum/static/9710.7ec34777.chunk.js +2 -0
- package/dist-scalprum/static/9710.7ec34777.chunk.js.map +1 -0
- package/dist-scalprum/static/{4302.9a59485e.chunk.js → 9738.b037daf3.chunk.js} +2 -2
- package/dist-scalprum/static/9738.b037daf3.chunk.js.map +1 -0
- package/dist-scalprum/static/exposed-PluginRoot.c3fd0cc1.chunk.js +2 -0
- package/dist-scalprum/static/exposed-PluginRoot.c3fd0cc1.chunk.js.map +1 -0
- package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_http.a55e168b.chunk.js +2 -0
- package/dist-scalprum/static/{react-syntax-highlighter_languages_highlight_http.5859273c.chunk.js.map → react-syntax-highlighter_languages_highlight_http.a55e168b.chunk.js.map} +1 -1
- package/package.json +10 -11
- package/dist/components/ApprovalQueueCard/ApprovalQueueCard.esm.js +0 -761
- package/dist/components/ApprovalQueueCard/ApprovalQueueCard.esm.js.map +0 -1
- package/dist/components/ApprovalQueueCard/index.esm.js +0 -2
- package/dist/components/ApprovalQueueCard/index.esm.js.map +0 -1
- package/dist-scalprum/internal.plugin-kuadrant.5d9e1e73c7f21bbed39a.js +0 -2
- package/dist-scalprum/internal.plugin-kuadrant.5d9e1e73c7f21bbed39a.js.map +0 -1
- package/dist-scalprum/static/1994.19e6a1c5.chunk.js +0 -3
- package/dist-scalprum/static/1994.19e6a1c5.chunk.js.map +0 -1
- package/dist-scalprum/static/2628.0605e07f.chunk.js +0 -3
- package/dist-scalprum/static/2628.0605e07f.chunk.js.map +0 -1
- package/dist-scalprum/static/2752.df63f31c.chunk.js +0 -2
- package/dist-scalprum/static/2752.df63f31c.chunk.js.map +0 -1
- package/dist-scalprum/static/2967.8d9c1b1f.chunk.js.map +0 -1
- package/dist-scalprum/static/3097.582b68d3.chunk.js +0 -2
- package/dist-scalprum/static/3097.582b68d3.chunk.js.map +0 -1
- package/dist-scalprum/static/327.cd6b3fee.chunk.js.map +0 -1
- package/dist-scalprum/static/3584.c820a5c7.chunk.js +0 -2
- package/dist-scalprum/static/3584.c820a5c7.chunk.js.map +0 -1
- package/dist-scalprum/static/3647.67079e5f.chunk.js +0 -2
- package/dist-scalprum/static/3647.67079e5f.chunk.js.map +0 -1
- package/dist-scalprum/static/3984.7bc07774.chunk.js +0 -2
- package/dist-scalprum/static/3984.7bc07774.chunk.js.map +0 -1
- package/dist-scalprum/static/4302.9a59485e.chunk.js.map +0 -1
- package/dist-scalprum/static/4682.3c7098a8.chunk.js.map +0 -1
- package/dist-scalprum/static/5010.2228c754.chunk.js +0 -3
- package/dist-scalprum/static/5010.2228c754.chunk.js.map +0 -1
- package/dist-scalprum/static/5568.5dbce633.chunk.js.map +0 -1
- package/dist-scalprum/static/6272.ef31cb1c.chunk.js +0 -2
- package/dist-scalprum/static/6272.ef31cb1c.chunk.js.map +0 -1
- package/dist-scalprum/static/6371.c4899d73.chunk.js +0 -3
- package/dist-scalprum/static/6371.c4899d73.chunk.js.map +0 -1
- package/dist-scalprum/static/6386.6386.ce38cef3.css.map +0 -1
- package/dist-scalprum/static/6386.903891f3.chunk.js +0 -3
- package/dist-scalprum/static/6386.903891f3.chunk.js.map +0 -1
- package/dist-scalprum/static/65.0e01be7c.chunk.js +0 -2
- package/dist-scalprum/static/6753.76832e72.chunk.js +0 -2
- package/dist-scalprum/static/6753.76832e72.chunk.js.map +0 -1
- package/dist-scalprum/static/8172.e89bbae7.chunk.js.map +0 -1
- package/dist-scalprum/static/8627.111cbac9.chunk.js +0 -2
- package/dist-scalprum/static/8627.111cbac9.chunk.js.map +0 -1
- package/dist-scalprum/static/9510.e4112e19.chunk.js +0 -3
- package/dist-scalprum/static/9510.e4112e19.chunk.js.map +0 -1
- package/dist-scalprum/static/9644.7d342123.chunk.js +0 -2
- package/dist-scalprum/static/9644.7d342123.chunk.js.map +0 -1
- package/dist-scalprum/static/993.c164940e.chunk.js +0 -2
- package/dist-scalprum/static/993.c164940e.chunk.js.map +0 -1
- package/dist-scalprum/static/exposed-PluginRoot.5b6638e2.chunk.js +0 -2
- package/dist-scalprum/static/exposed-PluginRoot.5b6638e2.chunk.js.map +0 -1
- package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_http.5859273c.chunk.js +0 -2
- /package/dist-scalprum/static/{6371.c4899d73.chunk.js.LICENSE.txt → 1085.d17e689a.chunk.js.LICENSE.txt} +0 -0
- /package/dist-scalprum/static/{2628.0605e07f.chunk.js.LICENSE.txt → 2628.20156dc1.chunk.js.LICENSE.txt} +0 -0
- /package/dist-scalprum/static/{6386.903891f3.chunk.js.LICENSE.txt → 4093.ee6f0452.chunk.js.LICENSE.txt} +0 -0
- /package/dist-scalprum/static/{1994.19e6a1c5.chunk.js.LICENSE.txt → 4382.a7363415.chunk.js.LICENSE.txt} +0 -0
- /package/dist-scalprum/static/{5010.2228c754.chunk.js.LICENSE.txt → 5010.0cd6c959.chunk.js.LICENSE.txt} +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[5203],{14933:(e,a,t)=>{t.d(a,{c:()=>x});var n=t(31085),i=t(95478),r=t(76891),s=t(61477),l=t(46805),o=t(10394),d=t(72501),c=t(95061),u=t(48543),p=t(81215),m=t(26343),y=t(16249),h=t(93453),A=t(64947),b=t(78467),v=t(39053),f=t(22097);const x=({open:e,onClose:a,onSuccess:t,apiProductName:x,namespace:k,userEmail:j,plans:g})=>{const w=(0,f.useApi)(f.configApiRef),S=(0,f.useApi)(f.fetchApiRef),I=(0,f.useApi)(f.alertApiRef),P=w.getString("backend.baseUrl"),[C,$]=(0,i.useState)(""),[R,T]=(0,i.useState)(""),[q,z]=(0,i.useState)(!1),[E,K]=(0,i.useState)(null),W=()=>{$(""),T(""),K(null),a()};return(0,n.jsxs)(r.A,{open:e,onClose:W,maxWidth:"sm",fullWidth:!0,children:[(0,n.jsx)(s.A,{children:"Request API Access"}),(0,n.jsxs)(l.A,{children:[(0,n.jsxs)(o.A,{mb:2,p:1.5,bgcolor:"info.light",borderRadius:1,display:"flex",alignItems:"flex-start",style:{gap:8},children:[(0,n.jsx)(v.A,{color:"primary",fontSize:"small",style:{marginTop:2}}),(0,n.jsx)(d.A,{variant:"body2",children:"Your request will be reviewed by an API owner before access is granted."})]}),E&&(0,n.jsx)(o.A,{mb:2,p:2,bgcolor:"error.main",color:"error.contrastText",borderRadius:1,children:(0,n.jsx)(d.A,{variant:"body2",children:E})}),(0,n.jsxs)(c.A,{fullWidth:!0,margin:"normal",disabled:q,"data-testid":"tier-select-form",children:[(0,n.jsx)(u.A,{id:"tier-select-label",children:"Select Tier"}),(0,n.jsx)(p.A,{labelId:"tier-select-label","data-testid":"tier-select",value:C,onChange:e=>$(e.target.value),disabled:q,children:g.map(e=>{const a=Object.entries(e.limits||{}).map(([e,a])=>`${a} per ${e}`).join(", ");return(0,n.jsxs)(m.A,{value:e.tier,"data-testid":`tier-option-${e.tier}`,children:[e.tier," ",a?`(${a})`:""]},e.tier)})})]}),(0,n.jsx)(y.A,{label:"Use Case (optional)",placeholder:"Describe how you plan to use this API",multiline:!0,rows:3,fullWidth:!0,margin:"normal",value:R,onChange:e=>T(e.target.value),helperText:"Explain your intended use of this API for admin review",disabled:q})]}),(0,n.jsxs)(h.A,{children:[(0,n.jsx)(A.A,{onClick:W,disabled:q,children:"Cancel"}),(0,n.jsx)(A.A,{onClick:async()=>{if(C){z(!0),K(null);try{const e=await S.fetch(`${P}/api/kuadrant/requests`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiProductName:x,namespace:k,planTier:C,useCase:R.trim()||"",userEmail:j})});if(!e.ok){const a=await e.json().catch(()=>({}));throw new Error(a.error||`failed to create request: ${e.status}`)}I.post({message:"API key requested successfully",severity:"success",display:"transient"}),$(""),T(""),t()}catch(e){const a=e instanceof Error?e.message:"unknown error occurred";I.post({message:`Failed to request API key: ${a}`,severity:"error",display:"transient"}),K(a)}finally{z(!1)}}},color:"primary",variant:"contained",disabled:!C||q,startIcon:q?(0,n.jsx)(b.A,{size:16,color:"inherit"}):void 0,children:q?"Submitting...":"Submit Request"})]})]})}},34955:(e,a,t)=>{t.d(a,{Al:()=>s,DS:()=>m,EM:()=>d,FL:()=>r,J:()=>i,KV:()=>v,R_:()=>c,U3:()=>l,dp:()=>p,jH:()=>b,q0:()=>y,uL:()=>A,v_:()=>o,vs:()=>u,z4:()=>h});var n=t(83572);(0,n.i)({name:"kuadrant.planpolicy.create",attributes:{action:"create"}}),(0,n.i)({name:"kuadrant.planpolicy.read",attributes:{action:"read"}}),(0,n.i)({name:"kuadrant.planpolicy.update",attributes:{action:"update"}}),(0,n.i)({name:"kuadrant.planpolicy.delete",attributes:{action:"delete"}});const i=(0,n.i)({name:"kuadrant.planpolicy.list",attributes:{action:"read"}}),r=(0,n.i)({name:"kuadrant.apiproduct.create",attributes:{action:"create"}}),s=((0,n.i)({name:"kuadrant.apiproduct.read.own",attributes:{action:"read"}}),(0,n.i)({name:"kuadrant.apiproduct.read.all",attributes:{action:"read"}})),l=(0,n.i)({name:"kuadrant.apiproduct.update.own",attributes:{action:"update"}}),o=(0,n.i)({name:"kuadrant.apiproduct.update.all",attributes:{action:"update"}}),d=(0,n.i)({name:"kuadrant.apiproduct.delete.own",attributes:{action:"delete"}}),c=(0,n.i)({name:"kuadrant.apiproduct.delete.all",attributes:{action:"delete"}}),u=(0,n.i)({name:"kuadrant.apiproduct.list",attributes:{action:"read"}}),p=(0,n.i)({name:"kuadrant.apikey.create",attributes:{action:"create"},resourceType:"apiproduct"}),m=(0,n.i)({name:"kuadrant.apikey.read.own",attributes:{action:"read"}}),y=((0,n.i)({name:"kuadrant.apikey.read.all",attributes:{action:"read"}}),(0,n.i)({name:"kuadrant.apikey.update.own",attributes:{action:"update"}})),h=(0,n.i)({name:"kuadrant.apikey.update.all",attributes:{action:"update"}}),A=(0,n.i)({name:"kuadrant.apikey.delete.own",attributes:{action:"delete"}}),b=(0,n.i)({name:"kuadrant.apikey.delete.all",attributes:{action:"delete"}}),v=(0,n.i)({name:"kuadrant.apikey.approve",attributes:{action:"update"}})},46205:(e,a,t)=>{t.d(a,{W:()=>r,l:()=>i});var n=t(87421);function i(e,a){const t="resourceType"in e?{permission:e,resourceRef:a}:{permission:e},i=(0,n.J)(t);return{allowed:i.allowed,loading:i.loading,error:i.error}}function r(e,a,t,n){return!!n||!(!t||e!==a)}},60441:(e,a,t)=>{t.r(a),t.d(a,{ApiAccessCard:()=>$});var n=t(31085),i=t(95478),r=t(35015),s=t(86687),l=t(42367),o=t(96040),d=t(10394),c=t(72501),u=t(67720),p=t(71677),m=t(29365),y=t(64947),h=t(76891),A=t(61477),b=t(46805),v=t(93453),f=t(18466),x=t(32269),k=t(61524),j=t(99594),g=t(77225),w=t(22097),S=t(25467),I=t(14933),P=t(46205),C=t(34955);const $=({namespace:e})=>{var a,t,$;const{entity:R}=(0,S.tN)(),T=(0,w.useApi)(w.configApiRef),q=(0,w.useApi)(w.identityApiRef),z=(0,w.useApi)(w.fetchApiRef),E=(0,w.useApi)(w.alertApiRef),K=T.getString("backend.baseUrl"),[W,_]=(0,i.useState)(""),[F,M]=(0,i.useState)(!1),[N,O]=(0,i.useState)(0),[U,J]=(0,i.useState)(new Set),[L,V]=(0,i.useState)(new Map),[B,D]=(0,i.useState)(new Set),[H,Y]=(0,i.useState)(new Set),[G,Q]=(0,i.useState)(!1),[X,Z]=(0,i.useState)(null),ee=(null===(a=R.metadata.annotations)||void 0===a?void 0:a["kuadrant.io/apiproduct"])||R.metadata.name,ae=(null===(t=R.metadata.annotations)||void 0===t?void 0:t["kuadrant.io/namespace"])||e||"default";(0,r.A)(async()=>{const e=await q.getProfileInfo();_(e.email||"")},[q]);const{value:te,loading:ne,error:ie}=(0,r.A)(async()=>{const e=ae?`${K}/api/kuadrant/requests/my?namespace=${ae}`:`${K}/api/kuadrant/requests/my`,a=await z.fetch(e);if(!a.ok)throw new Error("failed to fetch api key requests");return((await a.json()).items||[]).filter(e=>{var a,t;return(null===(a=e.spec.apiProductRef)||void 0===a?void 0:a.name)===ee&&"Approved"===(null===(t=e.status)||void 0===t?void 0:t.phase)})},[ae,ee,K,z,N]),{value:re,loading:se}=(0,r.A)(async()=>{var e;const a=await z.fetch(`${K}/api/kuadrant/apiproducts`);return a.ok?null===(e=(await a.json()).items)||void 0===e?void 0:e.find(e=>e.metadata.namespace===ae&&e.metadata.name===ee):null},[ae,ee,z,K]),le=re?`apiproduct:${re.metadata.namespace}/${re.metadata.name}`:void 0,{allowed:oe,loading:de}=(0,P.l)(C.dp,le),ce=e=>{J(a=>{const t=new Set(a);return t.has(e)?t.delete(e):t.add(e),t})};if(ne||se||de)return(0,n.jsx)(s.k,{});if(ie)return(0,n.jsx)(l._,{error:ie});const ue=te||[],pe=(null==re||null===($=re.status)||void 0===$?void 0:$.discoveredPlans)||[],me=oe&&pe.length>0;return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.n,{title:"Kuadrant API Keys",children:(0,n.jsxs)(d.A,{p:2,children:[ue.length>0?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(c.A,{variant:"body2",color:"textSecondary",gutterBottom:!0,children:[ue.length," active key",1!==ue.length?"s":""]}),ue.map(e=>{var a,t,i;const r=`${e.metadata.namespace}/${e.metadata.name}`,s=U.has(e.metadata.name),l=B.has(r),o=L.get(r),y=null===(t=e.status)||void 0===t||null===(a=t.secretRef)||void 0===a?void 0:a.name,h=!1!==(null===(i=e.status)||void 0===i?void 0:i.canReadSecret),A=H.has(r)||!h;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)(c.A,{variant:"body2",style:{fontWeight:500},children:e.metadata.name}),(0,n.jsx)(u.A,{label:e.spec.planTier,color:"primary",size:"small"})]}),y&&(0,n.jsxs)(d.A,{display:"flex",alignItems:"center",children:[(0,n.jsx)(c.A,{variant:"body2",style:{fontFamily:"monospace",fontSize:"0.8rem",flex:1,overflow:"hidden",textOverflow:"ellipsis"},children:l?"Loading...":s&&o?o:A&&!o?"Already viewed":"••••••••••••••••"}),s&&o&&(0,n.jsx)(p.Ay,{title:"Copy to clipboard",children:(0,n.jsx)(m.A,{size:"small",onClick:async()=>{o&&(await navigator.clipboard.writeText(o),E.post({message:"API key copied to clipboard",severity:"success",display:"transient"}))},children:(0,n.jsx)(j.A,{fontSize:"small"})})}),(0,n.jsx)(p.Ay,{title:A&&!o?"Key already viewed":s?"Hide API key":"Reveal API key (one-time only)",children:(0,n.jsx)("span",{children:(0,n.jsx)(m.A,{size:"small",onClick:()=>{s?(((e,a)=>{const t=`${e}/${a}`;V(e=>{const a=new Map(e);return a.delete(t),a})})(e.metadata.namespace,e.metadata.name),ce(e.metadata.name)):A||(Z({namespace:e.metadata.namespace,name:e.metadata.name}),Q(!0))},disabled:l||A&&!o,children:s?(0,n.jsx)(k.A,{fontSize:"small"}):(0,n.jsx)(x.A,{fontSize:"small"})})})})]})]},e.metadata.name)})]}):(0,n.jsx)(c.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:me?(0,n.jsx)(y.A,{variant:"contained",color:"primary",size:"small",startIcon:(0,n.jsx)(f.A,{}),onClick:()=>M(!0),children:"Request API Access"}):(0,n.jsx)(c.A,{variant:"caption",color:"textSecondary",children:"Visit the API Keys tab to view and manage access"})})]})}),(0,n.jsx)(I.c,{open:F,onClose:()=>M(!1),onSuccess:()=>{M(!1),O(e=>e+1)},apiProductName:ee,namespace:ae,userEmail:W,plans:pe}),(0,n.jsxs)(h.A,{open:G,onClose:()=>{Q(!1),Z(null)},maxWidth:"sm",children:[(0,n.jsx)(A.A,{children:(0,n.jsxs)(d.A,{display:"flex",alignItems:"center",children:[(0,n.jsx)(g.A,{color:"primary",style:{marginRight:8}}),"View API Key"]})}),(0,n.jsxs)(b.A,{children:[(0,n.jsxs)(c.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)(c.A,{variant:"body2",color:"textSecondary",children:"Make sure to copy and store it securely before closing this view."})]}),(0,n.jsxs)(v.A,{children:[(0,n.jsx)(y.A,{onClick:()=>{Q(!1),Z(null)},children:"Cancel"}),(0,n.jsx)(y.A,{variant:"contained",color:"primary",onClick:()=>{X&&((async(e,a)=>{const t=`${e}/${a}`;if(!B.has(t)){D(e=>new Set(e).add(t));try{const n=await z.fetch(`${K}/api/kuadrant/apikeys/${e}/${a}/secret`);if(n.ok){const e=await n.json();V(a=>new Map(a).set(t,e.apiKey)),Y(e=>new Set(e).add(t))}else 403===n.status&&(Y(e=>new Set(e).add(t)),E.post({message:"This API key has already been viewed and cannot be retrieved again.",severity:"warning",display:"transient"}))}catch(e){console.error("failed to fetch api key:",e)}finally{D(e=>{const a=new Set(e);return a.delete(t),a})}}})(X.namespace,X.name),ce(X.name)),Q(!1),Z(null)},children:"Reveal API Key"})]})]})]})}}}]);
|
|
2
|
-
//# sourceMappingURL=5203.
|
|
1
|
+
"use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[5203],{14933:(e,a,t)=>{t.d(a,{c:()=>x});var n=t(31085),i=t(95478),r=t(76891),s=t(61477),l=t(46805),o=t(10394),d=t(72501),c=t(95061),u=t(48543),p=t(81215),m=t(26343),y=t(16249),h=t(93453),A=t(64947),b=t(78467),v=t(39053),f=t(22097);const x=({open:e,onClose:a,onSuccess:t,apiProductName:x,namespace:k,userEmail:j,plans:g})=>{const w=(0,f.useApi)(f.configApiRef),S=(0,f.useApi)(f.fetchApiRef),I=(0,f.useApi)(f.alertApiRef),P=w.getString("backend.baseUrl"),[C,$]=(0,i.useState)(""),[R,T]=(0,i.useState)(""),[q,z]=(0,i.useState)(!1),[E,K]=(0,i.useState)(null),W=()=>{$(""),T(""),K(null),a()};return(0,n.jsxs)(r.A,{open:e,onClose:W,maxWidth:"sm",fullWidth:!0,children:[(0,n.jsx)(s.A,{children:"Request API Access"}),(0,n.jsxs)(l.A,{children:[(0,n.jsxs)(o.A,{mb:2,p:1.5,bgcolor:"info.light",borderRadius:1,display:"flex",alignItems:"flex-start",style:{gap:8},children:[(0,n.jsx)(v.A,{color:"primary",fontSize:"small",style:{marginTop:2}}),(0,n.jsx)(d.A,{variant:"body2",children:"Your request will be reviewed by an API owner before access is granted."})]}),E&&(0,n.jsx)(o.A,{mb:2,p:2,bgcolor:"error.main",color:"error.contrastText",borderRadius:1,children:(0,n.jsx)(d.A,{variant:"body2",children:E})}),(0,n.jsxs)(c.A,{fullWidth:!0,margin:"normal",disabled:q,"data-testid":"tier-select-form",children:[(0,n.jsx)(u.A,{id:"tier-select-label",children:"Select Tier"}),(0,n.jsx)(p.A,{labelId:"tier-select-label","data-testid":"tier-select",value:C,onChange:e=>$(e.target.value),disabled:q,children:g.map(e=>{const a=Object.entries(e.limits||{}).map(([e,a])=>`${a} per ${e}`).join(", ");return(0,n.jsxs)(m.A,{value:e.tier,"data-testid":`tier-option-${e.tier}`,children:[e.tier," ",a?`(${a})`:""]},e.tier)})})]}),(0,n.jsx)(y.A,{label:"Use Case (optional)",placeholder:"Describe how you plan to use this API",multiline:!0,rows:3,fullWidth:!0,margin:"normal",value:R,onChange:e=>T(e.target.value),helperText:"Explain your intended use of this API for admin review",disabled:q})]}),(0,n.jsxs)(h.A,{children:[(0,n.jsx)(A.A,{onClick:W,disabled:q,children:"Cancel"}),(0,n.jsx)(A.A,{onClick:async()=>{if(C){z(!0),K(null);try{const e=await S.fetch(`${P}/api/kuadrant/requests`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiProductName:x,namespace:k,planTier:C,useCase:R.trim()||"",userEmail:j})});if(!e.ok){const a=await e.json().catch(()=>({}));throw new Error(a.error||`failed to create request: ${e.status}`)}I.post({message:"API key requested successfully",severity:"success",display:"transient"}),$(""),T(""),t()}catch(e){const a=e instanceof Error?e.message:"unknown error occurred";I.post({message:`Failed to request API key: ${a}`,severity:"error",display:"transient"}),K(a)}finally{z(!1)}}},color:"primary",variant:"contained",disabled:!C||q,startIcon:q?(0,n.jsx)(b.A,{size:16,color:"inherit"}):void 0,children:q?"Submitting...":"Submit Request"})]})]})}},34955:(e,a,t)=>{t.d(a,{Al:()=>s,DS:()=>m,EM:()=>d,FL:()=>r,J:()=>i,KV:()=>v,R_:()=>c,U3:()=>l,dp:()=>p,jH:()=>b,q0:()=>y,uL:()=>A,v_:()=>o,vs:()=>u,z4:()=>h});var n=t(83572);(0,n.i)({name:"kuadrant.planpolicy.create",attributes:{action:"create"}}),(0,n.i)({name:"kuadrant.planpolicy.read",attributes:{action:"read"}}),(0,n.i)({name:"kuadrant.planpolicy.update",attributes:{action:"update"}}),(0,n.i)({name:"kuadrant.planpolicy.delete",attributes:{action:"delete"}});const i=(0,n.i)({name:"kuadrant.planpolicy.list",attributes:{action:"read"}}),r=(0,n.i)({name:"kuadrant.apiproduct.create",attributes:{action:"create"}}),s=((0,n.i)({name:"kuadrant.apiproduct.read.own",attributes:{action:"read"}}),(0,n.i)({name:"kuadrant.apiproduct.read.all",attributes:{action:"read"}})),l=(0,n.i)({name:"kuadrant.apiproduct.update.own",attributes:{action:"update"}}),o=(0,n.i)({name:"kuadrant.apiproduct.update.all",attributes:{action:"update"}}),d=(0,n.i)({name:"kuadrant.apiproduct.delete.own",attributes:{action:"delete"}}),c=(0,n.i)({name:"kuadrant.apiproduct.delete.all",attributes:{action:"delete"}}),u=(0,n.i)({name:"kuadrant.apiproduct.list",attributes:{action:"read"}}),p=(0,n.i)({name:"kuadrant.apikey.create",attributes:{action:"create"},resourceType:"apiproduct"}),m=(0,n.i)({name:"kuadrant.apikey.read.own",attributes:{action:"read"}}),y=((0,n.i)({name:"kuadrant.apikey.read.all",attributes:{action:"read"}}),(0,n.i)({name:"kuadrant.apikey.update.own",attributes:{action:"update"}})),h=(0,n.i)({name:"kuadrant.apikey.update.all",attributes:{action:"update"}}),A=(0,n.i)({name:"kuadrant.apikey.delete.own",attributes:{action:"delete"}}),b=(0,n.i)({name:"kuadrant.apikey.delete.all",attributes:{action:"delete"}}),v=(0,n.i)({name:"kuadrant.apikey.approve",attributes:{action:"update"}})},46205:(e,a,t)=>{t.d(a,{W:()=>r,l:()=>i});var n=t(24217);function i(e,a){const t="resourceType"in e?{permission:e,resourceRef:a}:{permission:e},i=(0,n.J)(t);return{allowed:i.allowed,loading:i.loading,error:i.error}}function r(e,a,t,n){return!!n||!(!t||e!==a)}},60441:(e,a,t)=>{t.r(a),t.d(a,{ApiAccessCard:()=>$});var n=t(31085),i=t(95478),r=t(35015),s=t(86687),l=t(42367),o=t(96040),d=t(10394),c=t(72501),u=t(67720),p=t(71677),m=t(29365),y=t(64947),h=t(76891),A=t(61477),b=t(46805),v=t(93453),f=t(18466),x=t(32269),k=t(61524),j=t(99594),g=t(77225),w=t(22097),S=t(25467),I=t(14933),P=t(46205),C=t(34955);const $=({namespace:e})=>{var a,t,$;const{entity:R}=(0,S.tN)(),T=(0,w.useApi)(w.configApiRef),q=(0,w.useApi)(w.identityApiRef),z=(0,w.useApi)(w.fetchApiRef),E=(0,w.useApi)(w.alertApiRef),K=T.getString("backend.baseUrl"),[W,_]=(0,i.useState)(""),[F,M]=(0,i.useState)(!1),[N,O]=(0,i.useState)(0),[U,J]=(0,i.useState)(new Set),[L,V]=(0,i.useState)(new Map),[B,D]=(0,i.useState)(new Set),[H,Y]=(0,i.useState)(new Set),[G,Q]=(0,i.useState)(!1),[X,Z]=(0,i.useState)(null),ee=(null===(a=R.metadata.annotations)||void 0===a?void 0:a["kuadrant.io/apiproduct"])||R.metadata.name,ae=(null===(t=R.metadata.annotations)||void 0===t?void 0:t["kuadrant.io/namespace"])||e||"default";(0,r.A)(async()=>{const e=await q.getProfileInfo();_(e.email||"")},[q]);const{value:te,loading:ne,error:ie}=(0,r.A)(async()=>{const e=ae?`${K}/api/kuadrant/requests/my?namespace=${ae}`:`${K}/api/kuadrant/requests/my`,a=await z.fetch(e);if(!a.ok)throw new Error("failed to fetch api key requests");return((await a.json()).items||[]).filter(e=>{var a,t;return(null===(a=e.spec.apiProductRef)||void 0===a?void 0:a.name)===ee&&"Approved"===(null===(t=e.status)||void 0===t?void 0:t.phase)})},[ae,ee,K,z,N]),{value:re,loading:se}=(0,r.A)(async()=>{var e;const a=await z.fetch(`${K}/api/kuadrant/apiproducts`);return a.ok?null===(e=(await a.json()).items)||void 0===e?void 0:e.find(e=>e.metadata.namespace===ae&&e.metadata.name===ee):null},[ae,ee,z,K]),le=re?`apiproduct:${re.metadata.namespace}/${re.metadata.name}`:void 0,{allowed:oe,loading:de}=(0,P.l)(C.dp,le),ce=e=>{J(a=>{const t=new Set(a);return t.has(e)?t.delete(e):t.add(e),t})};if(ne||se||de)return(0,n.jsx)(s.k,{});if(ie)return(0,n.jsx)(l._,{error:ie});const ue=te||[],pe=(null==re||null===($=re.status)||void 0===$?void 0:$.discoveredPlans)||[],me=oe&&pe.length>0;return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.n,{title:"Kuadrant API Keys",children:(0,n.jsxs)(d.A,{p:2,children:[ue.length>0?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(c.A,{variant:"body2",color:"textSecondary",gutterBottom:!0,children:[ue.length," active key",1!==ue.length?"s":""]}),ue.map(e=>{var a,t,i;const r=`${e.metadata.namespace}/${e.metadata.name}`,s=U.has(e.metadata.name),l=B.has(r),o=L.get(r),y=null===(t=e.status)||void 0===t||null===(a=t.secretRef)||void 0===a?void 0:a.name,h=!1!==(null===(i=e.status)||void 0===i?void 0:i.canReadSecret),A=H.has(r)||!h;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)(c.A,{variant:"body2",style:{fontWeight:500},children:e.metadata.name}),(0,n.jsx)(u.A,{label:e.spec.planTier,color:"primary",size:"small"})]}),y&&(0,n.jsxs)(d.A,{display:"flex",alignItems:"center",children:[(0,n.jsx)(c.A,{variant:"body2",style:{fontFamily:"monospace",fontSize:"0.8rem",flex:1,overflow:"hidden",textOverflow:"ellipsis"},children:l?"Loading...":s&&o?o:A&&!o?"Already viewed":"••••••••••••••••"}),s&&o&&(0,n.jsx)(p.Ay,{title:"Copy to clipboard",children:(0,n.jsx)(m.A,{size:"small",onClick:async()=>{o&&(await navigator.clipboard.writeText(o),E.post({message:"API key copied to clipboard",severity:"success",display:"transient"}))},children:(0,n.jsx)(j.A,{fontSize:"small"})})}),(0,n.jsx)(p.Ay,{title:A&&!o?"Key already viewed":s?"Hide API key":"Reveal API key (one-time only)",children:(0,n.jsx)("span",{children:(0,n.jsx)(m.A,{size:"small",onClick:()=>{s?(((e,a)=>{const t=`${e}/${a}`;V(e=>{const a=new Map(e);return a.delete(t),a})})(e.metadata.namespace,e.metadata.name),ce(e.metadata.name)):A||(Z({namespace:e.metadata.namespace,name:e.metadata.name}),Q(!0))},disabled:l||A&&!o,children:s?(0,n.jsx)(k.A,{fontSize:"small"}):(0,n.jsx)(x.A,{fontSize:"small"})})})})]})]},e.metadata.name)})]}):(0,n.jsx)(c.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:me?(0,n.jsx)(y.A,{variant:"contained",color:"primary",size:"small",startIcon:(0,n.jsx)(f.A,{}),onClick:()=>M(!0),children:"Request API Access"}):(0,n.jsx)(c.A,{variant:"caption",color:"textSecondary",children:"Visit the API Keys tab to view and manage access"})})]})}),(0,n.jsx)(I.c,{open:F,onClose:()=>M(!1),onSuccess:()=>{M(!1),O(e=>e+1)},apiProductName:ee,namespace:ae,userEmail:W,plans:pe}),(0,n.jsxs)(h.A,{open:G,onClose:()=>{Q(!1),Z(null)},maxWidth:"sm",children:[(0,n.jsx)(A.A,{children:(0,n.jsxs)(d.A,{display:"flex",alignItems:"center",children:[(0,n.jsx)(g.A,{color:"primary",style:{marginRight:8}}),"View API Key"]})}),(0,n.jsxs)(b.A,{children:[(0,n.jsxs)(c.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)(c.A,{variant:"body2",color:"textSecondary",children:"Make sure to copy and store it securely before closing this view."})]}),(0,n.jsxs)(v.A,{children:[(0,n.jsx)(y.A,{onClick:()=>{Q(!1),Z(null)},children:"Cancel"}),(0,n.jsx)(y.A,{variant:"contained",color:"primary",onClick:()=>{X&&((async(e,a)=>{const t=`${e}/${a}`;if(!B.has(t)){D(e=>new Set(e).add(t));try{const n=await z.fetch(`${K}/api/kuadrant/apikeys/${e}/${a}/secret`);if(n.ok){const e=await n.json();V(a=>new Map(a).set(t,e.apiKey)),Y(e=>new Set(e).add(t))}else 403===n.status&&(Y(e=>new Set(e).add(t)),E.post({message:"This API key has already been viewed and cannot be retrieved again.",severity:"warning",display:"transient"}))}catch(e){console.error("failed to fetch api key:",e)}finally{D(e=>{const a=new Set(e);return a.delete(t),a})}}})(X.namespace,X.name),ce(X.name)),Q(!1),Z(null)},children:"Reveal API Key"})]})]})]})}}}]);
|
|
2
|
+
//# sourceMappingURL=5203.539ed3ec.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static/5203.43732b3f.chunk.js","mappings":"qVAuCO,MAAMA,EAAsB,EACjCC,OACAC,UACAC,YACAC,iBACAC,YACAC,YACAC,YAEA,MAAMC,GAASC,EAAAA,EAAAA,QAAOC,EAAAA,cAChBC,GAAWF,EAAAA,EAAAA,QAAOG,EAAAA,aAClBC,GAAWJ,EAAAA,EAAAA,QAAOK,EAAAA,aAClBC,EAAaP,EAAOQ,UAAU,oBAE7BC,EAAcC,IAAmBC,EAAAA,EAAAA,UAAS,KAC1CC,EAASC,IAAcF,EAAAA,EAAAA,UAAS,KAChCG,EAAUC,IAAeJ,EAAAA,EAAAA,WAAS,IAClCK,EAAaC,IAAkBN,EAAAA,EAAAA,UAAwB,MAExDO,EAAc,KAClBR,EAAgB,IAChBG,EAAW,IACXI,EAAe,MACfvB,KAwDF,OACE,UAACyB,EAAAA,EAAMA,CAAC1B,KAAMA,EAAMC,QAASwB,EAAaE,SAAS,KAAKC,WAAS,E,WAC/D,SAACC,EAAAA,EAAWA,C,SAAC,wBACb,UAACC,EAAAA,EAAaA,C,WACZ,UAACC,EAAAA,EAAGA,CACFC,GAAI,EACJC,EAAG,IACHC,QAAQ,aACRC,aAAc,EACdC,QAAQ,OACRC,WAAW,aACXC,MAAO,CAAEC,IAAK,G,WAEd,SAACC,EAAAA,EAAQA,CACPC,MAAM,UACNC,SAAS,QACTJ,MAAO,CAAEK,UAAW,MAEtB,SAACC,EAAAA,EAAUA,CAACC,QAAQ,Q,SAAQ,+EAK7BtB,IACC,SAACQ,EAAAA,EAAGA,CACFC,GAAI,EACJC,EAAG,EACHC,QAAQ,aACRO,MAAM,qBACNN,aAAc,E,UAEd,SAACS,EAAAA,EAAUA,CAACC,QAAQ,Q,SAAStB,OAGjC,UAACuB,EAAAA,EAAWA,CACVlB,WAAS,EACTmB,OAAO,SACPC,SAAU3B,EACV4B,cAAY,mB,WAEZ,SAACC,EAAAA,EAAUA,CAACC,GAAG,oB,SAAoB,iBACnC,SAACC,EAAAA,EAAMA,CACLC,QAAQ,oBACRJ,cAAY,cACZK,MAAOtC,EACPuC,SAAWC,GAAMvC,EAAgBuC,EAAEC,OAAOH,OAC1CN,SAAU3B,E,SAETf,EAAMoD,IAAKC,IACV,MAAMC,EAAYC,OAAOC,QAAQH,EAAKI,QAAU,CAAC,GAC9CL,IAAI,EAAEM,EAAKC,KAAS,GAAGA,SAAWD,KAClCE,KAAK,MACR,OACE,UAACC,EAAAA,EAAQA,CAEPb,MAAOK,EAAKS,KACZnB,cAAa,eAAeU,EAAKS,O,UAEhCT,EAAKS,KAAK,IAAER,EAAY,IAAIA,KAAe,KAJvCD,EAAKS,cAUpB,SAACC,EAAAA,EAASA,CACRC,MAAM,sBACNC,YAAY,wCACZC,WAAS,EACTC,KAAM,EACN7C,WAAS,EACTmB,OAAO,SACPO,MAAOnC,EACPoC,SAAWC,GAAMpC,EAAWoC,EAAEC,OAAOH,OACrCoB,WAAW,yDACX1B,SAAU3B,QAGd,UAACsD,EAAAA,EAAaA,C,WACZ,SAACC,EAAAA,EAAMA,CAACC,QAASpD,EAAauB,SAAU3B,E,SAAU,YAGlD,SAACuD,EAAAA,EAAMA,CACLC,QAvIoBC,UAC1B,GAAK9D,EAAL,CAEAM,GAAY,GACZE,EAAe,MACf,IACE,MAAMuD,QAAiBrE,EAASsE,MAC9B,GAAGlE,0BACH,CACEmE,OAAQ,OACRC,QAAS,CACP,eAAgB,oBAElBC,KAAMC,KAAKC,UAAU,CACnBlF,iBACAC,YACAkF,SAAUtE,EACVG,QAASA,EAAQoE,QAAU,GAC3BlF,gBAKN,IAAK0E,EAASS,GAAI,CAChB,MAAMC,QAAkBV,EAASW,OAAOC,MAAM,KAAO,CAAE,IACvD,MAAM,IAAIC,MACRH,EAAUI,OAAS,6BAA6Bd,EAASe,SAE7D,CAEAlF,EAASmF,KAAK,CACZC,QAAS,iCACTC,SAAU,UACV7D,QAAS,cAGXnB,EAAgB,IAChBG,EAAW,IACXlB,GACF,CAAE,MAAOgG,GACP,MAAMC,EACJD,aAAeN,MAAQM,EAAIF,QAAU,yBACvCpF,EAASmF,KAAK,CACZC,QAAS,8BAA8BG,IACvCF,SAAU,QACV7D,QAAS,cAEXZ,EAAe2E,EACjB,CAAE,QACA7E,GAAY,EACd,CAjDyB,GAuInBmB,MAAM,UACNI,QAAQ,YACRG,UAAWhC,GAAgBK,EAC3B+E,UACE/E,GACE,SAACgF,EAAAA,EAAgBA,CAACC,KAAM,GAAI7D,MAAM,iBAChC8D,E,SAGLlF,EAAW,gBAAkB,yB,iLCzLUmF,EAAAA,EAAAA,GAAiB,CACjEC,KAAM,6BACNC,WAAY,CAAEC,OAAQ,aAGwBH,EAAAA,EAAAA,GAAiB,CAC/DC,KAAM,2BACNC,WAAY,CAAEC,OAAQ,WAG0BH,EAAAA,EAAAA,GAAiB,CACjEC,KAAM,6BACNC,WAAY,CAAEC,OAAQ,aAG0BH,EAAAA,EAAAA,GAAiB,CACjEC,KAAM,6BACNC,WAAY,CAAEC,OAAQ,YAjBjB,MAoBMC,GAAmCJ,EAAAA,EAAAA,GAAiB,CAC/DC,KAAM,2BACNC,WAAY,CAAEC,OAAQ,UASXE,GAAqCL,EAAAA,EAAAA,GAAiB,CACjEC,KAAM,6BACNC,WAAY,CAAEC,OAAQ,YAgBXG,IATsCN,EAAAA,EAAAA,GAAiB,CAClEC,KAAM,+BACNC,WAAY,CAAEC,OAAQ,WAO2BH,EAAAA,EAAAA,GAAiB,CAClEC,KAAM,+BACNC,WAAY,CAAEC,OAAQ,WAOXI,GAAwCP,EAAAA,EAAAA,GAAiB,CACpEC,KAAM,iCACNC,WAAY,CAAEC,OAAQ,YAOXK,GAAwCR,EAAAA,EAAAA,GAAiB,CACpEC,KAAM,iCACNC,WAAY,CAAEC,OAAQ,YAOXM,GAAwCT,EAAAA,EAAAA,GAAiB,CACpEC,KAAM,iCACNC,WAAY,CAAEC,OAAQ,YAOXO,GAAwCV,EAAAA,EAAAA,GAAiB,CACpEC,KAAM,iCACNC,WAAY,CAAEC,OAAQ,YAOXQ,GAAmCX,EAAAA,EAAAA,GAAiB,CAC/DC,KAAM,2BACNC,WAAY,CAAEC,OAAQ,UAcXS,GAAiCZ,EAAAA,EAAAA,GAAiB,CAC7DC,KAAM,yBACNC,WAAY,CAAEC,OAAQ,UACtBU,aAAc,eAOHC,GAAkCd,EAAAA,EAAAA,GAAiB,CAC9DC,KAAM,2BACNC,WAAY,CAAEC,OAAQ,UAgBXY,IATkCf,EAAAA,EAAAA,GAAiB,CAC9DC,KAAM,2BACNC,WAAY,CAAEC,OAAQ,WAOyBH,EAAAA,EAAAA,GAAiB,CAChEC,KAAM,6BACNC,WAAY,CAAEC,OAAQ,aAOXa,GAAoChB,EAAAA,EAAAA,GAAiB,CAChEC,KAAM,6BACNC,WAAY,CAAEC,OAAQ,YAOXc,GAAoCjB,EAAAA,EAAAA,GAAiB,CAChEC,KAAM,6BACNC,WAAY,CAAEC,OAAQ,YAOXe,GAAoClB,EAAAA,EAAAA,GAAiB,CAChEC,KAAM,6BACNC,WAAY,CAAEC,OAAQ,YAQXgB,GAAkCnB,EAAAA,EAAAA,GAAiB,CAC9DC,KAAM,0BACNC,WAAY,CAAEC,OAAQ,W,0DCzKjB,SAASiB,EACdC,EACAC,GAGA,MAAMC,EAAoB,iBAAkBF,EACxC,CAAEA,WAAYA,EAAkCC,eAChD,CAAED,cAEAG,GAASC,EAAAA,EAAAA,GAAcF,GAE7B,MAAO,CACLG,QAASF,EAAOE,QAChBC,QAASH,EAAOG,QAChBtC,MAAOmC,EAAOnC,MAElB,CAWO,SAASuC,EACdC,EACAC,EACAC,EACAC,GAEA,QAAIA,MACAD,GAAgBF,IAAYC,EAElC,C,wVCHO,MAAMG,EAAgB,EAAGrI,UAAWsI,M,IAuBlBC,EACLA,EAiHHC,EAxIf,MAAM,OAAED,IAAWE,EAAAA,EAAAA,MACbtI,GAASC,EAAAA,EAAAA,QAAOC,EAAAA,cAChBqI,GAActI,EAAAA,EAAAA,QAAOuI,EAAAA,gBACrBrI,GAAWF,EAAAA,EAAAA,QAAOG,EAAAA,aAClBC,GAAWJ,EAAAA,EAAAA,QAAOK,EAAAA,aAClBC,EAAaP,EAAOQ,UAAU,oBAC7BV,EAAW2I,IAAgB9H,EAAAA,EAAAA,UAAiB,KAC5C+H,EAAmBC,IAAwBhI,EAAAA,EAAAA,WAAS,IACpDiI,EAASC,IAAclI,EAAAA,EAAAA,UAAS,IAGhCmI,EAAaC,IAAkBpI,EAAAA,EAAAA,UAAsB,IAAIqI,MACzDC,EAAcC,IAAmBvI,EAAAA,EAAAA,UAA8B,IAAIwI,MACnEC,EAAeC,IAAoB1I,EAAAA,EAAAA,UAAsB,IAAIqI,MAC7DM,EAAiBC,IAAsB5I,EAAAA,EAAAA,UAAsB,IAAIqI,MACjEQ,EAAqBC,IAA0B9I,EAAAA,EAAAA,WAAS,IACxD+I,EAAkBC,IAAuBhJ,EAAAA,EAAAA,UAGtC,MAGJf,IAA4C,QAA3BwI,EAAAA,EAAOwB,SAASC,mBAAhBzB,IAAAA,OAAAA,EAAAA,EAA8B,4BAA6BA,EAAOwB,SAAS1D,KAC5FrG,IAAuC,QAA3BuI,EAAAA,EAAOwB,SAASC,mBAAhBzB,IAAAA,OAAAA,EAAAA,EAA8B,2BAA4BD,GAAiB,WAG7F2B,EAAAA,EAAAA,GAASvF,UACP,MAAMwF,QAAgBxB,EAAYyB,iBAClCvB,EAAasB,EAAQE,OAAS,KAC7B,CAAC1B,IAGJ,MAAQxF,MAAOmH,GAAUtC,QAASuC,GAAa7E,MAAO8E,KAAcN,EAAAA,EAAAA,GAASvF,UAC3E,MAAM8F,EAAMxK,GACR,GAAGU,wCAAiDV,KACpD,GAAGU,6BACDiE,QAAiBrE,EAASsE,MAAM4F,GACtC,IAAK7F,EAASS,GACZ,MAAM,IAAII,MAAM,oCAIlB,cAFmBb,EAASW,QACHmF,OAAS,IACfC,OAAQC,I,IACzBA,EAAiDA,E,OAA7B,QAApBA,EAAAA,EAAEC,KAAKC,qBAAPF,IAAAA,OAAAA,EAAAA,EAAsBtE,QAAStG,IAAsC,cAAZ,QAAR4K,EAAAA,EAAEjF,cAAFiF,IAAAA,OAAAA,EAAAA,EAAUG,UAE5D,CAAC9K,GAAWD,GAAgBW,EAAYJ,EAAUyI,KAG7C7F,MAAOsF,GAAYT,QAASgD,KAAmBd,EAAAA,EAAAA,GAASvF,U,IAMvDsG,EALP,MAAMrG,QAAiBrE,EAASsE,MAAM,GAAGlE,8BACzC,OAAKiE,EAASS,GAIG,QAAV4F,SADYrG,EAASW,QAChBmF,aAALO,IAAAA,OAAAA,EAAAA,EAAYC,KAChBpJ,GACCA,EAAEkI,SAAS/J,YAAcA,IACzB6B,EAAEkI,SAAS1D,OAAStG,IANf,MAQR,CAACC,GAAWD,GAAgBO,EAAUI,IAEnCgH,GAAcc,GAChB,cAAcA,GAAWuB,SAAS/J,aAAawI,GAAWuB,SAAS1D,YACnEF,GAEI2B,QAASoD,GAAkBnD,QAASoD,KAAsB3D,EAAAA,EAAAA,GAChER,EAAAA,GACAU,IA8CI0D,GAAoBC,IACxBnC,EAAgBoC,IACd,MAAMC,EAAS,IAAIpC,IAAImC,GAMvB,OALIC,EAAOC,IAAIH,GACbE,EAAOE,OAAOJ,GAEdE,EAAOG,IAAIL,GAENE,KAMX,GAFgBjB,IAAeS,IAAkBI,GAG/C,OAAO,SAACQ,EAAAA,EAAQA,CAAAA,GAGlB,GAAIpB,GACF,OAAO,SAACqB,EAAAA,EAAkBA,CAACnG,MAAO8E,KAGpC,MAAMsB,GAAO,IAA0B,GACjC3L,IAASsI,UAAkB,QAAlBA,EAAAA,GAAY9C,cAAZ8C,IAAAA,OAAAA,EAAAA,EAAoBsD,kBAAmB,GAChDC,GAAab,IAAoBhL,GAAM8L,OAAS,EAsGtD,OACE,sB,WACE,SAACC,EAAAA,EAAQA,CAACC,MAAM,oB,UACd,UAACvK,EAAAA,EAAGA,CAACE,EAAG,E,UACLgK,GAAKG,OAAS,GACb,sB,WACE,UAACxJ,EAAAA,EAAUA,CAACC,QAAQ,QAAQJ,MAAM,gBAAgB8J,cAAY,E,UAC3DN,GAAKG,OAAO,cAA4B,IAAhBH,GAAKG,OAAe,IAAM,MAEpDH,GAAKvI,IA7GI8I,I,IAKCA,EAAAA,EACCA,EALtB,MAAMxI,EAAM,GAAGwI,EAAQrC,SAAS/J,aAAaoM,EAAQrC,SAAS1D,OACxDgG,EAAYpD,EAAYuC,IAAIY,EAAQrC,SAAS1D,MAC7CiG,EAAY/C,EAAciC,IAAI5H,GAC9B2I,EAAcnD,EAAaoD,IAAI5I,GAC/B6I,EAA6B,QAAdL,EAAAA,EAAQ1G,cAAR0G,IAAAA,GAAyB,QAAzBA,EAAAA,EAAgBM,iBAAhBN,IAAAA,OAAAA,EAAAA,EAA2B/F,KAC1CsG,GAAkD,KAApB,QAAdP,EAAAA,EAAQ1G,cAAR0G,IAAAA,OAAAA,EAAAA,EAAgBO,eAChCC,EAAgBnD,EAAgB+B,IAAI5H,KAAS+I,EA0BnD,OACE,UAAChL,EAAAA,EAAGA,CAEFC,GAAI,EACJC,EAAG,IACHgL,OAAQ,EACRC,YAAY,WACZ/K,aAAc,E,WAEd,UAACJ,EAAAA,EAAGA,CAACK,QAAQ,OAAO+K,eAAe,gBAAgB9K,WAAW,SAASL,GAAI,E,WACzE,SAACY,EAAAA,EAAUA,CAACC,QAAQ,QAAQP,MAAO,CAAE8K,WAAY,K,SAC9CZ,EAAQrC,SAAS1D,QAEpB,SAAC4G,EAAAA,EAAIA,CAAC/I,MAAOkI,EAAQxB,KAAK1F,SAAU7C,MAAM,UAAU6D,KAAK,aAE1DuG,IACC,UAAC9K,EAAAA,EAAGA,CAACK,QAAQ,OAAOC,WAAW,S,WAC7B,SAACO,EAAAA,EAAUA,CACTC,QAAQ,QACRP,MAAO,CACLgL,WAAY,YACZ5K,SAAU,SACV6K,KAAM,EACNC,SAAU,SACVC,aAAc,Y,SAGff,EACG,aACAD,GAAaE,EACXA,EACAK,IAAkBL,EAChB,iBACA,qBAETF,GAAaE,IACZ,SAACe,EAAAA,GAAOA,CAACpB,MAAM,oB,UACb,SAACqB,EAAAA,EAAUA,CAACrH,KAAK,QAAQzB,QAhDlBC,UACb6H,UACIiB,UAAUC,UAAUC,UAAUnB,GACpC/L,EAASmF,KAAK,CACZC,QAAS,8BACTC,SAAU,UACV7D,QAAS,gB,UA2CD,SAAC2L,EAAAA,EAAYA,CAACrL,SAAS,eAI7B,SAACgL,EAAAA,GAAOA,CACNpB,MACEU,IAAkBL,EACd,qBACAF,EACE,eACA,iC,UAGR,SAACuB,OAAAA,C,UACC,SAACL,EAAAA,EAAUA,CACTrH,KAAK,QACLzB,QA9EY,KACpB4H,GA7CiB,EAACwB,EAA0BC,KAClD,MAAMlK,EAAM,GAAGiK,KAAoBC,IACnCzE,EAAiBiC,IACf,MAAMyC,EAAO,IAAIzE,IAAIgC,GAErB,OADAyC,EAAKtC,OAAO7H,GACLmK,KAyCLC,CAAiB5B,EAAQrC,SAAS/J,UAAWoM,EAAQrC,SAAS1D,MAC9D+E,GAAiBgB,EAAQrC,SAAS1D,OACxBuG,IACV9C,EAAoB,CAClB9J,UAAWoM,EAAQrC,SAAS/J,UAC5BqG,KAAM+F,EAAQrC,SAAS1D,OAEzBuD,GAAuB,KAsEbhH,SAAU0J,GAAcM,IAAkBL,E,SAEzCF,GAAY,SAAC4B,EAAAA,EAAiBA,CAAC3L,SAAS,WAAa,SAAC4L,EAAAA,EAAcA,CAAC5L,SAAS,qBAvDpF8J,EAAQrC,SAAS1D,YA6ElB,SAAC7D,EAAAA,EAAUA,CAACC,QAAQ,QAAQ0J,cAAY,E,SAAC,kDAI3C,SAACxK,EAAAA,EAAGA,CAACwM,GAAI,E,SACNpC,IACC,SAACvH,EAAAA,EAAMA,CACL/B,QAAQ,YACRJ,MAAM,UACN6D,KAAK,QACLF,WAAW,SAACoI,EAAAA,EAAOA,CAAAA,GACnB3J,QAAS,IAAMqE,GAAqB,G,SACrC,wBAID,SAACtG,EAAAA,EAAUA,CAACC,QAAQ,UAAUJ,MAAM,gB,SAAgB,6DAQ5D,SAAC1C,EAAAA,EAAmBA,CAClBC,KAAMiJ,EACNhJ,QAAS,IAAMiJ,GAAqB,GACpChJ,UAAW,KACTgJ,GAAqB,GACrBE,EAAY2B,GAAMA,EAAI,IAExB5K,eAAgBA,GAChBC,UAAWA,GACXC,UAAWA,EACXC,MAAOA,MAGT,UAACoB,EAAAA,EAAMA,CACL1B,KAAM+J,EACN9J,QAAS,KACP+J,GAAuB,GACvBE,EAAoB,OAEtBvI,SAAS,K,WAET,SAACE,EAAAA,EAAWA,C,UACV,UAACE,EAAAA,EAAGA,CAACK,QAAQ,OAAOC,WAAW,S,WAC7B,SAACoM,EAAAA,EAAWA,CAAChM,MAAM,UAAUH,MAAO,CAAEoM,YAAa,KAAO,qBAI9D,UAAC5M,EAAAA,EAAaA,C,WACZ,UAACc,EAAAA,EAAUA,CAACC,QAAQ,QAAQ8L,WAAS,E,UAAC,oCACJ,SAACC,SAAAA,C,SAAO,SAAa,wEAGvD,SAAChM,EAAAA,EAAUA,CAACC,QAAQ,QAAQJ,MAAM,gB,SAAgB,0EAIpD,UAACkC,EAAAA,EAAaA,C,WACZ,SAACC,EAAAA,EAAMA,CACLC,QAAS,KACPmF,GAAuB,GACvBE,EAAoB,O,SAEvB,YAGD,SAACtF,EAAAA,EAAMA,CACL/B,QAAQ,YACRJ,MAAM,UACNoC,QAAS,KACHoF,IA9PcnF,OAAOmJ,EAA0BC,KAC7D,MAAMlK,EAAM,GAAGiK,KAAoBC,IACnC,IAAIvE,EAAciC,IAAI5H,GAAtB,CAIA4F,EAAkB8B,GAAS,IAAInC,IAAImC,GAAMI,IAAI9H,IAC7C,IACE,MAAMe,QAAiBrE,EAASsE,MAC9B,GAAGlE,0BAAmCmN,KAAoBC,YAE5D,GAAInJ,EAASS,GAAI,CACf,MAAM4F,QAAarG,EAASW,OAC5B+D,EAAiBiC,GAAS,IAAIhC,IAAIgC,GAAMmD,IAAI7K,EAAKoH,EAAK0D,SACtDhF,EAAoB4B,GAAS,IAAInC,IAAImC,GAAMI,IAAI9H,GACjD,MAA+B,MAApBe,EAASe,SAClBgE,EAAoB4B,GAAS,IAAInC,IAAImC,GAAMI,IAAI9H,IAC/CpD,EAASmF,KAAK,CACZC,QAAS,sEACTC,SAAU,UACV7D,QAAS,cAGf,CAAE,MAAO8D,GACP6I,QAAQlJ,MAAM,2BAA4BK,EAC5C,CAAE,QACA0D,EAAkB8B,IAChB,MAAMyC,EAAO,IAAI5E,IAAImC,GAErB,OADAyC,EAAKtC,OAAO7H,GACLmK,GAEX,CA3BA,GA2PYa,CACE/E,EAAiB7J,UACjB6J,EAAiBxD,MAEnB+E,GAAiBvB,EAAiBxD,OAEpCuD,GAAuB,GACvBE,EAAoB,O,SAEvB,4B","sources":["webpack://internal.plugin-kuadrant/./src/components/RequestAccessDialog/RequestAccessDialog.tsx","webpack://internal.plugin-kuadrant/./src/permissions.ts","webpack://internal.plugin-kuadrant/./src/utils/permissions.ts","webpack://internal.plugin-kuadrant/./src/components/ApiAccessCard/ApiAccessCard.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Button,\n TextField,\n Select,\n MenuItem,\n FormControl,\n InputLabel,\n Box,\n Typography,\n CircularProgress,\n} from '@material-ui/core';\nimport InfoIcon from '@material-ui/icons/Info';\nimport {\n useApi,\n configApiRef,\n fetchApiRef,\n alertApiRef,\n} from '@backstage/core-plugin-api';\n\nexport interface Plan {\n tier: string;\n limits?: Record<string, number>;\n}\n\nexport interface RequestAccessDialogProps {\n open: boolean;\n onClose: () => void;\n onSuccess: () => void;\n apiProductName: string;\n namespace: string;\n userEmail: string;\n plans: Plan[];\n}\n\nexport const RequestAccessDialog = ({\n open,\n onClose,\n onSuccess,\n apiProductName,\n namespace,\n userEmail,\n plans,\n}: RequestAccessDialogProps) => {\n const config = useApi(configApiRef);\n const fetchApi = useApi(fetchApiRef);\n const alertApi = useApi(alertApiRef);\n const backendUrl = config.getString('backend.baseUrl');\n\n const [selectedPlan, setSelectedPlan] = useState('');\n const [useCase, setUseCase] = useState('');\n const [creating, setCreating] = useState(false);\n const [createError, setCreateError] = useState<string | null>(null);\n\n const handleClose = () => {\n setSelectedPlan('');\n setUseCase('');\n setCreateError(null);\n onClose();\n };\n\n const handleRequestAccess = async () => {\n if (!selectedPlan) return;\n\n setCreating(true);\n setCreateError(null);\n try {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/requests`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n apiProductName,\n namespace,\n planTier: selectedPlan,\n useCase: useCase.trim() || '',\n userEmail,\n }),\n },\n );\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(\n errorData.error || `failed to create request: ${response.status}`,\n );\n }\n\n alertApi.post({\n message: 'API key requested successfully',\n severity: 'success',\n display: 'transient',\n });\n\n setSelectedPlan('');\n setUseCase('');\n onSuccess();\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : 'unknown error occurred';\n alertApi.post({\n message: `Failed to request API key: ${errorMessage}`,\n severity: 'error',\n display: 'transient',\n });\n setCreateError(errorMessage);\n } finally {\n setCreating(false);\n }\n };\n\n return (\n <Dialog open={open} onClose={handleClose} maxWidth=\"sm\" fullWidth>\n <DialogTitle>Request API Access</DialogTitle>\n <DialogContent>\n <Box\n mb={2}\n p={1.5}\n bgcolor=\"info.light\"\n borderRadius={1}\n display=\"flex\"\n alignItems=\"flex-start\"\n style={{ gap: 8 }}\n >\n <InfoIcon\n color=\"primary\"\n fontSize=\"small\"\n style={{ marginTop: 2 }}\n />\n <Typography variant=\"body2\">\n Your request will be reviewed by an API owner before access is\n granted.\n </Typography>\n </Box>\n {createError && (\n <Box\n mb={2}\n p={2}\n bgcolor=\"error.main\"\n color=\"error.contrastText\"\n borderRadius={1}\n >\n <Typography variant=\"body2\">{createError}</Typography>\n </Box>\n )}\n <FormControl\n fullWidth\n margin=\"normal\"\n disabled={creating}\n data-testid=\"tier-select-form\"\n >\n <InputLabel id=\"tier-select-label\">Select Tier</InputLabel>\n <Select\n labelId=\"tier-select-label\"\n data-testid=\"tier-select\"\n value={selectedPlan}\n onChange={(e) => setSelectedPlan(e.target.value as string)}\n disabled={creating}\n >\n {plans.map((plan: Plan) => {\n const limitDesc = Object.entries(plan.limits || {})\n .map(([key, val]) => `${val} per ${key}`)\n .join(', ');\n return (\n <MenuItem\n key={plan.tier}\n value={plan.tier}\n data-testid={`tier-option-${plan.tier}`}\n >\n {plan.tier} {limitDesc ? `(${limitDesc})` : ''}\n </MenuItem>\n );\n })}\n </Select>\n </FormControl>\n <TextField\n label=\"Use Case (optional)\"\n placeholder=\"Describe how you plan to use this API\"\n multiline\n rows={3}\n fullWidth\n margin=\"normal\"\n value={useCase}\n onChange={(e) => setUseCase(e.target.value)}\n helperText=\"Explain your intended use of this API for admin review\"\n disabled={creating}\n />\n </DialogContent>\n <DialogActions>\n <Button onClick={handleClose} disabled={creating}>\n Cancel\n </Button>\n <Button\n onClick={handleRequestAccess}\n color=\"primary\"\n variant=\"contained\"\n disabled={!selectedPlan || creating}\n startIcon={\n creating ? (\n <CircularProgress size={16} color=\"inherit\" />\n ) : undefined\n }\n >\n {creating ? 'Submitting...' : 'Submit Request'}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n","import { createPermission } from '@backstage/plugin-permission-common';\n\n/**\n * permission definitions for the kuadrant plugin\n *\n * these permissions control access to kuadrant resources and operations.\n * they must match the permissions defined in the backend plugin.\n *\n * permission types:\n * - BasicPermission: standard permission that applies globally\n * - ResourcePermission: permission scoped to specific resource types (e.g., apiproduct)\n *\n * permission patterns:\n * - `.create` - create new resources\n * - `.read` - read resource details\n * - `.read.own` - read only resources owned by the user\n * - `.read.all` - read all resources regardless of ownership\n * - `.update` - modify existing resources\n * - `.delete` - delete resources\n * - `.delete.own` - delete only resources owned by the user\n * - `.delete.all` - delete any resource regardless of ownership\n * - `.list` - list/view collections of resources\n */\n\n// planpolicy permissions\nexport const kuadrantPlanPolicyCreatePermission = createPermission({\n name: 'kuadrant.planpolicy.create',\n attributes: { action: 'create' },\n});\n\nexport const kuadrantPlanPolicyReadPermission = createPermission({\n name: 'kuadrant.planpolicy.read',\n attributes: { action: 'read' },\n});\n\nexport const kuadrantPlanPolicyUpdatePermission = createPermission({\n name: 'kuadrant.planpolicy.update',\n attributes: { action: 'update' },\n});\n\nexport const kuadrantPlanPolicyDeletePermission = createPermission({\n name: 'kuadrant.planpolicy.delete',\n attributes: { action: 'delete' },\n});\n\nexport const kuadrantPlanPolicyListPermission = createPermission({\n name: 'kuadrant.planpolicy.list',\n attributes: { action: 'read' },\n});\n\n// apiproduct permissions\n\n/**\n * permission to create new API products\n * granted to api owners and admins\n */\nexport const kuadrantApiProductCreatePermission = createPermission({\n name: 'kuadrant.apiproduct.create',\n attributes: { action: 'create' },\n});\n\n/**\n * permission to read API products owned by the current user\n * for api owners to view their own products\n */\nexport const kuadrantApiProductReadOwnPermission = createPermission({\n name: 'kuadrant.apiproduct.read.own',\n attributes: { action: 'read' },\n});\n\n/**\n * permission to read all API products regardless of ownership\n * for platform engineers/admins who need to view all products\n */\nexport const kuadrantApiProductReadAllPermission = createPermission({\n name: 'kuadrant.apiproduct.read.all',\n attributes: { action: 'read' },\n});\n\n/**\n * permission to update API products owned by the current user\n * for api owners to modify their own products\n */\nexport const kuadrantApiProductUpdateOwnPermission = createPermission({\n name: 'kuadrant.apiproduct.update.own',\n attributes: { action: 'update' },\n});\n\n/**\n * permission to update any API product regardless of ownership\n * for platform engineers/admins\n */\nexport const kuadrantApiProductUpdateAllPermission = createPermission({\n name: 'kuadrant.apiproduct.update.all',\n attributes: { action: 'update' },\n});\n\n/**\n * permission to delete API products owned by the current user\n * for api owners to remove their own products\n */\nexport const kuadrantApiProductDeleteOwnPermission = createPermission({\n name: 'kuadrant.apiproduct.delete.own',\n attributes: { action: 'delete' },\n});\n\n/**\n * permission to delete any API product regardless of ownership\n * for platform engineers/admins\n */\nexport const kuadrantApiProductDeleteAllPermission = createPermission({\n name: 'kuadrant.apiproduct.delete.all',\n attributes: { action: 'delete' },\n});\n\n/**\n * permission to list API products\n * backend filters results based on .own vs .all read permissions\n */\nexport const kuadrantApiProductListPermission = createPermission({\n name: 'kuadrant.apiproduct.list',\n attributes: { action: 'read' },\n});\n\n// apikey permissions\n\n/**\n * permission to create API keys (request API access)\n *\n * this is a ResourcePermission scoped to 'apiproduct', allowing\n * fine-grained control over which API products users can request access to.\n *\n * use in frontend: useKuadrantPermission(kuadrantApiKeyCreatePermission)\n * use in backend with resource: { permission, resourceRef: 'apiproduct:namespace/name' }\n */\nexport const kuadrantApiKeyCreatePermission = createPermission({\n name: 'kuadrant.apikey.create',\n attributes: { action: 'create' },\n resourceType: 'apiproduct',\n});\n\n/**\n * permission to read API keys owned by the current user\n * allows users to view their own API keys and request history\n */\nexport const kuadrantApiKeyReadOwnPermission = createPermission({\n name: 'kuadrant.apikey.read.own',\n attributes: { action: 'read' },\n});\n\n/**\n * permission to read all API keys regardless of ownership\n * for platform engineers/admins who need to view the approval queue and audit keys\n */\nexport const kuadrantApiKeyReadAllPermission = createPermission({\n name: 'kuadrant.apikey.read.all',\n attributes: { action: 'read' },\n});\n\n/**\n * permission to update API keys owned by the current user\n * allows users to edit their own pending requests (change plan tier, use case)\n */\nexport const kuadrantApiKeyUpdateOwnPermission = createPermission({\n name: 'kuadrant.apikey.update.own',\n attributes: { action: 'update' },\n});\n\n/**\n * permission to update any API key regardless of ownership\n * typically granted to API owners and platform engineers for approving/rejecting requests\n */\nexport const kuadrantApiKeyUpdateAllPermission = createPermission({\n name: 'kuadrant.apikey.update.all',\n attributes: { action: 'update' },\n});\n\n/**\n * permission to delete API keys owned by the current user\n * allows users to cancel their own requests or revoke their own access\n */\nexport const kuadrantApiKeyDeleteOwnPermission = createPermission({\n name: 'kuadrant.apikey.delete.own',\n attributes: { action: 'delete' },\n});\n\n/**\n * permission to delete any API key regardless of ownership\n * for platform engineers/admins who need to revoke access\n */\nexport const kuadrantApiKeyDeleteAllPermission = createPermission({\n name: 'kuadrant.apikey.delete.all',\n attributes: { action: 'delete' },\n});\n\n/**\n * permission to approve/reject API key requests\n * grants access to the approval queue - for API owners and admins only\n * separate from update.own which consumers use to edit their pending requests\n */\nexport const kuadrantApiKeyApprovePermission = createPermission({\n name: 'kuadrant.apikey.approve',\n attributes: { action: 'update' },\n});\n\nexport const kuadrantPermissions = [\n kuadrantPlanPolicyCreatePermission,\n kuadrantPlanPolicyReadPermission,\n kuadrantPlanPolicyUpdatePermission,\n kuadrantPlanPolicyDeletePermission,\n kuadrantPlanPolicyListPermission,\n kuadrantApiProductCreatePermission,\n kuadrantApiProductReadOwnPermission,\n kuadrantApiProductReadAllPermission,\n kuadrantApiProductUpdateOwnPermission,\n kuadrantApiProductUpdateAllPermission,\n kuadrantApiProductDeleteOwnPermission,\n kuadrantApiProductDeleteAllPermission,\n kuadrantApiProductListPermission,\n kuadrantApiKeyCreatePermission,\n kuadrantApiKeyReadOwnPermission,\n kuadrantApiKeyReadAllPermission,\n kuadrantApiKeyUpdateOwnPermission,\n kuadrantApiKeyUpdateAllPermission,\n kuadrantApiKeyDeleteOwnPermission,\n kuadrantApiKeyDeleteAllPermission,\n kuadrantApiKeyApprovePermission,\n];\n","import { usePermission } from '@backstage/plugin-permission-react';\nimport { Permission, ResourcePermission } from '@backstage/plugin-permission-common';\n\n/**\n * result of a permission check including error state\n */\nexport interface PermissionCheckResult {\n allowed: boolean;\n loading: boolean;\n error?: Error;\n}\n\n/**\n * custom hook for checking kuadrant permissions that handles both\n * BasicPermission and ResourcePermission types without type bypasses\n *\n * @param permission - the permission to check\n * @param resourceRef - optional resource reference for ResourcePermissions\n * @returns permission check result with error handling\n *\n * @example\n * // basic permission\n * const { allowed, loading, error } = useKuadrantPermission(\n * kuadrantApiProductListPermission\n * );\n *\n * @example\n * // resource permission\n * const { allowed, loading, error } = useKuadrantPermission(\n * kuadrantApiKeyCreatePermission,\n * 'apiproduct:namespace/name'\n * );\n */\nexport function useKuadrantPermission(\n permission: Permission,\n resourceRef?: string,\n): PermissionCheckResult {\n // construct the permission request based on whether it's a ResourcePermission\n const permissionRequest = 'resourceType' in permission\n ? { permission: permission as ResourcePermission, resourceRef }\n : { permission };\n\n const result = usePermission(permissionRequest as any);\n\n return {\n allowed: result.allowed,\n loading: result.loading,\n error: result.error,\n };\n}\n\n/**\n * helper to determine if a user can delete a specific API key or request\n *\n * @param ownerId - the user id who owns the key/request\n * @param currentUserId - the current user's id\n * @param canDeleteOwn - whether user has permission to delete their own keys\n * @param canDeleteAll - whether user has permission to delete all keys\n * @returns true if user can delete this specific key/request\n */\nexport function canDeleteResource(\n ownerId: string,\n currentUserId: string,\n canDeleteOwn: boolean,\n canDeleteAll: boolean,\n): boolean {\n if (canDeleteAll) return true;\n if (canDeleteOwn && ownerId === currentUserId) return true;\n return false;\n}\n","import React, { useState } from 'react';\nimport { useAsync } from 'react-use';\nimport {\n InfoCard,\n Progress,\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 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, configApiRef, identityApiRef, fetchApiRef, alertApiRef } from '@backstage/core-plugin-api';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { RequestAccessDialog, Plan } from '../RequestAccessDialog';\nimport { useKuadrantPermission } from '../../utils/permissions';\nimport { kuadrantApiKeyCreatePermission } from '../../permissions';\n\ninterface APIKey {\n metadata: {\n name: string;\n namespace: string;\n };\n spec: {\n apiProductRef: {\n name: string;\n };\n planTier: string;\n };\n status?: {\n phase: 'Pending' | 'Approved' | 'Rejected';\n secretRef?: {\n name: string;\n key: string;\n };\n canReadSecret?: boolean;\n };\n}\n\ninterface APIProduct {\n metadata: {\n name: string;\n namespace: string;\n };\n status?: {\n discoveredPlans?: Plan[];\n };\n}\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 config = useApi(configApiRef);\n const identityApi = useApi(identityApiRef);\n const fetchApi = useApi(fetchApiRef);\n const alertApi = useApi(alertApiRef);\n const backendUrl = config.getString('backend.baseUrl');\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 url = namespace\n ? `${backendUrl}/api/kuadrant/requests/my?namespace=${namespace}`\n : `${backendUrl}/api/kuadrant/requests/my`;\n const response = await fetchApi.fetch(url);\n if (!response.ok) {\n throw new Error('failed to fetch api key requests');\n }\n const data = await response.json();\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, backendUrl, fetchApi, refresh]);\n\n // fetch apiproduct to get available plans\n const { value: apiProduct, loading: productLoading } = useAsync(async () => {\n const response = await fetchApi.fetch(`${backendUrl}/api/kuadrant/apiproducts`);\n if (!response.ok) {\n return null;\n }\n const data = await response.json();\n return data.items?.find(\n (p: APIProduct) =>\n p.metadata.namespace === namespace &&\n p.metadata.name === apiProductName,\n );\n }, [namespace, apiProductName, fetchApi, backendUrl]);\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 response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/apikeys/${requestNamespace}/${requestName}/secret`,\n );\n if (response.ok) {\n const data = await response.json();\n setApiKeyValues((prev) => new Map(prev).set(key, data.apiKey));\n setAlreadyReadKeys((prev) => new Set(prev).add(key));\n } else if (response.status === 403) {\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 }\n } catch (err) {\n console.error('failed to fetch api key:', err);\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 <Progress />;\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 >\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"],"names":["RequestAccessDialog","open","onClose","onSuccess","apiProductName","namespace","userEmail","plans","config","useApi","configApiRef","fetchApi","fetchApiRef","alertApi","alertApiRef","backendUrl","getString","selectedPlan","setSelectedPlan","useState","useCase","setUseCase","creating","setCreating","createError","setCreateError","handleClose","Dialog","maxWidth","fullWidth","DialogTitle","DialogContent","Box","mb","p","bgcolor","borderRadius","display","alignItems","style","gap","InfoIcon","color","fontSize","marginTop","Typography","variant","FormControl","margin","disabled","data-testid","InputLabel","id","Select","labelId","value","onChange","e","target","map","plan","limitDesc","Object","entries","limits","key","val","join","MenuItem","tier","TextField","label","placeholder","multiline","rows","helperText","DialogActions","Button","onClick","async","response","fetch","method","headers","body","JSON","stringify","planTier","trim","ok","errorData","json","catch","Error","error","status","post","message","severity","err","errorMessage","startIcon","CircularProgress","size","undefined","createPermission","name","attributes","action","kuadrantPlanPolicyListPermission","kuadrantApiProductCreatePermission","kuadrantApiProductReadAllPermission","kuadrantApiProductUpdateOwnPermission","kuadrantApiProductUpdateAllPermission","kuadrantApiProductDeleteOwnPermission","kuadrantApiProductDeleteAllPermission","kuadrantApiProductListPermission","kuadrantApiKeyCreatePermission","resourceType","kuadrantApiKeyReadOwnPermission","kuadrantApiKeyUpdateOwnPermission","kuadrantApiKeyUpdateAllPermission","kuadrantApiKeyDeleteOwnPermission","kuadrantApiKeyDeleteAllPermission","kuadrantApiKeyApprovePermission","useKuadrantPermission","permission","resourceRef","permissionRequest","result","usePermission","allowed","loading","canDeleteResource","ownerId","currentUserId","canDeleteOwn","canDeleteAll","ApiAccessCard","propNamespace","entity","apiProduct","useEntity","identityApi","identityApiRef","setUserEmail","requestDialogOpen","setRequestDialogOpen","refresh","setRefresh","visibleKeys","setVisibleKeys","Set","apiKeyValues","setApiKeyValues","Map","apiKeyLoading","setApiKeyLoading","alreadyReadKeys","setAlreadyReadKeys","showOnceWarningOpen","setShowOnceWarningOpen","pendingKeyReveal","setPendingKeyReveal","metadata","annotations","useAsync","profile","getProfileInfo","email","requests","keysLoading","keysError","url","items","filter","r","spec","apiProductRef","phase","productLoading","data","find","canCreateRequest","permissionLoading","toggleVisibility","keyName","prev","newSet","has","delete","add","Progress","ResponseErrorPanel","keys","discoveredPlans","canRequest","length","InfoCard","title","gutterBottom","request","isVisible","isLoading","apiKeyValue","get","hasSecretRef","secretRef","canReadSecret","isAlreadyRead","border","borderColor","justifyContent","fontWeight","Chip","fontFamily","flex","overflow","textOverflow","Tooltip","IconButton","navigator","clipboard","writeText","FileCopyIcon","span","requestNamespace","requestName","next","clearApiKeyValue","VisibilityOffIcon","VisibilityIcon","mt","AddIcon","WarningIcon","marginRight","paragraph","strong","set","apiKey","console","fetchApiKeyFromSecret"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"static/5203.539ed3ec.chunk.js","mappings":"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","sources":["webpack://internal.plugin-kuadrant/./src/components/RequestAccessDialog/RequestAccessDialog.tsx","webpack://internal.plugin-kuadrant/./src/permissions.ts","webpack://internal.plugin-kuadrant/./src/utils/permissions.ts","webpack://internal.plugin-kuadrant/./src/components/ApiAccessCard/ApiAccessCard.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Button,\n TextField,\n Select,\n MenuItem,\n FormControl,\n InputLabel,\n Box,\n Typography,\n CircularProgress,\n} from '@material-ui/core';\nimport InfoIcon from '@material-ui/icons/Info';\nimport {\n useApi,\n configApiRef,\n fetchApiRef,\n alertApiRef,\n} from '@backstage/core-plugin-api';\n\nexport interface Plan {\n tier: string;\n limits?: Record<string, number>;\n}\n\nexport interface RequestAccessDialogProps {\n open: boolean;\n onClose: () => void;\n onSuccess: () => void;\n apiProductName: string;\n namespace: string;\n userEmail: string;\n plans: Plan[];\n}\n\nexport const RequestAccessDialog = ({\n open,\n onClose,\n onSuccess,\n apiProductName,\n namespace,\n userEmail,\n plans,\n}: RequestAccessDialogProps) => {\n const config = useApi(configApiRef);\n const fetchApi = useApi(fetchApiRef);\n const alertApi = useApi(alertApiRef);\n const backendUrl = config.getString('backend.baseUrl');\n\n const [selectedPlan, setSelectedPlan] = useState('');\n const [useCase, setUseCase] = useState('');\n const [creating, setCreating] = useState(false);\n const [createError, setCreateError] = useState<string | null>(null);\n\n const handleClose = () => {\n setSelectedPlan('');\n setUseCase('');\n setCreateError(null);\n onClose();\n };\n\n const handleRequestAccess = async () => {\n if (!selectedPlan) return;\n\n setCreating(true);\n setCreateError(null);\n try {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/requests`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n apiProductName,\n namespace,\n planTier: selectedPlan,\n useCase: useCase.trim() || '',\n userEmail,\n }),\n },\n );\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(\n errorData.error || `failed to create request: ${response.status}`,\n );\n }\n\n alertApi.post({\n message: 'API key requested successfully',\n severity: 'success',\n display: 'transient',\n });\n\n setSelectedPlan('');\n setUseCase('');\n onSuccess();\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : 'unknown error occurred';\n alertApi.post({\n message: `Failed to request API key: ${errorMessage}`,\n severity: 'error',\n display: 'transient',\n });\n setCreateError(errorMessage);\n } finally {\n setCreating(false);\n }\n };\n\n return (\n <Dialog open={open} onClose={handleClose} maxWidth=\"sm\" fullWidth>\n <DialogTitle>Request API Access</DialogTitle>\n <DialogContent>\n <Box\n mb={2}\n p={1.5}\n bgcolor=\"info.light\"\n borderRadius={1}\n display=\"flex\"\n alignItems=\"flex-start\"\n style={{ gap: 8 }}\n >\n <InfoIcon\n color=\"primary\"\n fontSize=\"small\"\n style={{ marginTop: 2 }}\n />\n <Typography variant=\"body2\">\n Your request will be reviewed by an API owner before access is\n granted.\n </Typography>\n </Box>\n {createError && (\n <Box\n mb={2}\n p={2}\n bgcolor=\"error.main\"\n color=\"error.contrastText\"\n borderRadius={1}\n >\n <Typography variant=\"body2\">{createError}</Typography>\n </Box>\n )}\n <FormControl\n fullWidth\n margin=\"normal\"\n disabled={creating}\n data-testid=\"tier-select-form\"\n >\n <InputLabel id=\"tier-select-label\">Select Tier</InputLabel>\n <Select\n labelId=\"tier-select-label\"\n data-testid=\"tier-select\"\n value={selectedPlan}\n onChange={(e) => setSelectedPlan(e.target.value as string)}\n disabled={creating}\n >\n {plans.map((plan: Plan) => {\n const limitDesc = Object.entries(plan.limits || {})\n .map(([key, val]) => `${val} per ${key}`)\n .join(', ');\n return (\n <MenuItem\n key={plan.tier}\n value={plan.tier}\n data-testid={`tier-option-${plan.tier}`}\n >\n {plan.tier} {limitDesc ? `(${limitDesc})` : ''}\n </MenuItem>\n );\n })}\n </Select>\n </FormControl>\n <TextField\n label=\"Use Case (optional)\"\n placeholder=\"Describe how you plan to use this API\"\n multiline\n rows={3}\n fullWidth\n margin=\"normal\"\n value={useCase}\n onChange={(e) => setUseCase(e.target.value)}\n helperText=\"Explain your intended use of this API for admin review\"\n disabled={creating}\n />\n </DialogContent>\n <DialogActions>\n <Button onClick={handleClose} disabled={creating}>\n Cancel\n </Button>\n <Button\n onClick={handleRequestAccess}\n color=\"primary\"\n variant=\"contained\"\n disabled={!selectedPlan || creating}\n startIcon={\n creating ? (\n <CircularProgress size={16} color=\"inherit\" />\n ) : undefined\n }\n >\n {creating ? 'Submitting...' : 'Submit Request'}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n","import { createPermission } from '@backstage/plugin-permission-common';\n\n/**\n * permission definitions for the kuadrant plugin\n *\n * these permissions control access to kuadrant resources and operations.\n * they must match the permissions defined in the backend plugin.\n *\n * permission types:\n * - BasicPermission: standard permission that applies globally\n * - ResourcePermission: permission scoped to specific resource types (e.g., apiproduct)\n *\n * permission patterns:\n * - `.create` - create new resources\n * - `.read` - read resource details\n * - `.read.own` - read only resources owned by the user\n * - `.read.all` - read all resources regardless of ownership\n * - `.update` - modify existing resources\n * - `.delete` - delete resources\n * - `.delete.own` - delete only resources owned by the user\n * - `.delete.all` - delete any resource regardless of ownership\n * - `.list` - list/view collections of resources\n */\n\n// planpolicy permissions\nexport const kuadrantPlanPolicyCreatePermission = createPermission({\n name: 'kuadrant.planpolicy.create',\n attributes: { action: 'create' },\n});\n\nexport const kuadrantPlanPolicyReadPermission = createPermission({\n name: 'kuadrant.planpolicy.read',\n attributes: { action: 'read' },\n});\n\nexport const kuadrantPlanPolicyUpdatePermission = createPermission({\n name: 'kuadrant.planpolicy.update',\n attributes: { action: 'update' },\n});\n\nexport const kuadrantPlanPolicyDeletePermission = createPermission({\n name: 'kuadrant.planpolicy.delete',\n attributes: { action: 'delete' },\n});\n\nexport const kuadrantPlanPolicyListPermission = createPermission({\n name: 'kuadrant.planpolicy.list',\n attributes: { action: 'read' },\n});\n\n// apiproduct permissions\n\n/**\n * permission to create new API products\n * granted to api owners and admins\n */\nexport const kuadrantApiProductCreatePermission = createPermission({\n name: 'kuadrant.apiproduct.create',\n attributes: { action: 'create' },\n});\n\n/**\n * permission to read API products owned by the current user\n * for api owners to view their own products\n */\nexport const kuadrantApiProductReadOwnPermission = createPermission({\n name: 'kuadrant.apiproduct.read.own',\n attributes: { action: 'read' },\n});\n\n/**\n * permission to read all API products regardless of ownership\n * for platform engineers/admins who need to view all products\n */\nexport const kuadrantApiProductReadAllPermission = createPermission({\n name: 'kuadrant.apiproduct.read.all',\n attributes: { action: 'read' },\n});\n\n/**\n * permission to update API products owned by the current user\n * for api owners to modify their own products\n */\nexport const kuadrantApiProductUpdateOwnPermission = createPermission({\n name: 'kuadrant.apiproduct.update.own',\n attributes: { action: 'update' },\n});\n\n/**\n * permission to update any API product regardless of ownership\n * for platform engineers/admins\n */\nexport const kuadrantApiProductUpdateAllPermission = createPermission({\n name: 'kuadrant.apiproduct.update.all',\n attributes: { action: 'update' },\n});\n\n/**\n * permission to delete API products owned by the current user\n * for api owners to remove their own products\n */\nexport const kuadrantApiProductDeleteOwnPermission = createPermission({\n name: 'kuadrant.apiproduct.delete.own',\n attributes: { action: 'delete' },\n});\n\n/**\n * permission to delete any API product regardless of ownership\n * for platform engineers/admins\n */\nexport const kuadrantApiProductDeleteAllPermission = createPermission({\n name: 'kuadrant.apiproduct.delete.all',\n attributes: { action: 'delete' },\n});\n\n/**\n * permission to list API products\n * backend filters results based on .own vs .all read permissions\n */\nexport const kuadrantApiProductListPermission = createPermission({\n name: 'kuadrant.apiproduct.list',\n attributes: { action: 'read' },\n});\n\n// apikey permissions\n\n/**\n * permission to create API keys (request API access)\n *\n * this is a ResourcePermission scoped to 'apiproduct', allowing\n * fine-grained control over which API products users can request access to.\n *\n * use in frontend: useKuadrantPermission(kuadrantApiKeyCreatePermission)\n * use in backend with resource: { permission, resourceRef: 'apiproduct:namespace/name' }\n */\nexport const kuadrantApiKeyCreatePermission = createPermission({\n name: 'kuadrant.apikey.create',\n attributes: { action: 'create' },\n resourceType: 'apiproduct',\n});\n\n/**\n * permission to read API keys owned by the current user\n * allows users to view their own API keys and request history\n */\nexport const kuadrantApiKeyReadOwnPermission = createPermission({\n name: 'kuadrant.apikey.read.own',\n attributes: { action: 'read' },\n});\n\n/**\n * permission to read all API keys regardless of ownership\n * for platform engineers/admins who need to view the approval queue and audit keys\n */\nexport const kuadrantApiKeyReadAllPermission = createPermission({\n name: 'kuadrant.apikey.read.all',\n attributes: { action: 'read' },\n});\n\n/**\n * permission to update API keys owned by the current user\n * allows users to edit their own pending requests (change plan tier, use case)\n */\nexport const kuadrantApiKeyUpdateOwnPermission = createPermission({\n name: 'kuadrant.apikey.update.own',\n attributes: { action: 'update' },\n});\n\n/**\n * permission to update any API key regardless of ownership\n * typically granted to API owners and platform engineers for approving/rejecting requests\n */\nexport const kuadrantApiKeyUpdateAllPermission = createPermission({\n name: 'kuadrant.apikey.update.all',\n attributes: { action: 'update' },\n});\n\n/**\n * permission to delete API keys owned by the current user\n * allows users to cancel their own requests or revoke their own access\n */\nexport const kuadrantApiKeyDeleteOwnPermission = createPermission({\n name: 'kuadrant.apikey.delete.own',\n attributes: { action: 'delete' },\n});\n\n/**\n * permission to delete any API key regardless of ownership\n * for platform engineers/admins who need to revoke access\n */\nexport const kuadrantApiKeyDeleteAllPermission = createPermission({\n name: 'kuadrant.apikey.delete.all',\n attributes: { action: 'delete' },\n});\n\n/**\n * permission to approve/reject API key requests\n * grants access to the approval queue - for API owners and admins only\n * separate from update.own which consumers use to edit their pending requests\n */\nexport const kuadrantApiKeyApprovePermission = createPermission({\n name: 'kuadrant.apikey.approve',\n attributes: { action: 'update' },\n});\n\nexport const kuadrantPermissions = [\n kuadrantPlanPolicyCreatePermission,\n kuadrantPlanPolicyReadPermission,\n kuadrantPlanPolicyUpdatePermission,\n kuadrantPlanPolicyDeletePermission,\n kuadrantPlanPolicyListPermission,\n kuadrantApiProductCreatePermission,\n kuadrantApiProductReadOwnPermission,\n kuadrantApiProductReadAllPermission,\n kuadrantApiProductUpdateOwnPermission,\n kuadrantApiProductUpdateAllPermission,\n kuadrantApiProductDeleteOwnPermission,\n kuadrantApiProductDeleteAllPermission,\n kuadrantApiProductListPermission,\n kuadrantApiKeyCreatePermission,\n kuadrantApiKeyReadOwnPermission,\n kuadrantApiKeyReadAllPermission,\n kuadrantApiKeyUpdateOwnPermission,\n kuadrantApiKeyUpdateAllPermission,\n kuadrantApiKeyDeleteOwnPermission,\n kuadrantApiKeyDeleteAllPermission,\n kuadrantApiKeyApprovePermission,\n];\n","import { usePermission } from '@backstage/plugin-permission-react';\nimport { Permission, ResourcePermission } from '@backstage/plugin-permission-common';\n\n/**\n * result of a permission check including error state\n */\nexport interface PermissionCheckResult {\n allowed: boolean;\n loading: boolean;\n error?: Error;\n}\n\n/**\n * custom hook for checking kuadrant permissions that handles both\n * BasicPermission and ResourcePermission types without type bypasses\n *\n * @param permission - the permission to check\n * @param resourceRef - optional resource reference for ResourcePermissions\n * @returns permission check result with error handling\n *\n * @example\n * // basic permission\n * const { allowed, loading, error } = useKuadrantPermission(\n * kuadrantApiProductListPermission\n * );\n *\n * @example\n * // resource permission\n * const { allowed, loading, error } = useKuadrantPermission(\n * kuadrantApiKeyCreatePermission,\n * 'apiproduct:namespace/name'\n * );\n */\nexport function useKuadrantPermission(\n permission: Permission,\n resourceRef?: string,\n): PermissionCheckResult {\n // construct the permission request based on whether it's a ResourcePermission\n const permissionRequest = 'resourceType' in permission\n ? { permission: permission as ResourcePermission, resourceRef }\n : { permission };\n\n const result = usePermission(permissionRequest as any);\n\n return {\n allowed: result.allowed,\n loading: result.loading,\n error: result.error,\n };\n}\n\n/**\n * helper to determine if a user can delete a specific API key or request\n *\n * @param ownerId - the user id who owns the key/request\n * @param currentUserId - the current user's id\n * @param canDeleteOwn - whether user has permission to delete their own keys\n * @param canDeleteAll - whether user has permission to delete all keys\n * @returns true if user can delete this specific key/request\n */\nexport function canDeleteResource(\n ownerId: string,\n currentUserId: string,\n canDeleteOwn: boolean,\n canDeleteAll: boolean,\n): boolean {\n if (canDeleteAll) return true;\n if (canDeleteOwn && ownerId === currentUserId) return true;\n return false;\n}\n","import React, { useState } from 'react';\nimport { useAsync } from 'react-use';\nimport {\n InfoCard,\n Progress,\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 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, configApiRef, identityApiRef, fetchApiRef, alertApiRef } from '@backstage/core-plugin-api';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { RequestAccessDialog, Plan } from '../RequestAccessDialog';\nimport { useKuadrantPermission } from '../../utils/permissions';\nimport { kuadrantApiKeyCreatePermission } from '../../permissions';\n\ninterface APIKey {\n metadata: {\n name: string;\n namespace: string;\n };\n spec: {\n apiProductRef: {\n name: string;\n };\n planTier: string;\n };\n status?: {\n phase: 'Pending' | 'Approved' | 'Rejected';\n secretRef?: {\n name: string;\n key: string;\n };\n canReadSecret?: boolean;\n };\n}\n\ninterface APIProduct {\n metadata: {\n name: string;\n namespace: string;\n };\n status?: {\n discoveredPlans?: Plan[];\n };\n}\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 config = useApi(configApiRef);\n const identityApi = useApi(identityApiRef);\n const fetchApi = useApi(fetchApiRef);\n const alertApi = useApi(alertApiRef);\n const backendUrl = config.getString('backend.baseUrl');\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 url = namespace\n ? `${backendUrl}/api/kuadrant/requests/my?namespace=${namespace}`\n : `${backendUrl}/api/kuadrant/requests/my`;\n const response = await fetchApi.fetch(url);\n if (!response.ok) {\n throw new Error('failed to fetch api key requests');\n }\n const data = await response.json();\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, backendUrl, fetchApi, refresh]);\n\n // fetch apiproduct to get available plans\n const { value: apiProduct, loading: productLoading } = useAsync(async () => {\n const response = await fetchApi.fetch(`${backendUrl}/api/kuadrant/apiproducts`);\n if (!response.ok) {\n return null;\n }\n const data = await response.json();\n return data.items?.find(\n (p: APIProduct) =>\n p.metadata.namespace === namespace &&\n p.metadata.name === apiProductName,\n );\n }, [namespace, apiProductName, fetchApi, backendUrl]);\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 response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/apikeys/${requestNamespace}/${requestName}/secret`,\n );\n if (response.ok) {\n const data = await response.json();\n setApiKeyValues((prev) => new Map(prev).set(key, data.apiKey));\n setAlreadyReadKeys((prev) => new Set(prev).add(key));\n } else if (response.status === 403) {\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 }\n } catch (err) {\n console.error('failed to fetch api key:', err);\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 <Progress />;\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 >\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"],"names":["RequestAccessDialog","open","onClose","onSuccess","apiProductName","namespace","userEmail","plans","config","useApi","configApiRef","fetchApi","fetchApiRef","alertApi","alertApiRef","backendUrl","getString","selectedPlan","setSelectedPlan","useState","useCase","setUseCase","creating","setCreating","createError","setCreateError","handleClose","Dialog","maxWidth","fullWidth","DialogTitle","DialogContent","Box","mb","p","bgcolor","borderRadius","display","alignItems","style","gap","InfoIcon","color","fontSize","marginTop","Typography","variant","FormControl","margin","disabled","data-testid","InputLabel","id","Select","labelId","value","onChange","e","target","map","plan","limitDesc","Object","entries","limits","key","val","join","MenuItem","tier","TextField","label","placeholder","multiline","rows","helperText","DialogActions","Button","onClick","async","response","fetch","method","headers","body","JSON","stringify","planTier","trim","ok","errorData","json","catch","Error","error","status","post","message","severity","err","errorMessage","startIcon","CircularProgress","size","undefined","createPermission","name","attributes","action","kuadrantPlanPolicyListPermission","kuadrantApiProductCreatePermission","kuadrantApiProductReadAllPermission","kuadrantApiProductUpdateOwnPermission","kuadrantApiProductUpdateAllPermission","kuadrantApiProductDeleteOwnPermission","kuadrantApiProductDeleteAllPermission","kuadrantApiProductListPermission","kuadrantApiKeyCreatePermission","resourceType","kuadrantApiKeyReadOwnPermission","kuadrantApiKeyUpdateOwnPermission","kuadrantApiKeyUpdateAllPermission","kuadrantApiKeyDeleteOwnPermission","kuadrantApiKeyDeleteAllPermission","kuadrantApiKeyApprovePermission","useKuadrantPermission","permission","resourceRef","permissionRequest","result","usePermission","allowed","loading","canDeleteResource","ownerId","currentUserId","canDeleteOwn","canDeleteAll","ApiAccessCard","propNamespace","entity","apiProduct","useEntity","identityApi","identityApiRef","setUserEmail","requestDialogOpen","setRequestDialogOpen","refresh","setRefresh","visibleKeys","setVisibleKeys","Set","apiKeyValues","setApiKeyValues","Map","apiKeyLoading","setApiKeyLoading","alreadyReadKeys","setAlreadyReadKeys","showOnceWarningOpen","setShowOnceWarningOpen","pendingKeyReveal","setPendingKeyReveal","metadata","annotations","useAsync","profile","getProfileInfo","email","requests","keysLoading","keysError","url","items","filter","r","spec","apiProductRef","phase","productLoading","data","find","canCreateRequest","permissionLoading","toggleVisibility","keyName","prev","newSet","has","delete","add","Progress","ResponseErrorPanel","keys","discoveredPlans","canRequest","length","InfoCard","title","gutterBottom","request","isVisible","isLoading","apiKeyValue","get","hasSecretRef","secretRef","canReadSecret","isAlreadyRead","border","borderColor","justifyContent","fontWeight","Chip","fontFamily","flex","overflow","textOverflow","Tooltip","IconButton","navigator","clipboard","writeText","FileCopyIcon","span","requestNamespace","requestName","next","clearApiKeyValue","VisibilityOffIcon","VisibilityIcon","mt","AddIcon","WarningIcon","marginRight","paragraph","strong","set","apiKey","console","fetchApiKeyFromSecret"],"sourceRoot":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[5453],{34955:(t,a,e)=>{e.d(a,{Al:()=>o,DS:()=>m,EM:()=>s,FL:()=>r,J:()=>i,KV:()=>f,R_:()=>l,U3:()=>d,dp:()=>p,jH:()=>A,q0:()=>k,uL:()=>v,v_:()=>u,vs:()=>c,z4:()=>h});var n=e(83572);(0,n.i)({name:"kuadrant.planpolicy.create",attributes:{action:"create"}}),(0,n.i)({name:"kuadrant.planpolicy.read",attributes:{action:"read"}}),(0,n.i)({name:"kuadrant.planpolicy.update",attributes:{action:"update"}}),(0,n.i)({name:"kuadrant.planpolicy.delete",attributes:{action:"delete"}});const i=(0,n.i)({name:"kuadrant.planpolicy.list",attributes:{action:"read"}}),r=(0,n.i)({name:"kuadrant.apiproduct.create",attributes:{action:"create"}}),o=((0,n.i)({name:"kuadrant.apiproduct.read.own",attributes:{action:"read"}}),(0,n.i)({name:"kuadrant.apiproduct.read.all",attributes:{action:"read"}})),d=(0,n.i)({name:"kuadrant.apiproduct.update.own",attributes:{action:"update"}}),u=(0,n.i)({name:"kuadrant.apiproduct.update.all",attributes:{action:"update"}}),s=(0,n.i)({name:"kuadrant.apiproduct.delete.own",attributes:{action:"delete"}}),l=(0,n.i)({name:"kuadrant.apiproduct.delete.all",attributes:{action:"delete"}}),c=(0,n.i)({name:"kuadrant.apiproduct.list",attributes:{action:"read"}}),p=(0,n.i)({name:"kuadrant.apikey.create",attributes:{action:"create"},resourceType:"apiproduct"}),m=(0,n.i)({name:"kuadrant.apikey.read.own",attributes:{action:"read"}}),k=((0,n.i)({name:"kuadrant.apikey.read.all",attributes:{action:"read"}}),(0,n.i)({name:"kuadrant.apikey.update.own",attributes:{action:"update"}})),h=(0,n.i)({name:"kuadrant.apikey.update.all",attributes:{action:"update"}}),v=(0,n.i)({name:"kuadrant.apikey.delete.own",attributes:{action:"delete"}}),A=(0,n.i)({name:"kuadrant.apikey.delete.all",attributes:{action:"delete"}}),f=(0,n.i)({name:"kuadrant.apikey.approve",attributes:{action:"update"}})},46205:(t,a,e)=>{e.d(a,{W:()=>r,l:()=>i});var n=e(
|
|
2
|
-
//# sourceMappingURL=5453.
|
|
1
|
+
"use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[5453],{34955:(t,a,e)=>{e.d(a,{Al:()=>o,DS:()=>m,EM:()=>s,FL:()=>r,J:()=>i,KV:()=>f,R_:()=>l,U3:()=>d,dp:()=>p,jH:()=>A,q0:()=>k,uL:()=>v,v_:()=>u,vs:()=>c,z4:()=>h});var n=e(83572);(0,n.i)({name:"kuadrant.planpolicy.create",attributes:{action:"create"}}),(0,n.i)({name:"kuadrant.planpolicy.read",attributes:{action:"read"}}),(0,n.i)({name:"kuadrant.planpolicy.update",attributes:{action:"update"}}),(0,n.i)({name:"kuadrant.planpolicy.delete",attributes:{action:"delete"}});const i=(0,n.i)({name:"kuadrant.planpolicy.list",attributes:{action:"read"}}),r=(0,n.i)({name:"kuadrant.apiproduct.create",attributes:{action:"create"}}),o=((0,n.i)({name:"kuadrant.apiproduct.read.own",attributes:{action:"read"}}),(0,n.i)({name:"kuadrant.apiproduct.read.all",attributes:{action:"read"}})),d=(0,n.i)({name:"kuadrant.apiproduct.update.own",attributes:{action:"update"}}),u=(0,n.i)({name:"kuadrant.apiproduct.update.all",attributes:{action:"update"}}),s=(0,n.i)({name:"kuadrant.apiproduct.delete.own",attributes:{action:"delete"}}),l=(0,n.i)({name:"kuadrant.apiproduct.delete.all",attributes:{action:"delete"}}),c=(0,n.i)({name:"kuadrant.apiproduct.list",attributes:{action:"read"}}),p=(0,n.i)({name:"kuadrant.apikey.create",attributes:{action:"create"},resourceType:"apiproduct"}),m=(0,n.i)({name:"kuadrant.apikey.read.own",attributes:{action:"read"}}),k=((0,n.i)({name:"kuadrant.apikey.read.all",attributes:{action:"read"}}),(0,n.i)({name:"kuadrant.apikey.update.own",attributes:{action:"update"}})),h=(0,n.i)({name:"kuadrant.apikey.update.all",attributes:{action:"update"}}),v=(0,n.i)({name:"kuadrant.apikey.delete.own",attributes:{action:"delete"}}),A=(0,n.i)({name:"kuadrant.apikey.delete.all",attributes:{action:"delete"}}),f=(0,n.i)({name:"kuadrant.apikey.approve",attributes:{action:"update"}})},46205:(t,a,e)=>{e.d(a,{W:()=>r,l:()=>i});var n=e(24217);function i(t,a){const e="resourceType"in t?{permission:t,resourceRef:a}:{permission:t},i=(0,n.J)(e);return{allowed:i.allowed,loading:i.loading,error:i.error}}function r(t,a,e,n){return!!n||!(!e||t!==a)}},75453:(t,a,e)=>{e.r(a),e.d(a,{ApiProductInfoCard:()=>f});var n=e(31085),i=(e(95478),e(25467)),r=e(22097),o=e(96040),d=e(86687),u=e(42367),s=e(58837),l=e(72501),c=e(10394),p=e(91638),m=e(46205),k=e(34955),h=e(89509),v=e(71255);const A=(0,s.A)(t=>({label:{fontWeight:600,color:t.palette.text.secondary,marginBottom:t.spacing(.5),fontSize:"0.75rem",textTransform:"uppercase"}})),f=()=>{var t,a,e,s,f,y,b,w,j,P;const x=A(),{entity:I}=(0,i.tN)(),g=(0,r.useApi)(r.configApiRef),S=(0,r.useApi)(r.fetchApiRef),_=(0,r.useApi)(r.identityApiRef),R=g.getString("backend.baseUrl"),{allowed:E,loading:N}=(0,m.l)(k.Al),O=null===(t=I.metadata.annotations)||void 0===t?void 0:t["kuadrant.io/namespace"],C=null===(a=I.metadata.annotations)||void 0===a?void 0:a["kuadrant.io/apiproduct"],{value:U}=(0,p.A)(async()=>(await _.getBackstageIdentity()).userEntityRef.split("/")[1]||"guest",[_]),{value:$,loading:B,error:D}=(0,p.A)(async()=>{if(!O||!C)return null;const t=await S.fetch(`${R}/api/kuadrant/apiproducts/${O}/${C}`);if(!t.ok){const a=await t.json();throw new Error(a.error||`Failed to fetch API product: ${t.status}`)}return t.json()},[R,S,O,C]),F=null==$||null===(s=$.metadata)||void 0===s||null===(e=s.annotations)||void 0===e?void 0:e["backstage.io/owner"],L=null==F?void 0:F.split("/")[1],T=E||U&&L===U;if(!O||!C)return(0,n.jsx)(o.n,{title:"API Product Information",children:(0,n.jsx)(l.A,{children:"No APIProduct linked to this API entity"})});if(B||N)return(0,n.jsx)(o.n,{title:"API Product Information",children:(0,n.jsx)(d.k,{})});if($&&!T)return(0,n.jsx)(o.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(D&&D.message.includes("you can only read your own"))return(0,n.jsx)(o.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(D)return(0,n.jsx)(o.n,{title:"API Product Information",children:(0,n.jsx)(u._,{error:D})});if(!$)return(0,n.jsx)(o.n,{title:"API Product Information",children:(0,n.jsx)(l.A,{children:"APIProduct not found"})});const z=(null===(y=$.status)||void 0===y||null===(f=y.discoveredAuthScheme)||void 0===f?void 0:f.authentication)||{},J=Object.values(z).find(t=>t.hasOwnProperty("jwt")),W=Boolean(J),Y=null==J||null===(b=J.jwt)||void 0===b?void 0:b.issuerUrl,q=null===(j=$.status)||void 0===j||null===(w=j.oidcDiscovery)||void 0===w?void 0:w.tokenEndpoint;return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(o.n,{title:"API Product Details",children:[(0,n.jsxs)(c.A,{mb:2,children:[(0,n.jsx)(l.A,{variant:"caption",className:x.label,children:"Product Name"}),(0,n.jsx)(l.A,{variant:"h6",children:(null===(P=$.spec)||void 0===P?void 0:P.displayName)||C})]}),(0,n.jsx)(h.O,{product:$,showStatus:!1,showCatalogLink:!1})]}),W&&Y&&(0,n.jsx)(c.A,{mt:2,children:(0,n.jsx)(v.n,{issuerUrl:Y,tokenEndpoint:q})})]})}}}]);
|
|
2
|
+
//# sourceMappingURL=5453.ecdee66d.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static/5453.b3ee2392.chunk.js","mappings":"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","sources":["webpack://internal.plugin-kuadrant/./src/permissions.ts","webpack://internal.plugin-kuadrant/./src/utils/permissions.ts","webpack://internal.plugin-kuadrant/./src/components/ApiProductInfoCard/ApiProductInfoCard.tsx"],"sourcesContent":["import { createPermission } from '@backstage/plugin-permission-common';\n\n/**\n * permission definitions for the kuadrant plugin\n *\n * these permissions control access to kuadrant resources and operations.\n * they must match the permissions defined in the backend plugin.\n *\n * permission types:\n * - BasicPermission: standard permission that applies globally\n * - ResourcePermission: permission scoped to specific resource types (e.g., apiproduct)\n *\n * permission patterns:\n * - `.create` - create new resources\n * - `.read` - read resource details\n * - `.read.own` - read only resources owned by the user\n * - `.read.all` - read all resources regardless of ownership\n * - `.update` - modify existing resources\n * - `.delete` - delete resources\n * - `.delete.own` - delete only resources owned by the user\n * - `.delete.all` - delete any resource regardless of ownership\n * - `.list` - list/view collections of resources\n */\n\n// planpolicy permissions\nexport const kuadrantPlanPolicyCreatePermission = createPermission({\n name: 'kuadrant.planpolicy.create',\n attributes: { action: 'create' },\n});\n\nexport const kuadrantPlanPolicyReadPermission = createPermission({\n name: 'kuadrant.planpolicy.read',\n attributes: { action: 'read' },\n});\n\nexport const kuadrantPlanPolicyUpdatePermission = createPermission({\n name: 'kuadrant.planpolicy.update',\n attributes: { action: 'update' },\n});\n\nexport const kuadrantPlanPolicyDeletePermission = createPermission({\n name: 'kuadrant.planpolicy.delete',\n attributes: { action: 'delete' },\n});\n\nexport const kuadrantPlanPolicyListPermission = createPermission({\n name: 'kuadrant.planpolicy.list',\n attributes: { action: 'read' },\n});\n\n// apiproduct permissions\n\n/**\n * permission to create new API products\n * granted to api owners and admins\n */\nexport const kuadrantApiProductCreatePermission = createPermission({\n name: 'kuadrant.apiproduct.create',\n attributes: { action: 'create' },\n});\n\n/**\n * permission to read API products owned by the current user\n * for api owners to view their own products\n */\nexport const kuadrantApiProductReadOwnPermission = createPermission({\n name: 'kuadrant.apiproduct.read.own',\n attributes: { action: 'read' },\n});\n\n/**\n * permission to read all API products regardless of ownership\n * for platform engineers/admins who need to view all products\n */\nexport const kuadrantApiProductReadAllPermission = createPermission({\n name: 'kuadrant.apiproduct.read.all',\n attributes: { action: 'read' },\n});\n\n/**\n * permission to update API products owned by the current user\n * for api owners to modify their own products\n */\nexport const kuadrantApiProductUpdateOwnPermission = createPermission({\n name: 'kuadrant.apiproduct.update.own',\n attributes: { action: 'update' },\n});\n\n/**\n * permission to update any API product regardless of ownership\n * for platform engineers/admins\n */\nexport const kuadrantApiProductUpdateAllPermission = createPermission({\n name: 'kuadrant.apiproduct.update.all',\n attributes: { action: 'update' },\n});\n\n/**\n * permission to delete API products owned by the current user\n * for api owners to remove their own products\n */\nexport const kuadrantApiProductDeleteOwnPermission = createPermission({\n name: 'kuadrant.apiproduct.delete.own',\n attributes: { action: 'delete' },\n});\n\n/**\n * permission to delete any API product regardless of ownership\n * for platform engineers/admins\n */\nexport const kuadrantApiProductDeleteAllPermission = createPermission({\n name: 'kuadrant.apiproduct.delete.all',\n attributes: { action: 'delete' },\n});\n\n/**\n * permission to list API products\n * backend filters results based on .own vs .all read permissions\n */\nexport const kuadrantApiProductListPermission = createPermission({\n name: 'kuadrant.apiproduct.list',\n attributes: { action: 'read' },\n});\n\n// apikey permissions\n\n/**\n * permission to create API keys (request API access)\n *\n * this is a ResourcePermission scoped to 'apiproduct', allowing\n * fine-grained control over which API products users can request access to.\n *\n * use in frontend: useKuadrantPermission(kuadrantApiKeyCreatePermission)\n * use in backend with resource: { permission, resourceRef: 'apiproduct:namespace/name' }\n */\nexport const kuadrantApiKeyCreatePermission = createPermission({\n name: 'kuadrant.apikey.create',\n attributes: { action: 'create' },\n resourceType: 'apiproduct',\n});\n\n/**\n * permission to read API keys owned by the current user\n * allows users to view their own API keys and request history\n */\nexport const kuadrantApiKeyReadOwnPermission = createPermission({\n name: 'kuadrant.apikey.read.own',\n attributes: { action: 'read' },\n});\n\n/**\n * permission to read all API keys regardless of ownership\n * for platform engineers/admins who need to view the approval queue and audit keys\n */\nexport const kuadrantApiKeyReadAllPermission = createPermission({\n name: 'kuadrant.apikey.read.all',\n attributes: { action: 'read' },\n});\n\n/**\n * permission to update API keys owned by the current user\n * allows users to edit their own pending requests (change plan tier, use case)\n */\nexport const kuadrantApiKeyUpdateOwnPermission = createPermission({\n name: 'kuadrant.apikey.update.own',\n attributes: { action: 'update' },\n});\n\n/**\n * permission to update any API key regardless of ownership\n * typically granted to API owners and platform engineers for approving/rejecting requests\n */\nexport const kuadrantApiKeyUpdateAllPermission = createPermission({\n name: 'kuadrant.apikey.update.all',\n attributes: { action: 'update' },\n});\n\n/**\n * permission to delete API keys owned by the current user\n * allows users to cancel their own requests or revoke their own access\n */\nexport const kuadrantApiKeyDeleteOwnPermission = createPermission({\n name: 'kuadrant.apikey.delete.own',\n attributes: { action: 'delete' },\n});\n\n/**\n * permission to delete any API key regardless of ownership\n * for platform engineers/admins who need to revoke access\n */\nexport const kuadrantApiKeyDeleteAllPermission = createPermission({\n name: 'kuadrant.apikey.delete.all',\n attributes: { action: 'delete' },\n});\n\n/**\n * permission to approve/reject API key requests\n * grants access to the approval queue - for API owners and admins only\n * separate from update.own which consumers use to edit their pending requests\n */\nexport const kuadrantApiKeyApprovePermission = createPermission({\n name: 'kuadrant.apikey.approve',\n attributes: { action: 'update' },\n});\n\nexport const kuadrantPermissions = [\n kuadrantPlanPolicyCreatePermission,\n kuadrantPlanPolicyReadPermission,\n kuadrantPlanPolicyUpdatePermission,\n kuadrantPlanPolicyDeletePermission,\n kuadrantPlanPolicyListPermission,\n kuadrantApiProductCreatePermission,\n kuadrantApiProductReadOwnPermission,\n kuadrantApiProductReadAllPermission,\n kuadrantApiProductUpdateOwnPermission,\n kuadrantApiProductUpdateAllPermission,\n kuadrantApiProductDeleteOwnPermission,\n kuadrantApiProductDeleteAllPermission,\n kuadrantApiProductListPermission,\n kuadrantApiKeyCreatePermission,\n kuadrantApiKeyReadOwnPermission,\n kuadrantApiKeyReadAllPermission,\n kuadrantApiKeyUpdateOwnPermission,\n kuadrantApiKeyUpdateAllPermission,\n kuadrantApiKeyDeleteOwnPermission,\n kuadrantApiKeyDeleteAllPermission,\n kuadrantApiKeyApprovePermission,\n];\n","import { usePermission } from '@backstage/plugin-permission-react';\nimport { Permission, ResourcePermission } from '@backstage/plugin-permission-common';\n\n/**\n * result of a permission check including error state\n */\nexport interface PermissionCheckResult {\n allowed: boolean;\n loading: boolean;\n error?: Error;\n}\n\n/**\n * custom hook for checking kuadrant permissions that handles both\n * BasicPermission and ResourcePermission types without type bypasses\n *\n * @param permission - the permission to check\n * @param resourceRef - optional resource reference for ResourcePermissions\n * @returns permission check result with error handling\n *\n * @example\n * // basic permission\n * const { allowed, loading, error } = useKuadrantPermission(\n * kuadrantApiProductListPermission\n * );\n *\n * @example\n * // resource permission\n * const { allowed, loading, error } = useKuadrantPermission(\n * kuadrantApiKeyCreatePermission,\n * 'apiproduct:namespace/name'\n * );\n */\nexport function useKuadrantPermission(\n permission: Permission,\n resourceRef?: string,\n): PermissionCheckResult {\n // construct the permission request based on whether it's a ResourcePermission\n const permissionRequest = 'resourceType' in permission\n ? { permission: permission as ResourcePermission, resourceRef }\n : { permission };\n\n const result = usePermission(permissionRequest as any);\n\n return {\n allowed: result.allowed,\n loading: result.loading,\n error: result.error,\n };\n}\n\n/**\n * helper to determine if a user can delete a specific API key or request\n *\n * @param ownerId - the user id who owns the key/request\n * @param currentUserId - the current user's id\n * @param canDeleteOwn - whether user has permission to delete their own keys\n * @param canDeleteAll - whether user has permission to delete all keys\n * @returns true if user can delete this specific key/request\n */\nexport function canDeleteResource(\n ownerId: string,\n currentUserId: string,\n canDeleteOwn: boolean,\n canDeleteAll: boolean,\n): boolean {\n if (canDeleteAll) return true;\n if (canDeleteOwn && ownerId === currentUserId) return true;\n return false;\n}\n","import React from 'react';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { useApi, configApiRef, fetchApiRef, 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';\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 config = useApi(configApiRef);\n const fetchApi = useApi(fetchApiRef);\n const identityApi = useApi(identityApiRef);\n const backendUrl = config.getString('backend.baseUrl');\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 const productResponse = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/apiproducts/${namespace}/${apiProductName}`\n );\n\n if (!productResponse.ok) {\n const errorData = await productResponse.json();\n throw new Error(errorData.error || `Failed to fetch API product: ${productResponse.status}`);\n }\n\n return productResponse.json();\n }, [backendUrl, fetchApi, 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"],"names":["createPermission","name","attributes","action","kuadrantPlanPolicyListPermission","kuadrantApiProductCreatePermission","kuadrantApiProductReadAllPermission","kuadrantApiProductUpdateOwnPermission","kuadrantApiProductUpdateAllPermission","kuadrantApiProductDeleteOwnPermission","kuadrantApiProductDeleteAllPermission","kuadrantApiProductListPermission","kuadrantApiKeyCreatePermission","resourceType","kuadrantApiKeyReadOwnPermission","kuadrantApiKeyUpdateOwnPermission","kuadrantApiKeyUpdateAllPermission","kuadrantApiKeyDeleteOwnPermission","kuadrantApiKeyDeleteAllPermission","kuadrantApiKeyApprovePermission","useKuadrantPermission","permission","resourceRef","permissionRequest","result","usePermission","allowed","loading","error","canDeleteResource","ownerId","currentUserId","canDeleteOwn","canDeleteAll","useStyles","makeStyles","theme","label","fontWeight","color","palette","text","secondary","marginBottom","spacing","fontSize","textTransform","ApiProductInfoCard","entity","apiProduct","classes","useEntity","config","useApi","configApiRef","fetchApi","fetchApiRef","identityApi","identityApiRef","backendUrl","getString","canReadAll","permLoading","namespace","metadata","annotations","apiProductName","value","useAsync","async","getBackstageIdentity","userEntityRef","split","productResponse","fetch","ok","errorData","json","Error","status","owner","ownerUserId","canView","InfoCard","title","Typography","Progress","Box","p","variant","message","includes","ResponseErrorPanel","authSchemes","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"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"static/5453.ecdee66d.chunk.js","mappings":"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","sources":["webpack://internal.plugin-kuadrant/./src/permissions.ts","webpack://internal.plugin-kuadrant/./src/utils/permissions.ts","webpack://internal.plugin-kuadrant/./src/components/ApiProductInfoCard/ApiProductInfoCard.tsx"],"sourcesContent":["import { createPermission } from '@backstage/plugin-permission-common';\n\n/**\n * permission definitions for the kuadrant plugin\n *\n * these permissions control access to kuadrant resources and operations.\n * they must match the permissions defined in the backend plugin.\n *\n * permission types:\n * - BasicPermission: standard permission that applies globally\n * - ResourcePermission: permission scoped to specific resource types (e.g., apiproduct)\n *\n * permission patterns:\n * - `.create` - create new resources\n * - `.read` - read resource details\n * - `.read.own` - read only resources owned by the user\n * - `.read.all` - read all resources regardless of ownership\n * - `.update` - modify existing resources\n * - `.delete` - delete resources\n * - `.delete.own` - delete only resources owned by the user\n * - `.delete.all` - delete any resource regardless of ownership\n * - `.list` - list/view collections of resources\n */\n\n// planpolicy permissions\nexport const kuadrantPlanPolicyCreatePermission = createPermission({\n name: 'kuadrant.planpolicy.create',\n attributes: { action: 'create' },\n});\n\nexport const kuadrantPlanPolicyReadPermission = createPermission({\n name: 'kuadrant.planpolicy.read',\n attributes: { action: 'read' },\n});\n\nexport const kuadrantPlanPolicyUpdatePermission = createPermission({\n name: 'kuadrant.planpolicy.update',\n attributes: { action: 'update' },\n});\n\nexport const kuadrantPlanPolicyDeletePermission = createPermission({\n name: 'kuadrant.planpolicy.delete',\n attributes: { action: 'delete' },\n});\n\nexport const kuadrantPlanPolicyListPermission = createPermission({\n name: 'kuadrant.planpolicy.list',\n attributes: { action: 'read' },\n});\n\n// apiproduct permissions\n\n/**\n * permission to create new API products\n * granted to api owners and admins\n */\nexport const kuadrantApiProductCreatePermission = createPermission({\n name: 'kuadrant.apiproduct.create',\n attributes: { action: 'create' },\n});\n\n/**\n * permission to read API products owned by the current user\n * for api owners to view their own products\n */\nexport const kuadrantApiProductReadOwnPermission = createPermission({\n name: 'kuadrant.apiproduct.read.own',\n attributes: { action: 'read' },\n});\n\n/**\n * permission to read all API products regardless of ownership\n * for platform engineers/admins who need to view all products\n */\nexport const kuadrantApiProductReadAllPermission = createPermission({\n name: 'kuadrant.apiproduct.read.all',\n attributes: { action: 'read' },\n});\n\n/**\n * permission to update API products owned by the current user\n * for api owners to modify their own products\n */\nexport const kuadrantApiProductUpdateOwnPermission = createPermission({\n name: 'kuadrant.apiproduct.update.own',\n attributes: { action: 'update' },\n});\n\n/**\n * permission to update any API product regardless of ownership\n * for platform engineers/admins\n */\nexport const kuadrantApiProductUpdateAllPermission = createPermission({\n name: 'kuadrant.apiproduct.update.all',\n attributes: { action: 'update' },\n});\n\n/**\n * permission to delete API products owned by the current user\n * for api owners to remove their own products\n */\nexport const kuadrantApiProductDeleteOwnPermission = createPermission({\n name: 'kuadrant.apiproduct.delete.own',\n attributes: { action: 'delete' },\n});\n\n/**\n * permission to delete any API product regardless of ownership\n * for platform engineers/admins\n */\nexport const kuadrantApiProductDeleteAllPermission = createPermission({\n name: 'kuadrant.apiproduct.delete.all',\n attributes: { action: 'delete' },\n});\n\n/**\n * permission to list API products\n * backend filters results based on .own vs .all read permissions\n */\nexport const kuadrantApiProductListPermission = createPermission({\n name: 'kuadrant.apiproduct.list',\n attributes: { action: 'read' },\n});\n\n// apikey permissions\n\n/**\n * permission to create API keys (request API access)\n *\n * this is a ResourcePermission scoped to 'apiproduct', allowing\n * fine-grained control over which API products users can request access to.\n *\n * use in frontend: useKuadrantPermission(kuadrantApiKeyCreatePermission)\n * use in backend with resource: { permission, resourceRef: 'apiproduct:namespace/name' }\n */\nexport const kuadrantApiKeyCreatePermission = createPermission({\n name: 'kuadrant.apikey.create',\n attributes: { action: 'create' },\n resourceType: 'apiproduct',\n});\n\n/**\n * permission to read API keys owned by the current user\n * allows users to view their own API keys and request history\n */\nexport const kuadrantApiKeyReadOwnPermission = createPermission({\n name: 'kuadrant.apikey.read.own',\n attributes: { action: 'read' },\n});\n\n/**\n * permission to read all API keys regardless of ownership\n * for platform engineers/admins who need to view the approval queue and audit keys\n */\nexport const kuadrantApiKeyReadAllPermission = createPermission({\n name: 'kuadrant.apikey.read.all',\n attributes: { action: 'read' },\n});\n\n/**\n * permission to update API keys owned by the current user\n * allows users to edit their own pending requests (change plan tier, use case)\n */\nexport const kuadrantApiKeyUpdateOwnPermission = createPermission({\n name: 'kuadrant.apikey.update.own',\n attributes: { action: 'update' },\n});\n\n/**\n * permission to update any API key regardless of ownership\n * typically granted to API owners and platform engineers for approving/rejecting requests\n */\nexport const kuadrantApiKeyUpdateAllPermission = createPermission({\n name: 'kuadrant.apikey.update.all',\n attributes: { action: 'update' },\n});\n\n/**\n * permission to delete API keys owned by the current user\n * allows users to cancel their own requests or revoke their own access\n */\nexport const kuadrantApiKeyDeleteOwnPermission = createPermission({\n name: 'kuadrant.apikey.delete.own',\n attributes: { action: 'delete' },\n});\n\n/**\n * permission to delete any API key regardless of ownership\n * for platform engineers/admins who need to revoke access\n */\nexport const kuadrantApiKeyDeleteAllPermission = createPermission({\n name: 'kuadrant.apikey.delete.all',\n attributes: { action: 'delete' },\n});\n\n/**\n * permission to approve/reject API key requests\n * grants access to the approval queue - for API owners and admins only\n * separate from update.own which consumers use to edit their pending requests\n */\nexport const kuadrantApiKeyApprovePermission = createPermission({\n name: 'kuadrant.apikey.approve',\n attributes: { action: 'update' },\n});\n\nexport const kuadrantPermissions = [\n kuadrantPlanPolicyCreatePermission,\n kuadrantPlanPolicyReadPermission,\n kuadrantPlanPolicyUpdatePermission,\n kuadrantPlanPolicyDeletePermission,\n kuadrantPlanPolicyListPermission,\n kuadrantApiProductCreatePermission,\n kuadrantApiProductReadOwnPermission,\n kuadrantApiProductReadAllPermission,\n kuadrantApiProductUpdateOwnPermission,\n kuadrantApiProductUpdateAllPermission,\n kuadrantApiProductDeleteOwnPermission,\n kuadrantApiProductDeleteAllPermission,\n kuadrantApiProductListPermission,\n kuadrantApiKeyCreatePermission,\n kuadrantApiKeyReadOwnPermission,\n kuadrantApiKeyReadAllPermission,\n kuadrantApiKeyUpdateOwnPermission,\n kuadrantApiKeyUpdateAllPermission,\n kuadrantApiKeyDeleteOwnPermission,\n kuadrantApiKeyDeleteAllPermission,\n kuadrantApiKeyApprovePermission,\n];\n","import { usePermission } from '@backstage/plugin-permission-react';\nimport { Permission, ResourcePermission } from '@backstage/plugin-permission-common';\n\n/**\n * result of a permission check including error state\n */\nexport interface PermissionCheckResult {\n allowed: boolean;\n loading: boolean;\n error?: Error;\n}\n\n/**\n * custom hook for checking kuadrant permissions that handles both\n * BasicPermission and ResourcePermission types without type bypasses\n *\n * @param permission - the permission to check\n * @param resourceRef - optional resource reference for ResourcePermissions\n * @returns permission check result with error handling\n *\n * @example\n * // basic permission\n * const { allowed, loading, error } = useKuadrantPermission(\n * kuadrantApiProductListPermission\n * );\n *\n * @example\n * // resource permission\n * const { allowed, loading, error } = useKuadrantPermission(\n * kuadrantApiKeyCreatePermission,\n * 'apiproduct:namespace/name'\n * );\n */\nexport function useKuadrantPermission(\n permission: Permission,\n resourceRef?: string,\n): PermissionCheckResult {\n // construct the permission request based on whether it's a ResourcePermission\n const permissionRequest = 'resourceType' in permission\n ? { permission: permission as ResourcePermission, resourceRef }\n : { permission };\n\n const result = usePermission(permissionRequest as any);\n\n return {\n allowed: result.allowed,\n loading: result.loading,\n error: result.error,\n };\n}\n\n/**\n * helper to determine if a user can delete a specific API key or request\n *\n * @param ownerId - the user id who owns the key/request\n * @param currentUserId - the current user's id\n * @param canDeleteOwn - whether user has permission to delete their own keys\n * @param canDeleteAll - whether user has permission to delete all keys\n * @returns true if user can delete this specific key/request\n */\nexport function canDeleteResource(\n ownerId: string,\n currentUserId: string,\n canDeleteOwn: boolean,\n canDeleteAll: boolean,\n): boolean {\n if (canDeleteAll) return true;\n if (canDeleteOwn && ownerId === currentUserId) return true;\n return false;\n}\n","import React from 'react';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { useApi, configApiRef, fetchApiRef, 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';\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 config = useApi(configApiRef);\n const fetchApi = useApi(fetchApiRef);\n const identityApi = useApi(identityApiRef);\n const backendUrl = config.getString('backend.baseUrl');\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 const productResponse = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/apiproducts/${namespace}/${apiProductName}`\n );\n\n if (!productResponse.ok) {\n const errorData = await productResponse.json();\n throw new Error(errorData.error || `Failed to fetch API product: ${productResponse.status}`);\n }\n\n return productResponse.json();\n }, [backendUrl, fetchApi, 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"],"names":["createPermission","name","attributes","action","kuadrantPlanPolicyListPermission","kuadrantApiProductCreatePermission","kuadrantApiProductReadAllPermission","kuadrantApiProductUpdateOwnPermission","kuadrantApiProductUpdateAllPermission","kuadrantApiProductDeleteOwnPermission","kuadrantApiProductDeleteAllPermission","kuadrantApiProductListPermission","kuadrantApiKeyCreatePermission","resourceType","kuadrantApiKeyReadOwnPermission","kuadrantApiKeyUpdateOwnPermission","kuadrantApiKeyUpdateAllPermission","kuadrantApiKeyDeleteOwnPermission","kuadrantApiKeyDeleteAllPermission","kuadrantApiKeyApprovePermission","useKuadrantPermission","permission","resourceRef","permissionRequest","result","usePermission","allowed","loading","error","canDeleteResource","ownerId","currentUserId","canDeleteOwn","canDeleteAll","useStyles","makeStyles","theme","label","fontWeight","color","palette","text","secondary","marginBottom","spacing","fontSize","textTransform","ApiProductInfoCard","entity","apiProduct","classes","useEntity","config","useApi","configApiRef","fetchApi","fetchApiRef","identityApi","identityApiRef","backendUrl","getString","canReadAll","permLoading","namespace","metadata","annotations","apiProductName","value","useAsync","async","getBackstageIdentity","userEntityRef","split","productResponse","fetch","ok","errorData","json","Error","status","owner","ownerUserId","canView","InfoCard","title","Typography","Progress","Box","p","variant","message","includes","ResponseErrorPanel","authSchemes","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"],"sourceRoot":""}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/*! For license information please see 6038.63d1f832.chunk.js.LICENSE.txt */
|
|
2
|
+
"use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[6038],{26685:(e,t)=>{var r="function"==typeof Symbol&&Symbol.for,n=r?Symbol.for("react.element"):60103,o=r?Symbol.for("react.portal"):60106,a=r?Symbol.for("react.fragment"):60107,s=r?Symbol.for("react.strict_mode"):60108,c=r?Symbol.for("react.profiler"):60114,i=r?Symbol.for("react.provider"):60109,u=r?Symbol.for("react.context"):60110,f=r?Symbol.for("react.async_mode"):60111,l=r?Symbol.for("react.concurrent_mode"):60111,y=r?Symbol.for("react.forward_ref"):60112,m=r?Symbol.for("react.suspense"):60113,p=r?Symbol.for("react.suspense_list"):60120,d=r?Symbol.for("react.memo"):60115,v=r?Symbol.for("react.lazy"):60116,h=r?Symbol.for("react.block"):60121,g=r?Symbol.for("react.fundamental"):60117,b=r?Symbol.for("react.responder"):60118,S=r?Symbol.for("react.scope"):60119;function $(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case n:switch(e=e.type){case f:case l:case a:case c:case s:case m:return e;default:switch(e=e&&e.$$typeof){case u:case y:case v:case d:case i:return e;default:return t}}case o:return t}}}function x(e){return $(e)===l}t.AsyncMode=f,t.ConcurrentMode=l,t.ContextConsumer=u,t.ContextProvider=i,t.Element=n,t.ForwardRef=y,t.Fragment=a,t.Lazy=v,t.Memo=d,t.Portal=o,t.Profiler=c,t.StrictMode=s,t.Suspense=m,t.isAsyncMode=function(e){return x(e)||$(e)===f},t.isConcurrentMode=x,t.isContextConsumer=function(e){return $(e)===u},t.isContextProvider=function(e){return $(e)===i},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===n},t.isForwardRef=function(e){return $(e)===y},t.isFragment=function(e){return $(e)===a},t.isLazy=function(e){return $(e)===v},t.isMemo=function(e){return $(e)===d},t.isPortal=function(e){return $(e)===o},t.isProfiler=function(e){return $(e)===c},t.isStrictMode=function(e){return $(e)===s},t.isSuspense=function(e){return $(e)===m},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===a||e===l||e===c||e===s||e===m||e===p||"object"==typeof e&&null!==e&&(e.$$typeof===v||e.$$typeof===d||e.$$typeof===i||e.$$typeof===u||e.$$typeof===y||e.$$typeof===g||e.$$typeof===b||e.$$typeof===S||e.$$typeof===h)},t.typeOf=$},53657:(e,t,r)=>{r.r(t),r.d(t,{CacheProvider:()=>d,ClassNames:()=>F,Global:()=>T,ThemeContext:()=>g,ThemeProvider:()=>$,__unsafe_useEmotionCache:()=>v,createElement:()=>O,css:()=>M,jsx:()=>O,keyframes:()=>A,useTheme:()=>b,withEmotionCache:()=>h,withTheme:()=>x});var n=r(95478),o=r(76322),a=r.n(o),s=r(89575),c=function(e){var t=new WeakMap;return function(r){if(t.has(r))return t.get(r);var n=e(r);return t.set(r,n),n}},i=r(75985),u=r.n(i),f=function(e,t){return u()(e,t)},l=r(85780),y=r(85557),m=r(16558),p=n.createContext("undefined"!=typeof HTMLElement?a()({key:"css"}):null),d=p.Provider,v=function(){return(0,n.useContext)(p)},h=function(e){return(0,n.forwardRef)(function(t,r){var o=(0,n.useContext)(p);return e(t,o,r)})},g=n.createContext({}),b=function(){return n.useContext(g)},S=c(function(e){return c(function(t){return function(e,t){return"function"==typeof t?t(e):(0,s.A)({},e,t)}(e,t)})}),$=function(e){var t=n.useContext(g);return e.theme!==t&&(t=S(t)(e.theme)),n.createElement(g.Provider,{value:t},e.children)};function x(e){var t=e.displayName||e.name||"Component",r=n.forwardRef(function(t,r){var o=n.useContext(g);return n.createElement(e,(0,s.A)({theme:o,ref:r},t))});return r.displayName="WithTheme("+t+")",f(r,e)}var C,_,E={}.hasOwnProperty,w="__EMOTION_TYPE_PLEASE_DO_NOT_USE__",P=function(e){var t=e.cache,r=e.serialized,n=e.isStringTag;return(0,l.SF)(t,r,n),(0,m.s)(function(){return(0,l.sk)(t,r,n)}),null},k=h(function(e,t,r){var o=e.css;"string"==typeof o&&void 0!==t.registered[o]&&(o=t.registered[o]);var a=e[w],s=[o],c="";"string"==typeof e.className?c=(0,l.Rk)(t.registered,s,e.className):null!=e.className&&(c=e.className+" ");var i=(0,y.J)(s,void 0,n.useContext(g));c+=t.key+"-"+i.name;var u={};for(var f in e)E.call(e,f)&&"css"!==f&&f!==w&&(u[f]=e[f]);return u.className=c,r&&(u.ref=r),n.createElement(n.Fragment,null,n.createElement(P,{cache:t,serialized:i,isStringTag:"string"==typeof a}),n.createElement(a,u))}),O=function(e,t){var r=arguments;if(null==t||!E.call(t,"css"))return n.createElement.apply(void 0,r);var o=r.length,a=new Array(o);a[0]=k,a[1]=function(e,t){var r={};for(var n in t)E.call(t,n)&&(r[n]=t[n]);return r[w]=e,r}(e,t);for(var s=2;s<o;s++)a[s]=r[s];return n.createElement.apply(null,a)};C=O||(O={}),_||(_=C.JSX||(C.JSX={}));var T=h(function(e,t){var r=e.styles,o=(0,y.J)([r],void 0,n.useContext(g)),a=n.useRef();return(0,m.i)(function(){var e=t.key+"-global",r=new t.sheet.constructor({key:e,nonce:t.sheet.nonce,container:t.sheet.container,speedy:t.sheet.isSpeedy}),n=!1,s=document.querySelector('style[data-emotion="'+e+" "+o.name+'"]');return t.sheet.tags.length&&(r.before=t.sheet.tags[0]),null!==s&&(n=!0,s.setAttribute("data-emotion",e),r.hydrate([s])),a.current=[r,n],function(){r.flush()}},[t]),(0,m.i)(function(){var e=a.current,r=e[0];if(e[1])e[1]=!1;else{if(void 0!==o.next&&(0,l.sk)(t,o.next,!0),r.tags.length){var n=r.tags[r.tags.length-1].nextElementSibling;r.before=n,r.flush()}t.insert("",o,r,!1)}},[t,o.name]),null});function M(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];return(0,y.J)(t)}function A(){var e=M.apply(void 0,arguments),t="animation-"+e.name;return{name:t,styles:"@keyframes "+t+"{"+e.styles+"}",anim:1,toString:function(){return"_EMO_"+this.name+"_"+this.styles+"_EMO_"}}}var N=function e(t){for(var r=t.length,n=0,o="";n<r;n++){var a=t[n];if(null!=a){var s=void 0;switch(typeof a){case"boolean":break;case"object":if(Array.isArray(a))s=e(a);else for(var c in s="",a)a[c]&&c&&(s&&(s+=" "),s+=c);break;default:s=a}s&&(o&&(o+=" "),o+=s)}}return o},j=function(e){var t=e.cache,r=e.serializedArr;return(0,m.s)(function(){for(var e=0;e<r.length;e++)(0,l.sk)(t,r[e],!1)}),null},F=h(function(e,t){var r=[],o=function(){for(var e=arguments.length,n=new Array(e),o=0;o<e;o++)n[o]=arguments[o];var a=(0,y.J)(n,t.registered);return r.push(a),(0,l.SF)(t,a,!1),t.key+"-"+a.name},a={css:o,cx:function(){for(var e=arguments.length,r=new Array(e),n=0;n<e;n++)r[n]=arguments[n];return function(e,t,r){var n=[],o=(0,l.Rk)(e,n,r);return n.length<2?r:o+t(n)}(t.registered,o,N(r))},theme:n.useContext(g)},s=e.children(a);return n.createElement(n.Fragment,null,n.createElement(j,{cache:t,serializedArr:r}),s)})},65521:(e,t,r)=>{e.exports=r(26685)},75985:(e,t,r)=>{var n=r(65521),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},s={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},c={};function i(e){return n.isMemo(e)?s:c[e.$$typeof]||o}c[n.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},c[n.Memo]=s;var u=Object.defineProperty,f=Object.getOwnPropertyNames,l=Object.getOwnPropertySymbols,y=Object.getOwnPropertyDescriptor,m=Object.getPrototypeOf,p=Object.prototype;e.exports=function e(t,r,n){if("string"!=typeof r){if(p){var o=m(r);o&&o!==p&&e(t,o,n)}var s=f(r);l&&(s=s.concat(l(r)));for(var c=i(t),d=i(r),v=0;v<s.length;++v){var h=s[v];if(!(a[h]||n&&n[h]||d&&d[h]||c&&c[h])){var g=y(r,h);try{u(t,h,g)}catch(e){}}}}return t}}}]);
|
|
3
|
+
//# sourceMappingURL=6038.63d1f832.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static/6038.63d1f832.chunk.js","mappings":"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","sources":["webpack://internal.plugin-kuadrant/../../node_modules/hoist-non-react-statics/node_modules/react-is/cjs/react-is.production.min.js","webpack://internal.plugin-kuadrant/../../node_modules/@emotion/weak-memoize/dist/emotion-weak-memoize.esm.js","webpack://internal.plugin-kuadrant/../../node_modules/@emotion/react/_isolated-hnrs/dist/emotion-react-_isolated-hnrs.browser.esm.js","webpack://internal.plugin-kuadrant/../../node_modules/@emotion/react/dist/emotion-element-f0de968e.browser.esm.js","webpack://internal.plugin-kuadrant/../../node_modules/@emotion/react/dist/emotion-react.browser.esm.js","webpack://internal.plugin-kuadrant/../../node_modules/hoist-non-react-statics/node_modules/react-is/index.js","webpack://internal.plugin-kuadrant/../../node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js"],"sourcesContent":["/** @license React v16.13.1\n * react-is.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';var b=\"function\"===typeof Symbol&&Symbol.for,c=b?Symbol.for(\"react.element\"):60103,d=b?Symbol.for(\"react.portal\"):60106,e=b?Symbol.for(\"react.fragment\"):60107,f=b?Symbol.for(\"react.strict_mode\"):60108,g=b?Symbol.for(\"react.profiler\"):60114,h=b?Symbol.for(\"react.provider\"):60109,k=b?Symbol.for(\"react.context\"):60110,l=b?Symbol.for(\"react.async_mode\"):60111,m=b?Symbol.for(\"react.concurrent_mode\"):60111,n=b?Symbol.for(\"react.forward_ref\"):60112,p=b?Symbol.for(\"react.suspense\"):60113,q=b?\nSymbol.for(\"react.suspense_list\"):60120,r=b?Symbol.for(\"react.memo\"):60115,t=b?Symbol.for(\"react.lazy\"):60116,v=b?Symbol.for(\"react.block\"):60121,w=b?Symbol.for(\"react.fundamental\"):60117,x=b?Symbol.for(\"react.responder\"):60118,y=b?Symbol.for(\"react.scope\"):60119;\nfunction z(a){if(\"object\"===typeof a&&null!==a){var u=a.$$typeof;switch(u){case c:switch(a=a.type,a){case l:case m:case e:case g:case f:case p:return a;default:switch(a=a&&a.$$typeof,a){case k:case n:case t:case r:case h:return a;default:return u}}case d:return u}}}function A(a){return z(a)===m}exports.AsyncMode=l;exports.ConcurrentMode=m;exports.ContextConsumer=k;exports.ContextProvider=h;exports.Element=c;exports.ForwardRef=n;exports.Fragment=e;exports.Lazy=t;exports.Memo=r;exports.Portal=d;\nexports.Profiler=g;exports.StrictMode=f;exports.Suspense=p;exports.isAsyncMode=function(a){return A(a)||z(a)===l};exports.isConcurrentMode=A;exports.isContextConsumer=function(a){return z(a)===k};exports.isContextProvider=function(a){return z(a)===h};exports.isElement=function(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===c};exports.isForwardRef=function(a){return z(a)===n};exports.isFragment=function(a){return z(a)===e};exports.isLazy=function(a){return z(a)===t};\nexports.isMemo=function(a){return z(a)===r};exports.isPortal=function(a){return z(a)===d};exports.isProfiler=function(a){return z(a)===g};exports.isStrictMode=function(a){return z(a)===f};exports.isSuspense=function(a){return z(a)===p};\nexports.isValidElementType=function(a){return\"string\"===typeof a||\"function\"===typeof a||a===e||a===m||a===g||a===f||a===p||a===q||\"object\"===typeof a&&null!==a&&(a.$$typeof===t||a.$$typeof===r||a.$$typeof===h||a.$$typeof===k||a.$$typeof===n||a.$$typeof===w||a.$$typeof===x||a.$$typeof===y||a.$$typeof===v)};exports.typeOf=z;\n","var weakMemoize = function weakMemoize(func) {\n var cache = new WeakMap();\n return function (arg) {\n if (cache.has(arg)) {\n // Use non-null assertion because we just checked that the cache `has` it\n // This allows us to remove `undefined` from the return value\n return cache.get(arg);\n }\n\n var ret = func(arg);\n cache.set(arg, ret);\n return ret;\n };\n};\n\nexport { weakMemoize as default };\n","import hoistNonReactStatics$1 from 'hoist-non-react-statics';\n\n// this file isolates this package that is not tree-shakeable\n// and if this module doesn't actually contain any logic of its own\n// then Rollup just use 'hoist-non-react-statics' directly in other chunks\n\nvar hoistNonReactStatics = (function (targetComponent, sourceComponent) {\n return hoistNonReactStatics$1(targetComponent, sourceComponent);\n});\n\nexport { hoistNonReactStatics as default };\n","import * as React from 'react';\nimport { useContext, forwardRef } from 'react';\nimport createCache from '@emotion/cache';\nimport _extends from '@babel/runtime/helpers/esm/extends';\nimport weakMemoize from '@emotion/weak-memoize';\nimport hoistNonReactStatics from '../_isolated-hnrs/dist/emotion-react-_isolated-hnrs.browser.esm.js';\nimport { getRegisteredStyles, registerStyles, insertStyles } from '@emotion/utils';\nimport { serializeStyles } from '@emotion/serialize';\nimport { useInsertionEffectAlwaysWithSyncFallback } from '@emotion/use-insertion-effect-with-fallbacks';\n\nvar isDevelopment = false;\n\nvar EmotionCacheContext = /* #__PURE__ */React.createContext( // we're doing this to avoid preconstruct's dead code elimination in this one case\n// because this module is primarily intended for the browser and node\n// but it's also required in react native and similar environments sometimes\n// and we could have a special build just for that\n// but this is much easier and the native packages\n// might use a different theme context in the future anyway\ntypeof HTMLElement !== 'undefined' ? /* #__PURE__ */createCache({\n key: 'css'\n}) : null);\n\nvar CacheProvider = EmotionCacheContext.Provider;\nvar __unsafe_useEmotionCache = function useEmotionCache() {\n return useContext(EmotionCacheContext);\n};\n\nvar withEmotionCache = function withEmotionCache(func) {\n return /*#__PURE__*/forwardRef(function (props, ref) {\n // the cache will never be null in the browser\n var cache = useContext(EmotionCacheContext);\n return func(props, cache, ref);\n });\n};\n\nvar ThemeContext = /* #__PURE__ */React.createContext({});\n\nvar useTheme = function useTheme() {\n return React.useContext(ThemeContext);\n};\n\nvar getTheme = function getTheme(outerTheme, theme) {\n if (typeof theme === 'function') {\n var mergedTheme = theme(outerTheme);\n\n return mergedTheme;\n }\n\n return _extends({}, outerTheme, theme);\n};\n\nvar createCacheWithTheme = /* #__PURE__ */weakMemoize(function (outerTheme) {\n return weakMemoize(function (theme) {\n return getTheme(outerTheme, theme);\n });\n});\nvar ThemeProvider = function ThemeProvider(props) {\n var theme = React.useContext(ThemeContext);\n\n if (props.theme !== theme) {\n theme = createCacheWithTheme(theme)(props.theme);\n }\n\n return /*#__PURE__*/React.createElement(ThemeContext.Provider, {\n value: theme\n }, props.children);\n};\nfunction withTheme(Component) {\n var componentName = Component.displayName || Component.name || 'Component';\n var WithTheme = /*#__PURE__*/React.forwardRef(function render(props, ref) {\n var theme = React.useContext(ThemeContext);\n return /*#__PURE__*/React.createElement(Component, _extends({\n theme: theme,\n ref: ref\n }, props));\n });\n WithTheme.displayName = \"WithTheme(\" + componentName + \")\";\n return hoistNonReactStatics(WithTheme, Component);\n}\n\nvar hasOwn = {}.hasOwnProperty;\n\nvar typePropName = '__EMOTION_TYPE_PLEASE_DO_NOT_USE__';\nvar createEmotionProps = function createEmotionProps(type, props) {\n\n var newProps = {};\n\n for (var _key in props) {\n if (hasOwn.call(props, _key)) {\n newProps[_key] = props[_key];\n }\n }\n\n newProps[typePropName] = type; // Runtime labeling is an opt-in feature because:\n\n return newProps;\n};\n\nvar Insertion = function Insertion(_ref) {\n var cache = _ref.cache,\n serialized = _ref.serialized,\n isStringTag = _ref.isStringTag;\n registerStyles(cache, serialized, isStringTag);\n useInsertionEffectAlwaysWithSyncFallback(function () {\n return insertStyles(cache, serialized, isStringTag);\n });\n\n return null;\n};\n\nvar Emotion = /* #__PURE__ */withEmotionCache(function (props, cache, ref) {\n var cssProp = props.css; // so that using `css` from `emotion` and passing the result to the css prop works\n // not passing the registered cache to serializeStyles because it would\n // make certain babel optimisations not possible\n\n if (typeof cssProp === 'string' && cache.registered[cssProp] !== undefined) {\n cssProp = cache.registered[cssProp];\n }\n\n var WrappedComponent = props[typePropName];\n var registeredStyles = [cssProp];\n var className = '';\n\n if (typeof props.className === 'string') {\n className = getRegisteredStyles(cache.registered, registeredStyles, props.className);\n } else if (props.className != null) {\n className = props.className + \" \";\n }\n\n var serialized = serializeStyles(registeredStyles, undefined, React.useContext(ThemeContext));\n\n className += cache.key + \"-\" + serialized.name;\n var newProps = {};\n\n for (var _key2 in props) {\n if (hasOwn.call(props, _key2) && _key2 !== 'css' && _key2 !== typePropName && (!isDevelopment )) {\n newProps[_key2] = props[_key2];\n }\n }\n\n newProps.className = className;\n\n if (ref) {\n newProps.ref = ref;\n }\n\n return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Insertion, {\n cache: cache,\n serialized: serialized,\n isStringTag: typeof WrappedComponent === 'string'\n }), /*#__PURE__*/React.createElement(WrappedComponent, newProps));\n});\n\nvar Emotion$1 = Emotion;\n\nexport { CacheProvider as C, Emotion$1 as E, ThemeContext as T, __unsafe_useEmotionCache as _, ThemeProvider as a, withTheme as b, createEmotionProps as c, hasOwn as h, isDevelopment as i, useTheme as u, withEmotionCache as w };\n","import { h as hasOwn, E as Emotion, c as createEmotionProps, w as withEmotionCache, T as ThemeContext, i as isDevelopment } from './emotion-element-f0de968e.browser.esm.js';\nexport { C as CacheProvider, T as ThemeContext, a as ThemeProvider, _ as __unsafe_useEmotionCache, u as useTheme, w as withEmotionCache, b as withTheme } from './emotion-element-f0de968e.browser.esm.js';\nimport * as React from 'react';\nimport { insertStyles, registerStyles, getRegisteredStyles } from '@emotion/utils';\nimport { useInsertionEffectWithLayoutFallback, useInsertionEffectAlwaysWithSyncFallback } from '@emotion/use-insertion-effect-with-fallbacks';\nimport { serializeStyles } from '@emotion/serialize';\nimport '@emotion/cache';\nimport '@babel/runtime/helpers/extends';\nimport '@emotion/weak-memoize';\nimport '../_isolated-hnrs/dist/emotion-react-_isolated-hnrs.browser.esm.js';\nimport 'hoist-non-react-statics';\n\nvar jsx = function jsx(type, props) {\n // eslint-disable-next-line prefer-rest-params\n var args = arguments;\n\n if (props == null || !hasOwn.call(props, 'css')) {\n return React.createElement.apply(undefined, args);\n }\n\n var argsLength = args.length;\n var createElementArgArray = new Array(argsLength);\n createElementArgArray[0] = Emotion;\n createElementArgArray[1] = createEmotionProps(type, props);\n\n for (var i = 2; i < argsLength; i++) {\n createElementArgArray[i] = args[i];\n }\n\n return React.createElement.apply(null, createElementArgArray);\n};\n\n(function (_jsx) {\n var JSX;\n\n (function (_JSX) {})(JSX || (JSX = _jsx.JSX || (_jsx.JSX = {})));\n})(jsx || (jsx = {}));\n\n// initial render from browser, insertBefore context.sheet.tags[0] or if a style hasn't been inserted there yet, appendChild\n// initial client-side render from SSR, use place of hydrating tag\n\nvar Global = /* #__PURE__ */withEmotionCache(function (props, cache) {\n\n var styles = props.styles;\n var serialized = serializeStyles([styles], undefined, React.useContext(ThemeContext));\n // but it is based on a constant that will never change at runtime\n // it's effectively like having two implementations and switching them out\n // so it's not actually breaking anything\n\n\n var sheetRef = React.useRef();\n useInsertionEffectWithLayoutFallback(function () {\n var key = cache.key + \"-global\"; // use case of https://github.com/emotion-js/emotion/issues/2675\n\n var sheet = new cache.sheet.constructor({\n key: key,\n nonce: cache.sheet.nonce,\n container: cache.sheet.container,\n speedy: cache.sheet.isSpeedy\n });\n var rehydrating = false;\n var node = document.querySelector(\"style[data-emotion=\\\"\" + key + \" \" + serialized.name + \"\\\"]\");\n\n if (cache.sheet.tags.length) {\n sheet.before = cache.sheet.tags[0];\n }\n\n if (node !== null) {\n rehydrating = true; // clear the hash so this node won't be recognizable as rehydratable by other <Global/>s\n\n node.setAttribute('data-emotion', key);\n sheet.hydrate([node]);\n }\n\n sheetRef.current = [sheet, rehydrating];\n return function () {\n sheet.flush();\n };\n }, [cache]);\n useInsertionEffectWithLayoutFallback(function () {\n var sheetRefCurrent = sheetRef.current;\n var sheet = sheetRefCurrent[0],\n rehydrating = sheetRefCurrent[1];\n\n if (rehydrating) {\n sheetRefCurrent[1] = false;\n return;\n }\n\n if (serialized.next !== undefined) {\n // insert keyframes\n insertStyles(cache, serialized.next, true);\n }\n\n if (sheet.tags.length) {\n // if this doesn't exist then it will be null so the style element will be appended\n var element = sheet.tags[sheet.tags.length - 1].nextElementSibling;\n sheet.before = element;\n sheet.flush();\n }\n\n cache.insert(\"\", serialized, sheet, false);\n }, [cache, serialized.name]);\n return null;\n});\n\nfunction css() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return serializeStyles(args);\n}\n\nfunction keyframes() {\n var insertable = css.apply(void 0, arguments);\n var name = \"animation-\" + insertable.name;\n return {\n name: name,\n styles: \"@keyframes \" + name + \"{\" + insertable.styles + \"}\",\n anim: 1,\n toString: function toString() {\n return \"_EMO_\" + this.name + \"_\" + this.styles + \"_EMO_\";\n }\n };\n}\n\nvar classnames = function classnames(args) {\n var len = args.length;\n var i = 0;\n var cls = '';\n\n for (; i < len; i++) {\n var arg = args[i];\n if (arg == null) continue;\n var toAdd = void 0;\n\n switch (typeof arg) {\n case 'boolean':\n break;\n\n case 'object':\n {\n if (Array.isArray(arg)) {\n toAdd = classnames(arg);\n } else {\n\n toAdd = '';\n\n for (var k in arg) {\n if (arg[k] && k) {\n toAdd && (toAdd += ' ');\n toAdd += k;\n }\n }\n }\n\n break;\n }\n\n default:\n {\n toAdd = arg;\n }\n }\n\n if (toAdd) {\n cls && (cls += ' ');\n cls += toAdd;\n }\n }\n\n return cls;\n};\n\nfunction merge(registered, css, className) {\n var registeredStyles = [];\n var rawClassName = getRegisteredStyles(registered, registeredStyles, className);\n\n if (registeredStyles.length < 2) {\n return className;\n }\n\n return rawClassName + css(registeredStyles);\n}\n\nvar Insertion = function Insertion(_ref) {\n var cache = _ref.cache,\n serializedArr = _ref.serializedArr;\n useInsertionEffectAlwaysWithSyncFallback(function () {\n\n for (var i = 0; i < serializedArr.length; i++) {\n insertStyles(cache, serializedArr[i], false);\n }\n });\n\n return null;\n};\n\nvar ClassNames = /* #__PURE__ */withEmotionCache(function (props, cache) {\n var hasRendered = false;\n var serializedArr = [];\n\n var css = function css() {\n if (hasRendered && isDevelopment) {\n throw new Error('css can only be used during render');\n }\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n var serialized = serializeStyles(args, cache.registered);\n serializedArr.push(serialized); // registration has to happen here as the result of this might get consumed by `cx`\n\n registerStyles(cache, serialized, false);\n return cache.key + \"-\" + serialized.name;\n };\n\n var cx = function cx() {\n if (hasRendered && isDevelopment) {\n throw new Error('cx can only be used during render');\n }\n\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n return merge(cache.registered, css, classnames(args));\n };\n\n var content = {\n css: css,\n cx: cx,\n theme: React.useContext(ThemeContext)\n };\n var ele = props.children(content);\n hasRendered = true;\n return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Insertion, {\n cache: cache,\n serializedArr: serializedArr\n }), ele);\n});\n\nexport { ClassNames, Global, jsx as createElement, css, jsx, keyframes };\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-is.production.min.js');\n} else {\n module.exports = require('./cjs/react-is.development.js');\n}\n","'use strict';\n\nvar reactIs = require('react-is');\n\n/**\n * Copyright 2015, Yahoo! Inc.\n * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.\n */\nvar REACT_STATICS = {\n childContextTypes: true,\n contextType: true,\n contextTypes: true,\n defaultProps: true,\n displayName: true,\n getDefaultProps: true,\n getDerivedStateFromError: true,\n getDerivedStateFromProps: true,\n mixins: true,\n propTypes: true,\n type: true\n};\nvar KNOWN_STATICS = {\n name: true,\n length: true,\n prototype: true,\n caller: true,\n callee: true,\n arguments: true,\n arity: true\n};\nvar FORWARD_REF_STATICS = {\n '$$typeof': true,\n render: true,\n defaultProps: true,\n displayName: true,\n propTypes: true\n};\nvar MEMO_STATICS = {\n '$$typeof': true,\n compare: true,\n defaultProps: true,\n displayName: true,\n propTypes: true,\n type: true\n};\nvar TYPE_STATICS = {};\nTYPE_STATICS[reactIs.ForwardRef] = FORWARD_REF_STATICS;\nTYPE_STATICS[reactIs.Memo] = MEMO_STATICS;\n\nfunction getStatics(component) {\n // React v16.11 and below\n if (reactIs.isMemo(component)) {\n return MEMO_STATICS;\n } // React v16.12 and above\n\n\n return TYPE_STATICS[component['$$typeof']] || REACT_STATICS;\n}\n\nvar defineProperty = Object.defineProperty;\nvar getOwnPropertyNames = Object.getOwnPropertyNames;\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar getPrototypeOf = Object.getPrototypeOf;\nvar objectPrototype = Object.prototype;\nfunction hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {\n if (typeof sourceComponent !== 'string') {\n // don't hoist over string (html) components\n if (objectPrototype) {\n var inheritedComponent = getPrototypeOf(sourceComponent);\n\n if (inheritedComponent && inheritedComponent !== objectPrototype) {\n hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);\n }\n }\n\n var keys = getOwnPropertyNames(sourceComponent);\n\n if (getOwnPropertySymbols) {\n keys = keys.concat(getOwnPropertySymbols(sourceComponent));\n }\n\n var targetStatics = getStatics(targetComponent);\n var sourceStatics = getStatics(sourceComponent);\n\n for (var i = 0; i < keys.length; ++i) {\n var key = keys[i];\n\n if (!KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) && !(targetStatics && targetStatics[key])) {\n var descriptor = getOwnPropertyDescriptor(sourceComponent, key);\n\n try {\n // Avoid failures from read-only properties\n defineProperty(targetComponent, key, descriptor);\n } catch (e) {}\n }\n }\n }\n\n return targetComponent;\n}\n\nmodule.exports = hoistNonReactStatics;\n"],"names":["b","Symbol","for","c","d","e","f","g","h","k","l","m","n","p","q","r","t","v","w","x","y","z","a","u","$$typeof","type","A","exports","AsyncMode","ConcurrentMode","ContextConsumer","ContextProvider","Element","ForwardRef","Fragment","Lazy","Memo","Portal","Profiler","StrictMode","Suspense","isAsyncMode","isConcurrentMode","isContextConsumer","isContextProvider","isElement","isForwardRef","isFragment","isLazy","isMemo","isPortal","isProfiler","isStrictMode","isSuspense","isValidElementType","typeOf","weakMemoize","func","cache","WeakMap","arg","has","get","ret","set","hoistNonReactStatics","targetComponent","sourceComponent","EmotionCacheContext","HTMLElement","key","CacheProvider","Provider","__unsafe_useEmotionCache","useContext","withEmotionCache","forwardRef","props","ref","ThemeContext","useTheme","createCacheWithTheme","outerTheme","theme","getTheme","ThemeProvider","value","children","withTheme","Component","componentName","displayName","name","WithTheme","_jsx","JSX","hasOwn","hasOwnProperty","typePropName","Insertion","_ref","serialized","isStringTag","Emotion$1","cssProp","css","undefined","registered","WrappedComponent","registeredStyles","className","newProps","_key2","call","jsx","args","arguments","apply","argsLength","length","createElementArgArray","Array","_key","createEmotionProps","i","Global","styles","sheetRef","sheet","constructor","nonce","container","speedy","isSpeedy","rehydrating","node","document","querySelector","tags","before","setAttribute","hydrate","current","flush","sheetRefCurrent","next","element","nextElementSibling","insert","_len","keyframes","insertable","anim","toString","this","classnames","len","cls","toAdd","isArray","serializedArr","ClassNames","push","content","cx","_len2","rawClassName","merge","ele","module","reactIs","REACT_STATICS","childContextTypes","contextType","contextTypes","defaultProps","getDefaultProps","getDerivedStateFromError","getDerivedStateFromProps","mixins","propTypes","KNOWN_STATICS","prototype","caller","callee","arity","MEMO_STATICS","compare","TYPE_STATICS","getStatics","component","render","defineProperty","Object","getOwnPropertyNames","getOwnPropertySymbols","getOwnPropertyDescriptor","getPrototypeOf","objectPrototype","blacklist","inheritedComponent","keys","concat","targetStatics","sourceStatics","descriptor"],"sourceRoot":""}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/*! For license information please see 635.e030b18a.chunk.js.LICENSE.txt */
|
|
2
|
+
"use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[635,1085],{31085:(r,e,n)=>{r.exports=n(73335)},73335:(r,e,n)=>{var t=n(95478),a=Symbol.for("react.element"),o=Symbol.for("react.fragment"),l=Object.prototype.hasOwnProperty,u=t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,f={key:!0,ref:!0,__self:!0,__source:!0};function s(r,e,n){var t,o={},s=null,_=null;for(t in void 0!==n&&(s=""+n),void 0!==e.key&&(s=""+e.key),void 0!==e.ref&&(_=e.ref),e)l.call(e,t)&&!f.hasOwnProperty(t)&&(o[t]=e[t]);if(r&&r.defaultProps)for(t in e=r.defaultProps)void 0===o[t]&&(o[t]=e[t]);return{$$typeof:a,type:r,key:s,ref:_,props:o,_owner:u.current}}e.Fragment=o,e.jsx=s,e.jsxs=s},89575:(r,e,n)=>{function t(){return t=Object.assign?Object.assign.bind():function(r){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var t in n)({}).hasOwnProperty.call(n,t)&&(r[t]=n[t])}return r},t.apply(null,arguments)}n.d(e,{A:()=>t})}}]);
|
|
3
|
+
//# sourceMappingURL=635.e030b18a.chunk.js.map
|