@kuadrant/kuadrant-backstage-plugin-frontend 0.2.1 → 0.3.0-aaa46b4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. package/dist/api.esm.js +40 -2
  2. package/dist/api.esm.js.map +1 -1
  3. package/dist/components/ApiAccessCard/ApiAccessCard.esm.js +20 -85
  4. package/dist/components/ApiAccessCard/ApiAccessCard.esm.js.map +1 -1
  5. package/dist/components/ApiKeyApprovalPage/ApiKeyApprovalPageWithPermissions.esm.js +18 -0
  6. package/dist/components/ApiKeyApprovalPage/ApiKeyApprovalPageWithPermissions.esm.js.map +1 -0
  7. package/dist/components/ApiKeyApprovalPage/index.esm.js +1 -0
  8. package/dist/components/ApiKeyApprovalPage/index.esm.js.map +1 -1
  9. package/dist/components/ApiKeyDetailPage/ApiKeyDetailPage.esm.js +19 -60
  10. package/dist/components/ApiKeyDetailPage/ApiKeyDetailPage.esm.js.map +1 -1
  11. package/dist/components/ApiKeyManagementTab/ApiKeyManagementTab.esm.js +45 -110
  12. package/dist/components/ApiKeyManagementTab/ApiKeyManagementTab.esm.js.map +1 -1
  13. package/dist/components/ApiProductInfoCard/ApiProductInfoCard.esm.js +3 -2
  14. package/dist/components/ApiProductInfoCard/ApiProductInfoCard.esm.js.map +1 -1
  15. package/dist/components/ApprovalQueueTable/ApprovalQueueTable.esm.js +16 -15
  16. package/dist/components/ApprovalQueueTable/ApprovalQueueTable.esm.js.map +1 -1
  17. package/dist/components/EditAPIProductDialog/EditAPIProductDialog.esm.js +2 -3
  18. package/dist/components/EditAPIProductDialog/EditAPIProductDialog.esm.js.map +1 -1
  19. package/dist/components/KuadrantPage/ApiProductsPage.esm.js +5 -18
  20. package/dist/components/KuadrantPage/ApiProductsPage.esm.js.map +1 -1
  21. package/dist/components/MyApiKeysTable/MyApiKeysTable.esm.js +28 -138
  22. package/dist/components/MyApiKeysTable/MyApiKeysTable.esm.js.map +1 -1
  23. package/dist/components/PermissionGate/PermissionGate.esm.js +2 -2
  24. package/dist/components/PermissionGate/PermissionGate.esm.js.map +1 -1
  25. package/dist/components/RequestAccessDialog/RequestAccessDialog.esm.js +32 -18
  26. package/dist/components/RequestAccessDialog/RequestAccessDialog.esm.js.map +1 -1
  27. package/dist/components/SimpleRequestAccessDialog/SimpleRequestAccessDialog.esm.js +13 -2
  28. package/dist/components/SimpleRequestAccessDialog/SimpleRequestAccessDialog.esm.js.map +1 -1
  29. package/dist/index.d.ts +47 -6
  30. package/dist/index.esm.js +1 -1
  31. package/dist/plugin.esm.js +2 -10
  32. package/dist/plugin.esm.js.map +1 -1
  33. package/dist/utils/apikeys.esm.js +21 -0
  34. package/dist/utils/apikeys.esm.js.map +1 -0
  35. package/dist/utils/styles.esm.js +5 -2
  36. package/dist/utils/styles.esm.js.map +1 -1
  37. package/dist-scalprum/internal.plugin-kuadrant.7f1de85661b1b848af15.js +2 -0
  38. package/dist-scalprum/internal.plugin-kuadrant.7f1de85661b1b848af15.js.map +1 -0
  39. package/dist-scalprum/plugin-manifest.json +3 -3
  40. package/dist-scalprum/static/1340.7c4f4722.chunk.js +3 -0
  41. package/dist-scalprum/static/1340.7c4f4722.chunk.js.map +1 -0
  42. package/dist-scalprum/static/1719.52ca7daf.chunk.js +2 -0
  43. package/dist-scalprum/static/1719.52ca7daf.chunk.js.map +1 -0
  44. package/dist-scalprum/static/{1881.56cde36b.chunk.js → 1931.f6a5edbb.chunk.js} +2 -2
  45. package/dist-scalprum/static/1931.f6a5edbb.chunk.js.map +1 -0
  46. package/dist-scalprum/static/20.b3a37d1d.chunk.js +3 -0
  47. package/dist-scalprum/static/20.b3a37d1d.chunk.js.map +1 -0
  48. package/dist-scalprum/static/2251.08f3db99.chunk.js +2 -0
  49. package/dist-scalprum/static/2251.08f3db99.chunk.js.map +1 -0
  50. package/dist-scalprum/static/2769.e09b0ab0.chunk.js +2 -0
  51. package/dist-scalprum/static/2769.e09b0ab0.chunk.js.map +1 -0
  52. package/dist-scalprum/static/2821.1ac360ec.chunk.js +2 -0
  53. package/dist-scalprum/static/2821.1ac360ec.chunk.js.map +1 -0
  54. package/dist-scalprum/static/2967.004a950e.chunk.js +2 -0
  55. package/dist-scalprum/static/2967.004a950e.chunk.js.map +1 -0
  56. package/dist-scalprum/static/327.74ecd572.chunk.js +2 -0
  57. package/dist-scalprum/static/327.74ecd572.chunk.js.map +1 -0
  58. package/dist-scalprum/static/3658.104704cc.chunk.js +2 -0
  59. package/dist-scalprum/static/3658.104704cc.chunk.js.map +1 -0
  60. package/dist-scalprum/static/3917.888fba36.chunk.js +2 -0
  61. package/dist-scalprum/static/3917.888fba36.chunk.js.map +1 -0
  62. package/dist-scalprum/static/3947.f5320e89.chunk.js +2 -0
  63. package/dist-scalprum/static/3947.f5320e89.chunk.js.map +1 -0
  64. package/dist-scalprum/static/438.4335b833.chunk.js +2 -0
  65. package/dist-scalprum/static/438.4335b833.chunk.js.map +1 -0
  66. package/dist-scalprum/static/4908.4f21d453.chunk.js +2 -0
  67. package/dist-scalprum/static/4908.4f21d453.chunk.js.map +1 -0
  68. package/dist-scalprum/static/5197.53535ff4.chunk.js +2 -0
  69. package/dist-scalprum/static/5197.53535ff4.chunk.js.map +1 -0
  70. package/dist-scalprum/static/5289.6c803140.chunk.js +2 -0
  71. package/dist-scalprum/static/5289.6c803140.chunk.js.map +1 -0
  72. package/dist-scalprum/static/5943.4e1dedc5.chunk.js +2 -0
  73. package/dist-scalprum/static/5943.4e1dedc5.chunk.js.map +1 -0
  74. package/dist-scalprum/static/6311.da1849d1.chunk.js +2 -0
  75. package/dist-scalprum/static/6311.da1849d1.chunk.js.map +1 -0
  76. package/dist-scalprum/static/6371.02375475.chunk.js +3 -0
  77. package/dist-scalprum/static/6371.02375475.chunk.js.map +1 -0
  78. package/dist-scalprum/static/6837.6252b97a.chunk.js +2 -0
  79. package/dist-scalprum/static/6837.6252b97a.chunk.js.map +1 -0
  80. package/dist-scalprum/static/7270.8ee9d452.chunk.js +2 -0
  81. package/dist-scalprum/static/7270.8ee9d452.chunk.js.map +1 -0
  82. package/dist-scalprum/static/980.744a4d36.chunk.js +2 -0
  83. package/dist-scalprum/static/980.744a4d36.chunk.js.map +1 -0
  84. package/dist-scalprum/static/exposed-KuadrantPage.f123b200.chunk.js +2 -0
  85. package/dist-scalprum/static/exposed-KuadrantPage.f123b200.chunk.js.map +1 -0
  86. package/dist-scalprum/static/exposed-PluginRoot.3a5f9157.chunk.js +2 -0
  87. package/dist-scalprum/static/exposed-PluginRoot.3a5f9157.chunk.js.map +1 -0
  88. package/package.json +1 -1
  89. package/dist/components/EntityApiApprovalTab/EntityApiApprovalTab.esm.js +0 -265
  90. package/dist/components/EntityApiApprovalTab/EntityApiApprovalTab.esm.js.map +0 -1
  91. package/dist/components/EntityApiApprovalTab/index.esm.js +0 -2
  92. package/dist/components/EntityApiApprovalTab/index.esm.js.map +0 -1
  93. package/dist-scalprum/internal.plugin-kuadrant.c4fb9c2347d3ad03a5d0.js +0 -2
  94. package/dist-scalprum/internal.plugin-kuadrant.c4fb9c2347d3ad03a5d0.js.map +0 -1
  95. package/dist-scalprum/static/1584.1e45e570.chunk.js +0 -3
  96. package/dist-scalprum/static/1584.1e45e570.chunk.js.map +0 -1
  97. package/dist-scalprum/static/1719.246c020d.chunk.js +0 -2
  98. package/dist-scalprum/static/1719.246c020d.chunk.js.map +0 -1
  99. package/dist-scalprum/static/1881.56cde36b.chunk.js.map +0 -1
  100. package/dist-scalprum/static/286.ee43f560.chunk.js +0 -2
  101. package/dist-scalprum/static/286.ee43f560.chunk.js.map +0 -1
  102. package/dist-scalprum/static/2967.0c2ef90e.chunk.js +0 -2
  103. package/dist-scalprum/static/2967.0c2ef90e.chunk.js.map +0 -1
  104. package/dist-scalprum/static/3581.ebe5968a.chunk.js +0 -2
  105. package/dist-scalprum/static/3581.ebe5968a.chunk.js.map +0 -1
  106. package/dist-scalprum/static/369.2374941c.chunk.js +0 -2
  107. package/dist-scalprum/static/369.2374941c.chunk.js.map +0 -1
  108. package/dist-scalprum/static/3947.4f4aa8c2.chunk.js +0 -2
  109. package/dist-scalprum/static/3947.4f4aa8c2.chunk.js.map +0 -1
  110. package/dist-scalprum/static/3976.e8a8fda2.chunk.js +0 -2
  111. package/dist-scalprum/static/3976.e8a8fda2.chunk.js.map +0 -1
  112. package/dist-scalprum/static/4434.f92f6ba4.chunk.js +0 -2
  113. package/dist-scalprum/static/4434.f92f6ba4.chunk.js.map +0 -1
  114. package/dist-scalprum/static/4908.196a4425.chunk.js +0 -2
  115. package/dist-scalprum/static/4908.196a4425.chunk.js.map +0 -1
  116. package/dist-scalprum/static/512.d592d164.chunk.js +0 -2
  117. package/dist-scalprum/static/512.d592d164.chunk.js.map +0 -1
  118. package/dist-scalprum/static/5289.55069930.chunk.js +0 -2
  119. package/dist-scalprum/static/5289.55069930.chunk.js.map +0 -1
  120. package/dist-scalprum/static/5605.430f697e.chunk.js +0 -2
  121. package/dist-scalprum/static/5605.430f697e.chunk.js.map +0 -1
  122. package/dist-scalprum/static/5978.bf347a09.chunk.js +0 -2
  123. package/dist-scalprum/static/5978.bf347a09.chunk.js.map +0 -1
  124. package/dist-scalprum/static/6371.7b57ac27.chunk.js +0 -3
  125. package/dist-scalprum/static/6371.7b57ac27.chunk.js.map +0 -1
  126. package/dist-scalprum/static/6426.4c18bab5.chunk.js +0 -2
  127. package/dist-scalprum/static/6426.4c18bab5.chunk.js.map +0 -1
  128. package/dist-scalprum/static/6777.a2b77ec5.chunk.js +0 -2
  129. package/dist-scalprum/static/6777.a2b77ec5.chunk.js.map +0 -1
  130. package/dist-scalprum/static/6800.a45da2f4.chunk.js +0 -2
  131. package/dist-scalprum/static/6800.a45da2f4.chunk.js.map +0 -1
  132. package/dist-scalprum/static/7005.8190ad95.chunk.js +0 -2
  133. package/dist-scalprum/static/7005.8190ad95.chunk.js.map +0 -1
  134. package/dist-scalprum/static/7057.fcd688c7.chunk.js +0 -2
  135. package/dist-scalprum/static/7057.fcd688c7.chunk.js.map +0 -1
  136. package/dist-scalprum/static/7270.d52407cd.chunk.js +0 -2
  137. package/dist-scalprum/static/7270.d52407cd.chunk.js.map +0 -1
  138. package/dist-scalprum/static/7717.6f5b9dd7.chunk.js +0 -3
  139. package/dist-scalprum/static/7717.6f5b9dd7.chunk.js.map +0 -1
  140. package/dist-scalprum/static/9079.2ddaea57.chunk.js +0 -2
  141. package/dist-scalprum/static/9079.2ddaea57.chunk.js.map +0 -1
  142. package/dist-scalprum/static/9239.1acfe112.chunk.js +0 -2
  143. package/dist-scalprum/static/9239.1acfe112.chunk.js.map +0 -1
  144. package/dist-scalprum/static/9625.b0c6610a.chunk.js +0 -2
  145. package/dist-scalprum/static/9625.b0c6610a.chunk.js.map +0 -1
  146. package/dist-scalprum/static/exposed-KuadrantPage.5ae00605.chunk.js +0 -2
  147. package/dist-scalprum/static/exposed-KuadrantPage.5ae00605.chunk.js.map +0 -1
  148. package/dist-scalprum/static/exposed-PluginRoot.949381c2.chunk.js +0 -2
  149. package/dist-scalprum/static/exposed-PluginRoot.949381c2.chunk.js.map +0 -1
  150. /package/dist-scalprum/static/{1584.1e45e570.chunk.js.LICENSE.txt → 1340.7c4f4722.chunk.js.LICENSE.txt} +0 -0
  151. /package/dist-scalprum/static/{7717.6f5b9dd7.chunk.js.LICENSE.txt → 20.b3a37d1d.chunk.js.LICENSE.txt} +0 -0
  152. /package/dist-scalprum/static/{6371.7b57ac27.chunk.js.LICENSE.txt → 6371.02375475.chunk.js.LICENSE.txt} +0 -0
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[2251],{14933:(e,n,t)=>{t.d(n,{c:()=>j});var r=t(31085),a=t(95478),s=t(76891),i=t(61477),o=t(46805),l=t(10394),d=t(72501),c=t(95061),p=t(48543),u=t(81215),h=t(26343),m=t(16249),y=t(93453),g=t(64947),A=t(78467),v=t(39053),x=t(22097),f=t(70980);const j=({open:e,onClose:n,onSuccess:t,apiProductName:j,namespace:b,userEmail:w,plans:k})=>{const $=(0,x.useApi)(f.s),C=(0,x.useApi)(x.alertApiRef),[P,S]=(0,a.useState)(""),[q,T]=(0,a.useState)(""),[R,E]=(0,a.useState)(!1),[I,z]=(0,a.useState)(null),B=()=>{S(""),T(""),z(null),n()};return(0,r.jsxs)(s.A,{open:e,onClose:B,maxWidth:"sm",fullWidth:!0,children:[(0,r.jsx)(i.A,{children:"Request API Access"}),(0,r.jsxs)(o.A,{children:[(0,r.jsxs)(l.A,{mb:2,p:1.5,bgcolor:"info.light",borderRadius:1,display:"flex",alignItems:"flex-start",style:{gap:8},children:[(0,r.jsx)(v.A,{color:"primary",fontSize:"small",style:{marginTop:2}}),(0,r.jsx)(d.A,{variant:"body2",children:"Your request will be reviewed by an API owner before access is granted."})]}),I&&(0,r.jsx)(l.A,{mb:2,p:2,bgcolor:"error.main",color:"error.contrastText",borderRadius:1,children:(0,r.jsx)(d.A,{variant:"body2",children:I})}),(0,r.jsxs)(c.A,{fullWidth:!0,margin:"normal",disabled:R,"data-testid":"tier-select-form",children:[(0,r.jsx)(p.A,{id:"tier-select-label",children:"Select Tier"}),(0,r.jsx)(u.A,{labelId:"tier-select-label","data-testid":"tier-select",value:P,onChange:e=>S(e.target.value),disabled:R,children:k.map(e=>{const n=Object.entries(e.limits||{}).map(([e,n])=>`${n} per ${e}`).join(", ");return(0,r.jsxs)(h.A,{value:e.tier,"data-testid":`tier-option-${e.tier}`,children:[e.tier," ",n?`(${n})`:""]},e.tier)})})]}),(0,r.jsx)(m.A,{label:"Use Case (optional)",placeholder:"Describe how you plan to use this API",multiline:!0,rows:3,fullWidth:!0,margin:"normal",value:q,onChange:e=>T(e.target.value),helperText:"Explain your intended use of this API for admin review",disabled:R})]}),(0,r.jsxs)(y.A,{children:[(0,r.jsx)(g.A,{onClick:B,disabled:R,children:"Cancel"}),(0,r.jsx)(g.A,{onClick:async()=>{if(P){E(!0),z(null);try{const e=Math.random().toString(36).substring(2,10),n=`${j}-${e}-secret`.toLowerCase().replace(/[^a-z0-9-]/g,"-"),r=crypto.randomUUID().replace(/-/g,"");await $.createSecret(n,r);try{await $.createRequest({apiProductName:j,namespace:b,planTier:P,useCase:q.trim()||"",userEmail:w,secretName:n}),C.post({message:"Request submitted successfully. Pending API owner approval.",severity:"info",display:"transient"}),S(""),T(""),t()}catch(e){try{await $.deleteSecret(n)}catch(e){console.warn("Failed to cleanup orphaned secret:",e)}throw e}}catch(e){const n=e instanceof Error?e.message:"unknown error occurred";C.post({message:`Failed to create request: ${n}`,severity:"error",display:"transient"}),z(n)}finally{E(!1)}}},color:"primary",variant:"contained",disabled:!P||R,startIcon:R?(0,r.jsx)(A.A,{size:16,color:"inherit"}):void 0,children:R?"Submitting...":"Submit Request"})]})]})}},16325:(e,n,t)=>{function r(e){return e&&0!==e.length?e.find(e=>"Approved"===e.type&&"True"===e.status)?"Approved":e.find(e=>"Denied"===e.type&&"True"===e.status)?"Denied":e.find(e=>"Failed"===e.type&&"True"===e.status)?"Failed":"Pending":"Pending"}t.d(n,{v:()=>r})},63221:(e,n,t)=>{t.d(n,{K:()=>g});var r=t(31085),a=t(95478),s=t(76891),i=t(61477),o=t(10394),l=t(46805),d=t(59461),c=t(72501),p=t(16249),u=t(93453),h=t(64947),m=t(78467),y=t(77225);const g=({open:e,title:n,description:t,confirmText:g,severity:A="normal",deleting:v=!1,onConfirm:x,onCancel:f})=>{const[j,b]=(0,a.useState)("");(0,a.useEffect)(()=>{e||b("")},[e]);const w="high"===A&&g,k=!w||j===g;return(0,r.jsxs)(s.A,{open:e,onClose:v?void 0:f,maxWidth:"sm",fullWidth:!0,children:[(0,r.jsxs)(i.A,{children:["high"===A&&(0,r.jsxs)(o.A,{display:"flex",alignItems:"center",style:{gap:8},children:[(0,r.jsx)(y.A,{color:"error"}),(0,r.jsx)("span",{children:n})]}),"high"!==A&&n]}),(0,r.jsxs)(l.A,{children:[(0,r.jsx)(d.A,{style:{whiteSpace:"pre-line"},children:t}),w&&(0,r.jsxs)(o.A,{mt:2,children:[(0,r.jsxs)(c.A,{variant:"body2",color:"textSecondary",gutterBottom:!0,children:["Type ",(0,r.jsx)("strong",{children:g})," to confirm:"]}),(0,r.jsx)(p.A,{fullWidth:!0,variant:"outlined",size:"small",value:j,onChange:e=>b(e.target.value),disabled:v,autoFocus:!0,placeholder:g})]})]}),(0,r.jsxs)(u.A,{children:[(0,r.jsx)(h.A,{onClick:f,disabled:v,children:"Cancel"}),(0,r.jsx)(h.A,{onClick:()=>{k&&x()},color:"secondary",variant:"contained",disabled:v||!k,startIcon:v?(0,r.jsx)(m.A,{size:16,color:"inherit"}):void 0,children:v?"Deleting...":"Delete"})]})]})}},82251:(e,n,t)=>{t.d(n,{_:()=>O});var r=t(31085),a=t(95478),s=t(35015),i=t(82300),o=t(42367),l=t(25010),d=t(10394),c=t(72501),p=t(31653),u=t(38605),h=t(67720),m=t(71677),y=t(29365),g=t(78467),A=t(42899),v=t(64947),x=t(37757),f=t(26343),j=t(4387),b=t(22097),w=t(70980),k=t(25467),$=t(84692),C=t(32269),P=t(61524),S=t(93246),q=t(92399),T=t(18466),R=t(71407),E=t(99594),I=t(34955),z=t(46205),B=t(16325),D=t(76891),K=t(61477),_=t(46805),W=t(95061),N=t(48543),G=t(81215),H=t(16249),U=t(93453);const F=({open:e,onClose:n,onSuccess:t,request:s,availablePlans:i})=>{const o=(0,b.useApi)(w.s),[l,p]=(0,a.useState)(""),[u,h]=(0,a.useState)(""),[m,y]=(0,a.useState)(!1),[A,x]=(0,a.useState)("");(0,a.useEffect)(()=>{e&&s&&(p(s.spec.planTier||""),h(s.spec.useCase||""),x(""))},[e,s]);const j=()=>{m||(x(""),n())};return(0,r.jsxs)(D.A,{open:e,onClose:j,maxWidth:"sm",fullWidth:!0,children:[(0,r.jsx)(K.A,{children:"Edit API Key"}),(0,r.jsxs)(_.A,{children:[A&&(0,r.jsx)(d.A,{mb:2,p:2,bgcolor:"error.main",color:"error.contrastText",borderRadius:1,children:(0,r.jsx)(c.A,{variant:"body2",children:A})}),(0,r.jsxs)(W.A,{fullWidth:!0,margin:"normal",children:[(0,r.jsx)(N.A,{children:"Tier"}),(0,r.jsx)(G.A,{value:l,onChange:e=>p(e.target.value),disabled:m,children:i.map(e=>{const n=Object.entries(e.limits||{}).map(([e,n])=>`${n} per ${e}`).join(", ");return(0,r.jsxs)(f.A,{value:e.tier,children:[e.tier," ",n?`(${n})`:""]},e.tier)})})]}),(0,r.jsx)(H.A,{label:"Use Case",placeholder:"Describe how you plan to use this API",multiline:!0,rows:3,fullWidth:!0,margin:"normal",value:u,onChange:e=>h(e.target.value),disabled:m,helperText:"Explain your intended use of this API for admin review"})]}),(0,r.jsxs)(U.A,{children:[(0,r.jsx)(v.A,{onClick:j,disabled:m,children:"Cancel"}),(0,r.jsx)(v.A,{onClick:async()=>{if(l){x(""),y(!0);try{const e={spec:{planTier:l,useCase:u.trim()}};await o.updateRequest(s.metadata.name,s.metadata.namespace,e),t(),n()}catch(e){console.error("Error updating API key request:",e),x(e instanceof Error?e.message:"Unknown error occurred")}finally{y(!1)}}else x("Please select a tier")},color:"primary",variant:"contained",disabled:!l||m,startIcon:m?(0,r.jsx)(g.A,{size:16,color:"inherit"}):void 0,children:m?"Saving...":"Save Changes"})]})]})};var L=t(63221);function X(e,n,t){const r=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': '${r}' + 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': '${r}' + 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", "${r}" + 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 M=t(14933);const O=({namespace:e})=>{var n,t,D,K,_;const{entity:W}=(0,k.tN)(),N=(0,b.useApi)($.v),G=(0,b.useApi)(w.s),H=(0,b.useApi)(b.identityApiRef),U=(0,b.useApi)(b.alertApiRef),[O,V]=(0,a.useState)(new Set),[Y,J]=(0,a.useState)(0),[Q,Z]=(0,a.useState)(""),[ee,ne]=(0,a.useState)(""),[te,re]=(0,a.useState)(!1),[ae,se]=(0,a.useState)(!1),[ie,oe]=(0,a.useState)(null),[le,de]=(0,a.useState)(null),[ce,pe]=(0,a.useState)(null),[ue,he]=(0,a.useState)(null),[me,ye]=(0,a.useState)(new Set),[ge,Ae]=(0,a.useState)({open:!1,request:null}),[ve,xe]=(0,a.useState)(new Map),[fe,je]=(0,a.useState)(new Set),be=(null===(n=W.metadata.annotations)||void 0===n?void 0:n["kuadrant.io/apiproduct"])||W.metadata.name,we=(null===(t=W.metadata.annotations)||void 0===t?void 0:t["kuadrant.io/namespace"])||e||"default";(0,s.A)(async()=>{const e=await H.getBackstageIdentity(),n=await H.getProfileInfo();Z(e.userEntityRef);let t=n.email||"";if(!t&&e.userEntityRef){var r,a;const n=await N.getEntityByRef(e.userEntityRef);(null==n||null===(a=n.spec)||void 0===a||null===(r=a.profile)||void 0===r?void 0:r.email)&&(t=n.spec.profile.email)}ne(t)},[H]);const{value:ke,loading:$e,error:Ce}=(0,s.A)(async()=>(await G.getRequestsByApiProduct(be,we)).items||[],[be,we,Y,G]),{value:Pe,loading:Se,error:qe}=(0,s.A)(async()=>{var e;return null===(e=(await G.getApiProducts()).items)||void 0===e?void 0:e.find(e=>e.metadata.namespace===we&&e.metadata.name===be)},[we,be,G]),Te=Pe?`apiproduct:${Pe.metadata.namespace}/${Pe.metadata.name}`:void 0,{allowed:Re,loading:Ee,error:Ie}=(0,z.l)(I.dp,Te),{allowed:ze,loading:Be,error:De}=(0,z.l)(I.uL),{allowed:Ke,loading:_e,error:We}=(0,z.l)(I.jH),{allowed:Ne,loading:Ge,error:He}=(0,z.l)(I.q0),Ue=()=>{de(null),pe(null)},Fe=()=>{ce&&(oe(ce),se(!0),Ue())},Le=()=>{if(!ce)return;const e=ce;Ue(),Ae({open:!0,request:e})},Xe=e=>{V(n=>{const t=new Set(n);return t.has(e)?t.delete(e):t.add(e),t})},Me=(0,a.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,r.jsx)(d.A,{});const a=`${t.metadata.namespace}/${t.metadata.name}`,s=ve.get(a);return(0,r.jsx)(Oe,{request:t,apiName:be,revealedApiKey:s})}}],[be,ve]),Oe=({request:e,apiName:n,revealedApiKey:t})=>{var s,o,l;const[h,m]=(0,a.useState)(0),y=(null===(s=e.status)||void 0===s?void 0:s.apiHostname)||`${n}.apps.example.com`,g=t||"<your-api-key>",A=function(e,n,t){const r=`https://${n}/api/v1/endpoint`;return e?e.authorizationHeader?X(r,t,e.authorizationHeader.prefix||""):e.customHeader?function(e,n,t,r){return{curl:`curl -X GET ${e} \\\n -H "${t}: ${r?`${r}${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}': '${r}' + 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}': '${r}' + 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}", "${r}" + 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}`}}(r,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}`}}(r,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}`}}(r,t,e.cookie.name):X(r,t,"Bearer"):X(r,t,"Bearer")}(null===(l=e.status)||void 0===l||null===(o=l.authScheme)||void 0===o?void 0:o.credentials,y,g);return(0,r.jsxs)(d.A,{p:3,bgcolor:"background.default",onClick:e=>e.stopPropagation(),children:[e.spec.useCase&&(0,r.jsxs)(d.A,{mb:3,children:[(0,r.jsx)(c.A,{variant:"h6",gutterBottom:!0,children:"Use Case"}),(0,r.jsx)(d.A,{p:2,bgcolor:"background.paper",borderRadius:1,border:"1px solid rgba(0, 0, 0, 0.12)",children:(0,r.jsx)(c.A,{variant:"body2",style:{whiteSpace:"pre-wrap",wordBreak:"break-word",overflowWrap:"break-word"},children:e.spec.useCase})})]}),(0,r.jsx)(c.A,{variant:"h6",gutterBottom:!0,children:"Usage Examples"}),(0,r.jsxs)(c.A,{variant:"body2",paragraph:!0,children:["Use these code examples to test the API with your"," ",e.spec.planTier," tier key."]}),(0,r.jsx)(d.A,{onClick:e=>e.stopPropagation(),children:(0,r.jsxs)(p.A,{value:h,onChange:(e,n)=>{e.stopPropagation(),m(n)},indicatorColor:"primary",children:[(0,r.jsx)(u.A,{label:"cURL",onClick:e=>e.stopPropagation()}),(0,r.jsx)(u.A,{label:"Node.js",onClick:e=>e.stopPropagation()}),(0,r.jsx)(u.A,{label:"Python",onClick:e=>e.stopPropagation()}),(0,r.jsx)(u.A,{label:"Go",onClick:e=>e.stopPropagation()})]})}),(0,r.jsxs)(d.A,{mt:2,children:[0===h&&(0,r.jsx)(i.z,{text:A.curl,language:"bash",showCopyCodeButton:!0}),1===h&&(0,r.jsx)(i.z,{text:A.nodejs,language:"javascript",showCopyCodeButton:!0}),2===h&&(0,r.jsx)(i.z,{text:A.python,language:"python",showCopyCodeButton:!0}),3===h&&(0,r.jsx)(i.z,{text:A.go,language:"go",showCopyCodeButton:!0})]})]})},Ve=Ce||qe,Ye=Ie||De||We||He;if($e||Se||Ee||Be||_e||Ge)return(0,r.jsx)(d.A,{p:2,children:[...Array(5)].map((e,n)=>(0,r.jsx)(d.A,{p:2,children:(0,r.jsx)(j.A,{variant:"text",width:"100%"})},n))});if(Ve)return(0,r.jsx)(o._,{error:Ve});if(Ye){const e=Ie?"kuadrant.apikey.create":De?"kuadrant.apikey.delete.own":We?"kuadrant.apikey.delete.all":He?"kuadrant.apikey.update.own":"unknown";return(0,r.jsxs)(d.A,{p:2,children:[(0,r.jsxs)(c.A,{color:"error",children:["Unable to check permissions: ",Ye.message]}),(0,r.jsxs)(c.A,{variant:"body2",color:"textSecondary",children:["Permission: ",e]}),(0,r.jsx)(c.A,{variant:"body2",color:"textSecondary",children:"Please try again or contact your administrator"})]})}const Je=(ke||[]).filter(e=>!me.has(e.metadata.name)),Qe=(null==Pe||null===(D=Pe.status)||void 0===D?void 0:D.discoveredPlans)||[],Ze=Je.filter(e=>{var n;return"Pending"===(0,B.v)(null===(n=e.status)||void 0===n?void 0:n.conditions)}),en=Je.filter(e=>{var n;return"Approved"===(0,B.v)(null===(n=e.status)||void 0===n?void 0:n.conditions)}),nn=Je.filter(e=>{var n;return"Denied"===(0,B.v)(null===(n=e.status)||void 0===n?void 0:n.conditions)}),tn=[{title:"Tier",field:"spec.planTier",render:e=>(0,r.jsx)(h.A,{label:e.spec.planTier,color:"primary",size:"small"})},{title:"Approved",field:"status.conditions",render:e=>{var n,t,a;const s=null===(a=e.status)||void 0===a||null===(t=a.conditions)||void 0===t||null===(n=t.find(e=>"Approved"===e.type&&"True"===e.status))||void 0===n?void 0:n.lastTransitionTime;return(0,r.jsx)(c.A,{variant:"body2",children:s?new Date(s).toLocaleDateString():"-"})}},{title:"API Key",field:"status.secretRef",searchable:!1,filtering:!1,render:e=>{var n,t;const a=`${e.metadata.namespace}/${e.metadata.name}`,s=O.has(e.metadata.name),i=fe.has(a),o=ve.get(a);return Boolean(null===(t=e.spec)||void 0===t||null===(n=t.secretRef)||void 0===n?void 0:n.name)?(0,r.jsxs)(d.A,{display:"flex",alignItems:"center",children:[(0,r.jsx)(c.A,{variant:"body2",style:{fontFamily:"monospace",marginRight:8},children:i?"Loading...":s&&o?o:"••••••••••••••••"}),s&&o&&(0,r.jsx)(m.Ay,{title:"Copy to clipboard",children:(0,r.jsx)(y.A,{size:"small",onClick:async()=>{o&&(await navigator.clipboard.writeText(o),U.post({message:"API key copied to clipboard",severity:"success",display:"transient"}))},children:(0,r.jsx)(E.A,{fontSize:"small"})})}),(0,r.jsx)(m.Ay,{title:s?"Hide API key":"Reveal API key",children:(0,r.jsx)("span",{children:(0,r.jsx)(y.A,{size:"small",onClick:()=>{s?(((e,n)=>{const t=`${e}/${n}`;xe(e=>{const n=new Map(e);return n.delete(t),n})})(e.metadata.namespace,e.metadata.name),Xe(e.metadata.name)):(async(e,n)=>{const t=`${e}/${n}`;if(!fe.has(t)){je(e=>new Set(e).add(t));try{const r=await G.getApiKeySecret(e,n);xe(e=>new Map(e).set(t,r.apiKey)),Xe(n)}catch(e){const n=e instanceof Error?e.message:"unknown error occurred";U.post({message:`Failed to fetch api key: ${n}`,severity:"error",display:"transient"})}finally{je(e=>{const n=new Set(e);return n.delete(t),n})}}})(e.metadata.namespace,e.metadata.name)},disabled:i,children:s?(0,r.jsx)(P.A,{}):(0,r.jsx)(C.A,{})})})})]}):(0,r.jsx)(c.A,{variant:"body2",color:"textSecondary",children:"Awaiting secret..."})}},{title:"",field:"actions",searchable:!1,filtering:!1,render:e=>{if(ue===e.metadata.name)return(0,r.jsx)(g.A,{size:20});const n=e.spec.requestedBy.userId;return(0,z.W)(n,Q,ze,Ke)?(0,r.jsx)(y.A,{size:"small",onClick:n=>{n.stopPropagation();const t=n.currentTarget.getBoundingClientRect();de({top:t.bottom,left:t.left}),pe(e)},title:"Actions","aria-controls":le?"actions-menu":void 0,"aria-haspopup":"true",children:(0,r.jsx)(R.A,{})}):null}}],rn=[{title:"Status",field:"status.conditions",render:e=>{var n;const t=(0,B.v)((null===(n=e.status)||void 0===n?void 0:n.conditions)||[]),a="Pending"===t;return(0,r.jsx)(h.A,{label:t,size:"small",icon:a?(0,r.jsx)(S.A,{}):(0,r.jsx)(q.A,{}),color:a?"default":"secondary"})}},{title:"Tier",field:"spec.planTier",render:e=>(0,r.jsx)(h.A,{label:e.spec.planTier,color:"primary",size:"small"})},{title:"Use Case",field:"spec.useCase",render:e=>e.spec.useCase?(0,r.jsx)(m.Ay,{title:e.spec.useCase,placement:"top",children:(0,r.jsx)(c.A,{variant:"body2",style:{maxWidth:"200px",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.spec.useCase})}):(0,r.jsx)(c.A,{variant:"body2",children:"-"})},{title:"Requested",field:"metadata.creationTimestamp",render:e=>(0,r.jsx)(c.A,{variant:"body2",children:e.metadata.creationTimestamp?new Date(e.metadata.creationTimestamp).toLocaleDateString():"-"})},{title:"Reviewed",field:"status.conditions",render:e=>{var n,t,a;const s=null===(a=e.status)||void 0===a||null===(t=a.conditions)||void 0===t||null===(n=t.find(e=>("Approved"===e.type||"Denied"===e.type)&&"True"===e.status))||void 0===n?void 0:n.lastTransitionTime;return(0,r.jsx)(c.A,{variant:"body2",children:s?new Date(s).toLocaleDateString():"-"})}},{title:"",field:"actions",searchable:!1,filtering:!1,render:e=>{var n;if(ue===e.metadata.name)return(0,r.jsx)(g.A,{size:20});const t="Pending"===(0,B.v)((null===(n=e.status)||void 0===n?void 0:n.conditions)||[]),a=e.spec.requestedBy.userId,s=(0,z.W)(a,Q,ze,Ke);return t&&(Ne&&a===Q||s)?(0,r.jsx)(y.A,{size:"small",onClick:n=>{n.stopPropagation();const t=n.currentTarget.getBoundingClientRect();de({top:t.bottom,left:t.left}),pe(e)},title:"Actions","aria-controls":le?"actions-menu":void 0,"aria-haspopup":"true",children:(0,r.jsx)(R.A,{})}):null}}],an=rn.filter(e=>"Reviewed"!==e.title&&"Reason"!==e.title);return(0,r.jsxs)(d.A,{p:2,children:[(0,r.jsxs)(A.A,{container:!0,spacing:3,direction:"column",children:[Re&&(0,r.jsx)(A.A,{item:!0,children:(0,r.jsxs)(d.A,{display:"flex",flexDirection:"column",alignItems:"flex-end",mb:2,children:[(0,r.jsx)(v.A,{variant:"contained",color:"primary",startIcon:(0,r.jsx)(T.A,{}),onClick:()=>re(!0),disabled:0===Qe.length||!ee,"data-testid":"request-api-access-button","data-plans-count":Qe.length,children:"Request API Access"}),!ee&&(0,r.jsx)(c.A,{variant:"caption",color:"textSecondary",style:{marginTop:4},"data-testid":"no-email-message",children:'"Email address is required"'}),0===Qe.length&&(0,r.jsx)(c.A,{variant:"caption",color:"textSecondary",style:{marginTop:4},"data-testid":"no-plans-message",children:Pe?(()=>{var e,n,t,r;const a=null===(n=Pe.status)||void 0===n||null===(e=n.conditions)||void 0===e?void 0:e.find(e=>"Ready"===e.type),s=null===(r=Pe.status)||void 0===r||null===(t=r.conditions)||void 0===t?void 0:t.find(e=>"PlanPolicyDiscovered"===e.type);return"True"!==(null==a?void 0:a.status)?`HTTPRoute not ready: ${(null==a?void 0:a.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===Ze.length&&0===nn.length&&0===en.length&&(0,r.jsx)(A.A,{item:!0,children:(0,r.jsx)(d.A,{p:3,textAlign:"center",children:(0,r.jsx)(c.A,{variant:"body1",color:"textSecondary",children:"No API keys yet. Request access to get started."})})}),Ze.length>0&&(0,r.jsx)(A.A,{item:!0,children:(0,r.jsx)(l.X,{title:"Pending Requests",options:{paging:Ze.length>5,pageSize:20,search:!0,filtering:!0,debounceInterval:300,toolbar:!0,emptyRowsWhenPaging:!1},columns:an,data:Ze})}),nn.length>0&&(0,r.jsx)(A.A,{item:!0,children:(0,r.jsx)(l.X,{title:"Denied Requests",options:{paging:nn.length>5,pageSize:20,search:!0,filtering:!0,debounceInterval:300,toolbar:!0,emptyRowsWhenPaging:!1},columns:rn,data:nn})}),en.length>0&&(0,r.jsx)(A.A,{item:!0,children:(0,r.jsx)(l.X,{title:"API Keys",options:{paging:en.length>5,pageSize:20,search:!0,filtering:!0,debounceInterval:300,toolbar:!0,emptyRowsWhenPaging:!1},columns:tn,data:en,detailPanel:Me},"api-keys-table")})]}),(0,r.jsx)(M.c,{open:te,onClose:()=>re(!1),onSuccess:()=>{re(!1),J(e=>e+1)},apiProductName:be,namespace:we,userEmail:ee,plans:Qe}),(0,r.jsx)(x.A,{id:"actions-menu",open:Boolean(le),onClose:Ue,anchorReference:"anchorPosition",anchorPosition:le||{top:0,left:0},children:ce&&(()=>{var e;const n="Pending"===(0,B.v)((null===(e=ce.status)||void 0===e?void 0:e.conditions)||[]),t=ce.spec.requestedBy.userId,a=[];return Ne&&t===Q&&n&&a.push((0,r.jsx)(f.A,{onClick:Fe,children:"Edit"},"edit")),a.push((0,r.jsx)(f.A,{onClick:Le,children:"Delete"},"delete")),a})()}),ie&&(0,r.jsx)(F,{open:ae,onClose:()=>{se(!1),oe(null)},onSuccess:()=>{J(e=>e+1),se(!1),U.post({message:"API key updated",severity:"success",display:"transient"}),oe(null)},request:ie,availablePlans:Qe}),(0,r.jsx)(L.K,{open:ge.open,title:"Delete Request",description:`Are you sure you want to delete this ${"Approved"===(0,B.v)((null===(_=ge.request)||void 0===_||null===(K=_.status)||void 0===K?void 0:K.conditions)||[])?"API key":"request"}?`,deleting:null!==ue,onConfirm:async()=>{ge.request&&(await(async(e,n)=>{ye(e=>new Set(e).add(n)),he(n);try{await G.deleteRequest(e,n),U.post({message:"API key deleted successfully",severity:"success",display:"transient"}),J(e=>e+1)}catch(e){const t=e instanceof Error?e.message:"unknown error occurred";ye(e=>{const t=new Set(e);return t.delete(n),t}),U.post({message:`Failed to delete API key: ${t}`,severity:"error",display:"transient"})}finally{he(null)}})(ge.request.metadata.namespace,ge.request.metadata.name),Ae({open:!1,request:null}))},onCancel:()=>{Ae({open:!1,request:null})}})]})}}}]);
2
+ //# sourceMappingURL=2251.08f3db99.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static/2251.08f3db99.chunk.js","mappings":"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","sources":["webpack://internal.plugin-kuadrant/./src/components/RequestAccessDialog/RequestAccessDialog.tsx","webpack://internal.plugin-kuadrant/./src/utils/apikeys.ts","webpack://internal.plugin-kuadrant/./src/components/ConfirmDeleteDialog/ConfirmDeleteDialog.tsx","webpack://internal.plugin-kuadrant/./src/components/EditAPIKeyDialog/EditAPIKeyDialog.tsx","webpack://internal.plugin-kuadrant/./src/utils/codeSnippets.ts","webpack://internal.plugin-kuadrant/./src/components/ApiKeyManagementTab/ApiKeyManagementTab.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Button,\n TextField,\n Select,\n MenuItem,\n FormControl,\n InputLabel,\n Box,\n Typography,\n CircularProgress,\n} from '@material-ui/core';\nimport InfoIcon from '@material-ui/icons/Info';\nimport {\n useApi,\n alertApiRef,\n} from '@backstage/core-plugin-api';\nimport { kuadrantApiRef } from '../../api';\nimport { Plan } from \"../../types/api-management.ts\";\n\nexport interface RequestAccessDialogProps {\n open: boolean;\n onClose: () => void;\n onSuccess: () => void;\n apiProductName: string;\n namespace: string;\n userEmail: string;\n plans: Plan[];\n}\n\nexport const RequestAccessDialog = ({\n open,\n onClose,\n onSuccess,\n apiProductName,\n namespace,\n userEmail,\n plans,\n}: RequestAccessDialogProps) => {\n const kuadrantApi = useApi(kuadrantApiRef);\n const alertApi = useApi(alertApiRef);\n\n const [selectedPlan, setSelectedPlan] = useState('');\n const [useCase, setUseCase] = useState('');\n const [creating, setCreating] = useState(false);\n const [createError, setCreateError] = useState<string | null>(null);\n\n const handleClose = () => {\n setSelectedPlan('');\n setUseCase('');\n setCreateError(null);\n onClose();\n };\n\n const handleRequestAccess = async () => {\n if (!selectedPlan) return;\n\n setCreating(true);\n setCreateError(null);\n\n try {\n // 1. generate secret name and API key value\n const randomSuffix = Math.random().toString(36).substring(2, 10);\n const secretName = `${apiProductName}-${randomSuffix}-secret`\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, '-');\n const apiKeyValue = crypto.randomUUID().replace(/-/g, '');\n\n // 2. create secret in consumer's namespace first (design doc: secret before APIKey)\n await kuadrantApi.createSecret(secretName, apiKeyValue);\n\n try {\n // 3. create APIKey referencing the pre-existing secret\n await kuadrantApi.createRequest({\n apiProductName,\n namespace,\n planTier: selectedPlan,\n useCase: useCase.trim() || '',\n userEmail,\n secretName,\n });\n\n alertApi.post({\n message: `Request submitted successfully. Pending API owner approval.`,\n severity: 'info',\n display: 'transient',\n });\n\n setSelectedPlan('');\n setUseCase('');\n onSuccess();\n\n } catch (apiKeyError) {\n // cleanup orphaned secret if APIKey creation fails\n try {\n await kuadrantApi.deleteSecret(secretName);\n } catch (deleteError) {\n console.warn('Failed to cleanup orphaned secret:', deleteError);\n }\n throw apiKeyError;\n }\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'unknown error occurred';\n alertApi.post({\n message: `Failed to create request: ${errorMessage}`,\n severity: 'error',\n display: 'transient',\n });\n setCreateError(errorMessage);\n } finally {\n setCreating(false);\n }\n };\n\n return (\n <Dialog open={open} onClose={handleClose} maxWidth=\"sm\" fullWidth>\n <DialogTitle>Request API Access</DialogTitle>\n <DialogContent>\n <Box\n mb={2}\n p={1.5}\n bgcolor=\"info.light\"\n borderRadius={1}\n display=\"flex\"\n alignItems=\"flex-start\"\n style={{ gap: 8 }}\n >\n <InfoIcon\n color=\"primary\"\n fontSize=\"small\"\n style={{ marginTop: 2 }}\n />\n <Typography variant=\"body2\">\n Your request will be reviewed by an API owner before access is\n granted.\n </Typography>\n </Box>\n {createError && (\n <Box\n mb={2}\n p={2}\n bgcolor=\"error.main\"\n color=\"error.contrastText\"\n borderRadius={1}\n >\n <Typography variant=\"body2\">{createError}</Typography>\n </Box>\n )}\n <FormControl\n fullWidth\n margin=\"normal\"\n disabled={creating}\n data-testid=\"tier-select-form\"\n >\n <InputLabel id=\"tier-select-label\">Select Tier</InputLabel>\n <Select\n labelId=\"tier-select-label\"\n data-testid=\"tier-select\"\n value={selectedPlan}\n onChange={(e) => setSelectedPlan(e.target.value as string)}\n disabled={creating}\n >\n {plans.map((plan: Plan) => {\n const limitDesc = Object.entries(plan.limits || {})\n .map(([key, val]) => `${val} per ${key}`)\n .join(', ');\n return (\n <MenuItem\n key={plan.tier}\n value={plan.tier}\n data-testid={`tier-option-${plan.tier}`}\n >\n {plan.tier} {limitDesc ? `(${limitDesc})` : ''}\n </MenuItem>\n );\n })}\n </Select>\n </FormControl>\n <TextField\n label=\"Use Case (optional)\"\n placeholder=\"Describe how you plan to use this API\"\n multiline\n rows={3}\n fullWidth\n margin=\"normal\"\n value={useCase}\n onChange={(e) => setUseCase(e.target.value)}\n helperText=\"Explain your intended use of this API for admin review\"\n disabled={creating}\n />\n </DialogContent>\n <DialogActions>\n <Button onClick={handleClose} disabled={creating}>\n Cancel\n </Button>\n <Button\n onClick={handleRequestAccess}\n color=\"primary\"\n variant=\"contained\"\n disabled={!selectedPlan || creating}\n startIcon={\n creating ? (\n <CircularProgress size={16} color=\"inherit\" />\n ) : undefined\n }\n >\n {creating ? 'Submitting...' : 'Submit Request'}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n","import { StatusCondition } from '../types/api-management';\n\n/**\n * Derives the APIKey approval phase from Kubernetes conditions.\n *\n * Maps conditions to phases:\n * - Empty conditions array → Pending\n * - Approved condition (status: True) → Approved\n * - Denied condition (status: True) → Denied\n * - Failed condition (status: True) → Failed\n *\n * @param conditions - Array of Kubernetes status conditions\n * @returns Current approval phase\n */\nexport function getAPIKeyPhase(\n conditions?: StatusCondition[]\n): 'Pending' | 'Approved' | 'Denied' | 'Failed' {\n if (!conditions || conditions.length === 0) {\n return 'Pending';\n }\n\n const approved = conditions.find(\n c => c.type === 'Approved' && c.status === 'True'\n );\n if (approved) return 'Approved';\n\n const denied = conditions.find(\n c => c.type === 'Denied' && c.status === 'True'\n );\n if (denied) return 'Denied';\n\n const failed = conditions.find(\n c => c.type === 'Failed' && c.status === 'True'\n );\n if (failed) return 'Failed';\n\n return 'Pending';\n}\n","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","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","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 ResponseErrorPanel,\n CodeSnippet,\n} from \"@backstage/core-components\";\nimport {\n IconButton,\n Typography,\n Box,\n Chip,\n Grid,\n Button,\n Tabs,\n Tab,\n Menu,\n MenuItem,\n Tooltip,\n CircularProgress,\n} from \"@material-ui/core\";\nimport { Skeleton } from \"@material-ui/lab\";\nimport {\n useApi,\n identityApiRef,\n alertApiRef,\n} from \"@backstage/core-plugin-api\";\nimport { kuadrantApiRef } from '../../api';\nimport { UserEntity } from '@backstage/catalog-model';\nimport { useEntity, catalogApiRef } 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 { APIKey, APIProduct, Plan } 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 { getAPIKeyPhase } from \"../../utils/apikeys\";\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 catalogAPI = useApi(catalogApiRef);\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\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\n // Try profile email first (works for OAuth providers)\n let email = profile.email || \"\";\n // Fallback to catalog entity for guest/other providers\n if (!email && identity.userEntityRef) {\n const userEntity = await catalogAPI.getEntityByRef(identity.userEntityRef) as UserEntity;\n if (userEntity?.spec?.profile?.email) {\n email = userEntity.spec.profile.email as string;\n }\n }\n\n setUserEmail(email);\n }, [identityApi]);\n\n const {\n value: requests,\n loading: requestsLoading,\n error: requestsError,\n } = useAsync(async () => {\n // backend filters by apiProductRef.name and scopes to user's consumer namespace\n const data = await kuadrantApi.getRequestsByApiProduct(apiProductName, namespace);\n return data.items || [];\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 (deleteNamespace: string, deleteName: string) => {\n // optimistic update - remove from UI immediately\n setOptimisticallyDeleted((prev) => new Set(prev).add(deleteName));\n setDeleting(deleteName);\n try {\n await kuadrantApi.deleteRequest(deleteNamespace, deleteName);\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(deleteName);\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 toggleVisibility(requestName);\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to fetch api key: ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\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(\n deleteDialogState.request.metadata.namespace,\n deleteDialogState.request.metadata.name,\n );\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 (\n <Box p={2}>\n {[...Array(5)].map((_, i) => (\n <Box key={i} p={2}>\n <Skeleton variant=\"text\" width=\"100%\" />\n </Box>\n ))}\n </Box>\n );\n }\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n if (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 Plan[];\n\n const pendingRequests = myRequests.filter(\n (r) => getAPIKeyPhase(r.status?.conditions) === \"Pending\",\n );\n const approvedRequests = myRequests.filter(\n (r) => getAPIKeyPhase(r.status?.conditions) === \"Approved\",\n );\n const rejectedRequests = myRequests.filter(\n (r) => getAPIKeyPhase(r.status?.conditions) === \"Denied\",\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.conditions\",\n render: (row: APIKey) => {\n const approvalDate = row.status?.conditions?.find(\n c => c.type === 'Approved' && c.status === 'True'\n )?.lastTransitionTime;\n return (\n <Typography variant=\"body2\">\n {approvalDate ? new Date(approvalDate).toLocaleDateString() : \"-\"}\n </Typography>\n );\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 = Boolean(row.spec?.secretRef?.name);\n\n if (!hasSecretRef) {\n return (\n <Typography variant=\"body2\" color=\"textSecondary\">\n Awaiting secret...\n </Typography>\n );\n }\n\n const handleRevealClick = () => {\n if (isVisible) {\n clearApiKeyValue(row.metadata.namespace, row.metadata.name);\n toggleVisibility(row.metadata.name);\n } else {\n fetchApiKeyFromSecret(row.metadata.namespace, row.metadata.name);\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={isVisible ? \"Hide API key\" : \"Reveal API key\"}\n >\n <span>\n <IconButton\n size=\"small\"\n onClick={handleRevealClick}\n disabled={isLoading}\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.conditions\",\n render: (row: APIKey) => {\n const phase = getAPIKeyPhase(row.status?.conditions || []);\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.conditions\",\n render: (row: APIKey) => {\n const approvedDate = row.status?.conditions?.find(\n c => (c.type === 'Approved' || c.type === 'Denied') && c.status === 'True'\n )?.lastTransitionTime;\n return (\n <Typography variant=\"body2\">\n {approvedDate ? new Date(approvedDate).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 = getAPIKeyPhase(row.status?.conditions || []) === \"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 || !userEmail}\n data-testid=\"request-api-access-button\"\n data-plans-count={plans.length}\n >\n Request API Access\n </Button>\n {!userEmail && (\n <Typography\n variant=\"caption\"\n color=\"textSecondary\"\n style={{ marginTop: 4 }}\n data-testid=\"no-email-message\"\n >\n \"Email address is required\"\n </Typography>\n )}\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=\"Denied 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 = getAPIKeyPhase(menuRequest.status?.conditions || []) === \"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 ${getAPIKeyPhase(deleteDialogState.request?.status?.conditions || []) === \"Approved\" ? \"API key\" : \"request\"}?`}\n deleting={deleting !== null}\n onConfirm={handleDeleteConfirm}\n onCancel={handleDeleteCancel}\n />\n </Box>\n );\n};\n"],"names":["RequestAccessDialog","open","onClose","onSuccess","apiProductName","namespace","userEmail","plans","kuadrantApi","useApi","kuadrantApiRef","alertApi","alertApiRef","selectedPlan","setSelectedPlan","useState","useCase","setUseCase","creating","setCreating","createError","setCreateError","handleClose","Dialog","maxWidth","fullWidth","DialogTitle","DialogContent","Box","mb","p","bgcolor","borderRadius","display","alignItems","style","gap","InfoIcon","color","fontSize","marginTop","Typography","variant","FormControl","margin","disabled","data-testid","InputLabel","id","Select","labelId","value","onChange","e","target","map","plan","limitDesc","Object","entries","limits","key","val","join","MenuItem","tier","TextField","label","placeholder","multiline","rows","helperText","DialogActions","Button","onClick","async","randomSuffix","Math","random","toString","substring","secretName","toLowerCase","replace","apiKeyValue","crypto","randomUUID","createSecret","createRequest","planTier","trim","post","message","severity","apiKeyError","deleteSecret","deleteError","console","warn","error","errorMessage","Error","startIcon","CircularProgress","size","undefined","getAPIKeyPhase","conditions","length","find","c","type","status","ConfirmDeleteDialog","title","description","confirmText","deleting","onConfirm","onCancel","inputValue","setInputValue","useEffect","requiresTextConfirmation","canConfirm","WarningIcon","span","DialogContentText","whiteSpace","mt","gutterBottom","strong","autoFocus","EditAPIKeyDialog","request","availablePlans","setPlanTier","saving","setSaving","setError","spec","patch","updateRequest","metadata","name","err","generateAuthorizationHeaderSnippets","baseUrl","apiKey","prefix","prefixWithSpace","curl","nodejs","python","go","ApiKeyManagementTab","propNamespace","entity","apiProduct","deleteDialogState","useEntity","catalogAPI","catalogApiRef","identityApi","identityApiRef","visibleKeys","setVisibleKeys","Set","refresh","setRefresh","userId","setUserId","setUserEmail","requestDialogOpen","setRequestDialogOpen","editDialogOpen","setEditDialogOpen","requestToEdit","setRequestToEdit","menuAnchor","setMenuAnchor","menuRequest","setMenuRequest","setDeleting","optimisticallyDeleted","setOptimisticallyDeleted","setDeleteDialogState","apiKeyValues","setApiKeyValues","Map","apiKeyLoading","setApiKeyLoading","annotations","useAsync","identity","getBackstageIdentity","profile","getProfileInfo","userEntityRef","email","userEntity","getEntityByRef","requests","loading","requestsLoading","requestsError","getRequestsByApiProduct","items","plansLoading","plansError","data","getApiProducts","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","apiHostname","displayApiKey","snippets","credentials","authorizationHeader","customHeader","headerName","generateCustomHeaderSnippets","queryString","paramName","generateQueryStringSnippets","cookie","cookieName","generateCookieSnippets","generateAuthCodeSnippets","authScheme","stopPropagation","border","wordBreak","overflowWrap","paragraph","Tabs","newValue","indicatorColor","Tab","CodeSnippet","text","language","showCopyCodeButton","permissionError","Array","_","i","Skeleton","width","ResponseErrorPanel","failedPermission","myRequests","filter","r","discoveredPlans","pendingRequests","approvedRequests","rejectedRequests","approvedColumns","field","row","Chip","approvalDate","lastTransitionTime","Date","toLocaleDateString","searchable","filtering","isVisible","isLoading","Boolean","secretRef","fontFamily","marginRight","Tooltip","IconButton","navigator","clipboard","writeText","FileCopyIcon","requestNamespace","requestName","next","clearApiKeyValue","getApiKeySecret","set","fetchApiKeyFromSecret","VisibilityOffIcon","VisibilityIcon","ownerId","requestedBy","canDeleteResource","rect","currentTarget","getBoundingClientRect","top","bottom","left","aria-controls","aria-haspopup","MoreVertIcon","requestColumns","phase","isPending","icon","HourglassEmptyIcon","CancelIcon","placement","overflow","textOverflow","creationTimestamp","approvedDate","canDelete","pendingRequestColumns","col","Grid","container","spacing","direction","item","flexDirection","AddIcon","data-plans-count","readyCondition","planCondition","textAlign","Table","options","paging","pageSize","search","debounceInterval","toolbar","emptyRowsWhenPaging","columns","detailPanel","Menu","anchorReference","anchorPosition","push","deleteNamespace","deleteName","deleteRequest","handleDeleteRequest"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[2769],{5030:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});var r=n(85608),a=n(95478),o=r.__importDefault(n(10009));t.default=function(e,t,n){void 0===t&&(t=[]),void 0===n&&(n={loading:!1});var i=a.useRef(0),l=o.default(),s=a.useState(n),c=s[0],d=s[1],u=a.useCallback(function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var a=++i.current;return c.loading||d(function(e){return r.__assign(r.__assign({},e),{loading:!0})}),e.apply(void 0,t).then(function(e){return l()&&a===i.current&&d({value:e,loading:!1}),e},function(e){return l()&&a===i.current&&d({error:e,loading:!1}),e})},t);return[c,u]}},10009:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});var r=n(95478);t.default=function(){var e=r.useRef(!1),t=r.useCallback(function(){return e.current},[]);return r.useEffect(function(){return e.current=!0,function(){e.current=!1}},[]),t}},18466:(e,t,n)=>{var r=n(4293),a=n(78920);t.A=void 0;var o=a(n(95478)),i=(0,r(n(74044)).default)(o.createElement("path",{d:"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"}),"Add");t.A=i},35015:(e,t,n)=>{n.d(t,{A:()=>i});var r=n(95478),a=n(85608),o=n(71581);function i(e,t){void 0===t&&(t=[]);var n=function(e,t,n){void 0===t&&(t=[]),void 0===n&&(n={loading:!1});var i=(0,r.useRef)(0),l=(0,o.A)(),s=(0,r.useState)(n),c=s[0],d=s[1],u=(0,r.useCallback)(function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var r=++i.current;return c.loading||d(function(e){return(0,a.__assign)((0,a.__assign)({},e),{loading:!0})}),e.apply(void 0,t).then(function(e){return l()&&r===i.current&&d({value:e,loading:!1}),e},function(e){return l()&&r===i.current&&d({error:e,loading:!1}),e})},t);return[c,u]}(e,t,{loading:!0}),i=n[0],l=n[1];return(0,r.useEffect)(function(){l()},[l]),i}},39590:(e,t,n)=>{var r=n(4293),a=n(78920);t.A=void 0;var o=a(n(95478)),i=(0,r(n(74044)).default)(o.createElement("path",{d:"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"}),"Delete");t.A=i},41241:(e,t,n)=>{n.d(t,{S:()=>d});var r=n(31085),a=n(10394),o=n(88951),i=n(37976),l=n(95478);function s(e){const t=(0,i.useTheme)(),[n,s]=(0,l.useState)(!1);return(0,l.useEffect)(()=>{const e=setTimeout(()=>s(!0),t.transitions.duration.short);return()=>clearTimeout(e)},[t.transitions.duration.short]),n?(0,r.jsx)(o.A,{...e,"data-testid":"progress"}):(0,r.jsx)(a.A,{display:"none","data-testid":"progress"})}const c=(0,l.lazy)(()=>Promise.all([n.e(8727),n.e(6386)]).then(n.bind(n,6386)).then(e=>({default:e.OpenApiDefinition}))),d=e=>{const t=e.supportedSubmitMethods?.map(e=>e.toLocaleLowerCase());return(0,r.jsx)(l.Suspense,{fallback:(0,r.jsx)(s,{}),children:(0,r.jsx)(c,{...e,supportedSubmitMethods:t})})}},48351:(e,t,n)=>{n.d(t,{A:()=>y});var r=n(39850),a=n(89575),o=n(95478),i=n(57384),l=n(37976),s=n(4321),c=n(38483);const d=(0,c.A)(o.createElement("path",{d:"M20,12A8,8 0 0,1 12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4C12.76,4 13.5,4.11 14.2, 4.31L15.77,2.74C14.61,2.26 13.34,2 12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0, 0 22,12M7.91,10.08L6.5,11.5L11,16L21,6L19.59,4.58L11,13.17L7.91,10.08Z"}),"SuccessOutlined"),u=(0,c.A)(o.createElement("path",{d:"M12 5.99L19.53 19H4.47L12 5.99M12 2L1 21h22L12 2zm1 14h-2v2h2v-2zm0-6h-2v4h2v-4z"}),"ReportProblemOutlined"),h=(0,c.A)(o.createElement("path",{d:"M11 15h2v2h-2zm0-8h2v6h-2zm.99-5C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"}),"ErrorOutline"),p=(0,c.A)(o.createElement("path",{d:"M11,9H13V7H11M12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4C16.41,4 20,7.59 20, 12C20,16.41 16.41,20 12,20M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10, 10 0 0,0 12,2M11,17H13V11H11V17Z"}),"InfoOutlined"),f=(0,c.A)(o.createElement("path",{d:"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"}),"Close");var m=n(29365),g=n(11192),v={success:o.createElement(d,{fontSize:"inherit"}),warning:o.createElement(u,{fontSize:"inherit"}),error:o.createElement(h,{fontSize:"inherit"}),info:o.createElement(p,{fontSize:"inherit"})},A=o.createElement(f,{fontSize:"small"}),x=o.forwardRef(function(e,t){var n=e.action,l=e.children,c=e.classes,d=e.className,u=e.closeText,h=void 0===u?"Close":u,p=e.color,f=e.icon,x=e.iconMapping,y=void 0===x?v:x,C=e.onClose,b=e.role,k=void 0===b?"alert":b,j=e.severity,E=void 0===j?"success":j,S=e.variant,M=void 0===S?"standard":S,z=(0,r.A)(e,["action","children","classes","className","closeText","color","icon","iconMapping","onClose","role","severity","variant"]);return o.createElement(s.A,(0,a.A)({role:k,square:!0,elevation:0,className:(0,i.A)(c.root,c["".concat(M).concat((0,g.A)(p||E))],d),ref:t},z),!1!==f?o.createElement("div",{className:c.icon},f||y[E]||v[E]):null,o.createElement("div",{className:c.message},l),null!=n?o.createElement("div",{className:c.action},n):null,null==n&&C?o.createElement("div",{className:c.action},o.createElement(m.A,{size:"small","aria-label":h,title:h,color:"inherit",onClick:C},A)):null)});const y=(0,l.withStyles)(function(e){var t="light"===e.palette.type?l.darken:l.lighten,n="light"===e.palette.type?l.lighten:l.darken;return{root:(0,a.A)({},e.typography.body2,{borderRadius:e.shape.borderRadius,backgroundColor:"transparent",display:"flex",padding:"6px 16px"}),standardSuccess:{color:t(e.palette.success.main,.6),backgroundColor:n(e.palette.success.main,.9),"& $icon":{color:e.palette.success.main}},standardInfo:{color:t(e.palette.info.main,.6),backgroundColor:n(e.palette.info.main,.9),"& $icon":{color:e.palette.info.main}},standardWarning:{color:t(e.palette.warning.main,.6),backgroundColor:n(e.palette.warning.main,.9),"& $icon":{color:e.palette.warning.main}},standardError:{color:t(e.palette.error.main,.6),backgroundColor:n(e.palette.error.main,.9),"& $icon":{color:e.palette.error.main}},outlinedSuccess:{color:t(e.palette.success.main,.6),border:"1px solid ".concat(e.palette.success.main),"& $icon":{color:e.palette.success.main}},outlinedInfo:{color:t(e.palette.info.main,.6),border:"1px solid ".concat(e.palette.info.main),"& $icon":{color:e.palette.info.main}},outlinedWarning:{color:t(e.palette.warning.main,.6),border:"1px solid ".concat(e.palette.warning.main),"& $icon":{color:e.palette.warning.main}},outlinedError:{color:t(e.palette.error.main,.6),border:"1px solid ".concat(e.palette.error.main),"& $icon":{color:e.palette.error.main}},filledSuccess:{color:"#fff",fontWeight:e.typography.fontWeightMedium,backgroundColor:e.palette.success.main},filledInfo:{color:"#fff",fontWeight:e.typography.fontWeightMedium,backgroundColor:e.palette.info.main},filledWarning:{color:"#fff",fontWeight:e.typography.fontWeightMedium,backgroundColor:e.palette.warning.main},filledError:{color:"#fff",fontWeight:e.typography.fontWeightMedium,backgroundColor:e.palette.error.main},icon:{marginRight:12,padding:"7px 0",display:"flex",fontSize:22,opacity:.9},message:{padding:"8px 0"},action:{display:"flex",alignItems:"center",marginLeft:"auto",paddingLeft:16,marginRight:-8}}},{name:"MuiAlert"})(x)},52235:(e,t,n)=>{var r=n(4293),a=n(78920);t.A=void 0;var o=a(n(95478)),i=(0,r(n(74044)).default)(o.createElement("path",{d:"M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z"}),"ArrowForward");t.A=i},55735:(e,t,n)=>{var r=n(4293),a=n(78920);t.A=void 0;var o=a(n(95478)),i=(0,r(n(74044)).default)(o.createElement("path",{d:"M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z"}),"ArrowBack");t.A=i},77225:(e,t,n)=>{var r=n(4293),a=n(78920);t.A=void 0;var o=a(n(95478)),i=(0,r(n(74044)).default)(o.createElement("path",{d:"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z"}),"Warning");t.A=i},89031:(e,t,n)=>{var r=n(4293),a=n(78920);t.A=void 0;var o=a(n(95478)),i=(0,r(n(74044)).default)(o.createElement("path",{d:"M11 7h2v2h-2zm0 4h2v6h-2zm1-9C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"}),"InfoOutlined");t.A=i},91638:(e,t,n)=>{var r=n(85608),a=n(95478),o=r.__importDefault(n(5030));t.A=function(e,t){void 0===t&&(t=[]);var n=o.default(e,t,{loading:!0}),r=n[0],i=n[1];return a.useEffect(function(){i()},[i]),r}},96040:(e,t,n)=>{n.d(t,{n:()=>_});var r=n(31085),a=n(40703),o=n(59469),i=n(48653),l=n(45685),s=n(37197),c=n(37976),d=n(53373),u=n.n(d),h=n(10394),p=n(72501),f=n(52235),m=n(37725);const g=(0,c.makeStyles)(e=>({root:{maxWidth:"fit-content",padding:e.spacing(2,2,2,2.5)},boxTitle:{margin:0,color:e.palette.textSubtle},arrow:{color:e.palette.textSubtle}}),{name:"BackstageBottomLink"});function v(e){const{link:t,title:n,onClick:a}=e,o=g();return(0,r.jsxs)(h.A,{children:[(0,r.jsx)(s.A,{}),(0,r.jsx)(m.N_,{to:t,onClick:a,underline:"none",children:(0,r.jsxs)(h.A,{display:"flex",alignItems:"center",className:o.root,children:[(0,r.jsx)(h.A,{className:o.boxTitle,fontWeight:"fontWeightBold",m:1,children:(0,r.jsx)(p.A,{children:(0,r.jsx)("strong",{children:n})})}),(0,r.jsx)(f.A,{className:o.arrow})]})})]})}var A=n(95478),x=n(64947);const y=(0,A.forwardRef)((e,t)=>(0,r.jsx)(m.N_,{ref:t,...e,color:"initial"})),C=(0,A.forwardRef)((e,t)=>(0,r.jsx)(x.A,{ref:t,component:y,...e}));var b=n(34169),k=n(21006),j=n(67550);const E=e=>{const{slackChannel:t}=e,{t:n}=(0,j.i)(k.O);return t?"string"==typeof t?(0,r.jsx)(p.A,{children:n("errorBoundary.title",{slackChannel:t})}):t.href?(0,r.jsx)(C,{to:t.href,variant:"contained",children:t.name}):(0,r.jsx)(p.A,{children:n("errorBoundary.title",{slackChannel:t.name})}):null},S=class extends A.Component{constructor(e){super(e),this.state={error:void 0,errorInfo:void 0}}componentDidCatch(e,t){console.error(`ErrorBoundary, error: ${e}`,{error:e,errorInfo:t}),this.setState({error:e,errorInfo:t})}render(){const{slackChannel:e,children:t}=this.props,{error:n}=this.state;return n?(0,r.jsx)(b.b,{title:"Something Went Wrong",error:n,children:(0,r.jsx)(E,{slackChannel:e})}):t}},M=(0,c.makeStyles)(e=>({noPadding:{padding:0,"&:last-child":{paddingBottom:0}},contentAlignBottom:{display:"flex",alignItems:"self-end"},header:{padding:e.spacing(2,2,2,2.5)},headerTitle:{fontWeight:e.typography.fontWeightBold},headerSubheader:{paddingTop:e.spacing(1)},headerAvatar:{},headerAction:{},headerContent:{},subheader:{display:"flex"}}),{name:"BackstageInfoCard"}),z=(0,c.withStyles)(e=>({root:{display:"inline-block",padding:e.spacing(8,8,0,0),float:"right"}}),{name:"BackstageInfoCardCardActionsTopRight"})(o.A),L={card:{flex:{display:"flex",flexDirection:"column"},fullHeight:{display:"flex",flexDirection:"column",height:"100%"},gridItem:{display:"flex",flexDirection:"column",height:"calc(100% - 10px)",marginBottom:"10px",breakInside:"avoid-page","@media print":{height:"auto"}}},cardContent:{fullHeight:{flex:1},gridItem:{flex:1}}};function _(e){const{title:t,subheader:n,divider:c=!0,deepLink:d,slackChannel:h,errorBoundaryProps:p,variant:f,alignContent:m="normal",children:g,headerStyle:A,headerProps:x,icon:y,action:C,actionsClassName:b,actions:k,cardClassName:j,actionsTopRight:E,className:_,noPadding:w,titleTypographyProps:N,subheaderTypographyProps:W}=e,I=M();let T={},B={};f&&f.split(/[\s]+/g).forEach(e=>{T={...T,...L.card[e]},B={...B,...L.cardContent[e]}});const H=p||(h?{slackChannel:h}:{});return(0,r.jsx)(a.A,{style:T,className:_,children:(0,r.jsxs)(S,{...H,children:[t&&(0,r.jsx)(l.A,{classes:{root:u()(I.header),title:I.headerTitle,subheader:I.headerSubheader,avatar:I.headerAvatar,action:I.headerAction,content:I.headerContent},title:t,subheader:n||y?(0,r.jsxs)("div",{"data-testid":"info-card-subheader",children:[n&&(0,r.jsx)("div",{className:I.subheader,children:n}),y]}):null,action:C,style:{...A},titleTypographyProps:N,subheaderTypographyProps:W,...x}),E&&(0,r.jsx)(z,{children:E}),c&&(0,r.jsx)(s.A,{}),(0,r.jsx)(i.A,{className:u()(j,{[I.noPadding]:w,[I.contentAlignBottom]:"bottom"===m}),style:B,children:g}),k&&(0,r.jsx)(o.A,{className:b,children:k}),d&&(0,r.jsx)(v,{...d})]})})}}}]);
2
+ //# sourceMappingURL=2769.e09b0ab0.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static/2769.e09b0ab0.chunk.js","mappings":"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","sources":["webpack://internal.plugin-kuadrant/../../node_modules/react-use/lib/useAsyncFn.js","webpack://internal.plugin-kuadrant/../../node_modules/react-use/lib/useMountedState.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/Add.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/Delete.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-api-docs/node_modules/@backstage/core-components/dist/components/Progress/Progress.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-api-docs/dist/components/OpenApiDefinitionWidget/OpenApiDefinitionWidget.esm.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/lab/esm/internal/svg-icons/SuccessOutlined.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/lab/esm/internal/svg-icons/ReportProblemOutlined.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/lab/esm/internal/svg-icons/ErrorOutline.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/lab/esm/internal/svg-icons/InfoOutlined.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/lab/esm/internal/svg-icons/Close.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/lab/esm/Alert/Alert.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/ArrowForward.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/ArrowBack.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/Warning.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/InfoOutlined.js","webpack://internal.plugin-kuadrant/../../node_modules/react-use/lib/useAsync.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/core-components/dist/layout/BottomLink/BottomLink.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/core-components/dist/components/LinkButton/LinkButton.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/core-components/dist/layout/ErrorBoundary/ErrorBoundary.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/core-components/dist/layout/InfoCard/InfoCard.esm.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar tslib_1 = require(\"tslib\");\nvar react_1 = require(\"react\");\nvar useMountedState_1 = tslib_1.__importDefault(require(\"./useMountedState\"));\nfunction useAsyncFn(fn, deps, initialState) {\n if (deps === void 0) { deps = []; }\n if (initialState === void 0) { initialState = { loading: false }; }\n var lastCallId = react_1.useRef(0);\n var isMounted = useMountedState_1.default();\n var _a = react_1.useState(initialState), state = _a[0], set = _a[1];\n var callback = react_1.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 (tslib_1.__assign(tslib_1.__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}\nexports.default = useAsyncFn;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar react_1 = require(\"react\");\nfunction useMountedState() {\n var mountedRef = react_1.useRef(false);\n var get = react_1.useCallback(function () { return mountedRef.current; }, []);\n react_1.useEffect(function () {\n mountedRef.current = true;\n return function () {\n mountedRef.current = false;\n };\n }, []);\n return get;\n}\nexports.default = useMountedState;\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 { 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: \"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\"\n}), 'Delete');\n\nexports.default = _default;","import { jsx } from 'react/jsx-runtime';\nimport Box from '@material-ui/core/Box';\nimport LinearProgress from '@material-ui/core/LinearProgress';\nimport { useTheme } from '@material-ui/core/styles';\nimport { useState, useEffect } from 'react';\n\nfunction Progress(props) {\n const theme = useTheme();\n const [isVisible, setIsVisible] = useState(false);\n useEffect(() => {\n const handle = setTimeout(\n () => setIsVisible(true),\n theme.transitions.duration.short\n );\n return () => clearTimeout(handle);\n }, [theme.transitions.duration.short]);\n return isVisible ? /* @__PURE__ */ jsx(LinearProgress, { ...props, \"data-testid\": \"progress\" }) : /* @__PURE__ */ jsx(Box, { display: \"none\", \"data-testid\": \"progress\" });\n}\n\nexport { Progress };\n//# sourceMappingURL=Progress.esm.js.map\n","import { jsx } from 'react/jsx-runtime';\nimport { Progress } from '@backstage/core-components';\nimport { lazy, Suspense } from 'react';\n\nconst LazyOpenApiDefinition = lazy(\n () => import('./OpenApiDefinition.esm.js').then((m) => ({\n default: m.OpenApiDefinition\n }))\n);\nconst OpenApiDefinitionWidget = (props) => {\n const validSubmitMethods = props.supportedSubmitMethods?.map(\n (method) => method.toLocaleLowerCase()\n );\n return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(Progress, {}), children: /* @__PURE__ */ jsx(\n LazyOpenApiDefinition,\n {\n ...props,\n supportedSubmitMethods: validSubmitMethods\n }\n ) });\n};\n\nexport { OpenApiDefinitionWidget };\n//# sourceMappingURL=OpenApiDefinitionWidget.esm.js.map\n","import * as React from 'react';\nimport { createSvgIcon } from '@material-ui/core/utils';\n/**\n * @ignore - internal component.\n */\n\nexport default createSvgIcon( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M20,12A8,8 0 0,1 12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4C12.76,4 13.5,4.11 14.2, 4.31L15.77,2.74C14.61,2.26 13.34,2 12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0, 0 22,12M7.91,10.08L6.5,11.5L11,16L21,6L19.59,4.58L11,13.17L7.91,10.08Z\"\n}), 'SuccessOutlined');","import * as React from 'react';\nimport { createSvgIcon } from '@material-ui/core/utils';\n/**\n * @ignore - internal component.\n */\n\nexport default createSvgIcon( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12 5.99L19.53 19H4.47L12 5.99M12 2L1 21h22L12 2zm1 14h-2v2h2v-2zm0-6h-2v4h2v-4z\"\n}), 'ReportProblemOutlined');","import * as React from 'react';\nimport { createSvgIcon } from '@material-ui/core/utils';\n/**\n * @ignore - internal component.\n */\n\nexport default createSvgIcon( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M11 15h2v2h-2zm0-8h2v6h-2zm.99-5C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"\n}), 'ErrorOutline');","import * as React from 'react';\nimport { createSvgIcon } from '@material-ui/core/utils';\n/**\n * @ignore - internal component.\n */\n\nexport default createSvgIcon( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M11,9H13V7H11M12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4C16.41,4 20,7.59 20, 12C20,16.41 16.41,20 12,20M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10, 10 0 0,0 12,2M11,17H13V11H11V17Z\"\n}), 'InfoOutlined');","import * as React from 'react';\nimport { createSvgIcon } from '@material-ui/core/utils';\n/**\n * @ignore - internal component.\n */\n\nexport default createSvgIcon( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\n}), 'Close');","import _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport { withStyles, lighten, darken } from '@material-ui/core/styles';\nimport Paper from '@material-ui/core/Paper';\nimport SuccessOutlinedIcon from '../internal/svg-icons/SuccessOutlined';\nimport ReportProblemOutlinedIcon from '../internal/svg-icons/ReportProblemOutlined';\nimport ErrorOutlineIcon from '../internal/svg-icons/ErrorOutline';\nimport InfoOutlinedIcon from '../internal/svg-icons/InfoOutlined';\nimport CloseIcon from '../internal/svg-icons/Close';\nimport IconButton from '@material-ui/core/IconButton';\nimport { capitalize } from '@material-ui/core/utils';\nexport var styles = function styles(theme) {\n var getColor = theme.palette.type === 'light' ? darken : lighten;\n var getBackgroundColor = theme.palette.type === 'light' ? lighten : darken;\n return {\n /* Styles applied to the root element. */\n root: _extends({}, theme.typography.body2, {\n borderRadius: theme.shape.borderRadius,\n backgroundColor: 'transparent',\n display: 'flex',\n padding: '6px 16px'\n }),\n\n /* Styles applied to the root element if `variant=\"standard\"` and `color=\"success\"`. */\n standardSuccess: {\n color: getColor(theme.palette.success.main, 0.6),\n backgroundColor: getBackgroundColor(theme.palette.success.main, 0.9),\n '& $icon': {\n color: theme.palette.success.main\n }\n },\n\n /* Styles applied to the root element if `variant=\"standard\"` and `color=\"info\"`. */\n standardInfo: {\n color: getColor(theme.palette.info.main, 0.6),\n backgroundColor: getBackgroundColor(theme.palette.info.main, 0.9),\n '& $icon': {\n color: theme.palette.info.main\n }\n },\n\n /* Styles applied to the root element if `variant=\"standard\"` and `color=\"warning\"`. */\n standardWarning: {\n color: getColor(theme.palette.warning.main, 0.6),\n backgroundColor: getBackgroundColor(theme.palette.warning.main, 0.9),\n '& $icon': {\n color: theme.palette.warning.main\n }\n },\n\n /* Styles applied to the root element if `variant=\"standard\"` and `color=\"error\"`. */\n standardError: {\n color: getColor(theme.palette.error.main, 0.6),\n backgroundColor: getBackgroundColor(theme.palette.error.main, 0.9),\n '& $icon': {\n color: theme.palette.error.main\n }\n },\n\n /* Styles applied to the root element if `variant=\"outlined\"` and `color=\"success\"`. */\n outlinedSuccess: {\n color: getColor(theme.palette.success.main, 0.6),\n border: \"1px solid \".concat(theme.palette.success.main),\n '& $icon': {\n color: theme.palette.success.main\n }\n },\n\n /* Styles applied to the root element if `variant=\"outlined\"` and `color=\"info\"`. */\n outlinedInfo: {\n color: getColor(theme.palette.info.main, 0.6),\n border: \"1px solid \".concat(theme.palette.info.main),\n '& $icon': {\n color: theme.palette.info.main\n }\n },\n\n /* Styles applied to the root element if `variant=\"outlined\"` and `color=\"warning\"`. */\n outlinedWarning: {\n color: getColor(theme.palette.warning.main, 0.6),\n border: \"1px solid \".concat(theme.palette.warning.main),\n '& $icon': {\n color: theme.palette.warning.main\n }\n },\n\n /* Styles applied to the root element if `variant=\"outlined\"` and `color=\"error\"`. */\n outlinedError: {\n color: getColor(theme.palette.error.main, 0.6),\n border: \"1px solid \".concat(theme.palette.error.main),\n '& $icon': {\n color: theme.palette.error.main\n }\n },\n\n /* Styles applied to the root element if `variant=\"filled\"` and `color=\"success\"`. */\n filledSuccess: {\n color: '#fff',\n fontWeight: theme.typography.fontWeightMedium,\n backgroundColor: theme.palette.success.main\n },\n\n /* Styles applied to the root element if `variant=\"filled\"` and `color=\"info\"`. */\n filledInfo: {\n color: '#fff',\n fontWeight: theme.typography.fontWeightMedium,\n backgroundColor: theme.palette.info.main\n },\n\n /* Styles applied to the root element if `variant=\"filled\"` and `color=\"warning\"`. */\n filledWarning: {\n color: '#fff',\n fontWeight: theme.typography.fontWeightMedium,\n backgroundColor: theme.palette.warning.main\n },\n\n /* Styles applied to the root element if `variant=\"filled\"` and `color=\"error\"`. */\n filledError: {\n color: '#fff',\n fontWeight: theme.typography.fontWeightMedium,\n backgroundColor: theme.palette.error.main\n },\n\n /* Styles applied to the icon wrapper element. */\n icon: {\n marginRight: 12,\n padding: '7px 0',\n display: 'flex',\n fontSize: 22,\n opacity: 0.9\n },\n\n /* Styles applied to the message wrapper element. */\n message: {\n padding: '8px 0'\n },\n\n /* Styles applied to the action wrapper element if `action` is provided. */\n action: {\n display: 'flex',\n alignItems: 'center',\n marginLeft: 'auto',\n paddingLeft: 16,\n marginRight: -8\n }\n };\n};\nvar defaultIconMapping = {\n success: /*#__PURE__*/React.createElement(SuccessOutlinedIcon, {\n fontSize: \"inherit\"\n }),\n warning: /*#__PURE__*/React.createElement(ReportProblemOutlinedIcon, {\n fontSize: \"inherit\"\n }),\n error: /*#__PURE__*/React.createElement(ErrorOutlineIcon, {\n fontSize: \"inherit\"\n }),\n info: /*#__PURE__*/React.createElement(InfoOutlinedIcon, {\n fontSize: \"inherit\"\n })\n};\n\nvar _ref = /*#__PURE__*/React.createElement(CloseIcon, {\n fontSize: \"small\"\n});\n\nvar Alert = /*#__PURE__*/React.forwardRef(function Alert(props, ref) {\n var action = props.action,\n children = props.children,\n classes = props.classes,\n className = props.className,\n _props$closeText = props.closeText,\n closeText = _props$closeText === void 0 ? 'Close' : _props$closeText,\n color = props.color,\n icon = props.icon,\n _props$iconMapping = props.iconMapping,\n iconMapping = _props$iconMapping === void 0 ? defaultIconMapping : _props$iconMapping,\n onClose = props.onClose,\n _props$role = props.role,\n role = _props$role === void 0 ? 'alert' : _props$role,\n _props$severity = props.severity,\n severity = _props$severity === void 0 ? 'success' : _props$severity,\n _props$variant = props.variant,\n variant = _props$variant === void 0 ? 'standard' : _props$variant,\n other = _objectWithoutProperties(props, [\"action\", \"children\", \"classes\", \"className\", \"closeText\", \"color\", \"icon\", \"iconMapping\", \"onClose\", \"role\", \"severity\", \"variant\"]);\n\n return /*#__PURE__*/React.createElement(Paper, _extends({\n role: role,\n square: true,\n elevation: 0,\n className: clsx(classes.root, classes[\"\".concat(variant).concat(capitalize(color || severity))], className),\n ref: ref\n }, other), icon !== false ? /*#__PURE__*/React.createElement(\"div\", {\n className: classes.icon\n }, icon || iconMapping[severity] || defaultIconMapping[severity]) : null, /*#__PURE__*/React.createElement(\"div\", {\n className: classes.message\n }, children), action != null ? /*#__PURE__*/React.createElement(\"div\", {\n className: classes.action\n }, action) : null, action == null && onClose ? /*#__PURE__*/React.createElement(\"div\", {\n className: classes.action\n }, /*#__PURE__*/React.createElement(IconButton, {\n size: \"small\",\n \"aria-label\": closeText,\n title: closeText,\n color: \"inherit\",\n onClick: onClose\n }, _ref)) : null);\n});\nprocess.env.NODE_ENV !== \"production\" ? Alert.propTypes = {\n // ----------------------------- Warning --------------------------------\n // | These PropTypes are generated from the TypeScript type definitions |\n // | To update them edit the d.ts file and run \"yarn proptypes\" |\n // ----------------------------------------------------------------------\n\n /**\n * The action to display. It renders after the message, at the end of the alert.\n */\n action: PropTypes.node,\n\n /**\n * The content of the component.\n */\n children: PropTypes.node,\n\n /**\n * Override or extend the styles applied to the component.\n * See [CSS API](#css) below for more details.\n */\n classes: PropTypes.object,\n\n /**\n * @ignore\n */\n className: PropTypes.string,\n\n /**\n * Override the default label for the *close popup* icon button.\n *\n * For localization purposes, you can use the provided [translations](/guides/localization/).\n */\n closeText: PropTypes.string,\n\n /**\n * The main color for the alert. Unless provided, the value is taken from the `severity` prop.\n */\n color: PropTypes.oneOf(['error', 'info', 'success', 'warning']),\n\n /**\n * Override the icon displayed before the children.\n * Unless provided, the icon is mapped to the value of the `severity` prop.\n */\n icon: PropTypes.node,\n\n /**\n * The component maps the `severity` prop to a range of different icons,\n * for instance success to `<SuccessOutlined>`.\n * If you wish to change this mapping, you can provide your own.\n * Alternatively, you can use the `icon` prop to override the icon displayed.\n */\n iconMapping: PropTypes.shape({\n error: PropTypes.node,\n info: PropTypes.node,\n success: PropTypes.node,\n warning: PropTypes.node\n }),\n\n /**\n * Callback fired when the component requests to be closed.\n * When provided and no `action` prop is set, a close icon button is displayed that triggers the callback when clicked.\n *\n * @param {object} event The event source of the callback.\n */\n onClose: PropTypes.func,\n\n /**\n * The ARIA role attribute of the element.\n */\n role: PropTypes.string,\n\n /**\n * The severity of the alert. This defines the color and icon used.\n */\n severity: PropTypes.oneOf(['error', 'info', 'success', 'warning']),\n\n /**\n * The variant to use.\n */\n variant: PropTypes.oneOf(['filled', 'outlined', 'standard'])\n} : void 0;\nexport default withStyles(styles, {\n name: 'MuiAlert'\n})(Alert);","\"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 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z\"\n}), 'ArrowForward');\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: \"M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z\"\n}), 'ArrowBack');\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: \"M11 7h2v2h-2zm0 4h2v6h-2zm1-9C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"\n}), 'InfoOutlined');\n\nexports.default = _default;","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar tslib_1 = require(\"tslib\");\nvar react_1 = require(\"react\");\nvar useAsyncFn_1 = tslib_1.__importDefault(require(\"./useAsyncFn\"));\nfunction useAsync(fn, deps) {\n if (deps === void 0) { deps = []; }\n var _a = useAsyncFn_1.default(fn, deps, {\n loading: true,\n }), state = _a[0], callback = _a[1];\n react_1.useEffect(function () {\n callback();\n }, [callback]);\n return state;\n}\nexports.default = useAsync;\n","import { jsxs, jsx } from 'react/jsx-runtime';\nimport Box from '@material-ui/core/Box';\nimport Divider from '@material-ui/core/Divider';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport ArrowIcon from '@material-ui/icons/ArrowForward';\nimport { Link } from '../../components/Link/Link.esm.js';\n\nconst useStyles = makeStyles(\n (theme) => ({\n root: {\n maxWidth: \"fit-content\",\n padding: theme.spacing(2, 2, 2, 2.5)\n },\n boxTitle: {\n margin: 0,\n color: theme.palette.textSubtle\n },\n arrow: {\n color: theme.palette.textSubtle\n }\n }),\n { name: \"BackstageBottomLink\" }\n);\nfunction BottomLink(props) {\n const { link, title, onClick } = props;\n const classes = useStyles();\n return /* @__PURE__ */ jsxs(Box, { children: [\n /* @__PURE__ */ jsx(Divider, {}),\n /* @__PURE__ */ jsx(Link, { to: link, onClick, underline: \"none\", children: /* @__PURE__ */ jsxs(Box, { display: \"flex\", alignItems: \"center\", className: classes.root, children: [\n /* @__PURE__ */ jsx(Box, { className: classes.boxTitle, fontWeight: \"fontWeightBold\", m: 1, children: /* @__PURE__ */ jsx(Typography, { children: /* @__PURE__ */ jsx(\"strong\", { children: title }) }) }),\n /* @__PURE__ */ jsx(ArrowIcon, { className: classes.arrow })\n ] }) })\n ] });\n}\n\nexport { BottomLink };\n//# sourceMappingURL=BottomLink.esm.js.map\n","import { jsx } from 'react/jsx-runtime';\nimport Button$1 from '@material-ui/core/Button';\nimport { forwardRef } from 'react';\nimport { Link } from '../Link/Link.esm.js';\n\nconst LinkWrapper = forwardRef((props, ref) => /* @__PURE__ */ jsx(Link, { ref, ...props, color: \"initial\" }));\nconst LinkButton = forwardRef((props, ref) => /* @__PURE__ */ jsx(Button$1, { ref, component: LinkWrapper, ...props }));\nconst Button = LinkButton;\n\nexport { Button, LinkButton };\n//# sourceMappingURL=LinkButton.esm.js.map\n","import { jsx } from 'react/jsx-runtime';\nimport Typography from '@material-ui/core/Typography';\nimport { Component } from 'react';\nimport { LinkButton } from '../../components/LinkButton/LinkButton.esm.js';\nimport { ErrorPanel } from '../../components/ErrorPanel/ErrorPanel.esm.js';\nimport { coreComponentsTranslationRef } from '../../translation.esm.js';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\nconst SlackLink = (props) => {\n const { slackChannel } = props;\n const { t } = useTranslationRef(coreComponentsTranslationRef);\n if (!slackChannel) {\n return null;\n } else if (typeof slackChannel === \"string\") {\n return /* @__PURE__ */ jsx(Typography, { children: t(\"errorBoundary.title\", { slackChannel }) });\n } else if (!slackChannel.href) {\n return /* @__PURE__ */ jsx(Typography, { children: t(\"errorBoundary.title\", {\n slackChannel: slackChannel.name\n }) });\n }\n return /* @__PURE__ */ jsx(LinkButton, { to: slackChannel.href, variant: \"contained\", children: slackChannel.name });\n};\nconst ErrorBoundary = class ErrorBoundary2 extends Component {\n constructor(props) {\n super(props);\n this.state = {\n error: void 0,\n errorInfo: void 0\n };\n }\n componentDidCatch(error, errorInfo) {\n console.error(`ErrorBoundary, error: ${error}`, { error, errorInfo });\n this.setState({ error, errorInfo });\n }\n render() {\n const { slackChannel, children } = this.props;\n const { error } = this.state;\n if (!error) {\n return children;\n }\n return /* @__PURE__ */ jsx(ErrorPanel, { title: \"Something Went Wrong\", error, children: /* @__PURE__ */ jsx(SlackLink, { slackChannel }) });\n }\n};\n\nexport { ErrorBoundary };\n//# sourceMappingURL=ErrorBoundary.esm.js.map\n","import { jsx, jsxs } from 'react/jsx-runtime';\nimport Card from '@material-ui/core/Card';\nimport CardActions from '@material-ui/core/CardActions';\nimport CardContent from '@material-ui/core/CardContent';\nimport CardHeader from '@material-ui/core/CardHeader';\nimport Divider from '@material-ui/core/Divider';\nimport { makeStyles, withStyles } from '@material-ui/core/styles';\nimport classNames from 'classnames';\nimport { BottomLink } from '../BottomLink/BottomLink.esm.js';\nimport { ErrorBoundary } from '../ErrorBoundary/ErrorBoundary.esm.js';\n\nconst useStyles = makeStyles(\n (theme) => ({\n noPadding: {\n padding: 0,\n \"&:last-child\": {\n paddingBottom: 0\n }\n },\n contentAlignBottom: {\n display: \"flex\",\n alignItems: \"self-end\"\n },\n header: {\n padding: theme.spacing(2, 2, 2, 2.5)\n },\n headerTitle: {\n fontWeight: theme.typography.fontWeightBold\n },\n headerSubheader: {\n paddingTop: theme.spacing(1)\n },\n headerAvatar: {},\n headerAction: {},\n headerContent: {},\n subheader: {\n display: \"flex\"\n }\n }),\n { name: \"BackstageInfoCard\" }\n);\nconst CardActionsTopRight = withStyles(\n (theme) => ({\n root: {\n display: \"inline-block\",\n padding: theme.spacing(8, 8, 0, 0),\n float: \"right\"\n }\n }),\n { name: \"BackstageInfoCardCardActionsTopRight\" }\n)(CardActions);\nconst VARIANT_STYLES = {\n card: {\n flex: {\n display: \"flex\",\n flexDirection: \"column\"\n },\n fullHeight: {\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\"\n },\n gridItem: {\n display: \"flex\",\n flexDirection: \"column\",\n height: \"calc(100% - 10px)\",\n // for pages without content header\n marginBottom: \"10px\",\n breakInside: \"avoid-page\",\n \"@media print\": {\n height: \"auto\"\n }\n }\n },\n cardContent: {\n fullHeight: {\n flex: 1\n },\n gridItem: {\n flex: 1\n }\n }\n};\nfunction InfoCard(props) {\n const {\n title,\n subheader,\n divider = true,\n deepLink,\n slackChannel,\n errorBoundaryProps,\n variant,\n alignContent = \"normal\",\n children,\n headerStyle,\n headerProps,\n icon,\n action,\n actionsClassName,\n actions,\n cardClassName,\n actionsTopRight,\n className,\n noPadding,\n titleTypographyProps,\n subheaderTypographyProps\n } = props;\n const classes = useStyles();\n let calculatedStyle = {};\n let calculatedCardStyle = {};\n if (variant) {\n const variants = variant.split(/[\\s]+/g);\n variants.forEach((name) => {\n calculatedStyle = {\n ...calculatedStyle,\n ...VARIANT_STYLES.card[name]\n };\n calculatedCardStyle = {\n ...calculatedCardStyle,\n ...VARIANT_STYLES.cardContent[name]\n };\n });\n }\n const cardSubTitle = () => {\n if (!subheader && !icon) {\n return null;\n }\n return /* @__PURE__ */ jsxs(\"div\", { \"data-testid\": \"info-card-subheader\", children: [\n subheader && /* @__PURE__ */ jsx(\"div\", { className: classes.subheader, children: subheader }),\n icon\n ] });\n };\n const errProps = errorBoundaryProps || (slackChannel ? { slackChannel } : {});\n return /* @__PURE__ */ jsx(Card, { style: calculatedStyle, className, children: /* @__PURE__ */ jsxs(ErrorBoundary, { ...errProps, children: [\n title && /* @__PURE__ */ jsx(\n CardHeader,\n {\n classes: {\n root: classNames(classes.header),\n title: classes.headerTitle,\n subheader: classes.headerSubheader,\n avatar: classes.headerAvatar,\n action: classes.headerAction,\n content: classes.headerContent\n },\n title,\n subheader: cardSubTitle(),\n action,\n style: { ...headerStyle },\n titleTypographyProps,\n subheaderTypographyProps,\n ...headerProps\n }\n ),\n actionsTopRight && /* @__PURE__ */ jsx(CardActionsTopRight, { children: actionsTopRight }),\n divider && /* @__PURE__ */ jsx(Divider, {}),\n /* @__PURE__ */ jsx(\n CardContent,\n {\n className: classNames(cardClassName, {\n [classes.noPadding]: noPadding,\n [classes.contentAlignBottom]: alignContent === \"bottom\"\n }),\n style: calculatedCardStyle,\n children\n }\n ),\n actions && /* @__PURE__ */ jsx(CardActions, { className: actionsClassName, children: actions }),\n deepLink && /* @__PURE__ */ jsx(BottomLink, { ...deepLink })\n ] }) });\n}\n\nexport { InfoCard };\n//# sourceMappingURL=InfoCard.esm.js.map\n"],"names":["Object","defineProperty","exports","value","tslib_1","react_1","useMountedState_1","__importDefault","fn","deps","initialState","loading","lastCallId","useRef","isMounted","default","_a","useState","state","set","callback","useCallback","args","_i","arguments","length","callId","current","prevState","__assign","apply","then","error","mountedRef","get","useEffect","_interopRequireDefault","_interopRequireWildcard","React","_default","createElement","d","useAsync","useMountedState","useAsyncFn","Progress","props","theme","useTheme","isVisible","setIsVisible","handle","setTimeout","transitions","duration","short","clearTimeout","jsx","LinearProgress","Box","display","LazyOpenApiDefinition","lazy","m","OpenApiDefinition","OpenApiDefinitionWidget","validSubmitMethods","supportedSubmitMethods","map","method","toLocaleLowerCase","Suspense","fallback","children","createSvgIcon","defaultIconMapping","success","SuccessOutlined","fontSize","warning","ReportProblemOutlined","ErrorOutline","info","InfoOutlined","_ref","Close","Alert","ref","action","classes","className","_props$closeText","closeText","color","icon","_props$iconMapping","iconMapping","onClose","_props$role","role","_props$severity","severity","_props$variant","variant","other","Paper","square","elevation","root","concat","capitalize","message","IconButton","size","title","onClick","withStyles","getColor","palette","type","darken","lighten","getBackgroundColor","typography","body2","borderRadius","shape","backgroundColor","padding","standardSuccess","main","standardInfo","standardWarning","standardError","outlinedSuccess","border","outlinedInfo","outlinedWarning","outlinedError","filledSuccess","fontWeight","fontWeightMedium","filledInfo","filledWarning","filledError","marginRight","opacity","alignItems","marginLeft","paddingLeft","name","useAsyncFn_1","useStyles","makeStyles","maxWidth","spacing","boxTitle","margin","textSubtle","arrow","BottomLink","link","jsxs","Divider","to","underline","Typography","A","LinkWrapper","forwardRef","LinkButton","Button","component","SlackLink","slackChannel","t","href","ErrorBoundary","Component","constructor","super","this","errorInfo","componentDidCatch","console","setState","render","noPadding","paddingBottom","contentAlignBottom","header","headerTitle","fontWeightBold","headerSubheader","paddingTop","headerAvatar","headerAction","headerContent","subheader","CardActionsTopRight","float","CardActions","VARIANT_STYLES","card","flex","flexDirection","fullHeight","height","gridItem","marginBottom","breakInside","cardContent","InfoCard","divider","deepLink","errorBoundaryProps","alignContent","headerStyle","headerProps","actionsClassName","actions","cardClassName","actionsTopRight","titleTypographyProps","subheaderTypographyProps","calculatedStyle","calculatedCardStyle","split","forEach","errProps","Card","style","CardHeader","avatar","content","CardContent"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[2821],{12229:(e,t,a)=>{a.d(t,{Z:()=>x});var s=a(31085),n=a(95478),l=a.n(n),i=a(10394),r=a(72501),o=a(64947),c=a(37197),d=a(69621),u=a(12981),p=a(86901),m=a(69076),h=a(58837),g=a(6924),v=a(23164);const A=(0,h.A)(e=>({root:{width:240,minWidth:240,padding:e.spacing(2),borderRight:`1px solid ${e.palette.divider}`,backgroundColor:e.palette.background.paper,height:"100%",overflowY:"auto"},sectionTitle:{fontWeight:600,fontSize:"0.75rem",textTransform:"uppercase",letterSpacing:"0.05em",color:e.palette.text.secondary,marginBottom:e.spacing(1),display:"flex",alignItems:"center",justifyContent:"space-between",cursor:"pointer",userSelect:"none"},filterSection:{marginBottom:e.spacing(2)},checkbox:{padding:e.spacing(.5)},checkboxLabel:{fontSize:"0.875rem"},clearButton:{marginTop:e.spacing(2)},count:{fontSize:"0.75rem",color:e.palette.text.secondary,marginLeft:e.spacing(1)}})),x=({sections:e,filters:t,onChange:a,onClear:n})=>{const h=A(),[x,f]=l().useState(new Set(e.filter(e=>e.collapsed).map(e=>e.id))),y=Object.values(t).some(e=>e.length>0);return(0,s.jsxs)(i.A,{className:h.root,children:[(0,s.jsxs)(i.A,{display:"flex",justifyContent:"space-between",alignItems:"center",mb:2,children:[(0,s.jsx)(r.A,{variant:"subtitle2",children:"Filters"}),y&&(0,s.jsx)(o.A,{size:"small",color:"primary",onClick:()=>{const t={};e.forEach(e=>{t[e.id]=[]}),a(t),null==n||n()},children:"Clear all"})]}),(0,s.jsx)(c.A,{}),e.map(e=>{const n=x.has(e.id),l=(t[e.id]||[]).length;return(0,s.jsxs)(i.A,{className:h.filterSection,mt:2,children:[(0,s.jsxs)(i.A,{className:h.sectionTitle,onClick:()=>{return t=e.id,void f(e=>{const a=new Set(e);return a.has(t)?a.delete(t):a.add(t),a});var t},children:[(0,s.jsxs)(i.A,{display:"flex",alignItems:"center",children:[(0,s.jsx)("span",{children:e.title}),l>0&&(0,s.jsxs)("span",{className:h.count,children:["(",l,")"]})]}),n?(0,s.jsx)(g.A,{fontSize:"small"}):(0,s.jsx)(v.A,{fontSize:"small"})]}),(0,s.jsx)(d.A,{in:!n,children:(0,s.jsx)(u.A,{children:e.options.map(n=>(0,s.jsx)(p.A,{control:(0,s.jsx)(m.A,{checked:(t[e.id]||[]).includes(n.value),onChange:()=>((e,s)=>{const n=t[e]||[],l=n.includes(s)?n.filter(e=>e!==s):[...n,s];a({...t,[e]:l})})(e.id,n.value),size:"small",className:h.checkbox,color:"primary"}),label:(0,s.jsxs)(i.A,{display:"flex",alignItems:"center",children:[(0,s.jsx)("span",{className:h.checkboxLabel,children:n.label}),void 0!==n.count&&(0,s.jsxs)("span",{className:h.count,children:["(",n.count,")"]})]})},n.value))})})]},e.id)})]})}},38599:(e,t,a)=>{a.d(t,{B:()=>o});var s=a(31085),n=(a(95478),a(10394)),l=a(72501),i=a(4387),r=a(46205);const o=({children:e,permission:t,fallback:a,errorMessage:o})=>{const{allowed:c,loading:d,error:u}=(0,r.l)(t);return d?(0,s.jsx)(n.A,{p:2,children:[...Array(5)].map((e,t)=>(0,s.jsx)(n.A,{p:2,children:(0,s.jsx)(i.A,{variant:"text",width:"100%"})},t))}):u?(0,s.jsxs)(n.A,{p:4,children:[(0,s.jsxs)(l.A,{color:"error",children:["Unable to check permissions: ",u.message]}),(0,s.jsx)(l.A,{variant:"body2",color:"textSecondary",children:"Please try again or contact your administrator"})]}):c?(0,s.jsx)(s.Fragment,{children:e}):a?(0,s.jsx)(s.Fragment,{children:a}):(0,s.jsxs)(n.A,{p:4,children:[(0,s.jsx)(l.A,{color:"textSecondary",children:o||"You don't have permission to view this page"}),(0,s.jsx)(n.A,{mt:1,children:(0,s.jsxs)(l.A,{variant:"caption",color:"textSecondary",children:["Required permission: ",t.name]})})]})}},46299:(e,t,a)=>{a.d(t,{ee:()=>l,g9:()=>s,uU:()=>n});const s=e=>{const t={border:"none"};switch(e){case"Approved":return{...t,backgroundColor:"#1976d2",color:"#fff"};case"Denied":return{...t,backgroundColor:"#d32f2f",color:"#fff"};case"Failed":return{...t,backgroundColor:"#ed6c02",color:"#fff"};default:return{...t,backgroundColor:"#9c27b0",color:"#fff"}}},n=e=>{const t={border:"none"};switch(e){case"Approved":return{...t,backgroundColor:"#2e7d32",color:"#fff"};case"Denied":return{...t,backgroundColor:"#d32f2f",color:"#fff"};default:return{...t,backgroundColor:"#ed6c02",color:"#fff"}}},l=e=>{switch(e){case"production":return{backgroundColor:"#1976d2",color:"#fff"};case"experimental":return{backgroundColor:"#9c27b0",color:"#fff"};case"deprecated":return{backgroundColor:"#ff9800",color:"#fff"};case"retired":return{backgroundColor:"#d32f2f",color:"#fff"};default:return{}}}},80243:(e,t,a)=>{a.r(t),a.d(t,{ApiProductsPage:()=>le});var s=a(31085),n=a(95478),l=a(58837),i=a(10394),r=a(67720),o=a(72501),c=a(64947),d=a(29365),u=a(4387),p=a(18466),m=a(39590),h=a(75625),g=a(21702),v=a(85142),A=a(12229),x=a(37725),f=a(289),y=a(15831),j=a(45210),b=a(46681),P=a(42367),S=a(25010),C=a(91638),w=a(22097),k=a(84692),I=a(70980),T=a(38599),N=a(76891),R=a(61477),z=a(46805),D=a(42899),L=a(16249),$=a(34839),M=a(71677),H=a(26343),W=a(95061),E=a(29635),K=a(86901),B=a(30285),q=a(93453),F=a(78467),O=a(89031),U=a(48351),_=a(86197),Y=a(24170),V=a(97859);const Z=(0,l.A)(e=>({asterisk:{color:"#f44336"},sectionHeader:{display:"flex",alignItems:"center",gap:e.spacing(.5),marginTop:e.spacing(2),marginBottom:e.spacing(1)},infoIcon:{fontSize:18,color:e.palette.text.secondary},tagChip:{marginRight:e.spacing(.5),marginBottom:e.spacing(.5)}})),G=({open:e,onClose:t,onSuccess:a})=>{var l,u,m,h,g,v;const A=Z(),x=(0,w.useApi)(I.s),[f,y]=(0,n.useState)(""),[j,b]=(0,n.useState)(""),[P,S]=(0,n.useState)(""),[k,T]=(0,n.useState)("v1"),[G,J]=(0,n.useState)("manual"),[X,Q]=(0,n.useState)("Published"),[ee,te]=(0,n.useState)("production"),[ae,se]=(0,n.useState)([]),[ne,le]=(0,n.useState)(""),[ie,re]=(0,n.useState)(""),[oe,ce]=(0,n.useState)(""),[de,ue]=(0,n.useState)(""),[pe,me]=(0,n.useState)(""),[he,ge]=(0,n.useState)(""),[ve,Ae]=(0,n.useState)(""),[xe,fe]=(0,n.useState)(!1),[ye,je]=(0,n.useState)(0),[be,Pe]=(0,n.useState)(null),[Se,Ce]=(0,n.useState)(null),[we,ke]=(0,n.useState)(""),[Ie,Te]=(0,n.useState)("name"),{value:Ne,loading:Re,error:ze}=(0,C.A)(async()=>(await x.getHttpRoutes()).items||[],[x,e,ye]),{value:De,error:Le}=(0,C.A)(async()=>await x.getPlanPolicies(),[x,e]),{value:$e,error:Me}=(0,C.A)(async()=>await x.getAuthPolicies(),[x,e]),{value:He,error:We}=(0,C.A)(async()=>await x.getRateLimitPolicies(),[x,e]),Ee=(e,t)=>(0,V.d)(null==De?void 0:De.items,e,t),Ke=ie?ie.split("/"):null,Be=Ke?Ee(Ke[0],Ke[1]):null,qe=null==Be||null===(u=Be.status)||void 0===u||null===(l=u.conditions)||void 0===l?void 0:l.find(e=>"Accepted"===e.type),Fe=Ke?(Oe=Ke[0],Ue=Ke[1],(0,V.d)(null==$e?void 0:$e.items,Oe,Ue)):null;var Oe,Ue;const _e=null==Fe||null===(h=Fe.status)||void 0===h||null===(m=h.conditions)||void 0===m?void 0:m.find(e=>"Accepted"===e.type),Ye=Ke?((e,t)=>(0,V.d)(null==He?void 0:He.items,e,t))(Ke[0],Ke[1]):null,Ve=null==Ye||null===(v=Ye.status)||void 0===v||null===(g=v.conditions)||void 0===g?void 0:g.find(e=>"Accepted"===e.type),Ze={statusCondition:qe,discoveredPlans:null==Be?void 0:Be.spec.plans},Ge={namespacedName:{namespace:null==Fe?void 0:Fe.metadata.namespace,name:null==Fe?void 0:Fe.metadata.name},statusCondition:_e},Je={namespacedName:{namespace:null==Ye?void 0:Ye.metadata.namespace,name:null==Ye?void 0:Ye.metadata.name},statusCondition:Ve},Xe=(e,t)=>{const a=Ee(e,t);return a?`${a.metadata.name}${(e=>{var t;if(!(null==e||null===(t=e.spec)||void 0===t?void 0:t.plans))return"";const a=Object.entries(e.spec.plans).map(([e,t])=>{var a;const s=null==t||null===(a=t.limits)||void 0===a?void 0:a.requests;return s?`${e}: ${s.count}/${s.period}`:e}).join("; ");return a?` (${a})`:""})(a)}`:"N/A"};(0,n.useEffect)(()=>{e&&(Pe(null),Ce(null))},[e]);const Qe=()=>{ne.trim()&&!ae.includes(ne.trim())&&(se([...ae,ne.trim()]),le(""))},et=()=>{y(""),b(""),S(""),T("v1"),J("manual"),Q("Published"),te("production"),se([]),le(""),re(""),ce(""),ue(""),me(""),ge(""),Ae(""),Pe(null),Ce(null),t()},tt=!!be||!!Se;return(0,s.jsxs)(N.A,{open:e,onClose:et,maxWidth:"md",fullWidth:!0,children:[(0,s.jsx)(R.A,{children:"Create API Product"}),(0,s.jsxs)(z.A,{children:[ve&&(0,s.jsx)(U.A,{severity:"error",style:{marginBottom:16},children:ve}),ze&&(0,s.jsxs)(U.A,{severity:"error",style:{marginBottom:16},children:[(0,s.jsx)("strong",{children:"Failed to load HTTPRoutes:"})," ",ze.message,(0,s.jsx)(i.A,{mt:1,children:(0,s.jsx)(c.A,{size:"small",variant:"outlined",onClick:()=>je(e=>e+1),children:"Retry"})})]}),Le&&(0,s.jsxs)(U.A,{severity:"warning",style:{marginBottom:16},children:[(0,s.jsx)("strong",{children:"Failed to load PlanPolicies:"})," ",Le.message,(0,s.jsx)(o.A,{variant:"body2",style:{marginTop:8},children:"You can still create the API Product, but plan information may be incomplete."})]}),Me&&(0,s.jsxs)(U.A,{severity:"warning",style:{marginBottom:16},children:[(0,s.jsx)("strong",{children:"Failed to load AuthPolicies:"})," ",Me.message]}),We&&(0,s.jsxs)(U.A,{severity:"warning",style:{marginBottom:16},children:[(0,s.jsx)("strong",{children:"Failed to load RateLimitPolicies:"})," ",We.message]}),(0,s.jsx)(i.A,{className:A.sectionHeader,children:(0,s.jsx)(o.A,{variant:"subtitle1",children:(0,s.jsx)("strong",{children:"API product info"})})}),(0,s.jsxs)(D.A,{container:!0,spacing:2,children:[(0,s.jsx)(D.A,{item:!0,xs:6,children:(0,s.jsx)(L.A,{fullWidth:!0,label:"API product name",value:j,onChange:e=>(e=>{if(b(e),!f||f.match(/-[a-f0-9]{6}$/)){const t=`${e.toLowerCase().replace(/[^a-z0-9-]/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"")}-${Math.floor(16777215*Math.random()).toString(16).padStart(6,"0")}`;y(t),Pe((0,Y.o)(t))}})(e.target.value),placeholder:"My API",helperText:"Display name for your API product (shown to users)",margin:"normal",required:!0,disabled:xe,InputLabelProps:{classes:{asterisk:A.asterisk}}})}),(0,s.jsx)(D.A,{item:!0,xs:6,children:(0,s.jsx)(L.A,{fullWidth:!0,label:"Kubernetes resource name",value:f,onChange:e=>{return t=e.target.value,y(t),void Pe((0,Y.o)(t));var t},placeholder:"my-api",helperText:be||"Auto-generated from product name. Only lowercase, numbers, and hyphens allowed.",error:!!be,margin:"normal",required:!0,disabled:xe,InputLabelProps:{classes:{asterisk:A.asterisk}}})}),(0,s.jsx)(D.A,{item:!0,xs:6,children:(0,s.jsx)(L.A,{fullWidth:!0,label:"Version",value:k,onChange:e=>T(e.target.value),placeholder:"v1",helperText:"Give a version to your API product",margin:"normal",required:!0,disabled:xe,InputLabelProps:{classes:{asterisk:A.asterisk}}})}),(0,s.jsx)(D.A,{item:!0,xs:6,children:(0,s.jsx)(L.A,{fullWidth:!0,label:"Tag",value:ne,onChange:e=>le(e.target.value),onKeyPress:e=>{"Enter"===e.key&&(e.preventDefault(),Qe())},placeholder:"Add tag",helperText:"Add a tag to your API product",margin:"normal",disabled:xe,InputProps:{endAdornment:ne?(0,s.jsx)($.A,{position:"end",children:(0,s.jsx)(d.A,{size:"small",onClick:Qe,disabled:xe,children:(0,s.jsx)(p.A,{fontSize:"small"})})}):void 0}})}),ae.length>0&&(0,s.jsx)(D.A,{item:!0,xs:12,children:(0,s.jsx)(i.A,{display:"flex",flexWrap:"wrap",children:ae.map(e=>(0,s.jsx)(r.A,{label:e,onDelete:xe?void 0:()=>{return t=e,void se(ae.filter(e=>e!==t));var t},size:"small",className:A.tagChip,disabled:xe},e))})}),(0,s.jsx)(D.A,{item:!0,xs:12,children:(0,s.jsx)(L.A,{fullWidth:!0,label:"Description",value:P,onChange:e=>S(e.target.value),placeholder:"API description",margin:"normal",multiline:!0,rows:2,required:!0,disabled:xe,InputLabelProps:{classes:{asterisk:A.asterisk}}})})]}),(0,s.jsxs)(i.A,{className:A.sectionHeader,children:[(0,s.jsx)(o.A,{variant:"subtitle1",children:(0,s.jsx)("strong",{children:"Add API and Associate route"})}),(0,s.jsx)(M.Ay,{title:"Register an existing API and associate HTTPRoute for your API product",children:(0,s.jsx)(O.A,{className:A.infoIcon})})]}),(0,s.jsxs)(D.A,{container:!0,spacing:2,children:[(0,s.jsx)(D.A,{item:!0,xs:12,children:(0,s.jsx)(L.A,{fullWidth:!0,label:"OpenAPI Spec URL",value:he,onChange:e=>{return t=e.target.value,ge(t),void Ce((0,Y.q)(t));var t},placeholder:"https://api.example.com/openapi.json",helperText:Se||"Enter the full path to your API spec file",error:!!Se,margin:"normal",disabled:xe})}),(0,s.jsx)(D.A,{item:!0,xs:12,children:(0,s.jsx)(L.A,{fullWidth:!0,label:"Documentation URL",value:pe,onChange:e=>me(e.target.value),placeholder:"https://docs.example.com/api",helperText:"Link to external documentation for this API",margin:"normal",disabled:xe})}),(0,s.jsx)(D.A,{item:!0,xs:12,children:(0,s.jsxs)(L.A,{fullWidth:!0,select:!0,label:"HTTPRoute",value:ie,onChange:e=>re(e.target.value),margin:"normal",required:!0,helperText:ze?"Unable to load HTTPRoutes. Please retry.":"Select an HTTPRoute. APIProduct will be created in the same namespace.",error:!!ze,disabled:Re||xe||!!ze,InputLabelProps:{classes:{asterisk:A.asterisk}},SelectProps:{"data-testid":"httproute-select",MenuProps:{PaperProps:{style:{maxHeight:400}},anchorOrigin:{vertical:"bottom",horizontal:"left"},transformOrigin:{vertical:"top",horizontal:"left"},getContentAnchorEl:null}},children:[(0,s.jsx)(i.A,{px:2,pt:1,pb:1,style:{position:"sticky",top:0,zIndex:1},children:(0,s.jsx)(L.A,{fullWidth:!0,size:"small",placeholder:"Search...",value:we,onChange:e=>ke(e.target.value),onKeyDown:e=>e.stopPropagation(),onClick:e=>e.stopPropagation(),InputProps:{endAdornment:(0,s.jsx)($.A,{position:"end",children:(0,s.jsxs)(L.A,{select:!0,size:"small",value:Ie,onChange:e=>Te(e.target.value),onKeyDown:e=>e.stopPropagation(),onClick:e=>e.stopPropagation(),style:{minWidth:120},variant:"standard",children:[(0,s.jsx)(H.A,{value:"name",children:"Name"}),(0,s.jsx)(H.A,{value:"namespace",children:"Namespace"}),(0,s.jsx)(H.A,{value:"planpolicy",children:"PlanPolicy"})]})})}})}),Re&&(0,s.jsx)(H.A,{value:"",children:"Loading..."}),ze&&(0,s.jsx)(H.A,{value:"",children:"Error loading routes"}),!Re&&!ze&&Ne&&0===Ne.length&&(0,s.jsx)(H.A,{value:"",children:"No HTTPRoutes available"}),!Re&&!ze&&Ne&&Ne.filter(e=>{if(!we)return!0;const t=e.metadata.namespace,a=e.metadata.name,s=Xe(t,a),n=we.toLowerCase();switch(Ie){case"name":return a.toLowerCase().includes(n);case"namespace":return t.toLowerCase().includes(n);case"planpolicy":return s.toLowerCase().includes(n);default:return!0}}).map(e=>{const t=e.metadata.namespace,a=e.metadata.name,n=Xe(t,a);return(0,s.jsx)(H.A,{value:`${t}/${a}`,children:(0,s.jsxs)(i.A,{children:[(0,s.jsx)(o.A,{variant:"body1",children:a}),(0,s.jsxs)(o.A,{variant:"caption",color:"textSecondary",children:["Associated PlanPolicy: ",n]})]})},`${t}/${a}`)})]})})]}),ie&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(i.A,{className:A.sectionHeader,children:[(0,s.jsx)(o.A,{variant:"subtitle1",children:(0,s.jsx)("strong",{children:"HTTPRoute policies"})}),(0,s.jsx)(M.Ay,{title:"Shows the associated policies and rate limit tiers for the selected HTTPRoute",children:(0,s.jsx)(O.A,{className:A.infoIcon})})]}),(0,s.jsx)(_.K,{planPolicy:Ze,authPolicy:Ge,rateLimitPolicy:Je,includeTopMargin:!1})]}),(0,s.jsxs)(i.A,{className:A.sectionHeader,children:[(0,s.jsx)(o.A,{variant:"subtitle1",children:(0,s.jsx)("strong",{children:"Lifecycle and Visibility"})}),(0,s.jsx)(M.Ay,{title:"Control the lifecycle state and catalog visibility of this API product",children:(0,s.jsx)(O.A,{className:A.infoIcon})})]}),(0,s.jsxs)(D.A,{container:!0,spacing:2,children:[(0,s.jsx)(D.A,{item:!0,xs:6,children:(0,s.jsxs)(L.A,{fullWidth:!0,select:!0,label:"Lifecycle",value:ee,onChange:e=>te(e.target.value),margin:"normal",helperText:"API lifecycle state",disabled:xe,children:[(0,s.jsx)(H.A,{value:"experimental",children:"Experimental"}),(0,s.jsx)(H.A,{value:"production",children:"Production"}),(0,s.jsx)(H.A,{value:"deprecated",children:"Deprecated"}),(0,s.jsx)(H.A,{value:"retired",children:"Retired"})]})}),(0,s.jsx)(D.A,{item:!0,xs:6,children:(0,s.jsxs)(L.A,{fullWidth:!0,select:!0,label:"Publish Status",value:X,onChange:e=>Q(e.target.value),margin:"normal",helperText:"Controls catalog visibility (Draft = hidden from consumers)",disabled:xe,children:[(0,s.jsx)(H.A,{value:"Draft",children:"Draft"}),(0,s.jsx)(H.A,{value:"Published",children:"Published"})]})})]}),(0,s.jsxs)(i.A,{className:A.sectionHeader,children:[(0,s.jsx)(o.A,{variant:"subtitle1",children:(0,s.jsx)("strong",{children:"API Key approval"})}),(0,s.jsx)(M.Ay,{title:"Choose how API key requests are handled for this product",children:(0,s.jsx)(O.A,{className:A.infoIcon})})]}),(0,s.jsx)(W.A,{component:"fieldset",disabled:xe,children:(0,s.jsxs)(E.A,{row:!0,value:G,onChange:e=>J(e.target.value),children:[(0,s.jsx)(K.A,{value:"manual",control:(0,s.jsx)(B.A,{color:"primary"}),label:(0,s.jsxs)(i.A,{children:[(0,s.jsx)(o.A,{variant:"body2",children:"Need manual approval"}),(0,s.jsx)(o.A,{variant:"caption",color:"textSecondary",children:"Requires approval for requesting this API"})]})}),(0,s.jsx)(K.A,{value:"automatic",control:(0,s.jsx)(B.A,{color:"primary"}),label:(0,s.jsxs)(i.A,{children:[(0,s.jsx)(o.A,{variant:"body2",children:"Automatic"}),(0,s.jsx)(o.A,{variant:"caption",color:"textSecondary",children:"Keys are created without need to be approved"})]})})]})})]}),(0,s.jsxs)(q.A,{children:[(0,s.jsx)(c.A,{onClick:et,disabled:xe,children:"Cancel"}),(0,s.jsx)(c.A,{onClick:async()=>{Ae(""),fe(!0);try{if(!ie)throw new Error("Please select an HTTPRoute");const[e,t]=ie.split("/"),s=e,n={apiVersion:"devportal.kuadrant.io/v1alpha1",kind:"APIProduct",metadata:{name:f,namespace:s,labels:{lifecycle:ee}},spec:{displayName:j,description:P,version:k,approvalMode:G,publishStatus:X,tags:ae,targetRef:{group:"gateway.networking.k8s.io",kind:"HTTPRoute",name:t,namespace:e},...oe||de?{contact:{...oe&&{email:oe},...de&&{team:de}}}:{},...pe||he?{documentation:{...pe&&{docsURL:pe},...he&&{openAPISpecURL:he}}}:{}}};await x.createApiProduct(n),a({namespace:s,name:f,displayName:j}),et()}catch(e){Ae(e instanceof Error?e.message:String(e))}finally{fe(!1)}},color:"primary",variant:"contained",disabled:xe||!f||!j||!P||!ie||tt,startIcon:xe?(0,s.jsx)(F.A,{size:16,color:"inherit"}):void 0,children:xe?"Creating...":"Create"})]})]})};var J=a(34955),X=a(46205),Q=a(26997),ee=a(63221),te=a(46299);const ae=a.p+"static/empty-state-illustration.7e3ad5a9..png",se=(0,l.A)(e=>({container:{display:"flex",height:"100%",minHeight:400},tableContainer:{flex:1,overflow:"auto",padding:10},emptyState:{display:"flex",alignItems:"center",justifyContent:"center",padding:e.spacing(6),minHeight:400},emptyStateContent:{display:"flex",alignItems:"center",gap:e.spacing(6),maxWidth:900},emptyStateText:{flex:1},emptyStateTitle:{marginBottom:e.spacing(2)},emptyStateDescription:{marginBottom:e.spacing(3),color:e.palette.text.secondary},emptyStateImage:{maxWidth:400,height:"auto"}})),ne=()=>{const e=se(),t=(0,w.useApi)(I.s),a=(0,w.useApi)(w.alertApiRef),l=(0,w.useApi)(w.identityApiRef),T=(0,w.useApi)(k.v),[N,R]=(0,n.useState)(""),[z,D]=(0,n.useState)(!1),[L,$]=(0,n.useState)(!1),[M,H]=(0,n.useState)(0),[W,E]=(0,n.useState)(!1),[K,B]=(0,n.useState)(null),[q,F]=(0,n.useState)(null),[O,U]=(0,n.useState)(!1),[_,Y]=(0,n.useState)(null),[V,Z]=(0,n.useState)({status:[],lifecycle:[],policy:[],route:[],namespace:[],tags:[],authentication:[]}),{allowed:ne,loading:le,error:ie}=(0,X.l)(J.FL),{allowed:re,loading:oe}=(0,X.l)(J.EM),{allowed:ce,loading:de,error:ue}=(0,X.l)(J.R_),{allowed:pe}=(0,X.l)(J.U3),{allowed:me}=(0,X.l)(J.v_),he=oe||de,{allowed:ge,loading:ve,error:Ae}=(0,X.l)(J.J);(0,C.A)(async()=>{const e=await l.getBackstageIdentity();R(e.userEntityRef)},[l]);const{value:xe,loading:fe,error:ye}=(0,C.A)(async()=>t.getApiProducts(),[t,M]),{value:je,loading:be,error:Pe}=(0,C.A)(async()=>ge?t.getPlanPolicies():{items:[]},[t,M,ge]),{value:Se}=(0,C.A)(async()=>(await T.getEntities({filter:{kind:"API","metadata.labels.kuadrant.io/synced":"true"},fields:["metadata.name","spec.lifecycle"]})).items,[T,M]),Ce=(0,n.useMemo)(()=>{const e=new Map;if(Se)for(const a of Se){var t;const s=null===(t=a.spec)||void 0===t?void 0:t.lifecycle;s&&e.set(a.metadata.name,s)}return e},[Se]),we=(0,n.useCallback)(e=>Ce.get(e.metadata.name),[Ce]),ke=(0,n.useCallback)(e=>{var t;if(!(null==je?void 0:je.items))return null;const a=null===(t=e.spec)||void 0===t?void 0:t.targetRef;if(!a)return null;const s=je.items.find(t=>{const s=t.spec.targetRef;return"HTTPRoute"===(null==s?void 0:s.kind)&&(null==s?void 0:s.name)===a.name&&(!(null==s?void 0:s.namespace)||(null==s?void 0:s.namespace)===(a.namespace||e.metadata.namespace))});return(null==s?void 0:s.metadata.name)||null},[je]),Ie=(0,n.useCallback)(e=>{var t,a;const s=(null===(a=e.status)||void 0===a||null===(t=a.discoveredAuthScheme)||void 0===t?void 0:t.authentication)||{},n=Object.values(s),l=[];return n.some(e=>e.hasOwnProperty("apiKey"))&&l.push("API Key"),n.some(e=>e.hasOwnProperty("jwt"))&&l.push("OIDC"),0===l.length&&l.push("Unknown"),l},[]),Te=fe||be||le||he||ve,Ne=ye||Pe,Re=ie||ue||Ae,ze=(0,n.useMemo)(()=>{const e=(null==xe?void 0:xe.items)||[];return ne||pe||me?e:e.filter(e=>{var t;return"Published"===((null===(t=e.spec)||void 0===t?void 0:t.publishStatus)||"Draft")})},[xe,ne,pe,me]),De=(0,n.useMemo)(()=>{const e={Draft:0,Published:0},t=new Map,a=new Map,s=new Map,n=new Map,l=new Map,i=new Map;ze.forEach(r=>{var o,c,d,u;const p=(null===(o=r.spec)||void 0===o?void 0:o.publishStatus)||"Draft";e[p]++;const m=we(r);m&&t.set(m,(t.get(m)||0)+1);const h=ke(r)||"N/A";a.set(h,(a.get(h)||0)+1);const g=(null===(d=r.spec)||void 0===d||null===(c=d.targetRef)||void 0===c?void 0:c.name)||"unknown";s.set(g,(s.get(g)||0)+1);const v=r.metadata.namespace;n.set(v,(n.get(v)||0)+1),((null===(u=r.spec)||void 0===u?void 0:u.tags)||[]).forEach(e=>{l.set(e,(l.get(e)||0)+1)}),Ie(r).forEach(e=>{i.set(e,(i.get(e)||0)+1)})});const r=[{id:"status",title:"Publish Status",options:[{value:"Draft",label:"Draft",count:e.Draft},{value:"Published",label:"Published",count:e.Published}]},{id:"lifecycle",title:"Lifecycle",options:Array.from(t.entries()).map(([e,t])=>({value:e,label:e.charAt(0).toUpperCase()+e.slice(1),count:t}))},{id:"authentication",title:"Authentication",options:Array.from(i.entries()).map(([e,t])=>({value:e,label:e,count:t}))},{id:"route",title:"Route",options:Array.from(s.entries()).map(([e,t])=>({value:e,label:e,count:t})),collapsed:s.size>5},{id:"namespace",title:"Namespace",options:Array.from(n.entries()).map(([e,t])=>({value:e,label:e,count:t})),collapsed:n.size>5},{id:"tags",title:"Tags",options:Array.from(l.entries()).map(([e,t])=>({value:e,label:e,count:t})),collapsed:l.size>5}];return ge&&r.splice(2,0,{id:"policy",title:"Policy",options:Array.from(a.entries()).map(([e,t])=>({value:e,label:e,count:t})),collapsed:a.size>5}),r},[ze,ke,Ie,we,ge]),Le=(0,n.useMemo)(()=>ze.filter(e=>{if(V.status.length>0){var t;const a=(null===(t=e.spec)||void 0===t?void 0:t.publishStatus)||"Draft";if(!V.status.includes(a))return!1}if(V.lifecycle&&V.lifecycle.length>0){const t=we(e);if(!t||!V.lifecycle.includes(t))return!1}if(V.authentication.length>0){const t=Ie(e);if(!V.authentication.some(e=>t.includes(e)))return!1}if(V.policy.length>0){const t=ke(e)||"N/A";if(!V.policy.includes(t))return!1}if(V.route.length>0){var a,s;const t=(null===(s=e.spec)||void 0===s||null===(a=s.targetRef)||void 0===a?void 0:a.name)||"unknown";if(!V.route.includes(t))return!1}if(V.namespace.length>0&&!V.namespace.includes(e.metadata.namespace))return!1;if(V.tags.length>0){var n;const t=(null===(n=e.spec)||void 0===n?void 0:n.tags)||[];if(!V.tags.some(e=>t.includes(e)))return!1}return!0}),[ze,V,ke,Ie,we]),$e=[{title:"Name",field:"spec.displayName",render:e=>{var t,a;const n=null!==(a=null===(t=e.spec)||void 0===t?void 0:t.displayName)&&void 0!==a?a:e.metadata.name;return(0,s.jsx)(x.N_,{to:`/kuadrant/api-products/${e.metadata.namespace}/${e.metadata.name}`,children:(0,s.jsx)("strong",{children:n})})},customFilterAndSearch:(e,t)=>{var a;return((null===(a=t.spec)||void 0===a?void 0:a.displayName)||t.metadata.name||"").toLowerCase().includes(e.toLowerCase())}},{title:"Version",field:"spec.version",render:e=>{var t;return(null===(t=e.spec)||void 0===t?void 0:t.version)||"-"}},{title:"Route",field:"spec.targetRef.name",render:e=>{var t,a;return(null===(a=e.spec)||void 0===a||null===(t=a.targetRef)||void 0===t?void 0:t.name)||"-"}},...ge?[{title:"Policy",field:"policy",render:e=>ke(e)||"N/A"}]:[],{title:"Tags",field:"spec.tags",render:e=>{var t;const a=(null===(t=e.spec)||void 0===t?void 0:t.tags)||[];return 0===a.length?"-":(0,s.jsx)(i.A,{display:"flex",style:{gap:4,flexWrap:"wrap"},children:a.map(e=>(0,s.jsx)(r.A,{label:e,size:"small",variant:"outlined"},e))})}},{title:"Status",field:"spec.publishStatus",render:e=>{var t;const a=(null===(t=e.spec)||void 0===t?void 0:t.publishStatus)||"Draft";return(0,s.jsx)(r.A,{label:a,size:"small",color:"Published"===a?"primary":"default"})}},{title:"Lifecycle",render:e=>{const t=we(e);return t?(0,s.jsx)(r.A,{label:t.charAt(0).toUpperCase()+t.slice(1),size:"small",style:(0,te.ee)(t)}):"-"}},{title:"Authentication",field:"status.discoveredAuthScheme",render:e=>{var t,a;const n=(null===(a=e.status)||void 0===a||null===(t=a.discoveredAuthScheme)||void 0===t?void 0:t.authentication)||{},l=Object.values(n),c=l.some(e=>e.hasOwnProperty("apiKey")),d=l.some(e=>e.hasOwnProperty("jwt"));return c||d?(0,s.jsxs)(i.A,{display:"flex",style:{gap:4},children:[c&&(0,s.jsx)(r.A,{icon:(0,s.jsx)(g.A,{}),label:"API Key",size:"small",color:"primary"}),d&&(0,s.jsx)(r.A,{icon:(0,s.jsx)(v.A,{}),label:"OIDC",size:"small",color:"secondary"})]}):(0,s.jsx)(o.A,{variant:"body2",style:{fontStyle:"italic"},children:"unknown"})}},{title:"Namespace",field:"metadata.namespace"},{title:"Actions",field:"actions",filtering:!1,render:e=>{var n,l,r;const o=(null===(l=e.metadata)||void 0===l||null===(n=l.annotations)||void 0===n?void 0:n["backstage.io/owner"])===N,u=me||pe&&o,p=ce||re&&o,g="Published"===(null===(r=e.spec)||void 0===r?void 0:r.publishStatus);return(0,s.jsxs)(i.A,{display:"flex",alignItems:"center",style:{gap:4},children:[u&&(0,s.jsx)(c.A,{size:"small",color:"primary",onClick:()=>(async e=>{var s,n;const l=e.metadata.namespace,i=e.metadata.name,r=(null===(s=e.spec)||void 0===s?void 0:s.displayName)||i,o="Published"===((null===(n=e.spec)||void 0===n?void 0:n.publishStatus)||"Draft")?"Draft":"Published";if("Published"===o&&"retired"===we(e))return void a.post({message:"Cannot publish a retired API product. Please change the lifecycle status first.",severity:"error",display:"transient"});const c={spec:{publishStatus:o}};try{await t.updateApiProduct(l,i,c),H(e=>e+1),a.post({message:`"${r}" ${"Published"===o?"published":"unpublished"} successfully`,severity:"success",display:"transient"})}catch(e){const t=e instanceof Error?e.message:"unknown error occurred";a.post({message:`Failed to update publish status: ${t}`,severity:"error",display:"transient"})}})(e),style:{marginRight:4,textTransform:"none"},children:g?"Unpublish":"Publish"}),u&&(0,s.jsx)(d.A,{size:"small",onClick:()=>{return t=e.metadata.namespace,a=e.metadata.name,F({namespace:t,name:a}),void $(!0);var t,a},title:"Edit API Product",children:(0,s.jsx)(h.A,{fontSize:"small"})}),p&&(0,s.jsx)(d.A,{size:"small",onClick:()=>(async(e,s)=>{B({namespace:e,name:s}),Y(null);try{const a=(await t.getAllRequestsByApiProduct(s,e)).items||[],n=a.filter(e=>{var t;return"Approved"===(null===(t=e.status)||void 0===t?void 0:t.phase)}).length;Y({requests:a.length,secrets:n})}catch(e){const t=e instanceof Error?e.message:"unknown error occurred";a.post({message:`Failed to delete access request: ${t}`,severity:"error",display:"transient"})}finally{E(!0)}})(e.metadata.namespace,e.metadata.name),title:"Delete API Product",children:(0,s.jsx)(m.A,{fontSize:"small"})})]})}}];return(0,s.jsxs)(f.Y,{themeId:"tool",children:[(0,s.jsx)(y.Y,{title:"API Products",subtitle:"Manage API products for Kubernetes",children:(0,s.jsx)(j.Y,{children:"Manage API products and plan policies"})}),(0,s.jsxs)(b.U,{children:[Te&&(0,s.jsx)(i.A,{p:2,children:[...Array(5)].map((e,t)=>(0,s.jsx)(i.A,{p:2,children:(0,s.jsx)(u.A,{variant:"text",width:"100%"})},t))}),Ne&&(0,s.jsx)(P._,{error:Ne}),Re&&(0,s.jsxs)(i.A,{p:2,children:[(0,s.jsxs)(o.A,{color:"error",children:["unable to check permissions: ",Re.message]}),(0,s.jsxs)(o.A,{variant:"body2",color:"textSecondary",children:["permission:"," ",ie?"kuadrant.apiproduct.create":ue?"kuadrant.apiproduct.delete":Ae?"kuadrant.planpolicy.list":"unknown"]}),(0,s.jsx)(o.A,{variant:"body2",color:"textSecondary",children:"please try again or contact your administrator"})]}),!Te&&!Ne&&!Re&&0===ze.length&&(0,s.jsx)(i.A,{className:e.emptyState,children:(0,s.jsxs)(i.A,{className:e.emptyStateContent,children:[(0,s.jsxs)(i.A,{className:e.emptyStateText,children:[(0,s.jsx)(o.A,{variant:"h4",className:e.emptyStateTitle,children:"API Product"}),(0,s.jsx)(o.A,{variant:"body1",className:e.emptyStateDescription,children:"Create API product by registering existing API, associate route and policy"}),ne&&(0,s.jsx)(c.A,{variant:"contained",color:"primary",startIcon:(0,s.jsx)(p.A,{}),onClick:()=>D(!0),children:"Create API Product"})]}),(0,s.jsx)("img",{src:ae,alt:"API Product illustration",className:e.emptyStateImage})]})}),!Te&&!Ne&&!Re&&ze.length>0&&(0,s.jsxs)(i.A,{className:e.container,children:[(0,s.jsx)(A.Z,{sections:De,filters:V,onChange:Z}),(0,s.jsxs)(i.A,{className:e.tableContainer,children:[(0,s.jsx)(i.A,{display:"flex",justifyContent:"flex-end",mb:2,children:ne&&(0,s.jsx)(c.A,{variant:"contained",color:"primary",size:"small",startIcon:(0,s.jsx)(p.A,{}),onClick:()=>D(!0),children:"Create API Product"})}),0===Le.length?(0,s.jsx)(i.A,{p:4,textAlign:"center",children:(0,s.jsx)(o.A,{variant:"body1",color:"textSecondary",children:"No API products match the selected filters."})}):(0,s.jsx)(S.X,{options:{paging:Le.length>10,pageSize:20,search:!0,filtering:!1,debounceInterval:300,toolbar:!0,emptyRowsWhenPaging:!1},columns:$e,data:Le})]})]}),(0,s.jsx)(G,{open:z,onClose:()=>D(!1),onSuccess:e=>{H(e=>e+1),a.post({message:`"${e.displayName}" created successfully`,severity:"success",display:"transient"})}}),(0,s.jsx)(Q.C,{open:L,onClose:()=>$(!1),onSuccess:()=>{H(e=>e+1);const e=(null==q?void 0:q.name)||"API Product";a.post({message:`"${e}" updated successfully`,severity:"success",display:"transient"})},namespace:(null==q?void 0:q.namespace)||"",name:(null==q?void 0:q.name)||""}),(0,s.jsx)(ee.K,{open:W,title:"Delete API Product",description:_?`Deleting "${null==K?void 0:K.name}" will also remove:\n\n• ${_.requests} API Key(s)\n• ${_.secrets} API Key Secret(s)\n\nThis action cannot be undone.`:`Deleting "${null==K?void 0:K.name}" will also remove all associated API Keys and Secrets.\nThis action cannot be undone.`,confirmText:null==K?void 0:K.name,severity:"high",deleting:O,onConfirm:async()=>{if(K){U(!0);try{await t.deleteApiProduct(K.namespace,K.name);const e=(null==K?void 0:K.name)||"API Product";H(e=>e+1),a.post({message:`"${e}" deleted successfully`,severity:"success",display:"transient"})}catch(e){const t=e instanceof Error?e.message:"unknown error occurred";a.post({message:`Failed to delete API Product: ${t}`,severity:"error",display:"transient"})}finally{U(!1),E(!1),B(null)}}},onCancel:()=>{E(!1),B(null)}})]})]})},le=()=>(0,s.jsx)(T.B,{permission:J.vs,errorMessage:"you don't have permission to view the Kuadrant page",children:(0,s.jsx)(ne,{})})}}]);
2
+ //# sourceMappingURL=2821.1ac360ec.chunk.js.map