@kuadrant/kuadrant-backstage-plugin-frontend 0.0.2-dev-0b744dd → 0.0.2-dev-9be93a3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/dist/api.esm.js +220 -0
  2. package/dist/api.esm.js.map +1 -0
  3. package/dist/apis.esm.js +15 -0
  4. package/dist/apis.esm.js.map +1 -0
  5. package/dist/components/ApiAccessCard/ApiAccessCard.esm.js +27 -37
  6. package/dist/components/ApiAccessCard/ApiAccessCard.esm.js.map +1 -1
  7. package/dist/components/ApiKeyApprovalPage/ApiKeyApprovalPage.esm.js +10 -0
  8. package/dist/components/ApiKeyApprovalPage/ApiKeyApprovalPage.esm.js.map +1 -0
  9. package/dist/components/ApiKeyApprovalPage/index.esm.js +2 -0
  10. package/dist/components/ApiKeyDetailPage/ApiKeyDetailPage.esm.js +28 -40
  11. package/dist/components/ApiKeyDetailPage/ApiKeyDetailPage.esm.js.map +1 -1
  12. package/dist/components/ApiKeyManagementTab/ApiKeyManagementTab.esm.js +20 -46
  13. package/dist/components/ApiKeyManagementTab/ApiKeyManagementTab.esm.js.map +1 -1
  14. package/dist/components/ApiProductDetailPage/ApiProductDetailPage.esm.js +27 -35
  15. package/dist/components/ApiProductDetailPage/ApiProductDetailPage.esm.js.map +1 -1
  16. package/dist/components/ApiProductDetails/ApiProductDetails.esm.js +13 -3
  17. package/dist/components/ApiProductDetails/ApiProductDetails.esm.js.map +1 -1
  18. package/dist/components/ApiProductInfoCard/ApiProductInfoCard.esm.js +5 -13
  19. package/dist/components/ApiProductInfoCard/ApiProductInfoCard.esm.js.map +1 -1
  20. package/dist/components/ApiProductOpenApiAlert/ApiProductOpenApiAlert.esm.js +7 -10
  21. package/dist/components/ApiProductOpenApiAlert/ApiProductOpenApiAlert.esm.js.map +1 -1
  22. package/dist/components/ApprovalQueueTable/ApprovalQueueTable.esm.js +34 -66
  23. package/dist/components/ApprovalQueueTable/ApprovalQueueTable.esm.js.map +1 -1
  24. package/dist/components/CreateAPIProductDialog/CreateAPIProductDialog.esm.js +143 -58
  25. package/dist/components/CreateAPIProductDialog/CreateAPIProductDialog.esm.js.map +1 -1
  26. package/dist/components/EditAPIKeyDialog/EditAPIKeyDialog.esm.js +8 -18
  27. package/dist/components/EditAPIKeyDialog/EditAPIKeyDialog.esm.js.map +1 -1
  28. package/dist/components/EditAPIProductDialog/EditAPIProductDialog.esm.js +52 -30
  29. package/dist/components/EditAPIProductDialog/EditAPIProductDialog.esm.js.map +1 -1
  30. package/dist/components/EntityApiApprovalTab/EntityApiApprovalTab.esm.js +11 -27
  31. package/dist/components/EntityApiApprovalTab/EntityApiApprovalTab.esm.js.map +1 -1
  32. package/dist/components/KuadrantPage/ApiProductsPage.esm.js +71 -55
  33. package/dist/components/KuadrantPage/ApiProductsPage.esm.js.map +1 -1
  34. package/dist/components/MyApiKeysPage/MyApiKeysPage.esm.js +10 -0
  35. package/dist/components/MyApiKeysPage/MyApiKeysPage.esm.js.map +1 -0
  36. package/dist/components/MyApiKeysPage/index.esm.js +2 -0
  37. package/dist/components/MyApiKeysPage/index.esm.js.map +1 -0
  38. package/dist/components/MyApiKeysTable/MyApiKeysTable.esm.js +51 -57
  39. package/dist/components/MyApiKeysTable/MyApiKeysTable.esm.js.map +1 -1
  40. package/dist/components/RequestAccessDialog/RequestAccessDialog.esm.js +10 -25
  41. package/dist/components/RequestAccessDialog/RequestAccessDialog.esm.js.map +1 -1
  42. package/dist/components/SimpleRequestAccessDialog/SimpleRequestAccessDialog.esm.js +206 -0
  43. package/dist/components/SimpleRequestAccessDialog/SimpleRequestAccessDialog.esm.js.map +1 -0
  44. package/dist/index.d.ts +461 -2
  45. package/dist/index.esm.js +3 -1
  46. package/dist/index.esm.js.map +1 -1
  47. package/dist/plugin.esm.js +11 -4
  48. package/dist/plugin.esm.js.map +1 -1
  49. package/dist/utils/styles.esm.js +44 -5
  50. package/dist/utils/styles.esm.js.map +1 -1
  51. package/dist-scalprum/internal.plugin-kuadrant.8bf02d5482a5a3ed6337.js +2 -0
  52. package/dist-scalprum/internal.plugin-kuadrant.8bf02d5482a5a3ed6337.js.map +1 -0
  53. package/dist-scalprum/plugin-manifest.json +3 -3
  54. package/dist-scalprum/static/2118.82433765.chunk.js +2 -0
  55. package/dist-scalprum/static/2118.82433765.chunk.js.map +1 -0
  56. package/dist-scalprum/static/2967.28e7c7f8.chunk.js +2 -0
  57. package/dist-scalprum/static/2967.28e7c7f8.chunk.js.map +1 -0
  58. package/dist-scalprum/static/369.2374941c.chunk.js +2 -0
  59. package/dist-scalprum/static/369.2374941c.chunk.js.map +1 -0
  60. package/dist-scalprum/static/3947.ff1c25cf.chunk.js +2 -0
  61. package/dist-scalprum/static/3947.ff1c25cf.chunk.js.map +1 -0
  62. package/dist-scalprum/static/3976.cf3ec7be.chunk.js +2 -0
  63. package/dist-scalprum/static/3976.cf3ec7be.chunk.js.map +1 -0
  64. package/dist-scalprum/static/4447.222bb58d.chunk.js +2 -0
  65. package/dist-scalprum/static/4447.222bb58d.chunk.js.map +1 -0
  66. package/dist-scalprum/static/5010.4ef96c87.chunk.js +3 -0
  67. package/dist-scalprum/static/5010.4ef96c87.chunk.js.map +1 -0
  68. package/dist-scalprum/static/5203.e92a3353.chunk.js +2 -0
  69. package/dist-scalprum/static/5203.e92a3353.chunk.js.map +1 -0
  70. package/dist-scalprum/static/6371.6ee1f11d.chunk.js +2 -0
  71. package/dist-scalprum/static/6371.6ee1f11d.chunk.js.map +1 -0
  72. package/dist-scalprum/static/6422.969d9b8c.chunk.js +2 -0
  73. package/dist-scalprum/static/6422.969d9b8c.chunk.js.map +1 -0
  74. package/dist-scalprum/static/6800.a7645f4c.chunk.js +2 -0
  75. package/dist-scalprum/static/6800.a7645f4c.chunk.js.map +1 -0
  76. package/dist-scalprum/static/69.1decc5e8.chunk.js +2 -0
  77. package/dist-scalprum/static/69.1decc5e8.chunk.js.map +1 -0
  78. package/dist-scalprum/static/7005.a9f73153.chunk.js +2 -0
  79. package/dist-scalprum/static/7005.a9f73153.chunk.js.map +1 -0
  80. package/dist-scalprum/static/7270.b0e185f1.chunk.js +2 -0
  81. package/dist-scalprum/static/7270.b0e185f1.chunk.js.map +1 -0
  82. package/dist-scalprum/static/7791.5c1eea8a.chunk.js +2 -0
  83. package/dist-scalprum/static/7791.5c1eea8a.chunk.js.map +1 -0
  84. package/dist-scalprum/static/{6763.d6cd937f.chunk.js → 8563.46f1a3e1.chunk.js} +3 -3
  85. package/dist-scalprum/static/8563.46f1a3e1.chunk.js.map +1 -0
  86. package/dist-scalprum/static/8789.84963cbc.chunk.js +2 -0
  87. package/dist-scalprum/static/8789.84963cbc.chunk.js.map +1 -0
  88. package/dist-scalprum/static/8804.63919453.chunk.js +2 -0
  89. package/dist-scalprum/static/8804.63919453.chunk.js.map +1 -0
  90. package/dist-scalprum/static/9051.db875198.chunk.js +2 -0
  91. package/dist-scalprum/static/9051.db875198.chunk.js.map +1 -0
  92. package/dist-scalprum/static/{2946.a35243f1.chunk.js → 9370.2e9fe34b.chunk.js} +3 -3
  93. package/dist-scalprum/static/9370.2e9fe34b.chunk.js.map +1 -0
  94. package/dist-scalprum/static/9838.5df9b1de.chunk.js +2 -0
  95. package/dist-scalprum/static/9838.5df9b1de.chunk.js.map +1 -0
  96. package/dist-scalprum/static/exposed-PluginRoot.8a8dd91f.chunk.js +2 -0
  97. package/dist-scalprum/static/exposed-PluginRoot.8a8dd91f.chunk.js.map +1 -0
  98. package/package.json +3 -1
  99. package/dist/components/ApiKeysPage/ApiKeysPage.esm.js +0 -43
  100. package/dist/components/ApiKeysPage/ApiKeysPage.esm.js.map +0 -1
  101. package/dist/components/ApiKeysPage/index.esm.js +0 -2
  102. package/dist-scalprum/internal.plugin-kuadrant.114cbbe1d3ddb939d776.js +0 -2
  103. package/dist-scalprum/internal.plugin-kuadrant.114cbbe1d3ddb939d776.js.map +0 -1
  104. package/dist-scalprum/static/2821.0829f14d.chunk.js +0 -2
  105. package/dist-scalprum/static/2821.0829f14d.chunk.js.map +0 -1
  106. package/dist-scalprum/static/2946.a35243f1.chunk.js.map +0 -1
  107. package/dist-scalprum/static/2967.65c51af8.chunk.js +0 -2
  108. package/dist-scalprum/static/2967.65c51af8.chunk.js.map +0 -1
  109. package/dist-scalprum/static/3650.ee76eba9.chunk.js +0 -2
  110. package/dist-scalprum/static/3650.ee76eba9.chunk.js.map +0 -1
  111. package/dist-scalprum/static/3947.7458971d.chunk.js +0 -2
  112. package/dist-scalprum/static/3947.7458971d.chunk.js.map +0 -1
  113. package/dist-scalprum/static/3984.647ef00c.chunk.js +0 -2
  114. package/dist-scalprum/static/3984.647ef00c.chunk.js.map +0 -1
  115. package/dist-scalprum/static/4651.c85cecc4.chunk.js +0 -2
  116. package/dist-scalprum/static/4651.c85cecc4.chunk.js.map +0 -1
  117. package/dist-scalprum/static/4682.75f17114.chunk.js +0 -2
  118. package/dist-scalprum/static/4682.75f17114.chunk.js.map +0 -1
  119. package/dist-scalprum/static/5010.0cd6c959.chunk.js +0 -3
  120. package/dist-scalprum/static/5010.0cd6c959.chunk.js.map +0 -1
  121. package/dist-scalprum/static/5203.b654e8e0.chunk.js +0 -2
  122. package/dist-scalprum/static/5203.b654e8e0.chunk.js.map +0 -1
  123. package/dist-scalprum/static/5453.ecdee66d.chunk.js +0 -2
  124. package/dist-scalprum/static/5453.ecdee66d.chunk.js.map +0 -1
  125. package/dist-scalprum/static/6371.d45f37cc.chunk.js +0 -2
  126. package/dist-scalprum/static/6371.d45f37cc.chunk.js.map +0 -1
  127. package/dist-scalprum/static/6763.d6cd937f.chunk.js.map +0 -1
  128. package/dist-scalprum/static/6800.20f46859.chunk.js +0 -2
  129. package/dist-scalprum/static/6800.20f46859.chunk.js.map +0 -1
  130. package/dist-scalprum/static/6840.1653e6b0.chunk.js +0 -2
  131. package/dist-scalprum/static/6840.1653e6b0.chunk.js.map +0 -1
  132. package/dist-scalprum/static/7236.f3886d59.chunk.js +0 -2
  133. package/dist-scalprum/static/7236.f3886d59.chunk.js.map +0 -1
  134. package/dist-scalprum/static/7791.ac1ac509.chunk.js +0 -2
  135. package/dist-scalprum/static/7791.ac1ac509.chunk.js.map +0 -1
  136. package/dist-scalprum/static/8172.cbe1f2c4.chunk.js +0 -2
  137. package/dist-scalprum/static/8172.cbe1f2c4.chunk.js.map +0 -1
  138. package/dist-scalprum/static/8799.939d14f9.chunk.js +0 -2
  139. package/dist-scalprum/static/8799.939d14f9.chunk.js.map +0 -1
  140. package/dist-scalprum/static/exposed-PluginRoot.ed95fa78.chunk.js +0 -2
  141. package/dist-scalprum/static/exposed-PluginRoot.ed95fa78.chunk.js.map +0 -1
  142. /package/dist/components/{ApiKeysPage → ApiKeyApprovalPage}/index.esm.js.map +0 -0
  143. /package/dist-scalprum/static/{5010.0cd6c959.chunk.js.LICENSE.txt → 5010.4ef96c87.chunk.js.LICENSE.txt} +0 -0
  144. /package/dist-scalprum/static/{6763.d6cd937f.chunk.js.LICENSE.txt → 8563.46f1a3e1.chunk.js.LICENSE.txt} +0 -0
  145. /package/dist-scalprum/static/{2946.a35243f1.chunk.js.LICENSE.txt → 9370.2e9fe34b.chunk.js.LICENSE.txt} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"ApiKeyManagementTab.esm.js","sources":["../../../src/components/ApiKeyManagementTab/ApiKeyManagementTab.tsx"],"sourcesContent":["import React, { useState, useMemo } from \"react\";\nimport { useAsync } from \"react-use\";\nimport {\n Table,\n TableColumn,\n Progress,\n ResponseErrorPanel,\n CodeSnippet,\n} from \"@backstage/core-components\";\nimport {\n IconButton,\n Typography,\n Box,\n Chip,\n Grid,\n Button,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Tabs,\n Tab,\n Menu,\n MenuItem,\n Tooltip,\n CircularProgress,\n} from \"@material-ui/core\";\nimport {\n useApi,\n configApiRef,\n identityApiRef,\n fetchApiRef,\n alertApiRef,\n} from \"@backstage/core-plugin-api\";\nimport { useEntity } from \"@backstage/plugin-catalog-react\";\nimport VisibilityIcon from \"@material-ui/icons/Visibility\";\nimport VisibilityOffIcon from \"@material-ui/icons/VisibilityOff\";\nimport HourglassEmptyIcon from \"@material-ui/icons/HourglassEmpty\";\nimport CancelIcon from \"@material-ui/icons/Cancel\";\nimport AddIcon from \"@material-ui/icons/Add\";\nimport MoreVertIcon from \"@material-ui/icons/MoreVert\";\nimport FileCopyIcon from \"@material-ui/icons/FileCopy\";\nimport WarningIcon from \"@material-ui/icons/Warning\";\nimport { APIKey } from \"../../types/api-management\";\nimport {\n kuadrantApiKeyCreatePermission,\n kuadrantApiKeyDeleteOwnPermission,\n kuadrantApiKeyDeleteAllPermission,\n kuadrantApiKeyUpdateOwnPermission,\n} from \"../../permissions\";\nimport {\n useKuadrantPermission,\n canDeleteResource,\n} from \"../../utils/permissions\";\nimport { EditAPIKeyDialog } from \"../EditAPIKeyDialog\";\nimport { ConfirmDeleteDialog } from \"../ConfirmDeleteDialog\";\nimport { generateAuthCodeSnippets } from \"../../utils/codeSnippets\";\nimport { RequestAccessDialog } from \"../RequestAccessDialog\";\nimport {handleFetchError} from \"../../utils/errors.ts\";\n\ninterface APIProduct {\n metadata: {\n name: string;\n namespace: string;\n };\n spec: {\n displayName?: string;\n };\n status?: {\n discoveredPlans?: Array<{\n tier: string;\n description?: string;\n limits?: any;\n }>;\n conditions?: Array<{\n type: string;\n status: \"True\" | \"False\" | \"Unknown\";\n reason?: string;\n message?: string;\n lastTransitionTime?: string;\n }>;\n };\n}\n\ninterface Plan {\n tier: string;\n limits: any;\n}\n\nexport interface ApiKeyManagementTabProps {\n namespace?: string;\n}\n\nexport const ApiKeyManagementTab = ({\n namespace: propNamespace,\n}: ApiKeyManagementTabProps) => {\n const { entity } = useEntity();\n const config = useApi(configApiRef);\n const identityApi = useApi(identityApiRef);\n const fetchApi = useApi(fetchApiRef);\n const alertApi = useApi(alertApiRef);\n const backendUrl = config.getString(\"backend.baseUrl\");\n const [visibleKeys, setVisibleKeys] = useState<Set<string>>(new Set());\n const [refresh, setRefresh] = useState(0);\n const [userId, setUserId] = useState<string>(\"\");\n const [userEmail, setUserEmail] = useState<string>(\"\");\n const [requestDialogOpen, setRequestDialogOpen] = useState(false);\n const [editDialogOpen, setEditDialogOpen] = useState(false);\n const [requestToEdit, setRequestToEdit] = useState<APIKey | null>(null);\n const [menuAnchor, setMenuAnchor] = useState<{\n top: number;\n left: number;\n } | null>(null);\n const [menuRequest, setMenuRequest] = useState<APIKey | null>(null);\n const [deleting, setDeleting] = useState<string | null>(null);\n const [optimisticallyDeleted, setOptimisticallyDeleted] = useState<\n Set<string>\n >(new Set());\n const [deleteDialogState, setDeleteDialogState] = useState<{\n open: boolean;\n request: APIKey | null;\n }>({ open: false, request: null });\n const [apiKeyValues, setApiKeyValues] = useState<Map<string, string>>(\n new Map(),\n );\n const [apiKeyLoading, setApiKeyLoading] = useState<Set<string>>(new Set());\n const [alreadyReadKeys, setAlreadyReadKeys] = useState<Set<string>>(\n new Set(),\n );\n const [showOnceWarningOpen, setShowOnceWarningOpen] = useState(false);\n const [pendingKeyReveal, setPendingKeyReveal] = useState<{\n namespace: string;\n name: string;\n } | null>(null);\n\n // get apiproduct name from entity annotation (set by entity provider)\n const apiProductName =\n entity.metadata.annotations?.[\"kuadrant.io/apiproduct\"] ||\n entity.metadata.name;\n const namespace =\n entity.metadata.annotations?.[\"kuadrant.io/namespace\"] ||\n propNamespace ||\n \"default\";\n\n useAsync(async () => {\n const identity = await identityApi.getBackstageIdentity();\n const profile = await identityApi.getProfileInfo();\n setUserId(identity.userEntityRef);\n setUserEmail(profile.email || \"\");\n }, [identityApi]);\n\n const {\n value: requests,\n loading: requestsLoading,\n error: requestsError,\n } = useAsync(async () => {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/requests/my?namespace=${namespace}`,\n );\n if (!response.ok) {\n const error = await handleFetchError(response);\n throw new Error(`failed to fetch requests. ${error}`);\n }\n const data = await response.json();\n // filter by apiproduct name, not httproute name\n return (data.items || []).filter(\n (r: APIKey) =>\n r.spec.apiProductRef.name === apiProductName &&\n r.metadata.namespace === namespace, // APIProducts and APIKeys (and its Secret) will be in the same NS\n );\n }, [apiProductName, namespace, refresh, fetchApi, backendUrl]);\n\n const {\n value: apiProduct,\n loading: plansLoading,\n error: plansError,\n } = useAsync(async () => {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/apiproducts`,\n );\n if (!response.ok) {\n const error = await handleFetchError(response);\n throw new Error(`failed to fetch api products. ${error}`);\n }\n const data = await response.json();\n\n const product = data.items?.find(\n (p: APIProduct) =>\n p.metadata.namespace === namespace &&\n p.metadata.name === apiProductName,\n );\n\n return product;\n }, [namespace, apiProductName, fetchApi]);\n\n // check permissions with resource reference once we have the apiproduct\n const resourceRef = apiProduct\n ? `apiproduct:${apiProduct.metadata.namespace}/${apiProduct.metadata.name}`\n : undefined;\n\n const {\n allowed: canCreateRequest,\n loading: createRequestPermissionLoading,\n error: createRequestPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyCreatePermission, resourceRef);\n\n const {\n allowed: canDeleteOwnKey,\n loading: deleteOwnPermissionLoading,\n error: deleteOwnPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyDeleteOwnPermission);\n\n const {\n allowed: canDeleteAllKeys,\n loading: deleteAllPermissionLoading,\n error: deleteAllPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyDeleteAllPermission);\n\n const {\n allowed: canUpdateRequest,\n loading: updateRequestPermissionLoading,\n error: updateRequestPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyUpdateOwnPermission);\n\n const handleDeleteRequest = async (name: string) => {\n // optimistic update - remove from UI immediately\n setOptimisticallyDeleted((prev) => new Set(prev).add(name));\n setDeleting(name);\n try {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/requests/${namespace}/${name}`,\n { method: \"DELETE\" },\n );\n if (!response.ok) {\n const error = await handleFetchError(response);\n throw new Error(error);\n }\n alertApi.post({\n message: \"API key deleted successfully\",\n severity: \"success\",\n display: \"transient\",\n });\n setRefresh((r) => r + 1);\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"unknown error occurred\";\n // rollback optimistic update on error\n setOptimisticallyDeleted((prev) => {\n const next = new Set(prev);\n next.delete(name);\n return next;\n });\n alertApi.post({\n message: `Failed to delete API key: ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\n } finally {\n setDeleting(null);\n }\n };\n\n const fetchApiKeyFromSecret = async (\n requestNamespace: string,\n requestName: string,\n ) => {\n const key = `${requestNamespace}/${requestName}`;\n if (apiKeyLoading.has(key)) {\n return;\n }\n\n setApiKeyLoading((prev) => new Set(prev).add(key));\n try {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/apikeys/${requestNamespace}/${requestName}/secret`,\n );\n if (response.ok) {\n const data = await response.json();\n setApiKeyValues((prev) => new Map(prev).set(key, data.apiKey));\n // after successful read, mark as already read (show-once behaviour)\n setAlreadyReadKeys((prev) => new Set(prev).add(key));\n } else if (response.status === 403) {\n // secret has already been read\n setAlreadyReadKeys((prev) => new Set(prev).add(key));\n alertApi.post({\n message:\n \"This API key has already been viewed and cannot be retrieved again.\",\n severity: \"warning\",\n display: \"transient\",\n });\n }\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to fetch api key: ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\n } finally {\n setApiKeyLoading((prev) => {\n const next = new Set(prev);\n next.delete(key);\n return next;\n });\n }\n };\n\n const clearApiKeyValue = (requestNamespace: string, requestName: string) => {\n const key = `${requestNamespace}/${requestName}`;\n setApiKeyValues((prev) => {\n const next = new Map(prev);\n next.delete(key);\n return next;\n });\n };\n\n const handleEditRequest = (request: APIKey) => {\n setRequestToEdit(request);\n setEditDialogOpen(true);\n };\n\n const handleEditSuccess = () => {\n setRefresh((r) => r + 1);\n setEditDialogOpen(false);\n alertApi.post({\n message: \"API key updated\",\n severity: \"success\",\n display: \"transient\",\n });\n setRequestToEdit(null);\n };\n\n const handleMenuClose = () => {\n setMenuAnchor(null);\n setMenuRequest(null);\n };\n\n const handleMenuEdit = () => {\n if (!menuRequest) return;\n handleEditRequest(menuRequest);\n handleMenuClose();\n };\n\n const handleMenuDeleteClick = () => {\n if (!menuRequest) return;\n const request = menuRequest;\n handleMenuClose();\n setDeleteDialogState({ open: true, request });\n };\n\n const handleDeleteConfirm = async () => {\n if (!deleteDialogState.request) return;\n await handleDeleteRequest(deleteDialogState.request.metadata.name);\n setDeleteDialogState({ open: false, request: null });\n };\n\n const handleDeleteCancel = () => {\n setDeleteDialogState({ open: false, request: null });\n };\n\n const toggleVisibility = (keyName: string) => {\n setVisibleKeys((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(keyName)) {\n newSet.delete(keyName);\n } else {\n newSet.add(keyName);\n }\n return newSet;\n });\n };\n\n const detailPanelConfig = useMemo(\n () => [\n {\n render: (data: any) => {\n // backstage Table wraps the data in { rowData: actualData }\n const request = data.rowData as APIKey;\n if (!request?.metadata?.name) {\n return <Box />;\n }\n\n // pass already-revealed key from parent state (don't auto-fetch - that consumes show-once)\n const key = `${request.metadata.namespace}/${request.metadata.name}`;\n const revealedKey = apiKeyValues.get(key);\n return (\n <DetailPanelContent\n request={request}\n apiName={apiProductName}\n revealedApiKey={revealedKey}\n />\n );\n },\n },\n ],\n [apiProductName, apiKeyValues],\n );\n\n // separate component to isolate state\n const DetailPanelContent = ({\n request,\n apiName: api,\n revealedApiKey,\n }: {\n request: APIKey;\n apiName: string;\n revealedApiKey?: string;\n }) => {\n const [selectedLanguage, setSelectedLanguage] = useState(0);\n const hostname = request.status?.apiHostname || `${api}.apps.example.com`;\n\n // use revealed key if available, otherwise show placeholder\n const displayApiKey = revealedApiKey || \"<your-api-key>\";\n\n // Generate code snippets based on authScheme credentials\n const credentials = request.status?.authScheme?.credentials;\n const snippets = generateAuthCodeSnippets(credentials, hostname, displayApiKey);\n\n return (\n <Box\n p={3}\n bgcolor=\"background.default\"\n onClick={(e) => e.stopPropagation()}\n >\n {request.spec.useCase && (\n <Box mb={3}>\n <Typography variant=\"h6\" gutterBottom>\n Use Case\n </Typography>\n <Box\n p={2}\n bgcolor=\"background.paper\"\n borderRadius={1}\n border=\"1px solid rgba(0, 0, 0, 0.12)\"\n >\n <Typography\n variant=\"body2\"\n style={{\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n overflowWrap: \"break-word\",\n }}\n >\n {request.spec.useCase}\n </Typography>\n </Box>\n </Box>\n )}\n <Typography variant=\"h6\" gutterBottom>\n Usage Examples\n </Typography>\n <Typography variant=\"body2\" paragraph>\n Use these code examples to test the API with your{\" \"}\n {request.spec.planTier} tier key.\n </Typography>\n <Box onClick={(e) => e.stopPropagation()}>\n <Tabs\n value={selectedLanguage}\n onChange={(e, newValue) => {\n e.stopPropagation();\n setSelectedLanguage(newValue);\n }}\n indicatorColor=\"primary\"\n >\n <Tab label=\"cURL\" onClick={(e) => e.stopPropagation()} />\n <Tab label=\"Node.js\" onClick={(e) => e.stopPropagation()} />\n <Tab label=\"Python\" onClick={(e) => e.stopPropagation()} />\n <Tab label=\"Go\" onClick={(e) => e.stopPropagation()} />\n </Tabs>\n </Box>\n <Box mt={2}>\n {selectedLanguage === 0 && (\n <CodeSnippet\n text={snippets.curl}\n language=\"bash\"\n showCopyCodeButton\n />\n )}\n {selectedLanguage === 1 && (\n <CodeSnippet\n text={snippets.nodejs}\n language=\"javascript\"\n showCopyCodeButton\n />\n )}\n {selectedLanguage === 2 && (\n <CodeSnippet\n text={snippets.python}\n language=\"python\"\n showCopyCodeButton\n />\n )}\n {selectedLanguage === 3 && (\n <CodeSnippet\n text={snippets.go}\n language=\"go\"\n showCopyCodeButton\n />\n )}\n </Box>\n </Box>\n );\n };\n\n const loading =\n requestsLoading ||\n plansLoading ||\n createRequestPermissionLoading ||\n deleteOwnPermissionLoading ||\n deleteAllPermissionLoading ||\n updateRequestPermissionLoading;\n const error = requestsError || plansError;\n const permissionError =\n createRequestPermissionError ||\n deleteOwnPermissionError ||\n deleteAllPermissionError ||\n updateRequestPermissionError;\n\n if (loading) {\n return <Progress />;\n }\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n if (permissionError) {\n const failedPermission = createRequestPermissionError\n ? \"kuadrant.apikey.create\"\n : deleteOwnPermissionError\n ? \"kuadrant.apikey.delete.own\"\n : deleteAllPermissionError\n ? \"kuadrant.apikey.delete.all\"\n : updateRequestPermissionError\n ? \"kuadrant.apikey.update.own\"\n : \"unknown\";\n return (\n <Box p={2}>\n <Typography color=\"error\">\n Unable to check permissions: {permissionError.message}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Permission: {failedPermission}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Please try again or contact your administrator\n </Typography>\n </Box>\n );\n }\n\n const myRequests = ((requests || []) as APIKey[]).filter(\n (r) => !optimisticallyDeleted.has(r.metadata.name),\n );\n const plans = (apiProduct?.status?.discoveredPlans || []) as Plan[];\n\n const pendingRequests = myRequests.filter(\n (r) => !r.status?.phase || r.status.phase === \"Pending\",\n );\n const approvedRequests = myRequests.filter(\n (r) => r.status?.phase === \"Approved\",\n );\n const rejectedRequests = myRequests.filter(\n (r) => r.status?.phase === \"Rejected\",\n );\n\n const approvedColumns: TableColumn<APIKey>[] = [\n {\n title: \"Tier\",\n field: \"spec.planTier\",\n render: (row: APIKey) => (\n <Chip label={row.spec.planTier} color=\"primary\" size=\"small\" />\n ),\n },\n {\n title: \"Approved\",\n field: \"status.reviewedAt\",\n render: (row: APIKey) => (\n <Typography variant=\"body2\">\n {row.status?.reviewedAt\n ? new Date(row.status.reviewedAt).toLocaleDateString()\n : \"-\"}\n </Typography>\n ),\n },\n {\n title: \"API Key\",\n field: \"status.secretRef\",\n searchable: false,\n filtering: false,\n render: (row: APIKey) => {\n const key = `${row.metadata.namespace}/${row.metadata.name}`;\n const isVisible = visibleKeys.has(row.metadata.name);\n const isLoading = apiKeyLoading.has(key);\n const apiKeyValue = apiKeyValues.get(key);\n const hasSecretRef = row.status?.secretRef?.name;\n const canReadSecret = row.status?.canReadSecret !== false;\n const isAlreadyRead = alreadyReadKeys.has(key) || !canReadSecret;\n\n if (!hasSecretRef) {\n return (\n <Typography variant=\"body2\" color=\"textSecondary\">\n Awaiting secret...\n </Typography>\n );\n }\n\n // key has already been viewed and cannot be retrieved again\n if (isAlreadyRead && !apiKeyValue) {\n return (\n <Tooltip title=\"This API key has already been viewed and cannot be retrieved again\">\n <Box display=\"flex\" alignItems=\"center\">\n <Typography\n variant=\"body2\"\n color=\"textSecondary\"\n style={{ fontFamily: \"monospace\", marginRight: 8 }}\n >\n Already viewed\n </Typography>\n <VisibilityOffIcon fontSize=\"small\" color=\"disabled\" />\n </Box>\n </Tooltip>\n );\n }\n\n const handleRevealClick = () => {\n if (isVisible) {\n // hiding - clear the value from memory\n clearApiKeyValue(row.metadata.namespace, row.metadata.name);\n toggleVisibility(row.metadata.name);\n } else if (!isAlreadyRead) {\n // show warning dialog before first reveal\n setPendingKeyReveal({\n namespace: row.metadata.namespace,\n name: row.metadata.name,\n });\n setShowOnceWarningOpen(true);\n }\n };\n\n const handleCopy = async () => {\n if (apiKeyValue) {\n await navigator.clipboard.writeText(apiKeyValue);\n alertApi.post({\n message: \"API key copied to clipboard\",\n severity: \"success\",\n display: \"transient\",\n });\n }\n };\n\n return (\n <Box display=\"flex\" alignItems=\"center\">\n <Typography\n variant=\"body2\"\n style={{\n fontFamily: \"monospace\",\n marginRight: 8,\n }}\n >\n {isLoading\n ? \"Loading...\"\n : isVisible && apiKeyValue\n ? apiKeyValue\n : \"••••••••••••••••\"}\n </Typography>\n {isVisible && apiKeyValue && (\n <Tooltip title=\"Copy to clipboard\">\n <IconButton size=\"small\" onClick={handleCopy}>\n <FileCopyIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n <Tooltip\n title={\n isVisible ? \"Hide API key\" : \"Reveal API key (one-time only)\"\n }\n >\n <span>\n <IconButton\n size=\"small\"\n onClick={handleRevealClick}\n disabled={isLoading || (isAlreadyRead && !apiKeyValue)}\n >\n {isVisible ? <VisibilityOffIcon /> : <VisibilityIcon />}\n </IconButton>\n </span>\n </Tooltip>\n </Box>\n );\n },\n },\n {\n title: \"\",\n field: \"actions\",\n searchable: false,\n filtering: false,\n render: (row: APIKey) => {\n const isDeleting = deleting === row.metadata.name;\n if (isDeleting) {\n return <CircularProgress size={20} />;\n }\n const ownerId = row.spec.requestedBy.userId;\n const canDelete = canDeleteResource(\n ownerId,\n userId,\n canDeleteOwnKey,\n canDeleteAllKeys,\n );\n if (!canDelete) return null;\n return (\n <IconButton\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n const rect = e.currentTarget.getBoundingClientRect();\n setMenuAnchor({ top: rect.bottom, left: rect.left });\n setMenuRequest(row);\n }}\n title=\"Actions\"\n aria-controls={menuAnchor ? \"actions-menu\" : undefined}\n aria-haspopup=\"true\"\n >\n <MoreVertIcon />\n </IconButton>\n );\n },\n },\n ];\n\n const requestColumns: TableColumn<APIKey>[] = [\n {\n title: \"Status\",\n field: \"status.phase\",\n render: (row: APIKey) => {\n const phase = row.status?.phase || \"Pending\";\n const isPending = phase === \"Pending\";\n return (\n <Chip\n label={phase}\n size=\"small\"\n icon={isPending ? <HourglassEmptyIcon /> : <CancelIcon />}\n color={isPending ? \"default\" : \"secondary\"}\n />\n );\n },\n },\n {\n title: \"Tier\",\n field: \"spec.planTier\",\n render: (row: APIKey) => (\n <Chip label={row.spec.planTier} color=\"primary\" size=\"small\" />\n ),\n },\n {\n title: \"Use Case\",\n field: \"spec.useCase\",\n render: (row: APIKey) => {\n if (!row.spec.useCase) {\n return <Typography variant=\"body2\">-</Typography>;\n }\n return (\n <Tooltip title={row.spec.useCase} placement=\"top\">\n <Typography\n variant=\"body2\"\n style={{\n maxWidth: \"200px\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {row.spec.useCase}\n </Typography>\n </Tooltip>\n );\n },\n },\n {\n title: \"Requested\",\n field: \"metadata.creationTimestamp\",\n render: (row: APIKey) => (\n <Typography variant=\"body2\">\n {row.metadata.creationTimestamp\n ? new Date(row.metadata.creationTimestamp).toLocaleDateString()\n : \"-\"}\n </Typography>\n ),\n },\n {\n title: \"Reviewed\",\n field: \"status.reviewedAt\",\n render: (row: APIKey) => {\n if (!row.status?.reviewedAt)\n return <Typography variant=\"body2\">-</Typography>;\n return (\n <Typography variant=\"body2\">\n {new Date(row.status.reviewedAt).toLocaleDateString()}\n </Typography>\n );\n },\n },\n {\n title: \"\",\n field: \"actions\",\n searchable: false,\n filtering: false,\n render: (row: APIKey) => {\n const isDeleting = deleting === row.metadata.name;\n if (isDeleting) {\n return <CircularProgress size={20} />;\n }\n const isPending = !row.status?.phase || row.status.phase === \"Pending\";\n const ownerId = row.spec.requestedBy.userId;\n const canDelete = canDeleteResource(\n ownerId,\n userId,\n canDeleteOwnKey,\n canDeleteAllKeys,\n );\n const canEdit = canUpdateRequest && ownerId === userId;\n if (!isPending || (!canEdit && !canDelete)) return null;\n return (\n <IconButton\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n const rect = e.currentTarget.getBoundingClientRect();\n setMenuAnchor({ top: rect.bottom, left: rect.left });\n setMenuRequest(row);\n }}\n title=\"Actions\"\n aria-controls={menuAnchor ? \"actions-menu\" : undefined}\n aria-haspopup=\"true\"\n >\n <MoreVertIcon />\n </IconButton>\n );\n },\n },\n ];\n\n // Filter columns for pending requests (no Reviewed or Reason)\n const pendingRequestColumns = requestColumns.filter(\n (col) => col.title !== \"Reviewed\" && col.title !== \"Reason\",\n );\n\n return (\n <Box p={2}>\n <Grid container spacing={3} direction=\"column\">\n {canCreateRequest && (\n <Grid item>\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"flex-end\"\n mb={2}\n >\n <Button\n variant=\"contained\"\n color=\"primary\"\n startIcon={<AddIcon />}\n onClick={() => setRequestDialogOpen(true)}\n disabled={plans.length === 0}\n data-testid=\"request-api-access-button\"\n data-plans-count={plans.length}\n >\n Request API Access\n </Button>\n {plans.length === 0 && (\n <Typography\n variant=\"caption\"\n color=\"textSecondary\"\n style={{ marginTop: 4 }}\n data-testid=\"no-plans-message\"\n >\n {!apiProduct\n ? \"API product not found\"\n : (() => {\n const readyCondition =\n apiProduct.status?.conditions?.find(\n (c: any) => c.type === \"Ready\",\n );\n const planCondition =\n apiProduct.status?.conditions?.find(\n (c: any) => c.type === \"PlanPolicyDiscovered\",\n );\n\n if (readyCondition?.status !== \"True\") {\n return `HTTPRoute not ready: ${readyCondition?.message || \"unknown\"}`;\n }\n if (planCondition?.status !== \"True\") {\n return `No plans discovered: ${planCondition?.message || \"no PlanPolicy found\"}`;\n }\n return \"No plans available\";\n })()}\n </Typography>\n )}\n </Box>\n </Grid>\n )}\n {pendingRequests.length === 0 &&\n rejectedRequests.length === 0 &&\n approvedRequests.length === 0 && (\n <Grid item>\n <Box p={3} textAlign=\"center\">\n <Typography variant=\"body1\" color=\"textSecondary\">\n No API keys yet. Request access to get started.\n </Typography>\n </Box>\n </Grid>\n )}\n {pendingRequests.length > 0 && (\n <Grid item>\n <Table\n title=\"Pending Requests\"\n options={{\n paging: pendingRequests.length > 5,\n pageSize: 20,\n search: true,\n filtering: true,\n debounceInterval: 300,\n toolbar: true,\n emptyRowsWhenPaging: false,\n }}\n columns={pendingRequestColumns}\n data={pendingRequests}\n />\n </Grid>\n )}\n {rejectedRequests.length > 0 && (\n <Grid item>\n <Table\n title=\"Rejected Requests\"\n options={{\n paging: rejectedRequests.length > 5,\n pageSize: 20,\n search: true,\n filtering: true,\n debounceInterval: 300,\n toolbar: true,\n emptyRowsWhenPaging: false,\n }}\n columns={requestColumns}\n data={rejectedRequests}\n />\n </Grid>\n )}\n {approvedRequests.length > 0 && (\n <Grid item>\n <Table\n key=\"api-keys-table\"\n title=\"API Keys\"\n options={{\n paging: approvedRequests.length > 5,\n pageSize: 20,\n search: true,\n filtering: true,\n debounceInterval: 300,\n toolbar: true,\n emptyRowsWhenPaging: false,\n }}\n columns={approvedColumns}\n data={approvedRequests}\n detailPanel={detailPanelConfig}\n />\n </Grid>\n )}\n </Grid>\n\n <RequestAccessDialog\n open={requestDialogOpen}\n onClose={() => setRequestDialogOpen(false)}\n onSuccess={() => {\n setRequestDialogOpen(false);\n setRefresh((r) => r + 1);\n }}\n apiProductName={apiProductName}\n namespace={namespace}\n userEmail={userEmail}\n plans={plans}\n />\n\n <Menu\n id=\"actions-menu\"\n open={Boolean(menuAnchor)}\n onClose={handleMenuClose}\n anchorReference=\"anchorPosition\"\n anchorPosition={menuAnchor || { top: 0, left: 0 }}\n >\n {menuRequest &&\n (() => {\n const isPending =\n !menuRequest.status?.phase ||\n menuRequest.status.phase === \"Pending\";\n const ownerId = menuRequest.spec.requestedBy.userId;\n const canEdit = canUpdateRequest && ownerId === userId && isPending;\n\n const items = [];\n if (canEdit) {\n items.push(\n <MenuItem key=\"edit\" onClick={handleMenuEdit}>\n Edit\n </MenuItem>,\n );\n }\n items.push(\n <MenuItem key=\"delete\" onClick={handleMenuDeleteClick}>\n Delete\n </MenuItem>,\n );\n return items;\n })()}\n </Menu>\n\n {requestToEdit && (\n <EditAPIKeyDialog\n open={editDialogOpen}\n onClose={() => {\n setEditDialogOpen(false);\n setRequestToEdit(null);\n }}\n onSuccess={handleEditSuccess}\n request={requestToEdit}\n availablePlans={plans}\n />\n )}\n\n <ConfirmDeleteDialog\n open={deleteDialogState.open}\n title=\"Delete Request\"\n description={`Are you sure you want to delete this ${deleteDialogState.request?.status?.phase === \"Approved\" ? \"API key\" : \"request\"}?`}\n deleting={deleting !== null}\n onConfirm={handleDeleteConfirm}\n onCancel={handleDeleteCancel}\n />\n\n <Dialog\n open={showOnceWarningOpen}\n onClose={() => {\n setShowOnceWarningOpen(false);\n setPendingKeyReveal(null);\n }}\n maxWidth=\"sm\"\n >\n <DialogTitle>\n <Box display=\"flex\" alignItems=\"center\">\n <WarningIcon color=\"primary\" style={{ marginRight: 8 }} />\n View API Key\n </Box>\n </DialogTitle>\n <DialogContent>\n <Typography variant=\"body1\" paragraph>\n This API key can only be viewed <strong>once</strong>. After you\n reveal it, you will not be able to retrieve it again.\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Make sure to copy and store it securely before closing this view.\n </Typography>\n </DialogContent>\n <DialogActions>\n <Button\n onClick={() => {\n setShowOnceWarningOpen(false);\n setPendingKeyReveal(null);\n }}\n >\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={() => {\n if (pendingKeyReveal) {\n fetchApiKeyFromSecret(\n pendingKeyReveal.namespace,\n pendingKeyReveal.name,\n );\n toggleVisibility(pendingKeyReveal.name);\n }\n setShowOnceWarningOpen(false);\n setPendingKeyReveal(null);\n }}\n >\n Reveal API Key\n </Button>\n </DialogActions>\n </Dialog>\n </Box>\n );\n};\n"],"names":["error"],"mappings":"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"}
1
+ {"version":3,"file":"ApiKeyManagementTab.esm.js","sources":["../../../src/components/ApiKeyManagementTab/ApiKeyManagementTab.tsx"],"sourcesContent":["import React, { useState, useMemo } from \"react\";\nimport { useAsync } from \"react-use\";\nimport {\n Table,\n TableColumn,\n Progress,\n ResponseErrorPanel,\n CodeSnippet,\n} from \"@backstage/core-components\";\nimport {\n IconButton,\n Typography,\n Box,\n Chip,\n Grid,\n Button,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Tabs,\n Tab,\n Menu,\n MenuItem,\n Tooltip,\n CircularProgress,\n} from \"@material-ui/core\";\nimport {\n useApi,\n identityApiRef,\n alertApiRef,\n} from \"@backstage/core-plugin-api\";\nimport { kuadrantApiRef } from '../../api';\nimport { useEntity } from \"@backstage/plugin-catalog-react\";\nimport VisibilityIcon from \"@material-ui/icons/Visibility\";\nimport VisibilityOffIcon from \"@material-ui/icons/VisibilityOff\";\nimport HourglassEmptyIcon from \"@material-ui/icons/HourglassEmpty\";\nimport CancelIcon from \"@material-ui/icons/Cancel\";\nimport AddIcon from \"@material-ui/icons/Add\";\nimport MoreVertIcon from \"@material-ui/icons/MoreVert\";\nimport FileCopyIcon from \"@material-ui/icons/FileCopy\";\nimport WarningIcon from \"@material-ui/icons/Warning\";\nimport {APIKey, APIProduct, PlanPolicyPlan} from \"../../types/api-management\";\nimport {\n kuadrantApiKeyCreatePermission,\n kuadrantApiKeyDeleteOwnPermission,\n kuadrantApiKeyDeleteAllPermission,\n kuadrantApiKeyUpdateOwnPermission,\n} from \"../../permissions\";\nimport {\n useKuadrantPermission,\n canDeleteResource,\n} from \"../../utils/permissions\";\nimport { EditAPIKeyDialog } from \"../EditAPIKeyDialog\";\nimport { ConfirmDeleteDialog } from \"../ConfirmDeleteDialog\";\nimport { generateAuthCodeSnippets } from \"../../utils/codeSnippets\";\nimport { RequestAccessDialog } from \"../RequestAccessDialog\";\n\nexport interface ApiKeyManagementTabProps {\n namespace?: string;\n}\n\nexport const ApiKeyManagementTab = ({\n namespace: propNamespace,\n}: ApiKeyManagementTabProps) => {\n const { entity } = useEntity();\n const kuadrantApi = useApi(kuadrantApiRef);\n const identityApi = useApi(identityApiRef);\n const alertApi = useApi(alertApiRef);\n const [visibleKeys, setVisibleKeys] = useState<Set<string>>(new Set());\n const [refresh, setRefresh] = useState(0);\n const [userId, setUserId] = useState<string>(\"\");\n const [userEmail, setUserEmail] = useState<string>(\"\");\n const [requestDialogOpen, setRequestDialogOpen] = useState(false);\n const [editDialogOpen, setEditDialogOpen] = useState(false);\n const [requestToEdit, setRequestToEdit] = useState<APIKey | null>(null);\n const [menuAnchor, setMenuAnchor] = useState<{\n top: number;\n left: number;\n } | null>(null);\n const [menuRequest, setMenuRequest] = useState<APIKey | null>(null);\n const [deleting, setDeleting] = useState<string | null>(null);\n const [optimisticallyDeleted, setOptimisticallyDeleted] = useState<\n Set<string>\n >(new Set());\n const [deleteDialogState, setDeleteDialogState] = useState<{\n open: boolean;\n request: APIKey | null;\n }>({ open: false, request: null });\n const [apiKeyValues, setApiKeyValues] = useState<Map<string, string>>(\n new Map(),\n );\n const [apiKeyLoading, setApiKeyLoading] = useState<Set<string>>(new Set());\n const [alreadyReadKeys, setAlreadyReadKeys] = useState<Set<string>>(\n new Set(),\n );\n const [showOnceWarningOpen, setShowOnceWarningOpen] = useState(false);\n const [pendingKeyReveal, setPendingKeyReveal] = useState<{\n namespace: string;\n name: string;\n } | null>(null);\n\n // get apiproduct name from entity annotation (set by entity provider)\n const apiProductName =\n entity.metadata.annotations?.[\"kuadrant.io/apiproduct\"] ||\n entity.metadata.name;\n const namespace =\n entity.metadata.annotations?.[\"kuadrant.io/namespace\"] ||\n propNamespace ||\n \"default\";\n\n useAsync(async () => {\n const identity = await identityApi.getBackstageIdentity();\n const profile = await identityApi.getProfileInfo();\n setUserId(identity.userEntityRef);\n setUserEmail(profile.email || \"\");\n }, [identityApi]);\n\n const {\n value: requests,\n loading: requestsLoading,\n error: requestsError,\n } = useAsync(async () => {\n const data = await kuadrantApi.getRequestsByNamespace(namespace);\n // filter by apiproduct name, not httproute name\n return (data.items || []).filter(\n (r: APIKey) =>\n r.spec.apiProductRef.name === apiProductName &&\n r.metadata.namespace === namespace, // APIProducts and APIKeys (and its Secret) will be in the same NS\n );\n }, [apiProductName, namespace, refresh, kuadrantApi]);\n\n const {\n value: apiProduct,\n loading: plansLoading,\n error: plansError,\n } = useAsync(async () => {\n const data = await kuadrantApi.getApiProducts();\n\n const product = data.items?.find(\n (p: APIProduct) =>\n p.metadata.namespace === namespace &&\n p.metadata.name === apiProductName,\n );\n\n return product;\n }, [namespace, apiProductName, kuadrantApi]);\n\n // check permissions with resource reference once we have the apiproduct\n const resourceRef = apiProduct\n ? `apiproduct:${apiProduct.metadata.namespace}/${apiProduct.metadata.name}`\n : undefined;\n\n const {\n allowed: canCreateRequest,\n loading: createRequestPermissionLoading,\n error: createRequestPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyCreatePermission, resourceRef);\n\n const {\n allowed: canDeleteOwnKey,\n loading: deleteOwnPermissionLoading,\n error: deleteOwnPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyDeleteOwnPermission);\n\n const {\n allowed: canDeleteAllKeys,\n loading: deleteAllPermissionLoading,\n error: deleteAllPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyDeleteAllPermission);\n\n const {\n allowed: canUpdateRequest,\n loading: updateRequestPermissionLoading,\n error: updateRequestPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyUpdateOwnPermission);\n\n const handleDeleteRequest = async (name: string) => {\n // optimistic update - remove from UI immediately\n setOptimisticallyDeleted((prev) => new Set(prev).add(name));\n setDeleting(name);\n try {\n await kuadrantApi.deleteRequest(namespace, name);\n alertApi.post({\n message: \"API key deleted successfully\",\n severity: \"success\",\n display: \"transient\",\n });\n setRefresh((r) => r + 1);\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"unknown error occurred\";\n // rollback optimistic update on error\n setOptimisticallyDeleted((prev) => {\n const next = new Set(prev);\n next.delete(name);\n return next;\n });\n alertApi.post({\n message: `Failed to delete API key: ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\n } finally {\n setDeleting(null);\n }\n };\n\n const fetchApiKeyFromSecret = async (\n requestNamespace: string,\n requestName: string,\n ) => {\n const key = `${requestNamespace}/${requestName}`;\n if (apiKeyLoading.has(key)) {\n return;\n }\n\n setApiKeyLoading((prev) => new Set(prev).add(key));\n try {\n const data = await kuadrantApi.getApiKeySecret(requestNamespace, requestName);\n setApiKeyValues((prev) => new Map(prev).set(key, data.apiKey));\n // after successful read, mark as already read (show-once behaviour)\n setAlreadyReadKeys((prev) => new Set(prev).add(key));\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"unknown error occurred\";\n if (errorMessage.includes(\"403\") || errorMessage.includes(\"already been viewed\")) {\n // secret has already been read\n setAlreadyReadKeys((prev) => new Set(prev).add(key));\n alertApi.post({\n message:\n \"This API key has already been viewed and cannot be retrieved again.\",\n severity: \"warning\",\n display: \"transient\",\n });\n } else {\n alertApi.post({\n message: `Failed to fetch api key: ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\n }\n } finally {\n setApiKeyLoading((prev) => {\n const next = new Set(prev);\n next.delete(key);\n return next;\n });\n }\n };\n\n const clearApiKeyValue = (requestNamespace: string, requestName: string) => {\n const key = `${requestNamespace}/${requestName}`;\n setApiKeyValues((prev) => {\n const next = new Map(prev);\n next.delete(key);\n return next;\n });\n };\n\n const handleEditRequest = (request: APIKey) => {\n setRequestToEdit(request);\n setEditDialogOpen(true);\n };\n\n const handleEditSuccess = () => {\n setRefresh((r) => r + 1);\n setEditDialogOpen(false);\n alertApi.post({\n message: \"API key updated\",\n severity: \"success\",\n display: \"transient\",\n });\n setRequestToEdit(null);\n };\n\n const handleMenuClose = () => {\n setMenuAnchor(null);\n setMenuRequest(null);\n };\n\n const handleMenuEdit = () => {\n if (!menuRequest) return;\n handleEditRequest(menuRequest);\n handleMenuClose();\n };\n\n const handleMenuDeleteClick = () => {\n if (!menuRequest) return;\n const request = menuRequest;\n handleMenuClose();\n setDeleteDialogState({ open: true, request });\n };\n\n const handleDeleteConfirm = async () => {\n if (!deleteDialogState.request) return;\n await handleDeleteRequest(deleteDialogState.request.metadata.name);\n setDeleteDialogState({ open: false, request: null });\n };\n\n const handleDeleteCancel = () => {\n setDeleteDialogState({ open: false, request: null });\n };\n\n const toggleVisibility = (keyName: string) => {\n setVisibleKeys((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(keyName)) {\n newSet.delete(keyName);\n } else {\n newSet.add(keyName);\n }\n return newSet;\n });\n };\n\n const detailPanelConfig = useMemo(\n () => [\n {\n render: (data: any) => {\n // backstage Table wraps the data in { rowData: actualData }\n const request = data.rowData as APIKey;\n if (!request?.metadata?.name) {\n return <Box />;\n }\n\n // pass already-revealed key from parent state (don't auto-fetch - that consumes show-once)\n const key = `${request.metadata.namespace}/${request.metadata.name}`;\n const revealedKey = apiKeyValues.get(key);\n return (\n <DetailPanelContent\n request={request}\n apiName={apiProductName}\n revealedApiKey={revealedKey}\n />\n );\n },\n },\n ],\n [apiProductName, apiKeyValues],\n );\n\n // separate component to isolate state\n const DetailPanelContent = ({\n request,\n apiName: api,\n revealedApiKey,\n }: {\n request: APIKey;\n apiName: string;\n revealedApiKey?: string;\n }) => {\n const [selectedLanguage, setSelectedLanguage] = useState(0);\n const hostname = request.status?.apiHostname || `${api}.apps.example.com`;\n\n // use revealed key if available, otherwise show placeholder\n const displayApiKey = revealedApiKey || \"<your-api-key>\";\n\n // Generate code snippets based on authScheme credentials\n const credentials = request.status?.authScheme?.credentials;\n const snippets = generateAuthCodeSnippets(credentials, hostname, displayApiKey);\n\n return (\n <Box\n p={3}\n bgcolor=\"background.default\"\n onClick={(e) => e.stopPropagation()}\n >\n {request.spec.useCase && (\n <Box mb={3}>\n <Typography variant=\"h6\" gutterBottom>\n Use Case\n </Typography>\n <Box\n p={2}\n bgcolor=\"background.paper\"\n borderRadius={1}\n border=\"1px solid rgba(0, 0, 0, 0.12)\"\n >\n <Typography\n variant=\"body2\"\n style={{\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n overflowWrap: \"break-word\",\n }}\n >\n {request.spec.useCase}\n </Typography>\n </Box>\n </Box>\n )}\n <Typography variant=\"h6\" gutterBottom>\n Usage Examples\n </Typography>\n <Typography variant=\"body2\" paragraph>\n Use these code examples to test the API with your{\" \"}\n {request.spec.planTier} tier key.\n </Typography>\n <Box onClick={(e) => e.stopPropagation()}>\n <Tabs\n value={selectedLanguage}\n onChange={(e, newValue) => {\n e.stopPropagation();\n setSelectedLanguage(newValue);\n }}\n indicatorColor=\"primary\"\n >\n <Tab label=\"cURL\" onClick={(e) => e.stopPropagation()} />\n <Tab label=\"Node.js\" onClick={(e) => e.stopPropagation()} />\n <Tab label=\"Python\" onClick={(e) => e.stopPropagation()} />\n <Tab label=\"Go\" onClick={(e) => e.stopPropagation()} />\n </Tabs>\n </Box>\n <Box mt={2}>\n {selectedLanguage === 0 && (\n <CodeSnippet\n text={snippets.curl}\n language=\"bash\"\n showCopyCodeButton\n />\n )}\n {selectedLanguage === 1 && (\n <CodeSnippet\n text={snippets.nodejs}\n language=\"javascript\"\n showCopyCodeButton\n />\n )}\n {selectedLanguage === 2 && (\n <CodeSnippet\n text={snippets.python}\n language=\"python\"\n showCopyCodeButton\n />\n )}\n {selectedLanguage === 3 && (\n <CodeSnippet\n text={snippets.go}\n language=\"go\"\n showCopyCodeButton\n />\n )}\n </Box>\n </Box>\n );\n };\n\n const loading =\n requestsLoading ||\n plansLoading ||\n createRequestPermissionLoading ||\n deleteOwnPermissionLoading ||\n deleteAllPermissionLoading ||\n updateRequestPermissionLoading;\n const error = requestsError || plansError;\n const permissionError =\n createRequestPermissionError ||\n deleteOwnPermissionError ||\n deleteAllPermissionError ||\n updateRequestPermissionError;\n\n if (loading) {\n return <Progress />;\n }\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n if (permissionError) {\n const failedPermission = createRequestPermissionError\n ? \"kuadrant.apikey.create\"\n : deleteOwnPermissionError\n ? \"kuadrant.apikey.delete.own\"\n : deleteAllPermissionError\n ? \"kuadrant.apikey.delete.all\"\n : updateRequestPermissionError\n ? \"kuadrant.apikey.update.own\"\n : \"unknown\";\n return (\n <Box p={2}>\n <Typography color=\"error\">\n Unable to check permissions: {permissionError.message}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Permission: {failedPermission}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Please try again or contact your administrator\n </Typography>\n </Box>\n );\n }\n\n const myRequests = ((requests || []) as APIKey[]).filter(\n (r) => !optimisticallyDeleted.has(r.metadata.name),\n );\n const plans = (apiProduct?.status?.discoveredPlans || []) as PlanPolicyPlan[];\n\n const pendingRequests = myRequests.filter(\n (r) => !r.status?.phase || r.status.phase === \"Pending\",\n );\n const approvedRequests = myRequests.filter(\n (r) => r.status?.phase === \"Approved\",\n );\n const rejectedRequests = myRequests.filter(\n (r) => r.status?.phase === \"Rejected\",\n );\n\n const approvedColumns: TableColumn<APIKey>[] = [\n {\n title: \"Tier\",\n field: \"spec.planTier\",\n render: (row: APIKey) => (\n <Chip label={row.spec.planTier} color=\"primary\" size=\"small\" />\n ),\n },\n {\n title: \"Approved\",\n field: \"status.reviewedAt\",\n render: (row: APIKey) => (\n <Typography variant=\"body2\">\n {row.status?.reviewedAt\n ? new Date(row.status.reviewedAt).toLocaleDateString()\n : \"-\"}\n </Typography>\n ),\n },\n {\n title: \"API Key\",\n field: \"status.secretRef\",\n searchable: false,\n filtering: false,\n render: (row: APIKey) => {\n const key = `${row.metadata.namespace}/${row.metadata.name}`;\n const isVisible = visibleKeys.has(row.metadata.name);\n const isLoading = apiKeyLoading.has(key);\n const apiKeyValue = apiKeyValues.get(key);\n const hasSecretRef = row.status?.secretRef?.name;\n const canReadSecret = row.status?.canReadSecret !== false;\n const isAlreadyRead = alreadyReadKeys.has(key) || !canReadSecret;\n\n if (!hasSecretRef) {\n return (\n <Typography variant=\"body2\" color=\"textSecondary\">\n Awaiting secret...\n </Typography>\n );\n }\n\n // key has already been viewed and cannot be retrieved again\n if (isAlreadyRead && !apiKeyValue) {\n return (\n <Tooltip title=\"This API key has already been viewed and cannot be retrieved again\">\n <Box display=\"flex\" alignItems=\"center\">\n <Typography\n variant=\"body2\"\n color=\"textSecondary\"\n style={{ fontFamily: \"monospace\", marginRight: 8 }}\n >\n Already viewed\n </Typography>\n <VisibilityOffIcon fontSize=\"small\" color=\"disabled\" />\n </Box>\n </Tooltip>\n );\n }\n\n const handleRevealClick = () => {\n if (isVisible) {\n // hiding - clear the value from memory\n clearApiKeyValue(row.metadata.namespace, row.metadata.name);\n toggleVisibility(row.metadata.name);\n } else if (!isAlreadyRead) {\n // show warning dialog before first reveal\n setPendingKeyReveal({\n namespace: row.metadata.namespace,\n name: row.metadata.name,\n });\n setShowOnceWarningOpen(true);\n }\n };\n\n const handleCopy = async () => {\n if (apiKeyValue) {\n await navigator.clipboard.writeText(apiKeyValue);\n alertApi.post({\n message: \"API key copied to clipboard\",\n severity: \"success\",\n display: \"transient\",\n });\n }\n };\n\n return (\n <Box display=\"flex\" alignItems=\"center\">\n <Typography\n variant=\"body2\"\n style={{\n fontFamily: \"monospace\",\n marginRight: 8,\n }}\n >\n {isLoading\n ? \"Loading...\"\n : isVisible && apiKeyValue\n ? apiKeyValue\n : \"••••••••••••••••\"}\n </Typography>\n {isVisible && apiKeyValue && (\n <Tooltip title=\"Copy to clipboard\">\n <IconButton size=\"small\" onClick={handleCopy}>\n <FileCopyIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n <Tooltip\n title={\n isVisible ? \"Hide API key\" : \"Reveal API key (one-time only)\"\n }\n >\n <span>\n <IconButton\n size=\"small\"\n onClick={handleRevealClick}\n disabled={isLoading || (isAlreadyRead && !apiKeyValue)}\n >\n {isVisible ? <VisibilityOffIcon /> : <VisibilityIcon />}\n </IconButton>\n </span>\n </Tooltip>\n </Box>\n );\n },\n },\n {\n title: \"\",\n field: \"actions\",\n searchable: false,\n filtering: false,\n render: (row: APIKey) => {\n const isDeleting = deleting === row.metadata.name;\n if (isDeleting) {\n return <CircularProgress size={20} />;\n }\n const ownerId = row.spec.requestedBy.userId;\n const canDelete = canDeleteResource(\n ownerId,\n userId,\n canDeleteOwnKey,\n canDeleteAllKeys,\n );\n if (!canDelete) return null;\n return (\n <IconButton\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n const rect = e.currentTarget.getBoundingClientRect();\n setMenuAnchor({ top: rect.bottom, left: rect.left });\n setMenuRequest(row);\n }}\n title=\"Actions\"\n aria-controls={menuAnchor ? \"actions-menu\" : undefined}\n aria-haspopup=\"true\"\n >\n <MoreVertIcon />\n </IconButton>\n );\n },\n },\n ];\n\n const requestColumns: TableColumn<APIKey>[] = [\n {\n title: \"Status\",\n field: \"status.phase\",\n render: (row: APIKey) => {\n const phase = row.status?.phase || \"Pending\";\n const isPending = phase === \"Pending\";\n return (\n <Chip\n label={phase}\n size=\"small\"\n icon={isPending ? <HourglassEmptyIcon /> : <CancelIcon />}\n color={isPending ? \"default\" : \"secondary\"}\n />\n );\n },\n },\n {\n title: \"Tier\",\n field: \"spec.planTier\",\n render: (row: APIKey) => (\n <Chip label={row.spec.planTier} color=\"primary\" size=\"small\" />\n ),\n },\n {\n title: \"Use Case\",\n field: \"spec.useCase\",\n render: (row: APIKey) => {\n if (!row.spec.useCase) {\n return <Typography variant=\"body2\">-</Typography>;\n }\n return (\n <Tooltip title={row.spec.useCase} placement=\"top\">\n <Typography\n variant=\"body2\"\n style={{\n maxWidth: \"200px\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {row.spec.useCase}\n </Typography>\n </Tooltip>\n );\n },\n },\n {\n title: \"Requested\",\n field: \"metadata.creationTimestamp\",\n render: (row: APIKey) => (\n <Typography variant=\"body2\">\n {row.metadata.creationTimestamp\n ? new Date(row.metadata.creationTimestamp).toLocaleDateString()\n : \"-\"}\n </Typography>\n ),\n },\n {\n title: \"Reviewed\",\n field: \"status.reviewedAt\",\n render: (row: APIKey) => {\n if (!row.status?.reviewedAt)\n return <Typography variant=\"body2\">-</Typography>;\n return (\n <Typography variant=\"body2\">\n {new Date(row.status.reviewedAt).toLocaleDateString()}\n </Typography>\n );\n },\n },\n {\n title: \"\",\n field: \"actions\",\n searchable: false,\n filtering: false,\n render: (row: APIKey) => {\n const isDeleting = deleting === row.metadata.name;\n if (isDeleting) {\n return <CircularProgress size={20} />;\n }\n const isPending = !row.status?.phase || row.status.phase === \"Pending\";\n const ownerId = row.spec.requestedBy.userId;\n const canDelete = canDeleteResource(\n ownerId,\n userId,\n canDeleteOwnKey,\n canDeleteAllKeys,\n );\n const canEdit = canUpdateRequest && ownerId === userId;\n if (!isPending || (!canEdit && !canDelete)) return null;\n return (\n <IconButton\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n const rect = e.currentTarget.getBoundingClientRect();\n setMenuAnchor({ top: rect.bottom, left: rect.left });\n setMenuRequest(row);\n }}\n title=\"Actions\"\n aria-controls={menuAnchor ? \"actions-menu\" : undefined}\n aria-haspopup=\"true\"\n >\n <MoreVertIcon />\n </IconButton>\n );\n },\n },\n ];\n\n // Filter columns for pending requests (no Reviewed or Reason)\n const pendingRequestColumns = requestColumns.filter(\n (col) => col.title !== \"Reviewed\" && col.title !== \"Reason\",\n );\n\n return (\n <Box p={2}>\n <Grid container spacing={3} direction=\"column\">\n {canCreateRequest && (\n <Grid item>\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"flex-end\"\n mb={2}\n >\n <Button\n variant=\"contained\"\n color=\"primary\"\n startIcon={<AddIcon />}\n onClick={() => setRequestDialogOpen(true)}\n disabled={plans.length === 0}\n data-testid=\"request-api-access-button\"\n data-plans-count={plans.length}\n >\n Request API Access\n </Button>\n {plans.length === 0 && (\n <Typography\n variant=\"caption\"\n color=\"textSecondary\"\n style={{ marginTop: 4 }}\n data-testid=\"no-plans-message\"\n >\n {!apiProduct\n ? \"API product not found\"\n : (() => {\n const readyCondition =\n apiProduct.status?.conditions?.find(\n (c: any) => c.type === \"Ready\",\n );\n const planCondition =\n apiProduct.status?.conditions?.find(\n (c: any) => c.type === \"PlanPolicyDiscovered\",\n );\n\n if (readyCondition?.status !== \"True\") {\n return `HTTPRoute not ready: ${readyCondition?.message || \"unknown\"}`;\n }\n if (planCondition?.status !== \"True\") {\n return `No plans discovered: ${planCondition?.message || \"no PlanPolicy found\"}`;\n }\n return \"No plans available\";\n })()}\n </Typography>\n )}\n </Box>\n </Grid>\n )}\n {pendingRequests.length === 0 &&\n rejectedRequests.length === 0 &&\n approvedRequests.length === 0 && (\n <Grid item>\n <Box p={3} textAlign=\"center\">\n <Typography variant=\"body1\" color=\"textSecondary\">\n No API keys yet. Request access to get started.\n </Typography>\n </Box>\n </Grid>\n )}\n {pendingRequests.length > 0 && (\n <Grid item>\n <Table\n title=\"Pending Requests\"\n options={{\n paging: pendingRequests.length > 5,\n pageSize: 20,\n search: true,\n filtering: true,\n debounceInterval: 300,\n toolbar: true,\n emptyRowsWhenPaging: false,\n }}\n columns={pendingRequestColumns}\n data={pendingRequests}\n />\n </Grid>\n )}\n {rejectedRequests.length > 0 && (\n <Grid item>\n <Table\n title=\"Rejected Requests\"\n options={{\n paging: rejectedRequests.length > 5,\n pageSize: 20,\n search: true,\n filtering: true,\n debounceInterval: 300,\n toolbar: true,\n emptyRowsWhenPaging: false,\n }}\n columns={requestColumns}\n data={rejectedRequests}\n />\n </Grid>\n )}\n {approvedRequests.length > 0 && (\n <Grid item>\n <Table\n key=\"api-keys-table\"\n title=\"API Keys\"\n options={{\n paging: approvedRequests.length > 5,\n pageSize: 20,\n search: true,\n filtering: true,\n debounceInterval: 300,\n toolbar: true,\n emptyRowsWhenPaging: false,\n }}\n columns={approvedColumns}\n data={approvedRequests}\n detailPanel={detailPanelConfig}\n />\n </Grid>\n )}\n </Grid>\n\n <RequestAccessDialog\n open={requestDialogOpen}\n onClose={() => setRequestDialogOpen(false)}\n onSuccess={() => {\n setRequestDialogOpen(false);\n setRefresh((r) => r + 1);\n }}\n apiProductName={apiProductName}\n namespace={namespace}\n userEmail={userEmail}\n plans={plans}\n />\n\n <Menu\n id=\"actions-menu\"\n open={Boolean(menuAnchor)}\n onClose={handleMenuClose}\n anchorReference=\"anchorPosition\"\n anchorPosition={menuAnchor || { top: 0, left: 0 }}\n >\n {menuRequest &&\n (() => {\n const isPending =\n !menuRequest.status?.phase ||\n menuRequest.status.phase === \"Pending\";\n const ownerId = menuRequest.spec.requestedBy.userId;\n const canEdit = canUpdateRequest && ownerId === userId && isPending;\n\n const items = [];\n if (canEdit) {\n items.push(\n <MenuItem key=\"edit\" onClick={handleMenuEdit}>\n Edit\n </MenuItem>,\n );\n }\n items.push(\n <MenuItem key=\"delete\" onClick={handleMenuDeleteClick}>\n Delete\n </MenuItem>,\n );\n return items;\n })()}\n </Menu>\n\n {requestToEdit && (\n <EditAPIKeyDialog\n open={editDialogOpen}\n onClose={() => {\n setEditDialogOpen(false);\n setRequestToEdit(null);\n }}\n onSuccess={handleEditSuccess}\n request={requestToEdit}\n availablePlans={plans}\n />\n )}\n\n <ConfirmDeleteDialog\n open={deleteDialogState.open}\n title=\"Delete Request\"\n description={`Are you sure you want to delete this ${deleteDialogState.request?.status?.phase === \"Approved\" ? \"API key\" : \"request\"}?`}\n deleting={deleting !== null}\n onConfirm={handleDeleteConfirm}\n onCancel={handleDeleteCancel}\n />\n\n <Dialog\n open={showOnceWarningOpen}\n onClose={() => {\n setShowOnceWarningOpen(false);\n setPendingKeyReveal(null);\n }}\n maxWidth=\"sm\"\n >\n <DialogTitle>\n <Box display=\"flex\" alignItems=\"center\">\n <WarningIcon color=\"primary\" style={{ marginRight: 8 }} />\n View API Key\n </Box>\n </DialogTitle>\n <DialogContent>\n <Typography variant=\"body1\" paragraph>\n This API key can only be viewed <strong>once</strong>. After you\n reveal it, you will not be able to retrieve it again.\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Make sure to copy and store it securely before closing this view.\n </Typography>\n </DialogContent>\n <DialogActions>\n <Button\n onClick={() => {\n setShowOnceWarningOpen(false);\n setPendingKeyReveal(null);\n }}\n >\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={() => {\n if (pendingKeyReveal) {\n fetchApiKeyFromSecret(\n pendingKeyReveal.namespace,\n pendingKeyReveal.name,\n );\n toggleVisibility(pendingKeyReveal.name);\n }\n setShowOnceWarningOpen(false);\n setPendingKeyReveal(null);\n }}\n >\n Reveal API Key\n </Button>\n </DialogActions>\n </Dialog>\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import React, { useState } from 'react';
2
2
  import { useParams, useNavigate } from 'react-router-dom';
3
- import { useApi, configApiRef, fetchApiRef, alertApiRef } from '@backstage/core-plugin-api';
3
+ import { useApi, alertApiRef } from '@backstage/core-plugin-api';
4
+ import { kuadrantApiRef } from '../../api.esm.js';
4
5
  import { useAsync } from 'react-use';
5
6
  import { Progress, ResponseErrorPanel, Page, Header, Link, Content, Breadcrumbs, InfoCard } from '@backstage/core-components';
6
7
  import { OpenApiDefinitionWidget } from '@backstage/plugin-api-docs';
@@ -8,13 +9,13 @@ import { makeStyles, Box, Button, Tooltip, IconButton, Typography, Tabs, Tab, Gr
8
9
  import ArrowBackIcon from '@material-ui/icons/ArrowBack';
9
10
  import EditIcon from '@material-ui/icons/Edit';
10
11
  import DeleteIcon from '@material-ui/icons/Delete';
12
+ import { Alert } from '@material-ui/lab';
11
13
  import { EditAPIProductDialog } from '../EditAPIProductDialog/EditAPIProductDialog.esm.js';
12
14
  import { ConfirmDeleteDialog } from '../ConfirmDeleteDialog/ConfirmDeleteDialog.esm.js';
13
15
  import { ApiProductDetails } from '../ApiProductDetails/ApiProductDetails.esm.js';
14
16
  import { OidcProviderCard } from '../OidcProviderCard/OidcProviderCard.esm.js';
15
17
  import { useKuadrantPermission } from '../../utils/permissions.esm.js';
16
18
  import { kuadrantApiProductUpdateAllPermission, kuadrantApiProductDeleteAllPermission } from '../../permissions.esm.js';
17
- import { handleFetchError } from '../../utils/errors.esm.js';
18
19
 
19
20
  const useStyles = makeStyles((theme) => ({
20
21
  label: {
@@ -45,10 +46,8 @@ const ApiProductDetailPage = () => {
45
46
  const classes = useStyles();
46
47
  const { namespace, name } = useParams();
47
48
  const navigate = useNavigate();
48
- const config = useApi(configApiRef);
49
- const fetchApi = useApi(fetchApiRef);
49
+ const kuadrantApi = useApi(kuadrantApiRef);
50
50
  const alertApi = useApi(alertApiRef);
51
- const backendUrl = config.getString("backend.baseUrl");
52
51
  const [selectedTab, setSelectedTab] = useState(0);
53
52
  const [editDialogOpen, setEditDialogOpen] = useState(false);
54
53
  const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);
@@ -62,31 +61,30 @@ const ApiProductDetailPage = () => {
62
61
  loading,
63
62
  error
64
63
  } = useAsync(async () => {
65
- const response = await fetchApi.fetch(
66
- `${backendUrl}/api/kuadrant/apiproducts/${namespace}/${name}`
67
- );
68
- if (!response.ok) {
69
- const err = await handleFetchError(response);
70
- throw new Error(`Failed to fetch API product. ${err}`);
64
+ return await kuadrantApi.getApiProduct(namespace, name);
65
+ }, [namespace, name, kuadrantApi, refreshKey]);
66
+ const { value: httpRouteHostnames } = useAsync(async () => {
67
+ if (!product?.spec?.targetRef?.name) {
68
+ return null;
71
69
  }
72
- return response.json();
73
- }, [namespace, name, backendUrl, fetchApi, refreshKey]);
70
+ const routeName = product.spec.targetRef.name;
71
+ const route = await kuadrantApi.getHttpRoute(namespace, routeName);
72
+ return route?.spec?.hostnames || null;
73
+ }, [product, namespace, kuadrantApi]);
74
74
  const handlePublishToggle = async () => {
75
75
  if (!product) return;
76
76
  const newStatus = product.spec?.publishStatus === "Published" ? "Draft" : "Published";
77
+ const lifecycle = product.metadata.labels?.lifecycle;
78
+ if (newStatus === "Published" && lifecycle === "retired") {
79
+ alertApi.post({
80
+ message: `Cannot publish a retired API product. Please change the lifecycle status first.`,
81
+ severity: "error",
82
+ display: "transient"
83
+ });
84
+ return;
85
+ }
77
86
  try {
78
- const response = await fetchApi.fetch(
79
- `${backendUrl}/api/kuadrant/apiproducts/${namespace}/${name}`,
80
- {
81
- method: "PATCH",
82
- headers: { "Content-Type": "application/json" },
83
- body: JSON.stringify({ spec: { publishStatus: newStatus } })
84
- }
85
- );
86
- if (!response.ok) {
87
- const err = await handleFetchError(response);
88
- throw new Error(err);
89
- }
87
+ await kuadrantApi.updateApiProduct(namespace, name, { spec: { publishStatus: newStatus } });
90
88
  alertApi.post({
91
89
  message: `API Product ${newStatus === "Published" ? "published" : "unpublished"} successfully`,
92
90
  severity: "success",
@@ -115,14 +113,7 @@ const ApiProductDetailPage = () => {
115
113
  if (!product) return;
116
114
  setDeleting(true);
117
115
  try {
118
- const response = await fetchApi.fetch(
119
- `${backendUrl}/api/kuadrant/apiproducts/${namespace}/${name}`,
120
- { method: "DELETE" }
121
- );
122
- if (!response.ok) {
123
- const err = await handleFetchError(response);
124
- throw new Error(err);
125
- }
116
+ await kuadrantApi.deleteApiProduct(namespace, name);
126
117
  setDeleteDialogOpen(false);
127
118
  alertApi.post({
128
119
  message: "API Product deleted successfully",
@@ -193,7 +184,7 @@ const ApiProductDetailPage = () => {
193
184
  },
194
185
  isPublished ? "Unpublish API product" : "Publish API product"
195
186
  ), canUpdateApiProduct && /* @__PURE__ */ React.createElement(Tooltip, { title: "Edit" }, /* @__PURE__ */ React.createElement(IconButton, { onClick: () => setEditDialogOpen(true), size: "small" }, /* @__PURE__ */ React.createElement(EditIcon, null))), canDeleteApiProduct && /* @__PURE__ */ React.createElement(Tooltip, { title: "Delete" }, /* @__PURE__ */ React.createElement(IconButton, { onClick: () => setDeleteDialogOpen(true), size: "small" }, /* @__PURE__ */ React.createElement(DeleteIcon, null))))
196
- ), /* @__PURE__ */ React.createElement(Content, null, /* @__PURE__ */ React.createElement(Box, { mb: 2 }, /* @__PURE__ */ React.createElement(Breadcrumbs, { "aria-label": "breadcrumb" }, /* @__PURE__ */ React.createElement(Link, { to: "/kuadrant/api-products" }, "API Products"), /* @__PURE__ */ React.createElement(Typography, null, product.spec?.displayName || product.metadata.name))), /* @__PURE__ */ React.createElement(Box, { mb: 2 }, /* @__PURE__ */ React.createElement(
187
+ ), /* @__PURE__ */ React.createElement(Content, null, /* @__PURE__ */ React.createElement(Box, { mb: 2 }, /* @__PURE__ */ React.createElement(Breadcrumbs, { "aria-label": "breadcrumb" }, /* @__PURE__ */ React.createElement(Link, { to: "/kuadrant/api-products" }, "API Products"), /* @__PURE__ */ React.createElement(Typography, null, product.spec?.displayName || product.metadata.name))), product.metadata.labels?.lifecycle === "deprecated" && /* @__PURE__ */ React.createElement(Box, { mb: 2 }, /* @__PURE__ */ React.createElement(Alert, { severity: "warning" }, /* @__PURE__ */ React.createElement("strong", null, "This API is deprecated."), " Please contact your administrator for more details.")), product.metadata.labels?.lifecycle === "retired" && /* @__PURE__ */ React.createElement(Box, { mb: 2 }, /* @__PURE__ */ React.createElement(Alert, { severity: "error" }, /* @__PURE__ */ React.createElement("strong", null, "This API has been retired and is no longer available."), " Please contact your administrator for alternatives.")), /* @__PURE__ */ React.createElement(Box, { mb: 2 }, /* @__PURE__ */ React.createElement(
197
188
  Tabs,
198
189
  {
199
190
  value: selectedTab,
@@ -219,7 +210,8 @@ const ApiProductDetailPage = () => {
219
210
  {
220
211
  product,
221
212
  showStatus: true,
222
- showCatalogLink: true
213
+ showCatalogLink: true,
214
+ httpRouteHostnames
223
215
  }
224
216
  )), selectedTab === definitionTabIndex && hasDefinitionTab && /* @__PURE__ */ React.createElement(InfoCard, { title: "API Definition" }, product.status?.openapi?.raw ? /* @__PURE__ */ React.createElement(OpenApiDefinitionWidget, { definition: product.status.openapi.raw }) : /* @__PURE__ */ React.createElement(Typography, { variant: "body2", color: "textSecondary" }, product.spec?.documentation?.openAPISpecURL ? /* @__PURE__ */ React.createElement(React.Fragment, null, "OpenAPI specification not yet synced. View at:", " ", /* @__PURE__ */ React.createElement(Link, { to: product.spec.documentation.openAPISpecURL, target: "_blank" }, product.spec.documentation.openAPISpecURL)) : "No OpenAPI specification available for this API product.")), selectedTab === policiesTabIndex && hasPoliciesTab && /* @__PURE__ */ React.createElement(Grid, { container: true, spacing: 3 }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React.createElement(InfoCard, { title: "Discovered Policies" }, /* @__PURE__ */ React.createElement(Grid, { container: true, spacing: 2 }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12, md: 6 }, /* @__PURE__ */ React.createElement(Typography, { variant: "body2", color: "textSecondary", gutterBottom: true }, "Plan Policy"), planPolicyCondition ? /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(
225
217
  Chip,
@@ -1 +1 @@
1
- {"version":3,"file":"ApiProductDetailPage.esm.js","sources":["../../../src/components/ApiProductDetailPage/ApiProductDetailPage.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport { useParams, useNavigate } from \"react-router-dom\";\nimport {\n useApi,\n configApiRef,\n fetchApiRef,\n alertApiRef,\n} from \"@backstage/core-plugin-api\";\nimport { useAsync } from \"react-use\";\nimport {\n Header,\n Page,\n Content,\n Progress,\n ResponseErrorPanel,\n InfoCard,\n Link,\n Breadcrumbs,\n} from \"@backstage/core-components\";\nimport { OpenApiDefinitionWidget } from \"@backstage/plugin-api-docs\";\nimport {\n Box,\n Typography,\n IconButton,\n Tooltip,\n Tabs,\n Tab,\n Button,\n makeStyles,\n Grid,\n Chip,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n} from \"@material-ui/core\";\nimport ArrowBackIcon from \"@material-ui/icons/ArrowBack\";\nimport EditIcon from \"@material-ui/icons/Edit\";\nimport DeleteIcon from \"@material-ui/icons/Delete\";\nimport { APIProduct } from \"../../types/api-management\";\nimport { EditAPIProductDialog } from \"../EditAPIProductDialog\";\nimport { ConfirmDeleteDialog } from \"../ConfirmDeleteDialog\";\nimport { ApiProductDetails } from \"../ApiProductDetails\";\nimport { OidcProviderCard } from \"../OidcProviderCard\";\nimport { useKuadrantPermission } from \"../../utils/permissions\";\nimport {\n kuadrantApiProductUpdateAllPermission,\n kuadrantApiProductDeleteAllPermission,\n} from \"../../permissions\";\nimport {handleFetchError} from \"../../utils/errors.ts\";\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 actionButtons: {\n display: \"flex\",\n gap: theme.spacing(1),\n alignItems: \"center\",\n },\n cardHeader: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'flex-start',\n marginBottom: theme.spacing(2),\n },\n cardActions: {\n display: 'flex',\n gap: theme.spacing(1),\n alignItems: 'center',\n },\n}));\n\nexport const ApiProductDetailPage = () => {\n const classes = useStyles();\n const { namespace, name } = useParams<{ namespace: string; name: string }>();\n const navigate = useNavigate();\n const config = useApi(configApiRef);\n const fetchApi = useApi(fetchApiRef);\n const alertApi = useApi(alertApiRef);\n const backendUrl = config.getString(\"backend.baseUrl\");\n\n const [selectedTab, setSelectedTab] = useState(0);\n const [editDialogOpen, setEditDialogOpen] = useState(false);\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);\n const [deleting, setDeleting] = useState(false);\n const [refreshKey, setRefreshKey] = useState(0);\n\n const { allowed: canUpdateApiProduct } = useKuadrantPermission(kuadrantApiProductUpdateAllPermission);\n const { allowed: canDeleteApiProduct } = useKuadrantPermission(kuadrantApiProductDeleteAllPermission);\n const canPublishApiProduct = canUpdateApiProduct;\n\n const {\n value: product,\n loading,\n error,\n } = useAsync(async () => {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/apiproducts/${namespace}/${name}`\n );\n\n if (!response.ok) {\n const err = await handleFetchError(response);\n throw new Error(`Failed to fetch API product. ${err}`);\n }\n\n return response.json() as Promise<APIProduct>;\n }, [namespace, name, backendUrl, fetchApi, refreshKey]);\n\n const handlePublishToggle = async () => {\n if (!product) return;\n const newStatus = product.spec?.publishStatus === \"Published\" ? \"Draft\" : \"Published\";\n try {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/apiproducts/${namespace}/${name}`,\n {\n method: \"PATCH\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ spec: { publishStatus: newStatus } }),\n }\n );\n if (!response.ok) {\n const err = await handleFetchError(response);\n throw new Error(err);\n }\n alertApi.post({\n message: `API Product ${newStatus === \"Published\" ? \"published\" : \"unpublished\"} successfully`,\n severity: \"success\",\n display: \"transient\",\n });\n setRefreshKey((k) => k + 1);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to update publish status. ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\n }\n };\n\n const handleEditSuccess = () => {\n setEditDialogOpen(false);\n setRefreshKey((k) => k + 1);\n alertApi.post({\n message: \"API Product updated successfully\",\n severity: \"success\",\n display: \"transient\",\n });\n };\n\n const handleDelete = async () => {\n if (!product) return;\n setDeleting(true);\n try {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/apiproducts/${namespace}/${name}`,\n { method: \"DELETE\" }\n );\n if (!response.ok) {\n const err = await handleFetchError(response);\n throw new Error(err);\n }\n setDeleteDialogOpen(false);\n alertApi.post({\n message: \"API Product deleted successfully\",\n severity: \"success\",\n display: \"transient\",\n });\n navigate(\"/kuadrant/api-products\");\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to delete API product. ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\n } finally {\n setDeleting(false);\n }\n };\n\n if (loading) {\n return <Progress />;\n }\n\n if (error || !product) {\n return (\n <ResponseErrorPanel error={error || new Error(\"API product not found\")} />\n );\n }\n\n const isPublished = product.spec?.publishStatus === \"Published\";\n\n // get policy conditions from status\n const planPolicyCondition = product.status?.conditions?.find(\n (c) => c.type === \"PlanPolicyDiscovered\"\n );\n const authPolicyCondition = product.status?.conditions?.find(\n (c) => c.type === \"AuthPolicyDiscovered\"\n );\n const discoveredPlans = product.status?.discoveredPlans || [];\n\n const authSchemes = product.status?.discoveredAuthScheme?.authentication || {};\n const schemeObjects = Object.values(authSchemes);\n const hasOIDCTab = schemeObjects.some((scheme: any) =>\n scheme.hasOwnProperty(\"jwt\"),\n );\n // Extract JWT issuer from the first JWT scheme\n const jwtScheme = schemeObjects.find((scheme: any) => scheme.hasOwnProperty(\"jwt\"));\n const jwtIssuer = (jwtScheme as any)?.jwt?.issuerUrl || \"unknown\";\n const jwtTokenEndpoint = product.status?.oidcDiscovery?.tokenEndpoint || \"unknown\";\n\n // compute tab indices\n const hasDefinitionTab = !!(product.status?.openapi?.raw || product.spec?.documentation?.openAPISpecURL);\n const hasPoliciesTab = !!(planPolicyCondition || authPolicyCondition || discoveredPlans.length > 0);\n\n let nextIndex = 1; // Overview is always at index 0\n const definitionTabIndex = hasDefinitionTab ? nextIndex++ : -1;\n const policiesTabIndex = hasPoliciesTab ? nextIndex++ : -1;\n const oidcTabIndex = hasOIDCTab ? nextIndex++ : -1;\n\n const formatLimits = (limits: any): string => {\n if (!limits) return \"No limits\";\n const parts: string[] = [];\n if (limits.daily) parts.push(`${limits.daily}/day`);\n if (limits.weekly) parts.push(`${limits.weekly}/week`);\n if (limits.monthly) parts.push(`${limits.monthly}/month`);\n if (limits.yearly) parts.push(`${limits.yearly}/year`);\n return parts.length > 0 ? parts.join(\", \") : \"No limits\";\n };\n\n return (\n <Page themeId=\"tool\">\n <Header\n title={product.spec?.displayName || product.metadata.name}\n subtitle={product.spec?.description || \"\"}\n >\n <Box className={classes.actionButtons}>\n <Link to=\"/kuadrant/api-products\">\n <Button startIcon={<ArrowBackIcon />}>Back</Button>\n </Link>\n {canPublishApiProduct && (\n <Button\n variant=\"outlined\"\n color={isPublished ? \"default\" : \"primary\"}\n onClick={handlePublishToggle}\n >\n {isPublished ? \"Unpublish API product\" : \"Publish API product\"}\n </Button>\n )}\n {canUpdateApiProduct && (\n <Tooltip title=\"Edit\">\n <IconButton onClick={() => setEditDialogOpen(true)} size=\"small\">\n <EditIcon />\n </IconButton>\n </Tooltip>\n )}\n {canDeleteApiProduct && (\n <Tooltip title=\"Delete\">\n <IconButton onClick={() => setDeleteDialogOpen(true)} size=\"small\">\n <DeleteIcon />\n </IconButton>\n </Tooltip>\n )}\n </Box>\n </Header>\n <Content>\n <Box mb={2}>\n <Breadcrumbs aria-label=\"breadcrumb\">\n <Link to=\"/kuadrant/api-products\">API Products</Link>\n <Typography>{product.spec?.displayName || product.metadata.name}</Typography>\n </Breadcrumbs>\n </Box>\n\n <Box mb={2}>\n <Tabs\n value={selectedTab}\n onChange={(_, newValue) => setSelectedTab(newValue)}\n indicatorColor=\"primary\"\n textColor=\"primary\"\n >\n <Tab label=\"Overview\" />\n {hasDefinitionTab && <Tab label=\"Definition\" />}\n {hasPoliciesTab && <Tab label=\"Policies\" />}\n {hasOIDCTab && <Tab label=\"OIDC\" />}\n </Tabs>\n </Box>\n\n {selectedTab === 0 && (\n <InfoCard title=\"API Product\">\n <Box className={classes.cardHeader}>\n <Box>\n <Typography variant=\"caption\" className={classes.label}>\n Product Name\n </Typography>\n <Typography variant=\"h6\">\n {product.spec?.displayName || product.metadata.name}\n </Typography>\n </Box>\n <Box className={classes.cardActions}>\n {canPublishApiProduct && (\n <Button\n variant=\"outlined\"\n color={isPublished ? \"default\" : \"primary\"}\n onClick={handlePublishToggle}\n size=\"small\"\n >\n {isPublished ? \"Unpublish API product\" : \"Publish API product\"}\n </Button>\n )}\n {canUpdateApiProduct && (\n <IconButton onClick={() => setEditDialogOpen(true)} size=\"small\">\n <EditIcon fontSize=\"small\" />\n </IconButton>\n )}\n {canDeleteApiProduct && (\n <IconButton onClick={() => setDeleteDialogOpen(true)} size=\"small\">\n <DeleteIcon fontSize=\"small\" />\n </IconButton>\n )}\n </Box>\n </Box>\n\n <ApiProductDetails\n product={product}\n showStatus={true}\n showCatalogLink={true}\n />\n </InfoCard>\n )}\n\n {selectedTab === definitionTabIndex && hasDefinitionTab && (\n <InfoCard title=\"API Definition\">\n {product.status?.openapi?.raw ? (\n <OpenApiDefinitionWidget definition={product.status.openapi.raw} />\n ) : (\n <Typography variant=\"body2\" color=\"textSecondary\">\n {product.spec?.documentation?.openAPISpecURL ? (\n <>\n OpenAPI specification not yet synced. View at:{\" \"}\n <Link to={product.spec.documentation.openAPISpecURL} target=\"_blank\">\n {product.spec.documentation.openAPISpecURL}\n </Link>\n </>\n ) : (\n \"No OpenAPI specification available for this API product.\"\n )}\n </Typography>\n )}\n </InfoCard>\n )}\n\n {selectedTab === policiesTabIndex && hasPoliciesTab && (\n <Grid container spacing={3}>\n <Grid item xs={12}>\n <InfoCard title=\"Discovered Policies\">\n <Grid container spacing={2}>\n <Grid item xs={12} md={6}>\n <Typography variant=\"body2\" color=\"textSecondary\" gutterBottom>\n Plan Policy\n </Typography>\n {planPolicyCondition ? (\n <Box>\n <Chip\n label={planPolicyCondition.status === \"True\" ? \"Found\" : \"Not Found\"}\n size=\"small\"\n style={{\n backgroundColor: planPolicyCondition.status === \"True\" ? \"#4caf50\" : \"#ff9800\",\n color: \"#fff\",\n marginBottom: 8,\n }}\n />\n <Typography variant=\"body2\">\n {planPolicyCondition.message || \"No details available\"}\n </Typography>\n </Box>\n ) : (\n <Typography variant=\"body2\">No plan policy information</Typography>\n )}\n </Grid>\n <Grid item xs={12} md={6}>\n <Typography variant=\"body2\" color=\"textSecondary\" gutterBottom>\n Auth Policy\n </Typography>\n {authPolicyCondition ? (\n <Box>\n <Chip\n label={authPolicyCondition.status === \"True\" ? \"Found\" : \"Not Found\"}\n size=\"small\"\n style={{\n backgroundColor: authPolicyCondition.status === \"True\" ? \"#4caf50\" : \"#ff9800\",\n color: \"#fff\",\n marginBottom: 8,\n }}\n />\n <Typography variant=\"body2\">\n {authPolicyCondition.message || \"No details available\"}\n </Typography>\n </Box>\n ) : (\n <Typography variant=\"body2\">No auth policy information</Typography>\n )}\n </Grid>\n </Grid>\n </InfoCard>\n </Grid>\n\n {discoveredPlans.length > 0 && (\n <Grid item xs={12}>\n <InfoCard title=\"Effective Plan Tiers\">\n <Typography variant=\"body2\" color=\"textSecondary\" paragraph>\n These tiers are computed from all attached PlanPolicies (including gateway-level policies).\n </Typography>\n <Table size=\"small\">\n <TableHead>\n <TableRow>\n <TableCell>Tier</TableCell>\n <TableCell>Rate Limits</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {discoveredPlans.map((plan) => (\n <TableRow key={plan.tier}>\n <TableCell>\n <Chip label={plan.tier} size=\"small\" color=\"primary\" />\n </TableCell>\n <TableCell>{formatLimits(plan.limits)}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </InfoCard>\n </Grid>\n )}\n </Grid>\n )}\n\n {selectedTab === oidcTabIndex && hasOIDCTab && (\n <OidcProviderCard\n issuerUrl={jwtIssuer}\n tokenEndpoint={jwtTokenEndpoint}\n />\n )}\n </Content>\n\n <EditAPIProductDialog\n open={editDialogOpen}\n onClose={() => setEditDialogOpen(false)}\n onSuccess={handleEditSuccess}\n namespace={namespace || \"\"}\n name={name || \"\"}\n />\n\n <ConfirmDeleteDialog\n open={deleteDialogOpen}\n title=\"Delete API Product\"\n description={`Are you sure you want to delete \"${product.spec?.displayName || product.metadata.name}\"? This action cannot be undone.`}\n severity=\"high\"\n confirmText={product.metadata.name}\n deleting={deleting}\n onConfirm={handleDelete}\n onCancel={() => setDeleteDialogOpen(false)}\n />\n </Page>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ApiProductDetailPage.esm.js","sources":["../../../src/components/ApiProductDetailPage/ApiProductDetailPage.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport { useParams, useNavigate } from \"react-router-dom\";\nimport {\n useApi,\n alertApiRef,\n} from \"@backstage/core-plugin-api\";\nimport { kuadrantApiRef } from '../../api';\nimport { useAsync } from \"react-use\";\nimport {\n Header,\n Page,\n Content,\n Progress,\n ResponseErrorPanel,\n InfoCard,\n Link,\n Breadcrumbs,\n} from \"@backstage/core-components\";\nimport { OpenApiDefinitionWidget } from \"@backstage/plugin-api-docs\";\nimport {\n Box,\n Typography,\n IconButton,\n Tooltip,\n Tabs,\n Tab,\n Button,\n makeStyles,\n Grid,\n Chip,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n} from \"@material-ui/core\";\nimport ArrowBackIcon from \"@material-ui/icons/ArrowBack\";\nimport EditIcon from \"@material-ui/icons/Edit\";\nimport DeleteIcon from \"@material-ui/icons/Delete\";\nimport { Alert } from '@material-ui/lab';\nimport { APIProduct } from \"../../types/api-management\";\nimport { EditAPIProductDialog } from \"../EditAPIProductDialog\";\nimport { ConfirmDeleteDialog } from \"../ConfirmDeleteDialog\";\nimport { ApiProductDetails } from \"../ApiProductDetails\";\nimport { OidcProviderCard } from \"../OidcProviderCard\";\nimport { useKuadrantPermission } from \"../../utils/permissions\";\nimport {\n kuadrantApiProductUpdateAllPermission,\n kuadrantApiProductDeleteAllPermission,\n} from \"../../permissions\";\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 actionButtons: {\n display: \"flex\",\n gap: theme.spacing(1),\n alignItems: \"center\",\n },\n cardHeader: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'flex-start',\n marginBottom: theme.spacing(2),\n },\n cardActions: {\n display: 'flex',\n gap: theme.spacing(1),\n alignItems: 'center',\n },\n}));\n\nexport const ApiProductDetailPage = () => {\n const classes = useStyles();\n const { namespace, name } = useParams<{ namespace: string; name: string }>();\n const navigate = useNavigate();\n const kuadrantApi = useApi(kuadrantApiRef);\n const alertApi = useApi(alertApiRef);\n\n const [selectedTab, setSelectedTab] = useState(0);\n const [editDialogOpen, setEditDialogOpen] = useState(false);\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);\n const [deleting, setDeleting] = useState(false);\n const [refreshKey, setRefreshKey] = useState(0);\n\n const { allowed: canUpdateApiProduct } = useKuadrantPermission(kuadrantApiProductUpdateAllPermission);\n const { allowed: canDeleteApiProduct } = useKuadrantPermission(kuadrantApiProductDeleteAllPermission);\n const canPublishApiProduct = canUpdateApiProduct;\n\n const {\n value: product,\n loading,\n error,\n } = useAsync(async () => {\n return await kuadrantApi.getApiProduct(namespace!, name!) as APIProduct;\n }, [namespace, name, kuadrantApi, refreshKey]);\n\n // fetch httproute to get hostnames\n const { value: httpRouteHostnames } = useAsync(async () => {\n if (!product?.spec?.targetRef?.name) {\n return null;\n }\n\n const routeName = product.spec.targetRef.name;\n const route = await kuadrantApi.getHttpRoute(namespace!, routeName)\n\n return route?.spec?.hostnames || null;\n }, [product, namespace, kuadrantApi]);\n\n const handlePublishToggle = async () => {\n if (!product) return;\n const newStatus = product.spec?.publishStatus === \"Published\" ? \"Draft\" : \"Published\";\n const lifecycle = product.metadata.labels?.lifecycle;\n\n // prevent publishing retired APIs\n if (newStatus === \"Published\" && lifecycle === \"retired\") {\n alertApi.post({\n message: `Cannot publish a retired API product. Please change the lifecycle status first.`,\n severity: \"error\",\n display: \"transient\",\n });\n return;\n }\n\n try {\n // @ts-ignore since updating partially the obj\n await kuadrantApi.updateApiProduct(namespace!, name!, { spec: { publishStatus: newStatus } });\n alertApi.post({\n message: `API Product ${newStatus === \"Published\" ? \"published\" : \"unpublished\"} successfully`,\n severity: \"success\",\n display: \"transient\",\n });\n setRefreshKey((k) => k + 1);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to update publish status. ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\n }\n };\n\n const handleEditSuccess = () => {\n setEditDialogOpen(false);\n setRefreshKey((k) => k + 1);\n alertApi.post({\n message: \"API Product updated successfully\",\n severity: \"success\",\n display: \"transient\",\n });\n };\n\n const handleDelete = async () => {\n if (!product) return;\n setDeleting(true);\n try {\n await kuadrantApi.deleteApiProduct(namespace!, name!);\n setDeleteDialogOpen(false);\n alertApi.post({\n message: \"API Product deleted successfully\",\n severity: \"success\",\n display: \"transient\",\n });\n navigate(\"/kuadrant/api-products\");\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to delete API product. ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\n } finally {\n setDeleting(false);\n }\n };\n\n if (loading) {\n return <Progress />;\n }\n\n if (error || !product) {\n return (\n <ResponseErrorPanel error={error || new Error(\"API product not found\")} />\n );\n }\n\n const isPublished = product.spec?.publishStatus === \"Published\";\n\n // get policy conditions from status\n const planPolicyCondition = product.status?.conditions?.find(\n (c) => c.type === \"PlanPolicyDiscovered\"\n );\n const authPolicyCondition = product.status?.conditions?.find(\n (c) => c.type === \"AuthPolicyDiscovered\"\n );\n const discoveredPlans = product.status?.discoveredPlans || [];\n\n const authSchemes = product.status?.discoveredAuthScheme?.authentication || {};\n const schemeObjects = Object.values(authSchemes);\n const hasOIDCTab = schemeObjects.some((scheme: any) =>\n scheme.hasOwnProperty(\"jwt\"),\n );\n // Extract JWT issuer from the first JWT scheme\n const jwtScheme = schemeObjects.find((scheme: any) => scheme.hasOwnProperty(\"jwt\"));\n const jwtIssuer = (jwtScheme as any)?.jwt?.issuerUrl || \"unknown\";\n const jwtTokenEndpoint = product.status?.oidcDiscovery?.tokenEndpoint || \"unknown\";\n\n // compute tab indices\n const hasDefinitionTab = !!(product.status?.openapi?.raw || product.spec?.documentation?.openAPISpecURL);\n const hasPoliciesTab = !!(planPolicyCondition || authPolicyCondition || discoveredPlans.length > 0);\n\n let nextIndex = 1; // Overview is always at index 0\n const definitionTabIndex = hasDefinitionTab ? nextIndex++ : -1;\n const policiesTabIndex = hasPoliciesTab ? nextIndex++ : -1;\n const oidcTabIndex = hasOIDCTab ? nextIndex++ : -1;\n\n const formatLimits = (limits: any): string => {\n if (!limits) return \"No limits\";\n const parts: string[] = [];\n if (limits.daily) parts.push(`${limits.daily}/day`);\n if (limits.weekly) parts.push(`${limits.weekly}/week`);\n if (limits.monthly) parts.push(`${limits.monthly}/month`);\n if (limits.yearly) parts.push(`${limits.yearly}/year`);\n return parts.length > 0 ? parts.join(\", \") : \"No limits\";\n };\n\n return (\n <Page themeId=\"tool\">\n <Header\n title={product.spec?.displayName || product.metadata.name}\n subtitle={product.spec?.description || \"\"}\n >\n <Box className={classes.actionButtons}>\n <Link to=\"/kuadrant/api-products\">\n <Button startIcon={<ArrowBackIcon />}>Back</Button>\n </Link>\n {canPublishApiProduct && (\n <Button\n variant=\"outlined\"\n color={isPublished ? \"default\" : \"primary\"}\n onClick={handlePublishToggle}\n >\n {isPublished ? \"Unpublish API product\" : \"Publish API product\"}\n </Button>\n )}\n {canUpdateApiProduct && (\n <Tooltip title=\"Edit\">\n <IconButton onClick={() => setEditDialogOpen(true)} size=\"small\">\n <EditIcon />\n </IconButton>\n </Tooltip>\n )}\n {canDeleteApiProduct && (\n <Tooltip title=\"Delete\">\n <IconButton onClick={() => setDeleteDialogOpen(true)} size=\"small\">\n <DeleteIcon />\n </IconButton>\n </Tooltip>\n )}\n </Box>\n </Header>\n <Content>\n <Box mb={2}>\n <Breadcrumbs aria-label=\"breadcrumb\">\n <Link to=\"/kuadrant/api-products\">API Products</Link>\n <Typography>{product.spec?.displayName || product.metadata.name}</Typography>\n </Breadcrumbs>\n </Box>\n\n\n {product.metadata.labels?.lifecycle === 'deprecated' && (\n <Box mb={2}>\n <Alert severity=\"warning\">\n <strong>This API is deprecated.</strong> Please contact your administrator for more details.\n </Alert>\n </Box>\n )}\n\n {product.metadata.labels?.lifecycle === 'retired' && (\n <Box mb={2}>\n <Alert severity=\"error\">\n <strong>This API has been retired and is no longer available.</strong> Please contact your administrator for alternatives.\n </Alert>\n </Box>\n )}\n\n <Box mb={2}>\n <Tabs\n value={selectedTab}\n onChange={(_, newValue) => setSelectedTab(newValue)}\n indicatorColor=\"primary\"\n textColor=\"primary\"\n >\n <Tab label=\"Overview\" />\n {hasDefinitionTab && <Tab label=\"Definition\" />}\n {hasPoliciesTab && <Tab label=\"Policies\" />}\n {hasOIDCTab && <Tab label=\"OIDC\" />}\n </Tabs>\n </Box>\n\n {selectedTab === 0 && (\n <InfoCard title=\"API Product\">\n <Box className={classes.cardHeader}>\n <Box>\n <Typography variant=\"caption\" className={classes.label}>\n Product Name\n </Typography>\n <Typography variant=\"h6\">\n {product.spec?.displayName || product.metadata.name}\n </Typography>\n </Box>\n <Box className={classes.cardActions}>\n {canPublishApiProduct && (\n <Button\n variant=\"outlined\"\n color={isPublished ? \"default\" : \"primary\"}\n onClick={handlePublishToggle}\n size=\"small\"\n >\n {isPublished ? \"Unpublish API product\" : \"Publish API product\"}\n </Button>\n )}\n {canUpdateApiProduct && (\n <IconButton onClick={() => setEditDialogOpen(true)} size=\"small\">\n <EditIcon fontSize=\"small\" />\n </IconButton>\n )}\n {canDeleteApiProduct && (\n <IconButton onClick={() => setDeleteDialogOpen(true)} size=\"small\">\n <DeleteIcon fontSize=\"small\" />\n </IconButton>\n )}\n </Box>\n </Box>\n\n <ApiProductDetails\n product={product}\n showStatus={true}\n showCatalogLink={true}\n httpRouteHostnames={httpRouteHostnames}\n />\n </InfoCard>\n )}\n\n {selectedTab === definitionTabIndex && hasDefinitionTab && (\n <InfoCard title=\"API Definition\">\n {product.status?.openapi?.raw ? (\n <OpenApiDefinitionWidget definition={product.status.openapi.raw} />\n ) : (\n <Typography variant=\"body2\" color=\"textSecondary\">\n {product.spec?.documentation?.openAPISpecURL ? (\n <>\n OpenAPI specification not yet synced. View at:{\" \"}\n <Link to={product.spec.documentation.openAPISpecURL} target=\"_blank\">\n {product.spec.documentation.openAPISpecURL}\n </Link>\n </>\n ) : (\n \"No OpenAPI specification available for this API product.\"\n )}\n </Typography>\n )}\n </InfoCard>\n )}\n\n {selectedTab === policiesTabIndex && hasPoliciesTab && (\n <Grid container spacing={3}>\n <Grid item xs={12}>\n <InfoCard title=\"Discovered Policies\">\n <Grid container spacing={2}>\n <Grid item xs={12} md={6}>\n <Typography variant=\"body2\" color=\"textSecondary\" gutterBottom>\n Plan Policy\n </Typography>\n {planPolicyCondition ? (\n <Box>\n <Chip\n label={planPolicyCondition.status === \"True\" ? \"Found\" : \"Not Found\"}\n size=\"small\"\n style={{\n backgroundColor: planPolicyCondition.status === \"True\" ? \"#4caf50\" : \"#ff9800\",\n color: \"#fff\",\n marginBottom: 8,\n }}\n />\n <Typography variant=\"body2\">\n {planPolicyCondition.message || \"No details available\"}\n </Typography>\n </Box>\n ) : (\n <Typography variant=\"body2\">No plan policy information</Typography>\n )}\n </Grid>\n <Grid item xs={12} md={6}>\n <Typography variant=\"body2\" color=\"textSecondary\" gutterBottom>\n Auth Policy\n </Typography>\n {authPolicyCondition ? (\n <Box>\n <Chip\n label={authPolicyCondition.status === \"True\" ? \"Found\" : \"Not Found\"}\n size=\"small\"\n style={{\n backgroundColor: authPolicyCondition.status === \"True\" ? \"#4caf50\" : \"#ff9800\",\n color: \"#fff\",\n marginBottom: 8,\n }}\n />\n <Typography variant=\"body2\">\n {authPolicyCondition.message || \"No details available\"}\n </Typography>\n </Box>\n ) : (\n <Typography variant=\"body2\">No auth policy information</Typography>\n )}\n </Grid>\n </Grid>\n </InfoCard>\n </Grid>\n\n {discoveredPlans.length > 0 && (\n <Grid item xs={12}>\n <InfoCard title=\"Effective Plan Tiers\">\n <Typography variant=\"body2\" color=\"textSecondary\" paragraph>\n These tiers are computed from all attached PlanPolicies (including gateway-level policies).\n </Typography>\n <Table size=\"small\">\n <TableHead>\n <TableRow>\n <TableCell>Tier</TableCell>\n <TableCell>Rate Limits</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {discoveredPlans.map((plan) => (\n <TableRow key={plan.tier}>\n <TableCell>\n <Chip label={plan.tier} size=\"small\" color=\"primary\" />\n </TableCell>\n <TableCell>{formatLimits(plan.limits)}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </InfoCard>\n </Grid>\n )}\n </Grid>\n )}\n\n {selectedTab === oidcTabIndex && hasOIDCTab && (\n <OidcProviderCard\n issuerUrl={jwtIssuer}\n tokenEndpoint={jwtTokenEndpoint}\n />\n )}\n </Content>\n\n <EditAPIProductDialog\n open={editDialogOpen}\n onClose={() => setEditDialogOpen(false)}\n onSuccess={handleEditSuccess}\n namespace={namespace || \"\"}\n name={name || \"\"}\n />\n\n <ConfirmDeleteDialog\n open={deleteDialogOpen}\n title=\"Delete API Product\"\n description={`Are you sure you want to delete \"${product.spec?.displayName || product.metadata.name}\"? This action cannot be undone.`}\n severity=\"high\"\n confirmText={product.metadata.name}\n deleting={deleting}\n onConfirm={handleDelete}\n onCancel={() => setDeleteDialogOpen(false)}\n />\n </Page>\n );\n};\n"],"names":[],"mappings":"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"}