@kuadrant/kuadrant-backstage-plugin-frontend 0.0.1-test.1-57ace816 → 0.0.1-test.1-464d7760

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 (473) hide show
  1. package/dist/components/ApiAccessCard/ApiAccessCard.esm.js +15 -10
  2. package/dist/components/ApiAccessCard/ApiAccessCard.esm.js.map +1 -1
  3. package/dist/components/ApiKeyManagementTab/ApiKeyManagementTab.esm.js +24 -8
  4. package/dist/components/ApiKeyManagementTab/ApiKeyManagementTab.esm.js.map +1 -1
  5. package/dist/components/ApprovalQueueCard/ApprovalQueueCard.esm.js +80 -48
  6. package/dist/components/ApprovalQueueCard/ApprovalQueueCard.esm.js.map +1 -1
  7. package/dist/components/CreateAPIProductDialog/CreateAPIProductDialog.esm.js +37 -25
  8. package/dist/components/CreateAPIProductDialog/CreateAPIProductDialog.esm.js.map +1 -1
  9. package/dist/components/EditAPIProductDialog/EditAPIProductDialog.esm.js +20 -4
  10. package/dist/components/EditAPIProductDialog/EditAPIProductDialog.esm.js.map +1 -1
  11. package/dist/components/KuadrantPage/KuadrantPage.esm.js +19 -10
  12. package/dist/components/KuadrantPage/KuadrantPage.esm.js.map +1 -1
  13. package/dist/components/MyApiKeysCard/MyApiKeysCard.esm.js +175 -0
  14. package/dist/components/MyApiKeysCard/MyApiKeysCard.esm.js.map +1 -0
  15. package/dist-scalprum/configSchema.json +1 -0
  16. package/dist-scalprum/internal.plugin-kuadrant.9baeefa3b735dde128c6.js +2 -0
  17. package/dist-scalprum/internal.plugin-kuadrant.9baeefa3b735dde128c6.js.map +1 -0
  18. package/dist-scalprum/plugin-manifest.json +11 -0
  19. package/dist-scalprum/static/1613.71f0fccd.chunk.js +3 -0
  20. package/dist-scalprum/static/1613.71f0fccd.chunk.js.LICENSE.txt +10 -0
  21. package/dist-scalprum/static/1613.71f0fccd.chunk.js.map +1 -0
  22. package/dist-scalprum/static/1836.b74b4c40.chunk.js +3 -0
  23. package/dist-scalprum/static/1836.b74b4c40.chunk.js.LICENSE.txt +10 -0
  24. package/dist-scalprum/static/1836.b74b4c40.chunk.js.map +1 -0
  25. package/dist-scalprum/static/2198.5905970e.chunk.js +2 -0
  26. package/dist-scalprum/static/2198.5905970e.chunk.js.map +1 -0
  27. package/dist-scalprum/static/3007.bffc9924.chunk.js +2 -0
  28. package/dist-scalprum/static/3007.bffc9924.chunk.js.map +1 -0
  29. package/dist-scalprum/static/3144.6f99ccee.chunk.js +3 -0
  30. package/dist-scalprum/static/3144.6f99ccee.chunk.js.LICENSE.txt +19 -0
  31. package/dist-scalprum/static/3144.6f99ccee.chunk.js.map +1 -0
  32. package/dist-scalprum/static/3483.2f14a8ca.chunk.js +3 -0
  33. package/dist-scalprum/static/3483.2f14a8ca.chunk.js.LICENSE.txt +5 -0
  34. package/dist-scalprum/static/3483.2f14a8ca.chunk.js.map +1 -0
  35. package/dist-scalprum/static/3647.b96f9b3e.chunk.js +2 -0
  36. package/dist-scalprum/static/3647.b96f9b3e.chunk.js.map +1 -0
  37. package/dist-scalprum/static/3657.59d45756.chunk.js +3 -0
  38. package/dist-scalprum/static/3657.59d45756.chunk.js.LICENSE.txt +10 -0
  39. package/dist-scalprum/static/3657.59d45756.chunk.js.map +1 -0
  40. package/dist-scalprum/static/4041.29923ad9.chunk.js +3 -0
  41. package/dist-scalprum/static/4041.29923ad9.chunk.js.LICENSE.txt +9 -0
  42. package/dist-scalprum/static/4041.29923ad9.chunk.js.map +1 -0
  43. package/dist-scalprum/static/4161.aa5fd28d.chunk.js +3 -0
  44. package/dist-scalprum/static/4161.aa5fd28d.chunk.js.LICENSE.txt +27 -0
  45. package/dist-scalprum/static/4161.aa5fd28d.chunk.js.map +1 -0
  46. package/dist-scalprum/static/428.0a290bc6.chunk.js +2 -0
  47. package/dist-scalprum/static/428.0a290bc6.chunk.js.map +1 -0
  48. package/dist-scalprum/static/4306.133aa342.chunk.js +2 -0
  49. package/dist-scalprum/static/4306.133aa342.chunk.js.map +1 -0
  50. package/dist-scalprum/static/441.8bd811bc.chunk.js +2 -0
  51. package/dist-scalprum/static/441.8bd811bc.chunk.js.map +1 -0
  52. package/dist-scalprum/static/4491.a2e0258f.chunk.js +2 -0
  53. package/dist-scalprum/static/4491.a2e0258f.chunk.js.map +1 -0
  54. package/dist-scalprum/static/4570.8b9f98d7.chunk.js +3 -0
  55. package/dist-scalprum/static/4570.8b9f98d7.chunk.js.LICENSE.txt +16 -0
  56. package/dist-scalprum/static/4570.8b9f98d7.chunk.js.map +1 -0
  57. package/dist-scalprum/static/5222.796292ca.chunk.js +2 -0
  58. package/dist-scalprum/static/5222.796292ca.chunk.js.map +1 -0
  59. package/dist-scalprum/static/5453.d8d305e9.chunk.js +2 -0
  60. package/dist-scalprum/static/5453.d8d305e9.chunk.js.map +1 -0
  61. package/dist-scalprum/static/5568.5dbce633.chunk.js +3 -0
  62. package/dist-scalprum/static/5568.5dbce633.chunk.js.LICENSE.txt +18 -0
  63. package/dist-scalprum/static/5568.5dbce633.chunk.js.map +1 -0
  64. package/dist-scalprum/static/5603.05d9ca7f.chunk.js +2 -0
  65. package/dist-scalprum/static/5603.05d9ca7f.chunk.js.map +1 -0
  66. package/dist-scalprum/static/5811.5c192eeb.chunk.js +2 -0
  67. package/dist-scalprum/static/5811.5c192eeb.chunk.js.map +1 -0
  68. package/dist-scalprum/static/6272.e49551fa.chunk.js +2 -0
  69. package/dist-scalprum/static/6272.e49551fa.chunk.js.map +1 -0
  70. package/dist-scalprum/static/6281.29f4549b.chunk.js +2 -0
  71. package/dist-scalprum/static/6281.29f4549b.chunk.js.map +1 -0
  72. package/dist-scalprum/static/6352.d48bba8c.chunk.js +2 -0
  73. package/dist-scalprum/static/6352.d48bba8c.chunk.js.map +1 -0
  74. package/dist-scalprum/static/6872.feed76d2.chunk.js +2 -0
  75. package/dist-scalprum/static/6872.feed76d2.chunk.js.map +1 -0
  76. package/dist-scalprum/static/7601.08d8ff3f.chunk.js +2 -0
  77. package/dist-scalprum/static/7601.08d8ff3f.chunk.js.map +1 -0
  78. package/dist-scalprum/static/7984.c8511b89.chunk.js +2 -0
  79. package/dist-scalprum/static/7984.c8511b89.chunk.js.map +1 -0
  80. package/dist-scalprum/static/8365.75ea3581.chunk.js +2 -0
  81. package/dist-scalprum/static/8365.75ea3581.chunk.js.map +1 -0
  82. package/dist-scalprum/static/8617.d1dc70a8.chunk.js +2 -0
  83. package/dist-scalprum/static/8617.d1dc70a8.chunk.js.map +1 -0
  84. package/dist-scalprum/static/9288.61b45746.chunk.js +3 -0
  85. package/dist-scalprum/static/9288.61b45746.chunk.js.LICENSE.txt +33 -0
  86. package/dist-scalprum/static/9288.61b45746.chunk.js.map +1 -0
  87. package/dist-scalprum/static/exposed-PluginRoot.8bc4d676.chunk.js +2 -0
  88. package/dist-scalprum/static/exposed-PluginRoot.8bc4d676.chunk.js.map +1 -0
  89. package/dist-scalprum/static/react-syntax-highlighter/lowlight-import.2bd53873.chunk.js +2 -0
  90. package/dist-scalprum/static/react-syntax-highlighter/lowlight-import.2bd53873.chunk.js.map +1 -0
  91. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_abnf.bb6a8626.chunk.js +2 -0
  92. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_abnf.bb6a8626.chunk.js.map +1 -0
  93. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_accesslog.bd112f1a.chunk.js +2 -0
  94. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_accesslog.bd112f1a.chunk.js.map +1 -0
  95. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_actionscript.78db0238.chunk.js +2 -0
  96. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_actionscript.78db0238.chunk.js.map +1 -0
  97. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_ada.b0d90871.chunk.js +2 -0
  98. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_ada.b0d90871.chunk.js.map +1 -0
  99. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_angelscript.f9816c44.chunk.js +2 -0
  100. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_angelscript.f9816c44.chunk.js.map +1 -0
  101. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_apache.aa86d495.chunk.js +2 -0
  102. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_apache.aa86d495.chunk.js.map +1 -0
  103. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_applescript.ddf703d6.chunk.js +2 -0
  104. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_applescript.ddf703d6.chunk.js.map +1 -0
  105. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_arcade.70910623.chunk.js +2 -0
  106. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_arcade.70910623.chunk.js.map +1 -0
  107. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_arduino.9b9ce313.chunk.js +2 -0
  108. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_arduino.9b9ce313.chunk.js.map +1 -0
  109. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_armasm.4bfb8996.chunk.js +2 -0
  110. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_armasm.4bfb8996.chunk.js.map +1 -0
  111. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_asciidoc.4b40a3f9.chunk.js +2 -0
  112. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_asciidoc.4b40a3f9.chunk.js.map +1 -0
  113. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_aspectj.35f221e8.chunk.js +2 -0
  114. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_aspectj.35f221e8.chunk.js.map +1 -0
  115. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_autohotkey.614c5248.chunk.js +2 -0
  116. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_autohotkey.614c5248.chunk.js.map +1 -0
  117. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_autoit.a06c1c62.chunk.js +2 -0
  118. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_autoit.a06c1c62.chunk.js.map +1 -0
  119. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_avrasm.6381890e.chunk.js +2 -0
  120. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_avrasm.6381890e.chunk.js.map +1 -0
  121. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_awk.dfc9b0b0.chunk.js +2 -0
  122. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_awk.dfc9b0b0.chunk.js.map +1 -0
  123. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_axapta.80d14346.chunk.js +2 -0
  124. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_axapta.80d14346.chunk.js.map +1 -0
  125. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_bash.53f7c730.chunk.js +2 -0
  126. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_bash.53f7c730.chunk.js.map +1 -0
  127. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_basic.ec232b8a.chunk.js +2 -0
  128. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_basic.ec232b8a.chunk.js.map +1 -0
  129. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_bnf.84e0a497.chunk.js +2 -0
  130. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_bnf.84e0a497.chunk.js.map +1 -0
  131. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_brainfuck.31bde7c5.chunk.js +2 -0
  132. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_brainfuck.31bde7c5.chunk.js.map +1 -0
  133. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_c.b43ce116.chunk.js +2 -0
  134. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_c.b43ce116.chunk.js.map +1 -0
  135. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_cLike.f884fdc0.chunk.js +2 -0
  136. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_cLike.f884fdc0.chunk.js.map +1 -0
  137. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_cal.781cc6c6.chunk.js +2 -0
  138. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_cal.781cc6c6.chunk.js.map +1 -0
  139. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_capnproto.79dfc31f.chunk.js +2 -0
  140. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_capnproto.79dfc31f.chunk.js.map +1 -0
  141. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_ceylon.ab3b1c28.chunk.js +2 -0
  142. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_ceylon.ab3b1c28.chunk.js.map +1 -0
  143. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_clean.97b48014.chunk.js +2 -0
  144. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_clean.97b48014.chunk.js.map +1 -0
  145. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_clojure.e3fcc98c.chunk.js +2 -0
  146. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_clojure.e3fcc98c.chunk.js.map +1 -0
  147. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_clojureRepl.e6dbc3b4.chunk.js +2 -0
  148. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_clojureRepl.e6dbc3b4.chunk.js.map +1 -0
  149. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_cmake.cb9028b5.chunk.js +2 -0
  150. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_cmake.cb9028b5.chunk.js.map +1 -0
  151. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_coffeescript.3bc87b5b.chunk.js +2 -0
  152. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_coffeescript.3bc87b5b.chunk.js.map +1 -0
  153. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_coq.6b156852.chunk.js +2 -0
  154. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_coq.6b156852.chunk.js.map +1 -0
  155. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_cos.78d69dee.chunk.js +2 -0
  156. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_cos.78d69dee.chunk.js.map +1 -0
  157. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_cpp.ff6a8f78.chunk.js +2 -0
  158. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_cpp.ff6a8f78.chunk.js.map +1 -0
  159. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_crmsh.58c4cb07.chunk.js +2 -0
  160. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_crmsh.58c4cb07.chunk.js.map +1 -0
  161. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_crystal.3a36e63f.chunk.js +2 -0
  162. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_crystal.3a36e63f.chunk.js.map +1 -0
  163. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_csharp.ea98c6fb.chunk.js +2 -0
  164. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_csharp.ea98c6fb.chunk.js.map +1 -0
  165. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_csp.7fc6f9a3.chunk.js +2 -0
  166. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_csp.7fc6f9a3.chunk.js.map +1 -0
  167. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_css.2cc312ae.chunk.js +2 -0
  168. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_css.2cc312ae.chunk.js.map +1 -0
  169. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_d.bf4f2b44.chunk.js +2 -0
  170. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_d.bf4f2b44.chunk.js.map +1 -0
  171. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_dart.0a0b12af.chunk.js +2 -0
  172. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_dart.0a0b12af.chunk.js.map +1 -0
  173. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_delphi.588e191d.chunk.js +2 -0
  174. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_delphi.588e191d.chunk.js.map +1 -0
  175. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_diff.a8373241.chunk.js +2 -0
  176. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_diff.a8373241.chunk.js.map +1 -0
  177. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_django.8fb85401.chunk.js +2 -0
  178. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_django.8fb85401.chunk.js.map +1 -0
  179. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_dns.6d79126a.chunk.js +2 -0
  180. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_dns.6d79126a.chunk.js.map +1 -0
  181. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_dockerfile.2c5fdf55.chunk.js +2 -0
  182. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_dockerfile.2c5fdf55.chunk.js.map +1 -0
  183. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_dos.1ede6e37.chunk.js +2 -0
  184. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_dos.1ede6e37.chunk.js.map +1 -0
  185. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_dsconfig.c3457b50.chunk.js +2 -0
  186. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_dsconfig.c3457b50.chunk.js.map +1 -0
  187. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_dts.8fd3703c.chunk.js +2 -0
  188. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_dts.8fd3703c.chunk.js.map +1 -0
  189. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_dust.b30d0c38.chunk.js +2 -0
  190. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_dust.b30d0c38.chunk.js.map +1 -0
  191. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_ebnf.a34b6944.chunk.js +2 -0
  192. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_ebnf.a34b6944.chunk.js.map +1 -0
  193. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_elixir.1e79c9b9.chunk.js +2 -0
  194. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_elixir.1e79c9b9.chunk.js.map +1 -0
  195. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_elm.8a488b19.chunk.js +2 -0
  196. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_elm.8a488b19.chunk.js.map +1 -0
  197. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_erb.4ac917b8.chunk.js +2 -0
  198. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_erb.4ac917b8.chunk.js.map +1 -0
  199. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_erlang.501777c7.chunk.js +2 -0
  200. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_erlang.501777c7.chunk.js.map +1 -0
  201. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_erlangRepl.0d7f4890.chunk.js +2 -0
  202. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_erlangRepl.0d7f4890.chunk.js.map +1 -0
  203. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_excel.2f5c76b9.chunk.js +2 -0
  204. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_excel.2f5c76b9.chunk.js.map +1 -0
  205. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_fix.5ee62733.chunk.js +2 -0
  206. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_fix.5ee62733.chunk.js.map +1 -0
  207. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_flix.972cc801.chunk.js +2 -0
  208. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_flix.972cc801.chunk.js.map +1 -0
  209. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_fortran.38ec3d00.chunk.js +2 -0
  210. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_fortran.38ec3d00.chunk.js.map +1 -0
  211. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_fsharp.2ba37c00.chunk.js +2 -0
  212. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_fsharp.2ba37c00.chunk.js.map +1 -0
  213. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_gams.a45eb030.chunk.js +2 -0
  214. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_gams.a45eb030.chunk.js.map +1 -0
  215. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_gauss.cceeafb0.chunk.js +2 -0
  216. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_gauss.cceeafb0.chunk.js.map +1 -0
  217. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_gcode.378d3296.chunk.js +2 -0
  218. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_gcode.378d3296.chunk.js.map +1 -0
  219. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_gherkin.e740620a.chunk.js +2 -0
  220. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_gherkin.e740620a.chunk.js.map +1 -0
  221. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_glsl.bb5b0086.chunk.js +2 -0
  222. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_glsl.bb5b0086.chunk.js.map +1 -0
  223. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_gml.2347c999.chunk.js +2 -0
  224. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_gml.2347c999.chunk.js.map +1 -0
  225. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_go.abc0a144.chunk.js +2 -0
  226. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_go.abc0a144.chunk.js.map +1 -0
  227. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_golo.eaa5e2bf.chunk.js +2 -0
  228. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_golo.eaa5e2bf.chunk.js.map +1 -0
  229. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_gradle.72fdf84d.chunk.js +2 -0
  230. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_gradle.72fdf84d.chunk.js.map +1 -0
  231. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_groovy.ecd68b19.chunk.js +2 -0
  232. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_groovy.ecd68b19.chunk.js.map +1 -0
  233. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_haml.d698757b.chunk.js +2 -0
  234. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_haml.d698757b.chunk.js.map +1 -0
  235. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_handlebars.75c0a89b.chunk.js +2 -0
  236. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_handlebars.75c0a89b.chunk.js.map +1 -0
  237. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_haskell.bbd3c104.chunk.js +2 -0
  238. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_haskell.bbd3c104.chunk.js.map +1 -0
  239. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_haxe.e2543cc2.chunk.js +2 -0
  240. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_haxe.e2543cc2.chunk.js.map +1 -0
  241. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_hsp.5d714528.chunk.js +2 -0
  242. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_hsp.5d714528.chunk.js.map +1 -0
  243. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_htmlbars.e57e3c89.chunk.js +2 -0
  244. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_htmlbars.e57e3c89.chunk.js.map +1 -0
  245. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_http.5859273c.chunk.js +2 -0
  246. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_http.5859273c.chunk.js.map +1 -0
  247. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_hy.c60db034.chunk.js +2 -0
  248. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_hy.c60db034.chunk.js.map +1 -0
  249. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_inform7.78be038f.chunk.js +2 -0
  250. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_inform7.78be038f.chunk.js.map +1 -0
  251. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_ini.d9d4ed7e.chunk.js +2 -0
  252. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_ini.d9d4ed7e.chunk.js.map +1 -0
  253. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_irpf90.25afcc29.chunk.js +2 -0
  254. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_irpf90.25afcc29.chunk.js.map +1 -0
  255. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_isbl.abe269c1.chunk.js +2 -0
  256. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_isbl.abe269c1.chunk.js.map +1 -0
  257. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_java.e04d1c07.chunk.js +2 -0
  258. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_java.e04d1c07.chunk.js.map +1 -0
  259. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_javascript.b0ad82d3.chunk.js +2 -0
  260. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_javascript.b0ad82d3.chunk.js.map +1 -0
  261. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_jbossCli.1ff533ef.chunk.js +2 -0
  262. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_jbossCli.1ff533ef.chunk.js.map +1 -0
  263. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_json.d934b52b.chunk.js +2 -0
  264. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_json.d934b52b.chunk.js.map +1 -0
  265. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_julia.f43a39d0.chunk.js +2 -0
  266. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_julia.f43a39d0.chunk.js.map +1 -0
  267. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_juliaRepl.e3bfcde8.chunk.js +2 -0
  268. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_juliaRepl.e3bfcde8.chunk.js.map +1 -0
  269. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_kotlin.c5eaa6f5.chunk.js +2 -0
  270. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_kotlin.c5eaa6f5.chunk.js.map +1 -0
  271. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_lasso.8d4054e7.chunk.js +2 -0
  272. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_lasso.8d4054e7.chunk.js.map +1 -0
  273. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_latex.b4bb9102.chunk.js +2 -0
  274. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_latex.b4bb9102.chunk.js.map +1 -0
  275. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_ldif.74045e43.chunk.js +2 -0
  276. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_ldif.74045e43.chunk.js.map +1 -0
  277. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_leaf.92519810.chunk.js +2 -0
  278. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_leaf.92519810.chunk.js.map +1 -0
  279. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_less.cc574d49.chunk.js +2 -0
  280. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_less.cc574d49.chunk.js.map +1 -0
  281. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_lisp.1cb2f675.chunk.js +2 -0
  282. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_lisp.1cb2f675.chunk.js.map +1 -0
  283. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_livecodeserver.f624f22d.chunk.js +2 -0
  284. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_livecodeserver.f624f22d.chunk.js.map +1 -0
  285. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_livescript.3ece3068.chunk.js +2 -0
  286. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_livescript.3ece3068.chunk.js.map +1 -0
  287. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_llvm.f32d41e6.chunk.js +2 -0
  288. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_llvm.f32d41e6.chunk.js.map +1 -0
  289. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_lsl.b6519e02.chunk.js +2 -0
  290. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_lsl.b6519e02.chunk.js.map +1 -0
  291. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_lua.52f73c98.chunk.js +2 -0
  292. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_lua.52f73c98.chunk.js.map +1 -0
  293. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_makefile.cad796c9.chunk.js +2 -0
  294. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_makefile.cad796c9.chunk.js.map +1 -0
  295. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_markdown.1489792c.chunk.js +2 -0
  296. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_markdown.1489792c.chunk.js.map +1 -0
  297. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_mathematica.d8631b37.chunk.js +2 -0
  298. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_mathematica.d8631b37.chunk.js.map +1 -0
  299. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_matlab.114e44eb.chunk.js +2 -0
  300. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_matlab.114e44eb.chunk.js.map +1 -0
  301. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_maxima.f1f17544.chunk.js +2 -0
  302. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_maxima.f1f17544.chunk.js.map +1 -0
  303. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_mel.5251fe1a.chunk.js +2 -0
  304. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_mel.5251fe1a.chunk.js.map +1 -0
  305. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_mercury.fa8fdac0.chunk.js +2 -0
  306. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_mercury.fa8fdac0.chunk.js.map +1 -0
  307. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_mipsasm.f5bc5b04.chunk.js +2 -0
  308. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_mipsasm.f5bc5b04.chunk.js.map +1 -0
  309. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_mizar.9b39cf3b.chunk.js +2 -0
  310. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_mizar.9b39cf3b.chunk.js.map +1 -0
  311. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_mojolicious.0cf721ff.chunk.js +2 -0
  312. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_mojolicious.0cf721ff.chunk.js.map +1 -0
  313. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_monkey.5f60f06d.chunk.js +2 -0
  314. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_monkey.5f60f06d.chunk.js.map +1 -0
  315. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_moonscript.443301b3.chunk.js +2 -0
  316. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_moonscript.443301b3.chunk.js.map +1 -0
  317. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_n1ql.c54b2c4a.chunk.js +2 -0
  318. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_n1ql.c54b2c4a.chunk.js.map +1 -0
  319. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_nginx.630147e0.chunk.js +2 -0
  320. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_nginx.630147e0.chunk.js.map +1 -0
  321. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_nim.17afaed1.chunk.js +2 -0
  322. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_nim.17afaed1.chunk.js.map +1 -0
  323. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_nix.245f31b6.chunk.js +2 -0
  324. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_nix.245f31b6.chunk.js.map +1 -0
  325. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_nodeRepl.5b05cdf2.chunk.js +2 -0
  326. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_nodeRepl.5b05cdf2.chunk.js.map +1 -0
  327. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_nsis.4934a8e8.chunk.js +2 -0
  328. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_nsis.4934a8e8.chunk.js.map +1 -0
  329. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_objectivec.2d204375.chunk.js +2 -0
  330. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_objectivec.2d204375.chunk.js.map +1 -0
  331. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_ocaml.0e42541e.chunk.js +2 -0
  332. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_ocaml.0e42541e.chunk.js.map +1 -0
  333. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_oneC.362a3b0a.chunk.js +2 -0
  334. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_oneC.362a3b0a.chunk.js.map +1 -0
  335. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_openscad.4a460eaf.chunk.js +2 -0
  336. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_openscad.4a460eaf.chunk.js.map +1 -0
  337. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_oxygene.ea742315.chunk.js +2 -0
  338. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_oxygene.ea742315.chunk.js.map +1 -0
  339. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_parser3.706a4bd6.chunk.js +2 -0
  340. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_parser3.706a4bd6.chunk.js.map +1 -0
  341. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_perl.ae8475a2.chunk.js +2 -0
  342. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_perl.ae8475a2.chunk.js.map +1 -0
  343. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_pf.5052a768.chunk.js +2 -0
  344. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_pf.5052a768.chunk.js.map +1 -0
  345. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_pgsql.5b0d21b9.chunk.js +2 -0
  346. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_pgsql.5b0d21b9.chunk.js.map +1 -0
  347. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_php.ade4c6c4.chunk.js +2 -0
  348. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_php.ade4c6c4.chunk.js.map +1 -0
  349. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_phpTemplate.2bd36dc7.chunk.js +2 -0
  350. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_phpTemplate.2bd36dc7.chunk.js.map +1 -0
  351. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_plaintext.25f8d292.chunk.js +2 -0
  352. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_plaintext.25f8d292.chunk.js.map +1 -0
  353. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_pony.1961f69f.chunk.js +2 -0
  354. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_pony.1961f69f.chunk.js.map +1 -0
  355. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_powershell.7bd31b3a.chunk.js +2 -0
  356. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_powershell.7bd31b3a.chunk.js.map +1 -0
  357. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_processing.8d1f48c5.chunk.js +2 -0
  358. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_processing.8d1f48c5.chunk.js.map +1 -0
  359. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_profile.615fa721.chunk.js +2 -0
  360. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_profile.615fa721.chunk.js.map +1 -0
  361. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_prolog.be0fdf0c.chunk.js +2 -0
  362. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_prolog.be0fdf0c.chunk.js.map +1 -0
  363. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_properties.60f97895.chunk.js +2 -0
  364. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_properties.60f97895.chunk.js.map +1 -0
  365. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_protobuf.0cd375bc.chunk.js +2 -0
  366. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_protobuf.0cd375bc.chunk.js.map +1 -0
  367. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_puppet.ee3f80da.chunk.js +2 -0
  368. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_puppet.ee3f80da.chunk.js.map +1 -0
  369. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_purebasic.08443005.chunk.js +2 -0
  370. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_purebasic.08443005.chunk.js.map +1 -0
  371. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_python.9e4100ae.chunk.js +2 -0
  372. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_python.9e4100ae.chunk.js.map +1 -0
  373. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_pythonRepl.feb72aed.chunk.js +2 -0
  374. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_pythonRepl.feb72aed.chunk.js.map +1 -0
  375. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_q.989943de.chunk.js +2 -0
  376. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_q.989943de.chunk.js.map +1 -0
  377. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_qml.8f3a0af6.chunk.js +2 -0
  378. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_qml.8f3a0af6.chunk.js.map +1 -0
  379. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_r.8540ccea.chunk.js +2 -0
  380. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_r.8540ccea.chunk.js.map +1 -0
  381. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_reasonml.a5a73a29.chunk.js +2 -0
  382. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_reasonml.a5a73a29.chunk.js.map +1 -0
  383. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_rib.dc8afdf1.chunk.js +2 -0
  384. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_rib.dc8afdf1.chunk.js.map +1 -0
  385. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_roboconf.47518214.chunk.js +2 -0
  386. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_roboconf.47518214.chunk.js.map +1 -0
  387. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_routeros.c0bcd6ce.chunk.js +2 -0
  388. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_routeros.c0bcd6ce.chunk.js.map +1 -0
  389. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_rsl.909f2a27.chunk.js +2 -0
  390. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_rsl.909f2a27.chunk.js.map +1 -0
  391. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_ruby.d84064e5.chunk.js +2 -0
  392. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_ruby.d84064e5.chunk.js.map +1 -0
  393. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_ruleslanguage.038504d0.chunk.js +2 -0
  394. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_ruleslanguage.038504d0.chunk.js.map +1 -0
  395. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_rust.7e26e901.chunk.js +2 -0
  396. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_rust.7e26e901.chunk.js.map +1 -0
  397. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_sas.94075d6a.chunk.js +2 -0
  398. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_sas.94075d6a.chunk.js.map +1 -0
  399. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_scala.a4629d0a.chunk.js +2 -0
  400. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_scala.a4629d0a.chunk.js.map +1 -0
  401. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_scheme.508b5846.chunk.js +2 -0
  402. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_scheme.508b5846.chunk.js.map +1 -0
  403. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_scilab.bb9cc730.chunk.js +2 -0
  404. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_scilab.bb9cc730.chunk.js.map +1 -0
  405. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_scss.bec19089.chunk.js +2 -0
  406. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_scss.bec19089.chunk.js.map +1 -0
  407. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_shell.9bbc16eb.chunk.js +2 -0
  408. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_shell.9bbc16eb.chunk.js.map +1 -0
  409. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_smali.4fa5afdd.chunk.js +2 -0
  410. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_smali.4fa5afdd.chunk.js.map +1 -0
  411. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_smalltalk.53da57ca.chunk.js +2 -0
  412. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_smalltalk.53da57ca.chunk.js.map +1 -0
  413. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_sml.0e45c1cf.chunk.js +2 -0
  414. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_sml.0e45c1cf.chunk.js.map +1 -0
  415. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_sqf.43421810.chunk.js +2 -0
  416. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_sqf.43421810.chunk.js.map +1 -0
  417. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_sql.651dcc8d.chunk.js +2 -0
  418. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_sql.651dcc8d.chunk.js.map +1 -0
  419. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_sqlMore.d69b1825.chunk.js +2 -0
  420. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_sqlMore.d69b1825.chunk.js.map +1 -0
  421. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_stan.17155e77.chunk.js +2 -0
  422. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_stan.17155e77.chunk.js.map +1 -0
  423. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_stata.fe81a7fc.chunk.js +2 -0
  424. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_stata.fe81a7fc.chunk.js.map +1 -0
  425. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_step21.a431b2db.chunk.js +2 -0
  426. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_step21.a431b2db.chunk.js.map +1 -0
  427. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_stylus.cde06cf5.chunk.js +2 -0
  428. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_stylus.cde06cf5.chunk.js.map +1 -0
  429. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_subunit.c5ac3a0a.chunk.js +2 -0
  430. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_subunit.c5ac3a0a.chunk.js.map +1 -0
  431. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_swift.7d33a4a9.chunk.js +2 -0
  432. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_swift.7d33a4a9.chunk.js.map +1 -0
  433. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_taggerscript.695a2547.chunk.js +2 -0
  434. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_taggerscript.695a2547.chunk.js.map +1 -0
  435. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_tap.402e473f.chunk.js +2 -0
  436. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_tap.402e473f.chunk.js.map +1 -0
  437. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_tcl.79af288c.chunk.js +2 -0
  438. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_tcl.79af288c.chunk.js.map +1 -0
  439. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_thrift.ecb04f2a.chunk.js +2 -0
  440. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_thrift.ecb04f2a.chunk.js.map +1 -0
  441. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_tp.0f4ff415.chunk.js +2 -0
  442. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_tp.0f4ff415.chunk.js.map +1 -0
  443. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_twig.5cb0fdfc.chunk.js +2 -0
  444. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_twig.5cb0fdfc.chunk.js.map +1 -0
  445. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_typescript.cf576f17.chunk.js +2 -0
  446. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_typescript.cf576f17.chunk.js.map +1 -0
  447. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_vala.843d9bc4.chunk.js +2 -0
  448. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_vala.843d9bc4.chunk.js.map +1 -0
  449. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_vbnet.21c190ed.chunk.js +2 -0
  450. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_vbnet.21c190ed.chunk.js.map +1 -0
  451. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_vbscript.4703f4c5.chunk.js +2 -0
  452. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_vbscript.4703f4c5.chunk.js.map +1 -0
  453. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_vbscriptHtml.42eb54af.chunk.js +2 -0
  454. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_vbscriptHtml.42eb54af.chunk.js.map +1 -0
  455. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_verilog.e32adbeb.chunk.js +2 -0
  456. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_verilog.e32adbeb.chunk.js.map +1 -0
  457. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_vhdl.dea9db6c.chunk.js +2 -0
  458. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_vhdl.dea9db6c.chunk.js.map +1 -0
  459. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_vim.e82f126f.chunk.js +2 -0
  460. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_vim.e82f126f.chunk.js.map +1 -0
  461. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_x86asm.217c56f0.chunk.js +2 -0
  462. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_x86asm.217c56f0.chunk.js.map +1 -0
  463. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_xl.7cff3cbb.chunk.js +2 -0
  464. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_xl.7cff3cbb.chunk.js.map +1 -0
  465. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_xml.ee14d6a4.chunk.js +2 -0
  466. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_xml.ee14d6a4.chunk.js.map +1 -0
  467. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_xquery.353780d4.chunk.js +2 -0
  468. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_xquery.353780d4.chunk.js.map +1 -0
  469. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_yaml.2aae489e.chunk.js +2 -0
  470. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_yaml.2aae489e.chunk.js.map +1 -0
  471. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_zephir.fc94a148.chunk.js +2 -0
  472. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_zephir.fc94a148.chunk.js.map +1 -0
  473. package/package.json +7 -3
@@ -11,30 +11,35 @@ const ApiAccessCard = ({ namespace: propNamespace }) => {
11
11
  const identityApi = useApi(identityApiRef);
12
12
  const fetchApi = useApi(fetchApiRef);
13
13
  const backendUrl = config.getString("backend.baseUrl");
14
- const [userId, setUserId] = useState("guest");
14
+ const [, setUserId] = useState("guest");
15
+ const apiProductName = entity.metadata.annotations?.["kuadrant.io/apiproduct"] || entity.metadata.name;
15
16
  const namespace = entity.metadata.annotations?.["kuadrant.io/namespace"] || propNamespace || "default";
16
17
  useAsync(async () => {
17
18
  const identity = await identityApi.getBackstageIdentity();
18
19
  setUserId(identity.userEntityRef.split("/")[1] || "guest");
19
20
  }, [identityApi]);
20
- const { value: apiKeys, loading: keysLoading, error: keysError } = useAsync(async () => {
21
- const response = await fetchApi.fetch(`${backendUrl}/api/kuadrant/apikeys?namespace=${namespace}&userId=${userId}`);
21
+ const { value: requests, loading: keysLoading, error: keysError } = useAsync(async () => {
22
+ const url = `${backendUrl}/api/kuadrant/requests/my?namespace=${namespace}` ;
23
+ const response = await fetchApi.fetch(url);
22
24
  if (!response.ok) {
23
- throw new Error("failed to fetch api keys");
25
+ throw new Error("failed to fetch api key requests");
24
26
  }
25
27
  const data = await response.json();
26
- return data.items || [];
27
- }, [namespace, userId, backendUrl, fetchApi]);
28
+ const allRequests = data.items || [];
29
+ return allRequests.filter(
30
+ (r) => r.spec.apiName === apiProductName && r.status?.phase === "Approved"
31
+ );
32
+ }, [namespace, apiProductName, backendUrl, fetchApi]);
28
33
  if (keysLoading) {
29
34
  return /* @__PURE__ */ React.createElement(Progress, null);
30
35
  }
31
36
  if (keysError) {
32
37
  return /* @__PURE__ */ React.createElement(ResponseErrorPanel, { error: keysError });
33
38
  }
34
- const keys = apiKeys || [];
35
- return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(InfoCard, { title: "Kuadrant API Keys" }, /* @__PURE__ */ React.createElement(Box, { p: 2 }, keys.length > 0 ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Typography, { variant: "body1", gutterBottom: true }, "You have ", keys.length, " active API key", keys.length !== 1 ? "s" : "", " for this API"), keys.map((key) => {
36
- const planTier = key.metadata.annotations?.["secret.kuadrant.io/plan-id"] || "Unknown";
37
- return /* @__PURE__ */ React.createElement(Box, { key: key.metadata.name, mb: 1, p: 1, border: 1, borderColor: "grey.300", borderRadius: 4 }, /* @__PURE__ */ React.createElement(Box, { display: "flex", justifyContent: "space-between", alignItems: "center" }, /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, key.metadata.name), /* @__PURE__ */ React.createElement(Chip, { label: planTier, color: "primary", size: "small" })));
39
+ const keys = requests || [];
40
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(InfoCard, { title: "Kuadrant API Keys" }, /* @__PURE__ */ React.createElement(Box, { p: 2 }, keys.length > 0 ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Typography, { variant: "body1", gutterBottom: true }, "You have ", keys.length, " active API key", keys.length !== 1 ? "s" : "", " for this API"), keys.map((request) => {
41
+ const planTier = request.spec.planTier;
42
+ return /* @__PURE__ */ React.createElement(Box, { key: request.metadata.name, mb: 1, p: 1, border: 1, borderColor: "grey.300", borderRadius: 4 }, /* @__PURE__ */ React.createElement(Box, { display: "flex", justifyContent: "space-between", alignItems: "center" }, /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, request.metadata.name), /* @__PURE__ */ React.createElement(Chip, { label: planTier, color: "primary", size: "small" })));
38
43
  }), /* @__PURE__ */ React.createElement(Box, { mt: 2 }, /* @__PURE__ */ React.createElement(Typography, { variant: "caption", color: "textSecondary" }, "Visit the API Keys tab to view keys, make new requests, or manage access"))) : /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Typography, { variant: "body1", gutterBottom: true }, "You don't have any API keys for this API yet"), /* @__PURE__ */ React.createElement(Typography, { variant: "body2", color: "textSecondary" }, "Visit the API Keys tab to request access")))));
39
44
  };
40
45
 
@@ -1 +1 @@
1
- {"version":3,"file":"ApiAccessCard.esm.js","sources":["../../../src/components/ApiAccessCard/ApiAccessCard.tsx"],"sourcesContent":["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} from '@material-ui/core';\nimport { useApi, configApiRef, identityApiRef, fetchApiRef } from '@backstage/core-plugin-api';\nimport { useEntity } from '@backstage/plugin-catalog-react';\n\ninterface ApiKey {\n metadata: {\n name: string;\n namespace: string;\n annotations?: {\n 'secret.kuadrant.io/plan-id'?: string;\n 'secret.kuadrant.io/user-id'?: string;\n };\n };\n data?: {\n api_key?: string;\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 backendUrl = config.getString('backend.baseUrl');\n const [userId, setUserId] = useState<string>('guest');\n\n // read from entity annotations, fallback to props for backwards compat\n const namespace = entity.metadata.annotations?.['kuadrant.io/namespace'] || propNamespace || 'default';\n\n // get current user identity\n useAsync(async () => {\n const identity = await identityApi.getBackstageIdentity();\n setUserId(identity.userEntityRef.split('/')[1] || 'guest');\n }, [identityApi]);\n\n const { value: apiKeys, loading: keysLoading, error: keysError } = useAsync(async () => {\n const response = await fetchApi.fetch(`${backendUrl}/api/kuadrant/apikeys?namespace=${namespace}&userId=${userId}`);\n if (!response.ok) {\n throw new Error('failed to fetch api keys');\n }\n const data = await response.json();\n return data.items || [];\n }, [namespace, userId, backendUrl, fetchApi]);\n\n if (keysLoading) {\n return <Progress />;\n }\n\n if (keysError) {\n return <ResponseErrorPanel error={keysError} />;\n }\n\n const keys = (apiKeys as ApiKey[]) || [];\n\n return (\n <>\n <InfoCard title=\"Kuadrant API Keys\">\n <Box p={2}>\n {keys.length > 0 ? (\n <>\n <Typography variant=\"body1\" gutterBottom>\n You have {keys.length} active API key{keys.length !== 1 ? 's' : ''} for this API\n </Typography>\n {keys.map((key: ApiKey) => {\n const planTier = key.metadata.annotations?.['secret.kuadrant.io/plan-id'] || 'Unknown';\n\n return (\n <Box key={key.metadata.name} mb={1} p={1} border={1} borderColor=\"grey.300\" borderRadius={4}>\n <Box display=\"flex\" justifyContent=\"space-between\" alignItems=\"center\">\n <Typography variant=\"body2\">\n {key.metadata.name}\n </Typography>\n <Chip label={planTier} color=\"primary\" size=\"small\" />\n </Box>\n </Box>\n );\n })}\n <Box mt={2}>\n <Typography variant=\"caption\" color=\"textSecondary\">\n Visit the API Keys tab to view keys, make new requests, or manage access\n </Typography>\n </Box>\n </>\n ) : (\n <>\n <Typography variant=\"body1\" gutterBottom>\n You don't have any API keys for this API yet\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Visit the API Keys tab to request access\n </Typography>\n </>\n )}\n </Box>\n </InfoCard>\n </>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ApiAccessCard.esm.js","sources":["../../../src/components/ApiAccessCard/ApiAccessCard.tsx"],"sourcesContent":["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} from '@material-ui/core';\nimport { useApi, configApiRef, identityApiRef, fetchApiRef } from '@backstage/core-plugin-api';\nimport { useEntity } from '@backstage/plugin-catalog-react';\n\ninterface APIKeyRequest {\n metadata: {\n name: string;\n namespace: string;\n };\n spec: {\n apiName: string;\n planTier: string;\n };\n status?: {\n phase: 'Pending' | 'Approved' | 'Rejected';\n apiKey?: string;\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 backendUrl = config.getString('backend.baseUrl');\n const [, setUserId] = useState<string>('guest');\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 identity = await identityApi.getBackstageIdentity();\n setUserId(identity.userEntityRef.split('/')[1] || 'guest');\n }, [identityApi]);\n\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 // filter to only this apiproduct's approved requests\n const allRequests = data.items || [];\n return allRequests.filter((r: APIKeyRequest) =>\n r.spec.apiName === apiProductName && r.status?.phase === 'Approved'\n );\n }, [namespace, apiProductName, backendUrl, fetchApi]);\n\n if (keysLoading) {\n return <Progress />;\n }\n\n if (keysError) {\n return <ResponseErrorPanel error={keysError} />;\n }\n\n const keys = (requests as APIKeyRequest[]) || [];\n\n return (\n <>\n <InfoCard title=\"Kuadrant API Keys\">\n <Box p={2}>\n {keys.length > 0 ? (\n <>\n <Typography variant=\"body1\" gutterBottom>\n You have {keys.length} active API key{keys.length !== 1 ? 's' : ''} for this API\n </Typography>\n {keys.map((request: APIKeyRequest) => {\n const planTier = request.spec.planTier;\n\n return (\n <Box key={request.metadata.name} mb={1} p={1} border={1} borderColor=\"grey.300\" borderRadius={4}>\n <Box display=\"flex\" justifyContent=\"space-between\" alignItems=\"center\">\n <Typography variant=\"body2\">\n {request.metadata.name}\n </Typography>\n <Chip label={planTier} color=\"primary\" size=\"small\" />\n </Box>\n </Box>\n );\n })}\n <Box mt={2}>\n <Typography variant=\"caption\" color=\"textSecondary\">\n Visit the API Keys tab to view keys, make new requests, or manage access\n </Typography>\n </Box>\n </>\n ) : (\n <>\n <Typography variant=\"body1\" gutterBottom>\n You don't have any API keys for this API yet\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Visit the API Keys tab to request access\n </Typography>\n </>\n )}\n </Box>\n </InfoCard>\n </>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -28,6 +28,9 @@ const ApiKeyManagementTab = ({ namespace: propNamespace }) => {
28
28
  const [useCase, setUseCase] = useState("");
29
29
  const [creating, setCreating] = useState(false);
30
30
  const [createError, setCreateError] = useState(null);
31
+ const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);
32
+ const [requestToDelete, setRequestToDelete] = useState(null);
33
+ const [deleting, setDeleting] = useState(false);
31
34
  const apiProductName = entity.metadata.annotations?.["kuadrant.io/apiproduct"] || entity.metadata.name;
32
35
  const namespace = entity.metadata.annotations?.["kuadrant.io/namespace"] || propNamespace || "default";
33
36
  useAsync(async () => {
@@ -37,9 +40,8 @@ const ApiKeyManagementTab = ({ namespace: propNamespace }) => {
37
40
  setUserEmail(profile.email || "");
38
41
  }, [identityApi]);
39
42
  const { value: requests, loading: requestsLoading, error: requestsError } = useAsync(async () => {
40
- if (!userId) return [];
41
43
  const response = await fetchApi.fetch(
42
- `${backendUrl}/api/kuadrant/requests/my?userId=${userId}&namespace=${namespace}`
44
+ `${backendUrl}/api/kuadrant/requests/my?namespace=${namespace}`
43
45
  );
44
46
  if (!response.ok) {
45
47
  throw new Error("failed to fetch requests");
@@ -48,7 +50,7 @@ const ApiKeyManagementTab = ({ namespace: propNamespace }) => {
48
50
  return (data.items || []).filter(
49
51
  (r) => r.spec.apiName === apiProductName && r.spec.apiNamespace === namespace
50
52
  );
51
- }, [userId, apiProductName, namespace, refresh, fetchApi]);
53
+ }, [apiProductName, namespace, refresh, fetchApi, backendUrl]);
52
54
  const { value: apiProduct, loading: plansLoading, error: plansError } = useAsync(async () => {
53
55
  const response = await fetchApi.fetch(`${backendUrl}/api/kuadrant/apiproducts`);
54
56
  if (!response.ok) {
@@ -76,20 +78,34 @@ const ApiKeyManagementTab = ({ namespace: propNamespace }) => {
76
78
  loading: deleteAllPermissionLoading,
77
79
  error: deleteAllPermissionError
78
80
  } = useKuadrantPermission(kuadrantApiKeyDeleteAllPermission);
79
- const handleDeleteRequest = async (name) => {
81
+ const handleDeleteClick = (name, displayName) => {
82
+ setRequestToDelete({ name, displayName });
83
+ setDeleteDialogOpen(true);
84
+ };
85
+ const handleDeleteConfirm = async () => {
86
+ if (!requestToDelete) return;
87
+ setDeleting(true);
80
88
  try {
81
89
  const response = await fetchApi.fetch(
82
- `${backendUrl}/api/kuadrant/requests/${namespace}/${name}`,
90
+ `${backendUrl}/api/kuadrant/requests/${namespace}/${requestToDelete.name}`,
83
91
  { method: "DELETE" }
84
92
  );
85
93
  if (!response.ok) {
86
94
  throw new Error("failed to delete request");
87
95
  }
88
96
  setRefresh((r) => r + 1);
97
+ setDeleteDialogOpen(false);
98
+ setRequestToDelete(null);
89
99
  } catch (err) {
90
100
  console.error("error deleting request:", err);
101
+ } finally {
102
+ setDeleting(false);
91
103
  }
92
104
  };
105
+ const handleDeleteCancel = () => {
106
+ setDeleteDialogOpen(false);
107
+ setRequestToDelete(null);
108
+ };
93
109
  const toggleVisibility = (keyName) => {
94
110
  setVisibleKeys((prev) => {
95
111
  const newSet = new Set(prev);
@@ -311,7 +327,7 @@ func main() {
311
327
  IconButton,
312
328
  {
313
329
  size: "small",
314
- onClick: () => handleDeleteRequest(row.metadata.name),
330
+ onClick: () => handleDeleteClick(row.metadata.name, apiProductName),
315
331
  color: "secondary",
316
332
  title: "Revoke access and delete key"
317
333
  },
@@ -379,7 +395,7 @@ func main() {
379
395
  IconButton,
380
396
  {
381
397
  size: "small",
382
- onClick: () => handleDeleteRequest(row.metadata.name),
398
+ onClick: () => handleDeleteClick(row.metadata.name, apiProductName),
383
399
  color: "secondary"
384
400
  },
385
401
  /* @__PURE__ */ React.createElement(DeleteIcon, null)
@@ -463,7 +479,7 @@ func main() {
463
479
  disabled: !selectedPlan || creating
464
480
  },
465
481
  creating ? "Submitting..." : "Submit Request"
466
- ))));
482
+ ))), /* @__PURE__ */ React.createElement(Dialog, { open: deleteDialogOpen, onClose: handleDeleteCancel }, /* @__PURE__ */ React.createElement(DialogTitle, null, "Confirm Delete"), /* @__PURE__ */ React.createElement(DialogContent, null, /* @__PURE__ */ React.createElement(Typography, null, "Are you sure you want to revoke access and delete your API key for ", /* @__PURE__ */ React.createElement("strong", null, requestToDelete?.displayName), "?"), /* @__PURE__ */ React.createElement(Typography, { variant: "body2", color: "textSecondary", style: { marginTop: 8 } }, "This action cannot be undone. You will need to request access again if you want to use this API in the future.")), /* @__PURE__ */ React.createElement(DialogActions, null, /* @__PURE__ */ React.createElement(Button, { onClick: handleDeleteCancel, color: "primary" }, "Cancel"), /* @__PURE__ */ React.createElement(Button, { onClick: handleDeleteConfirm, color: "secondary", disabled: deleting }, deleting ? "Deleting..." : "Delete"))));
467
483
  };
468
484
 
469
485
  export { ApiKeyManagementTab };
@@ -1 +1 @@
1
- {"version":3,"file":"ApiKeyManagementTab.esm.js","sources":["../../../src/components/ApiKeyManagementTab/ApiKeyManagementTab.tsx"],"sourcesContent":["import React, { useState, useMemo } from 'react';\nimport { useAsync } from 'react-use';\nimport {\n Table,\n TableColumn,\n Progress,\n ResponseErrorPanel,\n CodeSnippet,\n} from '@backstage/core-components';\nimport {\n IconButton,\n Typography,\n Box,\n Chip,\n Grid,\n Button,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n TextField,\n Select,\n MenuItem,\n FormControl,\n InputLabel,\n Tabs,\n Tab,\n} from '@material-ui/core';\nimport { useApi, configApiRef, identityApiRef, fetchApiRef } from '@backstage/core-plugin-api';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport VisibilityIcon from '@material-ui/icons/Visibility';\nimport VisibilityOffIcon from '@material-ui/icons/VisibilityOff';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport HourglassEmptyIcon from '@material-ui/icons/HourglassEmpty';\nimport CancelIcon from '@material-ui/icons/Cancel';\nimport AddIcon from '@material-ui/icons/Add';\nimport { APIKeyRequest } from '../../types/api-management';\nimport {\n kuadrantApiKeyRequestCreatePermission,\n kuadrantApiKeyDeleteOwnPermission,\n kuadrantApiKeyDeleteAllPermission,\n} from '../../permissions';\nimport { useKuadrantPermission, canDeleteResource } from '../../utils/permissions';\n\ninterface APIProduct {\n metadata: {\n name: string;\n namespace: string;\n };\n spec: {\n plans?: Array<{\n tier: string;\n description?: string;\n limits?: any;\n }>;\n };\n}\n\ninterface Plan {\n tier: string;\n limits: any;\n}\n\nexport interface ApiKeyManagementTabProps {\n namespace?: string;\n}\n\nexport const ApiKeyManagementTab = ({ namespace: propNamespace }: ApiKeyManagementTabProps) => {\n const { entity } = useEntity();\n const config = useApi(configApiRef);\n const identityApi = useApi(identityApiRef);\n const fetchApi = useApi(fetchApiRef);\n const backendUrl = config.getString('backend.baseUrl');\n const [visibleKeys, setVisibleKeys] = useState<Set<string>>(new Set());\n const [refresh, setRefresh] = useState(0);\n const [userId, setUserId] = useState<string>('guest');\n const [userEmail, setUserEmail] = useState<string>('');\n const [open, setOpen] = useState(false);\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 // 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 useAsync(async () => {\n const identity = await identityApi.getBackstageIdentity();\n const profile = await identityApi.getProfileInfo();\n setUserId(identity.userEntityRef.split('/')[1] || 'guest');\n setUserEmail(profile.email || '');\n }, [identityApi]);\n\n const { value: requests, loading: requestsLoading, error: requestsError } = useAsync(async () => {\n if (!userId) return [];\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/requests/my?userId=${userId}&namespace=${namespace}`\n );\n if (!response.ok) {\n throw new Error('failed to fetch requests');\n }\n const data = await response.json();\n // filter by apiproduct name, not httproute name\n return (data.items || []).filter(\n (r: APIKeyRequest) => r.spec.apiName === apiProductName && r.spec.apiNamespace === namespace\n );\n }, [userId, apiProductName, namespace, refresh, fetchApi]);\n\n const { value: apiProduct, loading: plansLoading, error: plansError } = useAsync(async () => {\n const response = await fetchApi.fetch(`${backendUrl}/api/kuadrant/apiproducts`);\n if (!response.ok) {\n throw new Error('failed to fetch api products');\n }\n const data = await response.json();\n\n const product = data.items?.find((p: APIProduct) =>\n p.metadata.namespace === namespace &&\n p.metadata.name === apiProductName\n );\n\n return product;\n }, [namespace, apiProductName, fetchApi]);\n\n // check permissions with resource reference once we have the apiproduct\n const resourceRef = apiProduct ? `apiproduct:${apiProduct.metadata.namespace}/${apiProduct.metadata.name}` : undefined;\n\n const {\n allowed: canCreateRequest,\n loading: createRequestPermissionLoading,\n error: createRequestPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyRequestCreatePermission, resourceRef);\n\n const {\n allowed: canDeleteOwnKey,\n loading: deleteOwnPermissionLoading,\n error: deleteOwnPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyDeleteOwnPermission);\n\n const {\n allowed: canDeleteAllKeys,\n loading: deleteAllPermissionLoading,\n error: deleteAllPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyDeleteAllPermission);\n\n const handleDeleteRequest = async (name: string) => {\n try {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/requests/${namespace}/${name}`,\n { method: 'DELETE' }\n );\n if (!response.ok) {\n throw new Error('failed to delete request');\n }\n setRefresh(r => r + 1);\n } catch (err) {\n console.error('error deleting request:', err);\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 handleRequestAccess = async () => {\n if (!selectedPlan) return;\n\n setCreating(true);\n setCreateError(null);\n try {\n const response = await fetchApi.fetch(`${backendUrl}/api/kuadrant/requests`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n apiName: apiProductName,\n apiNamespace: namespace,\n userId,\n userEmail,\n planTier: selectedPlan,\n useCase: useCase.trim() || '',\n namespace,\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || `failed to create request: ${response.status}`);\n }\n\n setOpen(false);\n setSelectedPlan('');\n setUseCase('');\n setRefresh(r => r + 1);\n } catch (err) {\n console.error('error creating api key request:', err);\n setCreateError(err instanceof Error ? err.message : 'unknown error occurred');\n } finally {\n setCreating(false);\n }\n };\n\n const detailPanelConfig = useMemo(() => [\n {\n render: (data: any) => {\n // backstage Table wraps the data in { rowData: actualData }\n const request = data.rowData as APIKeyRequest;\n if (!request?.metadata?.name) {\n return <Box />;\n }\n\n return <DetailPanelContent request={request} apiName={apiProductName} />;\n },\n },\n ], [apiProductName]);\n\n // separate component to isolate state\n const DetailPanelContent = ({ request, apiName: api }: { request: APIKeyRequest; apiName: string }) => {\n const [selectedLanguage, setSelectedLanguage] = useState(0);\n const hostname = request.status?.apiHostname || `${api}.apps.example.com`;\n\n return (\n <Box p={3} bgcolor=\"background.default\" onClick={(e) => e.stopPropagation()}>\n <Typography variant=\"h6\" gutterBottom>\n Usage Examples\n </Typography>\n <Typography variant=\"body2\" paragraph>\n Use these code examples to test the API with your {request.spec.planTier} tier key.\n </Typography>\n <Box onClick={(e) => e.stopPropagation()}>\n <Tabs\n value={selectedLanguage}\n onChange={(e, newValue) => {\n e.stopPropagation();\n setSelectedLanguage(newValue);\n }}\n indicatorColor=\"primary\"\n >\n <Tab label=\"cURL\" onClick={(e) => e.stopPropagation()} />\n <Tab label=\"Node.js\" onClick={(e) => e.stopPropagation()} />\n <Tab label=\"Python\" onClick={(e) => e.stopPropagation()} />\n <Tab label=\"Go\" onClick={(e) => e.stopPropagation()} />\n </Tabs>\n </Box>\n <Box mt={2}>\n {selectedLanguage === 0 && (\n <CodeSnippet\n text={`curl -X GET https://${hostname}/api/v1/endpoint \\\\\n -H \"Authorization: Bearer ${request.status?.apiKey}\"`}\n language=\"bash\"\n showCopyCodeButton\n />\n )}\n {selectedLanguage === 1 && (\n <CodeSnippet\n text={`const fetch = require('node-fetch');\n\nconst apiKey = '${request.status?.apiKey}';\nconst endpoint = 'https://${hostname}/api/v1/endpoint';\n\nfetch(endpoint, {\n method: 'GET',\n headers: {\n 'Authorization': \\`Bearer \\${apiKey}\\`\n }\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`}\n language=\"javascript\"\n showCopyCodeButton\n />\n )}\n {selectedLanguage === 2 && (\n <CodeSnippet\n text={`import requests\n\napi_key = '${request.status?.apiKey}'\nendpoint = 'https://${hostname}/api/v1/endpoint'\n\nheaders = {\n 'Authorization': f'Bearer {api_key}'\n}\n\nresponse = requests.get(endpoint, headers=headers)\nprint(response.json())`}\n language=\"python\"\n showCopyCodeButton\n />\n )}\n {selectedLanguage === 3 && (\n <CodeSnippet\n text={`package main\n\nimport (\n \"fmt\"\n \"net/http\"\n \"io\"\n)\n\nfunc main() {\n apiKey := \"${request.status?.apiKey}\"\n endpoint := \"https://${hostname}/api/v1/endpoint\"\n\n client := &http.Client{}\n req, _ := http.NewRequest(\"GET\", endpoint, nil)\n req.Header.Add(\"Authorization\", \"Bearer \" + apiKey)\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println(\"Error:\", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`}\n language=\"go\"\n showCopyCodeButton\n />\n )}\n </Box>\n </Box>\n );\n };\n\n const loading = requestsLoading || plansLoading || createRequestPermissionLoading || deleteOwnPermissionLoading || deleteAllPermissionLoading;\n const error = requestsError || plansError;\n const permissionError = createRequestPermissionError || deleteOwnPermissionError || deleteAllPermissionError;\n\n if (loading) {\n return <Progress />;\n }\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n if (permissionError) {\n const failedPermission = createRequestPermissionError ? 'kuadrant.apikeyrequest.create' :\n deleteOwnPermissionError ? 'kuadrant.apikey.delete.own' :\n deleteAllPermissionError ? 'kuadrant.apikey.delete.all' : 'unknown';\n return (\n <Box p={2}>\n <Typography color=\"error\">\n Unable to check permissions: {permissionError.message}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Permission: {failedPermission}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Please try again or contact your administrator\n </Typography>\n </Box>\n );\n }\n\n const myRequests = (requests || []) as APIKeyRequest[];\n const plans = (apiProduct?.spec?.plans || []) as Plan[];\n\n const pendingRequests = myRequests.filter(r => !r.status?.phase || r.status.phase === 'Pending');\n const approvedRequests = myRequests.filter(r => r.status?.phase === 'Approved');\n const rejectedRequests = myRequests.filter(r => r.status?.phase === 'Rejected');\n\n const approvedColumns: TableColumn<APIKeyRequest>[] = [\n {\n title: 'Plan Tier',\n field: 'spec.planTier',\n render: (row: APIKeyRequest) => (\n <Chip label={row.spec.planTier} color=\"primary\" size=\"small\" />\n ),\n },\n {\n title: 'Approved',\n field: 'status.reviewedAt',\n render: (row: APIKeyRequest) => (\n <Typography variant=\"body2\">\n {row.status?.reviewedAt ? new Date(row.status.reviewedAt).toLocaleDateString() : '-'}\n </Typography>\n ),\n },\n {\n title: 'API Key',\n field: 'status.apiKey',\n searchable: false,\n render: (row: APIKeyRequest) => {\n const isVisible = visibleKeys.has(row.metadata.name);\n const apiKey = row.status?.apiKey || 'N/A';\n\n return (\n <Box display=\"flex\" alignItems=\"center\">\n <Typography\n variant=\"body2\"\n style={{\n fontFamily: 'monospace',\n marginRight: 8,\n }}\n >\n {isVisible ? apiKey : '••••••••••••••••'}\n </Typography>\n <IconButton\n size=\"small\"\n onClick={() => toggleVisibility(row.metadata.name)}\n >\n {isVisible ? <VisibilityOffIcon /> : <VisibilityIcon />}\n </IconButton>\n </Box>\n );\n },\n },\n {\n title: 'Actions',\n field: 'actions',\n searchable: false,\n render: (row: APIKeyRequest) => {\n const ownerId = row.spec.requestedBy.userId;\n const canDelete = canDeleteResource(ownerId, userId, canDeleteOwnKey, canDeleteAllKeys);\n if (!canDelete) return null;\n return (\n <IconButton\n size=\"small\"\n onClick={() => handleDeleteRequest(row.metadata.name)}\n color=\"secondary\"\n title=\"Revoke access and delete key\"\n >\n <DeleteIcon />\n </IconButton>\n );\n },\n },\n ];\n\n const requestColumns: TableColumn<APIKeyRequest>[] = [\n {\n title: 'Status',\n field: 'status.phase',\n render: (row: APIKeyRequest) => {\n const phase = row.status?.phase || 'Pending';\n const isPending = phase === 'Pending';\n return (\n <Chip\n label={phase}\n size=\"small\"\n icon={isPending ? <HourglassEmptyIcon /> : <CancelIcon />}\n color={isPending ? 'default' : 'secondary'}\n />\n );\n },\n },\n {\n title: 'Plan Tier',\n field: 'spec.planTier',\n render: (row: APIKeyRequest) => (\n <Chip label={row.spec.planTier} color=\"primary\" size=\"small\" />\n ),\n },\n {\n title: 'Use Case',\n field: 'spec.useCase',\n render: (row: APIKeyRequest) => (\n <Typography variant=\"body2\">{row.spec.useCase || '-'}</Typography>\n ),\n },\n {\n title: 'Requested',\n field: 'spec.requestedAt',\n render: (row: APIKeyRequest) => (\n <Typography variant=\"body2\">\n {row.spec.requestedAt ? new Date(row.spec.requestedAt).toLocaleDateString() : '-'}\n </Typography>\n ),\n },\n {\n title: 'Reviewed',\n field: 'status.reviewedAt',\n render: (row: APIKeyRequest) => {\n if (!row.status?.reviewedAt) return <Typography variant=\"body2\">-</Typography>;\n return (\n <Typography variant=\"body2\">\n {new Date(row.status.reviewedAt).toLocaleDateString()}\n </Typography>\n );\n },\n },\n {\n title: 'Reason',\n field: 'status.reason',\n render: (row: APIKeyRequest) => (\n <Typography variant=\"body2\">{row.status?.reason || '-'}</Typography>\n ),\n },\n {\n title: 'Actions',\n field: 'actions',\n searchable: false,\n render: (row: APIKeyRequest) => {\n const isPending = !row.status?.phase || row.status.phase === 'Pending';\n const ownerId = row.spec.requestedBy.userId;\n const canDelete = canDeleteResource(ownerId, userId, canDeleteOwnKey, canDeleteAllKeys);\n if (!isPending || !canDelete) return null;\n return (\n <IconButton\n size=\"small\"\n onClick={() => handleDeleteRequest(row.metadata.name)}\n color=\"secondary\"\n >\n <DeleteIcon />\n </IconButton>\n );\n },\n },\n ];\n\n return (\n <Box p={2}>\n <Grid container spacing={3} direction=\"column\">\n {canCreateRequest && (\n <Grid item>\n <Box display=\"flex\" flexDirection=\"column\" alignItems=\"flex-end\" mb={2}>\n <Button\n variant=\"contained\"\n color=\"primary\"\n startIcon={<AddIcon />}\n onClick={() => setOpen(true)}\n disabled={plans.length === 0}\n >\n Request API Access\n </Button>\n {plans.length === 0 && (\n <Typography variant=\"caption\" color=\"textSecondary\" style={{ marginTop: 4 }}>\n {!apiProduct ? 'API product not found' : 'No plans available'}\n </Typography>\n )}\n </Box>\n </Grid>\n )}\n {pendingRequests.length === 0 && rejectedRequests.length === 0 && approvedRequests.length === 0 && (\n <Grid item>\n <Box p={3} textAlign=\"center\">\n <Typography variant=\"body1\" color=\"textSecondary\">\n No API keys yet. Request access to get started.\n </Typography>\n </Box>\n </Grid>\n )}\n {pendingRequests.length > 0 && (\n <Grid item>\n <Table\n title=\"Pending Requests\"\n options={{\n paging: false,\n search: false,\n }}\n columns={requestColumns}\n data={pendingRequests}\n />\n </Grid>\n )}\n {rejectedRequests.length > 0 && (\n <Grid item>\n <Table\n title=\"Rejected Requests\"\n options={{\n paging: false,\n search: false,\n }}\n columns={requestColumns}\n data={rejectedRequests}\n />\n </Grid>\n )}\n {approvedRequests.length > 0 && (\n <Grid item>\n <Table\n key=\"api-keys-table\"\n title=\"API Keys\"\n options={{\n paging: false,\n search: false,\n }}\n columns={approvedColumns}\n data={approvedRequests}\n detailPanel={detailPanelConfig}\n />\n </Grid>\n )}\n </Grid>\n\n <Dialog open={open} onClose={() => setOpen(false)} maxWidth=\"sm\" fullWidth>\n <DialogTitle>Request API Access</DialogTitle>\n <DialogContent>\n {createError && (\n <Box mb={2} p={2} bgcolor=\"error.main\" color=\"error.contrastText\" borderRadius={1}>\n <Typography variant=\"body2\">{createError}</Typography>\n </Box>\n )}\n <FormControl fullWidth margin=\"normal\">\n <InputLabel>Select Plan Tier</InputLabel>\n <Select\n value={selectedPlan}\n onChange={(e) => setSelectedPlan(e.target.value as string)}\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 key={plan.tier} value={plan.tier}>\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 />\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setOpen(false)}>Cancel</Button>\n <Button\n onClick={handleRequestAccess}\n color=\"primary\"\n disabled={!selectedPlan || creating}\n >\n {creating ? 'Submitting...' : 'Submit Request'}\n </Button>\n </DialogActions>\n </Dialog>\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ApiKeyManagementTab.esm.js","sources":["../../../src/components/ApiKeyManagementTab/ApiKeyManagementTab.tsx"],"sourcesContent":["import React, { useState, useMemo } from 'react';\nimport { useAsync } from 'react-use';\nimport {\n Table,\n TableColumn,\n Progress,\n ResponseErrorPanel,\n CodeSnippet,\n} from '@backstage/core-components';\nimport {\n IconButton,\n Typography,\n Box,\n Chip,\n Grid,\n Button,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n TextField,\n Select,\n MenuItem,\n FormControl,\n InputLabel,\n Tabs,\n Tab,\n} from '@material-ui/core';\nimport { useApi, configApiRef, identityApiRef, fetchApiRef } from '@backstage/core-plugin-api';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport VisibilityIcon from '@material-ui/icons/Visibility';\nimport VisibilityOffIcon from '@material-ui/icons/VisibilityOff';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport HourglassEmptyIcon from '@material-ui/icons/HourglassEmpty';\nimport CancelIcon from '@material-ui/icons/Cancel';\nimport AddIcon from '@material-ui/icons/Add';\nimport { APIKeyRequest } from '../../types/api-management';\nimport {\n kuadrantApiKeyRequestCreatePermission,\n kuadrantApiKeyDeleteOwnPermission,\n kuadrantApiKeyDeleteAllPermission,\n} from '../../permissions';\nimport { useKuadrantPermission, canDeleteResource } from '../../utils/permissions';\n\ninterface APIProduct {\n metadata: {\n name: string;\n namespace: string;\n };\n spec: {\n plans?: Array<{\n tier: string;\n description?: string;\n limits?: any;\n }>;\n };\n}\n\ninterface Plan {\n tier: string;\n limits: any;\n}\n\nexport interface ApiKeyManagementTabProps {\n namespace?: string;\n}\n\nexport const ApiKeyManagementTab = ({ namespace: propNamespace }: ApiKeyManagementTabProps) => {\n const { entity } = useEntity();\n const config = useApi(configApiRef);\n const identityApi = useApi(identityApiRef);\n const fetchApi = useApi(fetchApiRef);\n const backendUrl = config.getString('backend.baseUrl');\n const [visibleKeys, setVisibleKeys] = useState<Set<string>>(new Set());\n const [refresh, setRefresh] = useState(0);\n const [userId, setUserId] = useState<string>('guest');\n const [userEmail, setUserEmail] = useState<string>('');\n const [open, setOpen] = useState(false);\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 const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);\n const [requestToDelete, setRequestToDelete] = useState<{ name: string; displayName: string } | null>(null);\n const [deleting, setDeleting] = useState(false);\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 useAsync(async () => {\n const identity = await identityApi.getBackstageIdentity();\n const profile = await identityApi.getProfileInfo();\n setUserId(identity.userEntityRef.split('/')[1] || 'guest');\n setUserEmail(profile.email || '');\n }, [identityApi]);\n\n const { value: requests, loading: requestsLoading, error: requestsError } = useAsync(async () => {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/requests/my?namespace=${namespace}`\n );\n if (!response.ok) {\n throw new Error('failed to fetch requests');\n }\n const data = await response.json();\n // filter by apiproduct name, not httproute name\n return (data.items || []).filter(\n (r: APIKeyRequest) => r.spec.apiName === apiProductName && r.spec.apiNamespace === namespace\n );\n }, [apiProductName, namespace, refresh, fetchApi, backendUrl]);\n\n const { value: apiProduct, loading: plansLoading, error: plansError } = useAsync(async () => {\n const response = await fetchApi.fetch(`${backendUrl}/api/kuadrant/apiproducts`);\n if (!response.ok) {\n throw new Error('failed to fetch api products');\n }\n const data = await response.json();\n\n const product = data.items?.find((p: APIProduct) =>\n p.metadata.namespace === namespace &&\n p.metadata.name === apiProductName\n );\n\n return product;\n }, [namespace, apiProductName, fetchApi]);\n\n // check permissions with resource reference once we have the apiproduct\n const resourceRef = apiProduct ? `apiproduct:${apiProduct.metadata.namespace}/${apiProduct.metadata.name}` : undefined;\n\n const {\n allowed: canCreateRequest,\n loading: createRequestPermissionLoading,\n error: createRequestPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyRequestCreatePermission, resourceRef);\n\n const {\n allowed: canDeleteOwnKey,\n loading: deleteOwnPermissionLoading,\n error: deleteOwnPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyDeleteOwnPermission);\n\n const {\n allowed: canDeleteAllKeys,\n loading: deleteAllPermissionLoading,\n error: deleteAllPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyDeleteAllPermission);\n\n const handleDeleteClick = (name: string, displayName: string) => {\n setRequestToDelete({ name, displayName });\n setDeleteDialogOpen(true);\n };\n\n const handleDeleteConfirm = async () => {\n if (!requestToDelete) return;\n\n setDeleting(true);\n try {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/requests/${namespace}/${requestToDelete.name}`,\n { method: 'DELETE' }\n );\n if (!response.ok) {\n throw new Error('failed to delete request');\n }\n setRefresh(r => r + 1);\n setDeleteDialogOpen(false);\n setRequestToDelete(null);\n } catch (err) {\n console.error('error deleting request:', err);\n } finally {\n setDeleting(false);\n }\n };\n\n const handleDeleteCancel = () => {\n setDeleteDialogOpen(false);\n setRequestToDelete(null);\n };\n\n const toggleVisibility = (keyName: string) => {\n setVisibleKeys(prev => {\n const newSet = new Set(prev);\n if (newSet.has(keyName)) {\n newSet.delete(keyName);\n } else {\n newSet.add(keyName);\n }\n return newSet;\n });\n };\n\n const handleRequestAccess = async () => {\n if (!selectedPlan) return;\n\n setCreating(true);\n setCreateError(null);\n try {\n const response = await fetchApi.fetch(`${backendUrl}/api/kuadrant/requests`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n apiName: apiProductName,\n apiNamespace: namespace,\n userId,\n userEmail,\n planTier: selectedPlan,\n useCase: useCase.trim() || '',\n namespace,\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || `failed to create request: ${response.status}`);\n }\n\n setOpen(false);\n setSelectedPlan('');\n setUseCase('');\n setRefresh(r => r + 1);\n } catch (err) {\n console.error('error creating api key request:', err);\n setCreateError(err instanceof Error ? err.message : 'unknown error occurred');\n } finally {\n setCreating(false);\n }\n };\n\n const detailPanelConfig = useMemo(() => [\n {\n render: (data: any) => {\n // backstage Table wraps the data in { rowData: actualData }\n const request = data.rowData as APIKeyRequest;\n if (!request?.metadata?.name) {\n return <Box />;\n }\n\n return <DetailPanelContent request={request} apiName={apiProductName} />;\n },\n },\n ], [apiProductName]);\n\n // separate component to isolate state\n const DetailPanelContent = ({ request, apiName: api }: { request: APIKeyRequest; apiName: string }) => {\n const [selectedLanguage, setSelectedLanguage] = useState(0);\n const hostname = request.status?.apiHostname || `${api}.apps.example.com`;\n\n return (\n <Box p={3} bgcolor=\"background.default\" onClick={(e) => e.stopPropagation()}>\n <Typography variant=\"h6\" gutterBottom>\n Usage Examples\n </Typography>\n <Typography variant=\"body2\" paragraph>\n Use these code examples to test the API with your {request.spec.planTier} tier key.\n </Typography>\n <Box onClick={(e) => e.stopPropagation()}>\n <Tabs\n value={selectedLanguage}\n onChange={(e, newValue) => {\n e.stopPropagation();\n setSelectedLanguage(newValue);\n }}\n indicatorColor=\"primary\"\n >\n <Tab label=\"cURL\" onClick={(e) => e.stopPropagation()} />\n <Tab label=\"Node.js\" onClick={(e) => e.stopPropagation()} />\n <Tab label=\"Python\" onClick={(e) => e.stopPropagation()} />\n <Tab label=\"Go\" onClick={(e) => e.stopPropagation()} />\n </Tabs>\n </Box>\n <Box mt={2}>\n {selectedLanguage === 0 && (\n <CodeSnippet\n text={`curl -X GET https://${hostname}/api/v1/endpoint \\\\\n -H \"Authorization: Bearer ${request.status?.apiKey}\"`}\n language=\"bash\"\n showCopyCodeButton\n />\n )}\n {selectedLanguage === 1 && (\n <CodeSnippet\n text={`const fetch = require('node-fetch');\n\nconst apiKey = '${request.status?.apiKey}';\nconst endpoint = 'https://${hostname}/api/v1/endpoint';\n\nfetch(endpoint, {\n method: 'GET',\n headers: {\n 'Authorization': \\`Bearer \\${apiKey}\\`\n }\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`}\n language=\"javascript\"\n showCopyCodeButton\n />\n )}\n {selectedLanguage === 2 && (\n <CodeSnippet\n text={`import requests\n\napi_key = '${request.status?.apiKey}'\nendpoint = 'https://${hostname}/api/v1/endpoint'\n\nheaders = {\n 'Authorization': f'Bearer {api_key}'\n}\n\nresponse = requests.get(endpoint, headers=headers)\nprint(response.json())`}\n language=\"python\"\n showCopyCodeButton\n />\n )}\n {selectedLanguage === 3 && (\n <CodeSnippet\n text={`package main\n\nimport (\n \"fmt\"\n \"net/http\"\n \"io\"\n)\n\nfunc main() {\n apiKey := \"${request.status?.apiKey}\"\n endpoint := \"https://${hostname}/api/v1/endpoint\"\n\n client := &http.Client{}\n req, _ := http.NewRequest(\"GET\", endpoint, nil)\n req.Header.Add(\"Authorization\", \"Bearer \" + apiKey)\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println(\"Error:\", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`}\n language=\"go\"\n showCopyCodeButton\n />\n )}\n </Box>\n </Box>\n );\n };\n\n const loading = requestsLoading || plansLoading || createRequestPermissionLoading || deleteOwnPermissionLoading || deleteAllPermissionLoading;\n const error = requestsError || plansError;\n const permissionError = createRequestPermissionError || deleteOwnPermissionError || deleteAllPermissionError;\n\n if (loading) {\n return <Progress />;\n }\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n if (permissionError) {\n const failedPermission = createRequestPermissionError ? 'kuadrant.apikeyrequest.create' :\n deleteOwnPermissionError ? 'kuadrant.apikey.delete.own' :\n deleteAllPermissionError ? 'kuadrant.apikey.delete.all' : 'unknown';\n return (\n <Box p={2}>\n <Typography color=\"error\">\n Unable to check permissions: {permissionError.message}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Permission: {failedPermission}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Please try again or contact your administrator\n </Typography>\n </Box>\n );\n }\n\n const myRequests = (requests || []) as APIKeyRequest[];\n const plans = (apiProduct?.spec?.plans || []) as Plan[];\n\n const pendingRequests = myRequests.filter(r => !r.status?.phase || r.status.phase === 'Pending');\n const approvedRequests = myRequests.filter(r => r.status?.phase === 'Approved');\n const rejectedRequests = myRequests.filter(r => r.status?.phase === 'Rejected');\n\n const approvedColumns: TableColumn<APIKeyRequest>[] = [\n {\n title: 'Plan Tier',\n field: 'spec.planTier',\n render: (row: APIKeyRequest) => (\n <Chip label={row.spec.planTier} color=\"primary\" size=\"small\" />\n ),\n },\n {\n title: 'Approved',\n field: 'status.reviewedAt',\n render: (row: APIKeyRequest) => (\n <Typography variant=\"body2\">\n {row.status?.reviewedAt ? new Date(row.status.reviewedAt).toLocaleDateString() : '-'}\n </Typography>\n ),\n },\n {\n title: 'API Key',\n field: 'status.apiKey',\n searchable: false,\n render: (row: APIKeyRequest) => {\n const isVisible = visibleKeys.has(row.metadata.name);\n const apiKey = row.status?.apiKey || 'N/A';\n\n return (\n <Box display=\"flex\" alignItems=\"center\">\n <Typography\n variant=\"body2\"\n style={{\n fontFamily: 'monospace',\n marginRight: 8,\n }}\n >\n {isVisible ? apiKey : '••••••••••••••••'}\n </Typography>\n <IconButton\n size=\"small\"\n onClick={() => toggleVisibility(row.metadata.name)}\n >\n {isVisible ? <VisibilityOffIcon /> : <VisibilityIcon />}\n </IconButton>\n </Box>\n );\n },\n },\n {\n title: 'Actions',\n field: 'actions',\n searchable: false,\n render: (row: APIKeyRequest) => {\n const ownerId = row.spec.requestedBy.userId;\n const canDelete = canDeleteResource(ownerId, userId, canDeleteOwnKey, canDeleteAllKeys);\n if (!canDelete) return null;\n return (\n <IconButton\n size=\"small\"\n onClick={() => handleDeleteClick(row.metadata.name, apiProductName)}\n color=\"secondary\"\n title=\"Revoke access and delete key\"\n >\n <DeleteIcon />\n </IconButton>\n );\n },\n },\n ];\n\n const requestColumns: TableColumn<APIKeyRequest>[] = [\n {\n title: 'Status',\n field: 'status.phase',\n render: (row: APIKeyRequest) => {\n const phase = row.status?.phase || 'Pending';\n const isPending = phase === 'Pending';\n return (\n <Chip\n label={phase}\n size=\"small\"\n icon={isPending ? <HourglassEmptyIcon /> : <CancelIcon />}\n color={isPending ? 'default' : 'secondary'}\n />\n );\n },\n },\n {\n title: 'Plan Tier',\n field: 'spec.planTier',\n render: (row: APIKeyRequest) => (\n <Chip label={row.spec.planTier} color=\"primary\" size=\"small\" />\n ),\n },\n {\n title: 'Use Case',\n field: 'spec.useCase',\n render: (row: APIKeyRequest) => (\n <Typography variant=\"body2\">{row.spec.useCase || '-'}</Typography>\n ),\n },\n {\n title: 'Requested',\n field: 'spec.requestedAt',\n render: (row: APIKeyRequest) => (\n <Typography variant=\"body2\">\n {row.spec.requestedAt ? new Date(row.spec.requestedAt).toLocaleDateString() : '-'}\n </Typography>\n ),\n },\n {\n title: 'Reviewed',\n field: 'status.reviewedAt',\n render: (row: APIKeyRequest) => {\n if (!row.status?.reviewedAt) return <Typography variant=\"body2\">-</Typography>;\n return (\n <Typography variant=\"body2\">\n {new Date(row.status.reviewedAt).toLocaleDateString()}\n </Typography>\n );\n },\n },\n {\n title: 'Reason',\n field: 'status.reason',\n render: (row: APIKeyRequest) => (\n <Typography variant=\"body2\">{row.status?.reason || '-'}</Typography>\n ),\n },\n {\n title: 'Actions',\n field: 'actions',\n searchable: false,\n render: (row: APIKeyRequest) => {\n const isPending = !row.status?.phase || row.status.phase === 'Pending';\n const ownerId = row.spec.requestedBy.userId;\n const canDelete = canDeleteResource(ownerId, userId, canDeleteOwnKey, canDeleteAllKeys);\n if (!isPending || !canDelete) return null;\n return (\n <IconButton\n size=\"small\"\n onClick={() => handleDeleteClick(row.metadata.name, apiProductName)}\n color=\"secondary\"\n >\n <DeleteIcon />\n </IconButton>\n );\n },\n },\n ];\n\n return (\n <Box p={2}>\n <Grid container spacing={3} direction=\"column\">\n {canCreateRequest && (\n <Grid item>\n <Box display=\"flex\" flexDirection=\"column\" alignItems=\"flex-end\" mb={2}>\n <Button\n variant=\"contained\"\n color=\"primary\"\n startIcon={<AddIcon />}\n onClick={() => setOpen(true)}\n disabled={plans.length === 0}\n >\n Request API Access\n </Button>\n {plans.length === 0 && (\n <Typography variant=\"caption\" color=\"textSecondary\" style={{ marginTop: 4 }}>\n {!apiProduct ? 'API product not found' : 'No plans available'}\n </Typography>\n )}\n </Box>\n </Grid>\n )}\n {pendingRequests.length === 0 && rejectedRequests.length === 0 && approvedRequests.length === 0 && (\n <Grid item>\n <Box p={3} textAlign=\"center\">\n <Typography variant=\"body1\" color=\"textSecondary\">\n No API keys yet. Request access to get started.\n </Typography>\n </Box>\n </Grid>\n )}\n {pendingRequests.length > 0 && (\n <Grid item>\n <Table\n title=\"Pending Requests\"\n options={{\n paging: false,\n search: false,\n }}\n columns={requestColumns}\n data={pendingRequests}\n />\n </Grid>\n )}\n {rejectedRequests.length > 0 && (\n <Grid item>\n <Table\n title=\"Rejected Requests\"\n options={{\n paging: false,\n search: false,\n }}\n columns={requestColumns}\n data={rejectedRequests}\n />\n </Grid>\n )}\n {approvedRequests.length > 0 && (\n <Grid item>\n <Table\n key=\"api-keys-table\"\n title=\"API Keys\"\n options={{\n paging: false,\n search: false,\n }}\n columns={approvedColumns}\n data={approvedRequests}\n detailPanel={detailPanelConfig}\n />\n </Grid>\n )}\n </Grid>\n\n <Dialog open={open} onClose={() => setOpen(false)} maxWidth=\"sm\" fullWidth>\n <DialogTitle>Request API Access</DialogTitle>\n <DialogContent>\n {createError && (\n <Box mb={2} p={2} bgcolor=\"error.main\" color=\"error.contrastText\" borderRadius={1}>\n <Typography variant=\"body2\">{createError}</Typography>\n </Box>\n )}\n <FormControl fullWidth margin=\"normal\">\n <InputLabel>Select Plan Tier</InputLabel>\n <Select\n value={selectedPlan}\n onChange={(e) => setSelectedPlan(e.target.value as string)}\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 key={plan.tier} value={plan.tier}>\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 />\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setOpen(false)}>Cancel</Button>\n <Button\n onClick={handleRequestAccess}\n color=\"primary\"\n disabled={!selectedPlan || creating}\n >\n {creating ? 'Submitting...' : 'Submit Request'}\n </Button>\n </DialogActions>\n </Dialog>\n\n <Dialog open={deleteDialogOpen} onClose={handleDeleteCancel}>\n <DialogTitle>Confirm Delete</DialogTitle>\n <DialogContent>\n <Typography>\n Are you sure you want to revoke access and delete your API key for <strong>{requestToDelete?.displayName}</strong>?\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\" style={{ marginTop: 8 }}>\n This action cannot be undone. You will need to request access again if you want to use this API in the future.\n </Typography>\n </DialogContent>\n <DialogActions>\n <Button onClick={handleDeleteCancel} color=\"primary\">\n Cancel\n </Button>\n <Button onClick={handleDeleteConfirm} color=\"secondary\" disabled={deleting}>\n {deleting ? 'Deleting...' : 'Delete'}\n </Button>\n </DialogActions>\n </Dialog>\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@ import { useAsync } from 'react-use';
4
4
  import { Progress, ResponseErrorPanel, InfoCard, Table } from '@backstage/core-components';
5
5
  import { kuadrantApiKeyRequestUpdatePermission } from '../../permissions.esm.js';
6
6
  import { useKuadrantPermission } from '../../utils/permissions.esm.js';
7
- import { Box, Typography, Button, Dialog, DialogTitle, DialogContent, TextField, DialogActions, Chip } from '@material-ui/core';
7
+ import { Box, Typography, Tabs, Tab, Button, Dialog, DialogTitle, DialogContent, TextField, DialogActions, Chip } from '@material-ui/core';
8
8
  import CheckCircleIcon from '@material-ui/icons/CheckCircle';
9
9
  import CancelIcon from '@material-ui/icons/Cancel';
10
10
 
@@ -69,6 +69,7 @@ const ApprovalQueueCard = () => {
69
69
  const identityApi = useApi(identityApiRef);
70
70
  const backendUrl = config.getString("backend.baseUrl");
71
71
  const [refresh, setRefresh] = useState(0);
72
+ const [selectedTab, setSelectedTab] = useState(0);
72
73
  const [selectedRequests, setSelectedRequests] = useState([]);
73
74
  const [dialogState, setDialogState] = useState({
74
75
  open: false,
@@ -394,56 +395,87 @@ const ApprovalQueueCard = () => {
394
395
  render: (row) => /* @__PURE__ */ React.createElement(Typography, { variant: "body2", style: { maxWidth: 200 }, noWrap: true, title: row.status?.reason }, row.status?.reason || "-")
395
396
  }
396
397
  ];
397
- return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(InfoCard, { title: `Pending Requests (${pending.length})` }, pending.length === 0 ? /* @__PURE__ */ React.createElement(Typography, { variant: "body2", color: "textSecondary" }, "No pending requests") : /* @__PURE__ */ React.createElement(React.Fragment, null, canUpdateRequests && selectedRequests.length > 0 && /* @__PURE__ */ React.createElement(Box, { mb: 2, display: "flex", alignItems: "center", justifyContent: "space-between", p: 2, bgcolor: "background.default" }, /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, selectedRequests.length, " request", selectedRequests.length !== 1 ? "s" : "", " selected"), /* @__PURE__ */ React.createElement(Box, { display: "flex", style: { gap: 8 } }, /* @__PURE__ */ React.createElement(
398
- Button,
399
- {
400
- size: "small",
401
- variant: "contained",
402
- color: "primary",
403
- startIcon: /* @__PURE__ */ React.createElement(CheckCircleIcon, null),
404
- onClick: handleBulkApprove
405
- },
406
- "Approve Selected"
407
- ), /* @__PURE__ */ React.createElement(
408
- Button,
398
+ const getTabData = () => {
399
+ switch (selectedTab) {
400
+ case 0:
401
+ return { data: approved, columns: approvedColumns, showSelection: false };
402
+ case 1:
403
+ const pendingWithSelection = pending.map((row) => {
404
+ const isSelected = selectedRequests.some(
405
+ (selected) => selected.metadata.name === row.metadata.name && selected.metadata.namespace === row.metadata.namespace
406
+ );
407
+ return {
408
+ ...row,
409
+ tableData: { checked: isSelected }
410
+ };
411
+ });
412
+ return { data: pendingWithSelection, columns: pendingColumns, showSelection: true };
413
+ case 2:
414
+ return { data: rejected, columns: rejectedColumns, showSelection: false };
415
+ default:
416
+ return { data: approved, columns: approvedColumns, showSelection: false };
417
+ }
418
+ };
419
+ const tabData = getTabData();
420
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(
421
+ InfoCard,
409
422
  {
410
- size: "small",
411
- variant: "contained",
412
- color: "secondary",
413
- startIcon: /* @__PURE__ */ React.createElement(CancelIcon, null),
414
- onClick: handleBulkReject
423
+ title: "API Access Requests",
424
+ subheader: `${pending.length} pending, ${approved.length} approved, ${rejected.length} rejected`
415
425
  },
416
- "Reject Selected"
417
- ))), /* @__PURE__ */ React.createElement(
418
- Table,
419
- {
420
- options: {
421
- selection: canUpdateRequests,
422
- paging: true,
423
- pageSize: 5,
424
- search: false,
425
- showTextRowsSelected: false,
426
- toolbar: false
426
+ /* @__PURE__ */ React.createElement(Box, { mb: 2 }, /* @__PURE__ */ React.createElement(
427
+ Tabs,
428
+ {
429
+ value: selectedTab,
430
+ onChange: (_, newValue) => {
431
+ setSelectedTab(newValue);
432
+ setSelectedRequests([]);
433
+ },
434
+ indicatorColor: "primary",
435
+ textColor: "primary"
427
436
  },
428
- data: pending,
429
- columns: pendingColumns,
430
- onSelectionChange: (rows) => setSelectedRequests(rows)
431
- }
432
- ))), approved.length > 0 && /* @__PURE__ */ React.createElement(Box, { mt: 3 }, /* @__PURE__ */ React.createElement(InfoCard, { title: `Approved Requests (${approved.length})` }, /* @__PURE__ */ React.createElement(
433
- Table,
434
- {
435
- options: { paging: true, pageSize: 5, search: false, toolbar: false },
436
- data: approved,
437
- columns: approvedColumns
438
- }
439
- ))), rejected.length > 0 && /* @__PURE__ */ React.createElement(Box, { mt: 3 }, /* @__PURE__ */ React.createElement(InfoCard, { title: `Rejected Requests (${rejected.length})` }, /* @__PURE__ */ React.createElement(
440
- Table,
441
- {
442
- options: { paging: true, pageSize: 5, search: false, toolbar: false },
443
- data: rejected,
444
- columns: rejectedColumns
445
- }
446
- )))), /* @__PURE__ */ React.createElement(
437
+ /* @__PURE__ */ React.createElement(Tab, { label: `Approved (${approved.length})` }),
438
+ /* @__PURE__ */ React.createElement(Tab, { label: `Pending (${pending.length})` }),
439
+ /* @__PURE__ */ React.createElement(Tab, { label: `Rejected (${rejected.length})` })
440
+ )),
441
+ canUpdateRequests && selectedTab === 1 && selectedRequests.length > 0 && /* @__PURE__ */ React.createElement(Box, { mb: 2, display: "flex", alignItems: "center", justifyContent: "space-between", p: 2, bgcolor: "background.default" }, /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, selectedRequests.length, " request", selectedRequests.length !== 1 ? "s" : "", " selected"), /* @__PURE__ */ React.createElement(Box, { display: "flex", style: { gap: 8 } }, /* @__PURE__ */ React.createElement(
442
+ Button,
443
+ {
444
+ size: "small",
445
+ variant: "contained",
446
+ color: "primary",
447
+ startIcon: /* @__PURE__ */ React.createElement(CheckCircleIcon, null),
448
+ onClick: handleBulkApprove
449
+ },
450
+ "Approve Selected"
451
+ ), /* @__PURE__ */ React.createElement(
452
+ Button,
453
+ {
454
+ size: "small",
455
+ variant: "contained",
456
+ color: "secondary",
457
+ startIcon: /* @__PURE__ */ React.createElement(CancelIcon, null),
458
+ onClick: handleBulkReject
459
+ },
460
+ "Reject Selected"
461
+ ))),
462
+ tabData.data.length === 0 ? /* @__PURE__ */ React.createElement(Box, { p: 3, textAlign: "center" }, /* @__PURE__ */ React.createElement(Typography, { variant: "body1", color: "textSecondary" }, selectedTab === 0 && "No approved requests.", selectedTab === 1 && "No pending requests.", selectedTab === 2 && "No rejected requests.")) : /* @__PURE__ */ React.createElement(
463
+ Table,
464
+ {
465
+ options: {
466
+ selection: canUpdateRequests && tabData.showSelection,
467
+ paging: tabData.data.length > 10,
468
+ pageSize: 10,
469
+ search: false,
470
+ showTextRowsSelected: false,
471
+ toolbar: false
472
+ },
473
+ data: tabData.data,
474
+ columns: tabData.columns,
475
+ onSelectionChange: (rows) => setSelectedRequests(rows)
476
+ }
477
+ )
478
+ ), /* @__PURE__ */ React.createElement(
447
479
  ApprovalDialog,
448
480
  {
449
481
  open: dialogState.open,