@kuadrant/kuadrant-backstage-plugin-frontend 0.0.2-dev-0b744dd → 0.0.2-dev-9be93a3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api.esm.js +220 -0
- package/dist/api.esm.js.map +1 -0
- package/dist/apis.esm.js +15 -0
- package/dist/apis.esm.js.map +1 -0
- package/dist/components/ApiAccessCard/ApiAccessCard.esm.js +27 -37
- package/dist/components/ApiAccessCard/ApiAccessCard.esm.js.map +1 -1
- package/dist/components/ApiKeyApprovalPage/ApiKeyApprovalPage.esm.js +10 -0
- package/dist/components/ApiKeyApprovalPage/ApiKeyApprovalPage.esm.js.map +1 -0
- package/dist/components/ApiKeyApprovalPage/index.esm.js +2 -0
- package/dist/components/ApiKeyDetailPage/ApiKeyDetailPage.esm.js +28 -40
- package/dist/components/ApiKeyDetailPage/ApiKeyDetailPage.esm.js.map +1 -1
- package/dist/components/ApiKeyManagementTab/ApiKeyManagementTab.esm.js +20 -46
- package/dist/components/ApiKeyManagementTab/ApiKeyManagementTab.esm.js.map +1 -1
- package/dist/components/ApiProductDetailPage/ApiProductDetailPage.esm.js +27 -35
- package/dist/components/ApiProductDetailPage/ApiProductDetailPage.esm.js.map +1 -1
- package/dist/components/ApiProductDetails/ApiProductDetails.esm.js +13 -3
- package/dist/components/ApiProductDetails/ApiProductDetails.esm.js.map +1 -1
- package/dist/components/ApiProductInfoCard/ApiProductInfoCard.esm.js +5 -13
- package/dist/components/ApiProductInfoCard/ApiProductInfoCard.esm.js.map +1 -1
- package/dist/components/ApiProductOpenApiAlert/ApiProductOpenApiAlert.esm.js +7 -10
- package/dist/components/ApiProductOpenApiAlert/ApiProductOpenApiAlert.esm.js.map +1 -1
- package/dist/components/ApprovalQueueTable/ApprovalQueueTable.esm.js +34 -66
- package/dist/components/ApprovalQueueTable/ApprovalQueueTable.esm.js.map +1 -1
- package/dist/components/CreateAPIProductDialog/CreateAPIProductDialog.esm.js +143 -58
- package/dist/components/CreateAPIProductDialog/CreateAPIProductDialog.esm.js.map +1 -1
- package/dist/components/EditAPIKeyDialog/EditAPIKeyDialog.esm.js +8 -18
- package/dist/components/EditAPIKeyDialog/EditAPIKeyDialog.esm.js.map +1 -1
- package/dist/components/EditAPIProductDialog/EditAPIProductDialog.esm.js +52 -30
- package/dist/components/EditAPIProductDialog/EditAPIProductDialog.esm.js.map +1 -1
- package/dist/components/EntityApiApprovalTab/EntityApiApprovalTab.esm.js +11 -27
- package/dist/components/EntityApiApprovalTab/EntityApiApprovalTab.esm.js.map +1 -1
- package/dist/components/KuadrantPage/ApiProductsPage.esm.js +71 -55
- package/dist/components/KuadrantPage/ApiProductsPage.esm.js.map +1 -1
- package/dist/components/MyApiKeysPage/MyApiKeysPage.esm.js +10 -0
- package/dist/components/MyApiKeysPage/MyApiKeysPage.esm.js.map +1 -0
- package/dist/components/MyApiKeysPage/index.esm.js +2 -0
- package/dist/components/MyApiKeysPage/index.esm.js.map +1 -0
- package/dist/components/MyApiKeysTable/MyApiKeysTable.esm.js +51 -57
- package/dist/components/MyApiKeysTable/MyApiKeysTable.esm.js.map +1 -1
- package/dist/components/RequestAccessDialog/RequestAccessDialog.esm.js +10 -25
- package/dist/components/RequestAccessDialog/RequestAccessDialog.esm.js.map +1 -1
- package/dist/components/SimpleRequestAccessDialog/SimpleRequestAccessDialog.esm.js +206 -0
- package/dist/components/SimpleRequestAccessDialog/SimpleRequestAccessDialog.esm.js.map +1 -0
- package/dist/index.d.ts +461 -2
- package/dist/index.esm.js +3 -1
- package/dist/index.esm.js.map +1 -1
- package/dist/plugin.esm.js +11 -4
- package/dist/plugin.esm.js.map +1 -1
- package/dist/utils/styles.esm.js +44 -5
- package/dist/utils/styles.esm.js.map +1 -1
- package/dist-scalprum/internal.plugin-kuadrant.8bf02d5482a5a3ed6337.js +2 -0
- package/dist-scalprum/internal.plugin-kuadrant.8bf02d5482a5a3ed6337.js.map +1 -0
- package/dist-scalprum/plugin-manifest.json +3 -3
- package/dist-scalprum/static/2118.82433765.chunk.js +2 -0
- package/dist-scalprum/static/2118.82433765.chunk.js.map +1 -0
- package/dist-scalprum/static/2967.28e7c7f8.chunk.js +2 -0
- package/dist-scalprum/static/2967.28e7c7f8.chunk.js.map +1 -0
- package/dist-scalprum/static/369.2374941c.chunk.js +2 -0
- package/dist-scalprum/static/369.2374941c.chunk.js.map +1 -0
- package/dist-scalprum/static/3947.ff1c25cf.chunk.js +2 -0
- package/dist-scalprum/static/3947.ff1c25cf.chunk.js.map +1 -0
- package/dist-scalprum/static/3976.cf3ec7be.chunk.js +2 -0
- package/dist-scalprum/static/3976.cf3ec7be.chunk.js.map +1 -0
- package/dist-scalprum/static/4447.222bb58d.chunk.js +2 -0
- package/dist-scalprum/static/4447.222bb58d.chunk.js.map +1 -0
- package/dist-scalprum/static/5010.4ef96c87.chunk.js +3 -0
- package/dist-scalprum/static/5010.4ef96c87.chunk.js.map +1 -0
- package/dist-scalprum/static/5203.e92a3353.chunk.js +2 -0
- package/dist-scalprum/static/5203.e92a3353.chunk.js.map +1 -0
- package/dist-scalprum/static/6371.6ee1f11d.chunk.js +2 -0
- package/dist-scalprum/static/6371.6ee1f11d.chunk.js.map +1 -0
- package/dist-scalprum/static/6422.969d9b8c.chunk.js +2 -0
- package/dist-scalprum/static/6422.969d9b8c.chunk.js.map +1 -0
- package/dist-scalprum/static/6800.a7645f4c.chunk.js +2 -0
- package/dist-scalprum/static/6800.a7645f4c.chunk.js.map +1 -0
- package/dist-scalprum/static/69.1decc5e8.chunk.js +2 -0
- package/dist-scalprum/static/69.1decc5e8.chunk.js.map +1 -0
- package/dist-scalprum/static/7005.a9f73153.chunk.js +2 -0
- package/dist-scalprum/static/7005.a9f73153.chunk.js.map +1 -0
- package/dist-scalprum/static/7270.b0e185f1.chunk.js +2 -0
- package/dist-scalprum/static/7270.b0e185f1.chunk.js.map +1 -0
- package/dist-scalprum/static/7791.5c1eea8a.chunk.js +2 -0
- package/dist-scalprum/static/7791.5c1eea8a.chunk.js.map +1 -0
- package/dist-scalprum/static/{6763.d6cd937f.chunk.js → 8563.46f1a3e1.chunk.js} +3 -3
- package/dist-scalprum/static/8563.46f1a3e1.chunk.js.map +1 -0
- package/dist-scalprum/static/8789.84963cbc.chunk.js +2 -0
- package/dist-scalprum/static/8789.84963cbc.chunk.js.map +1 -0
- package/dist-scalprum/static/8804.63919453.chunk.js +2 -0
- package/dist-scalprum/static/8804.63919453.chunk.js.map +1 -0
- package/dist-scalprum/static/9051.db875198.chunk.js +2 -0
- package/dist-scalprum/static/9051.db875198.chunk.js.map +1 -0
- package/dist-scalprum/static/{2946.a35243f1.chunk.js → 9370.2e9fe34b.chunk.js} +3 -3
- package/dist-scalprum/static/9370.2e9fe34b.chunk.js.map +1 -0
- package/dist-scalprum/static/9838.5df9b1de.chunk.js +2 -0
- package/dist-scalprum/static/9838.5df9b1de.chunk.js.map +1 -0
- package/dist-scalprum/static/exposed-PluginRoot.8a8dd91f.chunk.js +2 -0
- package/dist-scalprum/static/exposed-PluginRoot.8a8dd91f.chunk.js.map +1 -0
- package/package.json +3 -1
- package/dist/components/ApiKeysPage/ApiKeysPage.esm.js +0 -43
- package/dist/components/ApiKeysPage/ApiKeysPage.esm.js.map +0 -1
- package/dist/components/ApiKeysPage/index.esm.js +0 -2
- package/dist-scalprum/internal.plugin-kuadrant.114cbbe1d3ddb939d776.js +0 -2
- package/dist-scalprum/internal.plugin-kuadrant.114cbbe1d3ddb939d776.js.map +0 -1
- package/dist-scalprum/static/2821.0829f14d.chunk.js +0 -2
- package/dist-scalprum/static/2821.0829f14d.chunk.js.map +0 -1
- package/dist-scalprum/static/2946.a35243f1.chunk.js.map +0 -1
- package/dist-scalprum/static/2967.65c51af8.chunk.js +0 -2
- package/dist-scalprum/static/2967.65c51af8.chunk.js.map +0 -1
- package/dist-scalprum/static/3650.ee76eba9.chunk.js +0 -2
- package/dist-scalprum/static/3650.ee76eba9.chunk.js.map +0 -1
- package/dist-scalprum/static/3947.7458971d.chunk.js +0 -2
- package/dist-scalprum/static/3947.7458971d.chunk.js.map +0 -1
- package/dist-scalprum/static/3984.647ef00c.chunk.js +0 -2
- package/dist-scalprum/static/3984.647ef00c.chunk.js.map +0 -1
- package/dist-scalprum/static/4651.c85cecc4.chunk.js +0 -2
- package/dist-scalprum/static/4651.c85cecc4.chunk.js.map +0 -1
- package/dist-scalprum/static/4682.75f17114.chunk.js +0 -2
- package/dist-scalprum/static/4682.75f17114.chunk.js.map +0 -1
- package/dist-scalprum/static/5010.0cd6c959.chunk.js +0 -3
- package/dist-scalprum/static/5010.0cd6c959.chunk.js.map +0 -1
- package/dist-scalprum/static/5203.b654e8e0.chunk.js +0 -2
- package/dist-scalprum/static/5203.b654e8e0.chunk.js.map +0 -1
- package/dist-scalprum/static/5453.ecdee66d.chunk.js +0 -2
- package/dist-scalprum/static/5453.ecdee66d.chunk.js.map +0 -1
- package/dist-scalprum/static/6371.d45f37cc.chunk.js +0 -2
- package/dist-scalprum/static/6371.d45f37cc.chunk.js.map +0 -1
- package/dist-scalprum/static/6763.d6cd937f.chunk.js.map +0 -1
- package/dist-scalprum/static/6800.20f46859.chunk.js +0 -2
- package/dist-scalprum/static/6800.20f46859.chunk.js.map +0 -1
- package/dist-scalprum/static/6840.1653e6b0.chunk.js +0 -2
- package/dist-scalprum/static/6840.1653e6b0.chunk.js.map +0 -1
- package/dist-scalprum/static/7236.f3886d59.chunk.js +0 -2
- package/dist-scalprum/static/7236.f3886d59.chunk.js.map +0 -1
- package/dist-scalprum/static/7791.ac1ac509.chunk.js +0 -2
- package/dist-scalprum/static/7791.ac1ac509.chunk.js.map +0 -1
- package/dist-scalprum/static/8172.cbe1f2c4.chunk.js +0 -2
- package/dist-scalprum/static/8172.cbe1f2c4.chunk.js.map +0 -1
- package/dist-scalprum/static/8799.939d14f9.chunk.js +0 -2
- package/dist-scalprum/static/8799.939d14f9.chunk.js.map +0 -1
- package/dist-scalprum/static/exposed-PluginRoot.ed95fa78.chunk.js +0 -2
- package/dist-scalprum/static/exposed-PluginRoot.ed95fa78.chunk.js.map +0 -1
- /package/dist/components/{ApiKeysPage → ApiKeyApprovalPage}/index.esm.js.map +0 -0
- /package/dist-scalprum/static/{5010.0cd6c959.chunk.js.LICENSE.txt → 5010.4ef96c87.chunk.js.LICENSE.txt} +0 -0
- /package/dist-scalprum/static/{6763.d6cd937f.chunk.js.LICENSE.txt → 8563.46f1a3e1.chunk.js.LICENSE.txt} +0 -0
- /package/dist-scalprum/static/{2946.a35243f1.chunk.js.LICENSE.txt → 9370.2e9fe34b.chunk.js.LICENSE.txt} +0 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[9838],{16397:(e,n,t)=>{t.d(n,{e:()=>x});var a=t(31085),r=t(95478),s=t(76891),i=t(61477),o=t(46805),l=t(10394),d=t(72501),c=t(95061),u=t(48543),p=t(81215),h=t(26343),m=t(16249),y=t(93453),v=t(64947),g=t(78467),A=t(22097),f=t(64047);const x=({open:e,onClose:n,onSuccess:t,request:x,availablePlans:j})=>{const b=(0,A.useApi)(f.s),[w,k]=(0,r.useState)(""),[C,$]=(0,r.useState)(""),[P,S]=(0,r.useState)(!1),[q,E]=(0,r.useState)("");(0,r.useEffect)(()=>{e&&x&&(k(x.spec.planTier||""),$(x.spec.useCase||""),E(""))},[e,x]);const z=()=>{P||(E(""),n())};return(0,a.jsxs)(s.A,{open:e,onClose:z,maxWidth:"sm",fullWidth:!0,children:[(0,a.jsx)(i.A,{children:"Edit API Key"}),(0,a.jsxs)(o.A,{children:[q&&(0,a.jsx)(l.A,{mb:2,p:2,bgcolor:"error.main",color:"error.contrastText",borderRadius:1,children:(0,a.jsx)(d.A,{variant:"body2",children:q})}),(0,a.jsxs)(c.A,{fullWidth:!0,margin:"normal",children:[(0,a.jsx)(u.A,{children:"Tier"}),(0,a.jsx)(p.A,{value:w,onChange:e=>k(e.target.value),disabled:P,children:j.map(e=>{const n=Object.entries(e.limits||{}).map(([e,n])=>`${n} per ${e}`).join(", ");return(0,a.jsxs)(h.A,{value:e.tier,children:[e.tier," ",n?`(${n})`:""]},e.tier)})})]}),(0,a.jsx)(m.A,{label:"Use Case",placeholder:"Describe how you plan to use this API",multiline:!0,rows:3,fullWidth:!0,margin:"normal",value:C,onChange:e=>$(e.target.value),disabled:P,helperText:"Explain your intended use of this API for admin review"})]}),(0,a.jsxs)(y.A,{children:[(0,a.jsx)(v.A,{onClick:z,disabled:P,children:"Cancel"}),(0,a.jsx)(v.A,{onClick:async()=>{if(w){E(""),S(!0);try{const e={spec:{planTier:w,useCase:C.trim()}};await b.updateRequest(x.metadata.name,x.metadata.namespace,e),t(),n()}catch(e){console.error("Error updating API key request:",e),E(e instanceof Error?e.message:"Unknown error occurred")}finally{S(!1)}}else E("Please select a tier")},color:"primary",variant:"contained",disabled:!w||P,startIcon:P?(0,a.jsx)(g.A,{size:16,color:"inherit"}):void 0,children:P?"Saving...":"Save Changes"})]})]})}},18466:(e,n,t)=>{var a=t(4293),r=t(78920);n.A=void 0;var s=r(t(95478)),i=(0,a(t(74044)).default)(s.createElement("path",{d:"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"}),"Add");n.A=i},23650:(e,n,t)=>{t.r(n),t.d(n,{ApiKeyManagementTab:()=>V});var a=t(31085),r=t(95478),s=t(35015),i=t(82300),o=t(86687),l=t(42367),d=t(25010),c=t(10394),u=t(72501),p=t(31653),h=t(38605),m=t(67720),y=t(71677),v=t(29365),g=t(78467),A=t(42899),f=t(64947),x=t(37757),j=t(26343),b=t(76891),w=t(61477),k=t(46805),C=t(93453),$=t(22097),P=t(64047),S=t(25467),q=t(32269),E=t(61524),z=t(93246),R=t(92399),T=t(18466),I=t(71407),K=t(99594),B=t(77225),_=t(34955),H=t(46205),D=t(16397),M=t(63221);function W(e,n,t){const a=t?`${t} `:"";return{curl:`curl -X GET ${e} \\\n -H "Authorization: ${t?`${t} ${n}`:n}"`,nodejs:`const fetch = require('node-fetch');\n\nconst apiKey = '${n}';\nconst endpoint = '${e}';\n\nfetch(endpoint, {\n method: 'GET',\n headers: {\n 'Authorization': '${a}' + apiKey\n }\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,python:`import requests\n\napi_key = '${n}'\nendpoint = '${e}'\n\nheaders = {\n 'Authorization': '${a}' + api_key\n}\n\nresponse = requests.get(endpoint, headers=headers)\nprint(response.json())`,go:`package main\n\nimport (\n "fmt"\n "net/http"\n "io"\n)\n\nfunc main() {\n apiKey := "${n}"\n endpoint := "${e}"\n\n client := &http.Client{}\n req, _ := http.NewRequest("GET", endpoint, nil)\n req.Header.Add("Authorization", "${a}" + apiKey)\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println("Error:", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`}}var N=t(14933);const V=({namespace:e})=>{var n,t,V,G,L;const{entity:U}=(0,S.tN)(),X=(0,$.useApi)(P.s),F=(0,$.useApi)($.identityApiRef),O=(0,$.useApi)($.alertApiRef),[J,Q]=(0,r.useState)(new Set),[Y,Z]=(0,r.useState)(0),[ee,ne]=(0,r.useState)(""),[te,ae]=(0,r.useState)(""),[re,se]=(0,r.useState)(!1),[ie,oe]=(0,r.useState)(!1),[le,de]=(0,r.useState)(null),[ce,ue]=(0,r.useState)(null),[pe,he]=(0,r.useState)(null),[me,ye]=(0,r.useState)(null),[ve,ge]=(0,r.useState)(new Set),[Ae,fe]=(0,r.useState)({open:!1,request:null}),[xe,je]=(0,r.useState)(new Map),[be,we]=(0,r.useState)(new Set),[ke,Ce]=(0,r.useState)(new Set),[$e,Pe]=(0,r.useState)(!1),[Se,qe]=(0,r.useState)(null),Ee=(null===(n=U.metadata.annotations)||void 0===n?void 0:n["kuadrant.io/apiproduct"])||U.metadata.name,ze=(null===(t=U.metadata.annotations)||void 0===t?void 0:t["kuadrant.io/namespace"])||e||"default";(0,s.A)(async()=>{const e=await F.getBackstageIdentity(),n=await F.getProfileInfo();ne(e.userEntityRef),ae(n.email||"")},[F]);const{value:Re,loading:Te,error:Ie}=(0,s.A)(async()=>((await X.getRequestsByNamespace(ze)).items||[]).filter(e=>e.spec.apiProductRef.name===Ee&&e.metadata.namespace===ze),[Ee,ze,Y,X]),{value:Ke,loading:Be,error:_e}=(0,s.A)(async()=>{var e;return null===(e=(await X.getApiProducts()).items)||void 0===e?void 0:e.find(e=>e.metadata.namespace===ze&&e.metadata.name===Ee)},[ze,Ee,X]),He=Ke?`apiproduct:${Ke.metadata.namespace}/${Ke.metadata.name}`:void 0,{allowed:De,loading:Me,error:We}=(0,H.l)(_.dp,He),{allowed:Ne,loading:Ve,error:Ge}=(0,H.l)(_.uL),{allowed:Le,loading:Ue,error:Xe}=(0,H.l)(_.jH),{allowed:Fe,loading:Oe,error:Je}=(0,H.l)(_.q0),Qe=()=>{ue(null),he(null)},Ye=()=>{pe&&(de(pe),oe(!0),Qe())},Ze=()=>{if(!pe)return;const e=pe;Qe(),fe({open:!0,request:e})},en=e=>{Q(n=>{const t=new Set(n);return t.has(e)?t.delete(e):t.add(e),t})},nn=(0,r.useMemo)(()=>[{render:e=>{var n;const t=e.rowData;if(!(null==t||null===(n=t.metadata)||void 0===n?void 0:n.name))return(0,a.jsx)(c.A,{});const r=`${t.metadata.namespace}/${t.metadata.name}`,s=xe.get(r);return(0,a.jsx)(tn,{request:t,apiName:Ee,revealedApiKey:s})}}],[Ee,xe]),tn=({request:e,apiName:n,revealedApiKey:t})=>{var s,o,l;const[d,m]=(0,r.useState)(0),y=(null===(s=e.status)||void 0===s?void 0:s.apiHostname)||`${n}.apps.example.com`,v=t||"<your-api-key>",g=function(e,n,t){const a=`https://${n}/api/v1/endpoint`;return e?e.authorizationHeader?W(a,t,e.authorizationHeader.prefix||""):e.customHeader?function(e,n,t,a){return{curl:`curl -X GET ${e} \\\n -H "${t}: ${a?`${a}${n}`:n}"`,nodejs:`const fetch = require('node-fetch');\n\nconst apiKey = '${n}';\nconst endpoint = '${e}';\n\nfetch(endpoint, {\n method: 'GET',\n headers: {\n '${t}': '${a}' + apiKey\n }\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,python:`import requests\n\napi_key = '${n}'\nendpoint = '${e}'\n\nheaders = {\n '${t}': '${a}' + api_key\n}\n\nresponse = requests.get(endpoint, headers=headers)\nprint(response.json())`,go:`package main\n\nimport (\n "fmt"\n "net/http"\n "io"\n)\n\nfunc main() {\n apiKey := "${n}"\n endpoint := "${e}"\n\n client := &http.Client{}\n req, _ := http.NewRequest("GET", endpoint, nil)\n req.Header.Add("${t}", "${a}" + apiKey)\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println("Error:", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`}}(a,t,e.customHeader.name,e.customHeader.prefix||""):e.queryString?function(e,n,t){return{curl:`curl -X GET "${e}?${t}=${n}"`,nodejs:`const fetch = require('node-fetch');\n\nconst apiKey = '${n}';\nconst endpoint = '${e}?${t}=' + apiKey;\n\nfetch(endpoint, {\n method: 'GET'\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,python:`import requests\n\napi_key = '${n}'\nendpoint = '${e}'\n\nparams = {\n '${t}': api_key\n}\n\nresponse = requests.get(endpoint, params=params)\nprint(response.json())`,go:`package main\n\nimport (\n "fmt"\n "net/http"\n "io"\n)\n\nfunc main() {\n apiKey := "${n}"\n endpoint := "${e}?${t}=" + apiKey\n\n client := &http.Client{}\n req, _ := http.NewRequest("GET", endpoint, nil)\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println("Error:", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`}}(a,t,e.queryString.name):e.cookie?function(e,n,t){return{curl:`curl -X GET ${e} \\\n --cookie "${t}=${n}"`,nodejs:`const fetch = require('node-fetch');\n\nconst apiKey = '${n}';\nconst endpoint = '${e}';\n\nfetch(endpoint, {\n method: 'GET',\n headers: {\n 'Cookie': '${t}=' + apiKey\n }\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,python:`import requests\n\napi_key = '${n}'\nendpoint = '${e}'\n\ncookies = {\n '${t}': api_key\n}\n\nresponse = requests.get(endpoint, cookies=cookies)\nprint(response.json())`,go:`package main\n\nimport (\n "fmt"\n "net/http"\n "io"\n)\n\nfunc main() {\n apiKey := "${n}"\n endpoint := "${e}"\n\n client := &http.Client{}\n req, _ := http.NewRequest("GET", endpoint, nil)\n req.AddCookie(&http.Cookie{\n Name: "${t}",\n Value: apiKey,\n })\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println("Error:", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`}}(a,t,e.cookie.name):W(a,t,"Bearer"):W(a,t,"Bearer")}(null===(l=e.status)||void 0===l||null===(o=l.authScheme)||void 0===o?void 0:o.credentials,y,v);return(0,a.jsxs)(c.A,{p:3,bgcolor:"background.default",onClick:e=>e.stopPropagation(),children:[e.spec.useCase&&(0,a.jsxs)(c.A,{mb:3,children:[(0,a.jsx)(u.A,{variant:"h6",gutterBottom:!0,children:"Use Case"}),(0,a.jsx)(c.A,{p:2,bgcolor:"background.paper",borderRadius:1,border:"1px solid rgba(0, 0, 0, 0.12)",children:(0,a.jsx)(u.A,{variant:"body2",style:{whiteSpace:"pre-wrap",wordBreak:"break-word",overflowWrap:"break-word"},children:e.spec.useCase})})]}),(0,a.jsx)(u.A,{variant:"h6",gutterBottom:!0,children:"Usage Examples"}),(0,a.jsxs)(u.A,{variant:"body2",paragraph:!0,children:["Use these code examples to test the API with your"," ",e.spec.planTier," tier key."]}),(0,a.jsx)(c.A,{onClick:e=>e.stopPropagation(),children:(0,a.jsxs)(p.A,{value:d,onChange:(e,n)=>{e.stopPropagation(),m(n)},indicatorColor:"primary",children:[(0,a.jsx)(h.A,{label:"cURL",onClick:e=>e.stopPropagation()}),(0,a.jsx)(h.A,{label:"Node.js",onClick:e=>e.stopPropagation()}),(0,a.jsx)(h.A,{label:"Python",onClick:e=>e.stopPropagation()}),(0,a.jsx)(h.A,{label:"Go",onClick:e=>e.stopPropagation()})]})}),(0,a.jsxs)(c.A,{mt:2,children:[0===d&&(0,a.jsx)(i.z,{text:g.curl,language:"bash",showCopyCodeButton:!0}),1===d&&(0,a.jsx)(i.z,{text:g.nodejs,language:"javascript",showCopyCodeButton:!0}),2===d&&(0,a.jsx)(i.z,{text:g.python,language:"python",showCopyCodeButton:!0}),3===d&&(0,a.jsx)(i.z,{text:g.go,language:"go",showCopyCodeButton:!0})]})]})},an=Ie||_e,rn=We||Ge||Xe||Je;if(Te||Be||Me||Ve||Ue||Oe)return(0,a.jsx)(o.k,{});if(an)return(0,a.jsx)(l._,{error:an});if(rn){const e=We?"kuadrant.apikey.create":Ge?"kuadrant.apikey.delete.own":Xe?"kuadrant.apikey.delete.all":Je?"kuadrant.apikey.update.own":"unknown";return(0,a.jsxs)(c.A,{p:2,children:[(0,a.jsxs)(u.A,{color:"error",children:["Unable to check permissions: ",rn.message]}),(0,a.jsxs)(u.A,{variant:"body2",color:"textSecondary",children:["Permission: ",e]}),(0,a.jsx)(u.A,{variant:"body2",color:"textSecondary",children:"Please try again or contact your administrator"})]})}const sn=(Re||[]).filter(e=>!ve.has(e.metadata.name)),on=(null==Ke||null===(V=Ke.status)||void 0===V?void 0:V.discoveredPlans)||[],ln=sn.filter(e=>{var n;return!(null===(n=e.status)||void 0===n?void 0:n.phase)||"Pending"===e.status.phase}),dn=sn.filter(e=>{var n;return"Approved"===(null===(n=e.status)||void 0===n?void 0:n.phase)}),cn=sn.filter(e=>{var n;return"Rejected"===(null===(n=e.status)||void 0===n?void 0:n.phase)}),un=[{title:"Tier",field:"spec.planTier",render:e=>(0,a.jsx)(m.A,{label:e.spec.planTier,color:"primary",size:"small"})},{title:"Approved",field:"status.reviewedAt",render:e=>{var n;return(0,a.jsx)(u.A,{variant:"body2",children:(null===(n=e.status)||void 0===n?void 0:n.reviewedAt)?new Date(e.status.reviewedAt).toLocaleDateString():"-"})}},{title:"API Key",field:"status.secretRef",searchable:!1,filtering:!1,render:e=>{var n,t,r;const s=`${e.metadata.namespace}/${e.metadata.name}`,i=J.has(e.metadata.name),o=be.has(s),l=xe.get(s),d=null===(t=e.status)||void 0===t||null===(n=t.secretRef)||void 0===n?void 0:n.name,p=!1!==(null===(r=e.status)||void 0===r?void 0:r.canReadSecret),h=ke.has(s)||!p;return d?h&&!l?(0,a.jsx)(y.Ay,{title:"This API key has already been viewed and cannot be retrieved again",children:(0,a.jsxs)(c.A,{display:"flex",alignItems:"center",children:[(0,a.jsx)(u.A,{variant:"body2",color:"textSecondary",style:{fontFamily:"monospace",marginRight:8},children:"Already viewed"}),(0,a.jsx)(E.A,{fontSize:"small",color:"disabled"})]})}):(0,a.jsxs)(c.A,{display:"flex",alignItems:"center",children:[(0,a.jsx)(u.A,{variant:"body2",style:{fontFamily:"monospace",marginRight:8},children:o?"Loading...":i&&l?l:"••••••••••••••••"}),i&&l&&(0,a.jsx)(y.Ay,{title:"Copy to clipboard",children:(0,a.jsx)(v.A,{size:"small",onClick:async()=>{l&&(await navigator.clipboard.writeText(l),O.post({message:"API key copied to clipboard",severity:"success",display:"transient"}))},children:(0,a.jsx)(K.A,{fontSize:"small"})})}),(0,a.jsx)(y.Ay,{title:i?"Hide API key":"Reveal API key (one-time only)",children:(0,a.jsx)("span",{children:(0,a.jsx)(v.A,{size:"small",onClick:()=>{i?(((e,n)=>{const t=`${e}/${n}`;je(e=>{const n=new Map(e);return n.delete(t),n})})(e.metadata.namespace,e.metadata.name),en(e.metadata.name)):h||(qe({namespace:e.metadata.namespace,name:e.metadata.name}),Pe(!0))},disabled:o||h&&!l,children:i?(0,a.jsx)(E.A,{}):(0,a.jsx)(q.A,{})})})})]}):(0,a.jsx)(u.A,{variant:"body2",color:"textSecondary",children:"Awaiting secret..."})}},{title:"",field:"actions",searchable:!1,filtering:!1,render:e=>{if(me===e.metadata.name)return(0,a.jsx)(g.A,{size:20});const n=e.spec.requestedBy.userId;return(0,H.W)(n,ee,Ne,Le)?(0,a.jsx)(v.A,{size:"small",onClick:n=>{n.stopPropagation();const t=n.currentTarget.getBoundingClientRect();ue({top:t.bottom,left:t.left}),he(e)},title:"Actions","aria-controls":ce?"actions-menu":void 0,"aria-haspopup":"true",children:(0,a.jsx)(I.A,{})}):null}}],pn=[{title:"Status",field:"status.phase",render:e=>{var n;const t=(null===(n=e.status)||void 0===n?void 0:n.phase)||"Pending",r="Pending"===t;return(0,a.jsx)(m.A,{label:t,size:"small",icon:r?(0,a.jsx)(z.A,{}):(0,a.jsx)(R.A,{}),color:r?"default":"secondary"})}},{title:"Tier",field:"spec.planTier",render:e=>(0,a.jsx)(m.A,{label:e.spec.planTier,color:"primary",size:"small"})},{title:"Use Case",field:"spec.useCase",render:e=>e.spec.useCase?(0,a.jsx)(y.Ay,{title:e.spec.useCase,placement:"top",children:(0,a.jsx)(u.A,{variant:"body2",style:{maxWidth:"200px",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.spec.useCase})}):(0,a.jsx)(u.A,{variant:"body2",children:"-"})},{title:"Requested",field:"metadata.creationTimestamp",render:e=>(0,a.jsx)(u.A,{variant:"body2",children:e.metadata.creationTimestamp?new Date(e.metadata.creationTimestamp).toLocaleDateString():"-"})},{title:"Reviewed",field:"status.reviewedAt",render:e=>{var n;return(null===(n=e.status)||void 0===n?void 0:n.reviewedAt)?(0,a.jsx)(u.A,{variant:"body2",children:new Date(e.status.reviewedAt).toLocaleDateString()}):(0,a.jsx)(u.A,{variant:"body2",children:"-"})}},{title:"",field:"actions",searchable:!1,filtering:!1,render:e=>{var n;if(me===e.metadata.name)return(0,a.jsx)(g.A,{size:20});const t=!(null===(n=e.status)||void 0===n?void 0:n.phase)||"Pending"===e.status.phase,r=e.spec.requestedBy.userId,s=(0,H.W)(r,ee,Ne,Le);return t&&(Fe&&r===ee||s)?(0,a.jsx)(v.A,{size:"small",onClick:n=>{n.stopPropagation();const t=n.currentTarget.getBoundingClientRect();ue({top:t.bottom,left:t.left}),he(e)},title:"Actions","aria-controls":ce?"actions-menu":void 0,"aria-haspopup":"true",children:(0,a.jsx)(I.A,{})}):null}}],hn=pn.filter(e=>"Reviewed"!==e.title&&"Reason"!==e.title);return(0,a.jsxs)(c.A,{p:2,children:[(0,a.jsxs)(A.A,{container:!0,spacing:3,direction:"column",children:[De&&(0,a.jsx)(A.A,{item:!0,children:(0,a.jsxs)(c.A,{display:"flex",flexDirection:"column",alignItems:"flex-end",mb:2,children:[(0,a.jsx)(f.A,{variant:"contained",color:"primary",startIcon:(0,a.jsx)(T.A,{}),onClick:()=>se(!0),disabled:0===on.length,"data-testid":"request-api-access-button","data-plans-count":on.length,children:"Request API Access"}),0===on.length&&(0,a.jsx)(u.A,{variant:"caption",color:"textSecondary",style:{marginTop:4},"data-testid":"no-plans-message",children:Ke?(()=>{var e,n,t,a;const r=null===(n=Ke.status)||void 0===n||null===(e=n.conditions)||void 0===e?void 0:e.find(e=>"Ready"===e.type),s=null===(a=Ke.status)||void 0===a||null===(t=a.conditions)||void 0===t?void 0:t.find(e=>"PlanPolicyDiscovered"===e.type);return"True"!==(null==r?void 0:r.status)?`HTTPRoute not ready: ${(null==r?void 0:r.message)||"unknown"}`:"True"!==(null==s?void 0:s.status)?`No plans discovered: ${(null==s?void 0:s.message)||"no PlanPolicy found"}`:"No plans available"})():"API product not found"})]})}),0===ln.length&&0===cn.length&&0===dn.length&&(0,a.jsx)(A.A,{item:!0,children:(0,a.jsx)(c.A,{p:3,textAlign:"center",children:(0,a.jsx)(u.A,{variant:"body1",color:"textSecondary",children:"No API keys yet. Request access to get started."})})}),ln.length>0&&(0,a.jsx)(A.A,{item:!0,children:(0,a.jsx)(d.X,{title:"Pending Requests",options:{paging:ln.length>5,pageSize:20,search:!0,filtering:!0,debounceInterval:300,toolbar:!0,emptyRowsWhenPaging:!1},columns:hn,data:ln})}),cn.length>0&&(0,a.jsx)(A.A,{item:!0,children:(0,a.jsx)(d.X,{title:"Rejected Requests",options:{paging:cn.length>5,pageSize:20,search:!0,filtering:!0,debounceInterval:300,toolbar:!0,emptyRowsWhenPaging:!1},columns:pn,data:cn})}),dn.length>0&&(0,a.jsx)(A.A,{item:!0,children:(0,a.jsx)(d.X,{title:"API Keys",options:{paging:dn.length>5,pageSize:20,search:!0,filtering:!0,debounceInterval:300,toolbar:!0,emptyRowsWhenPaging:!1},columns:un,data:dn,detailPanel:nn},"api-keys-table")})]}),(0,a.jsx)(N.c,{open:re,onClose:()=>se(!1),onSuccess:()=>{se(!1),Z(e=>e+1)},apiProductName:Ee,namespace:ze,userEmail:te,plans:on}),(0,a.jsx)(x.A,{id:"actions-menu",open:Boolean(ce),onClose:Qe,anchorReference:"anchorPosition",anchorPosition:ce||{top:0,left:0},children:pe&&(()=>{var e;const n=!(null===(e=pe.status)||void 0===e?void 0:e.phase)||"Pending"===pe.status.phase,t=pe.spec.requestedBy.userId,r=[];return Fe&&t===ee&&n&&r.push((0,a.jsx)(j.A,{onClick:Ye,children:"Edit"},"edit")),r.push((0,a.jsx)(j.A,{onClick:Ze,children:"Delete"},"delete")),r})()}),le&&(0,a.jsx)(D.e,{open:ie,onClose:()=>{oe(!1),de(null)},onSuccess:()=>{Z(e=>e+1),oe(!1),O.post({message:"API key updated",severity:"success",display:"transient"}),de(null)},request:le,availablePlans:on}),(0,a.jsx)(M.K,{open:Ae.open,title:"Delete Request",description:`Are you sure you want to delete this ${"Approved"===(null===(L=Ae.request)||void 0===L||null===(G=L.status)||void 0===G?void 0:G.phase)?"API key":"request"}?`,deleting:null!==me,onConfirm:async()=>{Ae.request&&(await(async e=>{ge(n=>new Set(n).add(e)),ye(e);try{await X.deleteRequest(ze,e),O.post({message:"API key deleted successfully",severity:"success",display:"transient"}),Z(e=>e+1)}catch(n){const t=n instanceof Error?n.message:"unknown error occurred";ge(n=>{const t=new Set(n);return t.delete(e),t}),O.post({message:`Failed to delete API key: ${t}`,severity:"error",display:"transient"})}finally{ye(null)}})(Ae.request.metadata.name),fe({open:!1,request:null}))},onCancel:()=>{fe({open:!1,request:null})}}),(0,a.jsxs)(b.A,{open:$e,onClose:()=>{Pe(!1),qe(null)},maxWidth:"sm",children:[(0,a.jsx)(w.A,{children:(0,a.jsxs)(c.A,{display:"flex",alignItems:"center",children:[(0,a.jsx)(B.A,{color:"primary",style:{marginRight:8}}),"View API Key"]})}),(0,a.jsxs)(k.A,{children:[(0,a.jsxs)(u.A,{variant:"body1",paragraph:!0,children:["This API key can only be viewed ",(0,a.jsx)("strong",{children:"once"}),". After you reveal it, you will not be able to retrieve it again."]}),(0,a.jsx)(u.A,{variant:"body2",color:"textSecondary",children:"Make sure to copy and store it securely before closing this view."})]}),(0,a.jsxs)(C.A,{children:[(0,a.jsx)(f.A,{onClick:()=>{Pe(!1),qe(null)},children:"Cancel"}),(0,a.jsx)(f.A,{variant:"contained",color:"primary",onClick:()=>{Se&&((async(e,n)=>{const t=`${e}/${n}`;if(!be.has(t)){we(e=>new Set(e).add(t));try{const a=await X.getApiKeySecret(e,n);je(e=>new Map(e).set(t,a.apiKey)),Ce(e=>new Set(e).add(t))}catch(e){const n=e instanceof Error?e.message:"unknown error occurred";n.includes("403")||n.includes("already been viewed")?(Ce(e=>new Set(e).add(t)),O.post({message:"This API key has already been viewed and cannot be retrieved again.",severity:"warning",display:"transient"})):O.post({message:`Failed to fetch api key: ${n}`,severity:"error",display:"transient"})}finally{we(e=>{const n=new Set(e);return n.delete(t),n})}}})(Se.namespace,Se.name),en(Se.name)),Pe(!1),qe(null)},children:"Reveal API Key"})]})]})]})}},25467:(e,n,t)=>{t.d(n,{tN:()=>r}),t(31085),t(22097);var a=t(15427);function r(){const e=(0,a.useVersionedContext)("entity-context");if(!e)throw new Error("Entity context is not available");const n=e.atVersion(1);if(!n)throw new Error("EntityContext v1 not available");if(!n.entity)throw new Error("useEntity hook is being called outside of an EntityLayout where the entity has not been loaded. If this is intentional, please use useAsyncEntity instead.");return{entity:n.entity}}(0,a.createVersionedContext)("entity-context")},32269:(e,n,t)=>{var a=t(4293),r=t(78920);n.A=void 0;var s=r(t(95478)),i=(0,a(t(74044)).default)(s.createElement("path",{d:"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z"}),"Visibility");n.A=i},35015:(e,n,t)=>{t.d(n,{A:()=>i});var a=t(95478),r=t(85608),s=t(71581);function i(e,n){void 0===n&&(n=[]);var t=function(e,n,t){void 0===n&&(n=[]),void 0===t&&(t={loading:!1});var i=(0,a.useRef)(0),o=(0,s.A)(),l=(0,a.useState)(t),d=l[0],c=l[1],u=(0,a.useCallback)(function(){for(var n=[],t=0;t<arguments.length;t++)n[t]=arguments[t];var a=++i.current;return d.loading||c(function(e){return(0,r.__assign)((0,r.__assign)({},e),{loading:!0})}),e.apply(void 0,n).then(function(e){return o()&&a===i.current&&c({value:e,loading:!1}),e},function(e){return o()&&a===i.current&&c({error:e,loading:!1}),e})},n);return[d,u]}(e,n,{loading:!0}),i=t[0],o=t[1];return(0,a.useEffect)(function(){o()},[o]),i}},39053:(e,n,t)=>{var a=t(4293),r=t(78920);n.A=void 0;var s=r(t(95478)),i=(0,a(t(74044)).default)(s.createElement("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"}),"Info");n.A=i},61524:(e,n,t)=>{var a=t(4293),r=t(78920);n.A=void 0;var s=r(t(95478)),i=(0,a(t(74044)).default)(s.createElement("path",{d:"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78l3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z"}),"VisibilityOff");n.A=i},63221:(e,n,t)=>{t.d(n,{K:()=>v});var a=t(31085),r=t(95478),s=t(76891),i=t(61477),o=t(10394),l=t(46805),d=t(59461),c=t(72501),u=t(16249),p=t(93453),h=t(64947),m=t(78467),y=t(77225);const v=({open:e,title:n,description:t,confirmText:v,severity:g="normal",deleting:A=!1,onConfirm:f,onCancel:x})=>{const[j,b]=(0,r.useState)("");(0,r.useEffect)(()=>{e||b("")},[e]);const w="high"===g&&v,k=!w||j===v;return(0,a.jsxs)(s.A,{open:e,onClose:A?void 0:x,maxWidth:"sm",fullWidth:!0,children:[(0,a.jsxs)(i.A,{children:["high"===g&&(0,a.jsxs)(o.A,{display:"flex",alignItems:"center",style:{gap:8},children:[(0,a.jsx)(y.A,{color:"error"}),(0,a.jsx)("span",{children:n})]}),"high"!==g&&n]}),(0,a.jsxs)(l.A,{children:[(0,a.jsx)(d.A,{style:{whiteSpace:"pre-line"},children:t}),w&&(0,a.jsxs)(o.A,{mt:2,children:[(0,a.jsxs)(c.A,{variant:"body2",color:"textSecondary",gutterBottom:!0,children:["Type ",(0,a.jsx)("strong",{children:v})," to confirm:"]}),(0,a.jsx)(u.A,{fullWidth:!0,variant:"outlined",size:"small",value:j,onChange:e=>b(e.target.value),disabled:A,autoFocus:!0,placeholder:v})]})]}),(0,a.jsxs)(p.A,{children:[(0,a.jsx)(h.A,{onClick:x,disabled:A,children:"Cancel"}),(0,a.jsx)(h.A,{onClick:()=>{k&&f()},color:"secondary",variant:"contained",disabled:A||!k,startIcon:A?(0,a.jsx)(m.A,{size:16,color:"inherit"}):void 0,children:A?"Deleting...":"Delete"})]})]})}},71407:(e,n,t)=>{var a=t(4293),r=t(78920);n.A=void 0;var s=r(t(95478)),i=(0,a(t(74044)).default)(s.createElement("path",{d:"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"}),"MoreVert");n.A=i},77225:(e,n,t)=>{var a=t(4293),r=t(78920);n.A=void 0;var s=r(t(95478)),i=(0,a(t(74044)).default)(s.createElement("path",{d:"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z"}),"Warning");n.A=i},93246:(e,n,t)=>{var a=t(4293),r=t(78920);n.A=void 0;var s=r(t(95478)),i=(0,a(t(74044)).default)(s.createElement("path",{d:"M6 2v6h.01L6 8.01 10 12l-4 4 .01.01H6V22h12v-5.99h-.01L18 16l-4-4 4-3.99-.01-.01H18V2H6zm10 14.5V20H8v-3.5l4-4 4 4zm-4-5l-4-4V4h8v3.5l-4 4z"}),"HourglassEmpty");n.A=i}}]);
|
|
2
|
+
//# sourceMappingURL=9838.5df9b1de.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static/9838.5df9b1de.chunk.js","mappings":"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","sources":["webpack://internal.plugin-kuadrant/./src/components/EditAPIKeyDialog/EditAPIKeyDialog.tsx","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/Add.js","webpack://internal.plugin-kuadrant/./src/utils/codeSnippets.ts","webpack://internal.plugin-kuadrant/./src/components/ApiKeyManagementTab/ApiKeyManagementTab.tsx","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-catalog-react/dist/hooks/useEntity.esm.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/Visibility.js","webpack://internal.plugin-kuadrant/../../node_modules/react-use/esm/useAsync.js","webpack://internal.plugin-kuadrant/../../node_modules/react-use/esm/useAsyncFn.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/Info.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/VisibilityOff.js","webpack://internal.plugin-kuadrant/./src/components/ConfirmDeleteDialog/ConfirmDeleteDialog.tsx","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/MoreVert.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/Warning.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/HourglassEmpty.js"],"sourcesContent":["import React, { useState, useEffect } from \"react\";\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Button,\n TextField,\n Box,\n Typography,\n FormControl,\n InputLabel,\n Select,\n MenuItem,\n CircularProgress,\n} from \"@material-ui/core\";\nimport { useApi } from \"@backstage/core-plugin-api\";\nimport { kuadrantApiRef } from '../../api';\nimport { APIKey } from \"../../types/api-management\";\n\ninterface EditAPIKeyDialogProps {\n open: boolean;\n onClose: () => void;\n onSuccess: () => void;\n request: APIKey;\n availablePlans: Array<{\n tier: string;\n description?: string;\n limits?: any;\n }>;\n}\n\nexport const EditAPIKeyDialog = ({\n open,\n onClose,\n onSuccess,\n request,\n availablePlans,\n}: EditAPIKeyDialogProps) => {\n const kuadrantApi = useApi(kuadrantApiRef);\n\n const [planTier, setPlanTier] = useState(\"\");\n const [useCase, setUseCase] = useState(\"\");\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState(\"\");\n\n useEffect(() => {\n if (open && request) {\n setPlanTier(request.spec.planTier || \"\");\n setUseCase(request.spec.useCase || \"\");\n setError(\"\");\n }\n }, [open, request]);\n\n const handleSave = async () => {\n if (!planTier) {\n setError(\"Please select a tier\");\n return;\n }\n\n setError(\"\");\n setSaving(true);\n\n try {\n const patch = {\n spec: {\n planTier,\n useCase: useCase.trim(),\n },\n };\n\n await kuadrantApi.updateRequest(\n request.metadata.name,\n request.metadata.namespace,\n // @ts-ignore Applying a partial obj\n patch,\n );\n\n onSuccess();\n onClose();\n } catch (err) {\n console.error(\"Error updating API key request:\", err);\n setError(err instanceof Error ? err.message : \"Unknown error occurred\");\n } finally {\n setSaving(false);\n }\n };\n\n const handleClose = () => {\n if (!saving) {\n setError(\"\");\n onClose();\n }\n };\n\n return (\n <Dialog open={open} onClose={handleClose} maxWidth=\"sm\" fullWidth>\n <DialogTitle>Edit API Key</DialogTitle>\n <DialogContent>\n {error && (\n <Box\n mb={2}\n p={2}\n bgcolor=\"error.main\"\n color=\"error.contrastText\"\n borderRadius={1}\n >\n <Typography variant=\"body2\">{error}</Typography>\n </Box>\n )}\n\n <FormControl fullWidth margin=\"normal\">\n <InputLabel>Tier</InputLabel>\n <Select\n value={planTier}\n onChange={(e) => setPlanTier(e.target.value as string)}\n disabled={saving}\n >\n {availablePlans.map((plan) => {\n const limitDesc = Object.entries(plan.limits || {})\n .map(([key, val]) => `${val} per ${key}`)\n .join(\", \");\n return (\n <MenuItem key={plan.tier} value={plan.tier}>\n {plan.tier} {limitDesc ? `(${limitDesc})` : \"\"}\n </MenuItem>\n );\n })}\n </Select>\n </FormControl>\n\n <TextField\n label=\"Use Case\"\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 disabled={saving}\n helperText=\"Explain your intended use of this API for admin review\"\n />\n </DialogContent>\n <DialogActions>\n <Button onClick={handleClose} disabled={saving}>\n Cancel\n </Button>\n <Button\n onClick={handleSave}\n color=\"primary\"\n variant=\"contained\"\n disabled={!planTier || saving}\n startIcon={\n saving ? <CircularProgress size={16} color=\"inherit\" /> : undefined\n }\n >\n {saving ? \"Saving...\" : \"Save Changes\"}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"\n}), 'Add');\n\nexports.default = _default;","import { Credentials } from '../types/api-management';\n\nexport interface CodeSnippets {\n curl: string;\n nodejs: string;\n python: string;\n go: string;\n}\n\nexport function generateAuthCodeSnippets(\n credentials: Credentials | undefined,\n hostname: string,\n apiKey: string,\n): CodeSnippets {\n const baseUrl = `https://${hostname}/api/v1/endpoint`;\n\n if (!credentials) {\n return generateAuthorizationHeaderSnippets(baseUrl, apiKey, 'Bearer');\n }\n\n if (credentials.authorizationHeader) {\n const prefix = credentials!.authorizationHeader!.prefix || '';\n return generateAuthorizationHeaderSnippets(baseUrl, apiKey, prefix);\n }\n\n if (credentials.customHeader) {\n const headerName = credentials!.customHeader!.name;\n const prefix = credentials!.customHeader!.prefix || '';\n return generateCustomHeaderSnippets(baseUrl, apiKey, headerName, prefix);\n }\n\n\n if (credentials.queryString) {\n const paramName = credentials!.queryString!.name;\n return generateQueryStringSnippets(baseUrl, apiKey, paramName);\n }\n\n if (credentials.cookie) {\n const cookieName = credentials!.cookie!.name;\n return generateCookieSnippets(baseUrl, apiKey, cookieName);\n }\n // Default to Authorization Bearer if no authScheme specified\n return generateAuthorizationHeaderSnippets(baseUrl, apiKey, 'Bearer');\n}\n\nfunction generateAuthorizationHeaderSnippets(\n baseUrl: string,\n apiKey: string,\n prefix: string,\n): CodeSnippets {\n const authValue = prefix ? `${prefix} ${apiKey}` : apiKey;\n const prefixWithSpace = prefix ? `${prefix} ` : '';\n\n return {\n curl: `curl -X GET ${baseUrl} \\\\\n -H \"Authorization: ${authValue}\"`,\n\n nodejs: `const fetch = require('node-fetch');\n\nconst apiKey = '${apiKey}';\nconst endpoint = '${baseUrl}';\n\nfetch(endpoint, {\n method: 'GET',\n headers: {\n 'Authorization': '${prefixWithSpace}' + apiKey\n }\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,\n\n python: `import requests\n\napi_key = '${apiKey}'\nendpoint = '${baseUrl}'\n\nheaders = {\n 'Authorization': '${prefixWithSpace}' + api_key\n}\n\nresponse = requests.get(endpoint, headers=headers)\nprint(response.json())`,\n\n go: `package main\n\nimport (\n \"fmt\"\n \"net/http\"\n \"io\"\n)\n\nfunc main() {\n apiKey := \"${apiKey}\"\n endpoint := \"${baseUrl}\"\n\n client := &http.Client{}\n req, _ := http.NewRequest(\"GET\", endpoint, nil)\n req.Header.Add(\"Authorization\", \"${prefixWithSpace}\" + apiKey)\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println(\"Error:\", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`,\n };\n}\n\nfunction generateCustomHeaderSnippets(\n baseUrl: string,\n apiKey: string,\n headerName: string,\n prefix: string,\n): CodeSnippets {\n const headerValue = prefix ? `${prefix}${apiKey}` : apiKey;\n\n return {\n curl: `curl -X GET ${baseUrl} \\\\\n -H \"${headerName}: ${headerValue}\"`,\n\n nodejs: `const fetch = require('node-fetch');\n\nconst apiKey = '${apiKey}';\nconst endpoint = '${baseUrl}';\n\nfetch(endpoint, {\n method: 'GET',\n headers: {\n '${headerName}': '${prefix}' + apiKey\n }\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,\n\n python: `import requests\n\napi_key = '${apiKey}'\nendpoint = '${baseUrl}'\n\nheaders = {\n '${headerName}': '${prefix}' + api_key\n}\n\nresponse = requests.get(endpoint, headers=headers)\nprint(response.json())`,\n\n go: `package main\n\nimport (\n \"fmt\"\n \"net/http\"\n \"io\"\n)\n\nfunc main() {\n apiKey := \"${apiKey}\"\n endpoint := \"${baseUrl}\"\n\n client := &http.Client{}\n req, _ := http.NewRequest(\"GET\", endpoint, nil)\n req.Header.Add(\"${headerName}\", \"${prefix}\" + apiKey)\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println(\"Error:\", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`,\n };\n}\n\nfunction generateQueryStringSnippets(\n baseUrl: string,\n apiKey: string,\n paramName: string,\n): CodeSnippets {\n const urlWithParam = `${baseUrl}?${paramName}=${apiKey}`;\n\n return {\n curl: `curl -X GET \"${urlWithParam}\"`,\n\n nodejs: `const fetch = require('node-fetch');\n\nconst apiKey = '${apiKey}';\nconst endpoint = '${baseUrl}?${paramName}=' + apiKey;\n\nfetch(endpoint, {\n method: 'GET'\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,\n\n python: `import requests\n\napi_key = '${apiKey}'\nendpoint = '${baseUrl}'\n\nparams = {\n '${paramName}': api_key\n}\n\nresponse = requests.get(endpoint, params=params)\nprint(response.json())`,\n\n go: `package main\n\nimport (\n \"fmt\"\n \"net/http\"\n \"io\"\n)\n\nfunc main() {\n apiKey := \"${apiKey}\"\n endpoint := \"${baseUrl}?${paramName}=\" + apiKey\n\n client := &http.Client{}\n req, _ := http.NewRequest(\"GET\", endpoint, nil)\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println(\"Error:\", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`,\n };\n}\n\nfunction generateCookieSnippets(\n baseUrl: string,\n apiKey: string,\n cookieName: string,\n): CodeSnippets {\n return {\n curl: `curl -X GET ${baseUrl} \\\\\n --cookie \"${cookieName}=${apiKey}\"`,\n\n nodejs: `const fetch = require('node-fetch');\n\nconst apiKey = '${apiKey}';\nconst endpoint = '${baseUrl}';\n\nfetch(endpoint, {\n method: 'GET',\n headers: {\n 'Cookie': '${cookieName}=' + apiKey\n }\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,\n\n python: `import requests\n\napi_key = '${apiKey}'\nendpoint = '${baseUrl}'\n\ncookies = {\n '${cookieName}': api_key\n}\n\nresponse = requests.get(endpoint, cookies=cookies)\nprint(response.json())`,\n\n go: `package main\n\nimport (\n \"fmt\"\n \"net/http\"\n \"io\"\n)\n\nfunc main() {\n apiKey := \"${apiKey}\"\n endpoint := \"${baseUrl}\"\n\n client := &http.Client{}\n req, _ := http.NewRequest(\"GET\", endpoint, nil)\n req.AddCookie(&http.Cookie{\n Name: \"${cookieName}\",\n Value: apiKey,\n })\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println(\"Error:\", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`,\n };\n}\n","import React, { useState, useMemo } from \"react\";\nimport { useAsync } from \"react-use\";\nimport {\n Table,\n TableColumn,\n Progress,\n ResponseErrorPanel,\n CodeSnippet,\n} from \"@backstage/core-components\";\nimport {\n IconButton,\n Typography,\n Box,\n Chip,\n Grid,\n Button,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Tabs,\n Tab,\n Menu,\n MenuItem,\n Tooltip,\n CircularProgress,\n} from \"@material-ui/core\";\nimport {\n useApi,\n identityApiRef,\n alertApiRef,\n} from \"@backstage/core-plugin-api\";\nimport { kuadrantApiRef } from '../../api';\nimport { useEntity } from \"@backstage/plugin-catalog-react\";\nimport VisibilityIcon from \"@material-ui/icons/Visibility\";\nimport VisibilityOffIcon from \"@material-ui/icons/VisibilityOff\";\nimport HourglassEmptyIcon from \"@material-ui/icons/HourglassEmpty\";\nimport CancelIcon from \"@material-ui/icons/Cancel\";\nimport AddIcon from \"@material-ui/icons/Add\";\nimport MoreVertIcon from \"@material-ui/icons/MoreVert\";\nimport FileCopyIcon from \"@material-ui/icons/FileCopy\";\nimport WarningIcon from \"@material-ui/icons/Warning\";\nimport {APIKey, APIProduct, PlanPolicyPlan} from \"../../types/api-management\";\nimport {\n kuadrantApiKeyCreatePermission,\n kuadrantApiKeyDeleteOwnPermission,\n kuadrantApiKeyDeleteAllPermission,\n kuadrantApiKeyUpdateOwnPermission,\n} from \"../../permissions\";\nimport {\n useKuadrantPermission,\n canDeleteResource,\n} from \"../../utils/permissions\";\nimport { EditAPIKeyDialog } from \"../EditAPIKeyDialog\";\nimport { ConfirmDeleteDialog } from \"../ConfirmDeleteDialog\";\nimport { generateAuthCodeSnippets } from \"../../utils/codeSnippets\";\nimport { RequestAccessDialog } from \"../RequestAccessDialog\";\n\nexport interface ApiKeyManagementTabProps {\n namespace?: string;\n}\n\nexport const ApiKeyManagementTab = ({\n namespace: propNamespace,\n}: ApiKeyManagementTabProps) => {\n const { entity } = useEntity();\n const kuadrantApi = useApi(kuadrantApiRef);\n const identityApi = useApi(identityApiRef);\n const alertApi = useApi(alertApiRef);\n const [visibleKeys, setVisibleKeys] = useState<Set<string>>(new Set());\n const [refresh, setRefresh] = useState(0);\n const [userId, setUserId] = useState<string>(\"\");\n const [userEmail, setUserEmail] = useState<string>(\"\");\n const [requestDialogOpen, setRequestDialogOpen] = useState(false);\n const [editDialogOpen, setEditDialogOpen] = useState(false);\n const [requestToEdit, setRequestToEdit] = useState<APIKey | null>(null);\n const [menuAnchor, setMenuAnchor] = useState<{\n top: number;\n left: number;\n } | null>(null);\n const [menuRequest, setMenuRequest] = useState<APIKey | null>(null);\n const [deleting, setDeleting] = useState<string | null>(null);\n const [optimisticallyDeleted, setOptimisticallyDeleted] = useState<\n Set<string>\n >(new Set());\n const [deleteDialogState, setDeleteDialogState] = useState<{\n open: boolean;\n request: APIKey | null;\n }>({ open: false, request: null });\n const [apiKeyValues, setApiKeyValues] = useState<Map<string, string>>(\n new Map(),\n );\n const [apiKeyLoading, setApiKeyLoading] = useState<Set<string>>(new Set());\n const [alreadyReadKeys, setAlreadyReadKeys] = useState<Set<string>>(\n new Set(),\n );\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 =\n entity.metadata.annotations?.[\"kuadrant.io/apiproduct\"] ||\n entity.metadata.name;\n const namespace =\n entity.metadata.annotations?.[\"kuadrant.io/namespace\"] ||\n propNamespace ||\n \"default\";\n\n useAsync(async () => {\n const identity = await identityApi.getBackstageIdentity();\n const profile = await identityApi.getProfileInfo();\n setUserId(identity.userEntityRef);\n setUserEmail(profile.email || \"\");\n }, [identityApi]);\n\n const {\n value: requests,\n loading: requestsLoading,\n error: requestsError,\n } = useAsync(async () => {\n const data = await kuadrantApi.getRequestsByNamespace(namespace);\n // filter by apiproduct name, not httproute name\n return (data.items || []).filter(\n (r: APIKey) =>\n r.spec.apiProductRef.name === apiProductName &&\n r.metadata.namespace === namespace, // APIProducts and APIKeys (and its Secret) will be in the same NS\n );\n }, [apiProductName, namespace, refresh, kuadrantApi]);\n\n const {\n value: apiProduct,\n loading: plansLoading,\n error: plansError,\n } = useAsync(async () => {\n const data = await kuadrantApi.getApiProducts();\n\n const product = data.items?.find(\n (p: APIProduct) =>\n p.metadata.namespace === namespace &&\n p.metadata.name === apiProductName,\n );\n\n return product;\n }, [namespace, apiProductName, kuadrantApi]);\n\n // check permissions with resource reference once we have the apiproduct\n const resourceRef = apiProduct\n ? `apiproduct:${apiProduct.metadata.namespace}/${apiProduct.metadata.name}`\n : undefined;\n\n const {\n allowed: canCreateRequest,\n loading: createRequestPermissionLoading,\n error: createRequestPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyCreatePermission, resourceRef);\n\n const {\n allowed: canDeleteOwnKey,\n loading: deleteOwnPermissionLoading,\n error: deleteOwnPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyDeleteOwnPermission);\n\n const {\n allowed: canDeleteAllKeys,\n loading: deleteAllPermissionLoading,\n error: deleteAllPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyDeleteAllPermission);\n\n const {\n allowed: canUpdateRequest,\n loading: updateRequestPermissionLoading,\n error: updateRequestPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyUpdateOwnPermission);\n\n const handleDeleteRequest = async (name: string) => {\n // optimistic update - remove from UI immediately\n setOptimisticallyDeleted((prev) => new Set(prev).add(name));\n setDeleting(name);\n try {\n await kuadrantApi.deleteRequest(namespace, name);\n alertApi.post({\n message: \"API key deleted successfully\",\n severity: \"success\",\n display: \"transient\",\n });\n setRefresh((r) => r + 1);\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"unknown error occurred\";\n // rollback optimistic update on error\n setOptimisticallyDeleted((prev) => {\n const next = new Set(prev);\n next.delete(name);\n return next;\n });\n alertApi.post({\n message: `Failed to delete API key: ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\n } finally {\n setDeleting(null);\n }\n };\n\n const fetchApiKeyFromSecret = async (\n requestNamespace: string,\n requestName: string,\n ) => {\n const key = `${requestNamespace}/${requestName}`;\n if (apiKeyLoading.has(key)) {\n return;\n }\n\n setApiKeyLoading((prev) => new Set(prev).add(key));\n try {\n const data = await kuadrantApi.getApiKeySecret(requestNamespace, requestName);\n setApiKeyValues((prev) => new Map(prev).set(key, data.apiKey));\n // after successful read, mark as already read (show-once behaviour)\n setAlreadyReadKeys((prev) => new Set(prev).add(key));\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"unknown error occurred\";\n if (errorMessage.includes(\"403\") || errorMessage.includes(\"already been viewed\")) {\n // secret has already been read\n setAlreadyReadKeys((prev) => new Set(prev).add(key));\n alertApi.post({\n message:\n \"This API key has already been viewed and cannot be retrieved again.\",\n severity: \"warning\",\n display: \"transient\",\n });\n } else {\n alertApi.post({\n message: `Failed to fetch api key: ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\n }\n } finally {\n setApiKeyLoading((prev) => {\n const next = new Set(prev);\n next.delete(key);\n return next;\n });\n }\n };\n\n const clearApiKeyValue = (requestNamespace: string, requestName: string) => {\n const key = `${requestNamespace}/${requestName}`;\n setApiKeyValues((prev) => {\n const next = new Map(prev);\n next.delete(key);\n return next;\n });\n };\n\n const handleEditRequest = (request: APIKey) => {\n setRequestToEdit(request);\n setEditDialogOpen(true);\n };\n\n const handleEditSuccess = () => {\n setRefresh((r) => r + 1);\n setEditDialogOpen(false);\n alertApi.post({\n message: \"API key updated\",\n severity: \"success\",\n display: \"transient\",\n });\n setRequestToEdit(null);\n };\n\n const handleMenuClose = () => {\n setMenuAnchor(null);\n setMenuRequest(null);\n };\n\n const handleMenuEdit = () => {\n if (!menuRequest) return;\n handleEditRequest(menuRequest);\n handleMenuClose();\n };\n\n const handleMenuDeleteClick = () => {\n if (!menuRequest) return;\n const request = menuRequest;\n handleMenuClose();\n setDeleteDialogState({ open: true, request });\n };\n\n const handleDeleteConfirm = async () => {\n if (!deleteDialogState.request) return;\n await handleDeleteRequest(deleteDialogState.request.metadata.name);\n setDeleteDialogState({ open: false, request: null });\n };\n\n const handleDeleteCancel = () => {\n setDeleteDialogState({ open: false, request: null });\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 detailPanelConfig = useMemo(\n () => [\n {\n render: (data: any) => {\n // backstage Table wraps the data in { rowData: actualData }\n const request = data.rowData as APIKey;\n if (!request?.metadata?.name) {\n return <Box />;\n }\n\n // pass already-revealed key from parent state (don't auto-fetch - that consumes show-once)\n const key = `${request.metadata.namespace}/${request.metadata.name}`;\n const revealedKey = apiKeyValues.get(key);\n return (\n <DetailPanelContent\n request={request}\n apiName={apiProductName}\n revealedApiKey={revealedKey}\n />\n );\n },\n },\n ],\n [apiProductName, apiKeyValues],\n );\n\n // separate component to isolate state\n const DetailPanelContent = ({\n request,\n apiName: api,\n revealedApiKey,\n }: {\n request: APIKey;\n apiName: string;\n revealedApiKey?: string;\n }) => {\n const [selectedLanguage, setSelectedLanguage] = useState(0);\n const hostname = request.status?.apiHostname || `${api}.apps.example.com`;\n\n // use revealed key if available, otherwise show placeholder\n const displayApiKey = revealedApiKey || \"<your-api-key>\";\n\n // Generate code snippets based on authScheme credentials\n const credentials = request.status?.authScheme?.credentials;\n const snippets = generateAuthCodeSnippets(credentials, hostname, displayApiKey);\n\n return (\n <Box\n p={3}\n bgcolor=\"background.default\"\n onClick={(e) => e.stopPropagation()}\n >\n {request.spec.useCase && (\n <Box mb={3}>\n <Typography variant=\"h6\" gutterBottom>\n Use Case\n </Typography>\n <Box\n p={2}\n bgcolor=\"background.paper\"\n borderRadius={1}\n border=\"1px solid rgba(0, 0, 0, 0.12)\"\n >\n <Typography\n variant=\"body2\"\n style={{\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n overflowWrap: \"break-word\",\n }}\n >\n {request.spec.useCase}\n </Typography>\n </Box>\n </Box>\n )}\n <Typography variant=\"h6\" gutterBottom>\n Usage Examples\n </Typography>\n <Typography variant=\"body2\" paragraph>\n Use these code examples to test the API with your{\" \"}\n {request.spec.planTier} tier key.\n </Typography>\n <Box onClick={(e) => e.stopPropagation()}>\n <Tabs\n value={selectedLanguage}\n onChange={(e, newValue) => {\n e.stopPropagation();\n setSelectedLanguage(newValue);\n }}\n indicatorColor=\"primary\"\n >\n <Tab label=\"cURL\" onClick={(e) => e.stopPropagation()} />\n <Tab label=\"Node.js\" onClick={(e) => e.stopPropagation()} />\n <Tab label=\"Python\" onClick={(e) => e.stopPropagation()} />\n <Tab label=\"Go\" onClick={(e) => e.stopPropagation()} />\n </Tabs>\n </Box>\n <Box mt={2}>\n {selectedLanguage === 0 && (\n <CodeSnippet\n text={snippets.curl}\n language=\"bash\"\n showCopyCodeButton\n />\n )}\n {selectedLanguage === 1 && (\n <CodeSnippet\n text={snippets.nodejs}\n language=\"javascript\"\n showCopyCodeButton\n />\n )}\n {selectedLanguage === 2 && (\n <CodeSnippet\n text={snippets.python}\n language=\"python\"\n showCopyCodeButton\n />\n )}\n {selectedLanguage === 3 && (\n <CodeSnippet\n text={snippets.go}\n language=\"go\"\n showCopyCodeButton\n />\n )}\n </Box>\n </Box>\n );\n };\n\n const loading =\n requestsLoading ||\n plansLoading ||\n createRequestPermissionLoading ||\n deleteOwnPermissionLoading ||\n deleteAllPermissionLoading ||\n updateRequestPermissionLoading;\n const error = requestsError || plansError;\n const permissionError =\n createRequestPermissionError ||\n deleteOwnPermissionError ||\n deleteAllPermissionError ||\n updateRequestPermissionError;\n\n if (loading) {\n return <Progress />;\n }\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n if (permissionError) {\n const failedPermission = createRequestPermissionError\n ? \"kuadrant.apikey.create\"\n : deleteOwnPermissionError\n ? \"kuadrant.apikey.delete.own\"\n : deleteAllPermissionError\n ? \"kuadrant.apikey.delete.all\"\n : updateRequestPermissionError\n ? \"kuadrant.apikey.update.own\"\n : \"unknown\";\n return (\n <Box p={2}>\n <Typography color=\"error\">\n Unable to check permissions: {permissionError.message}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Permission: {failedPermission}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Please try again or contact your administrator\n </Typography>\n </Box>\n );\n }\n\n const myRequests = ((requests || []) as APIKey[]).filter(\n (r) => !optimisticallyDeleted.has(r.metadata.name),\n );\n const plans = (apiProduct?.status?.discoveredPlans || []) as PlanPolicyPlan[];\n\n const pendingRequests = myRequests.filter(\n (r) => !r.status?.phase || r.status.phase === \"Pending\",\n );\n const approvedRequests = myRequests.filter(\n (r) => r.status?.phase === \"Approved\",\n );\n const rejectedRequests = myRequests.filter(\n (r) => r.status?.phase === \"Rejected\",\n );\n\n const approvedColumns: TableColumn<APIKey>[] = [\n {\n title: \"Tier\",\n field: \"spec.planTier\",\n render: (row: APIKey) => (\n <Chip label={row.spec.planTier} color=\"primary\" size=\"small\" />\n ),\n },\n {\n title: \"Approved\",\n field: \"status.reviewedAt\",\n render: (row: APIKey) => (\n <Typography variant=\"body2\">\n {row.status?.reviewedAt\n ? new Date(row.status.reviewedAt).toLocaleDateString()\n : \"-\"}\n </Typography>\n ),\n },\n {\n title: \"API Key\",\n field: \"status.secretRef\",\n searchable: false,\n filtering: false,\n render: (row: APIKey) => {\n const key = `${row.metadata.namespace}/${row.metadata.name}`;\n const isVisible = visibleKeys.has(row.metadata.name);\n const isLoading = apiKeyLoading.has(key);\n const apiKeyValue = apiKeyValues.get(key);\n const hasSecretRef = row.status?.secretRef?.name;\n const canReadSecret = row.status?.canReadSecret !== false;\n const isAlreadyRead = alreadyReadKeys.has(key) || !canReadSecret;\n\n if (!hasSecretRef) {\n return (\n <Typography variant=\"body2\" color=\"textSecondary\">\n Awaiting secret...\n </Typography>\n );\n }\n\n // key has already been viewed and cannot be retrieved again\n if (isAlreadyRead && !apiKeyValue) {\n return (\n <Tooltip title=\"This API key has already been viewed and cannot be retrieved again\">\n <Box display=\"flex\" alignItems=\"center\">\n <Typography\n variant=\"body2\"\n color=\"textSecondary\"\n style={{ fontFamily: \"monospace\", marginRight: 8 }}\n >\n Already viewed\n </Typography>\n <VisibilityOffIcon fontSize=\"small\" color=\"disabled\" />\n </Box>\n </Tooltip>\n );\n }\n\n const handleRevealClick = () => {\n if (isVisible) {\n // hiding - clear the value from memory\n clearApiKeyValue(row.metadata.namespace, row.metadata.name);\n toggleVisibility(row.metadata.name);\n } else if (!isAlreadyRead) {\n // show warning dialog before first reveal\n setPendingKeyReveal({\n namespace: row.metadata.namespace,\n name: row.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 display=\"flex\" alignItems=\"center\">\n <Typography\n variant=\"body2\"\n style={{\n fontFamily: \"monospace\",\n marginRight: 8,\n }}\n >\n {isLoading\n ? \"Loading...\"\n : isVisible && apiKeyValue\n ? apiKeyValue\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 isVisible ? \"Hide API key\" : \"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 /> : <VisibilityIcon />}\n </IconButton>\n </span>\n </Tooltip>\n </Box>\n );\n },\n },\n {\n title: \"\",\n field: \"actions\",\n searchable: false,\n filtering: false,\n render: (row: APIKey) => {\n const isDeleting = deleting === row.metadata.name;\n if (isDeleting) {\n return <CircularProgress size={20} />;\n }\n const ownerId = row.spec.requestedBy.userId;\n const canDelete = canDeleteResource(\n ownerId,\n userId,\n canDeleteOwnKey,\n canDeleteAllKeys,\n );\n if (!canDelete) return null;\n return (\n <IconButton\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n const rect = e.currentTarget.getBoundingClientRect();\n setMenuAnchor({ top: rect.bottom, left: rect.left });\n setMenuRequest(row);\n }}\n title=\"Actions\"\n aria-controls={menuAnchor ? \"actions-menu\" : undefined}\n aria-haspopup=\"true\"\n >\n <MoreVertIcon />\n </IconButton>\n );\n },\n },\n ];\n\n const requestColumns: TableColumn<APIKey>[] = [\n {\n title: \"Status\",\n field: \"status.phase\",\n render: (row: APIKey) => {\n const phase = row.status?.phase || \"Pending\";\n const isPending = phase === \"Pending\";\n return (\n <Chip\n label={phase}\n size=\"small\"\n icon={isPending ? <HourglassEmptyIcon /> : <CancelIcon />}\n color={isPending ? \"default\" : \"secondary\"}\n />\n );\n },\n },\n {\n title: \"Tier\",\n field: \"spec.planTier\",\n render: (row: APIKey) => (\n <Chip label={row.spec.planTier} color=\"primary\" size=\"small\" />\n ),\n },\n {\n title: \"Use Case\",\n field: \"spec.useCase\",\n render: (row: APIKey) => {\n if (!row.spec.useCase) {\n return <Typography variant=\"body2\">-</Typography>;\n }\n return (\n <Tooltip title={row.spec.useCase} placement=\"top\">\n <Typography\n variant=\"body2\"\n style={{\n maxWidth: \"200px\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {row.spec.useCase}\n </Typography>\n </Tooltip>\n );\n },\n },\n {\n title: \"Requested\",\n field: \"metadata.creationTimestamp\",\n render: (row: APIKey) => (\n <Typography variant=\"body2\">\n {row.metadata.creationTimestamp\n ? new Date(row.metadata.creationTimestamp).toLocaleDateString()\n : \"-\"}\n </Typography>\n ),\n },\n {\n title: \"Reviewed\",\n field: \"status.reviewedAt\",\n render: (row: APIKey) => {\n if (!row.status?.reviewedAt)\n return <Typography variant=\"body2\">-</Typography>;\n return (\n <Typography variant=\"body2\">\n {new Date(row.status.reviewedAt).toLocaleDateString()}\n </Typography>\n );\n },\n },\n {\n title: \"\",\n field: \"actions\",\n searchable: false,\n filtering: false,\n render: (row: APIKey) => {\n const isDeleting = deleting === row.metadata.name;\n if (isDeleting) {\n return <CircularProgress size={20} />;\n }\n const isPending = !row.status?.phase || row.status.phase === \"Pending\";\n const ownerId = row.spec.requestedBy.userId;\n const canDelete = canDeleteResource(\n ownerId,\n userId,\n canDeleteOwnKey,\n canDeleteAllKeys,\n );\n const canEdit = canUpdateRequest && ownerId === userId;\n if (!isPending || (!canEdit && !canDelete)) return null;\n return (\n <IconButton\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n const rect = e.currentTarget.getBoundingClientRect();\n setMenuAnchor({ top: rect.bottom, left: rect.left });\n setMenuRequest(row);\n }}\n title=\"Actions\"\n aria-controls={menuAnchor ? \"actions-menu\" : undefined}\n aria-haspopup=\"true\"\n >\n <MoreVertIcon />\n </IconButton>\n );\n },\n },\n ];\n\n // Filter columns for pending requests (no Reviewed or Reason)\n const pendingRequestColumns = requestColumns.filter(\n (col) => col.title !== \"Reviewed\" && col.title !== \"Reason\",\n );\n\n return (\n <Box p={2}>\n <Grid container spacing={3} direction=\"column\">\n {canCreateRequest && (\n <Grid item>\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"flex-end\"\n mb={2}\n >\n <Button\n variant=\"contained\"\n color=\"primary\"\n startIcon={<AddIcon />}\n onClick={() => setRequestDialogOpen(true)}\n disabled={plans.length === 0}\n data-testid=\"request-api-access-button\"\n data-plans-count={plans.length}\n >\n Request API Access\n </Button>\n {plans.length === 0 && (\n <Typography\n variant=\"caption\"\n color=\"textSecondary\"\n style={{ marginTop: 4 }}\n data-testid=\"no-plans-message\"\n >\n {!apiProduct\n ? \"API product not found\"\n : (() => {\n const readyCondition =\n apiProduct.status?.conditions?.find(\n (c: any) => c.type === \"Ready\",\n );\n const planCondition =\n apiProduct.status?.conditions?.find(\n (c: any) => c.type === \"PlanPolicyDiscovered\",\n );\n\n if (readyCondition?.status !== \"True\") {\n return `HTTPRoute not ready: ${readyCondition?.message || \"unknown\"}`;\n }\n if (planCondition?.status !== \"True\") {\n return `No plans discovered: ${planCondition?.message || \"no PlanPolicy found\"}`;\n }\n return \"No plans available\";\n })()}\n </Typography>\n )}\n </Box>\n </Grid>\n )}\n {pendingRequests.length === 0 &&\n rejectedRequests.length === 0 &&\n approvedRequests.length === 0 && (\n <Grid item>\n <Box p={3} textAlign=\"center\">\n <Typography variant=\"body1\" color=\"textSecondary\">\n No API keys yet. Request access to get started.\n </Typography>\n </Box>\n </Grid>\n )}\n {pendingRequests.length > 0 && (\n <Grid item>\n <Table\n title=\"Pending Requests\"\n options={{\n paging: pendingRequests.length > 5,\n pageSize: 20,\n search: true,\n filtering: true,\n debounceInterval: 300,\n toolbar: true,\n emptyRowsWhenPaging: false,\n }}\n columns={pendingRequestColumns}\n data={pendingRequests}\n />\n </Grid>\n )}\n {rejectedRequests.length > 0 && (\n <Grid item>\n <Table\n title=\"Rejected Requests\"\n options={{\n paging: rejectedRequests.length > 5,\n pageSize: 20,\n search: true,\n filtering: true,\n debounceInterval: 300,\n toolbar: true,\n emptyRowsWhenPaging: false,\n }}\n columns={requestColumns}\n data={rejectedRequests}\n />\n </Grid>\n )}\n {approvedRequests.length > 0 && (\n <Grid item>\n <Table\n key=\"api-keys-table\"\n title=\"API Keys\"\n options={{\n paging: approvedRequests.length > 5,\n pageSize: 20,\n search: true,\n filtering: true,\n debounceInterval: 300,\n toolbar: true,\n emptyRowsWhenPaging: false,\n }}\n columns={approvedColumns}\n data={approvedRequests}\n detailPanel={detailPanelConfig}\n />\n </Grid>\n )}\n </Grid>\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 <Menu\n id=\"actions-menu\"\n open={Boolean(menuAnchor)}\n onClose={handleMenuClose}\n anchorReference=\"anchorPosition\"\n anchorPosition={menuAnchor || { top: 0, left: 0 }}\n >\n {menuRequest &&\n (() => {\n const isPending =\n !menuRequest.status?.phase ||\n menuRequest.status.phase === \"Pending\";\n const ownerId = menuRequest.spec.requestedBy.userId;\n const canEdit = canUpdateRequest && ownerId === userId && isPending;\n\n const items = [];\n if (canEdit) {\n items.push(\n <MenuItem key=\"edit\" onClick={handleMenuEdit}>\n Edit\n </MenuItem>,\n );\n }\n items.push(\n <MenuItem key=\"delete\" onClick={handleMenuDeleteClick}>\n Delete\n </MenuItem>,\n );\n return items;\n })()}\n </Menu>\n\n {requestToEdit && (\n <EditAPIKeyDialog\n open={editDialogOpen}\n onClose={() => {\n setEditDialogOpen(false);\n setRequestToEdit(null);\n }}\n onSuccess={handleEditSuccess}\n request={requestToEdit}\n availablePlans={plans}\n />\n )}\n\n <ConfirmDeleteDialog\n open={deleteDialogState.open}\n title=\"Delete Request\"\n description={`Are you sure you want to delete this ${deleteDialogState.request?.status?.phase === \"Approved\" ? \"API key\" : \"request\"}?`}\n deleting={deleting !== null}\n onConfirm={handleDeleteConfirm}\n onCancel={handleDeleteCancel}\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 </Box>\n );\n};\n","import { jsx } from 'react/jsx-runtime';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { AnalyticsContext } from '@backstage/core-plugin-api';\nimport { createVersionedContext, useVersionedContext, createVersionedValueMap } from '@backstage/version-bridge';\n\nconst NewEntityContext = createVersionedContext(\n \"entity-context\"\n);\nconst AsyncEntityProvider = (props) => {\n const { children, entity, loading, error, refresh } = props;\n const value = { entity, loading, error, refresh };\n return /* @__PURE__ */ jsx(NewEntityContext.Provider, { value: createVersionedValueMap({ 1: value }), children: /* @__PURE__ */ jsx(\n AnalyticsContext,\n {\n attributes: {\n ...entity ? { entityRef: stringifyEntityRef(entity) } : void 0\n },\n children\n }\n ) });\n};\nconst EntityProvider = (props) => /* @__PURE__ */ jsx(\n AsyncEntityProvider,\n {\n entity: props.entity,\n loading: !Boolean(props.entity),\n error: void 0,\n refresh: void 0,\n children: props.children\n }\n);\nfunction useEntity() {\n const versionedHolder = useVersionedContext(\n \"entity-context\"\n );\n if (!versionedHolder) {\n throw new Error(\"Entity context is not available\");\n }\n const value = versionedHolder.atVersion(1);\n if (!value) {\n throw new Error(\"EntityContext v1 not available\");\n }\n if (!value.entity) {\n throw new Error(\n \"useEntity hook is being called outside of an EntityLayout where the entity has not been loaded. If this is intentional, please use useAsyncEntity instead.\"\n );\n }\n return { entity: value.entity };\n}\nfunction useAsyncEntity() {\n const versionedHolder = useVersionedContext(\n \"entity-context\"\n );\n if (!versionedHolder) {\n throw new Error(\"Entity context is not available\");\n }\n const value = versionedHolder.atVersion(1);\n if (!value) {\n throw new Error(\"EntityContext v1 not available\");\n }\n const { entity, loading, error, refresh } = value;\n return { entity, loading, error, refresh };\n}\n\nexport { AsyncEntityProvider, EntityProvider, useAsyncEntity, useEntity };\n//# sourceMappingURL=useEntity.esm.js.map\n","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z\"\n}), 'Visibility');\n\nexports.default = _default;","import { useEffect } from 'react';\nimport useAsyncFn from './useAsyncFn';\nexport default function useAsync(fn, deps) {\n if (deps === void 0) { deps = []; }\n var _a = useAsyncFn(fn, deps, {\n loading: true,\n }), state = _a[0], callback = _a[1];\n useEffect(function () {\n callback();\n }, [callback]);\n return state;\n}\n","import { __assign } from \"tslib\";\nimport { useCallback, useRef, useState } from 'react';\nimport useMountedState from './useMountedState';\nexport default function useAsyncFn(fn, deps, initialState) {\n if (deps === void 0) { deps = []; }\n if (initialState === void 0) { initialState = { loading: false }; }\n var lastCallId = useRef(0);\n var isMounted = useMountedState();\n var _a = useState(initialState), state = _a[0], set = _a[1];\n var callback = useCallback(function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var callId = ++lastCallId.current;\n if (!state.loading) {\n set(function (prevState) { return (__assign(__assign({}, prevState), { loading: true })); });\n }\n return fn.apply(void 0, args).then(function (value) {\n isMounted() && callId === lastCallId.current && set({ value: value, loading: false });\n return value;\n }, function (error) {\n isMounted() && callId === lastCallId.current && set({ error: error, loading: false });\n return error;\n });\n }, deps);\n return [state, callback];\n}\n","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z\"\n}), 'Info');\n\nexports.default = _default;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78l3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z\"\n}), 'VisibilityOff');\n\nexports.default = _default;","import React, { useState, useEffect } from 'react';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogContentText,\n DialogActions,\n Button,\n TextField,\n Typography,\n Box,\n CircularProgress,\n} from '@material-ui/core';\nimport WarningIcon from '@material-ui/icons/Warning';\n\nexport interface ConfirmDeleteDialogProps {\n open: boolean;\n title: string;\n description: string;\n // for dangerous deletes, require typing this text to confirm\n confirmText?: string;\n // severity affects styling - 'high' shows warning icon and requires text confirmation\n severity?: 'normal' | 'high';\n deleting?: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nexport const ConfirmDeleteDialog = ({\n open,\n title,\n description,\n confirmText,\n severity = 'normal',\n deleting = false,\n onConfirm,\n onCancel,\n}: ConfirmDeleteDialogProps) => {\n const [inputValue, setInputValue] = useState('');\n\n // reset input when dialog opens/closes\n useEffect(() => {\n if (!open) {\n setInputValue('');\n }\n }, [open]);\n\n const requiresTextConfirmation = severity === 'high' && confirmText;\n const canConfirm = requiresTextConfirmation ? inputValue === confirmText : true;\n\n const handleConfirm = () => {\n if (canConfirm) {\n onConfirm();\n }\n };\n\n return (\n <Dialog\n open={open}\n onClose={deleting ? undefined : onCancel}\n maxWidth=\"sm\"\n fullWidth\n >\n <DialogTitle>\n {severity === 'high' && (\n <Box display=\"flex\" alignItems=\"center\" style={{ gap: 8 }}>\n <WarningIcon color=\"error\" />\n <span>{title}</span>\n </Box>\n )}\n {severity !== 'high' && title}\n </DialogTitle>\n <DialogContent>\n <DialogContentText style={{ whiteSpace: 'pre-line' }}>\n {description}\n </DialogContentText>\n {requiresTextConfirmation && (\n <Box mt={2}>\n <Typography variant=\"body2\" color=\"textSecondary\" gutterBottom>\n Type <strong>{confirmText}</strong> to confirm:\n </Typography>\n <TextField\n fullWidth\n variant=\"outlined\"\n size=\"small\"\n value={inputValue}\n onChange={e => setInputValue(e.target.value)}\n disabled={deleting}\n autoFocus\n placeholder={confirmText}\n />\n </Box>\n )}\n </DialogContent>\n <DialogActions>\n <Button onClick={onCancel} disabled={deleting}>\n Cancel\n </Button>\n <Button\n onClick={handleConfirm}\n color=\"secondary\"\n variant=\"contained\"\n disabled={deleting || !canConfirm}\n startIcon={deleting ? <CircularProgress size={16} color=\"inherit\" /> : undefined}\n >\n {deleting ? 'Deleting...' : 'Delete'}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"\n}), 'MoreVert');\n\nexports.default = _default;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"\n}), 'Warning');\n\nexports.default = _default;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M6 2v6h.01L6 8.01 10 12l-4 4 .01.01H6V22h12v-5.99h-.01L18 16l-4-4 4-3.99-.01-.01H18V2H6zm10 14.5V20H8v-3.5l4-4 4 4zm-4-5l-4-4V4h8v3.5l-4 4z\"\n}), 'HourglassEmpty');\n\nexports.default = _default;"],"names":["EditAPIKeyDialog","open","onClose","onSuccess","request","availablePlans","kuadrantApi","useApi","kuadrantApiRef","planTier","setPlanTier","useState","useCase","setUseCase","saving","setSaving","error","setError","useEffect","spec","handleClose","Dialog","maxWidth","fullWidth","DialogTitle","DialogContent","Box","mb","p","bgcolor","color","borderRadius","Typography","variant","FormControl","margin","InputLabel","Select","value","onChange","e","target","disabled","map","plan","limitDesc","Object","entries","limits","key","val","join","MenuItem","tier","TextField","label","placeholder","multiline","rows","helperText","DialogActions","Button","onClick","async","patch","trim","updateRequest","metadata","name","namespace","err","console","Error","message","startIcon","CircularProgress","size","undefined","_interopRequireDefault","_interopRequireWildcard","exports","React","_default","default","createElement","d","generateAuthorizationHeaderSnippets","baseUrl","apiKey","prefix","prefixWithSpace","curl","nodejs","python","go","ApiKeyManagementTab","propNamespace","entity","apiProduct","deleteDialogState","useEntity","identityApi","identityApiRef","alertApi","alertApiRef","visibleKeys","setVisibleKeys","Set","refresh","setRefresh","userId","setUserId","userEmail","setUserEmail","requestDialogOpen","setRequestDialogOpen","editDialogOpen","setEditDialogOpen","requestToEdit","setRequestToEdit","menuAnchor","setMenuAnchor","menuRequest","setMenuRequest","deleting","setDeleting","optimisticallyDeleted","setOptimisticallyDeleted","setDeleteDialogState","apiKeyValues","setApiKeyValues","Map","apiKeyLoading","setApiKeyLoading","alreadyReadKeys","setAlreadyReadKeys","showOnceWarningOpen","setShowOnceWarningOpen","pendingKeyReveal","setPendingKeyReveal","apiProductName","annotations","useAsync","identity","getBackstageIdentity","profile","getProfileInfo","userEntityRef","email","requests","loading","requestsLoading","requestsError","getRequestsByNamespace","items","filter","r","apiProductRef","plansLoading","plansError","data","getApiProducts","find","resourceRef","allowed","canCreateRequest","createRequestPermissionLoading","createRequestPermissionError","useKuadrantPermission","kuadrantApiKeyCreatePermission","canDeleteOwnKey","deleteOwnPermissionLoading","deleteOwnPermissionError","kuadrantApiKeyDeleteOwnPermission","canDeleteAllKeys","deleteAllPermissionLoading","deleteAllPermissionError","kuadrantApiKeyDeleteAllPermission","canUpdateRequest","updateRequestPermissionLoading","updateRequestPermissionError","kuadrantApiKeyUpdateOwnPermission","handleMenuClose","handleMenuEdit","handleMenuDeleteClick","toggleVisibility","keyName","prev","newSet","has","delete","add","detailPanelConfig","useMemo","render","rowData","revealedKey","get","DetailPanelContent","apiName","revealedApiKey","api","selectedLanguage","setSelectedLanguage","hostname","status","apiHostname","displayApiKey","snippets","credentials","authorizationHeader","customHeader","headerName","generateCustomHeaderSnippets","queryString","paramName","generateQueryStringSnippets","cookie","cookieName","generateCookieSnippets","generateAuthCodeSnippets","authScheme","stopPropagation","gutterBottom","border","style","whiteSpace","wordBreak","overflowWrap","paragraph","Tabs","newValue","indicatorColor","Tab","mt","CodeSnippet","text","language","showCopyCodeButton","permissionError","Progress","ResponseErrorPanel","failedPermission","myRequests","plans","discoveredPlans","pendingRequests","phase","approvedRequests","rejectedRequests","approvedColumns","title","field","row","Chip","reviewedAt","Date","toLocaleDateString","searchable","filtering","isVisible","isLoading","apiKeyValue","hasSecretRef","secretRef","canReadSecret","isAlreadyRead","Tooltip","display","alignItems","fontFamily","marginRight","VisibilityOffIcon","fontSize","IconButton","navigator","clipboard","writeText","post","severity","FileCopyIcon","span","requestNamespace","requestName","next","clearApiKeyValue","VisibilityIcon","ownerId","requestedBy","canDeleteResource","rect","currentTarget","getBoundingClientRect","top","bottom","left","aria-controls","aria-haspopup","MoreVertIcon","requestColumns","isPending","icon","HourglassEmptyIcon","CancelIcon","placement","overflow","textOverflow","creationTimestamp","canDelete","pendingRequestColumns","col","Grid","container","spacing","direction","item","flexDirection","AddIcon","length","data-testid","data-plans-count","marginTop","readyCondition","conditions","c","type","planCondition","textAlign","Table","options","paging","pageSize","search","debounceInterval","toolbar","emptyRowsWhenPaging","columns","detailPanel","RequestAccessDialog","Menu","id","Boolean","anchorReference","anchorPosition","push","ConfirmDeleteDialog","description","onConfirm","deleteRequest","errorMessage","handleDeleteRequest","onCancel","WarningIcon","strong","getApiKeySecret","set","includes","fetchApiKeyFromSecret","versionedHolder","useVersionedContext","atVersion","createVersionedContext","fn","deps","_a","initialState","lastCallId","useRef","isMounted","useMountedState","state","callback","useCallback","args","_i","arguments","callId","current","prevState","__assign","apply","then","useAsyncFn","confirmText","inputValue","setInputValue","requiresTextConfirmation","canConfirm","gap","DialogContentText","autoFocus"],"sourceRoot":""}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[879],{72627:(e,n,t)=>{t.r(n),t.d(n,{ApiKeyApprovalPage:()=>u,ApiKeyDetailPage:()=>A,ApiProductDetailPage:()=>b,ApiProductsPage:()=>d,EntityKuadrantApiAccessCard:()=>m,EntityKuadrantApiApprovalTab:()=>y,EntityKuadrantApiKeyManagementTab:()=>c,EntityKuadrantApiKeysContent:()=>P,EntityKuadrantApiProductInfoContent:()=>s,EntityKuadrantApiProductOpenApiAlert:()=>K,KuadrantPage:()=>p,MyApiKeysPage:()=>l,kuadrantPlugin:()=>r});var a=t(22097);const o=(0,a.createRouteRef)({id:"kuadrant"}),i=(0,a.createSubRouteRef)({id:"kuadrant/resource",parent:o,path:"/:kind/:namespace/:name"}),r=(0,a.createPlugin)({id:"kuadrant",routes:{root:o,resource:i}}),p=r.provide((0,a.createRoutableExtension)({name:"KuadrantPage",component:()=>Promise.all([t.e(9400),t.e(9370),t.e(2628),t.e(4611),t.e(369),t.e(4382),t.e(7076),t.e(5235),t.e(5010),t.e(8563),t.e(6422),t.e(5478),t.e(9634),t.e(484),t.e(1942),t.e(5501),t.e(7976),t.e(8789),t.e(7005)]).then(t.bind(t,94251)).then(e=>e.ApiProductsPage),mountPoint:o})),d=r.provide((0,a.createRoutableExtension)({name:"ApiProductsPage",component:()=>Promise.all([t.e(9400),t.e(9370),t.e(2628),t.e(4611),t.e(369),t.e(4382),t.e(7076),t.e(5235),t.e(5010),t.e(8563),t.e(6422),t.e(5478),t.e(9634),t.e(484),t.e(1942),t.e(5501),t.e(7976),t.e(8789),t.e(7005)]).then(t.bind(t,94251)).then(e=>e.ApiProductsPage),mountPoint:o})),l=r.provide((0,a.createRoutableExtension)({name:"MyApiKeysPage",component:()=>Promise.all([t.e(9400),t.e(9370),t.e(2628),t.e(4611),t.e(369),t.e(7076),t.e(5235),t.e(5010),t.e(8563),t.e(5478),t.e(9634),t.e(484),t.e(1942),t.e(5501),t.e(7976),t.e(7270)]).then(t.bind(t,37270)).then(e=>e.MyApiKeysPage),mountPoint:o})),u=r.provide((0,a.createRoutableExtension)({name:"ApiKeyApprovalPage",component:()=>Promise.all([t.e(9400),t.e(9370),t.e(2628),t.e(4611),t.e(369),t.e(4382),t.e(7076),t.e(5235),t.e(5010),t.e(8563),t.e(5478),t.e(9634),t.e(484),t.e(1942),t.e(5501),t.e(7976),t.e(69),t.e(3976)]).then(t.bind(t,43976)).then(e=>e.ApiKeyApprovalPage),mountPoint:o})),m=r.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiAccessCard",component:{lazy:()=>Promise.all([t.e(9400),t.e(9370),t.e(2628),t.e(4611),t.e(369),t.e(4382),t.e(2118),t.e(5478),t.e(9634),t.e(484),t.e(1942),t.e(5501),t.e(7976),t.e(5427),t.e(9051),t.e(5203)]).then(t.bind(t,60441)).then(e=>e.ApiAccessCard)}})),c=r.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiKeyManagementTab",component:{lazy:()=>Promise.all([t.e(9400),t.e(9370),t.e(2628),t.e(4611),t.e(369),t.e(4382),t.e(7076),t.e(5235),t.e(5010),t.e(5478),t.e(484),t.e(1942),t.e(5501),t.e(7976),t.e(5427),t.e(9051),t.e(9838)]).then(t.bind(t,23650)).then(e=>e.ApiKeyManagementTab)}})),P=r.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiKeysContent",component:{lazy:()=>Promise.all([t.e(9400),t.e(9370),t.e(2628),t.e(4611),t.e(369),t.e(4382),t.e(7076),t.e(5235),t.e(5010),t.e(5478),t.e(484),t.e(1942),t.e(5501),t.e(7976),t.e(5427),t.e(9051),t.e(9838)]).then(t.bind(t,23650)).then(e=>e.ApiKeyManagementTab)}})),s=r.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiProductInfoContent",component:{lazy:()=>Promise.all([t.e(9400),t.e(9370),t.e(2628),t.e(4382),t.e(327),t.e(5478),t.e(9634),t.e(484),t.e(1942),t.e(5501),t.e(7976),t.e(5427),t.e(3947),t.e(4447)]).then(t.bind(t,75453)).then(e=>e.ApiProductInfoCard)}})),A=r.provide((0,a.createRoutableExtension)({name:"ApiKeyDetailPage",component:()=>Promise.all([t.e(9400),t.e(9370),t.e(2628),t.e(4611),t.e(7076),t.e(8563),t.e(5478),t.e(9634),t.e(484),t.e(1942),t.e(5501),t.e(7976),t.e(2967)]).then(t.bind(t,72967)).then(e=>e.ApiKeyDetailPage),mountPoint:o})),y=r.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiApprovalTab",component:{lazy:()=>Promise.all([t.e(9400),t.e(9370),t.e(2628),t.e(4611),t.e(369),t.e(4382),t.e(7076),t.e(5235),t.e(5010),t.e(5478),t.e(484),t.e(1942),t.e(5501),t.e(7976),t.e(5427),t.e(69),t.e(6800)]).then(t.bind(t,46800)).then(e=>e.EntityApiApprovalTab)}})),K=r.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiProductOpenApiAlert",component:{lazy:()=>Promise.all([t.e(9400),t.e(9370),t.e(5478),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(5427),t.e(6371)]).then(t.bind(t,36371)).then(e=>e.ApiProductOpenApiAlert)}})),b=r.provide((0,a.createRoutableExtension)({name:"ApiProductDetailPage",component:()=>Promise.all([t.e(9400),t.e(9370),t.e(2628),t.e(4611),t.e(369),t.e(4382),t.e(7076),t.e(5235),t.e(8563),t.e(8804),t.e(5478),t.e(9634),t.e(484),t.e(1942),t.e(5501),t.e(7976),t.e(8789),t.e(3947),t.e(7791)]).then(t.bind(t,57791)).then(e=>e.ApiProductDetailPage),mountPoint:o}))}}]);
|
|
2
|
+
//# sourceMappingURL=exposed-PluginRoot.8a8dd91f.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static/exposed-PluginRoot.8a8dd91f.chunk.js","mappings":"qiBAEO,MAAMA,GAAeC,EAAAA,EAAAA,gBAAe,CACzCC,GAAI,aAGOC,GAAmBC,EAAAA,EAAAA,mBAAkB,CAChDF,GAAI,oBACJG,OAAQL,EACRM,KAAM,4BCDKC,GAAiBC,EAAAA,EAAAA,cAAa,CACzCN,GAAI,WACJO,OAAQ,CACNC,KAAMV,EACNW,SAAUR,KAIDS,EAAeL,EAAeM,SACzCC,EAAAA,EAAAA,yBAAwB,CACtBC,KAAM,eACNC,UAAW,IACT,iOAAoCC,KAAKC,GAAKA,EAAEC,iBAClDC,WAAYpB,KAIHmB,EAAkBZ,EAAeM,SAC5CC,EAAAA,EAAAA,yBAAwB,CACtBC,KAAM,kBACNC,UAAW,IACT,iOAAoCC,KAAKC,GAAKA,EAAEC,iBAClDC,WAAYpB,KAIHqB,EAAgBd,EAAeM,SAC1CC,EAAAA,EAAAA,yBAAwB,CACtBC,KAAM,gBACNC,UAAW,IACT,mMAAqCC,KAAKC,GAAKA,EAAEG,eACnDD,WAAYpB,KAIHsB,EAAqBf,EAAeM,SAC/CC,EAAAA,EAAAA,yBAAwB,CACtBC,KAAM,qBACNC,UAAW,IACT,qNAA0CC,KAAKC,GAAKA,EAAEI,oBACxDF,WAAYpB,KAIHuB,EAA8BhB,EAAeM,SACxDW,EAAAA,EAAAA,0BAAyB,CACvBT,KAAM,8BACNC,UAAW,CACTS,KAAM,IACJ,mMAAqCR,KAAKC,GAAKA,EAAEQ,mBAK5CC,EAAoCpB,EAAeM,SAC9DW,EAAAA,EAAAA,0BAAyB,CACvBT,KAAM,oCACNC,UAAW,CACTS,KAAM,IACJ,6MAA2CR,KAAKC,GAAKA,EAAEU,yBAMlDC,EAA+BtB,EAAeM,SACzDW,EAAAA,EAAAA,0BAAyB,CACvBT,KAAM,+BACNC,UAAW,CACTS,KAAM,IACJ,6MAA2CR,KAAKC,GAAKA,EAAEU,yBAKlDE,EAAsCvB,EAAeM,SAChEW,EAAAA,EAAAA,0BAAyB,CACvBT,KAAM,sCACNC,UAAW,CACTS,KAAM,IACJ,+KAA0CR,KAAKC,GAAKA,EAAEa,wBAKjDC,EAAmBzB,EAAeM,SAC7CC,EAAAA,EAAAA,yBAAwB,CACtBC,KAAM,mBACNC,UAAW,IACT,sKAAwCC,KAAKC,GAAKA,EAAEc,kBACtDZ,WAAYpB,KAIHiC,EAA+B1B,EAAeM,SACzDW,EAAAA,EAAAA,0BAAyB,CACvBT,KAAM,+BACNC,UAAW,CACTS,KAAM,IACJ,2MAA4CR,KAAKC,GAAKA,EAAEgB,0BAKnDC,EAAuC5B,EAAeM,SACjEW,EAAAA,EAAAA,0BAAyB,CACvBT,KAAM,uCACNC,UAAW,CACTS,KAAM,IACJ,8HAA8CR,KAAKC,GAAKA,EAAEkB,4BAKrDC,EAAuB9B,EAAeM,SACjDC,EAAAA,EAAAA,yBAAwB,CACtBC,KAAM,uBACNC,UAAW,IACT,iOAA4CC,KAAKC,GAAKA,EAAEmB,sBAC1DjB,WAAYpB,I","sources":["webpack://internal.plugin-kuadrant/./src/routes.ts","webpack://internal.plugin-kuadrant/./src/plugin.ts"],"sourcesContent":["import { createRouteRef, createSubRouteRef } from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n id: 'kuadrant',\n});\n\nexport const resourceRouteRef = createSubRouteRef({\n id: 'kuadrant/resource',\n parent: rootRouteRef,\n path: '/:kind/:namespace/:name',\n});\n","import {\n createPlugin,\n createRoutableExtension,\n createComponentExtension,\n} from '@backstage/core-plugin-api';\n\nimport { rootRouteRef, resourceRouteRef } from './routes';\n\nexport const kuadrantPlugin = createPlugin({\n id: 'kuadrant',\n routes: {\n root: rootRouteRef,\n resource: resourceRouteRef,\n },\n});\n\nexport const KuadrantPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'KuadrantPage',\n component: () =>\n import('./components/KuadrantPage').then(m => m.ApiProductsPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const ApiProductsPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiProductsPage',\n component: () =>\n import('./components/KuadrantPage').then(m => m.ApiProductsPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const MyApiKeysPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'MyApiKeysPage',\n component: () =>\n import('./components/MyApiKeysPage').then(m => m.MyApiKeysPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const ApiKeyApprovalPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiKeyApprovalPage',\n component: () =>\n import('./components/ApiKeyApprovalPage').then(m => m.ApiKeyApprovalPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const EntityKuadrantApiAccessCard = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiAccessCard',\n component: {\n lazy: () =>\n import('./components/ApiAccessCard').then(m => m.ApiAccessCard),\n },\n }),\n);\n\nexport const EntityKuadrantApiKeyManagementTab = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiKeyManagementTab',\n component: {\n lazy: () =>\n import('./components/ApiKeyManagementTab').then(m => m.ApiKeyManagementTab),\n },\n }),\n);\n\n// entity content extension for api keys tab\nexport const EntityKuadrantApiKeysContent = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiKeysContent',\n component: {\n lazy: () =>\n import('./components/ApiKeyManagementTab').then(m => m.ApiKeyManagementTab),\n },\n }),\n);\n\nexport const EntityKuadrantApiProductInfoContent = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiProductInfoContent',\n component: {\n lazy: () =>\n import('./components/ApiProductInfoCard').then(m => m.ApiProductInfoCard),\n },\n }),\n);\n\nexport const ApiKeyDetailPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiKeyDetailPage',\n component: () =>\n import('./components/ApiKeyDetailPage').then(m => m.ApiKeyDetailPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const EntityKuadrantApiApprovalTab = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiApprovalTab',\n component: {\n lazy: () =>\n import('./components/EntityApiApprovalTab').then(m => m.EntityApiApprovalTab),\n },\n }),\n);\n\nexport const EntityKuadrantApiProductOpenApiAlert = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiProductOpenApiAlert',\n component: {\n lazy: () =>\n import('./components/ApiProductOpenApiAlert').then(m => m.ApiProductOpenApiAlert),\n },\n }),\n);\n\nexport const ApiProductDetailPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiProductDetailPage',\n component: () =>\n import('./components/ApiProductDetailPage').then(m => m.ApiProductDetailPage),\n mountPoint: rootRouteRef,\n }),\n);\n"],"names":["rootRouteRef","createRouteRef","id","resourceRouteRef","createSubRouteRef","parent","path","kuadrantPlugin","createPlugin","routes","root","resource","KuadrantPage","provide","createRoutableExtension","name","component","then","m","ApiProductsPage","mountPoint","MyApiKeysPage","ApiKeyApprovalPage","EntityKuadrantApiAccessCard","createComponentExtension","lazy","ApiAccessCard","EntityKuadrantApiKeyManagementTab","ApiKeyManagementTab","EntityKuadrantApiKeysContent","EntityKuadrantApiProductInfoContent","ApiProductInfoCard","ApiKeyDetailPage","EntityKuadrantApiApprovalTab","EntityApiApprovalTab","EntityKuadrantApiProductOpenApiAlert","ApiProductOpenApiAlert","ApiProductDetailPage"],"sourceRoot":""}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kuadrant/kuadrant-backstage-plugin-frontend",
|
|
3
|
-
"version": "0.0.2-dev-
|
|
3
|
+
"version": "0.0.2-dev-9be93a3",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -56,6 +56,7 @@
|
|
|
56
56
|
"@material-ui/core": "^4.9.13",
|
|
57
57
|
"@material-ui/icons": "^4.9.1",
|
|
58
58
|
"@material-ui/lab": "^4.0.0-alpha.61",
|
|
59
|
+
"async-retry": "^1.3.3",
|
|
59
60
|
"react-router-dom": "^6.0.0",
|
|
60
61
|
"react-use": "^17.2.4"
|
|
61
62
|
},
|
|
@@ -71,6 +72,7 @@
|
|
|
71
72
|
"@testing-library/jest-dom": "^6.0.0",
|
|
72
73
|
"@testing-library/react": "^16.3.0",
|
|
73
74
|
"@testing-library/user-event": "^14.0.0",
|
|
75
|
+
"@types/async-retry": "^1.4.9",
|
|
74
76
|
"msw": "^1.0.0",
|
|
75
77
|
"react": "^16.13.1 || ^17.0.0 || ^18.0.0",
|
|
76
78
|
"typescript": "^5.9.3"
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import React, { useState } from 'react';
|
|
2
|
-
import { Box, Tabs, Tab } from '@material-ui/core';
|
|
3
|
-
import { Page, Header, SupportButton, Content } from '@backstage/core-components';
|
|
4
|
-
import { PermissionGate } from '../PermissionGate/PermissionGate.esm.js';
|
|
5
|
-
import { MyApiKeysTable } from '../MyApiKeysTable/MyApiKeysTable.esm.js';
|
|
6
|
-
import { ApprovalQueueTable } from '../ApprovalQueueTable/ApprovalQueueTable.esm.js';
|
|
7
|
-
import { kuadrantApiKeyReadOwnPermission, kuadrantApiKeyApprovePermission } from '../../permissions.esm.js';
|
|
8
|
-
import { useKuadrantPermission } from '../../utils/permissions.esm.js';
|
|
9
|
-
|
|
10
|
-
const ApiKeysContent = () => {
|
|
11
|
-
const [selectedTab, setSelectedTab] = useState(0);
|
|
12
|
-
const {
|
|
13
|
-
allowed: canViewApprovalQueue,
|
|
14
|
-
loading: approvalQueuePermissionLoading
|
|
15
|
-
} = useKuadrantPermission(kuadrantApiKeyApprovePermission);
|
|
16
|
-
const handleTabChange = (_event, newValue) => {
|
|
17
|
-
setSelectedTab(newValue);
|
|
18
|
-
};
|
|
19
|
-
return /* @__PURE__ */ React.createElement(Page, { themeId: "tool" }, /* @__PURE__ */ React.createElement(Header, { title: "API Keys", subtitle: "API keys management for Kubernetes" }, /* @__PURE__ */ React.createElement(SupportButton, null, "Manage your API keys and access requests")), /* @__PURE__ */ React.createElement(Content, null, /* @__PURE__ */ React.createElement(Box, { mb: 2 }, /* @__PURE__ */ React.createElement(
|
|
20
|
-
Tabs,
|
|
21
|
-
{
|
|
22
|
-
value: selectedTab,
|
|
23
|
-
onChange: handleTabChange,
|
|
24
|
-
indicatorColor: "primary",
|
|
25
|
-
textColor: "primary"
|
|
26
|
-
},
|
|
27
|
-
/* @__PURE__ */ React.createElement(Tab, { label: "My API keys", "data-testid": "my-api-keys-tab" }),
|
|
28
|
-
!approvalQueuePermissionLoading && canViewApprovalQueue && /* @__PURE__ */ React.createElement(Tab, { label: "API keys approval", "data-testid": "api-keys-approval-tab" })
|
|
29
|
-
)), selectedTab === 0 && /* @__PURE__ */ React.createElement(MyApiKeysTable, null), selectedTab === 1 && canViewApprovalQueue && /* @__PURE__ */ React.createElement(ApprovalQueueTable, null)));
|
|
30
|
-
};
|
|
31
|
-
const ApiKeysPage = () => {
|
|
32
|
-
return /* @__PURE__ */ React.createElement(
|
|
33
|
-
PermissionGate,
|
|
34
|
-
{
|
|
35
|
-
permission: kuadrantApiKeyReadOwnPermission,
|
|
36
|
-
errorMessage: "you don't have permission to view the API Keys page"
|
|
37
|
-
},
|
|
38
|
-
/* @__PURE__ */ React.createElement(ApiKeysContent, null)
|
|
39
|
-
);
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
export { ApiKeysPage };
|
|
43
|
-
//# sourceMappingURL=ApiKeysPage.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ApiKeysPage.esm.js","sources":["../../../src/components/ApiKeysPage/ApiKeysPage.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { Box, Tabs, Tab } from '@material-ui/core';\nimport {\n Header,\n Page,\n Content,\n SupportButton,\n} from '@backstage/core-components';\nimport { PermissionGate } from '../PermissionGate';\nimport { MyApiKeysTable } from '../MyApiKeysTable';\nimport { ApprovalQueueTable } from '../ApprovalQueueTable';\nimport {\n kuadrantApiKeyReadOwnPermission,\n kuadrantApiKeyApprovePermission,\n} from '../../permissions';\nimport { useKuadrantPermission } from '../../utils/permissions';\n\nconst ApiKeysContent = () => {\n const [selectedTab, setSelectedTab] = useState(0);\n\n const {\n allowed: canViewApprovalQueue,\n loading: approvalQueuePermissionLoading,\n } = useKuadrantPermission(kuadrantApiKeyApprovePermission);\n\n const handleTabChange = (_event: React.ChangeEvent<{}>, newValue: number) => {\n setSelectedTab(newValue);\n };\n\n return (\n <Page themeId=\"tool\">\n <Header title=\"API Keys\" subtitle=\"API keys management for Kubernetes\">\n <SupportButton>Manage your API keys and access requests</SupportButton>\n </Header>\n <Content>\n <Box mb={2}>\n <Tabs\n value={selectedTab}\n onChange={handleTabChange}\n indicatorColor=\"primary\"\n textColor=\"primary\"\n >\n <Tab label=\"My API keys\" data-testid=\"my-api-keys-tab\" />\n {!approvalQueuePermissionLoading && canViewApprovalQueue && (\n <Tab label=\"API keys approval\" data-testid=\"api-keys-approval-tab\" />\n )}\n </Tabs>\n </Box>\n\n {selectedTab === 0 && <MyApiKeysTable />}\n {selectedTab === 1 && canViewApprovalQueue && <ApprovalQueueTable />}\n </Content>\n </Page>\n );\n};\n\nexport const ApiKeysPage = () => {\n return (\n <PermissionGate\n permission={kuadrantApiKeyReadOwnPermission}\n errorMessage=\"you don't have permission to view the API Keys page\"\n >\n <ApiKeysContent />\n </PermissionGate>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;AAiBA,MAAM,iBAAiB,MAAM;AAC3B,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,CAAC,CAAA;AAEhD,EAAM,MAAA;AAAA,IACJ,OAAS,EAAA,oBAAA;AAAA,IACT,OAAS,EAAA;AAAA,GACX,GAAI,sBAAsB,+BAA+B,CAAA;AAEzD,EAAM,MAAA,eAAA,GAAkB,CAAC,MAAA,EAA+B,QAAqB,KAAA;AAC3E,IAAA,cAAA,CAAe,QAAQ,CAAA;AAAA,GACzB;AAEA,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,QAAK,OAAQ,EAAA,MAAA,EAAA,sCACX,MAAO,EAAA,EAAA,KAAA,EAAM,YAAW,QAAS,EAAA,oCAAA,EAAA,sCAC/B,aAAc,EAAA,IAAA,EAAA,0CAAwC,CACzD,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,+BACE,KAAA,CAAA,aAAA,CAAA,GAAA,EAAA,EAAI,IAAI,CACP,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,KAAO,EAAA,WAAA;AAAA,MACP,QAAU,EAAA,eAAA;AAAA,MACV,cAAe,EAAA,SAAA;AAAA,MACf,SAAU,EAAA;AAAA,KAAA;AAAA,oBAET,KAAA,CAAA,aAAA,CAAA,GAAA,EAAA,EAAI,KAAM,EAAA,aAAA,EAAc,eAAY,iBAAkB,EAAA,CAAA;AAAA,IACtD,CAAC,kCAAkC,oBAClC,oBAAA,KAAA,CAAA,aAAA,CAAC,OAAI,KAAM,EAAA,mBAAA,EAAoB,eAAY,uBAAwB,EAAA;AAAA,GAGzE,CAAA,EAEC,WAAgB,KAAA,CAAA,oBAAM,KAAA,CAAA,aAAA,CAAA,cAAA,EAAA,IAAe,CACrC,EAAA,WAAA,KAAgB,CAAK,IAAA,oBAAA,oBAAyB,KAAA,CAAA,aAAA,CAAA,kBAAA,EAAA,IAAmB,CACpE,CACF,CAAA;AAEJ,CAAA;AAEO,MAAM,cAAc,MAAM;AAC/B,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACC,UAAY,EAAA,+BAAA;AAAA,MACZ,YAAa,EAAA;AAAA,KAAA;AAAA,wCAEZ,cAAe,EAAA,IAAA;AAAA,GAClB;AAEJ;;;;"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
__load_plugin_entry__("internal.plugin-kuadrant",(()=>{"use strict";var e,h,a,g,t,i,l,r,n,s,_,c,u,o,f,d,y,x,b,p,m,v={63198:(e,h,a)=>{var g={PluginRoot:()=>a.e(879).then(()=>()=>a(72627)),KuadrantPage:()=>a.e(879).then(()=>()=>a(72627)),EntityKuadrantApiAccessCard:()=>a.e(879).then(()=>()=>a(72627)),EntityKuadrantApiKeyManagementTab:()=>a.e(879).then(()=>()=>a(72627)),EntityKuadrantApiKeysContent:()=>a.e(879).then(()=>()=>a(72627)),EntityKuadrantApiProductInfoContent:()=>a.e(879).then(()=>()=>a(72627))},t=(e,h)=>(a.R=h,h=a.o(g,e)?g[e]():Promise.resolve().then(()=>{throw new Error('Module "'+e+'" does not exist in container.')}),a.R=void 0,h),i=(e,h)=>{if(a.S){var g="default",t=a.S[g];if(t&&t!==e)throw new Error("Container initialization failed as it has already been initialized with a different share scope");return a.S[g]=e,a.I(g,h)}};a.d(h,{get:()=>t,init:()=>i})}},k={};function P(e){var h=k[e];if(void 0!==h)return h.exports;var a=k[e]={id:e,loaded:!1,exports:{}};return v[e].call(a.exports,a,a.exports,P),a.loaded=!0,a.exports}return P.m=v,P.c=k,P.n=e=>{var h=e&&e.__esModule?()=>e.default:()=>e;return P.d(h,{a:h}),h},h=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,P.t=function(a,g){if(1&g&&(a=this(a)),8&g)return a;if("object"==typeof a&&a){if(4&g&&a.__esModule)return a;if(16&g&&"function"==typeof a.then)return a}var t=Object.create(null);P.r(t);var i={};e=e||[null,h({}),h([]),h(h)];for(var l=2&g&&a;("object"==typeof l||"function"==typeof l)&&!~e.indexOf(l);l=h(l))Object.getOwnPropertyNames(l).forEach(e=>i[e]=()=>a[e]);return i.default=()=>a,P.d(t,i),t},P.d=(e,h)=>{for(var a in h)P.o(h,a)&&!P.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:h[a]})},P.f={},P.e=e=>Promise.all(Object.keys(P.f).reduce((h,a)=>(P.f[a](e,h),h),[])),P.u=e=>"static/"+({51:"react-syntax-highlighter_languages_highlight_prolog",200:"react-syntax-highlighter_languages_highlight_mel",206:"react-syntax-highlighter_languages_highlight_gml",371:"react-syntax-highlighter_languages_highlight_excel",456:"react-syntax-highlighter_languages_highlight_roboconf",460:"react-syntax-highlighter_languages_highlight_avrasm",464:"react-syntax-highlighter_languages_highlight_shell",557:"react-syntax-highlighter_languages_highlight_oneC",579:"react-syntax-highlighter_languages_highlight_vbnet",634:"react-syntax-highlighter_languages_highlight_scilab",879:"exposed-PluginRoot",927:"react-syntax-highlighter_languages_highlight_javascript",946:"react-syntax-highlighter_languages_highlight_clojure",985:"react-syntax-highlighter_languages_highlight_monkey",1062:"react-syntax-highlighter_languages_highlight_nim",1084:"react-syntax-highlighter_languages_highlight_aspectj",1099:"react-syntax-highlighter_languages_highlight_ebnf",1173:"react-syntax-highlighter_languages_highlight_autohotkey",1177:"react-syntax-highlighter_languages_highlight_profile",1214:"react-syntax-highlighter_languages_highlight_properties",1276:"react-syntax-highlighter_languages_highlight_phpTemplate",1325:"react-syntax-highlighter_languages_highlight_actionscript",1352:"react-syntax-highlighter_languages_highlight_fortran",1362:"react-syntax-highlighter_languages_highlight_mathematica",1418:"react-syntax-highlighter_languages_highlight_pony",1441:"react-syntax-highlighter_languages_highlight_coq",1461:"react-syntax-highlighter_languages_highlight_livescript",1489:"react-syntax-highlighter_languages_highlight_reasonml",1496:"react-syntax-highlighter_languages_highlight_lua",1522:"react-syntax-highlighter_languages_highlight_dust",1679:"react-syntax-highlighter_languages_highlight_scheme",1694:"react-syntax-highlighter_languages_highlight_accesslog",1727:"react-syntax-highlighter_languages_highlight_oxygene",1750:"react-syntax-highlighter_languages_highlight_makefile",1828:"react-syntax-highlighter_languages_highlight_dockerfile",1895:"react-syntax-highlighter_languages_highlight_pythonRepl",1956:"react-syntax-highlighter_languages_highlight_puppet",1961:"react-syntax-highlighter_languages_highlight_stan",1972:"react-syntax-highlighter_languages_highlight_fsharp",2007:"react-syntax-highlighter_languages_highlight_css",2064:"react-syntax-highlighter_languages_highlight_vhdl",2108:"react-syntax-highlighter_languages_highlight_cLike",2180:"react-syntax-highlighter_languages_highlight_sqf",2234:"react-syntax-highlighter_languages_highlight_lisp",2267:"react-syntax-highlighter_languages_highlight_maxima",2346:"react-syntax-highlighter_languages_highlight_d",2362:"react-syntax-highlighter_languages_highlight_xquery",2378:"react-syntax-highlighter_languages_highlight_parser3",2383:"react-syntax-highlighter_languages_highlight_crmsh",2438:"react-syntax-highlighter_languages_highlight_haxe",2488:"react-syntax-highlighter_languages_highlight_verilog",2496:"react-syntax-highlighter_languages_highlight_erlangRepl",2512:"react-syntax-highlighter_languages_highlight_stylus",2516:"react-syntax-highlighter_languages_highlight_apache",2665:"react-syntax-highlighter_languages_highlight_powershell",2693:"react-syntax-highlighter_languages_highlight_tap",2727:"react-syntax-highlighter_languages_highlight_q",2743:"react-syntax-highlighter_languages_highlight_asciidoc",2762:"react-syntax-highlighter_languages_highlight_haskell",2795:"react-syntax-highlighter_languages_highlight_dns",2871:"react-syntax-highlighter_languages_highlight_typescript",2882:"react-syntax-highlighter_languages_highlight_sml",2979:"react-syntax-highlighter_languages_highlight_plaintext",2981:"react-syntax-highlighter_languages_highlight_ruleslanguage",2983:"react-syntax-highlighter_languages_highlight_golo",3146:"react-syntax-highlighter_languages_highlight_purebasic",3193:"react-syntax-highlighter_languages_highlight_xml",3299:"react-syntax-highlighter_languages_highlight_fix",3357:"react-syntax-highlighter_languages_highlight_x86asm",3384:"react-syntax-highlighter_languages_highlight_ini",3418:"react-syntax-highlighter_languages_highlight_ruby",3419:"react-syntax-highlighter_languages_highlight_nix",3487:"react-syntax-highlighter_languages_highlight_mipsasm",3500:"react-syntax-highlighter_languages_highlight_autoit",3540:"react-syntax-highlighter_languages_highlight_moonscript",3562:"react-syntax-highlighter_languages_highlight_gams",3580:"react-syntax-highlighter_languages_highlight_csp",3607:"react-syntax-highlighter_languages_highlight_abnf",3623:"react-syntax-highlighter_languages_highlight_yaml",3722:"react-syntax-highlighter_languages_highlight_latex",3736:"react-syntax-highlighter_languages_highlight_json",3811:"react-syntax-highlighter_languages_highlight_erb",3885:"react-syntax-highlighter_languages_highlight_stata",3923:"react-syntax-highlighter_languages_highlight_applescript",3988:"react-syntax-highlighter_languages_highlight_vala",4014:"react-syntax-highlighter_languages_highlight_scss",4075:"react-syntax-highlighter_languages_highlight_hsp",4110:"react-syntax-highlighter_languages_highlight_tp",4135:"react-syntax-highlighter_languages_highlight_mizar",4282:"react-syntax-highlighter_languages_highlight_livecodeserver",4300:"react-syntax-highlighter_languages_highlight_r",4342:"react-syntax-highlighter_languages_highlight_php",4383:"react-syntax-highlighter_languages_highlight_dsconfig",4436:"react-syntax-highlighter_languages_highlight_zephir",4446:"react-syntax-highlighter_languages_highlight_leaf",4493:"react-syntax-highlighter_languages_highlight_gauss",4575:"react-syntax-highlighter_languages_highlight_processing",4635:"react-syntax-highlighter_languages_highlight_jbossCli",4733:"react-syntax-highlighter_languages_highlight_llvm",4835:"react-syntax-highlighter_languages_highlight_cos",4931:"react-syntax-highlighter_languages_highlight_step21",4956:"react-syntax-highlighter_languages_highlight_angelscript",4971:"react-syntax-highlighter_languages_highlight_lsl",5034:"react-syntax-highlighter_languages_highlight_ada",5051:"react-syntax-highlighter_languages_highlight_coffeescript",5099:"react-syntax-highlighter_languages_highlight_nsis",5123:"react-syntax-highlighter_languages_highlight_erlang",5189:"react-syntax-highlighter_languages_highlight_dts",5251:"react-syntax-highlighter_languages_highlight_pgsql",5253:"react-syntax-highlighter_languages_highlight_clojureRepl",5286:"react-syntax-highlighter_languages_highlight_nginx",5446:"react-syntax-highlighter_languages_highlight_ocaml",5565:"react-syntax-highlighter_languages_highlight_kotlin",5613:"react-syntax-highlighter_languages_highlight_rib",5664:"react-syntax-highlighter_languages_highlight_dos",5773:"react-syntax-highlighter_languages_highlight_mojolicious",5813:"react-syntax-highlighter_languages_highlight_less",5819:"react-syntax-highlighter_languages_highlight_gradle",5868:"react-syntax-highlighter_languages_highlight_inform7",5900:"react-syntax-highlighter_languages_highlight_lasso",6057:"react-syntax-highlighter_languages_highlight_sqlMore",6152:"react-syntax-highlighter_languages_highlight_vbscriptHtml",6161:"react-syntax-highlighter_languages_highlight_clean",6177:"react-syntax-highlighter_languages_highlight_taggerscript",6195:"react-syntax-highlighter_languages_highlight_ldif",6228:"react-syntax-highlighter_languages_highlight_rust",6267:"react-syntax-highlighter_languages_highlight_swift",6354:"react-syntax-highlighter_languages_highlight_java",6501:"react-syntax-highlighter_languages_highlight_armasm",6512:"react-syntax-highlighter_languages_highlight_scala",6542:"react-syntax-highlighter_languages_highlight_vim",6555:"react-syntax-highlighter_languages_highlight_openscad",6573:"react-syntax-highlighter_languages_highlight_cpp",6780:"react-syntax-highlighter_languages_highlight_qml",6835:"react-syntax-highlighter_languages_highlight_brainfuck",6848:"react-syntax-highlighter_languages_highlight_crystal",6924:"react-syntax-highlighter_languages_highlight_isbl",6977:"react-syntax-highlighter_languages_highlight_rsl",6986:"react-syntax-highlighter_languages_highlight_capnproto",7048:"react-syntax-highlighter_languages_highlight_gherkin",7079:"react-syntax-highlighter_languages_highlight_diff",7131:"react-syntax-highlighter_languages_highlight_protobuf",7209:"react-syntax-highlighter_languages_highlight_perl",7247:"react-syntax-highlighter_languages_highlight_cmake",7254:"react-syntax-highlighter_languages_highlight_subunit",7351:"react-syntax-highlighter_languages_highlight_elixir",7401:"react-syntax-highlighter_languages_highlight_sas",7406:"react-syntax-highlighter_languages_highlight_sql",7439:"react-syntax-highlighter_languages_highlight_flix",7533:"react-syntax-highlighter_languages_highlight_awk",7572:"react-syntax-highlighter_languages_highlight_basic",7764:"react-syntax-highlighter_languages_highlight_go",7776:"react-syntax-highlighter_languages_highlight_haml",7794:"react-syntax-highlighter_languages_highlight_http",7818:"react-syntax-highlighter_languages_highlight_arduino",7879:"react-syntax-highlighter_languages_highlight_csharp",7934:"react-syntax-highlighter_languages_highlight_glsl",7959:"react-syntax-highlighter_languages_highlight_htmlbars",8001:"react-syntax-highlighter_languages_highlight_matlab",8030:"react-syntax-highlighter_languages_highlight_handlebars",8058:"react-syntax-highlighter_languages_highlight_n1ql",8078:"react-syntax-highlighter_languages_highlight_delphi",8138:"react-syntax-highlighter_languages_highlight_elm",8140:"react-syntax-highlighter_languages_highlight_pf",8216:"react-syntax-highlighter_languages_highlight_bnf",8217:"react-syntax-highlighter_languages_highlight_twig",8331:"react-syntax-highlighter_languages_highlight_thrift",8338:"react-syntax-highlighter_languages_highlight_objectivec",8549:"react-syntax-highlighter_languages_highlight_c",8595:"react-syntax-highlighter_languages_highlight_hy",8705:"react-syntax-highlighter_languages_highlight_nodeRepl",8725:"react-syntax-highlighter_languages_highlight_smalltalk",8727:"react-syntax-highlighter/lowlight-import",8753:"react-syntax-highlighter_languages_highlight_mercury",8755:"react-syntax-highlighter_languages_highlight_tcl",8763:"react-syntax-highlighter_languages_highlight_routeros",8833:"react-syntax-highlighter_languages_highlight_markdown",8874:"react-syntax-highlighter_languages_highlight_smali",8903:"react-syntax-highlighter_languages_highlight_axapta",8904:"react-syntax-highlighter_languages_highlight_python",8948:"react-syntax-highlighter_languages_highlight_groovy",9078:"react-syntax-highlighter_languages_highlight_irpf90",9118:"react-syntax-highlighter_languages_highlight_juliaRepl",9139:"react-syntax-highlighter_languages_highlight_django",9162:"react-syntax-highlighter_languages_highlight_ceylon",9175:"react-syntax-highlighter_languages_highlight_vbscript",9229:"react-syntax-highlighter_languages_highlight_julia",9265:"react-syntax-highlighter_languages_highlight_dart",9406:"react-syntax-highlighter_languages_highlight_cal",9612:"react-syntax-highlighter_languages_highlight_bash",9702:"react-syntax-highlighter_languages_highlight_gcode",9726:"react-syntax-highlighter_languages_highlight_xl",9882:"react-syntax-highlighter_languages_highlight_arcade"}[e]||e)+"."+{51:"be0fdf0c",200:"5251fe1a",206:"2347c999",327:"a9a99299",371:"2f5c76b9",441:"f708f1e0",456:"47518214",460:"6381890e",464:"9bbc16eb",501:"87de76da",557:"362a3b0a",579:"21c190ed",634:"bb9cc730",635:"e030b18a",879:"ed95fa78",927:"b0ad82d3",946:"e3fcc98c",985:"5f60f06d",1062:"17afaed1",1084:"35f221e8",1085:"d17e689a",1099:"a34b6944",1173:"614c5248",1177:"615fa721",1214:"60f97895",1276:"2bd36dc7",1325:"78db0238",1352:"38ec3d00",1362:"d8631b37",1418:"1961f69f",1441:"6b156852",1461:"3ece3068",1489:"a5a73a29",1496:"52f73c98",1522:"b30d0c38",1645:"db086648",1679:"508b5846",1694:"bd112f1a",1727:"ea742315",1750:"cad796c9",1828:"2c5fdf55",1895:"feb72aed",1956:"ee3f80da",1961:"17155e77",1972:"2ba37c00",2007:"2cc312ae",2064:"dea9db6c",2108:"f884fdc0",2180:"43421810",2233:"bf0c10d7",2234:"1cb2f675",2267:"f1f17544",2346:"bf4f2b44",2362:"353780d4",2378:"706a4bd6",2383:"58c4cb07",2438:"e2543cc2",2488:"e32adbeb",2496:"0d7f4890",2512:"cde06cf5",2516:"aa86d495",2628:"20156dc1",2665:"7bd31b3a",2693:"402e473f",2727:"989943de",2743:"4b40a3f9",2762:"bbd3c104",2795:"6d79126a",2821:"0829f14d",2822:"27a4ac5b",2871:"cf576f17",2882:"0e45c1cf",2946:"a35243f1",2952:"b3c7e41c",2967:"65c51af8",2979:"25f8d292",2981:"038504d0",2983:"eaa5e2bf",3007:"bffc9924",3144:"6f99ccee",3146:"08443005",3193:"ee14d6a4",3299:"5ee62733",3357:"217c56f0",3384:"d9d4ed7e",3418:"d84064e5",3419:"245f31b6",3487:"f5bc5b04",3500:"a06c1c62",3504:"1c2f2e54",3540:"443301b3",3562:"a45eb030",3580:"7fc6f9a3",3607:"bb6a8626",3623:"2aae489e",3650:"ee76eba9",3657:"882640ca",3722:"b4bb9102",3736:"d934b52b",3811:"4ac917b8",3885:"fe81a7fc",3923:"ddf703d6",3947:"7458971d",3954:"12dd8006",3984:"647ef00c",3988:"843d9bc4",4014:"bec19089",4026:"d652a7a1",4041:"29923ad9",4075:"5d714528",4093:"ee6f0452",4110:"0f4ff415",4135:"9b39cf3b",4282:"f624f22d",4300:"8540ccea",4342:"ade4c6c4",4382:"a7363415",4383:"c3457b50",4436:"fc94a148",4446:"92519810",4491:"83052809",4493:"cceeafb0",4570:"8b9f98d7",4575:"8d1f48c5",4611:"0d064cdf",4614:"23f2a85b",4635:"1ff533ef",4651:"c85cecc4",4682:"75f17114",4733:"f32d41e6",4835:"78d69dee",4931:"a431b2db",4935:"e14465ff",4956:"f9816c44",4971:"b6519e02",5010:"0cd6c959",5034:"b0d90871",5051:"3bc87b5b",5099:"4934a8e8",5123:"501777c7",5189:"8fd3703c",5203:"b654e8e0",5235:"2a59dc45",5251:"5b0d21b9",5253:"e6dbc3b4",5286:"630147e0",5446:"0e42541e",5453:"ecdee66d",5565:"c5eaa6f5",5613:"dc8afdf1",5664:"1ede6e37",5773:"0cf721ff",5813:"cc574d49",5819:"72fdf84d",5868:"78be038f",5900:"8d4054e7",6038:"63d1f832",6057:"d69b1825",6152:"42eb54af",6161:"97b48014",6177:"695a2547",6195:"74045e43",6228:"7e26e901",6267:"7d33a4a9",6354:"e04d1c07",6371:"d45f37cc",6501:"4bfb8996",6512:"a4629d0a",6542:"e82f126f",6555:"4a460eaf",6573:"ff6a8f78",6763:"d6cd937f",6780:"8f3a0af6",6800:"20f46859",6835:"31bde7c5",6840:"1653e6b0",6848:"3a36e63f",6872:"7ef4ed23",6924:"abe269c1",6977:"909f2a27",6986:"79dfc31f",7048:"e740620a",7076:"8745d395",7079:"a8373241",7131:"0cd375bc",7164:"5dc4bc72",7209:"ae8475a2",7236:"f3886d59",7247:"cb9028b5",7254:"c5ac3a0a",7351:"1e79c9b9",7367:"62c9669e",7401:"94075d6a",7406:"651dcc8d",7439:"972cc801",7533:"dfc9b0b0",7572:"ec232b8a",7764:"abc0a144",7776:"d698757b",7791:"ac1ac509",7794:"a55e168b",7818:"9b9ce313",7879:"ea98c6fb",7934:"bb5b0086",7959:"e57e3c89",8001:"114e44eb",8030:"75c0a89b",8058:"c54b2c4a",8078:"588e191d",8083:"4763f88b",8138:"8a488b19",8140:"5052a768",8172:"cbe1f2c4",8216:"84e0a497",8217:"5cb0fdfc",8331:"ecb04f2a",8338:"2d204375",8549:"b43ce116",8595:"c60db034",8705:"5b05cdf2",8725:"53da57ca",8727:"2bd53873",8753:"fa8fdac0",8755:"79af288c",8763:"c0bcd6ce",8799:"939d14f9",8833:"1489792c",8874:"4fa5afdd",8903:"80d14346",8904:"9e4100ae",8948:"ecd68b19",9078:"25afcc29",9118:"e3bfcde8",9139:"8fb85401",9162:"ab3b1c28",9175:"4703f4c5",9229:"f43a39d0",9265:"0a0b12af",9316:"d9f2fe18",9400:"df4a7fb5",9406:"781cc6c6",9612:"53f7c730",9655:"db0c82b2",9702:"378d3296",9710:"7ec34777",9726:"7cff3cbb",9738:"b037daf3",9882:"70910623"}[e]+".chunk.js",P.miniCssF=e=>"static/"+e+"."+e+".3597955d.css",P.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),P.o=(e,h)=>Object.prototype.hasOwnProperty.call(e,h),a={},g="internal.plugin-kuadrant:",P.l=(e,h,t,i)=>{if(a[e])a[e].push(h);else{var l,r;if(void 0!==t)for(var n=document.getElementsByTagName("script"),s=0;s<n.length;s++){var _=n[s];if(_.getAttribute("src")==e||_.getAttribute("data-webpack")==g+t){l=_;break}}l||(r=!0,(l=document.createElement("script")).charset="utf-8",l.timeout=120,P.nc&&l.setAttribute("nonce",P.nc),l.setAttribute("data-webpack",g+t),l.src=e),a[e]=[h];var c=(h,g)=>{l.onerror=l.onload=null,clearTimeout(u);var t=a[e];if(delete a[e],l.parentNode&&l.parentNode.removeChild(l),t&&t.forEach(e=>e(g)),h)return h(g)},u=setTimeout(c.bind(null,void 0,{type:"timeout",target:l}),12e4);l.onerror=c.bind(null,l.onerror),l.onload=c.bind(null,l.onload),r&&document.head.appendChild(l)}},P.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},P.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{P.S={};var e={},h={};P.I=(a,g)=>{g||(g=[]);var t=h[a];if(t||(t=h[a]={}),!(g.indexOf(t)>=0)){if(g.push(t),e[a])return e[a];P.o(P.S,a)||(P.S[a]={});var i=P.S[a],l="internal.plugin-kuadrant",r=(e,h,a,g)=>{var t=i[e]=i[e]||{},r=t[h];(!r||!r.loaded&&(!g!=!r.eager?g:l>r.from))&&(t[h]={get:a,from:l,eager:!!g})},n=[];return"default"===a&&(r("@backstage/core-plugin-api","1.11.0",()=>Promise.all([P.e(9655),P.e(5478),P.e(9634),P.e(5427),P.e(2233)]).then(()=>()=>P(4614))),r("@backstage/core-plugin-api","1.12.1",()=>Promise.all([P.e(9655),P.e(3504),P.e(5478),P.e(9634),P.e(5427),P.e(5501)]).then(()=>()=>P(23504))),r("@backstage/frontend-plugin-api","0.12.0",()=>Promise.all([P.e(9655),P.e(9316),P.e(4935),P.e(5478),P.e(9634),P.e(5427),P.e(1723)]).then(()=>()=>P(64935))),r("@backstage/frontend-plugin-api","0.13.3",()=>Promise.all([P.e(9655),P.e(9316),P.e(9738),P.e(5478),P.e(9634),P.e(5427),P.e(5501),P.e(1085)]).then(()=>()=>P(19738))),r("@backstage/version-bridge","1.0.11",()=>Promise.all([P.e(5478),P.e(2822)]).then(()=>()=>P(12822))),r("@emotion/cache","11.14.0",()=>P.e(7164).then(()=>()=>P(67164))),r("@emotion/react","11.14.0",()=>Promise.all([P.e(5478),P.e(6322),P.e(3657)]).then(()=>()=>P(53657))),r("@material-ui/core/styles","4.12.4",()=>Promise.all([P.e(9400),P.e(5478),P.e(1942),P.e(4491)]).then(()=>()=>P(64491))),r("@material-ui/styles","4.11.5",()=>Promise.all([P.e(4570),P.e(5478),P.e(3007)]).then(()=>()=>P(94570))),r("@mui/material","5.18.0",()=>Promise.all([P.e(3954),P.e(8083),P.e(5478),P.e(484),P.e(9096),P.e(4994)]).then(()=>()=>P(10464))),r("@mui/private-theming","5.17.1",()=>Promise.all([P.e(5478),P.e(1645)]).then(()=>()=>P(51645))),r("@mui/styled-engine","5.18.0",()=>Promise.all([P.e(2952),P.e(5478),P.e(6322),P.e(5277),P.e(635)]).then(()=>()=>P(92952))),r("@mui/system","5.18.0",()=>Promise.all([P.e(9710),P.e(3954),P.e(5478),P.e(9096),P.e(2464)]).then(()=>()=>P(29710))),r("react-dom","18.3.1",()=>Promise.all([P.e(3144),P.e(5478)]).then(()=>()=>P(43144))),r("react-router-dom","6.30.3",()=>Promise.all([P.e(501),P.e(5478),P.e(484),P.e(9829)]).then(()=>()=>P(62882))),r("react-router","6.30.3",()=>Promise.all([P.e(7367),P.e(5478)]).then(()=>()=>P(97367))),r("react","18.3.1",()=>P.e(4041).then(()=>()=>P(14041)))),e[a]=n.length?Promise.all(n).then(()=>e[a]=1):1}}})(),(()=>{var e;P.g.importScripts&&(e=P.g.location+"");var h=P.g.document;if(!e&&h&&(h.currentScript&&"SCRIPT"===h.currentScript.tagName.toUpperCase()&&(e=h.currentScript.src),!e)){var a=h.getElementsByTagName("script");if(a.length)for(var g=a.length-1;g>-1&&(!e||!/^http(s?):/.test(e));)e=a[g--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),P.p=e})(),t=e=>{var h=e=>e.split(".").map(e=>+e==e?+e:e),a=/^([^-+]+)?(?:-([^+]+))?(?:\+(.+))?$/.exec(e),g=a[1]?h(a[1]):[];return a[2]&&(g.length++,g.push.apply(g,h(a[2]))),a[3]&&(g.push([]),g.push.apply(g,h(a[3]))),g},i=(e,h)=>{e=t(e),h=t(h);for(var a=0;;){if(a>=e.length)return a<h.length&&"u"!=(typeof h[a])[0];var g=e[a],i=(typeof g)[0];if(a>=h.length)return"u"==i;var l=h[a],r=(typeof l)[0];if(i!=r)return"o"==i&&"n"==r||"s"==r||"u"==i;if("o"!=i&&"u"!=i&&g!=l)return g<l;a++}},l=e=>{var h=e[0],a="";if(1===e.length)return"*";if(h+.5){a+=0==h?">=":-1==h?"<":1==h?"^":2==h?"~":h>0?"=":"!=";for(var g=1,t=1;t<e.length;t++)g--,a+="u"==(typeof(r=e[t]))[0]?"-":(g>0?".":"")+(g=2,r);return a}var i=[];for(t=1;t<e.length;t++){var r=e[t];i.push(0===r?"not("+n()+")":1===r?"("+n()+" || "+n()+")":2===r?i.pop()+" "+i.pop():l(r))}return n();function n(){return i.pop().replace(/^\((.+)\)$/,"$1")}},r=(e,h)=>{if(0 in e){h=t(h);var a=e[0],g=a<0;g&&(a=-a-1);for(var i=0,l=1,n=!0;;l++,i++){var s,_,c=l<e.length?(typeof e[l])[0]:"";if(i>=h.length||"o"==(_=(typeof(s=h[i]))[0]))return!n||("u"==c?l>a&&!g:""==c!=g);if("u"==_){if(!n||"u"!=c)return!1}else if(n)if(c==_)if(l<=a){if(s!=e[l])return!1}else{if(g?s>e[l]:s<e[l])return!1;s!=e[l]&&(n=!1)}else if("s"!=c&&"n"!=c){if(g||l<=a)return!1;n=!1,l--}else{if(l<=a||_<c!=g)return!1;n=!1}else"s"!=c&&"n"!=c&&(n=!1,l--)}}var u=[],o=u.pop.bind(u);for(i=1;i<e.length;i++){var f=e[i];u.push(1==f?o()|o():2==f?o()&o():f?r(f,h):!o())}return!!o()},n=(e,h)=>e&&P.o(e,h),s=e=>(e.loaded=1,e.get()),_=e=>Object.keys(e).reduce((h,a)=>(e[a].eager&&(h[a]=e[a]),h),{}),c=(e,h,a)=>{var g=a?_(e[h]):e[h];return Object.keys(g).reduce((e,h)=>!e||!g[e].loaded&&i(e,h)?h:e,0)},u=(e,h,a,g)=>"Unsatisfied version "+a+" from "+(a&&e[h][a].from)+" of shared singleton module "+h+" (required "+l(g)+")",o=e=>{throw new Error(e)},f=e=>{"undefined"!=typeof console&&console.warn&&console.warn(e)},d=(e,h,a)=>a?a():((e,h)=>o("Shared module "+h+" doesn't exist in shared scope "+e))(e,h),y=(e=>function(h,a,g,t,i){var l=P.I(h);return l&&l.then&&!g?l.then(e.bind(e,h,P.S[h],a,!1,t,i)):e(h,P.S[h],a,g,t,i)})((e,h,a,g,t,i)=>{if(!n(h,a))return d(e,a,i);var l=c(h,a,g);return r(t,l)||f(u(h,a,l,t)),s(h[a][l])}),x={},b={22097:()=>y("default","@backstage/core-plugin-api",!1,[0],()=>Promise.all([P.e(9655),P.e(3504),P.e(5478),P.e(9634),P.e(5427),P.e(5501)]).then(()=>()=>P(23504))),95478:()=>y("default","react",!1,[0],()=>P.e(4041).then(()=>()=>P(14041))),49634:()=>y("default","react-router-dom",!1,[0],()=>Promise.all([P.e(501),P.e(484),P.e(9829)]).then(()=>()=>P(62882))),15427:()=>y("default","@backstage/version-bridge",!1,[0],()=>P.e(441).then(()=>()=>P(12822))),75501:()=>y("default","@backstage/frontend-plugin-api",!1,[0],()=>Promise.all([P.e(9655),P.e(9316),P.e(9738),P.e(9634),P.e(5427)]).then(()=>()=>P(19738))),51723:()=>y("default","@backstage/core-plugin-api",!1,[0],()=>P.e(4614).then(()=>()=>P(4614))),76322:()=>y("default","@emotion/cache",!1,[0],()=>P.e(7164).then(()=>()=>P(67164))),11942:()=>y("default","@material-ui/styles",!1,[0],()=>P.e(4570).then(()=>()=>P(94570))),40484:()=>y("default","react-dom",!1,[0],()=>P.e(3144).then(()=>()=>P(43144))),79096:()=>y("default","@mui/styled-engine",!1,[0],()=>Promise.all([P.e(2952),P.e(6322),P.e(5277)]).then(()=>()=>P(92952))),54994:()=>y("default","@mui/system",!1,[0],()=>Promise.all([P.e(9710),P.e(2464)]).then(()=>()=>P(29710))),5277:()=>y("default","@emotion/react",!1,[0],()=>P.e(6038).then(()=>()=>P(53657))),22464:()=>y("default","@mui/private-theming",!1,[0],()=>P.e(4026).then(()=>()=>P(51645))),9829:()=>y("default","react-router",!1,[0],()=>P.e(7367).then(()=>()=>P(97367))),37976:()=>y("default","@material-ui/core/styles",!1,[0],()=>P.e(6872).then(()=>()=>P(64491)))},p={484:[40484],879:[22097],1723:[51723],1942:[11942],2464:[22464],4994:[54994],5277:[5277],5427:[15427],5478:[95478],5501:[75501],6322:[76322],7976:[37976],9096:[79096],9634:[49634],9829:[9829]},m={},P.f.consumes=(e,h)=>{P.o(p,e)&&p[e].forEach(e=>{if(P.o(x,e))return h.push(x[e]);if(!m[e]){var a=h=>{x[e]=0,P.m[e]=a=>{delete P.c[e],a.exports=h()}};m[e]=!0;var g=h=>{delete x[e],P.m[e]=a=>{throw delete P.c[e],h}};try{var t=b[e]();t.then?h.push(x[e]=t.then(a).catch(g)):a(t)}catch(e){g(e)}}})},(()=>{if("undefined"!=typeof document){var e={2310:0};P.f.miniCss=(h,a)=>{e[h]?a.push(e[h]):0!==e[h]&&{4093:1}[h]&&a.push(e[h]=(e=>new Promise((h,a)=>{var g=P.miniCssF(e),t=P.p+g;if(((e,h)=>{for(var a=document.getElementsByTagName("link"),g=0;g<a.length;g++){var t=(l=a[g]).getAttribute("data-href")||l.getAttribute("href");if("stylesheet"===l.rel&&(t===e||t===h))return l}var i=document.getElementsByTagName("style");for(g=0;g<i.length;g++){var l;if((t=(l=i[g]).getAttribute("data-href"))===e||t===h)return l}})(g,t))return h();((e,h,a,g,t)=>{var i=document.createElement("link");i.rel="stylesheet",i.type="text/css",i.onerror=i.onload=a=>{if(i.onerror=i.onload=null,"load"===a.type)g();else{var l=a&&a.type,r=a&&a.target&&a.target.href||h,n=new Error("Loading CSS chunk "+e+" failed.\n("+l+": "+r+")");n.name="ChunkLoadError",n.code="CSS_CHUNK_LOAD_FAILED",n.type=l,n.request=r,i.parentNode&&i.parentNode.removeChild(i),t(n)}},i.href=h,function(e){const h=document.head,a=h.querySelector("style[data-jss]");a?h.insertBefore(e,a):h.appendChild(e)}(i)})(e,t,0,h,a)}))(h).then(()=>{e[h]=0},a=>{throw delete e[h],a}))}}})(),(()=>{var e={2310:0};P.f.j=(h,a)=>{var g=P.o(e,h)?e[h]:void 0;if(0!==g)if(g)a.push(g[2]);else if(/^(5(277|427|478|501)|9(096|634|829)|(246|48|499)4|1723|1942|6322|7976)$/.test(h))e[h]=0;else{var t=new Promise((a,t)=>g=e[h]=[a,t]);a.push(g[2]=t);var i=P.p+P.u(h),l=new Error;P.l(i,a=>{if(P.o(e,h)&&(0!==(g=e[h])&&(e[h]=void 0),g)){var t=a&&("load"===a.type?"missing":a.type),i=a&&a.target&&a.target.src;l.message="Loading chunk "+h+" failed.\n("+t+": "+i+")",l.name="ChunkLoadError",l.type=t,l.request=i,g[1](l)}},"chunk-"+h,h)}};var h=(h,a)=>{var g,t,[i,l,r]=a,n=0;if(i.some(h=>0!==e[h])){for(g in l)P.o(l,g)&&(P.m[g]=l[g]);r&&r(P)}for(h&&h(a);n<i.length;n++)t=i[n],P.o(e,t)&&e[t]&&e[t][0](),e[t]=0},a=self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[];a.forEach(h.bind(null,0)),a.push=h.bind(null,a.push.bind(a))})(),P(63198)})());
|
|
2
|
-
//# sourceMappingURL=internal.plugin-kuadrant.114cbbe1d3ddb939d776.js.map
|