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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. package/dist/api.esm.js +40 -2
  2. package/dist/api.esm.js.map +1 -1
  3. package/dist/components/ApiAccessCard/ApiAccessCard.esm.js +20 -85
  4. package/dist/components/ApiAccessCard/ApiAccessCard.esm.js.map +1 -1
  5. package/dist/components/ApiKeyApprovalPage/ApiKeyApprovalPageWithPermissions.esm.js +18 -0
  6. package/dist/components/ApiKeyApprovalPage/ApiKeyApprovalPageWithPermissions.esm.js.map +1 -0
  7. package/dist/components/ApiKeyApprovalPage/index.esm.js +1 -0
  8. package/dist/components/ApiKeyApprovalPage/index.esm.js.map +1 -1
  9. package/dist/components/ApiKeyDetailPage/ApiKeyDetailPage.esm.js +19 -60
  10. package/dist/components/ApiKeyDetailPage/ApiKeyDetailPage.esm.js.map +1 -1
  11. package/dist/components/ApiKeyManagementTab/ApiKeyManagementTab.esm.js +66 -113
  12. package/dist/components/ApiKeyManagementTab/ApiKeyManagementTab.esm.js.map +1 -1
  13. package/dist/components/ApiProductInfoCard/ApiProductInfoCard.esm.js +3 -2
  14. package/dist/components/ApiProductInfoCard/ApiProductInfoCard.esm.js.map +1 -1
  15. package/dist/components/ApprovalQueueTable/ApprovalQueueTable.esm.js +16 -15
  16. package/dist/components/ApprovalQueueTable/ApprovalQueueTable.esm.js.map +1 -1
  17. package/dist/components/CreateAPIProductDialog/CreateAPIProductDialog.esm.js +1 -7
  18. package/dist/components/CreateAPIProductDialog/CreateAPIProductDialog.esm.js.map +1 -1
  19. package/dist/components/EditAPIProductDialog/EditAPIProductDialog.esm.js +2 -3
  20. package/dist/components/EditAPIProductDialog/EditAPIProductDialog.esm.js.map +1 -1
  21. package/dist/components/KuadrantIcon/KuadrantIcon.esm.js +22 -0
  22. package/dist/components/KuadrantIcon/KuadrantIcon.esm.js.map +1 -0
  23. package/dist/components/KuadrantPage/ApiProductsPage.esm.js +5 -18
  24. package/dist/components/KuadrantPage/ApiProductsPage.esm.js.map +1 -1
  25. package/dist/components/MyApiKeysTable/MyApiKeysTable.esm.js +28 -138
  26. package/dist/components/MyApiKeysTable/MyApiKeysTable.esm.js.map +1 -1
  27. package/dist/components/PermissionGate/PermissionGate.esm.js +2 -2
  28. package/dist/components/PermissionGate/PermissionGate.esm.js.map +1 -1
  29. package/dist/components/RequestAccessDialog/RequestAccessDialog.esm.js +32 -18
  30. package/dist/components/RequestAccessDialog/RequestAccessDialog.esm.js.map +1 -1
  31. package/dist/components/SimpleRequestAccessDialog/SimpleRequestAccessDialog.esm.js +13 -2
  32. package/dist/components/SimpleRequestAccessDialog/SimpleRequestAccessDialog.esm.js.map +1 -1
  33. package/dist/components/icons.esm.js +11 -0
  34. package/dist/components/icons.esm.js.map +1 -0
  35. package/dist/index.d.ts +54 -6
  36. package/dist/index.esm.js +3 -1
  37. package/dist/index.esm.js.map +1 -1
  38. package/dist/plugin.esm.js +2 -10
  39. package/dist/plugin.esm.js.map +1 -1
  40. package/dist/utils/apikeys.esm.js +21 -0
  41. package/dist/utils/apikeys.esm.js.map +1 -0
  42. package/dist/utils/styles.esm.js +5 -2
  43. package/dist/utils/styles.esm.js.map +1 -1
  44. package/dist-scalprum/internal.plugin-kuadrant.7f1de85661b1b848af15.js +2 -0
  45. package/dist-scalprum/internal.plugin-kuadrant.7f1de85661b1b848af15.js.map +1 -0
  46. package/dist-scalprum/plugin-manifest.json +3 -3
  47. package/dist-scalprum/static/{1037.58dd29ad.chunk.js → 1037.25758556.chunk.js} +1 -1
  48. package/dist-scalprum/static/{1037.58dd29ad.chunk.js.map → 1037.25758556.chunk.js.map} +1 -1
  49. package/dist-scalprum/static/1340.7c4f4722.chunk.js +3 -0
  50. package/dist-scalprum/static/1340.7c4f4722.chunk.js.map +1 -0
  51. package/dist-scalprum/static/1719.52ca7daf.chunk.js +2 -0
  52. package/dist-scalprum/static/1719.52ca7daf.chunk.js.map +1 -0
  53. package/dist-scalprum/static/{1881.8221c002.chunk.js → 1931.f6a5edbb.chunk.js} +2 -2
  54. package/dist-scalprum/static/1931.f6a5edbb.chunk.js.map +1 -0
  55. package/dist-scalprum/static/20.b3a37d1d.chunk.js +3 -0
  56. package/dist-scalprum/static/20.b3a37d1d.chunk.js.map +1 -0
  57. package/dist-scalprum/static/2251.08f3db99.chunk.js +2 -0
  58. package/dist-scalprum/static/2251.08f3db99.chunk.js.map +1 -0
  59. package/dist-scalprum/static/2769.e09b0ab0.chunk.js +2 -0
  60. package/dist-scalprum/static/2769.e09b0ab0.chunk.js.map +1 -0
  61. package/dist-scalprum/static/2821.1ac360ec.chunk.js +2 -0
  62. package/dist-scalprum/static/2821.1ac360ec.chunk.js.map +1 -0
  63. package/dist-scalprum/static/2952.b54bd390.chunk.js +2 -0
  64. package/dist-scalprum/static/2952.b54bd390.chunk.js.map +1 -0
  65. package/dist-scalprum/static/2967.004a950e.chunk.js +2 -0
  66. package/dist-scalprum/static/2967.004a950e.chunk.js.map +1 -0
  67. package/dist-scalprum/static/3015.1fe097c2.chunk.js +3 -0
  68. package/dist-scalprum/static/3015.1fe097c2.chunk.js.LICENSE.txt +9 -0
  69. package/dist-scalprum/static/3015.1fe097c2.chunk.js.map +1 -0
  70. package/dist-scalprum/static/327.74ecd572.chunk.js +2 -0
  71. package/dist-scalprum/static/327.74ecd572.chunk.js.map +1 -0
  72. package/dist-scalprum/static/3657.882640ca.chunk.js +3 -0
  73. package/dist-scalprum/static/3657.882640ca.chunk.js.LICENSE.txt +8 -0
  74. package/dist-scalprum/static/3657.882640ca.chunk.js.map +1 -0
  75. package/dist-scalprum/static/3658.104704cc.chunk.js +2 -0
  76. package/dist-scalprum/static/3658.104704cc.chunk.js.map +1 -0
  77. package/dist-scalprum/static/{3897.ef4554b5.chunk.js → 3897.6e9c07c0.chunk.js} +1 -1
  78. package/dist-scalprum/static/{3897.ef4554b5.chunk.js.map → 3897.6e9c07c0.chunk.js.map} +1 -1
  79. package/dist-scalprum/static/3917.888fba36.chunk.js +2 -0
  80. package/dist-scalprum/static/3917.888fba36.chunk.js.map +1 -0
  81. package/dist-scalprum/static/3947.f5320e89.chunk.js +2 -0
  82. package/dist-scalprum/static/3947.f5320e89.chunk.js.map +1 -0
  83. package/dist-scalprum/static/{4083.488ff7a9.chunk.js → 4083.811c4e7a.chunk.js} +2 -2
  84. package/dist-scalprum/static/{4083.488ff7a9.chunk.js.map → 4083.811c4e7a.chunk.js.map} +1 -1
  85. package/dist-scalprum/static/438.4335b833.chunk.js +2 -0
  86. package/dist-scalprum/static/438.4335b833.chunk.js.map +1 -0
  87. package/dist-scalprum/static/4908.4f21d453.chunk.js +2 -0
  88. package/dist-scalprum/static/4908.4f21d453.chunk.js.map +1 -0
  89. package/dist-scalprum/static/{5010.6241b64f.chunk.js → 5010.4f67737b.chunk.js} +2 -2
  90. package/dist-scalprum/static/{5010.6241b64f.chunk.js.map → 5010.4f67737b.chunk.js.map} +1 -1
  91. package/dist-scalprum/static/5197.53535ff4.chunk.js +2 -0
  92. package/dist-scalprum/static/5197.53535ff4.chunk.js.map +1 -0
  93. package/dist-scalprum/static/5289.6c803140.chunk.js +2 -0
  94. package/dist-scalprum/static/5289.6c803140.chunk.js.map +1 -0
  95. package/dist-scalprum/static/5943.4e1dedc5.chunk.js +2 -0
  96. package/dist-scalprum/static/5943.4e1dedc5.chunk.js.map +1 -0
  97. package/dist-scalprum/static/6038.63d1f832.chunk.js +3 -0
  98. package/dist-scalprum/static/6038.63d1f832.chunk.js.LICENSE.txt +8 -0
  99. package/dist-scalprum/static/6038.63d1f832.chunk.js.map +1 -0
  100. package/dist-scalprum/static/{6272.b5645dc2.chunk.js → 6272.3ed14ea4.chunk.js} +1 -1
  101. package/dist-scalprum/static/{6272.b5645dc2.chunk.js.map → 6272.3ed14ea4.chunk.js.map} +1 -1
  102. package/dist-scalprum/static/6311.da1849d1.chunk.js +2 -0
  103. package/dist-scalprum/static/6311.da1849d1.chunk.js.map +1 -0
  104. package/dist-scalprum/static/635.f63679a5.chunk.js +3 -0
  105. package/dist-scalprum/static/635.f63679a5.chunk.js.map +1 -0
  106. package/dist-scalprum/static/6371.02375475.chunk.js +3 -0
  107. package/dist-scalprum/static/6371.02375475.chunk.js.LICENSE.txt +9 -0
  108. package/dist-scalprum/static/6371.02375475.chunk.js.map +1 -0
  109. package/dist-scalprum/static/{6386.2d20c412.chunk.js → 6386.5922f271.chunk.js} +3 -3
  110. package/dist-scalprum/static/{6386.2d20c412.chunk.js.map → 6386.5922f271.chunk.js.map} +1 -1
  111. package/dist-scalprum/static/6837.6252b97a.chunk.js +2 -0
  112. package/dist-scalprum/static/6837.6252b97a.chunk.js.map +1 -0
  113. package/dist-scalprum/static/{6972.e47ec97e.chunk.js → 6972.f22b9446.chunk.js} +1 -1
  114. package/dist-scalprum/static/{6972.e47ec97e.chunk.js.map → 6972.f22b9446.chunk.js.map} +1 -1
  115. package/dist-scalprum/static/7164.5dc4bc72.chunk.js +2 -0
  116. package/dist-scalprum/static/7164.5dc4bc72.chunk.js.map +1 -0
  117. package/dist-scalprum/static/{7266.e760b8c3.chunk.js → 7266.3c4174cc.chunk.js} +1 -1
  118. package/dist-scalprum/static/{7266.e760b8c3.chunk.js.map → 7266.3c4174cc.chunk.js.map} +1 -1
  119. package/dist-scalprum/static/7270.8ee9d452.chunk.js +2 -0
  120. package/dist-scalprum/static/7270.8ee9d452.chunk.js.map +1 -0
  121. package/dist-scalprum/static/{7791.8f84478d.chunk.js → 7791.ad31cf6d.chunk.js} +2 -2
  122. package/dist-scalprum/static/{7791.8f84478d.chunk.js.map → 7791.ad31cf6d.chunk.js.map} +1 -1
  123. package/dist-scalprum/static/{8563.46f1a3e1.chunk.js → 8563.6501eafb.chunk.js} +2 -2
  124. package/dist-scalprum/static/{8563.46f1a3e1.chunk.js.map → 8563.6501eafb.chunk.js.map} +1 -1
  125. package/dist-scalprum/static/980.744a4d36.chunk.js +2 -0
  126. package/dist-scalprum/static/980.744a4d36.chunk.js.map +1 -0
  127. package/dist-scalprum/static/exposed-KuadrantIcon.08abbb96.chunk.js +3 -0
  128. package/dist-scalprum/static/exposed-KuadrantIcon.08abbb96.chunk.js.LICENSE.txt +9 -0
  129. package/dist-scalprum/static/exposed-KuadrantIcon.08abbb96.chunk.js.map +1 -0
  130. package/dist-scalprum/static/exposed-KuadrantPage.f123b200.chunk.js +2 -0
  131. package/dist-scalprum/static/exposed-KuadrantPage.f123b200.chunk.js.map +1 -0
  132. package/dist-scalprum/static/exposed-PluginRoot.3a5f9157.chunk.js +2 -0
  133. package/dist-scalprum/static/exposed-PluginRoot.3a5f9157.chunk.js.map +1 -0
  134. package/package.json +6 -3
  135. package/dist/components/EntityApiApprovalTab/EntityApiApprovalTab.esm.js +0 -265
  136. package/dist/components/EntityApiApprovalTab/EntityApiApprovalTab.esm.js.map +0 -1
  137. package/dist/components/EntityApiApprovalTab/index.esm.js +0 -2
  138. package/dist/components/EntityApiApprovalTab/index.esm.js.map +0 -1
  139. package/dist-scalprum/internal.plugin-kuadrant.b3d35dc8b21ce867aa09.js +0 -2
  140. package/dist-scalprum/internal.plugin-kuadrant.b3d35dc8b21ce867aa09.js.map +0 -1
  141. package/dist-scalprum/static/1319.ac195ac2.chunk.js +0 -2
  142. package/dist-scalprum/static/1319.ac195ac2.chunk.js.map +0 -1
  143. package/dist-scalprum/static/1584.ae3779f0.chunk.js +0 -3
  144. package/dist-scalprum/static/1584.ae3779f0.chunk.js.map +0 -1
  145. package/dist-scalprum/static/1881.8221c002.chunk.js.map +0 -1
  146. package/dist-scalprum/static/2967.7c6a34cd.chunk.js +0 -2
  147. package/dist-scalprum/static/2967.7c6a34cd.chunk.js.map +0 -1
  148. package/dist-scalprum/static/3118.daee3324.chunk.js +0 -3
  149. package/dist-scalprum/static/3118.daee3324.chunk.js.map +0 -1
  150. package/dist-scalprum/static/3581.b5b97f08.chunk.js +0 -2
  151. package/dist-scalprum/static/3581.b5b97f08.chunk.js.map +0 -1
  152. package/dist-scalprum/static/369.2374941c.chunk.js +0 -2
  153. package/dist-scalprum/static/369.2374941c.chunk.js.map +0 -1
  154. package/dist-scalprum/static/3947.ad129ba4.chunk.js +0 -2
  155. package/dist-scalprum/static/3947.ad129ba4.chunk.js.map +0 -1
  156. package/dist-scalprum/static/3976.e0873210.chunk.js +0 -2
  157. package/dist-scalprum/static/3976.e0873210.chunk.js.map +0 -1
  158. package/dist-scalprum/static/4434.f92f6ba4.chunk.js +0 -2
  159. package/dist-scalprum/static/4434.f92f6ba4.chunk.js.map +0 -1
  160. package/dist-scalprum/static/483.d55d6ab2.chunk.js +0 -2
  161. package/dist-scalprum/static/483.d55d6ab2.chunk.js.map +0 -1
  162. package/dist-scalprum/static/512.f1c51799.chunk.js +0 -2
  163. package/dist-scalprum/static/512.f1c51799.chunk.js.map +0 -1
  164. package/dist-scalprum/static/5203.3df62d7e.chunk.js +0 -2
  165. package/dist-scalprum/static/5203.3df62d7e.chunk.js.map +0 -1
  166. package/dist-scalprum/static/5289.2e686027.chunk.js +0 -2
  167. package/dist-scalprum/static/5289.2e686027.chunk.js.map +0 -1
  168. package/dist-scalprum/static/5453.3c20d0a6.chunk.js +0 -2
  169. package/dist-scalprum/static/5453.3c20d0a6.chunk.js.map +0 -1
  170. package/dist-scalprum/static/6371.f183dddb.chunk.js +0 -3
  171. package/dist-scalprum/static/6371.f183dddb.chunk.js.map +0 -1
  172. package/dist-scalprum/static/6426.bf20c588.chunk.js +0 -2
  173. package/dist-scalprum/static/6426.bf20c588.chunk.js.map +0 -1
  174. package/dist-scalprum/static/6800.ddabed69.chunk.js +0 -2
  175. package/dist-scalprum/static/6800.ddabed69.chunk.js.map +0 -1
  176. package/dist-scalprum/static/7005.d548f8f1.chunk.js +0 -2
  177. package/dist-scalprum/static/7005.d548f8f1.chunk.js.map +0 -1
  178. package/dist-scalprum/static/7057.fcd688c7.chunk.js +0 -2
  179. package/dist-scalprum/static/7057.fcd688c7.chunk.js.map +0 -1
  180. package/dist-scalprum/static/7270.301a3c46.chunk.js +0 -2
  181. package/dist-scalprum/static/7270.301a3c46.chunk.js.map +0 -1
  182. package/dist-scalprum/static/9051.f095a8a1.chunk.js +0 -2
  183. package/dist-scalprum/static/9051.f095a8a1.chunk.js.map +0 -1
  184. package/dist-scalprum/static/9079.b6d5c19c.chunk.js +0 -2
  185. package/dist-scalprum/static/9079.b6d5c19c.chunk.js.map +0 -1
  186. package/dist-scalprum/static/9625.b0c6610a.chunk.js +0 -2
  187. package/dist-scalprum/static/9625.b0c6610a.chunk.js.map +0 -1
  188. package/dist-scalprum/static/9838.589f2156.chunk.js +0 -2
  189. package/dist-scalprum/static/9838.589f2156.chunk.js.map +0 -1
  190. package/dist-scalprum/static/exposed-PluginRoot.a8448fcc.chunk.js +0 -2
  191. package/dist-scalprum/static/exposed-PluginRoot.a8448fcc.chunk.js.map +0 -1
  192. /package/dist-scalprum/static/{1584.ae3779f0.chunk.js.LICENSE.txt → 1340.7c4f4722.chunk.js.LICENSE.txt} +0 -0
  193. /package/dist-scalprum/static/{3118.daee3324.chunk.js.LICENSE.txt → 20.b3a37d1d.chunk.js.LICENSE.txt} +0 -0
  194. /package/dist-scalprum/static/{4083.488ff7a9.chunk.js.LICENSE.txt → 4083.811c4e7a.chunk.js.LICENSE.txt} +0 -0
  195. /package/dist-scalprum/static/{5010.6241b64f.chunk.js.LICENSE.txt → 5010.4f67737b.chunk.js.LICENSE.txt} +0 -0
  196. /package/dist-scalprum/static/{6371.f183dddb.chunk.js.LICENSE.txt → 635.f63679a5.chunk.js.LICENSE.txt} +0 -0
  197. /package/dist-scalprum/static/{6386.2d20c412.chunk.js.LICENSE.txt → 6386.5922f271.chunk.js.LICENSE.txt} +0 -0
  198. /package/dist-scalprum/static/{8563.46f1a3e1.chunk.js.LICENSE.txt → 8563.6501eafb.chunk.js.LICENSE.txt} +0 -0
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @license React
3
+ * react-jsx-runtime.production.min.js
4
+ *
5
+ * Copyright (c) Facebook, Inc. and its affiliates.
6
+ *
7
+ * This source code is licensed under the MIT license found in the
8
+ * LICENSE file in the root directory of this source tree.
9
+ */
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static/exposed-KuadrantIcon.08abbb96.chunk.js","mappings":"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","sources":["webpack://internal.plugin-kuadrant/../../node_modules/@babel/runtime/helpers/interopRequireDefault.js","webpack://internal.plugin-kuadrant/../../node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","webpack://internal.plugin-kuadrant/./src/components/KuadrantIcon/KuadrantIcon.tsx","webpack://internal.plugin-kuadrant/../../node_modules/@babel/runtime/helpers/extends.js","webpack://internal.plugin-kuadrant/../../node_modules/react/jsx-runtime.js","webpack://internal.plugin-kuadrant/../../node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js","webpack://internal.plugin-kuadrant/../../node_modules/react/cjs/react-jsx-runtime.production.min.js","webpack://internal.plugin-kuadrant/../../node_modules/@babel/runtime/helpers/esm/extends.js"],"sourcesContent":["function _interopRequireDefault(e) {\n return e && e.__esModule ? e : {\n \"default\": e\n };\n}\nmodule.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _objectWithoutPropertiesLoose(r, e) {\n if (null == r) return {};\n var t = {};\n for (var n in r) if ({}.hasOwnProperty.call(r, n)) {\n if (-1 !== e.indexOf(n)) continue;\n t[n] = r[n];\n }\n return t;\n}\nexport { _objectWithoutPropertiesLoose as default };","import React from 'react';\nimport SvgIcon, { SvgIconProps } from '@mui/material/SvgIcon';\n\nexport const KuadrantIcon = (props: SvgIconProps) => (\n <SvgIcon\n {...props}\n viewBox=\"0 0 1024 1024\"\n sx={{ transform: 'scale(0.85)', marginLeft: '4px', ...props.sx }}\n >\n <path\n d=\"M809,1C993.59,183.56 1065.7,449.65 998.12,699.05C964.778,821.823 899.519,933.607 809,1023L292.27,512L809,1Z\"\n fill=\"currentColor\"\n />\n <rect x=\"1\" y=\"1\" width=\"218\" height=\"1022\" fill=\"currentColor\" />\n </SvgIcon>\n);\n","function _extends() {\n return module.exports = _extends = Object.assign ? Object.assign.bind() : function (n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports, _extends.apply(null, arguments);\n}\nmodule.exports = _extends, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","function _objectWithoutPropertiesLoose(r, e) {\n if (null == r) return {};\n var t = {};\n for (var n in r) if ({}.hasOwnProperty.call(r, n)) {\n if (-1 !== e.indexOf(n)) continue;\n t[n] = r[n];\n }\n return t;\n}\nmodule.exports = _objectWithoutPropertiesLoose, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","/**\n * @license React\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var f=require(\"react\"),k=Symbol.for(\"react.element\"),l=Symbol.for(\"react.fragment\"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=\"\"+g);void 0!==a.key&&(e=\"\"+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q;\n","function _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function (n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nexport { _extends as default };"],"names":["module","exports","e","__esModule","_objectWithoutPropertiesLoose","r","t","n","hasOwnProperty","call","indexOf","KuadrantIcon","props","SvgIcon","viewBox","sx","transform","marginLeft","path","d","fill","rect","x","y","width","height","_extends","Object","assign","bind","arguments","length","apply","f","k","Symbol","for","l","m","prototype","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","ReactCurrentOwner","p","key","ref","__self","__source","q","c","a","g","b","h","defaultProps","$$typeof","type","_owner","current","Fragment","jsx","jsxs"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[6921],{72627:(e,n,t)=>{t.r(n),t.d(n,{ApiKeyApprovalPage:()=>l,ApiKeyDetailPage:()=>A,ApiProductDetailPage:()=>h,ApiProductsPage:()=>d,EntityKuadrantApiAccessCard:()=>c,EntityKuadrantApiKeyManagementTab:()=>m,EntityKuadrantApiKeysContent:()=>P,EntityKuadrantApiProductInfoContent:()=>s,EntityKuadrantApiProductOpenApiAlert:()=>y,KuadrantPage:()=>p,MyApiKeysPage:()=>u,kuadrantPlugin:()=>r});var a=t(22097);const o=(0,a.createRouteRef)({id:"kuadrant"}),i=(0,a.createSubRouteRef)({id:"kuadrant/resource",parent:o,path:"/:kind/:namespace/:name"}),r=(0,a.createPlugin)({id:"kuadrant",routes:{root:o,resource:i}}),p=r.provide((0,a.createRoutableExtension)({name:"KuadrantPage",component:()=>Promise.all([t.e(4083),t.e(9400),t.e(20),t.e(1340),t.e(5197),t.e(5943),t.e(7293),t.e(7076),t.e(6837),t.e(5010),t.e(8563),t.e(1931),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(3658),t.e(5289),t.e(2821)]).then(t.bind(t,80243)).then(e=>e.ApiProductsPage),mountPoint:o})),d=r.provide((0,a.createRoutableExtension)({name:"ApiProductsPage",component:()=>Promise.all([t.e(4083),t.e(9400),t.e(20),t.e(1340),t.e(5197),t.e(5943),t.e(7293),t.e(7076),t.e(6837),t.e(5010),t.e(8563),t.e(1931),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(3658),t.e(5289),t.e(2821)]).then(t.bind(t,80243)).then(e=>e.ApiProductsPage),mountPoint:o})),u=r.provide((0,a.createRoutableExtension)({name:"MyApiKeysPage",component:()=>Promise.all([t.e(4083),t.e(9400),t.e(20),t.e(1340),t.e(5197),t.e(5943),t.e(7076),t.e(6837),t.e(5010),t.e(8563),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(7270)]).then(t.bind(t,37270)).then(e=>e.MyApiKeysPage),mountPoint:o})),l=r.provide((0,a.createRoutableExtension)({name:"ApiKeyApprovalPage",component:()=>Promise.all([t.e(4083),t.e(9400),t.e(20),t.e(1340),t.e(5197),t.e(5943),t.e(7293),t.e(7076),t.e(6837),t.e(5010),t.e(8563),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(3658),t.e(3917)]).then(t.bind(t,73917)).then(e=>e.ApiKeyApprovalPageWithPermissions),mountPoint:o})),c=r.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiAccessCard",component:{lazy:()=>Promise.all([t.e(4083),t.e(9400),t.e(20),t.e(1340),t.e(5197),t.e(5943),t.e(7293),t.e(438),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(3658),t.e(1719)]).then(t.bind(t,11719)).then(e=>e.ApiAccessCard)}})),m=r.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiKeyManagementTab",component:{lazy:()=>Promise.all([t.e(4083),t.e(9400),t.e(20),t.e(1340),t.e(5197),t.e(5943),t.e(7293),t.e(7076),t.e(6837),t.e(5010),t.e(5478),t.e(5427),t.e(484),t.e(1942),t.e(7976),t.e(3658),t.e(2251),t.e(980)]).then(t.bind(t,42708)).then(e=>e.ApiKeyManagementTab)}})),P=r.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiKeysContent",component:{lazy:()=>Promise.all([t.e(4083),t.e(9400),t.e(20),t.e(1340),t.e(5197),t.e(5943),t.e(7293),t.e(7076),t.e(6837),t.e(5010),t.e(5478),t.e(5427),t.e(484),t.e(1942),t.e(7976),t.e(3658),t.e(2251),t.e(980)]).then(t.bind(t,42708)).then(e=>e.ApiKeyManagementTab)}})),s=r.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiProductInfoContent",component:{lazy:()=>Promise.all([t.e(4083),t.e(9400),t.e(20),t.e(1340),t.e(7293),t.e(327),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(3658),t.e(3947),t.e(4908)]).then(t.bind(t,34908)).then(e=>e.ApiProductInfoCard)}})),A=r.provide((0,a.createRoutableExtension)({name:"ApiKeyDetailPage",component:()=>Promise.all([t.e(4083),t.e(9400),t.e(20),t.e(1340),t.e(5197),t.e(7076),t.e(8563),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(2967)]).then(t.bind(t,72967)).then(e=>e.ApiKeyDetailPage),mountPoint:o})),y=r.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiProductOpenApiAlert",component:{lazy:()=>Promise.all([t.e(9400),t.e(20),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(6371)]).then(t.bind(t,36371)).then(e=>e.ApiProductOpenApiAlert)}})),h=r.provide((0,a.createRoutableExtension)({name:"ApiProductDetailPage",component:()=>Promise.all([t.e(4083),t.e(9400),t.e(20),t.e(1340),t.e(5197),t.e(5943),t.e(7293),t.e(7076),t.e(6837),t.e(8563),t.e(2769),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(3658),t.e(3947),t.e(5289),t.e(7791)]).then(t.bind(t,57791)).then(e=>e.ApiProductDetailPage),mountPoint:o}))}}]);
2
+ //# sourceMappingURL=exposed-KuadrantPage.f123b200.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static/exposed-KuadrantPage.f123b200.chunk.js","mappings":"mgBAEO,MAAMA,GAAeC,EAAAA,EAAAA,gBAAe,CACzCC,GAAI,aAGOC,GAAmBC,EAAAA,EAAAA,mBAAkB,CAChDF,GAAI,oBACJG,OAAQL,EACRM,KAAM,4BCDKC,GAAiBC,EAAAA,EAAAA,cAAa,CACzCN,GAAI,WACJO,OAAQ,CACNC,KAAMV,EACNW,SAAUR,KAIDS,EAAeL,EAAeM,SACzCC,EAAAA,EAAAA,yBAAwB,CACtBC,KAAM,eACNC,UAAW,IACT,oPAAoCC,KAAKC,GAAKA,EAAEC,iBAClDC,WAAYpB,KAIHmB,EAAkBZ,EAAeM,SAC5CC,EAAAA,EAAAA,yBAAwB,CACtBC,KAAM,kBACNC,UAAW,IACT,oPAAoCC,KAAKC,GAAKA,EAAEC,iBAClDC,WAAYpB,KAIHqB,EAAgBd,EAAeM,SAC1CC,EAAAA,EAAAA,yBAAwB,CACtBC,KAAM,gBACNC,UAAW,IACT,4MAAqCC,KAAKC,GAAKA,EAAEG,eACnDD,WAAYpB,KAIHsB,EAAqBf,EAAeM,SAC/CC,EAAAA,EAAAA,yBAAwB,CACtBC,KAAM,qBACNC,UAAW,IACT,gOAA0CC,KAAKC,GAAKA,EAAEK,mCACxDH,WAAYpB,KAIHwB,EAA8BjB,EAAeM,SACxDY,EAAAA,EAAAA,0BAAyB,CACvBV,KAAM,8BACNC,UAAW,CACTU,KAAM,IACJ,iMAAqCT,KAAKC,GAAKA,EAAES,mBAK5CC,EAAoCrB,EAAeM,SAC9DY,EAAAA,EAAAA,0BAAyB,CACvBV,KAAM,oCACNC,UAAW,CACTU,KAAM,IACJ,qNAA2CT,KAAKC,GAAKA,EAAEW,yBAMlDC,EAA+BvB,EAAeM,SACzDY,EAAAA,EAAAA,0BAAyB,CACvBV,KAAM,+BACNC,UAAW,CACTU,KAAM,IACJ,qNAA2CT,KAAKC,GAAKA,EAAEW,yBAKlDE,EAAsCxB,EAAeM,SAChEY,EAAAA,EAAAA,0BAAyB,CACvBV,KAAM,sCACNC,UAAW,CACTU,KAAM,IACJ,uLAA0CT,KAAKC,GAAKA,EAAEc,wBAKjDC,EAAmB1B,EAAeM,SAC7CC,EAAAA,EAAAA,yBAAwB,CACtBC,KAAM,mBACNC,UAAW,IACT,8KAAwCC,KAAKC,GAAKA,EAAEe,kBACtDb,WAAYpB,KAIHkC,EAAuC3B,EAAeM,SACjEY,EAAAA,EAAAA,0BAAyB,CACvBV,KAAM,uCACNC,UAAW,CACTU,KAAM,IACJ,4HAA8CT,KAAKC,GAAKA,EAAEiB,4BAKrDC,EAAuB7B,EAAeM,SACjDC,EAAAA,EAAAA,yBAAwB,CACtBC,KAAM,uBACNC,UAAW,IACT,oPAA4CC,KAAKC,GAAKA,EAAEkB,sBAC1DhB,WAAYpB,I","sources":["webpack://internal.plugin-kuadrant/./src/routes.ts","webpack://internal.plugin-kuadrant/./src/plugin.ts"],"sourcesContent":["import { createRouteRef, createSubRouteRef } from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n id: 'kuadrant',\n});\n\nexport const resourceRouteRef = createSubRouteRef({\n id: 'kuadrant/resource',\n parent: rootRouteRef,\n path: '/:kind/:namespace/:name',\n});\n","import {\n createPlugin,\n createRoutableExtension,\n createComponentExtension,\n} from '@backstage/core-plugin-api';\n\nimport { rootRouteRef, resourceRouteRef } from './routes';\n\nexport const kuadrantPlugin = createPlugin({\n id: 'kuadrant',\n routes: {\n root: rootRouteRef,\n resource: resourceRouteRef,\n },\n});\n\nexport const KuadrantPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'KuadrantPage',\n component: () =>\n import('./components/KuadrantPage').then(m => m.ApiProductsPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const ApiProductsPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiProductsPage',\n component: () =>\n import('./components/KuadrantPage').then(m => m.ApiProductsPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const MyApiKeysPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'MyApiKeysPage',\n component: () =>\n import('./components/MyApiKeysPage').then(m => m.MyApiKeysPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const ApiKeyApprovalPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiKeyApprovalPage',\n component: () =>\n import('./components/ApiKeyApprovalPage').then(m => m.ApiKeyApprovalPageWithPermissions),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const EntityKuadrantApiAccessCard = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiAccessCard',\n component: {\n lazy: () =>\n import('./components/ApiAccessCard').then(m => m.ApiAccessCard),\n },\n }),\n);\n\nexport const EntityKuadrantApiKeyManagementTab = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiKeyManagementTab',\n component: {\n lazy: () =>\n import('./components/ApiKeyManagementTab').then(m => m.ApiKeyManagementTab),\n },\n }),\n);\n\n// entity content extension for api keys tab\nexport const EntityKuadrantApiKeysContent = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiKeysContent',\n component: {\n lazy: () =>\n import('./components/ApiKeyManagementTab').then(m => m.ApiKeyManagementTab),\n },\n }),\n);\n\nexport const EntityKuadrantApiProductInfoContent = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiProductInfoContent',\n component: {\n lazy: () =>\n import('./components/ApiProductInfoCard').then(m => m.ApiProductInfoCard),\n },\n }),\n);\n\nexport const ApiKeyDetailPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiKeyDetailPage',\n component: () =>\n import('./components/ApiKeyDetailPage').then(m => m.ApiKeyDetailPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const EntityKuadrantApiProductOpenApiAlert = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiProductOpenApiAlert',\n component: {\n lazy: () =>\n import('./components/ApiProductOpenApiAlert').then(m => m.ApiProductOpenApiAlert),\n },\n }),\n);\n\nexport const ApiProductDetailPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiProductDetailPage',\n component: () =>\n import('./components/ApiProductDetailPage').then(m => m.ApiProductDetailPage),\n mountPoint: rootRouteRef,\n }),\n);\n"],"names":["rootRouteRef","createRouteRef","id","resourceRouteRef","createSubRouteRef","parent","path","kuadrantPlugin","createPlugin","routes","root","resource","KuadrantPage","provide","createRoutableExtension","name","component","then","m","ApiProductsPage","mountPoint","MyApiKeysPage","ApiKeyApprovalPage","ApiKeyApprovalPageWithPermissions","EntityKuadrantApiAccessCard","createComponentExtension","lazy","ApiAccessCard","EntityKuadrantApiKeyManagementTab","ApiKeyManagementTab","EntityKuadrantApiKeysContent","EntityKuadrantApiProductInfoContent","ApiProductInfoCard","ApiKeyDetailPage","EntityKuadrantApiProductOpenApiAlert","ApiProductOpenApiAlert","ApiProductDetailPage"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[879,6921],{19833:(e,t,n)=>{n.d(t,{m:()=>r});var a=n(31085),i=(n(95478),n(23015));const r=e=>(0,a.jsxs)(i.A,{...e,viewBox:"0 0 1024 1024",sx:{transform:"scale(0.85)",marginLeft:"4px",...e.sx},children:[(0,a.jsx)("path",{d:"M809,1C993.59,183.56 1065.7,449.65 998.12,699.05C964.778,821.823 899.519,933.607 809,1023L292.27,512L809,1Z",fill:"currentColor"}),(0,a.jsx)("rect",{x:"1",y:"1",width:"218",height:"1022",fill:"currentColor"})]})},34541:(e,t,n)=>{n.d(t,{G:()=>x});var a=n(31085),i=(n(95478),n(25467)),r=n(22097),o=n(42367),s=n(96040),d=n(72501),l=n(10394),c=n(58837),p=n(4387),u=n(91638),A=n(46205),m=n(34955),P=n(89509),y=n(71255),h=n(70980);const v=(0,c.A)(e=>({label:{fontWeight:600,color:e.palette.text.secondary,marginBottom:e.spacing(.5),fontSize:"0.75rem",textTransform:"uppercase"}})),x=()=>{var e,t,n,c,x,g,f,K,j,k;const b=v(),{entity:w}=(0,i.tN)(),I=(0,r.useApi)(h.s),C=(0,r.useApi)(r.identityApiRef),{allowed:E,loading:R}=(0,A.l)(m.Al),S=null===(e=w.metadata.annotations)||void 0===e?void 0:e["kuadrant.io/namespace"],D=null===(t=w.metadata.annotations)||void 0===t?void 0:t["kuadrant.io/apiproduct"],{value:O}=(0,u.A)(async()=>(await C.getBackstageIdentity()).userEntityRef.split("/")[1]||"guest",[C]),{value:z,loading:M,error:L}=(0,u.A)(async()=>S&&D?I.getApiProduct(S,D):null,[I,S,D]),T=null==z||null===(c=z.metadata)||void 0===c||null===(n=c.annotations)||void 0===n?void 0:n["backstage.io/owner"],B=null==T?void 0:T.split("/")[1],$=E||O&&B===O;if(!S||!D)return(0,a.jsx)(s.n,{title:"API Product Information",children:(0,a.jsx)(d.A,{children:"No APIProduct linked to this API entity"})});if(M||R)return(0,a.jsx)(s.n,{title:"API Product Information",children:(0,a.jsx)(l.A,{p:2,children:[...Array(5)].map((e,t)=>(0,a.jsx)(l.A,{mb:2,children:(0,a.jsx)(p.A,{variant:"text",width:"100%"})},t))})});if(z&&!$)return(0,a.jsx)(s.n,{title:"API Product Information",children:(0,a.jsx)(l.A,{p:2,children:(0,a.jsx)(d.A,{variant:"body2",color:"textSecondary",children:"You don't have permission to view this API product's details. Only the API owner or users with admin permissions can view this information."})})});if(L&&L.message.includes("you can only read your own"))return(0,a.jsx)(s.n,{title:"API Product Information",children:(0,a.jsx)(l.A,{p:2,children:(0,a.jsx)(d.A,{variant:"body2",color:"textSecondary",children:"You don't have permission to view this API product's details. Only the API owner or users with admin permissions can view this information."})})});if(L)return(0,a.jsx)(s.n,{title:"API Product Information",children:(0,a.jsx)(o._,{error:L})});if(!z)return(0,a.jsx)(s.n,{title:"API Product Information",children:(0,a.jsx)(d.A,{children:"APIProduct not found"})});const _=(null===(g=z.status)||void 0===g||null===(x=g.discoveredAuthScheme)||void 0===x?void 0:x.authentication)||{},F=Object.values(_).find(e=>e.hasOwnProperty("jwt")),U=Boolean(F),N=null==F||null===(f=F.jwt)||void 0===f?void 0:f.issuerUrl,q=null===(j=z.status)||void 0===j||null===(K=j.oidcDiscovery)||void 0===K?void 0:K.tokenEndpoint;return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(s.n,{title:"API Product Details",children:[(0,a.jsxs)(l.A,{mb:2,children:[(0,a.jsx)(d.A,{variant:"caption",className:b.label,children:"Product Name"}),(0,a.jsx)(d.A,{variant:"h6",children:(null===(k=z.spec)||void 0===k?void 0:k.displayName)||D})]}),(0,a.jsx)(P.O,{product:z,showStatus:!1,showCatalogLink:!1})]}),U&&N&&(0,a.jsx)(l.A,{mt:2,children:(0,a.jsx)(y.n,{issuerUrl:N,tokenEndpoint:q})})]})}},57349:(e,t,n)=>{n.d(t,{z:()=>b});var a=n(31085),i=n(95478),r=n(35015),o=n(42367),s=n(96040),d=n(10394),l=n(72501),c=n(67720),p=n(71677),u=n(29365),A=n(64947),m=n(4387),P=n(18466),y=n(32269),h=n(61524),v=n(99594),x=n(22097),g=n(70980),f=n(25467),K=n(14933),j=n(46205),k=n(34955);const b=({namespace:e})=>{var t,n,b;const{entity:w}=(0,f.tN)(),I=(0,x.useApi)(g.s),C=(0,x.useApi)(x.identityApiRef),E=(0,x.useApi)(x.alertApiRef),[R,S]=(0,i.useState)(""),[D,O]=(0,i.useState)(!1),[z,M]=(0,i.useState)(0),[L,T]=(0,i.useState)(new Set),[B,$]=(0,i.useState)(new Map),[_,F]=(0,i.useState)(new Set),U=(null===(t=w.metadata.annotations)||void 0===t?void 0:t["kuadrant.io/apiproduct"])||w.metadata.name,N=(null===(n=w.metadata.annotations)||void 0===n?void 0:n["kuadrant.io/namespace"])||e||"default";(0,r.A)(async()=>{const e=await C.getProfileInfo();S(e.email||"")},[C]);const{value:q,loading:W,error:V}=(0,r.A)(async()=>((await I.getRequestsByApiProduct(U,N)).items||[]).filter(e=>{var t;return"Approved"===(null===(t=e.status)||void 0===t?void 0:t.phase)}),[N,U,I,z]),{value:Y,loading:G}=(0,r.A)(async()=>{try{var e;return null===(e=(await I.getApiProducts()).items)||void 0===e?void 0:e.find(e=>e.metadata.namespace===N&&e.metadata.name===U)}catch(e){return null}},[N,U,I]),H=Y?`apiproduct:${Y.metadata.namespace}/${Y.metadata.name}`:void 0,{allowed:J,loading:Z}=(0,j.l)(k.dp,H),Q=e=>{T(t=>{const n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})};if(W||G||Z)return(0,a.jsx)(s.n,{title:"Kuadrant API Keys",children:(0,a.jsxs)(d.A,{p:2,children:[(0,a.jsx)(m.A,{variant:"text",width:"80%"}),(0,a.jsx)(m.A,{variant:"text",width:"60%"}),(0,a.jsx)(m.A,{variant:"text",width:"70%"})]})});if(V)return(0,a.jsx)(o._,{error:V});const X=q||[],ee=(null==Y||null===(b=Y.status)||void 0===b?void 0:b.discoveredPlans)||[],te=J&&ee.length>0;return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(s.n,{title:"Kuadrant API Keys",children:(0,a.jsxs)(d.A,{p:2,children:[X.length>0?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(l.A,{variant:"body2",color:"textSecondary",gutterBottom:!0,children:[X.length," active key",1!==X.length?"s":""]}),X.map(e=>{var t,n;const i=`${e.metadata.namespace}/${e.metadata.name}`,r=L.has(e.metadata.name),o=_.has(i),s=B.get(i),A=Boolean(null===(n=e.spec)||void 0===n||null===(t=n.secretRef)||void 0===t?void 0:t.name);return(0,a.jsxs)(d.A,{mb:1,p:1.5,border:1,borderColor:"grey.300",borderRadius:4,children:[(0,a.jsxs)(d.A,{display:"flex",justifyContent:"space-between",alignItems:"center",mb:1,children:[(0,a.jsx)(l.A,{variant:"body2",style:{fontWeight:500},children:e.metadata.name}),(0,a.jsx)(c.A,{label:e.spec.planTier,color:"primary",size:"small"})]}),A&&(0,a.jsxs)(d.A,{display:"flex",alignItems:"center",children:[(0,a.jsx)(l.A,{variant:"body2",style:{fontFamily:"monospace",fontSize:"0.8rem",flex:1,overflow:"hidden",textOverflow:"ellipsis"},children:o?"Loading...":r&&s?s:"••••••••••••••••"}),r&&s&&(0,a.jsx)(p.Ay,{title:"Copy to clipboard",children:(0,a.jsx)(u.A,{size:"small",onClick:async()=>{s&&(await navigator.clipboard.writeText(s),E.post({message:"API key copied to clipboard",severity:"success",display:"transient"}))},children:(0,a.jsx)(v.A,{fontSize:"small"})})}),(0,a.jsx)(p.Ay,{title:r?"Hide API key":"Reveal API key",children:(0,a.jsx)("span",{children:(0,a.jsx)(u.A,{size:"small",onClick:()=>{r?(((e,t)=>{const n=`${e}/${t}`;$(e=>{const t=new Map(e);return t.delete(n),t})})(e.metadata.namespace,e.metadata.name),Q(e.metadata.name)):(async(e,t)=>{const n=`${e}/${t}`;if(!_.has(n)){F(e=>new Set(e).add(n));try{const a=await I.getApiKeySecret(e,t);$(e=>new Map(e).set(n,a.apiKey)),Q(t)}catch(e){console.error("failed to fetch api key:",e);const t=e instanceof Error?e.message:"unknown error occurred";E.post({message:`Failed to fetch APIKey. ${t}`,severity:"error",display:"transient"})}finally{F(e=>{const t=new Set(e);return t.delete(n),t})}}})(e.metadata.namespace,e.metadata.name)},disabled:o,children:r?(0,a.jsx)(h.A,{fontSize:"small"}):(0,a.jsx)(y.A,{fontSize:"small"})})})})]})]},e.metadata.name)})]}):(0,a.jsx)(l.A,{variant:"body1",gutterBottom:!0,children:"You don't have any API keys for this API yet"}),(0,a.jsx)(d.A,{mt:2,children:te?(0,a.jsx)(A.A,{variant:"contained",color:"primary",size:"small",startIcon:(0,a.jsx)(P.A,{}),onClick:()=>O(!0),"data-testid":"request-api-access-button",children:"Request API Access"}):(0,a.jsx)(l.A,{variant:"caption",color:"textSecondary",children:"Visit the API Keys tab to view and manage access"})})]})}),(0,a.jsx)(K.c,{open:D,onClose:()=>O(!1),onSuccess:()=>{O(!1),M(e=>e+1)},apiProductName:U,namespace:N,userEmail:R,plans:ee})]})}},58373:(e,t,n)=>{n.r(t),n.d(t,{ApiAccessCard:()=>i.z,ApiIcon:()=>u,ApiKeyApprovalPage:()=>a.ApiKeyApprovalPage,ApiKeyDetailPage:()=>a.ApiKeyDetailPage,ApiKeyManagementTab:()=>r._,ApiProductDetailPage:()=>a.ApiProductDetailPage,ApiProductInfoCard:()=>o.G,ApiProductsPage:()=>a.ApiProductsPage,ApprovalIcon:()=>m,EntityKuadrantApiAccessCard:()=>a.EntityKuadrantApiAccessCard,EntityKuadrantApiKeyManagementTab:()=>a.EntityKuadrantApiKeyManagementTab,EntityKuadrantApiKeysContent:()=>a.EntityKuadrantApiKeysContent,EntityKuadrantApiProductInfoContent:()=>a.EntityKuadrantApiProductInfoContent,EntityKuadrantApiProductOpenApiAlert:()=>a.EntityKuadrantApiProductOpenApiAlert,KeyIcon:()=>A,KuadrantIcon:()=>s.m,KuadrantPage:()=>a.KuadrantPage,MyApiKeysPage:()=>a.MyApiKeysPage,kuadrantApiFactory:()=>v,kuadrantApiKeyApprovePermission:()=>P.KV,kuadrantApiKeyCreatePermission:()=>P.dp,kuadrantApiKeyDeleteAllPermission:()=>P.jH,kuadrantApiKeyDeleteOwnPermission:()=>P.uL,kuadrantApiKeyReadAllPermission:()=>P.kd,kuadrantApiKeyReadOwnPermission:()=>P.DS,kuadrantApiKeyUpdateAllPermission:()=>P.z4,kuadrantApiKeyUpdateOwnPermission:()=>P.q0,kuadrantApiProductCreatePermission:()=>P.FL,kuadrantApiProductDeleteAllPermission:()=>P.R_,kuadrantApiProductDeleteOwnPermission:()=>P.EM,kuadrantApiProductListPermission:()=>P.vs,kuadrantApiProductReadAllPermission:()=>P.Al,kuadrantApiProductReadOwnPermission:()=>P.T0,kuadrantApiProductUpdateAllPermission:()=>P.v_,kuadrantApiProductUpdateOwnPermission:()=>P.U3,kuadrantApiRef:()=>y.s,kuadrantAuthPolicyListPermission:()=>P.WE,kuadrantPermissions:()=>P.L5,kuadrantPlanPolicyCreatePermission:()=>P.Lb,kuadrantPlanPolicyDeletePermission:()=>P.Kx,kuadrantPlanPolicyListPermission:()=>P.J,kuadrantPlanPolicyReadPermission:()=>P.VS,kuadrantPlanPolicyUpdatePermission:()=>P.sB,kuadrantPlugin:()=>a.kuadrantPlugin,kuadrantRateLimitPolicyListPermission:()=>P.xO});var a=n(72627),i=n(57349),r=n(82251),o=n(34541),s=n(19833),d=n(31085),l=(n(95478),n(2350)),c=n(86733),p=n(98899);const u=e=>(0,d.jsx)(l.A,{...e}),A=e=>(0,d.jsx)(c.A,{...e}),m=e=>(0,d.jsx)(p.A,{...e});var P=n(34955),y=n(70980),h=n(22097);const v=(0,h.createApiFactory)({api:y.s,deps:{discoveryApi:h.discoveryApiRef,fetchApi:h.fetchApiRef,identityApi:h.identityApiRef},factory:({discoveryApi:e,fetchApi:t,identityApi:n})=>new y.y({discoveryApi:e,fetchApi:t,identityApi:n})})},72627:(e,t,n)=>{n.r(t),n.d(t,{ApiKeyApprovalPage:()=>c,ApiKeyDetailPage:()=>P,ApiProductDetailPage:()=>h,ApiProductsPage:()=>d,EntityKuadrantApiAccessCard:()=>p,EntityKuadrantApiKeyManagementTab:()=>u,EntityKuadrantApiKeysContent:()=>A,EntityKuadrantApiProductInfoContent:()=>m,EntityKuadrantApiProductOpenApiAlert:()=>y,KuadrantPage:()=>s,MyApiKeysPage:()=>l,kuadrantPlugin:()=>o});var a=n(22097);const i=(0,a.createRouteRef)({id:"kuadrant"}),r=(0,a.createSubRouteRef)({id:"kuadrant/resource",parent:i,path:"/:kind/:namespace/:name"}),o=(0,a.createPlugin)({id:"kuadrant",routes:{root:i,resource:r}}),s=o.provide((0,a.createRoutableExtension)({name:"KuadrantPage",component:()=>Promise.all([n.e(4083),n.e(9400),n.e(20),n.e(1340),n.e(5197),n.e(5943),n.e(7293),n.e(7076),n.e(6837),n.e(5010),n.e(8563),n.e(1931),n.e(5478),n.e(5427),n.e(9634),n.e(484),n.e(1942),n.e(7976),n.e(3658),n.e(5289),n.e(2821)]).then(n.bind(n,80243)).then(e=>e.ApiProductsPage),mountPoint:i})),d=o.provide((0,a.createRoutableExtension)({name:"ApiProductsPage",component:()=>Promise.all([n.e(4083),n.e(9400),n.e(20),n.e(1340),n.e(5197),n.e(5943),n.e(7293),n.e(7076),n.e(6837),n.e(5010),n.e(8563),n.e(1931),n.e(5478),n.e(5427),n.e(9634),n.e(484),n.e(1942),n.e(7976),n.e(3658),n.e(5289),n.e(2821)]).then(n.bind(n,80243)).then(e=>e.ApiProductsPage),mountPoint:i})),l=o.provide((0,a.createRoutableExtension)({name:"MyApiKeysPage",component:()=>Promise.all([n.e(4083),n.e(9400),n.e(20),n.e(1340),n.e(5197),n.e(5943),n.e(7076),n.e(6837),n.e(5010),n.e(8563),n.e(5478),n.e(5427),n.e(9634),n.e(484),n.e(1942),n.e(7976),n.e(7270)]).then(n.bind(n,37270)).then(e=>e.MyApiKeysPage),mountPoint:i})),c=o.provide((0,a.createRoutableExtension)({name:"ApiKeyApprovalPage",component:()=>Promise.all([n.e(4083),n.e(9400),n.e(20),n.e(1340),n.e(5197),n.e(5943),n.e(7293),n.e(7076),n.e(6837),n.e(5010),n.e(8563),n.e(5478),n.e(5427),n.e(9634),n.e(484),n.e(1942),n.e(7976),n.e(3658),n.e(3917)]).then(n.bind(n,73917)).then(e=>e.ApiKeyApprovalPageWithPermissions),mountPoint:i})),p=o.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiAccessCard",component:{lazy:()=>Promise.all([n.e(4083),n.e(9400),n.e(20),n.e(1340),n.e(5197),n.e(5943),n.e(7293),n.e(438),n.e(5478),n.e(5427),n.e(9634),n.e(484),n.e(1942),n.e(7976),n.e(3658),n.e(1719)]).then(n.bind(n,11719)).then(e=>e.ApiAccessCard)}})),u=o.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiKeyManagementTab",component:{lazy:()=>Promise.all([n.e(4083),n.e(9400),n.e(20),n.e(1340),n.e(5197),n.e(5943),n.e(7293),n.e(7076),n.e(6837),n.e(5010),n.e(5478),n.e(5427),n.e(484),n.e(1942),n.e(7976),n.e(3658),n.e(2251),n.e(980)]).then(n.bind(n,42708)).then(e=>e.ApiKeyManagementTab)}})),A=o.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiKeysContent",component:{lazy:()=>Promise.all([n.e(4083),n.e(9400),n.e(20),n.e(1340),n.e(5197),n.e(5943),n.e(7293),n.e(7076),n.e(6837),n.e(5010),n.e(5478),n.e(5427),n.e(484),n.e(1942),n.e(7976),n.e(3658),n.e(2251),n.e(980)]).then(n.bind(n,42708)).then(e=>e.ApiKeyManagementTab)}})),m=o.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiProductInfoContent",component:{lazy:()=>Promise.all([n.e(4083),n.e(9400),n.e(20),n.e(1340),n.e(7293),n.e(327),n.e(5478),n.e(5427),n.e(9634),n.e(484),n.e(1942),n.e(7976),n.e(3658),n.e(3947),n.e(4908)]).then(n.bind(n,34908)).then(e=>e.ApiProductInfoCard)}})),P=o.provide((0,a.createRoutableExtension)({name:"ApiKeyDetailPage",component:()=>Promise.all([n.e(4083),n.e(9400),n.e(20),n.e(1340),n.e(5197),n.e(7076),n.e(8563),n.e(5478),n.e(5427),n.e(9634),n.e(484),n.e(1942),n.e(7976),n.e(2967)]).then(n.bind(n,72967)).then(e=>e.ApiKeyDetailPage),mountPoint:i})),y=o.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiProductOpenApiAlert",component:{lazy:()=>Promise.all([n.e(9400),n.e(20),n.e(5478),n.e(5427),n.e(9634),n.e(484),n.e(1942),n.e(7976),n.e(6371)]).then(n.bind(n,36371)).then(e=>e.ApiProductOpenApiAlert)}})),h=o.provide((0,a.createRoutableExtension)({name:"ApiProductDetailPage",component:()=>Promise.all([n.e(4083),n.e(9400),n.e(20),n.e(1340),n.e(5197),n.e(5943),n.e(7293),n.e(7076),n.e(6837),n.e(8563),n.e(2769),n.e(5478),n.e(5427),n.e(9634),n.e(484),n.e(1942),n.e(7976),n.e(3658),n.e(3947),n.e(5289),n.e(7791)]).then(n.bind(n,57791)).then(e=>e.ApiProductDetailPage),mountPoint:i}))}}]);
2
+ //# sourceMappingURL=exposed-PluginRoot.3a5f9157.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static/exposed-PluginRoot.3a5f9157.chunk.js","mappings":"+LAGO,MAAMA,EAAgBC,IAC3B,UAACC,EAAAA,EAAOA,IACFD,EACJE,QAAQ,gBACRC,GAAI,CAAEC,UAAW,cAAeC,WAAY,SAAUL,EAAMG,I,WAE5D,SAACG,OAAAA,CACCC,EAAE,8GACFC,KAAK,kBAEP,SAACC,OAAAA,CAAKC,EAAE,IAAIC,EAAE,IAAIC,MAAM,MAAMC,OAAO,OAAOL,KAAK,mB,sNCArD,MAAMM,GAAYC,EAAAA,EAAAA,GAAYC,IAAW,CACvCC,MAAO,CACLC,WAAY,IACZC,MAAOH,EAAMI,QAAQC,KAAKC,UAC1BC,aAAcP,EAAMQ,QAAQ,IAC5BC,SAAU,UACVC,cAAe,gBAINC,EAAqB,K,IAUdC,EACKA,EAgBTC,EAAAA,EAqEMA,EAAAA,EAIF,EACOA,EAAAA,EAUdA,EA9GX,MAAMC,EAAUhB,KACV,OAAEc,IAAWG,EAAAA,EAAAA,MACbC,GAAcC,EAAAA,EAAAA,QAAOC,EAAAA,GACrBC,GAAcF,EAAAA,EAAAA,QAAOG,EAAAA,iBAEnBC,QAASC,EAAYC,QAASC,IAAgBC,EAAAA,EAAAA,GACpDC,EAAAA,IAGIC,EAAuC,QAA3Bf,EAAAA,EAAOgB,SAASC,mBAAhBjB,IAAAA,OAAAA,EAAAA,EAA8B,yBAC1CkB,EAA4C,QAA3BlB,EAAAA,EAAOgB,SAASC,mBAAhBjB,IAAAA,OAAAA,EAAAA,EAA8B,2BAE7CmB,MAAOC,IAAkBC,EAAAA,EAAAA,GAASC,gBACjBf,EAAYgB,wBACnBC,cAAcC,MAAM,KAAK,IAAM,QAC9C,CAAClB,KAEIY,MAAOlB,EAAU,QAAEU,EAAO,MAAEe,IAAUL,EAAAA,EAAAA,GAASC,SAChDP,GAAcG,EAIZd,EAAYuB,cAAcZ,EAAWG,GAHnC,KAIR,CAACd,EAAaW,EAAWG,IAGtBU,EAAQ3B,SAAoB,QAApBA,EAAAA,EAAYe,gBAAZf,IAAAA,GAAiC,QAAjCA,EAAAA,EAAsBgB,mBAAtBhB,IAAAA,OAAAA,EAAAA,EAAoC,sBAC5C4B,EAAcD,aAAAA,EAAAA,EAAOH,MAAM,KAAK,GAChCK,EAAUpB,GAAeU,GAAiBS,IAAgBT,EAEhE,IAAKL,IAAcG,EACjB,OACE,SAACa,EAAAA,EAAQA,CAACC,MAAM,0B,UACd,SAACC,EAAAA,EAAUA,C,SAAC,8CAKlB,GAAItB,GAAWC,EACb,OACE,SAACmB,EAAAA,EAAQA,CAACC,MAAM,0B,UACd,SAACE,EAAAA,EAAGA,CAACC,EAAG,E,SACL,IAAIC,MAAM,IAAIC,IAAI,CAACC,EAAGC,KACrB,SAACL,EAAAA,EAAGA,CAASM,GAAI,E,UACf,SAACC,EAAAA,EAAQA,CAACC,QAAQ,OAAO1D,MAAM,UADvBuD,QAUpB,GAAItC,IAAe6B,EACjB,OACE,SAACC,EAAAA,EAAQA,CAACC,MAAM,0B,UACd,SAACE,EAAAA,EAAGA,CAACC,EAAG,E,UACN,SAACF,EAAAA,EAAUA,CAACS,QAAQ,QAAQnD,MAAM,gB,SAAgB,oJAS1D,GAAImC,GAASA,EAAMiB,QAAQC,SAAS,8BAClC,OACE,SAACb,EAAAA,EAAQA,CAACC,MAAM,0B,UACd,SAACE,EAAAA,EAAGA,CAACC,EAAG,E,UACN,SAACF,EAAAA,EAAUA,CAACS,QAAQ,QAAQnD,MAAM,gB,SAAgB,oJAQ1D,GAAImC,EACF,OACE,SAACK,EAAAA,EAAQA,CAACC,MAAM,0B,UACd,SAACa,EAAAA,EAAkBA,CAACnB,MAAOA,MAKjC,IAAKzB,EACH,OACE,SAAC8B,EAAAA,EAAQA,CAACC,MAAM,0B,UACd,SAACC,EAAAA,EAAUA,C,SAAC,2BAMlB,MAAMa,GAA+B,QAAjB7C,EAAAA,EAAW8C,cAAX9C,IAAAA,GAAuC,QAAvCA,EAAAA,EAAmB+C,4BAAnB/C,IAAAA,OAAAA,EAAAA,EAAyCgD,iBAAkB,CAAC,EAE1EC,EADgBC,OAAOC,OAAON,GACJO,KAAMC,GAAgBA,EAAOC,eAAe,QACtEC,EAAUC,QAAQP,GAClBQ,EAAaR,SAAsB,QAAvB,IAAoBS,WAApB,WAACT,EAAD,EAAyBU,UACrCC,EAAoC,QAAjB5D,EAAAA,EAAW8C,cAAX9C,IAAAA,GAAgC,QAAhCA,EAAAA,EAAmB6D,qBAAnB7D,IAAAA,OAAAA,EAAAA,EAAkC8D,cAE3D,OACE,sB,WACE,UAAChC,EAAAA,EAAQA,CAACC,MAAM,sB,WACd,UAACE,EAAAA,EAAGA,CAACM,GAAI,E,WACP,SAACP,EAAAA,EAAUA,CAACS,QAAQ,UAAUsB,UAAW9D,EAAQb,M,SAAO,kBAGxD,SAAC4C,EAAAA,EAAUA,CAACS,QAAQ,K,UACF,QAAfzC,EAAAA,EAAWgE,YAAXhE,IAAAA,OAAAA,EAAAA,EAAiBiE,cAAehD,QAGrC,SAACiD,EAAAA,EAAiBA,CAChBC,QAASnE,EACToE,YAAY,EACZC,iBAAiB,OAGpBd,GAAWE,IACV,SAACxB,EAAAA,EAAGA,CAACqC,GAAI,E,UACP,SAACC,EAAAA,EAAgBA,CACfZ,UAAWF,EACXK,cAAeF,S,wRCnHpB,MAAMY,EAAgB,EAAG1D,UAAW2D,M,IAelB1E,EACLA,EA6GHC,EA5Hf,MAAM,OAAED,IAAWG,EAAAA,EAAAA,MACbC,GAAcC,EAAAA,EAAAA,QAAOC,EAAAA,GACrBC,GAAcF,EAAAA,EAAAA,QAAOG,EAAAA,gBACrBmE,GAAWtE,EAAAA,EAAAA,QAAOuE,EAAAA,cACjBC,EAAWC,IAAgBC,EAAAA,EAAAA,UAAiB,KAC5CC,EAAmBC,IAAwBF,EAAAA,EAAAA,WAAS,IACpDG,EAASC,IAAcJ,EAAAA,EAAAA,UAAS,IAGhCK,EAAaC,IAAkBN,EAAAA,EAAAA,UAAsB,IAAIO,MACzDC,EAAcC,IAAmBT,EAAAA,EAAAA,UAA8B,IAAIU,MACnEC,EAAeC,IAAoBZ,EAAAA,EAAAA,UAAsB,IAAIO,KAG9DpE,GAA4C,QAA3BlB,EAAAA,EAAOgB,SAASC,mBAAhBjB,IAAAA,OAAAA,EAAAA,EAA8B,4BAA6BA,EAAOgB,SAAS4E,KAC5F7E,GAAuC,QAA3Bf,EAAAA,EAAOgB,SAASC,mBAAhBjB,IAAAA,OAAAA,EAAAA,EAA8B,2BAA4B0E,GAAiB,WAG7FrD,EAAAA,EAAAA,GAASC,UACP,MAAMuE,QAAgBtF,EAAYuF,iBAClChB,EAAae,EAAQE,OAAS,KAC7B,CAACxF,IAIJ,MAAQY,MAAO6E,EAAUrF,QAASsF,EAAavE,MAAOwE,IAAc7E,EAAAA,EAAAA,GAASC,iBACxDlB,EAAY+F,wBAAwBjF,EAAgBH,IAC9CqF,OAAS,IACfC,OAAQC,I,IACzBA,E,MAAoB,cAAZ,QAARA,EAAAA,EAAEvD,cAAFuD,IAAAA,OAAAA,EAAAA,EAAUC,SAEX,CAACxF,EAAWG,EAAgBd,EAAa8E,KAGpC/D,MAAOlB,EAAYU,QAAS6F,IAAmBnF,EAAAA,EAAAA,GAASC,UAC9D,I,IAESmF,EAAP,OAAiB,QAAVA,SADYrG,EAAYsG,kBACnBN,aAALK,IAAAA,OAAAA,EAAAA,EAAYpD,KAChBlB,GACCA,EAAEnB,SAASD,YAAcA,GACzBoB,EAAEnB,SAAS4E,OAAS1E,EAE1B,CAAE,MAAOyF,GACP,OAAO,IACT,GACC,CAAC5F,EAAWG,EAAgBd,IAEzBwG,EAAc3G,EAChB,cAAcA,EAAWe,SAASD,aAAad,EAAWe,SAAS4E,YACnEiB,GAEIpG,QAASqG,EAAkBnG,QAASoG,IAAsBlG,EAAAA,EAAAA,GAChEmG,EAAAA,GACAJ,GAwCIK,EAAoBC,IACxB7B,EAAgB8B,IACd,MAAMC,EAAS,IAAI9B,IAAI6B,GAMvB,OALIC,EAAOC,IAAIH,GACbE,EAAOE,OAAOJ,GAEdE,EAAOG,IAAIL,GAENE,KAMX,GAFgBnB,GAAeO,GAAkBO,EAG/C,OACE,SAAChF,EAAAA,EAAQA,CAACC,MAAM,oB,UACd,UAACE,EAAAA,EAAGA,CAACC,EAAG,E,WACN,SAACM,EAAAA,EAAQA,CAACC,QAAQ,OAAO1D,MAAM,SAC/B,SAACyD,EAAAA,EAAQA,CAACC,QAAQ,OAAO1D,MAAM,SAC/B,SAACyD,EAAAA,EAAQA,CAACC,QAAQ,OAAO1D,MAAM,aAMvC,GAAIkH,EACF,OAAO,SAACrD,EAAAA,EAAkBA,CAACnB,MAAOwE,IAGpC,MAAMsB,EAAO,GAA0B,GACjCC,IAASxH,SAAkB,QAAlBA,EAAAA,EAAY8C,cAAZ9C,IAAAA,OAAAA,EAAAA,EAAoByH,kBAAmB,GAChDC,GAAab,GAAoBW,GAAMG,OAAS,EAsFtD,OACE,sB,WACE,SAAC7F,EAAAA,EAAQA,CAACC,MAAM,oB,UACd,UAACE,EAAAA,EAAGA,CAACC,EAAG,E,UACLqF,EAAKI,OAAS,GACb,sB,WACE,UAAC3F,EAAAA,EAAUA,CAACS,QAAQ,QAAQnD,MAAM,gBAAgBsI,cAAY,E,UAC3DL,EAAKI,OAAO,cAA4B,IAAhBJ,EAAKI,OAAe,IAAM,MAEpDJ,EAAKnF,IA7FIyF,I,IAKSA,EAAAA,EAJ7B,MAAMC,EAAM,GAAGD,EAAQ9G,SAASD,aAAa+G,EAAQ9G,SAAS4E,OACxDoC,EAAY5C,EAAYiC,IAAIS,EAAQ9G,SAAS4E,MAC7CqC,EAAYvC,EAAc2B,IAAIU,GAC9BG,EAAc3C,EAAa4C,IAAIJ,GAC/BK,EAAe3E,QAAoB,QAAZqE,EAAAA,EAAQ7D,YAAR6D,IAAAA,GAAuB,QAAvBA,EAAAA,EAAcO,iBAAdP,IAAAA,OAAAA,EAAAA,EAAyBlC,MAsBtD,OACE,UAAC1D,EAAAA,EAAGA,CAEFM,GAAI,EACJL,EAAG,IACHmG,OAAQ,EACRC,YAAY,WACZC,aAAc,E,WAEd,UAACtG,EAAAA,EAAGA,CAACuG,QAAQ,OAAOC,eAAe,gBAAgBC,WAAW,SAASnG,GAAI,E,WACzE,SAACP,EAAAA,EAAUA,CAACS,QAAQ,QAAQkG,MAAO,CAAEtJ,WAAY,K,SAC9CwI,EAAQ9G,SAAS4E,QAEpB,SAACiD,EAAAA,EAAIA,CAACxJ,MAAOyI,EAAQ7D,KAAK6E,SAAUvJ,MAAM,UAAUwJ,KAAK,aAE1DX,IACC,UAAClG,EAAAA,EAAGA,CAACuG,QAAQ,OAAOE,WAAW,S,WAC7B,SAAC1G,EAAAA,EAAUA,CACTS,QAAQ,QACRkG,MAAO,CACLI,WAAY,YACZnJ,SAAU,SACVoJ,KAAM,EACNC,SAAU,SACVC,aAAc,Y,SAGflB,EACG,aACAD,GAAaE,EACXA,EACA,qBAEPF,GAAaE,IACZ,SAACkB,EAAAA,GAAOA,CAACpH,MAAM,oB,UACb,SAACqH,EAAAA,EAAUA,CAACN,KAAK,QAAQO,QA9ClBhI,UACb4G,UACIqB,UAAUC,UAAUC,UAAUvB,GACpCvD,EAAS+E,KAAK,CACZ/G,QAAS,8BACTgH,SAAU,UACVlB,QAAS,gB,UAyCD,SAACmB,EAAAA,EAAYA,CAAC/J,SAAS,eAI7B,SAACuJ,EAAAA,GAAOA,CAACpH,MAAOgG,EAAY,eAAiB,iB,UAC3C,SAAC6B,OAAAA,C,UACC,SAACR,EAAAA,EAAUA,CACTN,KAAK,QACLO,QAhEY,KACpBtB,GAnDiB,EAAC8B,EAA0BC,KAClD,MAAMhC,EAAM,GAAG+B,KAAoBC,IACnCvE,EAAiB2B,IACf,MAAM6C,EAAO,IAAIvE,IAAI0B,GAErB,OADA6C,EAAK1C,OAAOS,GACLiC,KA+CLC,CAAiBnC,EAAQ9G,SAASD,UAAW+G,EAAQ9G,SAAS4E,MAC9DqB,EAAiBa,EAAQ9G,SAAS4E,OAjFVtE,OAAOwI,EAA0BC,KAC7D,MAAMhC,EAAM,GAAG+B,KAAoBC,IACnC,IAAIrE,EAAc2B,IAAIU,GAAtB,CAIApC,EAAkBwB,GAAS,IAAI7B,IAAI6B,GAAMI,IAAIQ,IAC7C,IACE,MAAMtB,QAAarG,EAAY8J,gBAAgBJ,EAAkBC,GACjEvE,EAAiB2B,GAAS,IAAI1B,IAAI0B,GAAMgD,IAAIpC,EAAKtB,EAAK2D,SACtDnD,EAAiB8C,EACnB,CAAE,MAAOpD,GACP0D,QAAQ3I,MAAM,2BAA4BiF,GAC1C,MAAM2D,EAAe3D,aAAe4D,MAAQ5D,EAAIhE,QAAU,yBAC1DgC,EAAS+E,KAAK,CACZ/G,QAAS,2BAA2B2H,IACpCX,SAAU,QACVlB,QAAS,aAEb,CAAE,QACA9C,EAAkBwB,IAChB,MAAM6C,EAAO,IAAI1E,IAAI6B,GAErB,OADA6C,EAAK1C,OAAOS,GACLiC,GAEX,CArBA,GA+EIQ,CAAsB1C,EAAQ9G,SAASD,UAAW+G,EAAQ9G,SAAS4E,OA4DzD6E,SAAUxC,E,SAETD,GAAY,SAAC0C,EAAAA,EAAiBA,CAAC7K,SAAS,WAAa,SAAC8K,EAAAA,EAAcA,CAAC9K,SAAS,qBA7CpFiI,EAAQ9G,SAAS4E,YAmElB,SAAC3D,EAAAA,EAAUA,CAACS,QAAQ,QAAQmF,cAAY,E,SAAC,kDAI3C,SAAC3F,EAAAA,EAAGA,CAACqC,GAAI,E,SACNoD,IACC,SAACiD,EAAAA,EAAMA,CACLlI,QAAQ,YACRnD,MAAM,UACNwJ,KAAK,QACL8B,WAAW,SAACC,EAAAA,EAAOA,CAAAA,GACnBxB,QAAS,IAAMrE,GAAqB,GACpC8F,cAAY,4B,SACb,wBAID,SAAC9I,EAAAA,EAAUA,CAACS,QAAQ,UAAUnD,MAAM,gB,SAAgB,6DAQ5D,SAACyL,EAAAA,EAAmBA,CAClBC,KAAMjG,EACNkG,QAAS,IAAMjG,GAAqB,GACpCkG,UAAW,KACTlG,GAAqB,GACrBE,EAAYmB,GAAMA,EAAI,IAExBpF,eAAgBA,EAChBH,UAAWA,EACX8D,UAAWA,EACX4C,MAAOA,Q,k9DC7RR,MAAM2D,EAAWhN,IAAwB,SAACiN,EAAAA,EAAWA,IAAKjN,IACpDkN,EAAWlN,IAAwB,SAACmN,EAAAA,EAAWA,IAAKnN,IACpDoN,EAAgBpN,IAAwB,SAACqN,EAAAA,EAAgBA,IAAKrN,I,qCCIpE,MAAMsN,GAAqBC,EAAAA,EAAAA,kBAAiB,CACjDC,IAAKtL,EAAAA,EACLuL,KAAM,CACJC,aAAcC,EAAAA,gBACdC,SAAUC,EAAAA,YACV1L,YAAaC,EAAAA,gBAEf0L,QAAS,EAAGJ,eAAcE,WAAUzL,iBAClC,IAAI4L,EAAAA,EAAkB,CAAEL,eAAcE,WAAUzL,iB,gZClB7C,MAAM6L,GAAeC,EAAAA,EAAAA,gBAAe,CACzCC,GAAI,aAGOC,GAAmBC,EAAAA,EAAAA,mBAAkB,CAChDF,GAAI,oBACJG,OAAQL,EACR1N,KAAM,4BCDKgO,GAAiBC,EAAAA,EAAAA,cAAa,CACzCL,GAAI,WACJM,OAAQ,CACNC,KAAMT,EACNU,SAAUP,KAIDQ,EAAeL,EAAeM,SACzCC,EAAAA,EAAAA,yBAAwB,CACtBrH,KAAM,eACNsH,UAAW,IACT,oPAAoCC,KAAKC,GAAKA,EAAEC,iBAClDC,WAAYlB,KAIHiB,EAAkBX,EAAeM,SAC5CC,EAAAA,EAAAA,yBAAwB,CACtBrH,KAAM,kBACNsH,UAAW,IACT,oPAAoCC,KAAKC,GAAKA,EAAEC,iBAClDC,WAAYlB,KAIHmB,EAAgBb,EAAeM,SAC1CC,EAAAA,EAAAA,yBAAwB,CACtBrH,KAAM,gBACNsH,UAAW,IACT,4MAAqCC,KAAKC,GAAKA,EAAEG,eACnDD,WAAYlB,KAIHoB,EAAqBd,EAAeM,SAC/CC,EAAAA,EAAAA,yBAAwB,CACtBrH,KAAM,qBACNsH,UAAW,IACT,gOAA0CC,KAAKC,GAAKA,EAAEK,mCACxDH,WAAYlB,KAIHsB,EAA8BhB,EAAeM,SACxDW,EAAAA,EAAAA,0BAAyB,CACvB/H,KAAM,8BACNsH,UAAW,CACTU,KAAM,IACJ,iMAAqCT,KAAKC,GAAKA,EAAE3I,mBAK5CoJ,EAAoCnB,EAAeM,SAC9DW,EAAAA,EAAAA,0BAAyB,CACvB/H,KAAM,oCACNsH,UAAW,CACTU,KAAM,IACJ,qNAA2CT,KAAKC,GAAKA,EAAEU,yBAMlDC,EAA+BrB,EAAeM,SACzDW,EAAAA,EAAAA,0BAAyB,CACvB/H,KAAM,+BACNsH,UAAW,CACTU,KAAM,IACJ,qNAA2CT,KAAKC,GAAKA,EAAEU,yBAKlDE,EAAsCtB,EAAeM,SAChEW,EAAAA,EAAAA,0BAAyB,CACvB/H,KAAM,sCACNsH,UAAW,CACTU,KAAM,IACJ,uLAA0CT,KAAKC,GAAKA,EAAErN,wBAKjDkO,EAAmBvB,EAAeM,SAC7CC,EAAAA,EAAAA,yBAAwB,CACtBrH,KAAM,mBACNsH,UAAW,IACT,8KAAwCC,KAAKC,GAAKA,EAAEa,kBACtDX,WAAYlB,KAIH8B,EAAuCxB,EAAeM,SACjEW,EAAAA,EAAAA,0BAAyB,CACvB/H,KAAM,uCACNsH,UAAW,CACTU,KAAM,IACJ,4HAA8CT,KAAKC,GAAKA,EAAEe,4BAKrDC,EAAuB1B,EAAeM,SACjDC,EAAAA,EAAAA,yBAAwB,CACtBrH,KAAM,uBACNsH,UAAW,IACT,oPAA4CC,KAAKC,GAAKA,EAAEgB,sBAC1Dd,WAAYlB,I","sources":["webpack://internal.plugin-kuadrant/./src/components/KuadrantIcon/KuadrantIcon.tsx","webpack://internal.plugin-kuadrant/./src/components/ApiProductInfoCard/ApiProductInfoCard.tsx","webpack://internal.plugin-kuadrant/./src/components/ApiAccessCard/ApiAccessCard.tsx","webpack://internal.plugin-kuadrant/./src/components/icons.tsx","webpack://internal.plugin-kuadrant/./src/apis.ts","webpack://internal.plugin-kuadrant/./src/routes.ts","webpack://internal.plugin-kuadrant/./src/plugin.ts"],"sourcesContent":["import React from 'react';\nimport SvgIcon, { SvgIconProps } from '@mui/material/SvgIcon';\n\nexport const KuadrantIcon = (props: SvgIconProps) => (\n <SvgIcon\n {...props}\n viewBox=\"0 0 1024 1024\"\n sx={{ transform: 'scale(0.85)', marginLeft: '4px', ...props.sx }}\n >\n <path\n d=\"M809,1C993.59,183.56 1065.7,449.65 998.12,699.05C964.778,821.823 899.519,933.607 809,1023L292.27,512L809,1Z\"\n fill=\"currentColor\"\n />\n <rect x=\"1\" y=\"1\" width=\"218\" height=\"1022\" fill=\"currentColor\" />\n </SvgIcon>\n);\n","import React from 'react';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { useApi, identityApiRef } from '@backstage/core-plugin-api';\nimport { InfoCard, ResponseErrorPanel } from '@backstage/core-components';\nimport { Typography, Box, makeStyles } from '@material-ui/core';\nimport { Skeleton } from '@material-ui/lab';\nimport useAsync from 'react-use/lib/useAsync';\nimport { useKuadrantPermission } from '../../utils/permissions';\nimport { kuadrantApiProductReadAllPermission } from '../../permissions';\nimport { ApiProductDetails } from '../ApiProductDetails';\nimport { OidcProviderCard } from '../OidcProviderCard';\nimport { kuadrantApiRef } from '../../api';\n\nconst useStyles = makeStyles((theme) => ({\n label: {\n fontWeight: 600,\n color: theme.palette.text.secondary,\n marginBottom: theme.spacing(0.5),\n fontSize: '0.75rem',\n textTransform: 'uppercase',\n },\n}));\n\nexport const ApiProductInfoCard = () => {\n const classes = useStyles();\n const { entity } = useEntity();\n const kuadrantApi = useApi(kuadrantApiRef);\n const identityApi = useApi(identityApiRef);\n\n const { allowed: canReadAll, loading: permLoading } = useKuadrantPermission(\n kuadrantApiProductReadAllPermission\n );\n\n const namespace = entity.metadata.annotations?.['kuadrant.io/namespace'];\n const apiProductName = entity.metadata.annotations?.['kuadrant.io/apiproduct'];\n\n const { value: currentUserId } = useAsync(async () => {\n const identity = await identityApi.getBackstageIdentity();\n return identity.userEntityRef.split('/')[1] || 'guest';\n }, [identityApi]);\n\n const { value: apiProduct, loading, error } = useAsync(async () => {\n if (!namespace || !apiProductName) {\n return null;\n }\n\n return kuadrantApi.getApiProduct(namespace, apiProductName);\n }, [kuadrantApi, namespace, apiProductName]);\n\n // check if user has permission to view this api product\n const owner = apiProduct?.metadata?.annotations?.['backstage.io/owner'];\n const ownerUserId = owner?.split('/')[1];\n const canView = canReadAll || (currentUserId && ownerUserId === currentUserId);\n\n if (!namespace || !apiProductName) {\n return (\n <InfoCard title=\"API Product Information\">\n <Typography>No APIProduct linked to this API entity</Typography>\n </InfoCard>\n );\n }\n\n if (loading || permLoading) {\n return (\n <InfoCard title=\"API Product Information\">\n <Box p={2}>\n {[...Array(5)].map((_, i) => (\n <Box key={i} mb={2}>\n <Skeleton variant=\"text\" width=\"100%\" />\n </Box>\n ))}\n </Box>\n </InfoCard>\n );\n }\n\n // show permission message if user doesn't have permission\n if (apiProduct && !canView) {\n return (\n <InfoCard title=\"API Product Information\">\n <Box p={2}>\n <Typography variant=\"body2\" color=\"textSecondary\">\n You don't have permission to view this API product's details. Only the API owner or users with admin permissions can view this information.\n </Typography>\n </Box>\n </InfoCard>\n );\n }\n\n // also show permission message if we got a permission error from the backend\n if (error && error.message.includes('you can only read your own')) {\n return (\n <InfoCard title=\"API Product Information\">\n <Box p={2}>\n <Typography variant=\"body2\" color=\"textSecondary\">\n You don't have permission to view this API product's details. Only the API owner or users with admin permissions can view this information.\n </Typography>\n </Box>\n </InfoCard>\n );\n }\n\n if (error) {\n return (\n <InfoCard title=\"API Product Information\">\n <ResponseErrorPanel error={error} />\n </InfoCard>\n );\n }\n\n if (!apiProduct) {\n return (\n <InfoCard title=\"API Product Information\">\n <Typography>APIProduct not found</Typography>\n </InfoCard>\n );\n }\n\n // check for OIDC auth scheme\n const authSchemes = apiProduct.status?.discoveredAuthScheme?.authentication || {};\n const schemeObjects = Object.values(authSchemes);\n const jwtScheme = schemeObjects.find((scheme: any) => scheme.hasOwnProperty('jwt'));\n const hasOidc = Boolean(jwtScheme);\n const jwtIssuer = (jwtScheme as any)?.jwt?.issuerUrl;\n const jwtTokenEndpoint = apiProduct.status?.oidcDiscovery?.tokenEndpoint;\n\n return (\n <>\n <InfoCard title=\"API Product Details\">\n <Box mb={2}>\n <Typography variant=\"caption\" className={classes.label}>\n Product Name\n </Typography>\n <Typography variant=\"h6\">\n {apiProduct.spec?.displayName || apiProductName}\n </Typography>\n </Box>\n <ApiProductDetails\n product={apiProduct}\n showStatus={false}\n showCatalogLink={false}\n />\n </InfoCard>\n {hasOidc && jwtIssuer && (\n <Box mt={2}>\n <OidcProviderCard\n issuerUrl={jwtIssuer}\n tokenEndpoint={jwtTokenEndpoint}\n />\n </Box>\n )}\n </>\n );\n};\n","import React, { useState } from 'react';\nimport { useAsync } from 'react-use';\nimport {\n InfoCard,\n ResponseErrorPanel,\n} from '@backstage/core-components';\nimport {\n Typography,\n Box,\n Chip,\n Button,\n IconButton,\n Tooltip,\n} from '@material-ui/core';\nimport { Skeleton } from '@material-ui/lab';\nimport AddIcon from '@material-ui/icons/Add';\nimport VisibilityIcon from '@material-ui/icons/Visibility';\nimport VisibilityOffIcon from '@material-ui/icons/VisibilityOff';\nimport FileCopyIcon from '@material-ui/icons/FileCopy';\nimport { useApi, identityApiRef, alertApiRef } from '@backstage/core-plugin-api';\nimport { kuadrantApiRef } from '../../api';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { RequestAccessDialog } from '../RequestAccessDialog';\nimport { useKuadrantPermission } from '../../utils/permissions';\nimport { kuadrantApiKeyCreatePermission } from '../../permissions';\nimport { APIKey, APIProduct, Plan } from \"../../types/api-management\";\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 kuadrantApi = useApi(kuadrantApiRef);\n const identityApi = useApi(identityApiRef);\n const alertApi = useApi(alertApiRef);\n const [userEmail, setUserEmail] = useState<string>('');\n const [requestDialogOpen, setRequestDialogOpen] = useState(false);\n const [refresh, setRefresh] = useState(0);\n\n // key reveal state\n const [visibleKeys, setVisibleKeys] = useState<Set<string>>(new Set());\n const [apiKeyValues, setApiKeyValues] = useState<Map<string, string>>(new Map());\n const [apiKeyLoading, setApiKeyLoading] = useState<Set<string>>(new Set());\n\n // get apiproduct name from entity annotation (set by entity provider)\n const apiProductName = entity.metadata.annotations?.['kuadrant.io/apiproduct'] || entity.metadata.name;\n const namespace = entity.metadata.annotations?.['kuadrant.io/namespace'] || propNamespace || 'default';\n\n // get current user identity\n useAsync(async () => {\n const profile = await identityApi.getProfileInfo();\n setUserEmail(profile.email || '');\n }, [identityApi]);\n\n // fetch user's approved keys for this API product\n // backend filters by apiProductRef.name and scopes to the user's consumer namespace\n const { value: requests, loading: keysLoading, error: keysError } = useAsync(async () => {\n const data = await kuadrantApi.getRequestsByApiProduct(apiProductName, namespace);\n const allRequests = data.items || [];\n return allRequests.filter((r: APIKey) =>\n r.status?.phase === 'Approved'\n );\n }, [namespace, apiProductName, kuadrantApi, refresh]);\n\n // fetch apiproduct to get available plans\n const { value: apiProduct, loading: productLoading } = useAsync(async () => {\n try {\n const data = await kuadrantApi.getApiProducts();\n return data.items?.find(\n (p: APIProduct) =>\n p.metadata.namespace === namespace &&\n p.metadata.name === apiProductName,\n );\n } catch (err) {\n return null;\n }\n }, [namespace, apiProductName, kuadrantApi]);\n\n const resourceRef = apiProduct\n ? `apiproduct:${apiProduct.metadata.namespace}/${apiProduct.metadata.name}`\n : undefined;\n\n const { allowed: canCreateRequest, loading: permissionLoading } = useKuadrantPermission(\n kuadrantApiKeyCreatePermission,\n resourceRef,\n );\n\n const fetchApiKeyFromSecret = async (requestNamespace: string, requestName: string) => {\n const key = `${requestNamespace}/${requestName}`;\n if (apiKeyLoading.has(key)) {\n return;\n }\n\n setApiKeyLoading((prev) => new Set(prev).add(key));\n try {\n const data = await kuadrantApi.getApiKeySecret(requestNamespace, requestName);\n setApiKeyValues((prev) => new Map(prev).set(key, data.apiKey));\n toggleVisibility(requestName);\n } catch (err) {\n console.error('failed to fetch api key:', err);\n const errorMessage = err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to fetch APIKey. ${errorMessage}`,\n severity: 'error',\n display: 'transient',\n });\n } finally {\n setApiKeyLoading((prev) => {\n const next = new Set(prev);\n next.delete(key);\n return next;\n });\n }\n };\n\n const clearApiKeyValue = (requestNamespace: string, requestName: string) => {\n const key = `${requestNamespace}/${requestName}`;\n setApiKeyValues((prev) => {\n const next = new Map(prev);\n next.delete(key);\n return next;\n });\n };\n\n const toggleVisibility = (keyName: string) => {\n setVisibleKeys((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(keyName)) {\n newSet.delete(keyName);\n } else {\n newSet.add(keyName);\n }\n return newSet;\n });\n };\n\n const loading = keysLoading || productLoading || permissionLoading;\n\n if (loading) {\n return (\n <InfoCard title=\"Kuadrant API Keys\">\n <Box p={2}>\n <Skeleton variant=\"text\" width=\"80%\" />\n <Skeleton variant=\"text\" width=\"60%\" />\n <Skeleton variant=\"text\" width=\"70%\" />\n </Box>\n </InfoCard>\n );\n }\n\n if (keysError) {\n return <ResponseErrorPanel error={keysError} />;\n }\n\n const keys = (requests as APIKey[]) || [];\n const plans = (apiProduct?.status?.discoveredPlans || []) as Plan[];\n const canRequest = canCreateRequest && plans.length > 0;\n\n const renderKeyRow = (request: APIKey) => {\n const key = `${request.metadata.namespace}/${request.metadata.name}`;\n const isVisible = visibleKeys.has(request.metadata.name);\n const isLoading = apiKeyLoading.has(key);\n const apiKeyValue = apiKeyValues.get(key);\n const hasSecretRef = Boolean(request.spec?.secretRef?.name);\n\n const handleRevealClick = () => {\n if (isVisible) {\n clearApiKeyValue(request.metadata.namespace, request.metadata.name);\n toggleVisibility(request.metadata.name);\n } else {\n fetchApiKeyFromSecret(request.metadata.namespace, request.metadata.name);\n }\n };\n\n const handleCopy = async () => {\n if (apiKeyValue) {\n await navigator.clipboard.writeText(apiKeyValue);\n alertApi.post({\n message: 'API key copied to clipboard',\n severity: 'success',\n display: 'transient',\n });\n }\n };\n\n return (\n <Box\n key={request.metadata.name}\n mb={1}\n p={1.5}\n border={1}\n borderColor=\"grey.300\"\n borderRadius={4}\n >\n <Box display=\"flex\" justifyContent=\"space-between\" alignItems=\"center\" mb={1}>\n <Typography variant=\"body2\" style={{ fontWeight: 500 }}>\n {request.metadata.name}\n </Typography>\n <Chip label={request.spec.planTier} color=\"primary\" size=\"small\" />\n </Box>\n {hasSecretRef && (\n <Box display=\"flex\" alignItems=\"center\">\n <Typography\n variant=\"body2\"\n style={{\n fontFamily: 'monospace',\n fontSize: '0.8rem',\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {isLoading\n ? 'Loading...'\n : isVisible && apiKeyValue\n ? apiKeyValue\n : '••••••••••••••••'}\n </Typography>\n {isVisible && apiKeyValue && (\n <Tooltip title=\"Copy to clipboard\">\n <IconButton size=\"small\" onClick={handleCopy}>\n <FileCopyIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n <Tooltip title={isVisible ? 'Hide API key' : 'Reveal API key'}>\n <span>\n <IconButton\n size=\"small\"\n onClick={handleRevealClick}\n disabled={isLoading}\n >\n {isVisible ? <VisibilityOffIcon fontSize=\"small\" /> : <VisibilityIcon fontSize=\"small\" />}\n </IconButton>\n </span>\n </Tooltip>\n </Box>\n )}\n </Box>\n );\n };\n\n return (\n <>\n <InfoCard title=\"Kuadrant API Keys\">\n <Box p={2}>\n {keys.length > 0 ? (\n <>\n <Typography variant=\"body2\" color=\"textSecondary\" gutterBottom>\n {keys.length} active key{keys.length !== 1 ? 's' : ''}\n </Typography>\n {keys.map(renderKeyRow)}\n </>\n ) : (\n <Typography variant=\"body1\" gutterBottom>\n You don't have any API keys for this API yet\n </Typography>\n )}\n <Box mt={2}>\n {canRequest ? (\n <Button\n variant=\"contained\"\n color=\"primary\"\n size=\"small\"\n startIcon={<AddIcon />}\n onClick={() => setRequestDialogOpen(true)}\n data-testid=\"request-api-access-button\"\n >\n Request API Access\n </Button>\n ) : (\n <Typography variant=\"caption\" color=\"textSecondary\">\n Visit the API Keys tab to view and manage access\n </Typography>\n )}\n </Box>\n </Box>\n </InfoCard>\n\n <RequestAccessDialog\n open={requestDialogOpen}\n onClose={() => setRequestDialogOpen(false)}\n onSuccess={() => {\n setRequestDialogOpen(false);\n setRefresh((r) => r + 1);\n }}\n apiProductName={apiProductName}\n namespace={namespace}\n userEmail={userEmail}\n plans={plans}\n />\n\n </>\n );\n};\n","import React from 'react';\nimport ApiOutlined from '@mui/icons-material/ApiOutlined';\nimport KeyOutlined from '@mui/icons-material/KeyOutlined';\nimport ApprovalOutlined from '@mui/icons-material/ApprovalOutlined';\nimport { SvgIconProps } from '@mui/material/SvgIcon';\n\nexport const ApiIcon = (props: SvgIconProps) => <ApiOutlined {...props} />;\nexport const KeyIcon = (props: SvgIconProps) => <KeyOutlined {...props} />;\nexport const ApprovalIcon = (props: SvgIconProps) => <ApprovalOutlined {...props} />;\n","import {\n createApiFactory,\n discoveryApiRef,\n fetchApiRef,\n identityApiRef,\n} from '@backstage/core-plugin-api';\nimport { kuadrantApiRef, KuadrantApiClient } from './api';\n\n/**\n * API factory for the Kuadrant plugin\n * This factory creates and configures the KuadrantApiClient with required dependencies\n */\nexport const kuadrantApiFactory = createApiFactory({\n api: kuadrantApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n fetchApi: fetchApiRef,\n identityApi: identityApiRef,\n },\n factory: ({ discoveryApi, fetchApi, identityApi }) =>\n new KuadrantApiClient({ discoveryApi, fetchApi, identityApi }),\n});\n","import { createRouteRef, createSubRouteRef } from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n id: 'kuadrant',\n});\n\nexport const resourceRouteRef = createSubRouteRef({\n id: 'kuadrant/resource',\n parent: rootRouteRef,\n path: '/:kind/:namespace/:name',\n});\n","import {\n createPlugin,\n createRoutableExtension,\n createComponentExtension,\n} from '@backstage/core-plugin-api';\n\nimport { rootRouteRef, resourceRouteRef } from './routes';\n\nexport const kuadrantPlugin = createPlugin({\n id: 'kuadrant',\n routes: {\n root: rootRouteRef,\n resource: resourceRouteRef,\n },\n});\n\nexport const KuadrantPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'KuadrantPage',\n component: () =>\n import('./components/KuadrantPage').then(m => m.ApiProductsPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const ApiProductsPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiProductsPage',\n component: () =>\n import('./components/KuadrantPage').then(m => m.ApiProductsPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const MyApiKeysPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'MyApiKeysPage',\n component: () =>\n import('./components/MyApiKeysPage').then(m => m.MyApiKeysPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const ApiKeyApprovalPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiKeyApprovalPage',\n component: () =>\n import('./components/ApiKeyApprovalPage').then(m => m.ApiKeyApprovalPageWithPermissions),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const EntityKuadrantApiAccessCard = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiAccessCard',\n component: {\n lazy: () =>\n import('./components/ApiAccessCard').then(m => m.ApiAccessCard),\n },\n }),\n);\n\nexport const EntityKuadrantApiKeyManagementTab = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiKeyManagementTab',\n component: {\n lazy: () =>\n import('./components/ApiKeyManagementTab').then(m => m.ApiKeyManagementTab),\n },\n }),\n);\n\n// entity content extension for api keys tab\nexport const EntityKuadrantApiKeysContent = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiKeysContent',\n component: {\n lazy: () =>\n import('./components/ApiKeyManagementTab').then(m => m.ApiKeyManagementTab),\n },\n }),\n);\n\nexport const EntityKuadrantApiProductInfoContent = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiProductInfoContent',\n component: {\n lazy: () =>\n import('./components/ApiProductInfoCard').then(m => m.ApiProductInfoCard),\n },\n }),\n);\n\nexport const ApiKeyDetailPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiKeyDetailPage',\n component: () =>\n import('./components/ApiKeyDetailPage').then(m => m.ApiKeyDetailPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const EntityKuadrantApiProductOpenApiAlert = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiProductOpenApiAlert',\n component: {\n lazy: () =>\n import('./components/ApiProductOpenApiAlert').then(m => m.ApiProductOpenApiAlert),\n },\n }),\n);\n\nexport const ApiProductDetailPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiProductDetailPage',\n component: () =>\n import('./components/ApiProductDetailPage').then(m => m.ApiProductDetailPage),\n mountPoint: rootRouteRef,\n }),\n);\n"],"names":["KuadrantIcon","props","SvgIcon","viewBox","sx","transform","marginLeft","path","d","fill","rect","x","y","width","height","useStyles","makeStyles","theme","label","fontWeight","color","palette","text","secondary","marginBottom","spacing","fontSize","textTransform","ApiProductInfoCard","entity","apiProduct","classes","useEntity","kuadrantApi","useApi","kuadrantApiRef","identityApi","identityApiRef","allowed","canReadAll","loading","permLoading","useKuadrantPermission","kuadrantApiProductReadAllPermission","namespace","metadata","annotations","apiProductName","value","currentUserId","useAsync","async","getBackstageIdentity","userEntityRef","split","error","getApiProduct","owner","ownerUserId","canView","InfoCard","title","Typography","Box","p","Array","map","_","i","mb","Skeleton","variant","message","includes","ResponseErrorPanel","authSchemes","status","discoveredAuthScheme","authentication","jwtScheme","Object","values","find","scheme","hasOwnProperty","hasOidc","Boolean","jwtIssuer","jwt","issuerUrl","jwtTokenEndpoint","oidcDiscovery","tokenEndpoint","className","spec","displayName","ApiProductDetails","product","showStatus","showCatalogLink","mt","OidcProviderCard","ApiAccessCard","propNamespace","alertApi","alertApiRef","userEmail","setUserEmail","useState","requestDialogOpen","setRequestDialogOpen","refresh","setRefresh","visibleKeys","setVisibleKeys","Set","apiKeyValues","setApiKeyValues","Map","apiKeyLoading","setApiKeyLoading","name","profile","getProfileInfo","email","requests","keysLoading","keysError","getRequestsByApiProduct","items","filter","r","phase","productLoading","data","getApiProducts","err","resourceRef","undefined","canCreateRequest","permissionLoading","kuadrantApiKeyCreatePermission","toggleVisibility","keyName","prev","newSet","has","delete","add","keys","plans","discoveredPlans","canRequest","length","gutterBottom","request","key","isVisible","isLoading","apiKeyValue","get","hasSecretRef","secretRef","border","borderColor","borderRadius","display","justifyContent","alignItems","style","Chip","planTier","size","fontFamily","flex","overflow","textOverflow","Tooltip","IconButton","onClick","navigator","clipboard","writeText","post","severity","FileCopyIcon","span","requestNamespace","requestName","next","clearApiKeyValue","getApiKeySecret","set","apiKey","console","errorMessage","Error","fetchApiKeyFromSecret","disabled","VisibilityOffIcon","VisibilityIcon","Button","startIcon","AddIcon","data-testid","RequestAccessDialog","open","onClose","onSuccess","ApiIcon","ApiOutlined","KeyIcon","KeyOutlined","ApprovalIcon","ApprovalOutlined","kuadrantApiFactory","createApiFactory","api","deps","discoveryApi","discoveryApiRef","fetchApi","fetchApiRef","factory","KuadrantApiClient","rootRouteRef","createRouteRef","id","resourceRouteRef","createSubRouteRef","parent","kuadrantPlugin","createPlugin","routes","root","resource","KuadrantPage","provide","createRoutableExtension","component","then","m","ApiProductsPage","mountPoint","MyApiKeysPage","ApiKeyApprovalPage","ApiKeyApprovalPageWithPermissions","EntityKuadrantApiAccessCard","createComponentExtension","lazy","EntityKuadrantApiKeyManagementTab","ApiKeyManagementTab","EntityKuadrantApiKeysContent","EntityKuadrantApiProductInfoContent","ApiKeyDetailPage","EntityKuadrantApiProductOpenApiAlert","ApiProductOpenApiAlert","ApiProductDetailPage"],"sourceRoot":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kuadrant/kuadrant-backstage-plugin-frontend",
3
- "version": "0.2.0",
3
+ "version": "0.3.0-aaa46b4",
4
4
  "license": "Apache-2.0",
5
5
  "repository": {
6
6
  "type": "git",
@@ -24,12 +24,13 @@
24
24
  "scalprum": {
25
25
  "name": "internal.plugin-kuadrant",
26
26
  "exposedModules": {
27
- "PluginRoot": "./src/plugin.ts",
27
+ "PluginRoot": "./src/index.ts",
28
28
  "KuadrantPage": "./src/plugin.ts",
29
29
  "EntityKuadrantApiAccessCard": "./src/plugin.ts",
30
30
  "EntityKuadrantApiKeyManagementTab": "./src/plugin.ts",
31
31
  "EntityKuadrantApiKeysContent": "./src/plugin.ts",
32
- "EntityKuadrantApiProductInfoContent": "./src/plugin.ts"
32
+ "EntityKuadrantApiProductInfoContent": "./src/plugin.ts",
33
+ "KuadrantIcon": "./src/components/KuadrantIcon"
33
34
  }
34
35
  },
35
36
  "sideEffects": false,
@@ -46,6 +47,7 @@
46
47
  "export-dynamic:clean": "run export-dynamic --clean"
47
48
  },
48
49
  "dependencies": {
50
+ "@backstage/catalog-model": "1.7.5",
49
51
  "@backstage/core-components": "^0.17.5",
50
52
  "@backstage/core-plugin-api": "^1.10.9",
51
53
  "@backstage/plugin-api-docs": "^0.12.10",
@@ -56,6 +58,7 @@
56
58
  "@material-ui/core": "^4.9.13",
57
59
  "@material-ui/icons": "^4.9.1",
58
60
  "@material-ui/lab": "^4.0.0-alpha.61",
61
+ "@mui/material": "5.18.0",
59
62
  "async-retry": "^1.3.3",
60
63
  "react-router-dom": "^6.0.0",
61
64
  "react-use": "^17.2.4"
@@ -1,265 +0,0 @@
1
- import React, { useState } from 'react';
2
- import { useEntity } from '@backstage/plugin-catalog-react';
3
- import { useApi, identityApiRef, alertApiRef } from '@backstage/core-plugin-api';
4
- import { kuadrantApiRef } from '../../api.esm.js';
5
- import { useAsync } from 'react-use';
6
- import { ResponseErrorPanel, Table } from '@backstage/core-components';
7
- import { kuadrantApiKeyApprovePermission } from '../../permissions.esm.js';
8
- import { useKuadrantPermission } from '../../utils/permissions.esm.js';
9
- import { makeStyles, Box, Typography, Dialog, DialogTitle, DialogContent, TextField, DialogActions, Button, CircularProgress, Chip, Tooltip, IconButton } from '@material-ui/core';
10
- import { Skeleton } from '@material-ui/lab';
11
- import CheckCircleIcon from '@material-ui/icons/CheckCircle';
12
- import CancelIcon from '@material-ui/icons/Cancel';
13
- import { getApprovalQueueStatusChipStyle } from '../../utils/styles.esm.js';
14
-
15
- const useStyles = makeStyles((theme) => ({
16
- useCasePanel: {
17
- padding: theme.spacing(2),
18
- backgroundColor: theme.palette.background.default
19
- },
20
- useCaseLabel: {
21
- fontWeight: 600,
22
- marginBottom: theme.spacing(1),
23
- color: theme.palette.text.secondary,
24
- textTransform: "uppercase",
25
- fontSize: "0.75rem"
26
- }
27
- }));
28
- const ExpandedRowContent = ({ request }) => {
29
- const classes = useStyles();
30
- return /* @__PURE__ */ React.createElement(Box, { className: classes.useCasePanel, onClick: (e) => e.stopPropagation() }, /* @__PURE__ */ React.createElement(Typography, { className: classes.useCaseLabel }, "Use Case"), /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, request.spec.useCase || "No use case provided"));
31
- };
32
- const ApprovalDialog = ({
33
- open,
34
- request,
35
- action,
36
- processing,
37
- onClose,
38
- onConfirm
39
- }) => {
40
- const [confirmText, setConfirmText] = useState("");
41
- const handleClose = () => {
42
- setConfirmText("");
43
- onClose();
44
- };
45
- const handleConfirm = () => {
46
- onConfirm(confirmText);
47
- setConfirmText("");
48
- };
49
- const isReject = action === "reject";
50
- const expectedText = request?.metadata.name || "";
51
- const isConfirmValid = confirmText === expectedText;
52
- return /* @__PURE__ */ React.createElement(
53
- Dialog,
54
- {
55
- open,
56
- onClose: processing ? undefined : handleClose,
57
- maxWidth: "sm",
58
- fullWidth: true
59
- },
60
- /* @__PURE__ */ React.createElement(DialogTitle, null, isReject ? "Reject API key" : "Approve API key"),
61
- /* @__PURE__ */ React.createElement(DialogContent, null, request && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Typography, { variant: "body2", paragraph: true }, /* @__PURE__ */ React.createElement("strong", null, "Requester:"), " ", request.spec.requestedBy.userId), /* @__PURE__ */ React.createElement(Typography, { variant: "body2", paragraph: true }, /* @__PURE__ */ React.createElement("strong", null, "Tier:"), " ", request.spec.planTier), request.spec.useCase && /* @__PURE__ */ React.createElement(Typography, { variant: "body2", paragraph: true }, /* @__PURE__ */ React.createElement("strong", null, "Use Case:"), " ", request.spec.useCase), isReject && /* @__PURE__ */ React.createElement(Box, { mt: 2, p: 2, bgcolor: "error.light", borderRadius: 1 }, /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, "This action will permanently deny access. The user will need to submit a new request.")), /* @__PURE__ */ React.createElement(Box, { mt: 2 }, /* @__PURE__ */ React.createElement(
62
- TextField,
63
- {
64
- fullWidth: true,
65
- label: `Type "${expectedText}" to confirm`,
66
- value: confirmText,
67
- onChange: (e) => setConfirmText(e.target.value),
68
- disabled: processing,
69
- autoFocus: true
70
- }
71
- )))),
72
- /* @__PURE__ */ React.createElement(DialogActions, null, /* @__PURE__ */ React.createElement(Button, { onClick: handleClose, disabled: processing }, "Cancel"), /* @__PURE__ */ React.createElement(
73
- Button,
74
- {
75
- onClick: handleConfirm,
76
- color: isReject ? "secondary" : "primary",
77
- variant: "contained",
78
- disabled: !isConfirmValid || processing,
79
- startIcon: processing ? /* @__PURE__ */ React.createElement(CircularProgress, { size: 16, color: "inherit" }) : undefined
80
- },
81
- processing ? isReject ? "Rejecting..." : "Approving..." : isReject ? "Reject" : "Approve"
82
- ))
83
- );
84
- };
85
- const EntityApiApprovalTab = () => {
86
- const { entity } = useEntity();
87
- const kuadrantApi = useApi(kuadrantApiRef);
88
- const identityApi = useApi(identityApiRef);
89
- const alertApi = useApi(alertApiRef);
90
- const apiProductName = entity.metadata.annotations?.["kuadrant.io/apiproduct"] || entity.metadata.name;
91
- const namespace = entity.metadata.annotations?.["kuadrant.io/namespace"] || "default";
92
- const [refresh, setRefresh] = useState(0);
93
- const [dialogState, setDialogState] = useState({
94
- open: false,
95
- request: null,
96
- action: "approve",
97
- processing: false
98
- });
99
- const {
100
- allowed: canApprove,
101
- loading: permissionLoading,
102
- error: permissionError
103
- } = useKuadrantPermission(kuadrantApiKeyApprovePermission);
104
- const { value, loading, error } = useAsync(async () => {
105
- const identity = await identityApi.getBackstageIdentity();
106
- const reviewedBy = identity.userEntityRef;
107
- const data = await kuadrantApi.getRequests();
108
- const allRequests = data.items || [];
109
- const filtered = allRequests.filter(
110
- (r) => r.spec.apiProductRef?.name === apiProductName && r.metadata.namespace === namespace
111
- );
112
- return { requests: filtered, reviewedBy };
113
- }, [kuadrantApi, identityApi, apiProductName, namespace, refresh]);
114
- const handleApprove = (request) => {
115
- setDialogState({
116
- open: true,
117
- request,
118
- action: "approve",
119
- processing: false
120
- });
121
- };
122
- const handleReject = (request) => {
123
- setDialogState({
124
- open: true,
125
- request,
126
- action: "reject",
127
- processing: false
128
- });
129
- };
130
- const handleConfirm = async () => {
131
- if (!dialogState.request || !value) return;
132
- setDialogState((prev) => ({ ...prev, processing: true }));
133
- const isApprove = dialogState.action === "approve";
134
- const requestFn = isApprove ? (ns, n, r) => kuadrantApi.approveRequest(ns, n, r) : (ns, n, r) => kuadrantApi.rejectRequest(ns, n, r);
135
- try {
136
- await requestFn(dialogState.request.metadata.namespace, dialogState.request.metadata.name, value.reviewedBy);
137
- setDialogState({
138
- open: false,
139
- request: null,
140
- action: "approve",
141
- processing: false
142
- });
143
- setRefresh((r) => r + 1);
144
- alertApi.post({
145
- message: `API key ${isApprove ? "approved" : "rejected"}`,
146
- severity: "success",
147
- display: "transient"
148
- });
149
- } catch (err) {
150
- console.error(`Error ${dialogState.action}ing request:`, err);
151
- setDialogState((prev) => ({ ...prev, processing: false }));
152
- const errorMessage = err instanceof Error ? err.message : "unknown error occurred";
153
- alertApi.post({
154
- message: `Failed to ${dialogState.action} APIKey. ${errorMessage}`,
155
- severity: "error",
156
- display: "transient"
157
- });
158
- }
159
- };
160
- if (loading || permissionLoading) {
161
- return /* @__PURE__ */ React.createElement(Box, { p: 2 }, [...Array(5)].map((_, i) => /* @__PURE__ */ React.createElement(Box, { key: i, p: 2 }, /* @__PURE__ */ React.createElement(Skeleton, { variant: "text", width: "100%" }))));
162
- }
163
- if (error) {
164
- return /* @__PURE__ */ React.createElement(ResponseErrorPanel, { error });
165
- }
166
- if (permissionError) {
167
- return /* @__PURE__ */ React.createElement(Box, { p: 2 }, /* @__PURE__ */ React.createElement(Typography, { color: "error" }, "Unable to check permissions: ", permissionError.message));
168
- }
169
- if (!canApprove) {
170
- return /* @__PURE__ */ React.createElement(Box, { p: 3, textAlign: "center" }, /* @__PURE__ */ React.createElement(Typography, { variant: "body1", color: "textSecondary" }, "You don't have permission to view the approval queue for this API."));
171
- }
172
- const requests = value?.requests || [];
173
- const pendingRequests = requests.filter(
174
- (r) => !r.status?.phase || r.status.phase === "Pending"
175
- );
176
- const approvedRequests = requests.filter(
177
- (r) => r.status?.phase === "Approved"
178
- );
179
- const rejectedRequests = requests.filter(
180
- (r) => r.status?.phase === "Rejected"
181
- );
182
- const columns = [
183
- {
184
- title: "Requester",
185
- field: "spec.requestedBy.userId",
186
- render: (row) => /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, row.spec.requestedBy.userId)
187
- },
188
- {
189
- title: "Status",
190
- field: "status.phase",
191
- render: (row) => {
192
- const phase = row.status?.phase || "Pending";
193
- const label = phase === "Approved" ? "Active" : phase;
194
- return /* @__PURE__ */ React.createElement(Chip, { label, size: "small", style: getApprovalQueueStatusChipStyle(phase) });
195
- }
196
- },
197
- {
198
- title: "Tier",
199
- field: "spec.planTier",
200
- render: (row) => /* @__PURE__ */ React.createElement(Chip, { label: row.spec.planTier, size: "small", variant: "outlined" })
201
- },
202
- {
203
- title: "Requested",
204
- field: "metadata.creationTimestamp",
205
- render: (row) => {
206
- if (!row.metadata.creationTimestamp)
207
- return /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, "-");
208
- return /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, new Date(row.metadata.creationTimestamp).toLocaleDateString());
209
- }
210
- },
211
- {
212
- title: "Actions",
213
- filtering: false,
214
- render: (row) => {
215
- const phase = row.status?.phase || "Pending";
216
- if (phase !== "Pending") return null;
217
- return /* @__PURE__ */ React.createElement(Box, { display: "flex", style: { gap: 4 } }, /* @__PURE__ */ React.createElement(Tooltip, { title: "Approve" }, /* @__PURE__ */ React.createElement(IconButton, { size: "small", onClick: () => handleApprove(row) }, /* @__PURE__ */ React.createElement(CheckCircleIcon, { color: "primary" }))), /* @__PURE__ */ React.createElement(Tooltip, { title: "Reject" }, /* @__PURE__ */ React.createElement(IconButton, { size: "small", onClick: () => handleReject(row) }, /* @__PURE__ */ React.createElement(CancelIcon, { color: "error" }))));
218
- }
219
- }
220
- ];
221
- const detailPanelConfig = [
222
- {
223
- render: (data) => {
224
- const request = data.rowData;
225
- if (!request?.metadata?.name) return /* @__PURE__ */ React.createElement(Box, null);
226
- return /* @__PURE__ */ React.createElement(ExpandedRowContent, { request });
227
- }
228
- }
229
- ];
230
- return /* @__PURE__ */ React.createElement(Box, { p: 2 }, /* @__PURE__ */ React.createElement(Box, { mb: 2 }, /* @__PURE__ */ React.createElement(Typography, { variant: "body2", color: "textSecondary" }, pendingRequests.length, " pending, ", approvedRequests.length, " approved,", " ", rejectedRequests.length, " rejected")), requests.length === 0 ? /* @__PURE__ */ React.createElement(Box, { p: 3, textAlign: "center" }, /* @__PURE__ */ React.createElement(Typography, { variant: "body1", color: "textSecondary" }, "No API keys for this API.")) : /* @__PURE__ */ React.createElement(
231
- Table,
232
- {
233
- options: {
234
- paging: requests.length > 10,
235
- pageSize: 20,
236
- search: true,
237
- filtering: false,
238
- debounceInterval: 300,
239
- toolbar: true,
240
- emptyRowsWhenPaging: false
241
- },
242
- columns,
243
- data: requests.map((item) => ({ ...item, id: item.metadata.name })),
244
- detailPanel: detailPanelConfig
245
- }
246
- ), /* @__PURE__ */ React.createElement(
247
- ApprovalDialog,
248
- {
249
- open: dialogState.open,
250
- request: dialogState.request,
251
- action: dialogState.action,
252
- processing: dialogState.processing,
253
- onClose: () => setDialogState({
254
- open: false,
255
- request: null,
256
- action: "approve",
257
- processing: false
258
- }),
259
- onConfirm: handleConfirm
260
- }
261
- ));
262
- };
263
-
264
- export { EntityApiApprovalTab };
265
- //# sourceMappingURL=EntityApiApprovalTab.esm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EntityApiApprovalTab.esm.js","sources":["../../../src/components/EntityApiApprovalTab/EntityApiApprovalTab.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport { useEntity } from \"@backstage/plugin-catalog-react\";\nimport {\n useApi,\n identityApiRef,\n alertApiRef,\n} from \"@backstage/core-plugin-api\";\nimport { kuadrantApiRef } from '../../api';\nimport { useAsync } from \"react-use\";\nimport {\n Table,\n TableColumn,\n ResponseErrorPanel,\n} from \"@backstage/core-components\";\nimport { kuadrantApiKeyApprovePermission } from \"../../permissions\";\nimport { useKuadrantPermission } from \"../../utils/permissions\";\nimport {\n Box,\n Typography,\n Chip,\n IconButton,\n Tooltip,\n Button,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n TextField,\n CircularProgress,\n makeStyles,\n} from \"@material-ui/core\";\nimport { Skeleton } from \"@material-ui/lab\";\nimport CheckCircleIcon from \"@material-ui/icons/CheckCircle\";\nimport CancelIcon from \"@material-ui/icons/Cancel\";\nimport { APIKey } from \"../../types/api-management\";\nimport { getApprovalQueueStatusChipStyle } from \"../../utils/styles\";\n\nconst useStyles = makeStyles((theme) => ({\n useCasePanel: {\n padding: theme.spacing(2),\n backgroundColor: theme.palette.background.default,\n },\n useCaseLabel: {\n fontWeight: 600,\n marginBottom: theme.spacing(1),\n color: theme.palette.text.secondary,\n textTransform: \"uppercase\",\n fontSize: \"0.75rem\",\n },\n}));\n\ninterface ExpandedRowProps {\n request: APIKey;\n}\n\nconst ExpandedRowContent = ({ request }: ExpandedRowProps) => {\n const classes = useStyles();\n\n return (\n <Box className={classes.useCasePanel} onClick={(e) => e.stopPropagation()}>\n <Typography className={classes.useCaseLabel}>Use Case</Typography>\n <Typography variant=\"body2\">\n {request.spec.useCase || \"No use case provided\"}\n </Typography>\n </Box>\n );\n};\n\ninterface ApprovalDialogProps {\n open: boolean;\n request: APIKey | null;\n action: \"approve\" | \"reject\";\n processing: boolean;\n onClose: () => void;\n onConfirm: (confirmText: string) => void;\n}\n\nconst ApprovalDialog = ({\n open,\n request,\n action,\n processing,\n onClose,\n onConfirm,\n}: ApprovalDialogProps) => {\n const [confirmText, setConfirmText] = useState(\"\");\n\n const handleClose = () => {\n setConfirmText(\"\");\n onClose();\n };\n\n const handleConfirm = () => {\n onConfirm(confirmText);\n setConfirmText(\"\");\n };\n\n const isReject = action === \"reject\";\n const expectedText = request?.metadata.name || \"\";\n const isConfirmValid = confirmText === expectedText;\n\n return (\n <Dialog\n open={open}\n onClose={processing ? undefined : handleClose}\n maxWidth=\"sm\"\n fullWidth\n >\n <DialogTitle>\n {isReject ? \"Reject API key\" : \"Approve API key\"}\n </DialogTitle>\n <DialogContent>\n {request && (\n <>\n <Typography variant=\"body2\" paragraph>\n <strong>Requester:</strong> {request.spec.requestedBy.userId}\n </Typography>\n <Typography variant=\"body2\" paragraph>\n <strong>Tier:</strong> {request.spec.planTier}\n </Typography>\n {request.spec.useCase && (\n <Typography variant=\"body2\" paragraph>\n <strong>Use Case:</strong> {request.spec.useCase}\n </Typography>\n )}\n {isReject && (\n <Box mt={2} p={2} bgcolor=\"error.light\" borderRadius={1}>\n <Typography variant=\"body2\">\n This action will permanently deny access. The user will need\n to submit a new request.\n </Typography>\n </Box>\n )}\n <Box mt={2}>\n <TextField\n fullWidth\n label={`Type \"${expectedText}\" to confirm`}\n value={confirmText}\n onChange={(e) => setConfirmText(e.target.value)}\n disabled={processing}\n autoFocus\n />\n </Box>\n </>\n )}\n </DialogContent>\n <DialogActions>\n <Button onClick={handleClose} disabled={processing}>\n Cancel\n </Button>\n <Button\n onClick={handleConfirm}\n color={isReject ? \"secondary\" : \"primary\"}\n variant=\"contained\"\n disabled={!isConfirmValid || processing}\n startIcon={\n processing ? (\n <CircularProgress size={16} color=\"inherit\" />\n ) : undefined\n }\n >\n {processing\n ? isReject\n ? \"Rejecting...\"\n : \"Approving...\"\n : isReject\n ? \"Reject\"\n : \"Approve\"}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n\nexport const EntityApiApprovalTab = () => {\n const { entity } = useEntity();\n const kuadrantApi = useApi(kuadrantApiRef);\n const identityApi = useApi(identityApiRef);\n const alertApi = useApi(alertApiRef);\n\n const apiProductName =\n entity.metadata.annotations?.[\"kuadrant.io/apiproduct\"] ||\n entity.metadata.name;\n const namespace =\n entity.metadata.annotations?.[\"kuadrant.io/namespace\"] || \"default\";\n\n const [refresh, setRefresh] = useState(0);\n const [dialogState, setDialogState] = useState<{\n open: boolean;\n request: APIKey | null;\n action: \"approve\" | \"reject\";\n processing: boolean;\n }>({\n open: false,\n request: null,\n action: \"approve\",\n processing: false,\n });\n\n const {\n allowed: canApprove,\n loading: permissionLoading,\n error: permissionError,\n } = useKuadrantPermission(kuadrantApiKeyApprovePermission);\n\n const { value, loading, error } = useAsync(async () => {\n const identity = await identityApi.getBackstageIdentity();\n const reviewedBy = identity.userEntityRef;\n\n const data = await kuadrantApi.getRequests();\n const allRequests: APIKey[] = data.items || [];\n\n // filter to this API product only\n const filtered = allRequests.filter(\n (r) =>\n r.spec.apiProductRef?.name === apiProductName &&\n r.metadata.namespace === namespace,\n );\n\n return { requests: filtered, reviewedBy };\n }, [kuadrantApi, identityApi, apiProductName, namespace, refresh]);\n\n const handleApprove = (request: APIKey) => {\n setDialogState({\n open: true,\n request,\n action: \"approve\",\n processing: false,\n });\n };\n\n const handleReject = (request: APIKey) => {\n setDialogState({\n open: true,\n request,\n action: \"reject\",\n processing: false,\n });\n };\n\n const handleConfirm = async () => {\n if (!dialogState.request || !value) return;\n\n setDialogState((prev) => ({ ...prev, processing: true }));\n\n const isApprove = dialogState.action === \"approve\"\n const requestFn = isApprove\n ? (ns: string, n: string, r: string) => kuadrantApi.approveRequest(ns, n, r)\n : (ns: string, n: string, r: string) => kuadrantApi.rejectRequest(ns, n, r)\n\n try {\n await requestFn(dialogState.request.metadata.namespace, dialogState.request.metadata.name, value.reviewedBy);\n\n setDialogState({\n open: false,\n request: null,\n action: \"approve\",\n processing: false,\n });\n setRefresh((r) => r + 1);\n alertApi.post({\n message: `API key ${isApprove ? \"approved\" : \"rejected\"}`,\n severity: \"success\",\n display: \"transient\",\n });\n } catch (err) {\n console.error(`Error ${dialogState.action}ing request:`, err);\n setDialogState((prev) => ({ ...prev, processing: false }));\n const errorMessage = err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to ${dialogState.action} APIKey. ${errorMessage}`,\n severity: 'error',\n display: 'transient',\n });\n }\n };\n\n if (loading || permissionLoading) {\n return (\n <Box p={2}>\n {[...Array(5)].map((_, i) => (\n <Box key={i} p={2}>\n <Skeleton variant=\"text\" width=\"100%\" />\n </Box>\n ))}\n </Box>\n );\n }\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n if (permissionError) {\n return (\n <Box p={2}>\n <Typography color=\"error\">\n Unable to check permissions: {permissionError.message}\n </Typography>\n </Box>\n );\n }\n\n if (!canApprove) {\n return (\n <Box p={3} textAlign=\"center\">\n <Typography variant=\"body1\" color=\"textSecondary\">\n You don't have permission to view the approval queue for this API.\n </Typography>\n </Box>\n );\n }\n\n const requests = value?.requests || [];\n const pendingRequests = requests.filter(\n (r) => !r.status?.phase || r.status.phase === \"Pending\",\n );\n const approvedRequests = requests.filter(\n (r) => r.status?.phase === \"Approved\",\n );\n const rejectedRequests = requests.filter(\n (r) => r.status?.phase === \"Rejected\",\n );\n\n const columns: TableColumn<APIKey>[] = [\n {\n title: \"Requester\",\n field: \"spec.requestedBy.userId\",\n render: (row) => (\n <Typography variant=\"body2\">{row.spec.requestedBy.userId}</Typography>\n ),\n },\n {\n title: \"Status\",\n field: \"status.phase\",\n render: (row) => {\n const phase = row.status?.phase || \"Pending\";\n const label = phase === \"Approved\" ? \"Active\" : phase;\n return (\n <Chip label={label} size=\"small\" style={getApprovalQueueStatusChipStyle(phase)} />\n );\n },\n },\n {\n title: \"Tier\",\n field: \"spec.planTier\",\n render: (row) => (\n <Chip label={row.spec.planTier} size=\"small\" variant=\"outlined\" />\n ),\n },\n {\n title: \"Requested\",\n field: \"metadata.creationTimestamp\",\n render: (row) => {\n if (!row.metadata.creationTimestamp)\n return <Typography variant=\"body2\">-</Typography>;\n return (\n <Typography variant=\"body2\">\n {new Date(row.metadata.creationTimestamp).toLocaleDateString()}\n </Typography>\n );\n },\n },\n {\n title: \"Actions\",\n filtering: false,\n render: (row) => {\n const phase = row.status?.phase || \"Pending\";\n if (phase !== \"Pending\") return null;\n return (\n <Box display=\"flex\" style={{ gap: 4 }}>\n <Tooltip title=\"Approve\">\n <IconButton size=\"small\" onClick={() => handleApprove(row)}>\n <CheckCircleIcon color=\"primary\" />\n </IconButton>\n </Tooltip>\n <Tooltip title=\"Reject\">\n <IconButton size=\"small\" onClick={() => handleReject(row)}>\n <CancelIcon color=\"error\" />\n </IconButton>\n </Tooltip>\n </Box>\n );\n },\n },\n ];\n\n const detailPanelConfig = [\n {\n render: (data: any) => {\n const request = data.rowData as APIKey;\n if (!request?.metadata?.name) return <Box />;\n return <ExpandedRowContent request={request} />;\n },\n },\n ];\n\n return (\n <Box p={2}>\n <Box mb={2}>\n <Typography variant=\"body2\" color=\"textSecondary\">\n {pendingRequests.length} pending, {approvedRequests.length} approved,{\" \"}\n {rejectedRequests.length} rejected\n </Typography>\n </Box>\n\n {requests.length === 0 ? (\n <Box p={3} textAlign=\"center\">\n <Typography variant=\"body1\" color=\"textSecondary\">\n No API keys for this API.\n </Typography>\n </Box>\n ) : (\n <Table\n options={{\n paging: requests.length > 10,\n pageSize: 20,\n search: true,\n filtering: false,\n debounceInterval: 300,\n toolbar: true,\n emptyRowsWhenPaging: false,\n }}\n columns={columns}\n data={requests.map((item) => ({ ...item, id: item.metadata.name }))}\n detailPanel={detailPanelConfig}\n />\n )}\n\n <ApprovalDialog\n open={dialogState.open}\n request={dialogState.request}\n action={dialogState.action}\n processing={dialogState.processing}\n onClose={() =>\n setDialogState({\n open: false,\n request: null,\n action: \"approve\",\n processing: false,\n })\n }\n onConfirm={handleConfirm}\n />\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export { EntityApiApprovalTab } from './EntityApiApprovalTab.esm.js';
2
- //# sourceMappingURL=index.esm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}