@kuadrant/kuadrant-backstage-plugin-frontend 0.0.2-dev-1cc1a15 → 0.0.2-dev-7d09bfa

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 (195) hide show
  1. package/dist/components/ApiAccessCard/ApiAccessCard.esm.js +229 -11
  2. package/dist/components/ApiAccessCard/ApiAccessCard.esm.js.map +1 -1
  3. package/dist/components/ApiKeyManagementTab/ApiKeyManagementTab.esm.js +15 -151
  4. package/dist/components/ApiKeyManagementTab/ApiKeyManagementTab.esm.js.map +1 -1
  5. package/dist/components/ApiProductDetailPage/ApiProductDetailPage.esm.js +10 -15
  6. package/dist/components/ApiProductDetailPage/ApiProductDetailPage.esm.js.map +1 -1
  7. package/dist/components/ApiProductDetails/ApiProductDetails.esm.js +6 -1
  8. package/dist/components/ApiProductDetails/ApiProductDetails.esm.js.map +1 -1
  9. package/dist/components/ApiProductInfoCard/ApiProductInfoCard.esm.js +15 -2
  10. package/dist/components/ApiProductInfoCard/ApiProductInfoCard.esm.js.map +1 -1
  11. package/dist/components/CreateAPIProductDialog/CreateAPIProductDialog.esm.js +2 -4
  12. package/dist/components/CreateAPIProductDialog/CreateAPIProductDialog.esm.js.map +1 -1
  13. package/dist/components/OidcProviderCard/OidcProviderCard.esm.js +23 -0
  14. package/dist/components/OidcProviderCard/OidcProviderCard.esm.js.map +1 -0
  15. package/dist/components/RequestAccessDialog/RequestAccessDialog.esm.js +167 -0
  16. package/dist/components/RequestAccessDialog/RequestAccessDialog.esm.js.map +1 -0
  17. package/dist/index.d.ts +1 -2
  18. package/dist/index.esm.js +1 -1
  19. package/dist/plugin.esm.js +1 -9
  20. package/dist/plugin.esm.js.map +1 -1
  21. package/dist/utils/validation.esm.js.map +1 -1
  22. package/dist-scalprum/configSchema.json +27 -1
  23. package/dist-scalprum/internal.plugin-kuadrant.5d9e1e73c7f21bbed39a.js +2 -0
  24. package/dist-scalprum/internal.plugin-kuadrant.5d9e1e73c7f21bbed39a.js.map +1 -0
  25. package/dist-scalprum/plugin-manifest.json +2 -2
  26. package/dist-scalprum/static/1994.19e6a1c5.chunk.js +3 -0
  27. package/dist-scalprum/static/1994.19e6a1c5.chunk.js.map +1 -0
  28. package/dist-scalprum/static/{2628.6619bf8b.chunk.js → 2628.0605e07f.chunk.js} +3 -3
  29. package/dist-scalprum/static/2628.0605e07f.chunk.js.map +1 -0
  30. package/dist-scalprum/static/2752.df63f31c.chunk.js +2 -0
  31. package/dist-scalprum/static/2752.df63f31c.chunk.js.map +1 -0
  32. package/dist-scalprum/static/2822.27a4ac5b.chunk.js +2 -0
  33. package/dist-scalprum/static/2822.27a4ac5b.chunk.js.map +1 -0
  34. package/dist-scalprum/static/2967.8d9c1b1f.chunk.js +2 -0
  35. package/dist-scalprum/static/2967.8d9c1b1f.chunk.js.map +1 -0
  36. package/dist-scalprum/static/{3097.4bd6b35f.chunk.js → 3097.582b68d3.chunk.js} +2 -2
  37. package/dist-scalprum/static/{3097.4bd6b35f.chunk.js.map → 3097.582b68d3.chunk.js.map} +1 -1
  38. package/dist-scalprum/static/327.cd6b3fee.chunk.js +2 -0
  39. package/dist-scalprum/static/327.cd6b3fee.chunk.js.map +1 -0
  40. package/dist-scalprum/static/3459.a7c29521.chunk.js +2 -0
  41. package/dist-scalprum/static/3459.a7c29521.chunk.js.map +1 -0
  42. package/dist-scalprum/static/3584.c820a5c7.chunk.js +2 -0
  43. package/dist-scalprum/static/3584.c820a5c7.chunk.js.map +1 -0
  44. package/dist-scalprum/static/3587.490690d6.chunk.js +2 -0
  45. package/dist-scalprum/static/3587.490690d6.chunk.js.map +1 -0
  46. package/dist-scalprum/static/{3647.b96f9b3e.chunk.js → 3647.67079e5f.chunk.js} +2 -2
  47. package/dist-scalprum/static/{3647.b96f9b3e.chunk.js.map → 3647.67079e5f.chunk.js.map} +1 -1
  48. package/dist-scalprum/static/3650.4f0dc550.chunk.js +2 -0
  49. package/dist-scalprum/static/3650.4f0dc550.chunk.js.map +1 -0
  50. package/dist-scalprum/static/3947.7458971d.chunk.js +2 -0
  51. package/dist-scalprum/static/3947.7458971d.chunk.js.map +1 -0
  52. package/dist-scalprum/static/3984.7bc07774.chunk.js +2 -0
  53. package/dist-scalprum/static/3984.7bc07774.chunk.js.map +1 -0
  54. package/dist-scalprum/static/4302.9a59485e.chunk.js +2 -0
  55. package/dist-scalprum/static/4302.9a59485e.chunk.js.map +1 -0
  56. package/dist-scalprum/static/441.f708f1e0.chunk.js +2 -0
  57. package/dist-scalprum/static/441.f708f1e0.chunk.js.map +1 -0
  58. package/dist-scalprum/static/4611.0d064cdf.chunk.js +2 -0
  59. package/dist-scalprum/static/4611.0d064cdf.chunk.js.map +1 -0
  60. package/dist-scalprum/static/4651.c85cecc4.chunk.js +2 -0
  61. package/dist-scalprum/static/4651.c85cecc4.chunk.js.map +1 -0
  62. package/dist-scalprum/static/{4682.6959fcd1.chunk.js → 4682.3c7098a8.chunk.js} +2 -2
  63. package/dist-scalprum/static/{4682.6959fcd1.chunk.js.map → 4682.3c7098a8.chunk.js.map} +1 -1
  64. package/dist-scalprum/static/501.87de76da.chunk.js +3 -0
  65. package/dist-scalprum/static/501.87de76da.chunk.js.LICENSE.txt +21 -0
  66. package/dist-scalprum/static/501.87de76da.chunk.js.map +1 -0
  67. package/dist-scalprum/static/{5010.a4aa0f8e.chunk.js → 5010.2228c754.chunk.js} +3 -3
  68. package/dist-scalprum/static/{5010.a4aa0f8e.chunk.js.map → 5010.2228c754.chunk.js.map} +1 -1
  69. package/dist-scalprum/static/5203.43732b3f.chunk.js +2 -0
  70. package/dist-scalprum/static/5203.43732b3f.chunk.js.map +1 -0
  71. package/dist-scalprum/static/5235.2a59dc45.chunk.js +2 -0
  72. package/dist-scalprum/static/5235.2a59dc45.chunk.js.map +1 -0
  73. package/dist-scalprum/static/5453.b3ee2392.chunk.js +2 -0
  74. package/dist-scalprum/static/5453.b3ee2392.chunk.js.map +1 -0
  75. package/dist-scalprum/static/{7556.aa8a002f.chunk.js → 5568.5dbce633.chunk.js} +3 -3
  76. package/dist-scalprum/static/{3466.43dfe991.chunk.js.LICENSE.txt → 5568.5dbce633.chunk.js.LICENSE.txt} +9 -0
  77. package/dist-scalprum/static/5568.5dbce633.chunk.js.map +1 -0
  78. package/dist-scalprum/static/6272.ef31cb1c.chunk.js +2 -0
  79. package/dist-scalprum/static/6272.ef31cb1c.chunk.js.map +1 -0
  80. package/dist-scalprum/static/6371.c4899d73.chunk.js +3 -0
  81. package/dist-scalprum/static/6371.c4899d73.chunk.js.map +1 -0
  82. package/dist-scalprum/static/6386.6386.ce38cef3.css +5 -0
  83. package/dist-scalprum/static/6386.6386.ce38cef3.css.map +1 -0
  84. package/dist-scalprum/static/6386.903891f3.chunk.js +3 -0
  85. package/dist-scalprum/static/6386.903891f3.chunk.js.LICENSE.txt +26 -0
  86. package/dist-scalprum/static/6386.903891f3.chunk.js.map +1 -0
  87. package/dist-scalprum/static/65.0e01be7c.chunk.js +2 -0
  88. package/dist-scalprum/static/65.0e01be7c.chunk.js.map +1 -0
  89. package/dist-scalprum/static/6753.76832e72.chunk.js +2 -0
  90. package/dist-scalprum/static/6753.76832e72.chunk.js.map +1 -0
  91. package/dist-scalprum/static/{8563.7e068fb0.chunk.js → 6763.d6cd937f.chunk.js} +3 -3
  92. package/dist-scalprum/static/6763.d6cd937f.chunk.js.map +1 -0
  93. package/dist-scalprum/static/{6800.736d5da3.chunk.js → 6800.8ec3a2eb.chunk.js} +2 -2
  94. package/dist-scalprum/static/6800.8ec3a2eb.chunk.js.map +1 -0
  95. package/dist-scalprum/static/{6840.4728fab9.chunk.js → 6840.6cc88a16.chunk.js} +2 -2
  96. package/dist-scalprum/static/6840.6cc88a16.chunk.js.map +1 -0
  97. package/dist-scalprum/static/7076.8745d395.chunk.js +2 -0
  98. package/dist-scalprum/static/7076.8745d395.chunk.js.map +1 -0
  99. package/dist-scalprum/static/7367.62c9669e.chunk.js +3 -0
  100. package/dist-scalprum/static/7367.62c9669e.chunk.js.LICENSE.txt +21 -0
  101. package/dist-scalprum/static/7367.62c9669e.chunk.js.map +1 -0
  102. package/dist-scalprum/static/7791.55db7365.chunk.js +2 -0
  103. package/dist-scalprum/static/7791.55db7365.chunk.js.map +1 -0
  104. package/dist-scalprum/static/8172.e89bbae7.chunk.js +2 -0
  105. package/dist-scalprum/static/8172.e89bbae7.chunk.js.map +1 -0
  106. package/dist-scalprum/static/8627.111cbac9.chunk.js +2 -0
  107. package/dist-scalprum/static/8627.111cbac9.chunk.js.map +1 -0
  108. package/dist-scalprum/static/8799.4ea4639c.chunk.js +2 -0
  109. package/dist-scalprum/static/8799.4ea4639c.chunk.js.map +1 -0
  110. package/dist-scalprum/static/9510.e4112e19.chunk.js +3 -0
  111. package/dist-scalprum/static/{2946.167c50c2.chunk.js.LICENSE.txt → 9510.e4112e19.chunk.js.LICENSE.txt} +0 -10
  112. package/dist-scalprum/static/9510.e4112e19.chunk.js.map +1 -0
  113. package/dist-scalprum/static/9644.7d342123.chunk.js +2 -0
  114. package/dist-scalprum/static/9644.7d342123.chunk.js.map +1 -0
  115. package/dist-scalprum/static/993.c164940e.chunk.js +2 -0
  116. package/dist-scalprum/static/993.c164940e.chunk.js.map +1 -0
  117. package/dist-scalprum/static/exposed-PluginRoot.5b6638e2.chunk.js +2 -0
  118. package/dist-scalprum/static/exposed-PluginRoot.5b6638e2.chunk.js.map +1 -0
  119. package/package.json +3 -1
  120. package/dist/components/PlanPolicyDetailPage/PlanPolicyDetailPage.esm.js +0 -89
  121. package/dist/components/PlanPolicyDetailPage/PlanPolicyDetailPage.esm.js.map +0 -1
  122. package/dist/components/PlanPolicyDetailPage/index.esm.js +0 -2
  123. package/dist/components/PlanPolicyDetailPage/index.esm.js.map +0 -1
  124. package/dist-scalprum/internal.plugin-kuadrant.58a9d553e354df0eed24.js +0 -2
  125. package/dist-scalprum/internal.plugin-kuadrant.58a9d553e354df0eed24.js.map +0 -1
  126. package/dist-scalprum/static/1085.536aa0fa.chunk.js +0 -3
  127. package/dist-scalprum/static/1085.536aa0fa.chunk.js.map +0 -1
  128. package/dist-scalprum/static/1613.71f0fccd.chunk.js +0 -3
  129. package/dist-scalprum/static/1613.71f0fccd.chunk.js.LICENSE.txt +0 -10
  130. package/dist-scalprum/static/1613.71f0fccd.chunk.js.map +0 -1
  131. package/dist-scalprum/static/1836.b74b4c40.chunk.js +0 -3
  132. package/dist-scalprum/static/1836.b74b4c40.chunk.js.LICENSE.txt +0 -10
  133. package/dist-scalprum/static/1836.b74b4c40.chunk.js.map +0 -1
  134. package/dist-scalprum/static/2198.5905970e.chunk.js +0 -2
  135. package/dist-scalprum/static/2198.5905970e.chunk.js.map +0 -1
  136. package/dist-scalprum/static/2628.6619bf8b.chunk.js.map +0 -1
  137. package/dist-scalprum/static/2759.fceb317f.chunk.js +0 -2
  138. package/dist-scalprum/static/2759.fceb317f.chunk.js.map +0 -1
  139. package/dist-scalprum/static/2928.4303c12e.chunk.js +0 -3
  140. package/dist-scalprum/static/2928.4303c12e.chunk.js.map +0 -1
  141. package/dist-scalprum/static/2946.167c50c2.chunk.js +0 -3
  142. package/dist-scalprum/static/2946.167c50c2.chunk.js.map +0 -1
  143. package/dist-scalprum/static/2967.ac3a4bee.chunk.js +0 -2
  144. package/dist-scalprum/static/2967.ac3a4bee.chunk.js.map +0 -1
  145. package/dist-scalprum/static/2987.1da15560.chunk.js +0 -2
  146. package/dist-scalprum/static/2987.1da15560.chunk.js.map +0 -1
  147. package/dist-scalprum/static/3459.5c90b5a3.chunk.js +0 -2
  148. package/dist-scalprum/static/3459.5c90b5a3.chunk.js.map +0 -1
  149. package/dist-scalprum/static/3466.43dfe991.chunk.js +0 -3
  150. package/dist-scalprum/static/3466.43dfe991.chunk.js.map +0 -1
  151. package/dist-scalprum/static/3503.66b6e510.chunk.js +0 -2
  152. package/dist-scalprum/static/3503.66b6e510.chunk.js.map +0 -1
  153. package/dist-scalprum/static/3650.515c743a.chunk.js +0 -2
  154. package/dist-scalprum/static/3650.515c743a.chunk.js.map +0 -1
  155. package/dist-scalprum/static/3657.59d45756.chunk.js +0 -3
  156. package/dist-scalprum/static/3657.59d45756.chunk.js.LICENSE.txt +0 -10
  157. package/dist-scalprum/static/3657.59d45756.chunk.js.map +0 -1
  158. package/dist-scalprum/static/428.0a290bc6.chunk.js +0 -2
  159. package/dist-scalprum/static/428.0a290bc6.chunk.js.map +0 -1
  160. package/dist-scalprum/static/441.9f02e61b.chunk.js +0 -2
  161. package/dist-scalprum/static/441.9f02e61b.chunk.js.map +0 -1
  162. package/dist-scalprum/static/5453.280127dd.chunk.js +0 -2
  163. package/dist-scalprum/static/5453.280127dd.chunk.js.map +0 -1
  164. package/dist-scalprum/static/5603.05d9ca7f.chunk.js +0 -2
  165. package/dist-scalprum/static/5603.05d9ca7f.chunk.js.map +0 -1
  166. package/dist-scalprum/static/6272.b5ee5195.chunk.js +0 -3
  167. package/dist-scalprum/static/6272.b5ee5195.chunk.js.LICENSE.txt +0 -9
  168. package/dist-scalprum/static/6272.b5ee5195.chunk.js.map +0 -1
  169. package/dist-scalprum/static/6371.c83dc422.chunk.js +0 -2
  170. package/dist-scalprum/static/6371.c83dc422.chunk.js.map +0 -1
  171. package/dist-scalprum/static/6422.97baf774.chunk.js +0 -2
  172. package/dist-scalprum/static/6422.97baf774.chunk.js.map +0 -1
  173. package/dist-scalprum/static/6800.736d5da3.chunk.js.map +0 -1
  174. package/dist-scalprum/static/6840.4728fab9.chunk.js.map +0 -1
  175. package/dist-scalprum/static/7556.aa8a002f.chunk.js.LICENSE.txt +0 -8
  176. package/dist-scalprum/static/7556.aa8a002f.chunk.js.map +0 -1
  177. package/dist-scalprum/static/7601.4df83556.chunk.js +0 -3
  178. package/dist-scalprum/static/7601.4df83556.chunk.js.LICENSE.txt +0 -9
  179. package/dist-scalprum/static/7601.4df83556.chunk.js.map +0 -1
  180. package/dist-scalprum/static/7791.39417f8c.chunk.js +0 -2
  181. package/dist-scalprum/static/7791.39417f8c.chunk.js.map +0 -1
  182. package/dist-scalprum/static/7984.c8511b89.chunk.js +0 -2
  183. package/dist-scalprum/static/7984.c8511b89.chunk.js.map +0 -1
  184. package/dist-scalprum/static/8365.d3360f18.chunk.js +0 -2
  185. package/dist-scalprum/static/8365.d3360f18.chunk.js.map +0 -1
  186. package/dist-scalprum/static/8563.7e068fb0.chunk.js.map +0 -1
  187. package/dist-scalprum/static/8799.7c749838.chunk.js +0 -2
  188. package/dist-scalprum/static/8799.7c749838.chunk.js.map +0 -1
  189. package/dist-scalprum/static/exposed-PluginRoot.a5792fb2.chunk.js +0 -2
  190. package/dist-scalprum/static/exposed-PluginRoot.a5792fb2.chunk.js.map +0 -1
  191. /package/dist-scalprum/static/{2928.4303c12e.chunk.js.LICENSE.txt → 1994.19e6a1c5.chunk.js.LICENSE.txt} +0 -0
  192. /package/dist-scalprum/static/{2628.6619bf8b.chunk.js.LICENSE.txt → 2628.0605e07f.chunk.js.LICENSE.txt} +0 -0
  193. /package/dist-scalprum/static/{5010.a4aa0f8e.chunk.js.LICENSE.txt → 5010.2228c754.chunk.js.LICENSE.txt} +0 -0
  194. /package/dist-scalprum/static/{1085.536aa0fa.chunk.js.LICENSE.txt → 6371.c4899d73.chunk.js.LICENSE.txt} +0 -0
  195. /package/dist-scalprum/static/{8563.7e068fb0.chunk.js.LICENSE.txt → 6763.d6cd937f.chunk.js.LICENSE.txt} +0 -0
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[5203],{14933:(e,a,t)=>{t.d(a,{c:()=>x});var n=t(31085),i=t(95478),r=t(76891),s=t(61477),l=t(46805),o=t(10394),d=t(72501),c=t(95061),u=t(48543),p=t(81215),m=t(26343),y=t(16249),h=t(93453),A=t(64947),b=t(78467),v=t(39053),f=t(22097);const x=({open:e,onClose:a,onSuccess:t,apiProductName:x,namespace:k,userEmail:j,plans:g})=>{const w=(0,f.useApi)(f.configApiRef),S=(0,f.useApi)(f.fetchApiRef),I=(0,f.useApi)(f.alertApiRef),P=w.getString("backend.baseUrl"),[C,$]=(0,i.useState)(""),[R,T]=(0,i.useState)(""),[q,z]=(0,i.useState)(!1),[E,K]=(0,i.useState)(null),W=()=>{$(""),T(""),K(null),a()};return(0,n.jsxs)(r.A,{open:e,onClose:W,maxWidth:"sm",fullWidth:!0,children:[(0,n.jsx)(s.A,{children:"Request API Access"}),(0,n.jsxs)(l.A,{children:[(0,n.jsxs)(o.A,{mb:2,p:1.5,bgcolor:"info.light",borderRadius:1,display:"flex",alignItems:"flex-start",style:{gap:8},children:[(0,n.jsx)(v.A,{color:"primary",fontSize:"small",style:{marginTop:2}}),(0,n.jsx)(d.A,{variant:"body2",children:"Your request will be reviewed by an API owner before access is granted."})]}),E&&(0,n.jsx)(o.A,{mb:2,p:2,bgcolor:"error.main",color:"error.contrastText",borderRadius:1,children:(0,n.jsx)(d.A,{variant:"body2",children:E})}),(0,n.jsxs)(c.A,{fullWidth:!0,margin:"normal",disabled:q,"data-testid":"tier-select-form",children:[(0,n.jsx)(u.A,{id:"tier-select-label",children:"Select Tier"}),(0,n.jsx)(p.A,{labelId:"tier-select-label","data-testid":"tier-select",value:C,onChange:e=>$(e.target.value),disabled:q,children:g.map(e=>{const a=Object.entries(e.limits||{}).map(([e,a])=>`${a} per ${e}`).join(", ");return(0,n.jsxs)(m.A,{value:e.tier,"data-testid":`tier-option-${e.tier}`,children:[e.tier," ",a?`(${a})`:""]},e.tier)})})]}),(0,n.jsx)(y.A,{label:"Use Case (optional)",placeholder:"Describe how you plan to use this API",multiline:!0,rows:3,fullWidth:!0,margin:"normal",value:R,onChange:e=>T(e.target.value),helperText:"Explain your intended use of this API for admin review",disabled:q})]}),(0,n.jsxs)(h.A,{children:[(0,n.jsx)(A.A,{onClick:W,disabled:q,children:"Cancel"}),(0,n.jsx)(A.A,{onClick:async()=>{if(C){z(!0),K(null);try{const e=await S.fetch(`${P}/api/kuadrant/requests`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiProductName:x,namespace:k,planTier:C,useCase:R.trim()||"",userEmail:j})});if(!e.ok){const a=await e.json().catch(()=>({}));throw new Error(a.error||`failed to create request: ${e.status}`)}I.post({message:"API key requested successfully",severity:"success",display:"transient"}),$(""),T(""),t()}catch(e){const a=e instanceof Error?e.message:"unknown error occurred";I.post({message:`Failed to request API key: ${a}`,severity:"error",display:"transient"}),K(a)}finally{z(!1)}}},color:"primary",variant:"contained",disabled:!C||q,startIcon:q?(0,n.jsx)(b.A,{size:16,color:"inherit"}):void 0,children:q?"Submitting...":"Submit Request"})]})]})}},34955:(e,a,t)=>{t.d(a,{Al:()=>s,DS:()=>m,EM:()=>d,FL:()=>r,J:()=>i,KV:()=>v,R_:()=>c,U3:()=>l,dp:()=>p,jH:()=>b,q0:()=>y,uL:()=>A,v_:()=>o,vs:()=>u,z4:()=>h});var n=t(83572);(0,n.i)({name:"kuadrant.planpolicy.create",attributes:{action:"create"}}),(0,n.i)({name:"kuadrant.planpolicy.read",attributes:{action:"read"}}),(0,n.i)({name:"kuadrant.planpolicy.update",attributes:{action:"update"}}),(0,n.i)({name:"kuadrant.planpolicy.delete",attributes:{action:"delete"}});const i=(0,n.i)({name:"kuadrant.planpolicy.list",attributes:{action:"read"}}),r=(0,n.i)({name:"kuadrant.apiproduct.create",attributes:{action:"create"}}),s=((0,n.i)({name:"kuadrant.apiproduct.read.own",attributes:{action:"read"}}),(0,n.i)({name:"kuadrant.apiproduct.read.all",attributes:{action:"read"}})),l=(0,n.i)({name:"kuadrant.apiproduct.update.own",attributes:{action:"update"}}),o=(0,n.i)({name:"kuadrant.apiproduct.update.all",attributes:{action:"update"}}),d=(0,n.i)({name:"kuadrant.apiproduct.delete.own",attributes:{action:"delete"}}),c=(0,n.i)({name:"kuadrant.apiproduct.delete.all",attributes:{action:"delete"}}),u=(0,n.i)({name:"kuadrant.apiproduct.list",attributes:{action:"read"}}),p=(0,n.i)({name:"kuadrant.apikey.create",attributes:{action:"create"},resourceType:"apiproduct"}),m=(0,n.i)({name:"kuadrant.apikey.read.own",attributes:{action:"read"}}),y=((0,n.i)({name:"kuadrant.apikey.read.all",attributes:{action:"read"}}),(0,n.i)({name:"kuadrant.apikey.update.own",attributes:{action:"update"}})),h=(0,n.i)({name:"kuadrant.apikey.update.all",attributes:{action:"update"}}),A=(0,n.i)({name:"kuadrant.apikey.delete.own",attributes:{action:"delete"}}),b=(0,n.i)({name:"kuadrant.apikey.delete.all",attributes:{action:"delete"}}),v=(0,n.i)({name:"kuadrant.apikey.approve",attributes:{action:"update"}})},46205:(e,a,t)=>{t.d(a,{W:()=>r,l:()=>i});var n=t(87421);function i(e,a){const t="resourceType"in e?{permission:e,resourceRef:a}:{permission:e},i=(0,n.J)(t);return{allowed:i.allowed,loading:i.loading,error:i.error}}function r(e,a,t,n){return!!n||!(!t||e!==a)}},60441:(e,a,t)=>{t.r(a),t.d(a,{ApiAccessCard:()=>$});var n=t(31085),i=t(95478),r=t(35015),s=t(86687),l=t(42367),o=t(96040),d=t(10394),c=t(72501),u=t(67720),p=t(71677),m=t(29365),y=t(64947),h=t(76891),A=t(61477),b=t(46805),v=t(93453),f=t(18466),x=t(32269),k=t(61524),j=t(99594),g=t(77225),w=t(22097),S=t(25467),I=t(14933),P=t(46205),C=t(34955);const $=({namespace:e})=>{var a,t,$;const{entity:R}=(0,S.tN)(),T=(0,w.useApi)(w.configApiRef),q=(0,w.useApi)(w.identityApiRef),z=(0,w.useApi)(w.fetchApiRef),E=(0,w.useApi)(w.alertApiRef),K=T.getString("backend.baseUrl"),[W,_]=(0,i.useState)(""),[F,M]=(0,i.useState)(!1),[N,O]=(0,i.useState)(0),[U,J]=(0,i.useState)(new Set),[L,V]=(0,i.useState)(new Map),[B,D]=(0,i.useState)(new Set),[H,Y]=(0,i.useState)(new Set),[G,Q]=(0,i.useState)(!1),[X,Z]=(0,i.useState)(null),ee=(null===(a=R.metadata.annotations)||void 0===a?void 0:a["kuadrant.io/apiproduct"])||R.metadata.name,ae=(null===(t=R.metadata.annotations)||void 0===t?void 0:t["kuadrant.io/namespace"])||e||"default";(0,r.A)(async()=>{const e=await q.getProfileInfo();_(e.email||"")},[q]);const{value:te,loading:ne,error:ie}=(0,r.A)(async()=>{const e=ae?`${K}/api/kuadrant/requests/my?namespace=${ae}`:`${K}/api/kuadrant/requests/my`,a=await z.fetch(e);if(!a.ok)throw new Error("failed to fetch api key requests");return((await a.json()).items||[]).filter(e=>{var a,t;return(null===(a=e.spec.apiProductRef)||void 0===a?void 0:a.name)===ee&&"Approved"===(null===(t=e.status)||void 0===t?void 0:t.phase)})},[ae,ee,K,z,N]),{value:re,loading:se}=(0,r.A)(async()=>{var e;const a=await z.fetch(`${K}/api/kuadrant/apiproducts`);return a.ok?null===(e=(await a.json()).items)||void 0===e?void 0:e.find(e=>e.metadata.namespace===ae&&e.metadata.name===ee):null},[ae,ee,z,K]),le=re?`apiproduct:${re.metadata.namespace}/${re.metadata.name}`:void 0,{allowed:oe,loading:de}=(0,P.l)(C.dp,le),ce=e=>{J(a=>{const t=new Set(a);return t.has(e)?t.delete(e):t.add(e),t})};if(ne||se||de)return(0,n.jsx)(s.k,{});if(ie)return(0,n.jsx)(l._,{error:ie});const ue=te||[],pe=(null==re||null===($=re.status)||void 0===$?void 0:$.discoveredPlans)||[],me=oe&&pe.length>0;return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.n,{title:"Kuadrant API Keys",children:(0,n.jsxs)(d.A,{p:2,children:[ue.length>0?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(c.A,{variant:"body2",color:"textSecondary",gutterBottom:!0,children:[ue.length," active key",1!==ue.length?"s":""]}),ue.map(e=>{var a,t,i;const r=`${e.metadata.namespace}/${e.metadata.name}`,s=U.has(e.metadata.name),l=B.has(r),o=L.get(r),y=null===(t=e.status)||void 0===t||null===(a=t.secretRef)||void 0===a?void 0:a.name,h=!1!==(null===(i=e.status)||void 0===i?void 0:i.canReadSecret),A=H.has(r)||!h;return(0,n.jsxs)(d.A,{mb:1,p:1.5,border:1,borderColor:"grey.300",borderRadius:4,children:[(0,n.jsxs)(d.A,{display:"flex",justifyContent:"space-between",alignItems:"center",mb:1,children:[(0,n.jsx)(c.A,{variant:"body2",style:{fontWeight:500},children:e.metadata.name}),(0,n.jsx)(u.A,{label:e.spec.planTier,color:"primary",size:"small"})]}),y&&(0,n.jsxs)(d.A,{display:"flex",alignItems:"center",children:[(0,n.jsx)(c.A,{variant:"body2",style:{fontFamily:"monospace",fontSize:"0.8rem",flex:1,overflow:"hidden",textOverflow:"ellipsis"},children:l?"Loading...":s&&o?o:A&&!o?"Already viewed":"••••••••••••••••"}),s&&o&&(0,n.jsx)(p.Ay,{title:"Copy to clipboard",children:(0,n.jsx)(m.A,{size:"small",onClick:async()=>{o&&(await navigator.clipboard.writeText(o),E.post({message:"API key copied to clipboard",severity:"success",display:"transient"}))},children:(0,n.jsx)(j.A,{fontSize:"small"})})}),(0,n.jsx)(p.Ay,{title:A&&!o?"Key already viewed":s?"Hide API key":"Reveal API key (one-time only)",children:(0,n.jsx)("span",{children:(0,n.jsx)(m.A,{size:"small",onClick:()=>{s?(((e,a)=>{const t=`${e}/${a}`;V(e=>{const a=new Map(e);return a.delete(t),a})})(e.metadata.namespace,e.metadata.name),ce(e.metadata.name)):A||(Z({namespace:e.metadata.namespace,name:e.metadata.name}),Q(!0))},disabled:l||A&&!o,children:s?(0,n.jsx)(k.A,{fontSize:"small"}):(0,n.jsx)(x.A,{fontSize:"small"})})})})]})]},e.metadata.name)})]}):(0,n.jsx)(c.A,{variant:"body1",gutterBottom:!0,children:"You don't have any API keys for this API yet"}),(0,n.jsx)(d.A,{mt:2,children:me?(0,n.jsx)(y.A,{variant:"contained",color:"primary",size:"small",startIcon:(0,n.jsx)(f.A,{}),onClick:()=>M(!0),children:"Request API Access"}):(0,n.jsx)(c.A,{variant:"caption",color:"textSecondary",children:"Visit the API Keys tab to view and manage access"})})]})}),(0,n.jsx)(I.c,{open:F,onClose:()=>M(!1),onSuccess:()=>{M(!1),O(e=>e+1)},apiProductName:ee,namespace:ae,userEmail:W,plans:pe}),(0,n.jsxs)(h.A,{open:G,onClose:()=>{Q(!1),Z(null)},maxWidth:"sm",children:[(0,n.jsx)(A.A,{children:(0,n.jsxs)(d.A,{display:"flex",alignItems:"center",children:[(0,n.jsx)(g.A,{color:"primary",style:{marginRight:8}}),"View API Key"]})}),(0,n.jsxs)(b.A,{children:[(0,n.jsxs)(c.A,{variant:"body1",paragraph:!0,children:["This API key can only be viewed ",(0,n.jsx)("strong",{children:"once"}),". After you reveal it, you will not be able to retrieve it again."]}),(0,n.jsx)(c.A,{variant:"body2",color:"textSecondary",children:"Make sure to copy and store it securely before closing this view."})]}),(0,n.jsxs)(v.A,{children:[(0,n.jsx)(y.A,{onClick:()=>{Q(!1),Z(null)},children:"Cancel"}),(0,n.jsx)(y.A,{variant:"contained",color:"primary",onClick:()=>{X&&((async(e,a)=>{const t=`${e}/${a}`;if(!B.has(t)){D(e=>new Set(e).add(t));try{const n=await z.fetch(`${K}/api/kuadrant/apikeys/${e}/${a}/secret`);if(n.ok){const e=await n.json();V(a=>new Map(a).set(t,e.apiKey)),Y(e=>new Set(e).add(t))}else 403===n.status&&(Y(e=>new Set(e).add(t)),E.post({message:"This API key has already been viewed and cannot be retrieved again.",severity:"warning",display:"transient"}))}catch(e){console.error("failed to fetch api key:",e)}finally{D(e=>{const a=new Set(e);return a.delete(t),a})}}})(X.namespace,X.name),ce(X.name)),Q(!1),Z(null)},children:"Reveal API Key"})]})]})]})}}}]);
2
+ //# sourceMappingURL=5203.43732b3f.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static/5203.43732b3f.chunk.js","mappings":"qVAuCO,MAAMA,EAAsB,EACjCC,OACAC,UACAC,YACAC,iBACAC,YACAC,YACAC,YAEA,MAAMC,GAASC,EAAAA,EAAAA,QAAOC,EAAAA,cAChBC,GAAWF,EAAAA,EAAAA,QAAOG,EAAAA,aAClBC,GAAWJ,EAAAA,EAAAA,QAAOK,EAAAA,aAClBC,EAAaP,EAAOQ,UAAU,oBAE7BC,EAAcC,IAAmBC,EAAAA,EAAAA,UAAS,KAC1CC,EAASC,IAAcF,EAAAA,EAAAA,UAAS,KAChCG,EAAUC,IAAeJ,EAAAA,EAAAA,WAAS,IAClCK,EAAaC,IAAkBN,EAAAA,EAAAA,UAAwB,MAExDO,EAAc,KAClBR,EAAgB,IAChBG,EAAW,IACXI,EAAe,MACfvB,KAwDF,OACE,UAACyB,EAAAA,EAAMA,CAAC1B,KAAMA,EAAMC,QAASwB,EAAaE,SAAS,KAAKC,WAAS,E,WAC/D,SAACC,EAAAA,EAAWA,C,SAAC,wBACb,UAACC,EAAAA,EAAaA,C,WACZ,UAACC,EAAAA,EAAGA,CACFC,GAAI,EACJC,EAAG,IACHC,QAAQ,aACRC,aAAc,EACdC,QAAQ,OACRC,WAAW,aACXC,MAAO,CAAEC,IAAK,G,WAEd,SAACC,EAAAA,EAAQA,CACPC,MAAM,UACNC,SAAS,QACTJ,MAAO,CAAEK,UAAW,MAEtB,SAACC,EAAAA,EAAUA,CAACC,QAAQ,Q,SAAQ,+EAK7BtB,IACC,SAACQ,EAAAA,EAAGA,CACFC,GAAI,EACJC,EAAG,EACHC,QAAQ,aACRO,MAAM,qBACNN,aAAc,E,UAEd,SAACS,EAAAA,EAAUA,CAACC,QAAQ,Q,SAAStB,OAGjC,UAACuB,EAAAA,EAAWA,CACVlB,WAAS,EACTmB,OAAO,SACPC,SAAU3B,EACV4B,cAAY,mB,WAEZ,SAACC,EAAAA,EAAUA,CAACC,GAAG,oB,SAAoB,iBACnC,SAACC,EAAAA,EAAMA,CACLC,QAAQ,oBACRJ,cAAY,cACZK,MAAOtC,EACPuC,SAAWC,GAAMvC,EAAgBuC,EAAEC,OAAOH,OAC1CN,SAAU3B,E,SAETf,EAAMoD,IAAKC,IACV,MAAMC,EAAYC,OAAOC,QAAQH,EAAKI,QAAU,CAAC,GAC9CL,IAAI,EAAEM,EAAKC,KAAS,GAAGA,SAAWD,KAClCE,KAAK,MACR,OACE,UAACC,EAAAA,EAAQA,CAEPb,MAAOK,EAAKS,KACZnB,cAAa,eAAeU,EAAKS,O,UAEhCT,EAAKS,KAAK,IAAER,EAAY,IAAIA,KAAe,KAJvCD,EAAKS,cAUpB,SAACC,EAAAA,EAASA,CACRC,MAAM,sBACNC,YAAY,wCACZC,WAAS,EACTC,KAAM,EACN7C,WAAS,EACTmB,OAAO,SACPO,MAAOnC,EACPoC,SAAWC,GAAMpC,EAAWoC,EAAEC,OAAOH,OACrCoB,WAAW,yDACX1B,SAAU3B,QAGd,UAACsD,EAAAA,EAAaA,C,WACZ,SAACC,EAAAA,EAAMA,CAACC,QAASpD,EAAauB,SAAU3B,E,SAAU,YAGlD,SAACuD,EAAAA,EAAMA,CACLC,QAvIoBC,UAC1B,GAAK9D,EAAL,CAEAM,GAAY,GACZE,EAAe,MACf,IACE,MAAMuD,QAAiBrE,EAASsE,MAC9B,GAAGlE,0BACH,CACEmE,OAAQ,OACRC,QAAS,CACP,eAAgB,oBAElBC,KAAMC,KAAKC,UAAU,CACnBlF,iBACAC,YACAkF,SAAUtE,EACVG,QAASA,EAAQoE,QAAU,GAC3BlF,gBAKN,IAAK0E,EAASS,GAAI,CAChB,MAAMC,QAAkBV,EAASW,OAAOC,MAAM,KAAO,CAAE,IACvD,MAAM,IAAIC,MACRH,EAAUI,OAAS,6BAA6Bd,EAASe,SAE7D,CAEAlF,EAASmF,KAAK,CACZC,QAAS,iCACTC,SAAU,UACV7D,QAAS,cAGXnB,EAAgB,IAChBG,EAAW,IACXlB,GACF,CAAE,MAAOgG,GACP,MAAMC,EACJD,aAAeN,MAAQM,EAAIF,QAAU,yBACvCpF,EAASmF,KAAK,CACZC,QAAS,8BAA8BG,IACvCF,SAAU,QACV7D,QAAS,cAEXZ,EAAe2E,EACjB,CAAE,QACA7E,GAAY,EACd,CAjDyB,GAuInBmB,MAAM,UACNI,QAAQ,YACRG,UAAWhC,GAAgBK,EAC3B+E,UACE/E,GACE,SAACgF,EAAAA,EAAgBA,CAACC,KAAM,GAAI7D,MAAM,iBAChC8D,E,SAGLlF,EAAW,gBAAkB,yB,iLCzLUmF,EAAAA,EAAAA,GAAiB,CACjEC,KAAM,6BACNC,WAAY,CAAEC,OAAQ,aAGwBH,EAAAA,EAAAA,GAAiB,CAC/DC,KAAM,2BACNC,WAAY,CAAEC,OAAQ,WAG0BH,EAAAA,EAAAA,GAAiB,CACjEC,KAAM,6BACNC,WAAY,CAAEC,OAAQ,aAG0BH,EAAAA,EAAAA,GAAiB,CACjEC,KAAM,6BACNC,WAAY,CAAEC,OAAQ,YAjBjB,MAoBMC,GAAmCJ,EAAAA,EAAAA,GAAiB,CAC/DC,KAAM,2BACNC,WAAY,CAAEC,OAAQ,UASXE,GAAqCL,EAAAA,EAAAA,GAAiB,CACjEC,KAAM,6BACNC,WAAY,CAAEC,OAAQ,YAgBXG,IATsCN,EAAAA,EAAAA,GAAiB,CAClEC,KAAM,+BACNC,WAAY,CAAEC,OAAQ,WAO2BH,EAAAA,EAAAA,GAAiB,CAClEC,KAAM,+BACNC,WAAY,CAAEC,OAAQ,WAOXI,GAAwCP,EAAAA,EAAAA,GAAiB,CACpEC,KAAM,iCACNC,WAAY,CAAEC,OAAQ,YAOXK,GAAwCR,EAAAA,EAAAA,GAAiB,CACpEC,KAAM,iCACNC,WAAY,CAAEC,OAAQ,YAOXM,GAAwCT,EAAAA,EAAAA,GAAiB,CACpEC,KAAM,iCACNC,WAAY,CAAEC,OAAQ,YAOXO,GAAwCV,EAAAA,EAAAA,GAAiB,CACpEC,KAAM,iCACNC,WAAY,CAAEC,OAAQ,YAOXQ,GAAmCX,EAAAA,EAAAA,GAAiB,CAC/DC,KAAM,2BACNC,WAAY,CAAEC,OAAQ,UAcXS,GAAiCZ,EAAAA,EAAAA,GAAiB,CAC7DC,KAAM,yBACNC,WAAY,CAAEC,OAAQ,UACtBU,aAAc,eAOHC,GAAkCd,EAAAA,EAAAA,GAAiB,CAC9DC,KAAM,2BACNC,WAAY,CAAEC,OAAQ,UAgBXY,IATkCf,EAAAA,EAAAA,GAAiB,CAC9DC,KAAM,2BACNC,WAAY,CAAEC,OAAQ,WAOyBH,EAAAA,EAAAA,GAAiB,CAChEC,KAAM,6BACNC,WAAY,CAAEC,OAAQ,aAOXa,GAAoChB,EAAAA,EAAAA,GAAiB,CAChEC,KAAM,6BACNC,WAAY,CAAEC,OAAQ,YAOXc,GAAoCjB,EAAAA,EAAAA,GAAiB,CAChEC,KAAM,6BACNC,WAAY,CAAEC,OAAQ,YAOXe,GAAoClB,EAAAA,EAAAA,GAAiB,CAChEC,KAAM,6BACNC,WAAY,CAAEC,OAAQ,YAQXgB,GAAkCnB,EAAAA,EAAAA,GAAiB,CAC9DC,KAAM,0BACNC,WAAY,CAAEC,OAAQ,W,0DCzKjB,SAASiB,EACdC,EACAC,GAGA,MAAMC,EAAoB,iBAAkBF,EACxC,CAAEA,WAAYA,EAAkCC,eAChD,CAAED,cAEAG,GAASC,EAAAA,EAAAA,GAAcF,GAE7B,MAAO,CACLG,QAASF,EAAOE,QAChBC,QAASH,EAAOG,QAChBtC,MAAOmC,EAAOnC,MAElB,CAWO,SAASuC,EACdC,EACAC,EACAC,EACAC,GAEA,QAAIA,MACAD,GAAgBF,IAAYC,EAElC,C,wVCHO,MAAMG,EAAgB,EAAGrI,UAAWsI,M,IAuBlBC,EACLA,EAiHHC,EAxIf,MAAM,OAAED,IAAWE,EAAAA,EAAAA,MACbtI,GAASC,EAAAA,EAAAA,QAAOC,EAAAA,cAChBqI,GAActI,EAAAA,EAAAA,QAAOuI,EAAAA,gBACrBrI,GAAWF,EAAAA,EAAAA,QAAOG,EAAAA,aAClBC,GAAWJ,EAAAA,EAAAA,QAAOK,EAAAA,aAClBC,EAAaP,EAAOQ,UAAU,oBAC7BV,EAAW2I,IAAgB9H,EAAAA,EAAAA,UAAiB,KAC5C+H,EAAmBC,IAAwBhI,EAAAA,EAAAA,WAAS,IACpDiI,EAASC,IAAclI,EAAAA,EAAAA,UAAS,IAGhCmI,EAAaC,IAAkBpI,EAAAA,EAAAA,UAAsB,IAAIqI,MACzDC,EAAcC,IAAmBvI,EAAAA,EAAAA,UAA8B,IAAIwI,MACnEC,EAAeC,IAAoB1I,EAAAA,EAAAA,UAAsB,IAAIqI,MAC7DM,EAAiBC,IAAsB5I,EAAAA,EAAAA,UAAsB,IAAIqI,MACjEQ,EAAqBC,IAA0B9I,EAAAA,EAAAA,WAAS,IACxD+I,EAAkBC,IAAuBhJ,EAAAA,EAAAA,UAGtC,MAGJf,IAA4C,QAA3BwI,EAAAA,EAAOwB,SAASC,mBAAhBzB,IAAAA,OAAAA,EAAAA,EAA8B,4BAA6BA,EAAOwB,SAAS1D,KAC5FrG,IAAuC,QAA3BuI,EAAAA,EAAOwB,SAASC,mBAAhBzB,IAAAA,OAAAA,EAAAA,EAA8B,2BAA4BD,GAAiB,WAG7F2B,EAAAA,EAAAA,GAASvF,UACP,MAAMwF,QAAgBxB,EAAYyB,iBAClCvB,EAAasB,EAAQE,OAAS,KAC7B,CAAC1B,IAGJ,MAAQxF,MAAOmH,GAAUtC,QAASuC,GAAa7E,MAAO8E,KAAcN,EAAAA,EAAAA,GAASvF,UAC3E,MAAM8F,EAAMxK,GACR,GAAGU,wCAAiDV,KACpD,GAAGU,6BACDiE,QAAiBrE,EAASsE,MAAM4F,GACtC,IAAK7F,EAASS,GACZ,MAAM,IAAII,MAAM,oCAIlB,cAFmBb,EAASW,QACHmF,OAAS,IACfC,OAAQC,I,IACzBA,EAAiDA,E,OAA7B,QAApBA,EAAAA,EAAEC,KAAKC,qBAAPF,IAAAA,OAAAA,EAAAA,EAAsBtE,QAAStG,IAAsC,cAAZ,QAAR4K,EAAAA,EAAEjF,cAAFiF,IAAAA,OAAAA,EAAAA,EAAUG,UAE5D,CAAC9K,GAAWD,GAAgBW,EAAYJ,EAAUyI,KAG7C7F,MAAOsF,GAAYT,QAASgD,KAAmBd,EAAAA,EAAAA,GAASvF,U,IAMvDsG,EALP,MAAMrG,QAAiBrE,EAASsE,MAAM,GAAGlE,8BACzC,OAAKiE,EAASS,GAIG,QAAV4F,SADYrG,EAASW,QAChBmF,aAALO,IAAAA,OAAAA,EAAAA,EAAYC,KAChBpJ,GACCA,EAAEkI,SAAS/J,YAAcA,IACzB6B,EAAEkI,SAAS1D,OAAStG,IANf,MAQR,CAACC,GAAWD,GAAgBO,EAAUI,IAEnCgH,GAAcc,GAChB,cAAcA,GAAWuB,SAAS/J,aAAawI,GAAWuB,SAAS1D,YACnEF,GAEI2B,QAASoD,GAAkBnD,QAASoD,KAAsB3D,EAAAA,EAAAA,GAChER,EAAAA,GACAU,IA8CI0D,GAAoBC,IACxBnC,EAAgBoC,IACd,MAAMC,EAAS,IAAIpC,IAAImC,GAMvB,OALIC,EAAOC,IAAIH,GACbE,EAAOE,OAAOJ,GAEdE,EAAOG,IAAIL,GAENE,KAMX,GAFgBjB,IAAeS,IAAkBI,GAG/C,OAAO,SAACQ,EAAAA,EAAQA,CAAAA,GAGlB,GAAIpB,GACF,OAAO,SAACqB,EAAAA,EAAkBA,CAACnG,MAAO8E,KAGpC,MAAMsB,GAAO,IAA0B,GACjC3L,IAASsI,UAAkB,QAAlBA,EAAAA,GAAY9C,cAAZ8C,IAAAA,OAAAA,EAAAA,EAAoBsD,kBAAmB,GAChDC,GAAab,IAAoBhL,GAAM8L,OAAS,EAsGtD,OACE,sB,WACE,SAACC,EAAAA,EAAQA,CAACC,MAAM,oB,UACd,UAACvK,EAAAA,EAAGA,CAACE,EAAG,E,UACLgK,GAAKG,OAAS,GACb,sB,WACE,UAACxJ,EAAAA,EAAUA,CAACC,QAAQ,QAAQJ,MAAM,gBAAgB8J,cAAY,E,UAC3DN,GAAKG,OAAO,cAA4B,IAAhBH,GAAKG,OAAe,IAAM,MAEpDH,GAAKvI,IA7GI8I,I,IAKCA,EAAAA,EACCA,EALtB,MAAMxI,EAAM,GAAGwI,EAAQrC,SAAS/J,aAAaoM,EAAQrC,SAAS1D,OACxDgG,EAAYpD,EAAYuC,IAAIY,EAAQrC,SAAS1D,MAC7CiG,EAAY/C,EAAciC,IAAI5H,GAC9B2I,EAAcnD,EAAaoD,IAAI5I,GAC/B6I,EAA6B,QAAdL,EAAAA,EAAQ1G,cAAR0G,IAAAA,GAAyB,QAAzBA,EAAAA,EAAgBM,iBAAhBN,IAAAA,OAAAA,EAAAA,EAA2B/F,KAC1CsG,GAAkD,KAApB,QAAdP,EAAAA,EAAQ1G,cAAR0G,IAAAA,OAAAA,EAAAA,EAAgBO,eAChCC,EAAgBnD,EAAgB+B,IAAI5H,KAAS+I,EA0BnD,OACE,UAAChL,EAAAA,EAAGA,CAEFC,GAAI,EACJC,EAAG,IACHgL,OAAQ,EACRC,YAAY,WACZ/K,aAAc,E,WAEd,UAACJ,EAAAA,EAAGA,CAACK,QAAQ,OAAO+K,eAAe,gBAAgB9K,WAAW,SAASL,GAAI,E,WACzE,SAACY,EAAAA,EAAUA,CAACC,QAAQ,QAAQP,MAAO,CAAE8K,WAAY,K,SAC9CZ,EAAQrC,SAAS1D,QAEpB,SAAC4G,EAAAA,EAAIA,CAAC/I,MAAOkI,EAAQxB,KAAK1F,SAAU7C,MAAM,UAAU6D,KAAK,aAE1DuG,IACC,UAAC9K,EAAAA,EAAGA,CAACK,QAAQ,OAAOC,WAAW,S,WAC7B,SAACO,EAAAA,EAAUA,CACTC,QAAQ,QACRP,MAAO,CACLgL,WAAY,YACZ5K,SAAU,SACV6K,KAAM,EACNC,SAAU,SACVC,aAAc,Y,SAGff,EACG,aACAD,GAAaE,EACXA,EACAK,IAAkBL,EAChB,iBACA,qBAETF,GAAaE,IACZ,SAACe,EAAAA,GAAOA,CAACpB,MAAM,oB,UACb,SAACqB,EAAAA,EAAUA,CAACrH,KAAK,QAAQzB,QAhDlBC,UACb6H,UACIiB,UAAUC,UAAUC,UAAUnB,GACpC/L,EAASmF,KAAK,CACZC,QAAS,8BACTC,SAAU,UACV7D,QAAS,gB,UA2CD,SAAC2L,EAAAA,EAAYA,CAACrL,SAAS,eAI7B,SAACgL,EAAAA,GAAOA,CACNpB,MACEU,IAAkBL,EACd,qBACAF,EACE,eACA,iC,UAGR,SAACuB,OAAAA,C,UACC,SAACL,EAAAA,EAAUA,CACTrH,KAAK,QACLzB,QA9EY,KACpB4H,GA7CiB,EAACwB,EAA0BC,KAClD,MAAMlK,EAAM,GAAGiK,KAAoBC,IACnCzE,EAAiBiC,IACf,MAAMyC,EAAO,IAAIzE,IAAIgC,GAErB,OADAyC,EAAKtC,OAAO7H,GACLmK,KAyCLC,CAAiB5B,EAAQrC,SAAS/J,UAAWoM,EAAQrC,SAAS1D,MAC9D+E,GAAiBgB,EAAQrC,SAAS1D,OACxBuG,IACV9C,EAAoB,CAClB9J,UAAWoM,EAAQrC,SAAS/J,UAC5BqG,KAAM+F,EAAQrC,SAAS1D,OAEzBuD,GAAuB,KAsEbhH,SAAU0J,GAAcM,IAAkBL,E,SAEzCF,GAAY,SAAC4B,EAAAA,EAAiBA,CAAC3L,SAAS,WAAa,SAAC4L,EAAAA,EAAcA,CAAC5L,SAAS,qBAvDpF8J,EAAQrC,SAAS1D,YA6ElB,SAAC7D,EAAAA,EAAUA,CAACC,QAAQ,QAAQ0J,cAAY,E,SAAC,kDAI3C,SAACxK,EAAAA,EAAGA,CAACwM,GAAI,E,SACNpC,IACC,SAACvH,EAAAA,EAAMA,CACL/B,QAAQ,YACRJ,MAAM,UACN6D,KAAK,QACLF,WAAW,SAACoI,EAAAA,EAAOA,CAAAA,GACnB3J,QAAS,IAAMqE,GAAqB,G,SACrC,wBAID,SAACtG,EAAAA,EAAUA,CAACC,QAAQ,UAAUJ,MAAM,gB,SAAgB,6DAQ5D,SAAC1C,EAAAA,EAAmBA,CAClBC,KAAMiJ,EACNhJ,QAAS,IAAMiJ,GAAqB,GACpChJ,UAAW,KACTgJ,GAAqB,GACrBE,EAAY2B,GAAMA,EAAI,IAExB5K,eAAgBA,GAChBC,UAAWA,GACXC,UAAWA,EACXC,MAAOA,MAGT,UAACoB,EAAAA,EAAMA,CACL1B,KAAM+J,EACN9J,QAAS,KACP+J,GAAuB,GACvBE,EAAoB,OAEtBvI,SAAS,K,WAET,SAACE,EAAAA,EAAWA,C,UACV,UAACE,EAAAA,EAAGA,CAACK,QAAQ,OAAOC,WAAW,S,WAC7B,SAACoM,EAAAA,EAAWA,CAAChM,MAAM,UAAUH,MAAO,CAAEoM,YAAa,KAAO,qBAI9D,UAAC5M,EAAAA,EAAaA,C,WACZ,UAACc,EAAAA,EAAUA,CAACC,QAAQ,QAAQ8L,WAAS,E,UAAC,oCACJ,SAACC,SAAAA,C,SAAO,SAAa,wEAGvD,SAAChM,EAAAA,EAAUA,CAACC,QAAQ,QAAQJ,MAAM,gB,SAAgB,0EAIpD,UAACkC,EAAAA,EAAaA,C,WACZ,SAACC,EAAAA,EAAMA,CACLC,QAAS,KACPmF,GAAuB,GACvBE,EAAoB,O,SAEvB,YAGD,SAACtF,EAAAA,EAAMA,CACL/B,QAAQ,YACRJ,MAAM,UACNoC,QAAS,KACHoF,IA9PcnF,OAAOmJ,EAA0BC,KAC7D,MAAMlK,EAAM,GAAGiK,KAAoBC,IACnC,IAAIvE,EAAciC,IAAI5H,GAAtB,CAIA4F,EAAkB8B,GAAS,IAAInC,IAAImC,GAAMI,IAAI9H,IAC7C,IACE,MAAMe,QAAiBrE,EAASsE,MAC9B,GAAGlE,0BAAmCmN,KAAoBC,YAE5D,GAAInJ,EAASS,GAAI,CACf,MAAM4F,QAAarG,EAASW,OAC5B+D,EAAiBiC,GAAS,IAAIhC,IAAIgC,GAAMmD,IAAI7K,EAAKoH,EAAK0D,SACtDhF,EAAoB4B,GAAS,IAAInC,IAAImC,GAAMI,IAAI9H,GACjD,MAA+B,MAApBe,EAASe,SAClBgE,EAAoB4B,GAAS,IAAInC,IAAImC,GAAMI,IAAI9H,IAC/CpD,EAASmF,KAAK,CACZC,QAAS,sEACTC,SAAU,UACV7D,QAAS,cAGf,CAAE,MAAO8D,GACP6I,QAAQlJ,MAAM,2BAA4BK,EAC5C,CAAE,QACA0D,EAAkB8B,IAChB,MAAMyC,EAAO,IAAI5E,IAAImC,GAErB,OADAyC,EAAKtC,OAAO7H,GACLmK,GAEX,CA3BA,GA2PYa,CACE/E,EAAiB7J,UACjB6J,EAAiBxD,MAEnB+E,GAAiBvB,EAAiBxD,OAEpCuD,GAAuB,GACvBE,EAAoB,O,SAEvB,4B","sources":["webpack://internal.plugin-kuadrant/./src/components/RequestAccessDialog/RequestAccessDialog.tsx","webpack://internal.plugin-kuadrant/./src/permissions.ts","webpack://internal.plugin-kuadrant/./src/utils/permissions.ts","webpack://internal.plugin-kuadrant/./src/components/ApiAccessCard/ApiAccessCard.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Button,\n TextField,\n Select,\n MenuItem,\n FormControl,\n InputLabel,\n Box,\n Typography,\n CircularProgress,\n} from '@material-ui/core';\nimport InfoIcon from '@material-ui/icons/Info';\nimport {\n useApi,\n configApiRef,\n fetchApiRef,\n alertApiRef,\n} from '@backstage/core-plugin-api';\n\nexport interface Plan {\n tier: string;\n limits?: Record<string, number>;\n}\n\nexport interface RequestAccessDialogProps {\n open: boolean;\n onClose: () => void;\n onSuccess: () => void;\n apiProductName: string;\n namespace: string;\n userEmail: string;\n plans: Plan[];\n}\n\nexport const RequestAccessDialog = ({\n open,\n onClose,\n onSuccess,\n apiProductName,\n namespace,\n userEmail,\n plans,\n}: RequestAccessDialogProps) => {\n const config = useApi(configApiRef);\n const fetchApi = useApi(fetchApiRef);\n const alertApi = useApi(alertApiRef);\n const backendUrl = config.getString('backend.baseUrl');\n\n const [selectedPlan, setSelectedPlan] = useState('');\n const [useCase, setUseCase] = useState('');\n const [creating, setCreating] = useState(false);\n const [createError, setCreateError] = useState<string | null>(null);\n\n const handleClose = () => {\n setSelectedPlan('');\n setUseCase('');\n setCreateError(null);\n onClose();\n };\n\n const handleRequestAccess = async () => {\n if (!selectedPlan) return;\n\n setCreating(true);\n setCreateError(null);\n try {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/requests`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n apiProductName,\n namespace,\n planTier: selectedPlan,\n useCase: useCase.trim() || '',\n userEmail,\n }),\n },\n );\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(\n errorData.error || `failed to create request: ${response.status}`,\n );\n }\n\n alertApi.post({\n message: 'API key requested successfully',\n severity: 'success',\n display: 'transient',\n });\n\n setSelectedPlan('');\n setUseCase('');\n onSuccess();\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : 'unknown error occurred';\n alertApi.post({\n message: `Failed to request API key: ${errorMessage}`,\n severity: 'error',\n display: 'transient',\n });\n setCreateError(errorMessage);\n } finally {\n setCreating(false);\n }\n };\n\n return (\n <Dialog open={open} onClose={handleClose} maxWidth=\"sm\" fullWidth>\n <DialogTitle>Request API Access</DialogTitle>\n <DialogContent>\n <Box\n mb={2}\n p={1.5}\n bgcolor=\"info.light\"\n borderRadius={1}\n display=\"flex\"\n alignItems=\"flex-start\"\n style={{ gap: 8 }}\n >\n <InfoIcon\n color=\"primary\"\n fontSize=\"small\"\n style={{ marginTop: 2 }}\n />\n <Typography variant=\"body2\">\n Your request will be reviewed by an API owner before access is\n granted.\n </Typography>\n </Box>\n {createError && (\n <Box\n mb={2}\n p={2}\n bgcolor=\"error.main\"\n color=\"error.contrastText\"\n borderRadius={1}\n >\n <Typography variant=\"body2\">{createError}</Typography>\n </Box>\n )}\n <FormControl\n fullWidth\n margin=\"normal\"\n disabled={creating}\n data-testid=\"tier-select-form\"\n >\n <InputLabel id=\"tier-select-label\">Select Tier</InputLabel>\n <Select\n labelId=\"tier-select-label\"\n data-testid=\"tier-select\"\n value={selectedPlan}\n onChange={(e) => setSelectedPlan(e.target.value as string)}\n disabled={creating}\n >\n {plans.map((plan: Plan) => {\n const limitDesc = Object.entries(plan.limits || {})\n .map(([key, val]) => `${val} per ${key}`)\n .join(', ');\n return (\n <MenuItem\n key={plan.tier}\n value={plan.tier}\n data-testid={`tier-option-${plan.tier}`}\n >\n {plan.tier} {limitDesc ? `(${limitDesc})` : ''}\n </MenuItem>\n );\n })}\n </Select>\n </FormControl>\n <TextField\n label=\"Use Case (optional)\"\n placeholder=\"Describe how you plan to use this API\"\n multiline\n rows={3}\n fullWidth\n margin=\"normal\"\n value={useCase}\n onChange={(e) => setUseCase(e.target.value)}\n helperText=\"Explain your intended use of this API for admin review\"\n disabled={creating}\n />\n </DialogContent>\n <DialogActions>\n <Button onClick={handleClose} disabled={creating}>\n Cancel\n </Button>\n <Button\n onClick={handleRequestAccess}\n color=\"primary\"\n variant=\"contained\"\n disabled={!selectedPlan || creating}\n startIcon={\n creating ? (\n <CircularProgress size={16} color=\"inherit\" />\n ) : undefined\n }\n >\n {creating ? 'Submitting...' : 'Submit Request'}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n","import { createPermission } from '@backstage/plugin-permission-common';\n\n/**\n * permission definitions for the kuadrant plugin\n *\n * these permissions control access to kuadrant resources and operations.\n * they must match the permissions defined in the backend plugin.\n *\n * permission types:\n * - BasicPermission: standard permission that applies globally\n * - ResourcePermission: permission scoped to specific resource types (e.g., apiproduct)\n *\n * permission patterns:\n * - `.create` - create new resources\n * - `.read` - read resource details\n * - `.read.own` - read only resources owned by the user\n * - `.read.all` - read all resources regardless of ownership\n * - `.update` - modify existing resources\n * - `.delete` - delete resources\n * - `.delete.own` - delete only resources owned by the user\n * - `.delete.all` - delete any resource regardless of ownership\n * - `.list` - list/view collections of resources\n */\n\n// planpolicy permissions\nexport const kuadrantPlanPolicyCreatePermission = createPermission({\n name: 'kuadrant.planpolicy.create',\n attributes: { action: 'create' },\n});\n\nexport const kuadrantPlanPolicyReadPermission = createPermission({\n name: 'kuadrant.planpolicy.read',\n attributes: { action: 'read' },\n});\n\nexport const kuadrantPlanPolicyUpdatePermission = createPermission({\n name: 'kuadrant.planpolicy.update',\n attributes: { action: 'update' },\n});\n\nexport const kuadrantPlanPolicyDeletePermission = createPermission({\n name: 'kuadrant.planpolicy.delete',\n attributes: { action: 'delete' },\n});\n\nexport const kuadrantPlanPolicyListPermission = createPermission({\n name: 'kuadrant.planpolicy.list',\n attributes: { action: 'read' },\n});\n\n// apiproduct permissions\n\n/**\n * permission to create new API products\n * granted to api owners and admins\n */\nexport const kuadrantApiProductCreatePermission = createPermission({\n name: 'kuadrant.apiproduct.create',\n attributes: { action: 'create' },\n});\n\n/**\n * permission to read API products owned by the current user\n * for api owners to view their own products\n */\nexport const kuadrantApiProductReadOwnPermission = createPermission({\n name: 'kuadrant.apiproduct.read.own',\n attributes: { action: 'read' },\n});\n\n/**\n * permission to read all API products regardless of ownership\n * for platform engineers/admins who need to view all products\n */\nexport const kuadrantApiProductReadAllPermission = createPermission({\n name: 'kuadrant.apiproduct.read.all',\n attributes: { action: 'read' },\n});\n\n/**\n * permission to update API products owned by the current user\n * for api owners to modify their own products\n */\nexport const kuadrantApiProductUpdateOwnPermission = createPermission({\n name: 'kuadrant.apiproduct.update.own',\n attributes: { action: 'update' },\n});\n\n/**\n * permission to update any API product regardless of ownership\n * for platform engineers/admins\n */\nexport const kuadrantApiProductUpdateAllPermission = createPermission({\n name: 'kuadrant.apiproduct.update.all',\n attributes: { action: 'update' },\n});\n\n/**\n * permission to delete API products owned by the current user\n * for api owners to remove their own products\n */\nexport const kuadrantApiProductDeleteOwnPermission = createPermission({\n name: 'kuadrant.apiproduct.delete.own',\n attributes: { action: 'delete' },\n});\n\n/**\n * permission to delete any API product regardless of ownership\n * for platform engineers/admins\n */\nexport const kuadrantApiProductDeleteAllPermission = createPermission({\n name: 'kuadrant.apiproduct.delete.all',\n attributes: { action: 'delete' },\n});\n\n/**\n * permission to list API products\n * backend filters results based on .own vs .all read permissions\n */\nexport const kuadrantApiProductListPermission = createPermission({\n name: 'kuadrant.apiproduct.list',\n attributes: { action: 'read' },\n});\n\n// apikey permissions\n\n/**\n * permission to create API keys (request API access)\n *\n * this is a ResourcePermission scoped to 'apiproduct', allowing\n * fine-grained control over which API products users can request access to.\n *\n * use in frontend: useKuadrantPermission(kuadrantApiKeyCreatePermission)\n * use in backend with resource: { permission, resourceRef: 'apiproduct:namespace/name' }\n */\nexport const kuadrantApiKeyCreatePermission = createPermission({\n name: 'kuadrant.apikey.create',\n attributes: { action: 'create' },\n resourceType: 'apiproduct',\n});\n\n/**\n * permission to read API keys owned by the current user\n * allows users to view their own API keys and request history\n */\nexport const kuadrantApiKeyReadOwnPermission = createPermission({\n name: 'kuadrant.apikey.read.own',\n attributes: { action: 'read' },\n});\n\n/**\n * permission to read all API keys regardless of ownership\n * for platform engineers/admins who need to view the approval queue and audit keys\n */\nexport const kuadrantApiKeyReadAllPermission = createPermission({\n name: 'kuadrant.apikey.read.all',\n attributes: { action: 'read' },\n});\n\n/**\n * permission to update API keys owned by the current user\n * allows users to edit their own pending requests (change plan tier, use case)\n */\nexport const kuadrantApiKeyUpdateOwnPermission = createPermission({\n name: 'kuadrant.apikey.update.own',\n attributes: { action: 'update' },\n});\n\n/**\n * permission to update any API key regardless of ownership\n * typically granted to API owners and platform engineers for approving/rejecting requests\n */\nexport const kuadrantApiKeyUpdateAllPermission = createPermission({\n name: 'kuadrant.apikey.update.all',\n attributes: { action: 'update' },\n});\n\n/**\n * permission to delete API keys owned by the current user\n * allows users to cancel their own requests or revoke their own access\n */\nexport const kuadrantApiKeyDeleteOwnPermission = createPermission({\n name: 'kuadrant.apikey.delete.own',\n attributes: { action: 'delete' },\n});\n\n/**\n * permission to delete any API key regardless of ownership\n * for platform engineers/admins who need to revoke access\n */\nexport const kuadrantApiKeyDeleteAllPermission = createPermission({\n name: 'kuadrant.apikey.delete.all',\n attributes: { action: 'delete' },\n});\n\n/**\n * permission to approve/reject API key requests\n * grants access to the approval queue - for API owners and admins only\n * separate from update.own which consumers use to edit their pending requests\n */\nexport const kuadrantApiKeyApprovePermission = createPermission({\n name: 'kuadrant.apikey.approve',\n attributes: { action: 'update' },\n});\n\nexport const kuadrantPermissions = [\n kuadrantPlanPolicyCreatePermission,\n kuadrantPlanPolicyReadPermission,\n kuadrantPlanPolicyUpdatePermission,\n kuadrantPlanPolicyDeletePermission,\n kuadrantPlanPolicyListPermission,\n kuadrantApiProductCreatePermission,\n kuadrantApiProductReadOwnPermission,\n kuadrantApiProductReadAllPermission,\n kuadrantApiProductUpdateOwnPermission,\n kuadrantApiProductUpdateAllPermission,\n kuadrantApiProductDeleteOwnPermission,\n kuadrantApiProductDeleteAllPermission,\n kuadrantApiProductListPermission,\n kuadrantApiKeyCreatePermission,\n kuadrantApiKeyReadOwnPermission,\n kuadrantApiKeyReadAllPermission,\n kuadrantApiKeyUpdateOwnPermission,\n kuadrantApiKeyUpdateAllPermission,\n kuadrantApiKeyDeleteOwnPermission,\n kuadrantApiKeyDeleteAllPermission,\n kuadrantApiKeyApprovePermission,\n];\n","import { usePermission } from '@backstage/plugin-permission-react';\nimport { Permission, ResourcePermission } from '@backstage/plugin-permission-common';\n\n/**\n * result of a permission check including error state\n */\nexport interface PermissionCheckResult {\n allowed: boolean;\n loading: boolean;\n error?: Error;\n}\n\n/**\n * custom hook for checking kuadrant permissions that handles both\n * BasicPermission and ResourcePermission types without type bypasses\n *\n * @param permission - the permission to check\n * @param resourceRef - optional resource reference for ResourcePermissions\n * @returns permission check result with error handling\n *\n * @example\n * // basic permission\n * const { allowed, loading, error } = useKuadrantPermission(\n * kuadrantApiProductListPermission\n * );\n *\n * @example\n * // resource permission\n * const { allowed, loading, error } = useKuadrantPermission(\n * kuadrantApiKeyCreatePermission,\n * 'apiproduct:namespace/name'\n * );\n */\nexport function useKuadrantPermission(\n permission: Permission,\n resourceRef?: string,\n): PermissionCheckResult {\n // construct the permission request based on whether it's a ResourcePermission\n const permissionRequest = 'resourceType' in permission\n ? { permission: permission as ResourcePermission, resourceRef }\n : { permission };\n\n const result = usePermission(permissionRequest as any);\n\n return {\n allowed: result.allowed,\n loading: result.loading,\n error: result.error,\n };\n}\n\n/**\n * helper to determine if a user can delete a specific API key or request\n *\n * @param ownerId - the user id who owns the key/request\n * @param currentUserId - the current user's id\n * @param canDeleteOwn - whether user has permission to delete their own keys\n * @param canDeleteAll - whether user has permission to delete all keys\n * @returns true if user can delete this specific key/request\n */\nexport function canDeleteResource(\n ownerId: string,\n currentUserId: string,\n canDeleteOwn: boolean,\n canDeleteAll: boolean,\n): boolean {\n if (canDeleteAll) return true;\n if (canDeleteOwn && ownerId === currentUserId) return true;\n return false;\n}\n","import React, { useState } from 'react';\nimport { useAsync } from 'react-use';\nimport {\n InfoCard,\n Progress,\n ResponseErrorPanel,\n} from '@backstage/core-components';\nimport {\n Typography,\n Box,\n Chip,\n Button,\n IconButton,\n Tooltip,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n} from '@material-ui/core';\nimport AddIcon from '@material-ui/icons/Add';\nimport VisibilityIcon from '@material-ui/icons/Visibility';\nimport VisibilityOffIcon from '@material-ui/icons/VisibilityOff';\nimport FileCopyIcon from '@material-ui/icons/FileCopy';\nimport WarningIcon from '@material-ui/icons/Warning';\nimport { useApi, configApiRef, identityApiRef, fetchApiRef, alertApiRef } from '@backstage/core-plugin-api';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { RequestAccessDialog, Plan } from '../RequestAccessDialog';\nimport { useKuadrantPermission } from '../../utils/permissions';\nimport { kuadrantApiKeyCreatePermission } from '../../permissions';\n\ninterface APIKey {\n metadata: {\n name: string;\n namespace: string;\n };\n spec: {\n apiProductRef: {\n name: string;\n };\n planTier: string;\n };\n status?: {\n phase: 'Pending' | 'Approved' | 'Rejected';\n secretRef?: {\n name: string;\n key: string;\n };\n canReadSecret?: boolean;\n };\n}\n\ninterface APIProduct {\n metadata: {\n name: string;\n namespace: string;\n };\n status?: {\n discoveredPlans?: Plan[];\n };\n}\n\nexport interface ApiAccessCardProps {\n // deprecated: use entity annotations instead\n namespace?: string;\n}\n\nexport const ApiAccessCard = ({ namespace: propNamespace }: ApiAccessCardProps) => {\n const { entity } = useEntity();\n const config = useApi(configApiRef);\n const identityApi = useApi(identityApiRef);\n const fetchApi = useApi(fetchApiRef);\n const alertApi = useApi(alertApiRef);\n const backendUrl = config.getString('backend.baseUrl');\n const [userEmail, setUserEmail] = useState<string>('');\n const [requestDialogOpen, setRequestDialogOpen] = useState(false);\n const [refresh, setRefresh] = useState(0);\n\n // key reveal state\n const [visibleKeys, setVisibleKeys] = useState<Set<string>>(new Set());\n const [apiKeyValues, setApiKeyValues] = useState<Map<string, string>>(new Map());\n const [apiKeyLoading, setApiKeyLoading] = useState<Set<string>>(new Set());\n const [alreadyReadKeys, setAlreadyReadKeys] = useState<Set<string>>(new Set());\n const [showOnceWarningOpen, setShowOnceWarningOpen] = useState(false);\n const [pendingKeyReveal, setPendingKeyReveal] = useState<{\n namespace: string;\n name: string;\n } | null>(null);\n\n // get apiproduct name from entity annotation (set by entity provider)\n const apiProductName = entity.metadata.annotations?.['kuadrant.io/apiproduct'] || entity.metadata.name;\n const namespace = entity.metadata.annotations?.['kuadrant.io/namespace'] || propNamespace || 'default';\n\n // get current user identity\n useAsync(async () => {\n const profile = await identityApi.getProfileInfo();\n setUserEmail(profile.email || '');\n }, [identityApi]);\n\n // fetch user's approved keys\n const { value: requests, loading: keysLoading, error: keysError } = useAsync(async () => {\n const url = namespace\n ? `${backendUrl}/api/kuadrant/requests/my?namespace=${namespace}`\n : `${backendUrl}/api/kuadrant/requests/my`;\n const response = await fetchApi.fetch(url);\n if (!response.ok) {\n throw new Error('failed to fetch api key requests');\n }\n const data = await response.json();\n const allRequests = data.items || [];\n return allRequests.filter((r: APIKey) =>\n r.spec.apiProductRef?.name === apiProductName && r.status?.phase === 'Approved'\n );\n }, [namespace, apiProductName, backendUrl, fetchApi, refresh]);\n\n // fetch apiproduct to get available plans\n const { value: apiProduct, loading: productLoading } = useAsync(async () => {\n const response = await fetchApi.fetch(`${backendUrl}/api/kuadrant/apiproducts`);\n if (!response.ok) {\n return null;\n }\n const data = await response.json();\n return data.items?.find(\n (p: APIProduct) =>\n p.metadata.namespace === namespace &&\n p.metadata.name === apiProductName,\n );\n }, [namespace, apiProductName, fetchApi, backendUrl]);\n\n const resourceRef = apiProduct\n ? `apiproduct:${apiProduct.metadata.namespace}/${apiProduct.metadata.name}`\n : undefined;\n\n const { allowed: canCreateRequest, loading: permissionLoading } = useKuadrantPermission(\n kuadrantApiKeyCreatePermission,\n resourceRef,\n );\n\n const fetchApiKeyFromSecret = async (requestNamespace: string, requestName: string) => {\n const key = `${requestNamespace}/${requestName}`;\n if (apiKeyLoading.has(key)) {\n return;\n }\n\n setApiKeyLoading((prev) => new Set(prev).add(key));\n try {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/apikeys/${requestNamespace}/${requestName}/secret`,\n );\n if (response.ok) {\n const data = await response.json();\n setApiKeyValues((prev) => new Map(prev).set(key, data.apiKey));\n setAlreadyReadKeys((prev) => new Set(prev).add(key));\n } else if (response.status === 403) {\n setAlreadyReadKeys((prev) => new Set(prev).add(key));\n alertApi.post({\n message: 'This API key has already been viewed and cannot be retrieved again.',\n severity: 'warning',\n display: 'transient',\n });\n }\n } catch (err) {\n console.error('failed to fetch api key:', err);\n } finally {\n setApiKeyLoading((prev) => {\n const next = new Set(prev);\n next.delete(key);\n return next;\n });\n }\n };\n\n const clearApiKeyValue = (requestNamespace: string, requestName: string) => {\n const key = `${requestNamespace}/${requestName}`;\n setApiKeyValues((prev) => {\n const next = new Map(prev);\n next.delete(key);\n return next;\n });\n };\n\n const toggleVisibility = (keyName: string) => {\n setVisibleKeys((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(keyName)) {\n newSet.delete(keyName);\n } else {\n newSet.add(keyName);\n }\n return newSet;\n });\n };\n\n const loading = keysLoading || productLoading || permissionLoading;\n\n if (loading) {\n return <Progress />;\n }\n\n if (keysError) {\n return <ResponseErrorPanel error={keysError} />;\n }\n\n const keys = (requests as APIKey[]) || [];\n const plans = (apiProduct?.status?.discoveredPlans || []) as Plan[];\n const canRequest = canCreateRequest && plans.length > 0;\n\n const renderKeyRow = (request: APIKey) => {\n const key = `${request.metadata.namespace}/${request.metadata.name}`;\n const isVisible = visibleKeys.has(request.metadata.name);\n const isLoading = apiKeyLoading.has(key);\n const apiKeyValue = apiKeyValues.get(key);\n const hasSecretRef = request.status?.secretRef?.name;\n const canReadSecret = request.status?.canReadSecret !== false;\n const isAlreadyRead = alreadyReadKeys.has(key) || !canReadSecret;\n\n const handleRevealClick = () => {\n if (isVisible) {\n clearApiKeyValue(request.metadata.namespace, request.metadata.name);\n toggleVisibility(request.metadata.name);\n } else if (!isAlreadyRead) {\n setPendingKeyReveal({\n namespace: request.metadata.namespace,\n name: request.metadata.name,\n });\n setShowOnceWarningOpen(true);\n }\n };\n\n const handleCopy = async () => {\n if (apiKeyValue) {\n await navigator.clipboard.writeText(apiKeyValue);\n alertApi.post({\n message: 'API key copied to clipboard',\n severity: 'success',\n display: 'transient',\n });\n }\n };\n\n return (\n <Box\n key={request.metadata.name}\n mb={1}\n p={1.5}\n border={1}\n borderColor=\"grey.300\"\n borderRadius={4}\n >\n <Box display=\"flex\" justifyContent=\"space-between\" alignItems=\"center\" mb={1}>\n <Typography variant=\"body2\" style={{ fontWeight: 500 }}>\n {request.metadata.name}\n </Typography>\n <Chip label={request.spec.planTier} color=\"primary\" size=\"small\" />\n </Box>\n {hasSecretRef && (\n <Box display=\"flex\" alignItems=\"center\">\n <Typography\n variant=\"body2\"\n style={{\n fontFamily: 'monospace',\n fontSize: '0.8rem',\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {isLoading\n ? 'Loading...'\n : isVisible && apiKeyValue\n ? apiKeyValue\n : isAlreadyRead && !apiKeyValue\n ? 'Already viewed'\n : '••••••••••••••••'}\n </Typography>\n {isVisible && apiKeyValue && (\n <Tooltip title=\"Copy to clipboard\">\n <IconButton size=\"small\" onClick={handleCopy}>\n <FileCopyIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n <Tooltip\n title={\n isAlreadyRead && !apiKeyValue\n ? 'Key already viewed'\n : isVisible\n ? 'Hide API key'\n : 'Reveal API key (one-time only)'\n }\n >\n <span>\n <IconButton\n size=\"small\"\n onClick={handleRevealClick}\n disabled={isLoading || (isAlreadyRead && !apiKeyValue)}\n >\n {isVisible ? <VisibilityOffIcon fontSize=\"small\" /> : <VisibilityIcon fontSize=\"small\" />}\n </IconButton>\n </span>\n </Tooltip>\n </Box>\n )}\n </Box>\n );\n };\n\n return (\n <>\n <InfoCard title=\"Kuadrant API Keys\">\n <Box p={2}>\n {keys.length > 0 ? (\n <>\n <Typography variant=\"body2\" color=\"textSecondary\" gutterBottom>\n {keys.length} active key{keys.length !== 1 ? 's' : ''}\n </Typography>\n {keys.map(renderKeyRow)}\n </>\n ) : (\n <Typography variant=\"body1\" gutterBottom>\n You don't have any API keys for this API yet\n </Typography>\n )}\n <Box mt={2}>\n {canRequest ? (\n <Button\n variant=\"contained\"\n color=\"primary\"\n size=\"small\"\n startIcon={<AddIcon />}\n onClick={() => setRequestDialogOpen(true)}\n >\n Request API Access\n </Button>\n ) : (\n <Typography variant=\"caption\" color=\"textSecondary\">\n Visit the API Keys tab to view and manage access\n </Typography>\n )}\n </Box>\n </Box>\n </InfoCard>\n\n <RequestAccessDialog\n open={requestDialogOpen}\n onClose={() => setRequestDialogOpen(false)}\n onSuccess={() => {\n setRequestDialogOpen(false);\n setRefresh((r) => r + 1);\n }}\n apiProductName={apiProductName}\n namespace={namespace}\n userEmail={userEmail}\n plans={plans}\n />\n\n <Dialog\n open={showOnceWarningOpen}\n onClose={() => {\n setShowOnceWarningOpen(false);\n setPendingKeyReveal(null);\n }}\n maxWidth=\"sm\"\n >\n <DialogTitle>\n <Box display=\"flex\" alignItems=\"center\">\n <WarningIcon color=\"primary\" style={{ marginRight: 8 }} />\n View API Key\n </Box>\n </DialogTitle>\n <DialogContent>\n <Typography variant=\"body1\" paragraph>\n This API key can only be viewed <strong>once</strong>. After you\n reveal it, you will not be able to retrieve it again.\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Make sure to copy and store it securely before closing this view.\n </Typography>\n </DialogContent>\n <DialogActions>\n <Button\n onClick={() => {\n setShowOnceWarningOpen(false);\n setPendingKeyReveal(null);\n }}\n >\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={() => {\n if (pendingKeyReveal) {\n fetchApiKeyFromSecret(\n pendingKeyReveal.namespace,\n pendingKeyReveal.name,\n );\n toggleVisibility(pendingKeyReveal.name);\n }\n setShowOnceWarningOpen(false);\n setPendingKeyReveal(null);\n }}\n >\n Reveal API Key\n </Button>\n </DialogActions>\n </Dialog>\n </>\n );\n};\n"],"names":["RequestAccessDialog","open","onClose","onSuccess","apiProductName","namespace","userEmail","plans","config","useApi","configApiRef","fetchApi","fetchApiRef","alertApi","alertApiRef","backendUrl","getString","selectedPlan","setSelectedPlan","useState","useCase","setUseCase","creating","setCreating","createError","setCreateError","handleClose","Dialog","maxWidth","fullWidth","DialogTitle","DialogContent","Box","mb","p","bgcolor","borderRadius","display","alignItems","style","gap","InfoIcon","color","fontSize","marginTop","Typography","variant","FormControl","margin","disabled","data-testid","InputLabel","id","Select","labelId","value","onChange","e","target","map","plan","limitDesc","Object","entries","limits","key","val","join","MenuItem","tier","TextField","label","placeholder","multiline","rows","helperText","DialogActions","Button","onClick","async","response","fetch","method","headers","body","JSON","stringify","planTier","trim","ok","errorData","json","catch","Error","error","status","post","message","severity","err","errorMessage","startIcon","CircularProgress","size","undefined","createPermission","name","attributes","action","kuadrantPlanPolicyListPermission","kuadrantApiProductCreatePermission","kuadrantApiProductReadAllPermission","kuadrantApiProductUpdateOwnPermission","kuadrantApiProductUpdateAllPermission","kuadrantApiProductDeleteOwnPermission","kuadrantApiProductDeleteAllPermission","kuadrantApiProductListPermission","kuadrantApiKeyCreatePermission","resourceType","kuadrantApiKeyReadOwnPermission","kuadrantApiKeyUpdateOwnPermission","kuadrantApiKeyUpdateAllPermission","kuadrantApiKeyDeleteOwnPermission","kuadrantApiKeyDeleteAllPermission","kuadrantApiKeyApprovePermission","useKuadrantPermission","permission","resourceRef","permissionRequest","result","usePermission","allowed","loading","canDeleteResource","ownerId","currentUserId","canDeleteOwn","canDeleteAll","ApiAccessCard","propNamespace","entity","apiProduct","useEntity","identityApi","identityApiRef","setUserEmail","requestDialogOpen","setRequestDialogOpen","refresh","setRefresh","visibleKeys","setVisibleKeys","Set","apiKeyValues","setApiKeyValues","Map","apiKeyLoading","setApiKeyLoading","alreadyReadKeys","setAlreadyReadKeys","showOnceWarningOpen","setShowOnceWarningOpen","pendingKeyReveal","setPendingKeyReveal","metadata","annotations","useAsync","profile","getProfileInfo","email","requests","keysLoading","keysError","url","items","filter","r","spec","apiProductRef","phase","productLoading","data","find","canCreateRequest","permissionLoading","toggleVisibility","keyName","prev","newSet","has","delete","add","Progress","ResponseErrorPanel","keys","discoveredPlans","canRequest","length","InfoCard","title","gutterBottom","request","isVisible","isLoading","apiKeyValue","get","hasSecretRef","secretRef","canReadSecret","isAlreadyRead","border","borderColor","justifyContent","fontWeight","Chip","fontFamily","flex","overflow","textOverflow","Tooltip","IconButton","navigator","clipboard","writeText","FileCopyIcon","span","requestNamespace","requestName","next","clearApiKeyValue","VisibilityOffIcon","VisibilityIcon","mt","AddIcon","WarningIcon","marginRight","paragraph","strong","set","apiKey","console","fetchApiKeyFromSecret"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[5235],{137:(e,a,t)=>{t.d(a,{A:()=>m});var n=t(89575),o=t(90689),r=t(39850),i=t(95478),l=t(36274),c=t(45065),d=t(41682),s=t(7031),u=t(29365),p=i.forwardRef(function(e,a){var t=e.autoFocus,s=e.checked,p=e.checkedIcon,m=e.classes,h=e.className,f=e.defaultChecked,v=e.disabled,g=e.icon,A=e.id,b=e.inputProps,y=e.inputRef,k=e.name,x=e.onBlur,C=e.onChange,E=e.onFocus,w=e.readOnly,R=e.required,N=e.tabIndex,z=e.type,S=e.value,P=(0,r.A)(e,["autoFocus","checked","checkedIcon","classes","className","defaultChecked","disabled","icon","id","inputProps","inputRef","name","onBlur","onChange","onFocus","readOnly","required","tabIndex","type","value"]),M=(0,c.A)({controlled:s,default:Boolean(f),name:"SwitchBase",state:"checked"}),B=(0,o.A)(M,2),I=B[0],L=B[1],$=(0,d.A)(),H=v;$&&void 0===H&&(H=$.disabled);var T="checkbox"===z||"radio"===z;return i.createElement(u.A,(0,n.A)({component:"span",className:(0,l.A)(m.root,h,I&&m.checked,H&&m.disabled),disabled:H,tabIndex:null,role:void 0,onFocus:function(e){E&&E(e),$&&$.onFocus&&$.onFocus(e)},onBlur:function(e){x&&x(e),$&&$.onBlur&&$.onBlur(e)},ref:a},P),i.createElement("input",(0,n.A)({autoFocus:t,checked:s,defaultChecked:f,className:m.input,disabled:H,id:T&&A,name:k,onChange:function(e){var a=e.target.checked;L(a),C&&C(e,a)},readOnly:w,ref:y,required:R,tabIndex:N,type:z,value:S},b)),I?p:g)});const m=(0,s.A)({root:{padding:9},checked:{},disabled:{},input:{cursor:"inherit",position:"absolute",opacity:0,width:"100%",height:"100%",top:0,left:0,margin:0,padding:0,zIndex:1}},{name:"PrivateSwitchBase"})(p)},9719:(e,a,t)=>{t.d(a,{A:()=>u});var n=t(89575),o=t(39850),r=t(95478),i=t(36274),l=t(7031),c=t(75614),d=t(268),s=r.forwardRef(function(e,a){var t=e.classes,l=e.className,d=e.component,s=void 0===d?"tr":d,u=e.hover,p=void 0!==u&&u,m=e.selected,h=void 0!==m&&m,f=(0,o.A)(e,["classes","className","component","hover","selected"]),v=r.useContext(c.A);return r.createElement(s,(0,n.A)({ref:a,className:(0,i.A)(t.root,l,v&&{head:t.head,footer:t.footer}[v.variant],p&&t.hover,h&&t.selected),role:"tr"===s?null:"row"},f))});const u=(0,l.A)(function(e){return{root:{color:"inherit",display:"table-row",verticalAlign:"middle",outline:0,"&$hover:hover":{backgroundColor:e.palette.action.hover},"&$selected, &$selected:hover":{backgroundColor:(0,d.X4)(e.palette.secondary.main,e.palette.action.selectedOpacity)}},selected:{},hover:{},head:{},footer:{}}},{name:"MuiTableRow"})(s)},12981:(e,a,t)=>{t.d(a,{A:()=>d});var n=t(89575),o=t(39850),r=t(95478),i=t(36274),l=t(7031),c=r.forwardRef(function(e,a){var t=e.classes,l=e.className,c=e.row,d=void 0!==c&&c,s=(0,o.A)(e,["classes","className","row"]);return r.createElement("div",(0,n.A)({className:(0,i.A)(t.root,l,d&&t.row),ref:a},s))});const d=(0,l.A)({root:{display:"flex",flexDirection:"column",flexWrap:"wrap"},row:{flexDirection:"row"}},{name:"MuiFormGroup"})(c)},13677:(e,a,t)=>{t.d(a,{A:()=>p});var n=t(89575),o=t(39850),r=t(95478),i=t(36274),l=t(7031),c=t(75614),d={variant:"body"},s="tbody",u=r.forwardRef(function(e,a){var t=e.classes,l=e.className,u=e.component,p=void 0===u?s:u,m=(0,o.A)(e,["classes","className","component"]);return r.createElement(c.A.Provider,{value:d},r.createElement(p,(0,n.A)({className:(0,i.A)(t.root,l),ref:a,role:p===s?null:"rowgroup"},m)))});const p=(0,l.A)({root:{display:"table-row-group"}},{name:"MuiTableBody"})(u)},29635:(e,a,t)=>{t.d(a,{A:()=>p});var n=t(89575),o=t(90689),r=t(39850),i=t(95478),l=t(12981),c=t(19878),d=t(45065),s=t(70108),u=t(18955);const p=i.forwardRef(function(e,a){var t=e.actions,p=e.children,m=e.name,h=e.value,f=e.onChange,v=(0,r.A)(e,["actions","children","name","value","onChange"]),g=i.useRef(null),A=(0,d.A)({controlled:h,default:e.defaultValue,name:"RadioGroup"}),b=(0,o.A)(A,2),y=b[0],k=b[1];i.useImperativeHandle(t,function(){return{focus:function(){var e=g.current.querySelector("input:not(:disabled):checked");e||(e=g.current.querySelector("input:not(:disabled)")),e&&e.focus()}}},[]);var x=(0,c.A)(a,g),C=(0,u.A)(m);return i.createElement(s.A.Provider,{value:{name:C,onChange:function(e){k(e.target.value),f&&f(e,e.target.value)},value:y}},i.createElement(l.A,(0,n.A)({role:"radiogroup",ref:x},v),p))})},30285:(e,a,t)=>{t.d(a,{A:()=>y});var n=t(89575),o=t(39850),r=t(95478),i=t(36274),l=t(137),c=t(38483);const d=(0,c.A)(r.createElement("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"}),"RadioButtonUnchecked"),s=(0,c.A)(r.createElement("path",{d:"M8.465 8.465C9.37 7.56 10.62 7 12 7C14.76 7 17 9.24 17 12C17 13.38 16.44 14.63 15.535 15.535C14.63 16.44 13.38 17 12 17C9.24 17 7 14.76 7 12C7 10.62 7.56 9.37 8.465 8.465Z"}),"RadioButtonChecked");var u=t(7031);const p=(0,u.A)(function(e){return{root:{position:"relative",display:"flex","&$checked $layer":{transform:"scale(1)",transition:e.transitions.create("transform",{easing:e.transitions.easing.easeOut,duration:e.transitions.duration.shortest})}},layer:{left:0,position:"absolute",transform:"scale(0)",transition:e.transitions.create("transform",{easing:e.transitions.easing.easeIn,duration:e.transitions.duration.shortest})},checked:{}}},{name:"PrivateRadioButtonIcon"})(function(e){var a=e.checked,t=e.classes,n=e.fontSize;return r.createElement("div",{className:(0,i.A)(t.root,a&&t.checked)},r.createElement(d,{fontSize:n}),r.createElement(s,{fontSize:n,className:t.layer}))});var m=t(268),h=t(11192),f=t(37260),v=t(66912),g=r.createElement(p,{checked:!0}),A=r.createElement(p,null),b=r.forwardRef(function(e,a){var t=e.checked,c=e.classes,d=e.color,s=void 0===d?"secondary":d,u=e.name,p=e.onChange,m=e.size,b=void 0===m?"medium":m,y=(0,o.A)(e,["checked","classes","color","name","onChange","size"]),k=(0,v.A)(),x=t,C=(0,f.A)(p,k&&k.onChange),E=u;return k&&(void 0===x&&(x=k.value===e.value),void 0===E&&(E=k.name)),r.createElement(l.A,(0,n.A)({color:s,type:"radio",icon:r.cloneElement(A,{fontSize:"small"===b?"small":"medium"}),checkedIcon:r.cloneElement(g,{fontSize:"small"===b?"small":"medium"}),classes:{root:(0,i.A)(c.root,c["color".concat((0,h.A)(s))]),checked:c.checked,disabled:c.disabled},name:E,checked:x,onChange:C,ref:a},y))});const y=(0,u.A)(function(e){return{root:{color:e.palette.text.secondary},checked:{},disabled:{},colorPrimary:{"&$checked":{color:e.palette.primary.main,"&:hover":{backgroundColor:(0,m.X4)(e.palette.primary.main,e.palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:"transparent"}}},"&$disabled":{color:e.palette.action.disabled}},colorSecondary:{"&$checked":{color:e.palette.secondary.main,"&:hover":{backgroundColor:(0,m.X4)(e.palette.secondary.main,e.palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:"transparent"}}},"&$disabled":{color:e.palette.action.disabled}}}},{name:"MuiRadio"})(b)},34839:(e,a,t)=>{t.d(a,{A:()=>u});var n=t(89575),o=t(39850),r=t(95478),i=t(36274),l=t(72501),c=t(7031),d=t(42062),s=r.forwardRef(function(e,a){var t=e.children,c=e.classes,s=e.className,u=e.component,p=void 0===u?"div":u,m=e.disablePointerEvents,h=void 0!==m&&m,f=e.disableTypography,v=void 0!==f&&f,g=e.position,A=e.variant,b=(0,o.A)(e,["children","classes","className","component","disablePointerEvents","disableTypography","position","variant"]),y=(0,d.t)()||{},k=A;return A&&y.variant,y&&!k&&(k=y.variant),r.createElement(d.A.Provider,{value:null},r.createElement(p,(0,n.A)({className:(0,i.A)(c.root,s,"end"===g?c.positionEnd:c.positionStart,h&&c.disablePointerEvents,y.hiddenLabel&&c.hiddenLabel,"filled"===k&&c.filled,"dense"===y.margin&&c.marginDense),ref:a},b),"string"!=typeof t||v?t:r.createElement(l.A,{color:"textSecondary"},t)))});const u=(0,c.A)({root:{display:"flex",height:"0.01em",maxHeight:"2em",alignItems:"center",whiteSpace:"nowrap"},filled:{"&$positionStart:not($hiddenLabel)":{marginTop:16}},positionStart:{marginRight:8},positionEnd:{marginLeft:8},disablePointerEvents:{pointerEvents:"none"},hiddenLabel:{},marginDense:{}},{name:"MuiInputAdornment"})(s)},47625:(e,a,t)=>{t.d(a,{A:()=>p});var n=t(89575),o=t(39850),r=t(95478),i=t(36274),l=t(7031),c=t(75614),d={variant:"head"},s="thead",u=r.forwardRef(function(e,a){var t=e.classes,l=e.className,u=e.component,p=void 0===u?s:u,m=(0,o.A)(e,["classes","className","component"]);return r.createElement(c.A.Provider,{value:d},r.createElement(p,(0,n.A)({className:(0,i.A)(t.root,l),ref:a,role:p===s?null:"rowgroup"},m)))});const p=(0,l.A)({root:{display:"table-header-group"}},{name:"MuiTableHead"})(u)},54801:(e,a,t)=>{t.d(a,{A:()=>m});var n=t(39850),o=t(89575),r=t(95478),i=t(36274),l=t(7031),c=t(11192),d=t(268),s=t(98394),u=t(75614),p=r.forwardRef(function(e,a){var t,l,d=e.align,p=void 0===d?"inherit":d,m=e.classes,h=e.className,f=e.component,v=e.padding,g=e.scope,A=e.size,b=e.sortDirection,y=e.variant,k=(0,n.A)(e,["align","classes","className","component","padding","scope","size","sortDirection","variant"]),x=r.useContext(s.A),C=r.useContext(u.A),E=C&&"head"===C.variant;f?(l=f,t=E?"columnheader":"cell"):l=E?"th":"td";var w=g;!w&&E&&(w="col");var R=v||(x&&x.padding?x.padding:"normal"),N=A||(x&&x.size?x.size:"medium"),z=y||C&&C.variant,S=null;return b&&(S="asc"===b?"ascending":"descending"),r.createElement(l,(0,o.A)({ref:a,className:(0,i.A)(m.root,m[z],h,"inherit"!==p&&m["align".concat((0,c.A)(p))],"normal"!==R&&m["padding".concat((0,c.A)(R))],"medium"!==N&&m["size".concat((0,c.A)(N))],"head"===z&&x&&x.stickyHeader&&m.stickyHeader),"aria-sort":S,role:t,scope:w},k))});const m=(0,l.A)(function(e){return{root:(0,o.A)({},e.typography.body2,{display:"table-cell",verticalAlign:"inherit",borderBottom:"1px solid\n ".concat("light"===e.palette.type?(0,d.a)((0,d.X4)(e.palette.divider,1),.88):(0,d.e$)((0,d.X4)(e.palette.divider,1),.68)),textAlign:"left",padding:16}),head:{color:e.palette.text.primary,lineHeight:e.typography.pxToRem(24),fontWeight:e.typography.fontWeightMedium},body:{color:e.palette.text.primary},footer:{color:e.palette.text.secondary,lineHeight:e.typography.pxToRem(21),fontSize:e.typography.pxToRem(12)},sizeSmall:{padding:"6px 24px 6px 16px","&:last-child":{paddingRight:16},"&$paddingCheckbox":{width:24,padding:"0 12px 0 16px","&:last-child":{paddingLeft:12,paddingRight:16},"& > *":{padding:0}}},paddingCheckbox:{width:48,padding:"0 0 0 4px","&:last-child":{paddingLeft:0,paddingRight:4}},paddingNone:{padding:0,"&:last-child":{padding:0}},alignLeft:{textAlign:"left"},alignCenter:{textAlign:"center"},alignRight:{textAlign:"right",flexDirection:"row-reverse"},alignJustify:{textAlign:"justify"},stickyHeader:{position:"sticky",top:0,left:0,zIndex:2,backgroundColor:e.palette.background.default}}},{name:"MuiTableCell"})(p)},59461:(e,a,t)=>{t.d(a,{A:()=>c});var n=t(89575),o=t(95478),r=t(7031),i=t(72501),l=o.forwardRef(function(e,a){return o.createElement(i.A,(0,n.A)({component:"p",variant:"body1",color:"textSecondary",ref:a},e))});const c=(0,r.A)({root:{marginBottom:12}},{name:"MuiDialogContentText"})(l)},61009:(e,a,t)=>{t.d(a,{A:()=>u});var n=t(39850),o=t(89575),r=t(95478),i=t(36274),l=t(7031),c=t(98394),d="table",s=r.forwardRef(function(e,a){var t=e.classes,l=e.className,s=e.component,u=void 0===s?d:s,p=e.padding,m=void 0===p?"normal":p,h=e.size,f=void 0===h?"medium":h,v=e.stickyHeader,g=void 0!==v&&v,A=(0,n.A)(e,["classes","className","component","padding","size","stickyHeader"]),b=r.useMemo(function(){return{padding:m,size:f,stickyHeader:g}},[m,f,g]);return r.createElement(c.A.Provider,{value:b},r.createElement(u,(0,o.A)({role:u===d?null:"table",ref:a,className:(0,i.A)(t.root,l,g&&t.stickyHeader)},A)))});const u=(0,l.A)(function(e){return{root:{display:"table",width:"100%",borderCollapse:"collapse",borderSpacing:0,"& caption":(0,o.A)({},e.typography.body2,{padding:e.spacing(2),color:e.palette.text.secondary,textAlign:"left",captionSide:"bottom"})},stickyHeader:{borderCollapse:"separate"}}},{name:"MuiTable"})(s)},66912:(e,a,t)=>{t.d(a,{A:()=>r});var n=t(95478),o=t(70108);function r(){return n.useContext(o.A)}},70108:(e,a,t)=>{t.d(a,{A:()=>n});const n=t(95478).createContext()},75614:(e,a,t)=>{t.d(a,{A:()=>n});const n=t(95478).createContext()},75625:(e,a,t)=>{var n=t(4293),o=t(78920);a.A=void 0;var r=o(t(95478)),i=(0,n(t(74044)).default)(r.createElement("path",{d:"M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34a.9959.9959 0 00-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z"}),"Edit");a.A=i},86901:(e,a,t)=>{t.d(a,{A:()=>p});var n=t(89575),o=t(39850),r=t(95478),i=t(36274),l=t(41682),c=t(7031),d=t(72501),s=t(11192),u=r.forwardRef(function(e,a){e.checked;var t=e.classes,c=e.className,u=e.control,p=e.disabled,m=(e.inputRef,e.label),h=e.labelPlacement,f=void 0===h?"end":h,v=(e.name,e.onChange,e.value,(0,o.A)(e,["checked","classes","className","control","disabled","inputRef","label","labelPlacement","name","onChange","value"])),g=(0,l.A)(),A=p;void 0===A&&void 0!==u.props.disabled&&(A=u.props.disabled),void 0===A&&g&&(A=g.disabled);var b={disabled:A};return["checked","name","onChange","value","inputRef"].forEach(function(a){void 0===u.props[a]&&void 0!==e[a]&&(b[a]=e[a])}),r.createElement("label",(0,n.A)({className:(0,i.A)(t.root,c,"end"!==f&&t["labelPlacement".concat((0,s.A)(f))],A&&t.disabled),ref:a},v),r.cloneElement(u,b),r.createElement(d.A,{component:"span",className:(0,i.A)(t.label,A&&t.disabled)},m))});const p=(0,c.A)(function(e){return{root:{display:"inline-flex",alignItems:"center",cursor:"pointer",verticalAlign:"middle",WebkitTapHighlightColor:"transparent",marginLeft:-11,marginRight:16,"&$disabled":{cursor:"default"}},labelPlacementStart:{flexDirection:"row-reverse",marginLeft:16,marginRight:-11},labelPlacementTop:{flexDirection:"column-reverse",marginLeft:16},labelPlacementBottom:{flexDirection:"column",marginLeft:16},disabled:{},label:{"&$disabled":{color:e.palette.text.disabled}}}},{name:"MuiFormControlLabel"})(u)},98394:(e,a,t)=>{t.d(a,{A:()=>n});const n=t(95478).createContext()}}]);
2
+ //# sourceMappingURL=5235.2a59dc45.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static/5235.2a59dc45.chunk.js","mappings":"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","sources":["webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/core/esm/internal/SwitchBase.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/core/esm/TableRow/TableRow.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/core/esm/FormGroup/FormGroup.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/core/esm/TableBody/TableBody.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/core/esm/RadioGroup/RadioGroup.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/core/esm/internal/svg-icons/RadioButtonUnchecked.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/core/esm/internal/svg-icons/RadioButtonChecked.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/core/esm/Radio/RadioButtonIcon.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/core/esm/Radio/Radio.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/core/esm/InputAdornment/InputAdornment.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/core/esm/TableHead/TableHead.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/core/esm/TableCell/TableCell.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/core/esm/DialogContentText/DialogContentText.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/core/esm/Table/Table.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/core/esm/RadioGroup/useRadioGroup.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/core/esm/RadioGroup/RadioGroupContext.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/core/esm/Table/Tablelvl2Context.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/Edit.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/core/esm/FormControlLabel/FormControlLabel.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/core/esm/Table/TableContext.js"],"sourcesContent":["import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport { refType } from '@material-ui/utils';\nimport useControlled from '../utils/useControlled';\nimport useFormControl from '../FormControl/useFormControl';\nimport withStyles from '../styles/withStyles';\nimport IconButton from '../IconButton';\nexport var styles = {\n root: {\n padding: 9\n },\n checked: {},\n disabled: {},\n input: {\n cursor: 'inherit',\n position: 'absolute',\n opacity: 0,\n width: '100%',\n height: '100%',\n top: 0,\n left: 0,\n margin: 0,\n padding: 0,\n zIndex: 1\n }\n};\n/**\n * @ignore - internal component.\n */\n\nvar SwitchBase = /*#__PURE__*/React.forwardRef(function SwitchBase(props, ref) {\n var autoFocus = props.autoFocus,\n checkedProp = props.checked,\n checkedIcon = props.checkedIcon,\n classes = props.classes,\n className = props.className,\n defaultChecked = props.defaultChecked,\n disabledProp = props.disabled,\n icon = props.icon,\n id = props.id,\n inputProps = props.inputProps,\n inputRef = props.inputRef,\n name = props.name,\n onBlur = props.onBlur,\n onChange = props.onChange,\n onFocus = props.onFocus,\n readOnly = props.readOnly,\n required = props.required,\n tabIndex = props.tabIndex,\n type = props.type,\n value = props.value,\n other = _objectWithoutProperties(props, [\"autoFocus\", \"checked\", \"checkedIcon\", \"classes\", \"className\", \"defaultChecked\", \"disabled\", \"icon\", \"id\", \"inputProps\", \"inputRef\", \"name\", \"onBlur\", \"onChange\", \"onFocus\", \"readOnly\", \"required\", \"tabIndex\", \"type\", \"value\"]);\n\n var _useControlled = useControlled({\n controlled: checkedProp,\n default: Boolean(defaultChecked),\n name: 'SwitchBase',\n state: 'checked'\n }),\n _useControlled2 = _slicedToArray(_useControlled, 2),\n checked = _useControlled2[0],\n setCheckedState = _useControlled2[1];\n\n var muiFormControl = useFormControl();\n\n var handleFocus = function handleFocus(event) {\n if (onFocus) {\n onFocus(event);\n }\n\n if (muiFormControl && muiFormControl.onFocus) {\n muiFormControl.onFocus(event);\n }\n };\n\n var handleBlur = function handleBlur(event) {\n if (onBlur) {\n onBlur(event);\n }\n\n if (muiFormControl && muiFormControl.onBlur) {\n muiFormControl.onBlur(event);\n }\n };\n\n var handleInputChange = function handleInputChange(event) {\n var newChecked = event.target.checked;\n setCheckedState(newChecked);\n\n if (onChange) {\n // TODO v5: remove the second argument.\n onChange(event, newChecked);\n }\n };\n\n var disabled = disabledProp;\n\n if (muiFormControl) {\n if (typeof disabled === 'undefined') {\n disabled = muiFormControl.disabled;\n }\n }\n\n var hasLabelFor = type === 'checkbox' || type === 'radio';\n return /*#__PURE__*/React.createElement(IconButton, _extends({\n component: \"span\",\n className: clsx(classes.root, className, checked && classes.checked, disabled && classes.disabled),\n disabled: disabled,\n tabIndex: null,\n role: undefined,\n onFocus: handleFocus,\n onBlur: handleBlur,\n ref: ref\n }, other), /*#__PURE__*/React.createElement(\"input\", _extends({\n autoFocus: autoFocus,\n checked: checkedProp,\n defaultChecked: defaultChecked,\n className: classes.input,\n disabled: disabled,\n id: hasLabelFor && id,\n name: name,\n onChange: handleInputChange,\n readOnly: readOnly,\n ref: inputRef,\n required: required,\n tabIndex: tabIndex,\n type: type,\n value: value\n }, inputProps)), checked ? checkedIcon : icon);\n}); // NB: If changed, please update Checkbox, Switch and Radio\n// so that the API documentation is updated.\n\nprocess.env.NODE_ENV !== \"production\" ? SwitchBase.propTypes = {\n /**\n * If `true`, the `input` element will be focused during the first mount.\n */\n autoFocus: PropTypes.bool,\n\n /**\n * If `true`, the component is checked.\n */\n checked: PropTypes.bool,\n\n /**\n * The icon to display when the component is checked.\n */\n checkedIcon: PropTypes.node.isRequired,\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.isRequired,\n\n /**\n * @ignore\n */\n className: PropTypes.string,\n\n /**\n * @ignore\n */\n defaultChecked: PropTypes.bool,\n\n /**\n * If `true`, the switch will be disabled.\n */\n disabled: PropTypes.bool,\n\n /**\n * The icon to display when the component is unchecked.\n */\n icon: PropTypes.node.isRequired,\n\n /**\n * The id of the `input` element.\n */\n id: PropTypes.string,\n\n /**\n * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n */\n inputProps: PropTypes.object,\n\n /**\n * Pass a ref to the `input` element.\n */\n inputRef: refType,\n\n /*\n * @ignore\n */\n name: PropTypes.string,\n\n /**\n * @ignore\n */\n onBlur: PropTypes.func,\n\n /**\n * Callback fired when the state is changed.\n *\n * @param {object} event The event source of the callback.\n * You can pull out the new checked state by accessing `event.target.checked` (boolean).\n */\n onChange: PropTypes.func,\n\n /**\n * @ignore\n */\n onFocus: PropTypes.func,\n\n /**\n * It prevents the user from changing the value of the field\n * (not from interacting with the field).\n */\n readOnly: PropTypes.bool,\n\n /**\n * If `true`, the `input` element will be required.\n */\n required: PropTypes.bool,\n\n /**\n * @ignore\n */\n tabIndex: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n\n /**\n * The input component prop `type`.\n */\n type: PropTypes.string.isRequired,\n\n /**\n * The value of the component.\n */\n value: PropTypes.any\n} : void 0;\nexport default withStyles(styles, {\n name: 'PrivateSwitchBase'\n})(SwitchBase);","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport withStyles from '../styles/withStyles';\nimport Tablelvl2Context from '../Table/Tablelvl2Context';\nimport { alpha } from '../styles/colorManipulator';\nexport var styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n color: 'inherit',\n display: 'table-row',\n verticalAlign: 'middle',\n // We disable the focus ring for mouse, touch and keyboard users.\n outline: 0,\n '&$hover:hover': {\n backgroundColor: theme.palette.action.hover\n },\n '&$selected, &$selected:hover': {\n backgroundColor: alpha(theme.palette.secondary.main, theme.palette.action.selectedOpacity)\n }\n },\n\n /* Pseudo-class applied to the root element if `selected={true}`. */\n selected: {},\n\n /* Pseudo-class applied to the root element if `hover={true}`. */\n hover: {},\n\n /* Styles applied to the root element if table variant=\"head\". */\n head: {},\n\n /* Styles applied to the root element if table variant=\"footer\". */\n footer: {}\n };\n};\nvar defaultComponent = 'tr';\n/**\n * Will automatically set dynamic row height\n * based on the material table element parent (head, body, etc).\n */\n\nvar TableRow = /*#__PURE__*/React.forwardRef(function TableRow(props, ref) {\n var classes = props.classes,\n className = props.className,\n _props$component = props.component,\n Component = _props$component === void 0 ? defaultComponent : _props$component,\n _props$hover = props.hover,\n hover = _props$hover === void 0 ? false : _props$hover,\n _props$selected = props.selected,\n selected = _props$selected === void 0 ? false : _props$selected,\n other = _objectWithoutProperties(props, [\"classes\", \"className\", \"component\", \"hover\", \"selected\"]);\n\n var tablelvl2 = React.useContext(Tablelvl2Context);\n return /*#__PURE__*/React.createElement(Component, _extends({\n ref: ref,\n className: clsx(classes.root, className, tablelvl2 && {\n 'head': classes.head,\n 'footer': classes.footer\n }[tablelvl2.variant], hover && classes.hover, selected && classes.selected),\n role: Component === defaultComponent ? null : 'row'\n }, other));\n});\nprocess.env.NODE_ENV !== \"production\" ? TableRow.propTypes = {\n /**\n * Should be valid <tr> children such as `TableCell`.\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.isRequired,\n\n /**\n * @ignore\n */\n className: PropTypes.string,\n\n /**\n * The component used for the root node.\n * Either a string to use a HTML element or a component.\n */\n component: PropTypes\n /* @typescript-to-proptypes-ignore */\n .elementType,\n\n /**\n * If `true`, the table row will shade on hover.\n */\n hover: PropTypes.bool,\n\n /**\n * If `true`, the table row will have the selected shading.\n */\n selected: PropTypes.bool\n} : void 0;\nexport default withStyles(styles, {\n name: 'MuiTableRow'\n})(TableRow);","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport withStyles from '../styles/withStyles';\nexport var styles = {\n /* Styles applied to the root element. */\n root: {\n display: 'flex',\n flexDirection: 'column',\n flexWrap: 'wrap'\n },\n\n /* Styles applied to the root element if `row={true}`. */\n row: {\n flexDirection: 'row'\n }\n};\n/**\n * `FormGroup` wraps controls such as `Checkbox` and `Switch`.\n * It provides compact row layout.\n * For the `Radio`, you should be using the `RadioGroup` component instead of this one.\n */\n\nvar FormGroup = /*#__PURE__*/React.forwardRef(function FormGroup(props, ref) {\n var classes = props.classes,\n className = props.className,\n _props$row = props.row,\n row = _props$row === void 0 ? false : _props$row,\n other = _objectWithoutProperties(props, [\"classes\", \"className\", \"row\"]);\n\n return /*#__PURE__*/React.createElement(\"div\", _extends({\n className: clsx(classes.root, className, row && classes.row),\n ref: ref\n }, other));\n});\nprocess.env.NODE_ENV !== \"production\" ? FormGroup.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 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 * Display group of elements in a compact row.\n */\n row: PropTypes.bool\n} : void 0;\nexport default withStyles(styles, {\n name: 'MuiFormGroup'\n})(FormGroup);","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport withStyles from '../styles/withStyles';\nimport Tablelvl2Context from '../Table/Tablelvl2Context';\nexport var styles = {\n /* Styles applied to the root element. */\n root: {\n display: 'table-row-group'\n }\n};\nvar tablelvl2 = {\n variant: 'body'\n};\nvar defaultComponent = 'tbody';\nvar TableBody = /*#__PURE__*/React.forwardRef(function TableBody(props, ref) {\n var classes = props.classes,\n className = props.className,\n _props$component = props.component,\n Component = _props$component === void 0 ? defaultComponent : _props$component,\n other = _objectWithoutProperties(props, [\"classes\", \"className\", \"component\"]);\n\n return /*#__PURE__*/React.createElement(Tablelvl2Context.Provider, {\n value: tablelvl2\n }, /*#__PURE__*/React.createElement(Component, _extends({\n className: clsx(classes.root, className),\n ref: ref,\n role: Component === defaultComponent ? null : 'rowgroup'\n }, other)));\n});\nprocess.env.NODE_ENV !== \"production\" ? TableBody.propTypes = {\n /**\n * The content of the component, normally `TableRow`.\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.isRequired,\n\n /**\n * @ignore\n */\n className: PropTypes.string,\n\n /**\n * The component used for the root node.\n * Either a string to use a HTML element or a component.\n */\n component: PropTypes\n /* @typescript-to-proptypes-ignore */\n .elementType\n} : void 0;\nexport default withStyles(styles, {\n name: 'MuiTableBody'\n})(TableBody);","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport FormGroup from '../FormGroup';\nimport useForkRef from '../utils/useForkRef';\nimport useControlled from '../utils/useControlled';\nimport RadioGroupContext from './RadioGroupContext';\nimport useId from '../utils/unstable_useId';\nvar RadioGroup = /*#__PURE__*/React.forwardRef(function RadioGroup(props, ref) {\n var actions = props.actions,\n children = props.children,\n nameProp = props.name,\n valueProp = props.value,\n onChange = props.onChange,\n other = _objectWithoutProperties(props, [\"actions\", \"children\", \"name\", \"value\", \"onChange\"]);\n\n var rootRef = React.useRef(null);\n\n var _useControlled = useControlled({\n controlled: valueProp,\n default: props.defaultValue,\n name: 'RadioGroup'\n }),\n _useControlled2 = _slicedToArray(_useControlled, 2),\n value = _useControlled2[0],\n setValue = _useControlled2[1];\n\n React.useImperativeHandle(actions, function () {\n return {\n focus: function focus() {\n var input = rootRef.current.querySelector('input:not(:disabled):checked');\n\n if (!input) {\n input = rootRef.current.querySelector('input:not(:disabled)');\n }\n\n if (input) {\n input.focus();\n }\n }\n };\n }, []);\n var handleRef = useForkRef(ref, rootRef);\n\n var handleChange = function handleChange(event) {\n setValue(event.target.value);\n\n if (onChange) {\n onChange(event, event.target.value);\n }\n };\n\n var name = useId(nameProp);\n return /*#__PURE__*/React.createElement(RadioGroupContext.Provider, {\n value: {\n name: name,\n onChange: handleChange,\n value: value\n }\n }, /*#__PURE__*/React.createElement(FormGroup, _extends({\n role: \"radiogroup\",\n ref: handleRef\n }, other), children));\n});\nprocess.env.NODE_ENV !== \"production\" ? RadioGroup.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 content of the component.\n */\n children: PropTypes.node,\n\n /**\n * The default `input` element value. Use when the component is not controlled.\n */\n defaultValue: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.string), PropTypes.number, PropTypes.string]),\n\n /**\n * The name used to reference the value of the control.\n * If you don't provide this prop, it falls back to a randomly generated name.\n */\n name: PropTypes.string,\n\n /**\n * Callback fired when a radio button is selected.\n *\n * @param {object} event The event source of the callback.\n * You can pull out the new value by accessing `event.target.value` (string).\n */\n onChange: PropTypes.func,\n\n /**\n * Value of the selected radio button. The DOM API casts this to a string.\n */\n value: PropTypes.any\n} : void 0;\nexport default RadioGroup;","import * as React from 'react';\nimport createSvgIcon from '../../utils/createSvgIcon';\n/**\n * @ignore - internal component.\n */\n\nexport default createSvgIcon( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"\n}), 'RadioButtonUnchecked');","import * as React from 'react';\nimport createSvgIcon from '../../utils/createSvgIcon';\n/**\n * @ignore - internal component.\n */\n\nexport default createSvgIcon( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M8.465 8.465C9.37 7.56 10.62 7 12 7C14.76 7 17 9.24 17 12C17 13.38 16.44 14.63 15.535 15.535C14.63 16.44 13.38 17 12 17C9.24 17 7 14.76 7 12C7 10.62 7.56 9.37 8.465 8.465Z\"\n}), 'RadioButtonChecked');","import * as React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport RadioButtonUncheckedIcon from '../internal/svg-icons/RadioButtonUnchecked';\nimport RadioButtonCheckedIcon from '../internal/svg-icons/RadioButtonChecked';\nimport withStyles from '../styles/withStyles';\nexport var styles = function styles(theme) {\n return {\n root: {\n position: 'relative',\n display: 'flex',\n '&$checked $layer': {\n transform: 'scale(1)',\n transition: theme.transitions.create('transform', {\n easing: theme.transitions.easing.easeOut,\n duration: theme.transitions.duration.shortest\n })\n }\n },\n layer: {\n left: 0,\n position: 'absolute',\n transform: 'scale(0)',\n transition: theme.transitions.create('transform', {\n easing: theme.transitions.easing.easeIn,\n duration: theme.transitions.duration.shortest\n })\n },\n checked: {}\n };\n};\n/**\n * @ignore - internal component.\n */\n\nfunction RadioButtonIcon(props) {\n var checked = props.checked,\n classes = props.classes,\n fontSize = props.fontSize;\n return /*#__PURE__*/React.createElement(\"div\", {\n className: clsx(classes.root, checked && classes.checked)\n }, /*#__PURE__*/React.createElement(RadioButtonUncheckedIcon, {\n fontSize: fontSize\n }), /*#__PURE__*/React.createElement(RadioButtonCheckedIcon, {\n fontSize: fontSize,\n className: classes.layer\n }));\n}\n\nprocess.env.NODE_ENV !== \"production\" ? RadioButtonIcon.propTypes = {\n /**\n * If `true`, the component is checked.\n */\n checked: PropTypes.bool,\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.isRequired,\n\n /**\n * The size of the radio.\n * `small` is equivalent to the dense radio styling.\n */\n fontSize: PropTypes.oneOf(['small', 'medium'])\n} : void 0;\nexport default withStyles(styles, {\n name: 'PrivateRadioButtonIcon'\n})(RadioButtonIcon);","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport { refType } from '@material-ui/utils';\nimport SwitchBase from '../internal/SwitchBase';\nimport RadioButtonIcon from './RadioButtonIcon';\nimport { alpha } from '../styles/colorManipulator';\nimport capitalize from '../utils/capitalize';\nimport createChainedFunction from '../utils/createChainedFunction';\nimport withStyles from '../styles/withStyles';\nimport useRadioGroup from '../RadioGroup/useRadioGroup';\nexport var styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n color: theme.palette.text.secondary\n },\n\n /* Pseudo-class applied to the root element if `checked={true}`. */\n checked: {},\n\n /* Pseudo-class applied to the root element if `disabled={true}`. */\n disabled: {},\n\n /* Styles applied to the root element if `color=\"primary\"`. */\n colorPrimary: {\n '&$checked': {\n color: theme.palette.primary.main,\n '&:hover': {\n backgroundColor: alpha(theme.palette.primary.main, theme.palette.action.hoverOpacity),\n // Reset on touch devices, it doesn't add specificity\n '@media (hover: none)': {\n backgroundColor: 'transparent'\n }\n }\n },\n '&$disabled': {\n color: theme.palette.action.disabled\n }\n },\n\n /* Styles applied to the root element if `color=\"secondary\"`. */\n colorSecondary: {\n '&$checked': {\n color: theme.palette.secondary.main,\n '&:hover': {\n backgroundColor: alpha(theme.palette.secondary.main, theme.palette.action.hoverOpacity),\n // Reset on touch devices, it doesn't add specificity\n '@media (hover: none)': {\n backgroundColor: 'transparent'\n }\n }\n },\n '&$disabled': {\n color: theme.palette.action.disabled\n }\n }\n };\n};\nvar defaultCheckedIcon = /*#__PURE__*/React.createElement(RadioButtonIcon, {\n checked: true\n});\nvar defaultIcon = /*#__PURE__*/React.createElement(RadioButtonIcon, null);\nvar Radio = /*#__PURE__*/React.forwardRef(function Radio(props, ref) {\n var checkedProp = props.checked,\n classes = props.classes,\n _props$color = props.color,\n color = _props$color === void 0 ? 'secondary' : _props$color,\n nameProp = props.name,\n onChangeProp = props.onChange,\n _props$size = props.size,\n size = _props$size === void 0 ? 'medium' : _props$size,\n other = _objectWithoutProperties(props, [\"checked\", \"classes\", \"color\", \"name\", \"onChange\", \"size\"]);\n\n var radioGroup = useRadioGroup();\n var checked = checkedProp;\n var onChange = createChainedFunction(onChangeProp, radioGroup && radioGroup.onChange);\n var name = nameProp;\n\n if (radioGroup) {\n if (typeof checked === 'undefined') {\n checked = radioGroup.value === props.value;\n }\n\n if (typeof name === 'undefined') {\n name = radioGroup.name;\n }\n }\n\n return /*#__PURE__*/React.createElement(SwitchBase, _extends({\n color: color,\n type: \"radio\",\n icon: /*#__PURE__*/React.cloneElement(defaultIcon, {\n fontSize: size === 'small' ? 'small' : 'medium'\n }),\n checkedIcon: /*#__PURE__*/React.cloneElement(defaultCheckedIcon, {\n fontSize: size === 'small' ? 'small' : 'medium'\n }),\n classes: {\n root: clsx(classes.root, classes[\"color\".concat(capitalize(color))]),\n checked: classes.checked,\n disabled: classes.disabled\n },\n name: name,\n checked: checked,\n onChange: onChange,\n ref: ref\n }, other));\n});\nprocess.env.NODE_ENV !== \"production\" ? Radio.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 * If `true`, the component is checked.\n */\n checked: PropTypes.bool,\n\n /**\n * The icon to display when the component is checked.\n */\n checkedIcon: 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 * The color of the component. It supports those theme colors that make sense for this component.\n */\n color: PropTypes.oneOf(['default', 'primary', 'secondary']),\n\n /**\n * If `true`, the radio will be disabled.\n */\n disabled: PropTypes.bool,\n\n /**\n * If `true`, the ripple effect will be disabled.\n */\n disableRipple: PropTypes.bool,\n\n /**\n * The icon to display when the component is unchecked.\n */\n icon: PropTypes.node,\n\n /**\n * The id of the `input` element.\n */\n id: PropTypes.string,\n\n /**\n * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n */\n inputProps: PropTypes.object,\n\n /**\n * Pass a ref to the `input` element.\n */\n inputRef: refType,\n\n /**\n * Name attribute of the `input` element.\n */\n name: PropTypes.string,\n\n /**\n * Callback fired when the state is changed.\n *\n * @param {object} event The event source of the callback.\n * You can pull out the new value by accessing `event.target.value` (string).\n * You can pull out the new checked state by accessing `event.target.checked` (boolean).\n */\n onChange: PropTypes.func,\n\n /**\n * If `true`, the `input` element will be required.\n */\n required: PropTypes.bool,\n\n /**\n * The size of the radio.\n * `small` is equivalent to the dense radio styling.\n */\n size: PropTypes.oneOf(['medium', 'small']),\n\n /**\n * The value of the component. The DOM API casts this to a string.\n */\n value: PropTypes.any\n} : void 0;\nexport default withStyles(styles, {\n name: 'MuiRadio'\n})(Radio);","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport Typography from '../Typography';\nimport withStyles from '../styles/withStyles';\nimport FormControlContext, { useFormControl } from '../FormControl/FormControlContext';\nexport var styles = {\n /* Styles applied to the root element. */\n root: {\n display: 'flex',\n height: '0.01em',\n // Fix IE 11 flexbox alignment. To remove at some point.\n maxHeight: '2em',\n alignItems: 'center',\n whiteSpace: 'nowrap'\n },\n\n /* Styles applied to the root element if `variant=\"filled\"`. */\n filled: {\n '&$positionStart:not($hiddenLabel)': {\n marginTop: 16\n }\n },\n\n /* Styles applied to the root element if `position=\"start\"`. */\n positionStart: {\n marginRight: 8\n },\n\n /* Styles applied to the root element if `position=\"end\"`. */\n positionEnd: {\n marginLeft: 8\n },\n\n /* Styles applied to the root element if `disablePointerEvents=true`. */\n disablePointerEvents: {\n pointerEvents: 'none'\n },\n\n /* Styles applied if the adornment is used inside <FormControl hiddenLabel />. */\n hiddenLabel: {},\n\n /* Styles applied if the adornment is used inside <FormControl margin=\"dense\" />. */\n marginDense: {}\n};\nvar InputAdornment = /*#__PURE__*/React.forwardRef(function InputAdornment(props, ref) {\n var children = props.children,\n classes = props.classes,\n className = props.className,\n _props$component = props.component,\n Component = _props$component === void 0 ? 'div' : _props$component,\n _props$disablePointer = props.disablePointerEvents,\n disablePointerEvents = _props$disablePointer === void 0 ? false : _props$disablePointer,\n _props$disableTypogra = props.disableTypography,\n disableTypography = _props$disableTypogra === void 0 ? false : _props$disableTypogra,\n position = props.position,\n variantProp = props.variant,\n other = _objectWithoutProperties(props, [\"children\", \"classes\", \"className\", \"component\", \"disablePointerEvents\", \"disableTypography\", \"position\", \"variant\"]);\n\n var muiFormControl = useFormControl() || {};\n var variant = variantProp;\n\n if (variantProp && muiFormControl.variant) {\n if (process.env.NODE_ENV !== 'production') {\n if (variantProp === muiFormControl.variant) {\n console.error('Material-UI: The `InputAdornment` variant infers the variant prop ' + 'you do not have to provide one.');\n }\n }\n }\n\n if (muiFormControl && !variant) {\n variant = muiFormControl.variant;\n }\n\n return /*#__PURE__*/React.createElement(FormControlContext.Provider, {\n value: null\n }, /*#__PURE__*/React.createElement(Component, _extends({\n className: clsx(classes.root, className, position === 'end' ? classes.positionEnd : classes.positionStart, disablePointerEvents && classes.disablePointerEvents, muiFormControl.hiddenLabel && classes.hiddenLabel, variant === 'filled' && classes.filled, muiFormControl.margin === 'dense' && classes.marginDense),\n ref: ref\n }, other), typeof children === 'string' && !disableTypography ? /*#__PURE__*/React.createElement(Typography, {\n color: \"textSecondary\"\n }, children) : children));\n});\nprocess.env.NODE_ENV !== \"production\" ? InputAdornment.propTypes = {\n /**\n * The content of the component, normally an `IconButton` or string.\n */\n children: PropTypes.node.isRequired,\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.isRequired,\n\n /**\n * @ignore\n */\n className: PropTypes.string,\n\n /**\n * The component used for the root node.\n * Either a string to use a HTML element or a component.\n */\n component: PropTypes\n /* @typescript-to-proptypes-ignore */\n .elementType,\n\n /**\n * Disable pointer events on the root.\n * This allows for the content of the adornment to focus the input on click.\n */\n disablePointerEvents: PropTypes.bool,\n\n /**\n * If children is a string then disable wrapping in a Typography component.\n */\n disableTypography: PropTypes.bool,\n\n /**\n * @ignore\n */\n muiFormControl: PropTypes.object,\n\n /**\n * The position this adornment should appear relative to the `Input`.\n */\n position: PropTypes.oneOf(['start', 'end']).isRequired,\n\n /**\n * The variant to use.\n * Note: If you are using the `TextField` component or the `FormControl` component\n * you do not have to set this manually.\n */\n variant: PropTypes.oneOf(['standard', 'outlined', 'filled'])\n} : void 0;\nexport default withStyles(styles, {\n name: 'MuiInputAdornment'\n})(InputAdornment);","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport withStyles from '../styles/withStyles';\nimport Tablelvl2Context from '../Table/Tablelvl2Context';\nexport var styles = {\n /* Styles applied to the root element. */\n root: {\n display: 'table-header-group'\n }\n};\nvar tablelvl2 = {\n variant: 'head'\n};\nvar defaultComponent = 'thead';\nvar TableHead = /*#__PURE__*/React.forwardRef(function TableHead(props, ref) {\n var classes = props.classes,\n className = props.className,\n _props$component = props.component,\n Component = _props$component === void 0 ? defaultComponent : _props$component,\n other = _objectWithoutProperties(props, [\"classes\", \"className\", \"component\"]);\n\n return /*#__PURE__*/React.createElement(Tablelvl2Context.Provider, {\n value: tablelvl2\n }, /*#__PURE__*/React.createElement(Component, _extends({\n className: clsx(classes.root, className),\n ref: ref,\n role: Component === defaultComponent ? null : 'rowgroup'\n }, other)));\n});\nprocess.env.NODE_ENV !== \"production\" ? TableHead.propTypes = {\n /**\n * The content of the component, normally `TableRow`.\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.isRequired,\n\n /**\n * @ignore\n */\n className: PropTypes.string,\n\n /**\n * The component used for the root node.\n * Either a string to use a HTML element or a component.\n */\n component: PropTypes\n /* @typescript-to-proptypes-ignore */\n .elementType\n} : void 0;\nexport default withStyles(styles, {\n name: 'MuiTableHead'\n})(TableHead);","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 { chainPropTypes } from '@material-ui/utils';\nimport withStyles from '../styles/withStyles';\nimport capitalize from '../utils/capitalize';\nimport { darken, alpha, lighten } from '../styles/colorManipulator';\nimport TableContext from '../Table/TableContext';\nimport Tablelvl2Context from '../Table/Tablelvl2Context';\nexport var styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: _extends({}, theme.typography.body2, {\n display: 'table-cell',\n verticalAlign: 'inherit',\n // Workaround for a rendering bug with spanned columns in Chrome 62.0.\n // Removes the alpha (sets it to 1), and lightens or darkens the theme color.\n borderBottom: \"1px solid\\n \".concat(theme.palette.type === 'light' ? lighten(alpha(theme.palette.divider, 1), 0.88) : darken(alpha(theme.palette.divider, 1), 0.68)),\n textAlign: 'left',\n padding: 16\n }),\n\n /* Styles applied to the root element if `variant=\"head\"` or `context.table.head`. */\n head: {\n color: theme.palette.text.primary,\n lineHeight: theme.typography.pxToRem(24),\n fontWeight: theme.typography.fontWeightMedium\n },\n\n /* Styles applied to the root element if `variant=\"body\"` or `context.table.body`. */\n body: {\n color: theme.palette.text.primary\n },\n\n /* Styles applied to the root element if `variant=\"footer\"` or `context.table.footer`. */\n footer: {\n color: theme.palette.text.secondary,\n lineHeight: theme.typography.pxToRem(21),\n fontSize: theme.typography.pxToRem(12)\n },\n\n /* Styles applied to the root element if `size=\"small\"`. */\n sizeSmall: {\n padding: '6px 24px 6px 16px',\n '&:last-child': {\n paddingRight: 16\n },\n '&$paddingCheckbox': {\n width: 24,\n // prevent the checkbox column from growing\n padding: '0 12px 0 16px',\n '&:last-child': {\n paddingLeft: 12,\n paddingRight: 16\n },\n '& > *': {\n padding: 0\n }\n }\n },\n\n /* Styles applied to the root element if `padding=\"checkbox\"`. */\n paddingCheckbox: {\n width: 48,\n // prevent the checkbox column from growing\n padding: '0 0 0 4px',\n '&:last-child': {\n paddingLeft: 0,\n paddingRight: 4\n }\n },\n\n /* Styles applied to the root element if `padding=\"none\"`. */\n paddingNone: {\n padding: 0,\n '&:last-child': {\n padding: 0\n }\n },\n\n /* Styles applied to the root element if `align=\"left\"`. */\n alignLeft: {\n textAlign: 'left'\n },\n\n /* Styles applied to the root element if `align=\"center\"`. */\n alignCenter: {\n textAlign: 'center'\n },\n\n /* Styles applied to the root element if `align=\"right\"`. */\n alignRight: {\n textAlign: 'right',\n flexDirection: 'row-reverse'\n },\n\n /* Styles applied to the root element if `align=\"justify\"`. */\n alignJustify: {\n textAlign: 'justify'\n },\n\n /* Styles applied to the root element if `context.table.stickyHeader={true}`. */\n stickyHeader: {\n position: 'sticky',\n top: 0,\n left: 0,\n zIndex: 2,\n backgroundColor: theme.palette.background.default\n }\n };\n};\n/**\n * The component renders a `<th>` element when the parent context is a header\n * or otherwise a `<td>` element.\n */\n\nvar TableCell = /*#__PURE__*/React.forwardRef(function TableCell(props, ref) {\n var _props$align = props.align,\n align = _props$align === void 0 ? 'inherit' : _props$align,\n classes = props.classes,\n className = props.className,\n component = props.component,\n paddingProp = props.padding,\n scopeProp = props.scope,\n sizeProp = props.size,\n sortDirection = props.sortDirection,\n variantProp = props.variant,\n other = _objectWithoutProperties(props, [\"align\", \"classes\", \"className\", \"component\", \"padding\", \"scope\", \"size\", \"sortDirection\", \"variant\"]);\n\n var table = React.useContext(TableContext);\n var tablelvl2 = React.useContext(Tablelvl2Context);\n var isHeadCell = tablelvl2 && tablelvl2.variant === 'head';\n var role;\n var Component;\n\n if (component) {\n Component = component;\n role = isHeadCell ? 'columnheader' : 'cell';\n } else {\n Component = isHeadCell ? 'th' : 'td';\n }\n\n var scope = scopeProp;\n\n if (!scope && isHeadCell) {\n scope = 'col';\n }\n\n var padding = paddingProp || (table && table.padding ? table.padding : 'normal');\n var size = sizeProp || (table && table.size ? table.size : 'medium');\n var variant = variantProp || tablelvl2 && tablelvl2.variant;\n var ariaSort = null;\n\n if (sortDirection) {\n ariaSort = sortDirection === 'asc' ? 'ascending' : 'descending';\n }\n\n return /*#__PURE__*/React.createElement(Component, _extends({\n ref: ref,\n className: clsx(classes.root, classes[variant], className, align !== 'inherit' && classes[\"align\".concat(capitalize(align))], padding !== 'normal' && classes[\"padding\".concat(capitalize(padding))], size !== 'medium' && classes[\"size\".concat(capitalize(size))], variant === 'head' && table && table.stickyHeader && classes.stickyHeader),\n \"aria-sort\": ariaSort,\n role: role,\n scope: scope\n }, other));\n});\nprocess.env.NODE_ENV !== \"production\" ? TableCell.propTypes = {\n /**\n * Set the text-align on the table cell content.\n *\n * Monetary or generally number fields **should be right aligned** as that allows\n * you to add them up quickly in your head without having to worry about decimals.\n */\n align: PropTypes.oneOf(['center', 'inherit', 'justify', 'left', 'right']),\n\n /**\n * The table cell contents.\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 * The component used for the root node.\n * Either a string to use a HTML element or a component.\n */\n component: PropTypes\n /* @typescript-to-proptypes-ignore */\n .elementType,\n\n /**\n * Sets the padding applied to the cell.\n * By default, the Table parent component set the value (`normal`).\n * `default` is deprecated, use `normal` instead.\n */\n padding: chainPropTypes(PropTypes.oneOf(['normal', 'checkbox', 'none', 'default']), function (props) {\n if (props.padding === 'default') {\n return new Error('Material-UI: padding=\"default\" was renamed to padding=\"normal\" for consistency.');\n }\n\n return null;\n }),\n\n /**\n * Set scope attribute.\n */\n scope: PropTypes.string,\n\n /**\n * Specify the size of the cell.\n * By default, the Table parent component set the value (`medium`).\n */\n size: PropTypes.oneOf(['medium', 'small']),\n\n /**\n * Set aria-sort direction.\n */\n sortDirection: PropTypes.oneOf(['asc', 'desc', false]),\n\n /**\n * Specify the cell type.\n * By default, the TableHead, TableBody or TableFooter parent component set the value.\n */\n variant: PropTypes.oneOf(['body', 'footer', 'head'])\n} : void 0;\nexport default withStyles(styles, {\n name: 'MuiTableCell'\n})(TableCell);","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport withStyles from '../styles/withStyles';\nimport Typography from '../Typography';\nexport var styles = {\n /* Styles applied to the root element. */\n root: {\n marginBottom: 12\n }\n};\nvar DialogContentText = /*#__PURE__*/React.forwardRef(function DialogContentText(props, ref) {\n return /*#__PURE__*/React.createElement(Typography, _extends({\n component: \"p\",\n variant: \"body1\",\n color: \"textSecondary\",\n ref: ref\n }, props));\n});\nprocess.env.NODE_ENV !== \"production\" ? DialogContentText.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 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} : void 0;\nexport default withStyles(styles, {\n name: 'MuiDialogContentText'\n})(DialogContentText);","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 { chainPropTypes } from '@material-ui/utils';\nimport withStyles from '../styles/withStyles';\nimport TableContext from './TableContext';\nexport var styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n display: 'table',\n width: '100%',\n borderCollapse: 'collapse',\n borderSpacing: 0,\n '& caption': _extends({}, theme.typography.body2, {\n padding: theme.spacing(2),\n color: theme.palette.text.secondary,\n textAlign: 'left',\n captionSide: 'bottom'\n })\n },\n\n /* Styles applied to the root element if `stickyHeader={true}`. */\n stickyHeader: {\n borderCollapse: 'separate'\n }\n };\n};\nvar defaultComponent = 'table';\nvar Table = /*#__PURE__*/React.forwardRef(function Table(props, ref) {\n var classes = props.classes,\n className = props.className,\n _props$component = props.component,\n Component = _props$component === void 0 ? defaultComponent : _props$component,\n _props$padding = props.padding,\n padding = _props$padding === void 0 ? 'normal' : _props$padding,\n _props$size = props.size,\n size = _props$size === void 0 ? 'medium' : _props$size,\n _props$stickyHeader = props.stickyHeader,\n stickyHeader = _props$stickyHeader === void 0 ? false : _props$stickyHeader,\n other = _objectWithoutProperties(props, [\"classes\", \"className\", \"component\", \"padding\", \"size\", \"stickyHeader\"]);\n\n var table = React.useMemo(function () {\n return {\n padding: padding,\n size: size,\n stickyHeader: stickyHeader\n };\n }, [padding, size, stickyHeader]);\n return /*#__PURE__*/React.createElement(TableContext.Provider, {\n value: table\n }, /*#__PURE__*/React.createElement(Component, _extends({\n role: Component === defaultComponent ? null : 'table',\n ref: ref,\n className: clsx(classes.root, className, stickyHeader && classes.stickyHeader)\n }, other)));\n});\nprocess.env.NODE_ENV !== \"production\" ? Table.propTypes = {\n /**\n * The content of the table, normally `TableHead` and `TableBody`.\n */\n children: PropTypes.node.isRequired,\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.isRequired,\n\n /**\n * @ignore\n */\n className: PropTypes.string,\n\n /**\n * The component used for the root node.\n * Either a string to use a HTML element or a component.\n */\n component: PropTypes\n /* @typescript-to-proptypes-ignore */\n .elementType,\n\n /**\n * Allows TableCells to inherit padding of the Table.\n * `default` is deprecated, use `normal` instead.\n */\n padding: chainPropTypes(PropTypes.oneOf(['normal', 'checkbox', 'none', 'default']), function (props) {\n if (props.padding === 'default') {\n return new Error('Material-UI: padding=\"default\" was renamed to padding=\"normal\" for consistency.');\n }\n\n return null;\n }),\n\n /**\n * Allows TableCells to inherit size of the Table.\n */\n size: PropTypes.oneOf(['small', 'medium']),\n\n /**\n * Set the header sticky.\n *\n * ⚠️ It doesn't work with IE 11.\n */\n stickyHeader: PropTypes.bool\n} : void 0;\nexport default withStyles(styles, {\n name: 'MuiTable'\n})(Table);","import * as React from 'react';\nimport RadioGroupContext from './RadioGroupContext';\nexport default function useRadioGroup() {\n return React.useContext(RadioGroupContext);\n}","import * as React from 'react';\n/**\n * @ignore - internal component.\n */\n\nvar RadioGroupContext = React.createContext();\n\nif (process.env.NODE_ENV !== 'production') {\n RadioGroupContext.displayName = 'RadioGroupContext';\n}\n\nexport default RadioGroupContext;","import * as React from 'react';\n/**\n * @ignore - internal component.\n */\n\nvar Tablelvl2Context = React.createContext();\n\nif (process.env.NODE_ENV !== 'production') {\n Tablelvl2Context.displayName = 'Tablelvl2Context';\n}\n\nexport default Tablelvl2Context;","\"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: \"M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34a.9959.9959 0 00-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z\"\n}), 'Edit');\n\nexports.default = _default;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport { refType } from '@material-ui/utils';\nimport { useFormControl } from '../FormControl';\nimport withStyles from '../styles/withStyles';\nimport Typography from '../Typography';\nimport capitalize from '../utils/capitalize';\nexport var styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n display: 'inline-flex',\n alignItems: 'center',\n cursor: 'pointer',\n // For correct alignment with the text.\n verticalAlign: 'middle',\n WebkitTapHighlightColor: 'transparent',\n marginLeft: -11,\n marginRight: 16,\n // used for row presentation of radio/checkbox\n '&$disabled': {\n cursor: 'default'\n }\n },\n\n /* Styles applied to the root element if `labelPlacement=\"start\"`. */\n labelPlacementStart: {\n flexDirection: 'row-reverse',\n marginLeft: 16,\n // used for row presentation of radio/checkbox\n marginRight: -11\n },\n\n /* Styles applied to the root element if `labelPlacement=\"top\"`. */\n labelPlacementTop: {\n flexDirection: 'column-reverse',\n marginLeft: 16\n },\n\n /* Styles applied to the root element if `labelPlacement=\"bottom\"`. */\n labelPlacementBottom: {\n flexDirection: 'column',\n marginLeft: 16\n },\n\n /* Pseudo-class applied to the root element if `disabled={true}`. */\n disabled: {},\n\n /* Styles applied to the label's Typography component. */\n label: {\n '&$disabled': {\n color: theme.palette.text.disabled\n }\n }\n };\n};\n/**\n * Drop in replacement of the `Radio`, `Switch` and `Checkbox` component.\n * Use this component if you want to display an extra label.\n */\n\nvar FormControlLabel = /*#__PURE__*/React.forwardRef(function FormControlLabel(props, ref) {\n var checked = props.checked,\n classes = props.classes,\n className = props.className,\n control = props.control,\n disabledProp = props.disabled,\n inputRef = props.inputRef,\n label = props.label,\n _props$labelPlacement = props.labelPlacement,\n labelPlacement = _props$labelPlacement === void 0 ? 'end' : _props$labelPlacement,\n name = props.name,\n onChange = props.onChange,\n value = props.value,\n other = _objectWithoutProperties(props, [\"checked\", \"classes\", \"className\", \"control\", \"disabled\", \"inputRef\", \"label\", \"labelPlacement\", \"name\", \"onChange\", \"value\"]);\n\n var muiFormControl = useFormControl();\n var disabled = disabledProp;\n\n if (typeof disabled === 'undefined' && typeof control.props.disabled !== 'undefined') {\n disabled = control.props.disabled;\n }\n\n if (typeof disabled === 'undefined' && muiFormControl) {\n disabled = muiFormControl.disabled;\n }\n\n var controlProps = {\n disabled: disabled\n };\n ['checked', 'name', 'onChange', 'value', 'inputRef'].forEach(function (key) {\n if (typeof control.props[key] === 'undefined' && typeof props[key] !== 'undefined') {\n controlProps[key] = props[key];\n }\n });\n return /*#__PURE__*/React.createElement(\"label\", _extends({\n className: clsx(classes.root, className, labelPlacement !== 'end' && classes[\"labelPlacement\".concat(capitalize(labelPlacement))], disabled && classes.disabled),\n ref: ref\n }, other), /*#__PURE__*/React.cloneElement(control, controlProps), /*#__PURE__*/React.createElement(Typography, {\n component: \"span\",\n className: clsx(classes.label, disabled && classes.disabled)\n }, label));\n});\nprocess.env.NODE_ENV !== \"production\" ? FormControlLabel.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 * If `true`, the component appears selected.\n */\n checked: PropTypes.bool,\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 * A control element. For instance, it can be be a `Radio`, a `Switch` or a `Checkbox`.\n */\n control: PropTypes.element.isRequired,\n\n /**\n * If `true`, the control will be disabled.\n */\n disabled: PropTypes.bool,\n\n /**\n * Pass a ref to the `input` element.\n */\n inputRef: refType,\n\n /**\n * The text to be used in an enclosing label element.\n */\n label: PropTypes.node,\n\n /**\n * The position of the label.\n */\n labelPlacement: PropTypes.oneOf(['bottom', 'end', 'start', 'top']),\n\n /**\n * @ignore\n */\n name: PropTypes.string,\n\n /**\n * Callback fired when the state is changed.\n *\n * @param {object} event The event source of the callback.\n * You can pull out the new checked state by accessing `event.target.checked` (boolean).\n */\n onChange: PropTypes.func,\n\n /**\n * The value of the component.\n */\n value: PropTypes.any\n} : void 0;\nexport default withStyles(styles, {\n name: 'MuiFormControlLabel'\n})(FormControlLabel);","import * as React from 'react';\n/**\n * @ignore - internal component.\n */\n\nvar TableContext = React.createContext();\n\nif (process.env.NODE_ENV !== 'production') {\n TableContext.displayName = 'TableContext';\n}\n\nexport default TableContext;"],"names":["SwitchBase","props","ref","autoFocus","checkedProp","checked","checkedIcon","classes","className","defaultChecked","disabledProp","disabled","icon","id","inputProps","inputRef","name","onBlur","onChange","onFocus","readOnly","required","tabIndex","type","value","other","_useControlled","controlled","default","Boolean","state","_useControlled2","setCheckedState","muiFormControl","hasLabelFor","component","root","role","undefined","event","input","newChecked","target","padding","cursor","position","opacity","width","height","top","left","margin","zIndex","TableRow","_props$component","Component","_props$hover","hover","_props$selected","selected","tablelvl2","head","footer","variant","theme","color","display","verticalAlign","outline","backgroundColor","palette","action","secondary","main","selectedOpacity","FormGroup","_props$row","row","flexDirection","flexWrap","defaultComponent","TableBody","Provider","actions","children","nameProp","valueProp","rootRef","defaultValue","setValue","focus","current","querySelector","handleRef","createSvgIcon","d","withStyles","transform","transition","transitions","create","easing","easeOut","duration","shortest","layer","easeIn","fontSize","RadioButtonUnchecked","RadioButtonChecked","defaultCheckedIcon","defaultIcon","Radio","_props$color","onChangeProp","_props$size","size","radioGroup","useRadioGroup","createChainedFunction","concat","capitalize","text","colorPrimary","primary","hoverOpacity","colorSecondary","InputAdornment","_props$disablePointer","disablePointerEvents","_props$disableTypogra","disableTypography","variantProp","positionEnd","positionStart","hiddenLabel","filled","marginDense","maxHeight","alignItems","whiteSpace","marginTop","marginRight","marginLeft","pointerEvents","TableHead","TableCell","_props$align","align","paddingProp","scopeProp","scope","sizeProp","sortDirection","table","isHeadCell","ariaSort","stickyHeader","typography","body2","borderBottom","divider","textAlign","lineHeight","pxToRem","fontWeight","fontWeightMedium","body","sizeSmall","paddingRight","paddingLeft","paddingCheckbox","paddingNone","alignLeft","alignCenter","alignRight","alignJustify","background","DialogContentText","marginBottom","Table","_props$padding","_props$stickyHeader","borderCollapse","borderSpacing","spacing","captionSide","_interopRequireDefault","_interopRequireWildcard","exports","React","_default","createElement","FormControlLabel","control","label","_props$labelPlacement","labelPlacement","controlProps","forEach","key","WebkitTapHighlightColor","labelPlacementStart","labelPlacementTop","labelPlacementBottom"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[5453],{34955:(t,a,e)=>{e.d(a,{Al:()=>o,DS:()=>m,EM:()=>s,FL:()=>r,J:()=>i,KV:()=>f,R_:()=>l,U3:()=>d,dp:()=>p,jH:()=>A,q0:()=>k,uL:()=>v,v_:()=>u,vs:()=>c,z4:()=>h});var n=e(83572);(0,n.i)({name:"kuadrant.planpolicy.create",attributes:{action:"create"}}),(0,n.i)({name:"kuadrant.planpolicy.read",attributes:{action:"read"}}),(0,n.i)({name:"kuadrant.planpolicy.update",attributes:{action:"update"}}),(0,n.i)({name:"kuadrant.planpolicy.delete",attributes:{action:"delete"}});const i=(0,n.i)({name:"kuadrant.planpolicy.list",attributes:{action:"read"}}),r=(0,n.i)({name:"kuadrant.apiproduct.create",attributes:{action:"create"}}),o=((0,n.i)({name:"kuadrant.apiproduct.read.own",attributes:{action:"read"}}),(0,n.i)({name:"kuadrant.apiproduct.read.all",attributes:{action:"read"}})),d=(0,n.i)({name:"kuadrant.apiproduct.update.own",attributes:{action:"update"}}),u=(0,n.i)({name:"kuadrant.apiproduct.update.all",attributes:{action:"update"}}),s=(0,n.i)({name:"kuadrant.apiproduct.delete.own",attributes:{action:"delete"}}),l=(0,n.i)({name:"kuadrant.apiproduct.delete.all",attributes:{action:"delete"}}),c=(0,n.i)({name:"kuadrant.apiproduct.list",attributes:{action:"read"}}),p=(0,n.i)({name:"kuadrant.apikey.create",attributes:{action:"create"},resourceType:"apiproduct"}),m=(0,n.i)({name:"kuadrant.apikey.read.own",attributes:{action:"read"}}),k=((0,n.i)({name:"kuadrant.apikey.read.all",attributes:{action:"read"}}),(0,n.i)({name:"kuadrant.apikey.update.own",attributes:{action:"update"}})),h=(0,n.i)({name:"kuadrant.apikey.update.all",attributes:{action:"update"}}),v=(0,n.i)({name:"kuadrant.apikey.delete.own",attributes:{action:"delete"}}),A=(0,n.i)({name:"kuadrant.apikey.delete.all",attributes:{action:"delete"}}),f=(0,n.i)({name:"kuadrant.apikey.approve",attributes:{action:"update"}})},46205:(t,a,e)=>{e.d(a,{W:()=>r,l:()=>i});var n=e(87421);function i(t,a){const e="resourceType"in t?{permission:t,resourceRef:a}:{permission:t},i=(0,n.J)(e);return{allowed:i.allowed,loading:i.loading,error:i.error}}function r(t,a,e,n){return!!n||!(!e||t!==a)}},75453:(t,a,e)=>{e.r(a),e.d(a,{ApiProductInfoCard:()=>f});var n=e(31085),i=(e(95478),e(25467)),r=e(22097),o=e(96040),d=e(86687),u=e(42367),s=e(58837),l=e(72501),c=e(10394),p=e(91638),m=e(46205),k=e(34955),h=e(89509),v=e(71255);const A=(0,s.A)(t=>({label:{fontWeight:600,color:t.palette.text.secondary,marginBottom:t.spacing(.5),fontSize:"0.75rem",textTransform:"uppercase"}})),f=()=>{var t,a,e,s,f,y,b,w,j,P;const x=A(),{entity:I}=(0,i.tN)(),g=(0,r.useApi)(r.configApiRef),S=(0,r.useApi)(r.fetchApiRef),_=(0,r.useApi)(r.identityApiRef),R=g.getString("backend.baseUrl"),{allowed:E,loading:N}=(0,m.l)(k.Al),O=null===(t=I.metadata.annotations)||void 0===t?void 0:t["kuadrant.io/namespace"],C=null===(a=I.metadata.annotations)||void 0===a?void 0:a["kuadrant.io/apiproduct"],{value:U}=(0,p.A)(async()=>(await _.getBackstageIdentity()).userEntityRef.split("/")[1]||"guest",[_]),{value:$,loading:B,error:D}=(0,p.A)(async()=>{if(!O||!C)return null;const t=await S.fetch(`${R}/api/kuadrant/apiproducts/${O}/${C}`);if(!t.ok){const a=await t.json();throw new Error(a.error||`Failed to fetch API product: ${t.status}`)}return t.json()},[R,S,O,C]),F=null==$||null===(s=$.metadata)||void 0===s||null===(e=s.annotations)||void 0===e?void 0:e["backstage.io/owner"],L=null==F?void 0:F.split("/")[1],T=E||U&&L===U;if(!O||!C)return(0,n.jsx)(o.n,{title:"API Product Information",children:(0,n.jsx)(l.A,{children:"No APIProduct linked to this API entity"})});if(B||N)return(0,n.jsx)(o.n,{title:"API Product Information",children:(0,n.jsx)(d.k,{})});if($&&!T)return(0,n.jsx)(o.n,{title:"API Product Information",children:(0,n.jsx)(c.A,{p:2,children:(0,n.jsx)(l.A,{variant:"body2",color:"textSecondary",children:"You don't have permission to view this API product's details. Only the API owner or users with admin permissions can view this information."})})});if(D&&D.message.includes("you can only read your own"))return(0,n.jsx)(o.n,{title:"API Product Information",children:(0,n.jsx)(c.A,{p:2,children:(0,n.jsx)(l.A,{variant:"body2",color:"textSecondary",children:"You don't have permission to view this API product's details. Only the API owner or users with admin permissions can view this information."})})});if(D)return(0,n.jsx)(o.n,{title:"API Product Information",children:(0,n.jsx)(u._,{error:D})});if(!$)return(0,n.jsx)(o.n,{title:"API Product Information",children:(0,n.jsx)(l.A,{children:"APIProduct not found"})});const z=(null===(y=$.status)||void 0===y||null===(f=y.discoveredAuthScheme)||void 0===f?void 0:f.authentication)||{},J=Object.values(z).find(t=>t.hasOwnProperty("jwt")),W=Boolean(J),Y=null==J||null===(b=J.jwt)||void 0===b?void 0:b.issuerUrl,q=null===(j=$.status)||void 0===j||null===(w=j.oidcDiscovery)||void 0===w?void 0:w.tokenEndpoint;return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(o.n,{title:"API Product Details",children:[(0,n.jsxs)(c.A,{mb:2,children:[(0,n.jsx)(l.A,{variant:"caption",className:x.label,children:"Product Name"}),(0,n.jsx)(l.A,{variant:"h6",children:(null===(P=$.spec)||void 0===P?void 0:P.displayName)||C})]}),(0,n.jsx)(h.O,{product:$,showStatus:!1,showCatalogLink:!1})]}),W&&Y&&(0,n.jsx)(c.A,{mt:2,children:(0,n.jsx)(v.n,{issuerUrl:Y,tokenEndpoint:q})})]})}}}]);
2
+ //# sourceMappingURL=5453.b3ee2392.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static/5453.b3ee2392.chunk.js","mappings":"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","sources":["webpack://internal.plugin-kuadrant/./src/permissions.ts","webpack://internal.plugin-kuadrant/./src/utils/permissions.ts","webpack://internal.plugin-kuadrant/./src/components/ApiProductInfoCard/ApiProductInfoCard.tsx"],"sourcesContent":["import { createPermission } from '@backstage/plugin-permission-common';\n\n/**\n * permission definitions for the kuadrant plugin\n *\n * these permissions control access to kuadrant resources and operations.\n * they must match the permissions defined in the backend plugin.\n *\n * permission types:\n * - BasicPermission: standard permission that applies globally\n * - ResourcePermission: permission scoped to specific resource types (e.g., apiproduct)\n *\n * permission patterns:\n * - `.create` - create new resources\n * - `.read` - read resource details\n * - `.read.own` - read only resources owned by the user\n * - `.read.all` - read all resources regardless of ownership\n * - `.update` - modify existing resources\n * - `.delete` - delete resources\n * - `.delete.own` - delete only resources owned by the user\n * - `.delete.all` - delete any resource regardless of ownership\n * - `.list` - list/view collections of resources\n */\n\n// planpolicy permissions\nexport const kuadrantPlanPolicyCreatePermission = createPermission({\n name: 'kuadrant.planpolicy.create',\n attributes: { action: 'create' },\n});\n\nexport const kuadrantPlanPolicyReadPermission = createPermission({\n name: 'kuadrant.planpolicy.read',\n attributes: { action: 'read' },\n});\n\nexport const kuadrantPlanPolicyUpdatePermission = createPermission({\n name: 'kuadrant.planpolicy.update',\n attributes: { action: 'update' },\n});\n\nexport const kuadrantPlanPolicyDeletePermission = createPermission({\n name: 'kuadrant.planpolicy.delete',\n attributes: { action: 'delete' },\n});\n\nexport const kuadrantPlanPolicyListPermission = createPermission({\n name: 'kuadrant.planpolicy.list',\n attributes: { action: 'read' },\n});\n\n// apiproduct permissions\n\n/**\n * permission to create new API products\n * granted to api owners and admins\n */\nexport const kuadrantApiProductCreatePermission = createPermission({\n name: 'kuadrant.apiproduct.create',\n attributes: { action: 'create' },\n});\n\n/**\n * permission to read API products owned by the current user\n * for api owners to view their own products\n */\nexport const kuadrantApiProductReadOwnPermission = createPermission({\n name: 'kuadrant.apiproduct.read.own',\n attributes: { action: 'read' },\n});\n\n/**\n * permission to read all API products regardless of ownership\n * for platform engineers/admins who need to view all products\n */\nexport const kuadrantApiProductReadAllPermission = createPermission({\n name: 'kuadrant.apiproduct.read.all',\n attributes: { action: 'read' },\n});\n\n/**\n * permission to update API products owned by the current user\n * for api owners to modify their own products\n */\nexport const kuadrantApiProductUpdateOwnPermission = createPermission({\n name: 'kuadrant.apiproduct.update.own',\n attributes: { action: 'update' },\n});\n\n/**\n * permission to update any API product regardless of ownership\n * for platform engineers/admins\n */\nexport const kuadrantApiProductUpdateAllPermission = createPermission({\n name: 'kuadrant.apiproduct.update.all',\n attributes: { action: 'update' },\n});\n\n/**\n * permission to delete API products owned by the current user\n * for api owners to remove their own products\n */\nexport const kuadrantApiProductDeleteOwnPermission = createPermission({\n name: 'kuadrant.apiproduct.delete.own',\n attributes: { action: 'delete' },\n});\n\n/**\n * permission to delete any API product regardless of ownership\n * for platform engineers/admins\n */\nexport const kuadrantApiProductDeleteAllPermission = createPermission({\n name: 'kuadrant.apiproduct.delete.all',\n attributes: { action: 'delete' },\n});\n\n/**\n * permission to list API products\n * backend filters results based on .own vs .all read permissions\n */\nexport const kuadrantApiProductListPermission = createPermission({\n name: 'kuadrant.apiproduct.list',\n attributes: { action: 'read' },\n});\n\n// apikey permissions\n\n/**\n * permission to create API keys (request API access)\n *\n * this is a ResourcePermission scoped to 'apiproduct', allowing\n * fine-grained control over which API products users can request access to.\n *\n * use in frontend: useKuadrantPermission(kuadrantApiKeyCreatePermission)\n * use in backend with resource: { permission, resourceRef: 'apiproduct:namespace/name' }\n */\nexport const kuadrantApiKeyCreatePermission = createPermission({\n name: 'kuadrant.apikey.create',\n attributes: { action: 'create' },\n resourceType: 'apiproduct',\n});\n\n/**\n * permission to read API keys owned by the current user\n * allows users to view their own API keys and request history\n */\nexport const kuadrantApiKeyReadOwnPermission = createPermission({\n name: 'kuadrant.apikey.read.own',\n attributes: { action: 'read' },\n});\n\n/**\n * permission to read all API keys regardless of ownership\n * for platform engineers/admins who need to view the approval queue and audit keys\n */\nexport const kuadrantApiKeyReadAllPermission = createPermission({\n name: 'kuadrant.apikey.read.all',\n attributes: { action: 'read' },\n});\n\n/**\n * permission to update API keys owned by the current user\n * allows users to edit their own pending requests (change plan tier, use case)\n */\nexport const kuadrantApiKeyUpdateOwnPermission = createPermission({\n name: 'kuadrant.apikey.update.own',\n attributes: { action: 'update' },\n});\n\n/**\n * permission to update any API key regardless of ownership\n * typically granted to API owners and platform engineers for approving/rejecting requests\n */\nexport const kuadrantApiKeyUpdateAllPermission = createPermission({\n name: 'kuadrant.apikey.update.all',\n attributes: { action: 'update' },\n});\n\n/**\n * permission to delete API keys owned by the current user\n * allows users to cancel their own requests or revoke their own access\n */\nexport const kuadrantApiKeyDeleteOwnPermission = createPermission({\n name: 'kuadrant.apikey.delete.own',\n attributes: { action: 'delete' },\n});\n\n/**\n * permission to delete any API key regardless of ownership\n * for platform engineers/admins who need to revoke access\n */\nexport const kuadrantApiKeyDeleteAllPermission = createPermission({\n name: 'kuadrant.apikey.delete.all',\n attributes: { action: 'delete' },\n});\n\n/**\n * permission to approve/reject API key requests\n * grants access to the approval queue - for API owners and admins only\n * separate from update.own which consumers use to edit their pending requests\n */\nexport const kuadrantApiKeyApprovePermission = createPermission({\n name: 'kuadrant.apikey.approve',\n attributes: { action: 'update' },\n});\n\nexport const kuadrantPermissions = [\n kuadrantPlanPolicyCreatePermission,\n kuadrantPlanPolicyReadPermission,\n kuadrantPlanPolicyUpdatePermission,\n kuadrantPlanPolicyDeletePermission,\n kuadrantPlanPolicyListPermission,\n kuadrantApiProductCreatePermission,\n kuadrantApiProductReadOwnPermission,\n kuadrantApiProductReadAllPermission,\n kuadrantApiProductUpdateOwnPermission,\n kuadrantApiProductUpdateAllPermission,\n kuadrantApiProductDeleteOwnPermission,\n kuadrantApiProductDeleteAllPermission,\n kuadrantApiProductListPermission,\n kuadrantApiKeyCreatePermission,\n kuadrantApiKeyReadOwnPermission,\n kuadrantApiKeyReadAllPermission,\n kuadrantApiKeyUpdateOwnPermission,\n kuadrantApiKeyUpdateAllPermission,\n kuadrantApiKeyDeleteOwnPermission,\n kuadrantApiKeyDeleteAllPermission,\n kuadrantApiKeyApprovePermission,\n];\n","import { usePermission } from '@backstage/plugin-permission-react';\nimport { Permission, ResourcePermission } from '@backstage/plugin-permission-common';\n\n/**\n * result of a permission check including error state\n */\nexport interface PermissionCheckResult {\n allowed: boolean;\n loading: boolean;\n error?: Error;\n}\n\n/**\n * custom hook for checking kuadrant permissions that handles both\n * BasicPermission and ResourcePermission types without type bypasses\n *\n * @param permission - the permission to check\n * @param resourceRef - optional resource reference for ResourcePermissions\n * @returns permission check result with error handling\n *\n * @example\n * // basic permission\n * const { allowed, loading, error } = useKuadrantPermission(\n * kuadrantApiProductListPermission\n * );\n *\n * @example\n * // resource permission\n * const { allowed, loading, error } = useKuadrantPermission(\n * kuadrantApiKeyCreatePermission,\n * 'apiproduct:namespace/name'\n * );\n */\nexport function useKuadrantPermission(\n permission: Permission,\n resourceRef?: string,\n): PermissionCheckResult {\n // construct the permission request based on whether it's a ResourcePermission\n const permissionRequest = 'resourceType' in permission\n ? { permission: permission as ResourcePermission, resourceRef }\n : { permission };\n\n const result = usePermission(permissionRequest as any);\n\n return {\n allowed: result.allowed,\n loading: result.loading,\n error: result.error,\n };\n}\n\n/**\n * helper to determine if a user can delete a specific API key or request\n *\n * @param ownerId - the user id who owns the key/request\n * @param currentUserId - the current user's id\n * @param canDeleteOwn - whether user has permission to delete their own keys\n * @param canDeleteAll - whether user has permission to delete all keys\n * @returns true if user can delete this specific key/request\n */\nexport function canDeleteResource(\n ownerId: string,\n currentUserId: string,\n canDeleteOwn: boolean,\n canDeleteAll: boolean,\n): boolean {\n if (canDeleteAll) return true;\n if (canDeleteOwn && ownerId === currentUserId) return true;\n return false;\n}\n","import React from 'react';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { useApi, configApiRef, fetchApiRef, identityApiRef } from '@backstage/core-plugin-api';\nimport { InfoCard, Progress, ResponseErrorPanel } from '@backstage/core-components';\nimport { Typography, Box, makeStyles } from '@material-ui/core';\nimport useAsync from 'react-use/lib/useAsync';\nimport { useKuadrantPermission } from '../../utils/permissions';\nimport { kuadrantApiProductReadAllPermission } from '../../permissions';\nimport { ApiProductDetails } from '../ApiProductDetails';\nimport { OidcProviderCard } from '../OidcProviderCard';\n\nconst useStyles = makeStyles((theme) => ({\n label: {\n fontWeight: 600,\n color: theme.palette.text.secondary,\n marginBottom: theme.spacing(0.5),\n fontSize: '0.75rem',\n textTransform: 'uppercase',\n },\n}));\n\nexport const ApiProductInfoCard = () => {\n const classes = useStyles();\n const { entity } = useEntity();\n const config = useApi(configApiRef);\n const fetchApi = useApi(fetchApiRef);\n const identityApi = useApi(identityApiRef);\n const backendUrl = config.getString('backend.baseUrl');\n\n const { allowed: canReadAll, loading: permLoading } = useKuadrantPermission(\n kuadrantApiProductReadAllPermission\n );\n\n const namespace = entity.metadata.annotations?.['kuadrant.io/namespace'];\n const apiProductName = entity.metadata.annotations?.['kuadrant.io/apiproduct'];\n\n const { value: currentUserId } = useAsync(async () => {\n const identity = await identityApi.getBackstageIdentity();\n return identity.userEntityRef.split('/')[1] || 'guest';\n }, [identityApi]);\n\n const { value: apiProduct, loading, error } = useAsync(async () => {\n if (!namespace || !apiProductName) {\n return null;\n }\n\n const productResponse = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/apiproducts/${namespace}/${apiProductName}`\n );\n\n if (!productResponse.ok) {\n const errorData = await productResponse.json();\n throw new Error(errorData.error || `Failed to fetch API product: ${productResponse.status}`);\n }\n\n return productResponse.json();\n }, [backendUrl, fetchApi, namespace, apiProductName]);\n\n // check if user has permission to view this api product\n const owner = apiProduct?.metadata?.annotations?.['backstage.io/owner'];\n const ownerUserId = owner?.split('/')[1];\n const canView = canReadAll || (currentUserId && ownerUserId === currentUserId);\n\n if (!namespace || !apiProductName) {\n return (\n <InfoCard title=\"API Product Information\">\n <Typography>No APIProduct linked to this API entity</Typography>\n </InfoCard>\n );\n }\n\n if (loading || permLoading) {\n return (\n <InfoCard title=\"API Product Information\">\n <Progress />\n </InfoCard>\n );\n }\n\n // show permission message if user doesn't have permission\n if (apiProduct && !canView) {\n return (\n <InfoCard title=\"API Product Information\">\n <Box p={2}>\n <Typography variant=\"body2\" color=\"textSecondary\">\n You don't have permission to view this API product's details. Only the API owner or users with admin permissions can view this information.\n </Typography>\n </Box>\n </InfoCard>\n );\n }\n\n // also show permission message if we got a permission error from the backend\n if (error && error.message.includes('you can only read your own')) {\n return (\n <InfoCard title=\"API Product Information\">\n <Box p={2}>\n <Typography variant=\"body2\" color=\"textSecondary\">\n You don't have permission to view this API product's details. Only the API owner or users with admin permissions can view this information.\n </Typography>\n </Box>\n </InfoCard>\n );\n }\n\n if (error) {\n return (\n <InfoCard title=\"API Product Information\">\n <ResponseErrorPanel error={error} />\n </InfoCard>\n );\n }\n\n if (!apiProduct) {\n return (\n <InfoCard title=\"API Product Information\">\n <Typography>APIProduct not found</Typography>\n </InfoCard>\n );\n }\n\n // check for OIDC auth scheme\n const authSchemes = apiProduct.status?.discoveredAuthScheme?.authentication || {};\n const schemeObjects = Object.values(authSchemes);\n const jwtScheme = schemeObjects.find((scheme: any) => scheme.hasOwnProperty('jwt'));\n const hasOidc = Boolean(jwtScheme);\n const jwtIssuer = (jwtScheme as any)?.jwt?.issuerUrl;\n const jwtTokenEndpoint = apiProduct.status?.oidcDiscovery?.tokenEndpoint;\n\n return (\n <>\n <InfoCard title=\"API Product Details\">\n <Box mb={2}>\n <Typography variant=\"caption\" className={classes.label}>\n Product Name\n </Typography>\n <Typography variant=\"h6\">\n {apiProduct.spec?.displayName || apiProductName}\n </Typography>\n </Box>\n <ApiProductDetails\n product={apiProduct}\n showStatus={false}\n showCatalogLink={false}\n />\n </InfoCard>\n {hasOidc && jwtIssuer && (\n <Box mt={2}>\n <OidcProviderCard\n issuerUrl={jwtIssuer}\n tokenEndpoint={jwtTokenEndpoint}\n />\n </Box>\n )}\n </>\n );\n};\n"],"names":["createPermission","name","attributes","action","kuadrantPlanPolicyListPermission","kuadrantApiProductCreatePermission","kuadrantApiProductReadAllPermission","kuadrantApiProductUpdateOwnPermission","kuadrantApiProductUpdateAllPermission","kuadrantApiProductDeleteOwnPermission","kuadrantApiProductDeleteAllPermission","kuadrantApiProductListPermission","kuadrantApiKeyCreatePermission","resourceType","kuadrantApiKeyReadOwnPermission","kuadrantApiKeyUpdateOwnPermission","kuadrantApiKeyUpdateAllPermission","kuadrantApiKeyDeleteOwnPermission","kuadrantApiKeyDeleteAllPermission","kuadrantApiKeyApprovePermission","useKuadrantPermission","permission","resourceRef","permissionRequest","result","usePermission","allowed","loading","error","canDeleteResource","ownerId","currentUserId","canDeleteOwn","canDeleteAll","useStyles","makeStyles","theme","label","fontWeight","color","palette","text","secondary","marginBottom","spacing","fontSize","textTransform","ApiProductInfoCard","entity","apiProduct","classes","useEntity","config","useApi","configApiRef","fetchApi","fetchApiRef","identityApi","identityApiRef","backendUrl","getString","canReadAll","permLoading","namespace","metadata","annotations","apiProductName","value","useAsync","async","getBackstageIdentity","userEntityRef","split","productResponse","fetch","ok","errorData","json","Error","status","owner","ownerUserId","canView","InfoCard","title","Typography","Progress","Box","p","variant","message","includes","ResponseErrorPanel","authSchemes","discoveredAuthScheme","authentication","jwtScheme","Object","values","find","scheme","hasOwnProperty","hasOidc","Boolean","jwtIssuer","jwt","issuerUrl","jwtTokenEndpoint","oidcDiscovery","tokenEndpoint","mb","className","spec","displayName","ApiProductDetails","product","showStatus","showCatalogLink","mt","OidcProviderCard"],"sourceRoot":""}