@kuadrant/kuadrant-backstage-plugin-frontend 0.3.0-aaa46b4 → 0.4.0-dev1

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 (51) hide show
  1. package/dist/components/ApiProductDetails/ApiProductDetails.esm.js +2 -1
  2. package/dist/components/ApiProductDetails/ApiProductDetails.esm.js.map +1 -1
  3. package/dist/components/ApiProductPolicies/ApiProductPolicies.esm.js +2 -1
  4. package/dist/components/ApiProductPolicies/ApiProductPolicies.esm.js.map +1 -1
  5. package/dist/components/EditAPIKeyDialog/EditAPIKeyDialog.esm.js +2 -1
  6. package/dist/components/EditAPIKeyDialog/EditAPIKeyDialog.esm.js.map +1 -1
  7. package/dist/components/RequestAccessDialog/RequestAccessDialog.esm.js +2 -1
  8. package/dist/components/RequestAccessDialog/RequestAccessDialog.esm.js.map +1 -1
  9. package/dist/components/SimpleRequestAccessDialog/SimpleRequestAccessDialog.esm.js +2 -1
  10. package/dist/components/SimpleRequestAccessDialog/SimpleRequestAccessDialog.esm.js.map +1 -1
  11. package/dist/utils/policies.esm.js +16 -1
  12. package/dist/utils/policies.esm.js.map +1 -1
  13. package/dist-scalprum/{internal.plugin-kuadrant.7f1de85661b1b848af15.js → internal.plugin-kuadrant.88f7f9d244e0e8c2b613.js} +2 -2
  14. package/dist-scalprum/{internal.plugin-kuadrant.7f1de85661b1b848af15.js.map → internal.plugin-kuadrant.88f7f9d244e0e8c2b613.js.map} +1 -1
  15. package/dist-scalprum/plugin-manifest.json +3 -3
  16. package/dist-scalprum/static/1719.430c122c.chunk.js +2 -0
  17. package/dist-scalprum/static/1719.430c122c.chunk.js.map +1 -0
  18. package/dist-scalprum/static/2251.1b3cdd55.chunk.js +2 -0
  19. package/dist-scalprum/static/2251.1b3cdd55.chunk.js.map +1 -0
  20. package/dist-scalprum/static/2821.7a436d84.chunk.js +2 -0
  21. package/dist-scalprum/static/2821.7a436d84.chunk.js.map +1 -0
  22. package/dist-scalprum/static/3947.4ae8ccd7.chunk.js +2 -0
  23. package/dist-scalprum/static/3947.4ae8ccd7.chunk.js.map +1 -0
  24. package/dist-scalprum/static/5289.be544370.chunk.js +2 -0
  25. package/dist-scalprum/static/5289.be544370.chunk.js.map +1 -0
  26. package/dist-scalprum/static/5922.d56dc5a5.chunk.js +2 -0
  27. package/dist-scalprum/static/5922.d56dc5a5.chunk.js.map +1 -0
  28. package/dist-scalprum/static/7270.bf7ae167.chunk.js +2 -0
  29. package/dist-scalprum/static/7270.bf7ae167.chunk.js.map +1 -0
  30. package/dist-scalprum/static/7791.4c486f1d.chunk.js +2 -0
  31. package/dist-scalprum/static/{7791.ad31cf6d.chunk.js.map → 7791.4c486f1d.chunk.js.map} +1 -1
  32. package/dist-scalprum/static/{exposed-KuadrantPage.f123b200.chunk.js → exposed-KuadrantPage.f9303a62.chunk.js} +2 -2
  33. package/dist-scalprum/static/{exposed-KuadrantPage.f123b200.chunk.js.map → exposed-KuadrantPage.f9303a62.chunk.js.map} +1 -1
  34. package/dist-scalprum/static/{exposed-PluginRoot.3a5f9157.chunk.js → exposed-PluginRoot.992ab15b.chunk.js} +2 -2
  35. package/dist-scalprum/static/{exposed-PluginRoot.3a5f9157.chunk.js.map → exposed-PluginRoot.992ab15b.chunk.js.map} +1 -1
  36. package/package.json +1 -1
  37. package/dist-scalprum/static/1719.52ca7daf.chunk.js +0 -2
  38. package/dist-scalprum/static/1719.52ca7daf.chunk.js.map +0 -1
  39. package/dist-scalprum/static/2251.08f3db99.chunk.js +0 -2
  40. package/dist-scalprum/static/2251.08f3db99.chunk.js.map +0 -1
  41. package/dist-scalprum/static/2821.1ac360ec.chunk.js +0 -2
  42. package/dist-scalprum/static/2821.1ac360ec.chunk.js.map +0 -1
  43. package/dist-scalprum/static/3947.f5320e89.chunk.js +0 -2
  44. package/dist-scalprum/static/3947.f5320e89.chunk.js.map +0 -1
  45. package/dist-scalprum/static/5289.6c803140.chunk.js +0 -2
  46. package/dist-scalprum/static/5289.6c803140.chunk.js.map +0 -1
  47. package/dist-scalprum/static/7270.8ee9d452.chunk.js +0 -2
  48. package/dist-scalprum/static/7270.8ee9d452.chunk.js.map +0 -1
  49. package/dist-scalprum/static/7791.ad31cf6d.chunk.js +0 -2
  50. package/dist-scalprum/static/980.744a4d36.chunk.js +0 -2
  51. package/dist-scalprum/static/980.744a4d36.chunk.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"static/7791.ad31cf6d.chunk.js","mappings":"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","sources":["webpack://internal.plugin-kuadrant/./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 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} 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, Skeleton } from '@material-ui/lab';\nimport { APIProduct } from \"../../types/api-management\";\nimport { EditAPIProductDialog } from \"../EditAPIProductDialog\";\nimport { ConfirmDeleteDialog } from \"../ConfirmDeleteDialog\";\nimport { ApiProductPolicies, PlanPoliciesProps, AuthPoliciesProps, RateLimitPoliciesProps } from '../ApiProductPolicies';\nimport { ApiProductDetails } from \"../ApiProductDetails\";\nimport { OidcProviderCard } from \"../OidcProviderCard\";\nimport { useKuadrantPermission } from \"../../utils/permissions\";\nimport { getPolicyForRoute } from '../../utils/policies';\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 // load ratelimitpolicies\n const {\n value: rateLimitPolicies,\n error: rateLimitPoliciesError\n } = useAsync(async () => {\n return await kuadrantApi.getRateLimitPolicies();\n }, [kuadrantApi, open]);\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 (\n <Page themeId=\"tool\">\n <Header title=\"Loading...\" />\n <Content>\n <Box p={2}>\n {[...Array(5)].map((_, i) => (\n <Box key={i} p={2}>\n <Skeleton variant=\"text\" width=\"100%\" />\n </Box>\n ))}\n </Box>\n </Content>\n </Page>\n );\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\n // get policy conditions from status\n const planPolicyCondition = product.status?.conditions?.find(\n (c) => c.type === \"PlanPolicyDiscovered\"\n ) || null;\n const authPolicyCondition = product.status?.conditions?.find(\n (c) => c.type === \"AuthPolicyDiscovered\"\n ) || null;\n const discoveredPlans = product.status?.discoveredPlans || [];\n\n const planPolicyProps: PlanPoliciesProps = {\n statusCondition: planPolicyCondition,\n discoveredPlans: discoveredPlans,\n };\n // Parse the auth policy name from the AuthPolicyDiscovered condition message\n // It's the only place to get the policy name without fetching all the policies.\n // Consider enhancing the developer portal controller to provide name in an structured way\n const parseNameFromMessage = (value: string) => {\n const parts = value.split(' ');\n return parts.length >= 3 ? parts[2] : '';\n };\n const authPolicyName = authPolicyCondition?.status === \"True\" ? parseNameFromMessage(authPolicyCondition.message ?? \"\") : \"\";\n\n const authPolicyProps: AuthPoliciesProps = {\n statusCondition: authPolicyCondition,\n namespacedName: {\n name: authPolicyName,\n namespace: product.metadata.namespace,\n },\n };\n\n\n if (rateLimitPoliciesError) {\n return (\n <ResponseErrorPanel error={rateLimitPoliciesError} />\n );\n }\n\n const selectedRateLimitPolicy = product?.spec?.targetRef\n ? getPolicyForRoute(rateLimitPolicies?.items, product.metadata.namespace, product?.spec?.targetRef.name)\n : null;\n const rateLimitPolicyAcceptedCondition = selectedRateLimitPolicy?.status?.conditions?.find(\n (c: any) => c.type === \"Accepted\"\n );\n const rateLimitPolicyProps: RateLimitPoliciesProps = {\n namespacedName: {\n namespace: selectedRateLimitPolicy?.metadata.namespace,\n name: selectedRateLimitPolicy?.metadata.name,\n },\n statusCondition: rateLimitPolicyAcceptedCondition,\n }\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\n let nextIndex = 0;\n const overviewTabIndex = nextIndex++;\n const definitionTabIndex = hasDefinitionTab ? nextIndex++ : -1;\n const policiesTabIndex = nextIndex++;\n const oidcTabIndex = hasOIDCTab ? nextIndex++ : -1;\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 <Tab label=\"Policies\" />\n {hasOIDCTab && <Tab label=\"OIDC\" />}\n </Tabs>\n </Box>\n\n {selectedTab === overviewTabIndex && (\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 && (\n <InfoCard title=\"Discovered Policies\">\n <ApiProductPolicies\n planPolicy={planPolicyProps}\n authPolicy={authPolicyProps}\n rateLimitPolicy={rateLimitPolicyProps}\n includeTopMargin={false}\n />\n </InfoCard>\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":["useStyles","makeStyles","theme","label","fontWeight","color","palette","text","secondary","marginBottom","spacing","fontSize","textTransform","actionButtons","display","gap","alignItems","cardHeader","justifyContent","cardActions","ApiProductDetailPage","product","selectedRateLimitPolicy","classes","namespace","name","useParams","navigate","useNavigate","kuadrantApi","useApi","kuadrantApiRef","alertApi","alertApiRef","selectedTab","setSelectedTab","useState","editDialogOpen","setEditDialogOpen","deleteDialogOpen","setDeleteDialogOpen","deleting","setDeleting","refreshKey","setRefreshKey","allowed","canUpdateApiProduct","useKuadrantPermission","kuadrantApiProductUpdateAllPermission","canDeleteApiProduct","kuadrantApiProductDeleteAllPermission","canPublishApiProduct","value","loading","error","useAsync","async","getApiProduct","httpRouteHostnames","route","spec","targetRef","routeName","getHttpRoute","hostnames","rateLimitPolicies","rateLimitPoliciesError","getRateLimitPolicies","open","handlePublishToggle","newStatus","publishStatus","lifecycle","metadata","labels","updateApiProduct","post","message","severity","k","err","errorMessage","Error","Page","themeId","Header","title","Content","Box","p","Array","map","_","i","Skeleton","variant","width","ResponseErrorPanel","isPublished","planPolicyCondition","status","conditions","find","c","type","authPolicyCondition","planPolicyProps","statusCondition","discoveredPlans","authPolicyProps","namespacedName","parts","split","length","parseNameFromMessage","getPolicyForRoute","items","rateLimitPolicyAcceptedCondition","rateLimitPolicyProps","authSchemes","discoveredAuthScheme","authentication","schemeObjects","Object","values","hasOIDCTab","some","scheme","hasOwnProperty","jwtScheme","jwtIssuer","jwt","issuerUrl","jwtTokenEndpoint","oidcDiscovery","tokenEndpoint","hasDefinitionTab","openapi","raw","documentation","openAPISpecURL","nextIndex","overviewTabIndex","definitionTabIndex","policiesTabIndex","oidcTabIndex","displayName","subtitle","description","className","Link","to","Button","startIcon","ArrowBackIcon","onClick","Tooltip","IconButton","size","EditIcon","DeleteIcon","mb","Breadcrumbs","aria-label","Typography","Alert","strong","Tabs","onChange","newValue","indicatorColor","textColor","Tab","InfoCard","ApiProductDetails","showStatus","showCatalogLink","OpenApiDefinitionWidget","definition","target","ApiProductPolicies","planPolicy","authPolicy","rateLimitPolicy","includeTopMargin","OidcProviderCard","EditAPIProductDialog","onClose","onSuccess","ConfirmDeleteDialog","confirmText","onConfirm","deleteApiProduct","onCancel"],"sourceRoot":""}
1
+ {"version":3,"file":"static/7791.4c486f1d.chunk.js","mappings":"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","sources":["webpack://internal.plugin-kuadrant/./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 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} 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, Skeleton } from '@material-ui/lab';\nimport { APIProduct } from \"../../types/api-management\";\nimport { EditAPIProductDialog } from \"../EditAPIProductDialog\";\nimport { ConfirmDeleteDialog } from \"../ConfirmDeleteDialog\";\nimport { ApiProductPolicies, PlanPoliciesProps, AuthPoliciesProps, RateLimitPoliciesProps } from '../ApiProductPolicies';\nimport { ApiProductDetails } from \"../ApiProductDetails\";\nimport { OidcProviderCard } from \"../OidcProviderCard\";\nimport { useKuadrantPermission } from \"../../utils/permissions\";\nimport { getPolicyForRoute } from '../../utils/policies';\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 // load ratelimitpolicies\n const {\n value: rateLimitPolicies,\n error: rateLimitPoliciesError\n } = useAsync(async () => {\n return await kuadrantApi.getRateLimitPolicies();\n }, [kuadrantApi, open]);\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 (\n <Page themeId=\"tool\">\n <Header title=\"Loading...\" />\n <Content>\n <Box p={2}>\n {[...Array(5)].map((_, i) => (\n <Box key={i} p={2}>\n <Skeleton variant=\"text\" width=\"100%\" />\n </Box>\n ))}\n </Box>\n </Content>\n </Page>\n );\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\n // get policy conditions from status\n const planPolicyCondition = product.status?.conditions?.find(\n (c) => c.type === \"PlanPolicyDiscovered\"\n ) || null;\n const authPolicyCondition = product.status?.conditions?.find(\n (c) => c.type === \"AuthPolicyDiscovered\"\n ) || null;\n const discoveredPlans = product.status?.discoveredPlans || [];\n\n const planPolicyProps: PlanPoliciesProps = {\n statusCondition: planPolicyCondition,\n discoveredPlans: discoveredPlans,\n };\n // Parse the auth policy name from the AuthPolicyDiscovered condition message\n // It's the only place to get the policy name without fetching all the policies.\n // Consider enhancing the developer portal controller to provide name in an structured way\n const parseNameFromMessage = (value: string) => {\n const parts = value.split(' ');\n return parts.length >= 3 ? parts[2] : '';\n };\n const authPolicyName = authPolicyCondition?.status === \"True\" ? parseNameFromMessage(authPolicyCondition.message ?? \"\") : \"\";\n\n const authPolicyProps: AuthPoliciesProps = {\n statusCondition: authPolicyCondition,\n namespacedName: {\n name: authPolicyName,\n namespace: product.metadata.namespace,\n },\n };\n\n\n if (rateLimitPoliciesError) {\n return (\n <ResponseErrorPanel error={rateLimitPoliciesError} />\n );\n }\n\n const selectedRateLimitPolicy = product?.spec?.targetRef\n ? getPolicyForRoute(rateLimitPolicies?.items, product.metadata.namespace, product?.spec?.targetRef.name)\n : null;\n const rateLimitPolicyAcceptedCondition = selectedRateLimitPolicy?.status?.conditions?.find(\n (c: any) => c.type === \"Accepted\"\n );\n const rateLimitPolicyProps: RateLimitPoliciesProps = {\n namespacedName: {\n namespace: selectedRateLimitPolicy?.metadata.namespace,\n name: selectedRateLimitPolicy?.metadata.name,\n },\n statusCondition: rateLimitPolicyAcceptedCondition,\n }\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\n let nextIndex = 0;\n const overviewTabIndex = nextIndex++;\n const definitionTabIndex = hasDefinitionTab ? nextIndex++ : -1;\n const policiesTabIndex = nextIndex++;\n const oidcTabIndex = hasOIDCTab ? nextIndex++ : -1;\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 <Tab label=\"Policies\" />\n {hasOIDCTab && <Tab label=\"OIDC\" />}\n </Tabs>\n </Box>\n\n {selectedTab === overviewTabIndex && (\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 && (\n <InfoCard title=\"Discovered Policies\">\n <ApiProductPolicies\n planPolicy={planPolicyProps}\n authPolicy={authPolicyProps}\n rateLimitPolicy={rateLimitPolicyProps}\n includeTopMargin={false}\n />\n </InfoCard>\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":["useStyles","makeStyles","theme","label","fontWeight","color","palette","text","secondary","marginBottom","spacing","fontSize","textTransform","actionButtons","display","gap","alignItems","cardHeader","justifyContent","cardActions","ApiProductDetailPage","product","selectedRateLimitPolicy","classes","namespace","name","useParams","navigate","useNavigate","kuadrantApi","useApi","kuadrantApiRef","alertApi","alertApiRef","selectedTab","setSelectedTab","useState","editDialogOpen","setEditDialogOpen","deleteDialogOpen","setDeleteDialogOpen","deleting","setDeleting","refreshKey","setRefreshKey","allowed","canUpdateApiProduct","useKuadrantPermission","kuadrantApiProductUpdateAllPermission","canDeleteApiProduct","kuadrantApiProductDeleteAllPermission","canPublishApiProduct","value","loading","error","useAsync","async","getApiProduct","httpRouteHostnames","route","spec","targetRef","routeName","getHttpRoute","hostnames","rateLimitPolicies","rateLimitPoliciesError","getRateLimitPolicies","open","handlePublishToggle","newStatus","publishStatus","lifecycle","metadata","labels","updateApiProduct","post","message","severity","k","err","errorMessage","Error","Page","themeId","Header","title","Content","Box","p","Array","map","_","i","Skeleton","variant","width","ResponseErrorPanel","isPublished","planPolicyCondition","status","conditions","find","c","type","authPolicyCondition","planPolicyProps","statusCondition","discoveredPlans","authPolicyProps","namespacedName","parts","split","length","parseNameFromMessage","getPolicyForRoute","items","rateLimitPolicyAcceptedCondition","rateLimitPolicyProps","authSchemes","discoveredAuthScheme","authentication","schemeObjects","Object","values","hasOIDCTab","some","scheme","hasOwnProperty","jwtScheme","jwtIssuer","jwt","issuerUrl","jwtTokenEndpoint","oidcDiscovery","tokenEndpoint","hasDefinitionTab","openapi","raw","documentation","openAPISpecURL","nextIndex","overviewTabIndex","definitionTabIndex","policiesTabIndex","oidcTabIndex","displayName","subtitle","description","className","Link","to","Button","startIcon","ArrowBackIcon","onClick","Tooltip","IconButton","size","EditIcon","DeleteIcon","mb","Breadcrumbs","aria-label","Typography","Alert","strong","Tabs","onChange","newValue","indicatorColor","textColor","Tab","InfoCard","ApiProductDetails","showStatus","showCatalogLink","OpenApiDefinitionWidget","definition","target","ApiProductPolicies","planPolicy","authPolicy","rateLimitPolicy","includeTopMargin","OidcProviderCard","EditAPIProductDialog","onClose","onSuccess","ConfirmDeleteDialog","confirmText","onConfirm","deleteApiProduct","onCancel"],"sourceRoot":""}
@@ -1,2 +1,2 @@
1
- "use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[6921],{72627:(e,n,t)=>{t.r(n),t.d(n,{ApiKeyApprovalPage:()=>l,ApiKeyDetailPage:()=>A,ApiProductDetailPage:()=>h,ApiProductsPage:()=>d,EntityKuadrantApiAccessCard:()=>c,EntityKuadrantApiKeyManagementTab:()=>m,EntityKuadrantApiKeysContent:()=>P,EntityKuadrantApiProductInfoContent:()=>s,EntityKuadrantApiProductOpenApiAlert:()=>y,KuadrantPage:()=>p,MyApiKeysPage:()=>u,kuadrantPlugin:()=>r});var a=t(22097);const o=(0,a.createRouteRef)({id:"kuadrant"}),i=(0,a.createSubRouteRef)({id:"kuadrant/resource",parent:o,path:"/:kind/:namespace/:name"}),r=(0,a.createPlugin)({id:"kuadrant",routes:{root:o,resource:i}}),p=r.provide((0,a.createRoutableExtension)({name:"KuadrantPage",component:()=>Promise.all([t.e(4083),t.e(9400),t.e(20),t.e(1340),t.e(5197),t.e(5943),t.e(7293),t.e(7076),t.e(6837),t.e(5010),t.e(8563),t.e(1931),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(3658),t.e(5289),t.e(2821)]).then(t.bind(t,80243)).then(e=>e.ApiProductsPage),mountPoint:o})),d=r.provide((0,a.createRoutableExtension)({name:"ApiProductsPage",component:()=>Promise.all([t.e(4083),t.e(9400),t.e(20),t.e(1340),t.e(5197),t.e(5943),t.e(7293),t.e(7076),t.e(6837),t.e(5010),t.e(8563),t.e(1931),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(3658),t.e(5289),t.e(2821)]).then(t.bind(t,80243)).then(e=>e.ApiProductsPage),mountPoint:o})),u=r.provide((0,a.createRoutableExtension)({name:"MyApiKeysPage",component:()=>Promise.all([t.e(4083),t.e(9400),t.e(20),t.e(1340),t.e(5197),t.e(5943),t.e(7076),t.e(6837),t.e(5010),t.e(8563),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(7270)]).then(t.bind(t,37270)).then(e=>e.MyApiKeysPage),mountPoint:o})),l=r.provide((0,a.createRoutableExtension)({name:"ApiKeyApprovalPage",component:()=>Promise.all([t.e(4083),t.e(9400),t.e(20),t.e(1340),t.e(5197),t.e(5943),t.e(7293),t.e(7076),t.e(6837),t.e(5010),t.e(8563),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(3658),t.e(3917)]).then(t.bind(t,73917)).then(e=>e.ApiKeyApprovalPageWithPermissions),mountPoint:o})),c=r.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiAccessCard",component:{lazy:()=>Promise.all([t.e(4083),t.e(9400),t.e(20),t.e(1340),t.e(5197),t.e(5943),t.e(7293),t.e(438),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(3658),t.e(1719)]).then(t.bind(t,11719)).then(e=>e.ApiAccessCard)}})),m=r.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiKeyManagementTab",component:{lazy:()=>Promise.all([t.e(4083),t.e(9400),t.e(20),t.e(1340),t.e(5197),t.e(5943),t.e(7293),t.e(7076),t.e(6837),t.e(5010),t.e(5478),t.e(5427),t.e(484),t.e(1942),t.e(7976),t.e(3658),t.e(2251),t.e(980)]).then(t.bind(t,42708)).then(e=>e.ApiKeyManagementTab)}})),P=r.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiKeysContent",component:{lazy:()=>Promise.all([t.e(4083),t.e(9400),t.e(20),t.e(1340),t.e(5197),t.e(5943),t.e(7293),t.e(7076),t.e(6837),t.e(5010),t.e(5478),t.e(5427),t.e(484),t.e(1942),t.e(7976),t.e(3658),t.e(2251),t.e(980)]).then(t.bind(t,42708)).then(e=>e.ApiKeyManagementTab)}})),s=r.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiProductInfoContent",component:{lazy:()=>Promise.all([t.e(4083),t.e(9400),t.e(20),t.e(1340),t.e(7293),t.e(327),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(3658),t.e(3947),t.e(4908)]).then(t.bind(t,34908)).then(e=>e.ApiProductInfoCard)}})),A=r.provide((0,a.createRoutableExtension)({name:"ApiKeyDetailPage",component:()=>Promise.all([t.e(4083),t.e(9400),t.e(20),t.e(1340),t.e(5197),t.e(7076),t.e(8563),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(2967)]).then(t.bind(t,72967)).then(e=>e.ApiKeyDetailPage),mountPoint:o})),y=r.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiProductOpenApiAlert",component:{lazy:()=>Promise.all([t.e(9400),t.e(20),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(6371)]).then(t.bind(t,36371)).then(e=>e.ApiProductOpenApiAlert)}})),h=r.provide((0,a.createRoutableExtension)({name:"ApiProductDetailPage",component:()=>Promise.all([t.e(4083),t.e(9400),t.e(20),t.e(1340),t.e(5197),t.e(5943),t.e(7293),t.e(7076),t.e(6837),t.e(8563),t.e(2769),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(3658),t.e(3947),t.e(5289),t.e(7791)]).then(t.bind(t,57791)).then(e=>e.ApiProductDetailPage),mountPoint:o}))}}]);
2
- //# sourceMappingURL=exposed-KuadrantPage.f123b200.chunk.js.map
1
+ "use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[6921],{72627:(e,n,t)=>{t.r(n),t.d(n,{ApiKeyApprovalPage:()=>l,ApiKeyDetailPage:()=>A,ApiProductDetailPage:()=>h,ApiProductsPage:()=>d,EntityKuadrantApiAccessCard:()=>c,EntityKuadrantApiKeyManagementTab:()=>m,EntityKuadrantApiKeysContent:()=>P,EntityKuadrantApiProductInfoContent:()=>s,EntityKuadrantApiProductOpenApiAlert:()=>y,KuadrantPage:()=>p,MyApiKeysPage:()=>u,kuadrantPlugin:()=>r});var a=t(22097);const o=(0,a.createRouteRef)({id:"kuadrant"}),i=(0,a.createSubRouteRef)({id:"kuadrant/resource",parent:o,path:"/:kind/:namespace/:name"}),r=(0,a.createPlugin)({id:"kuadrant",routes:{root:o,resource:i}}),p=r.provide((0,a.createRoutableExtension)({name:"KuadrantPage",component:()=>Promise.all([t.e(4083),t.e(9400),t.e(20),t.e(1340),t.e(5197),t.e(5943),t.e(7293),t.e(7076),t.e(6837),t.e(5010),t.e(8563),t.e(1931),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(3658),t.e(5289),t.e(2821)]).then(t.bind(t,80243)).then(e=>e.ApiProductsPage),mountPoint:o})),d=r.provide((0,a.createRoutableExtension)({name:"ApiProductsPage",component:()=>Promise.all([t.e(4083),t.e(9400),t.e(20),t.e(1340),t.e(5197),t.e(5943),t.e(7293),t.e(7076),t.e(6837),t.e(5010),t.e(8563),t.e(1931),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(3658),t.e(5289),t.e(2821)]).then(t.bind(t,80243)).then(e=>e.ApiProductsPage),mountPoint:o})),u=r.provide((0,a.createRoutableExtension)({name:"MyApiKeysPage",component:()=>Promise.all([t.e(4083),t.e(9400),t.e(20),t.e(1340),t.e(5197),t.e(5943),t.e(7076),t.e(6837),t.e(5010),t.e(8563),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(7270)]).then(t.bind(t,37270)).then(e=>e.MyApiKeysPage),mountPoint:o})),l=r.provide((0,a.createRoutableExtension)({name:"ApiKeyApprovalPage",component:()=>Promise.all([t.e(4083),t.e(9400),t.e(20),t.e(1340),t.e(5197),t.e(5943),t.e(7293),t.e(7076),t.e(6837),t.e(5010),t.e(8563),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(3658),t.e(3917)]).then(t.bind(t,73917)).then(e=>e.ApiKeyApprovalPageWithPermissions),mountPoint:o})),c=r.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiAccessCard",component:{lazy:()=>Promise.all([t.e(4083),t.e(9400),t.e(20),t.e(1340),t.e(5197),t.e(5943),t.e(7293),t.e(438),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(3658),t.e(1719)]).then(t.bind(t,11719)).then(e=>e.ApiAccessCard)}})),m=r.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiKeyManagementTab",component:{lazy:()=>Promise.all([t.e(4083),t.e(9400),t.e(20),t.e(1340),t.e(5197),t.e(5943),t.e(7293),t.e(7076),t.e(6837),t.e(5010),t.e(5478),t.e(5427),t.e(484),t.e(1942),t.e(7976),t.e(3658),t.e(2251),t.e(5922)]).then(t.bind(t,42708)).then(e=>e.ApiKeyManagementTab)}})),P=r.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiKeysContent",component:{lazy:()=>Promise.all([t.e(4083),t.e(9400),t.e(20),t.e(1340),t.e(5197),t.e(5943),t.e(7293),t.e(7076),t.e(6837),t.e(5010),t.e(5478),t.e(5427),t.e(484),t.e(1942),t.e(7976),t.e(3658),t.e(2251),t.e(5922)]).then(t.bind(t,42708)).then(e=>e.ApiKeyManagementTab)}})),s=r.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiProductInfoContent",component:{lazy:()=>Promise.all([t.e(4083),t.e(9400),t.e(20),t.e(1340),t.e(7293),t.e(327),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(3658),t.e(3947),t.e(4908)]).then(t.bind(t,34908)).then(e=>e.ApiProductInfoCard)}})),A=r.provide((0,a.createRoutableExtension)({name:"ApiKeyDetailPage",component:()=>Promise.all([t.e(4083),t.e(9400),t.e(20),t.e(1340),t.e(5197),t.e(7076),t.e(8563),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(2967)]).then(t.bind(t,72967)).then(e=>e.ApiKeyDetailPage),mountPoint:o})),y=r.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiProductOpenApiAlert",component:{lazy:()=>Promise.all([t.e(9400),t.e(20),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(6371)]).then(t.bind(t,36371)).then(e=>e.ApiProductOpenApiAlert)}})),h=r.provide((0,a.createRoutableExtension)({name:"ApiProductDetailPage",component:()=>Promise.all([t.e(4083),t.e(9400),t.e(20),t.e(1340),t.e(5197),t.e(5943),t.e(7293),t.e(7076),t.e(6837),t.e(8563),t.e(2769),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(3658),t.e(3947),t.e(5289),t.e(7791)]).then(t.bind(t,57791)).then(e=>e.ApiProductDetailPage),mountPoint:o}))}}]);
2
+ //# sourceMappingURL=exposed-KuadrantPage.f9303a62.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"static/exposed-KuadrantPage.f123b200.chunk.js","mappings":"mgBAEO,MAAMA,GAAeC,EAAAA,EAAAA,gBAAe,CACzCC,GAAI,aAGOC,GAAmBC,EAAAA,EAAAA,mBAAkB,CAChDF,GAAI,oBACJG,OAAQL,EACRM,KAAM,4BCDKC,GAAiBC,EAAAA,EAAAA,cAAa,CACzCN,GAAI,WACJO,OAAQ,CACNC,KAAMV,EACNW,SAAUR,KAIDS,EAAeL,EAAeM,SACzCC,EAAAA,EAAAA,yBAAwB,CACtBC,KAAM,eACNC,UAAW,IACT,oPAAoCC,KAAKC,GAAKA,EAAEC,iBAClDC,WAAYpB,KAIHmB,EAAkBZ,EAAeM,SAC5CC,EAAAA,EAAAA,yBAAwB,CACtBC,KAAM,kBACNC,UAAW,IACT,oPAAoCC,KAAKC,GAAKA,EAAEC,iBAClDC,WAAYpB,KAIHqB,EAAgBd,EAAeM,SAC1CC,EAAAA,EAAAA,yBAAwB,CACtBC,KAAM,gBACNC,UAAW,IACT,4MAAqCC,KAAKC,GAAKA,EAAEG,eACnDD,WAAYpB,KAIHsB,EAAqBf,EAAeM,SAC/CC,EAAAA,EAAAA,yBAAwB,CACtBC,KAAM,qBACNC,UAAW,IACT,gOAA0CC,KAAKC,GAAKA,EAAEK,mCACxDH,WAAYpB,KAIHwB,EAA8BjB,EAAeM,SACxDY,EAAAA,EAAAA,0BAAyB,CACvBV,KAAM,8BACNC,UAAW,CACTU,KAAM,IACJ,iMAAqCT,KAAKC,GAAKA,EAAES,mBAK5CC,EAAoCrB,EAAeM,SAC9DY,EAAAA,EAAAA,0BAAyB,CACvBV,KAAM,oCACNC,UAAW,CACTU,KAAM,IACJ,qNAA2CT,KAAKC,GAAKA,EAAEW,yBAMlDC,EAA+BvB,EAAeM,SACzDY,EAAAA,EAAAA,0BAAyB,CACvBV,KAAM,+BACNC,UAAW,CACTU,KAAM,IACJ,qNAA2CT,KAAKC,GAAKA,EAAEW,yBAKlDE,EAAsCxB,EAAeM,SAChEY,EAAAA,EAAAA,0BAAyB,CACvBV,KAAM,sCACNC,UAAW,CACTU,KAAM,IACJ,uLAA0CT,KAAKC,GAAKA,EAAEc,wBAKjDC,EAAmB1B,EAAeM,SAC7CC,EAAAA,EAAAA,yBAAwB,CACtBC,KAAM,mBACNC,UAAW,IACT,8KAAwCC,KAAKC,GAAKA,EAAEe,kBACtDb,WAAYpB,KAIHkC,EAAuC3B,EAAeM,SACjEY,EAAAA,EAAAA,0BAAyB,CACvBV,KAAM,uCACNC,UAAW,CACTU,KAAM,IACJ,4HAA8CT,KAAKC,GAAKA,EAAEiB,4BAKrDC,EAAuB7B,EAAeM,SACjDC,EAAAA,EAAAA,yBAAwB,CACtBC,KAAM,uBACNC,UAAW,IACT,oPAA4CC,KAAKC,GAAKA,EAAEkB,sBAC1DhB,WAAYpB,I","sources":["webpack://internal.plugin-kuadrant/./src/routes.ts","webpack://internal.plugin-kuadrant/./src/plugin.ts"],"sourcesContent":["import { createRouteRef, createSubRouteRef } from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n id: 'kuadrant',\n});\n\nexport const resourceRouteRef = createSubRouteRef({\n id: 'kuadrant/resource',\n parent: rootRouteRef,\n path: '/:kind/:namespace/:name',\n});\n","import {\n createPlugin,\n createRoutableExtension,\n createComponentExtension,\n} from '@backstage/core-plugin-api';\n\nimport { rootRouteRef, resourceRouteRef } from './routes';\n\nexport const kuadrantPlugin = createPlugin({\n id: 'kuadrant',\n routes: {\n root: rootRouteRef,\n resource: resourceRouteRef,\n },\n});\n\nexport const KuadrantPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'KuadrantPage',\n component: () =>\n import('./components/KuadrantPage').then(m => m.ApiProductsPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const ApiProductsPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiProductsPage',\n component: () =>\n import('./components/KuadrantPage').then(m => m.ApiProductsPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const MyApiKeysPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'MyApiKeysPage',\n component: () =>\n import('./components/MyApiKeysPage').then(m => m.MyApiKeysPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const ApiKeyApprovalPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiKeyApprovalPage',\n component: () =>\n import('./components/ApiKeyApprovalPage').then(m => m.ApiKeyApprovalPageWithPermissions),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const EntityKuadrantApiAccessCard = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiAccessCard',\n component: {\n lazy: () =>\n import('./components/ApiAccessCard').then(m => m.ApiAccessCard),\n },\n }),\n);\n\nexport const EntityKuadrantApiKeyManagementTab = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiKeyManagementTab',\n component: {\n lazy: () =>\n import('./components/ApiKeyManagementTab').then(m => m.ApiKeyManagementTab),\n },\n }),\n);\n\n// entity content extension for api keys tab\nexport const EntityKuadrantApiKeysContent = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiKeysContent',\n component: {\n lazy: () =>\n import('./components/ApiKeyManagementTab').then(m => m.ApiKeyManagementTab),\n },\n }),\n);\n\nexport const EntityKuadrantApiProductInfoContent = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiProductInfoContent',\n component: {\n lazy: () =>\n import('./components/ApiProductInfoCard').then(m => m.ApiProductInfoCard),\n },\n }),\n);\n\nexport const ApiKeyDetailPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiKeyDetailPage',\n component: () =>\n import('./components/ApiKeyDetailPage').then(m => m.ApiKeyDetailPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const EntityKuadrantApiProductOpenApiAlert = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiProductOpenApiAlert',\n component: {\n lazy: () =>\n import('./components/ApiProductOpenApiAlert').then(m => m.ApiProductOpenApiAlert),\n },\n }),\n);\n\nexport const ApiProductDetailPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiProductDetailPage',\n component: () =>\n import('./components/ApiProductDetailPage').then(m => m.ApiProductDetailPage),\n mountPoint: rootRouteRef,\n }),\n);\n"],"names":["rootRouteRef","createRouteRef","id","resourceRouteRef","createSubRouteRef","parent","path","kuadrantPlugin","createPlugin","routes","root","resource","KuadrantPage","provide","createRoutableExtension","name","component","then","m","ApiProductsPage","mountPoint","MyApiKeysPage","ApiKeyApprovalPage","ApiKeyApprovalPageWithPermissions","EntityKuadrantApiAccessCard","createComponentExtension","lazy","ApiAccessCard","EntityKuadrantApiKeyManagementTab","ApiKeyManagementTab","EntityKuadrantApiKeysContent","EntityKuadrantApiProductInfoContent","ApiProductInfoCard","ApiKeyDetailPage","EntityKuadrantApiProductOpenApiAlert","ApiProductOpenApiAlert","ApiProductDetailPage"],"sourceRoot":""}
1
+ {"version":3,"file":"static/exposed-KuadrantPage.f9303a62.chunk.js","mappings":"mgBAEO,MAAMA,GAAeC,EAAAA,EAAAA,gBAAe,CACzCC,GAAI,aAGOC,GAAmBC,EAAAA,EAAAA,mBAAkB,CAChDF,GAAI,oBACJG,OAAQL,EACRM,KAAM,4BCDKC,GAAiBC,EAAAA,EAAAA,cAAa,CACzCN,GAAI,WACJO,OAAQ,CACNC,KAAMV,EACNW,SAAUR,KAIDS,EAAeL,EAAeM,SACzCC,EAAAA,EAAAA,yBAAwB,CACtBC,KAAM,eACNC,UAAW,IACT,oPAAoCC,KAAKC,GAAKA,EAAEC,iBAClDC,WAAYpB,KAIHmB,EAAkBZ,EAAeM,SAC5CC,EAAAA,EAAAA,yBAAwB,CACtBC,KAAM,kBACNC,UAAW,IACT,oPAAoCC,KAAKC,GAAKA,EAAEC,iBAClDC,WAAYpB,KAIHqB,EAAgBd,EAAeM,SAC1CC,EAAAA,EAAAA,yBAAwB,CACtBC,KAAM,gBACNC,UAAW,IACT,4MAAqCC,KAAKC,GAAKA,EAAEG,eACnDD,WAAYpB,KAIHsB,EAAqBf,EAAeM,SAC/CC,EAAAA,EAAAA,yBAAwB,CACtBC,KAAM,qBACNC,UAAW,IACT,gOAA0CC,KAAKC,GAAKA,EAAEK,mCACxDH,WAAYpB,KAIHwB,EAA8BjB,EAAeM,SACxDY,EAAAA,EAAAA,0BAAyB,CACvBV,KAAM,8BACNC,UAAW,CACTU,KAAM,IACJ,iMAAqCT,KAAKC,GAAKA,EAAES,mBAK5CC,EAAoCrB,EAAeM,SAC9DY,EAAAA,EAAAA,0BAAyB,CACvBV,KAAM,oCACNC,UAAW,CACTU,KAAM,IACJ,sNAA2CT,KAAKC,GAAKA,EAAEW,yBAMlDC,EAA+BvB,EAAeM,SACzDY,EAAAA,EAAAA,0BAAyB,CACvBV,KAAM,+BACNC,UAAW,CACTU,KAAM,IACJ,sNAA2CT,KAAKC,GAAKA,EAAEW,yBAKlDE,EAAsCxB,EAAeM,SAChEY,EAAAA,EAAAA,0BAAyB,CACvBV,KAAM,sCACNC,UAAW,CACTU,KAAM,IACJ,uLAA0CT,KAAKC,GAAKA,EAAEc,wBAKjDC,EAAmB1B,EAAeM,SAC7CC,EAAAA,EAAAA,yBAAwB,CACtBC,KAAM,mBACNC,UAAW,IACT,8KAAwCC,KAAKC,GAAKA,EAAEe,kBACtDb,WAAYpB,KAIHkC,EAAuC3B,EAAeM,SACjEY,EAAAA,EAAAA,0BAAyB,CACvBV,KAAM,uCACNC,UAAW,CACTU,KAAM,IACJ,4HAA8CT,KAAKC,GAAKA,EAAEiB,4BAKrDC,EAAuB7B,EAAeM,SACjDC,EAAAA,EAAAA,yBAAwB,CACtBC,KAAM,uBACNC,UAAW,IACT,oPAA4CC,KAAKC,GAAKA,EAAEkB,sBAC1DhB,WAAYpB,I","sources":["webpack://internal.plugin-kuadrant/./src/routes.ts","webpack://internal.plugin-kuadrant/./src/plugin.ts"],"sourcesContent":["import { createRouteRef, createSubRouteRef } from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n id: 'kuadrant',\n});\n\nexport const resourceRouteRef = createSubRouteRef({\n id: 'kuadrant/resource',\n parent: rootRouteRef,\n path: '/:kind/:namespace/:name',\n});\n","import {\n createPlugin,\n createRoutableExtension,\n createComponentExtension,\n} from '@backstage/core-plugin-api';\n\nimport { rootRouteRef, resourceRouteRef } from './routes';\n\nexport const kuadrantPlugin = createPlugin({\n id: 'kuadrant',\n routes: {\n root: rootRouteRef,\n resource: resourceRouteRef,\n },\n});\n\nexport const KuadrantPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'KuadrantPage',\n component: () =>\n import('./components/KuadrantPage').then(m => m.ApiProductsPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const ApiProductsPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiProductsPage',\n component: () =>\n import('./components/KuadrantPage').then(m => m.ApiProductsPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const MyApiKeysPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'MyApiKeysPage',\n component: () =>\n import('./components/MyApiKeysPage').then(m => m.MyApiKeysPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const ApiKeyApprovalPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiKeyApprovalPage',\n component: () =>\n import('./components/ApiKeyApprovalPage').then(m => m.ApiKeyApprovalPageWithPermissions),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const EntityKuadrantApiAccessCard = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiAccessCard',\n component: {\n lazy: () =>\n import('./components/ApiAccessCard').then(m => m.ApiAccessCard),\n },\n }),\n);\n\nexport const EntityKuadrantApiKeyManagementTab = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiKeyManagementTab',\n component: {\n lazy: () =>\n import('./components/ApiKeyManagementTab').then(m => m.ApiKeyManagementTab),\n },\n }),\n);\n\n// entity content extension for api keys tab\nexport const EntityKuadrantApiKeysContent = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiKeysContent',\n component: {\n lazy: () =>\n import('./components/ApiKeyManagementTab').then(m => m.ApiKeyManagementTab),\n },\n }),\n);\n\nexport const EntityKuadrantApiProductInfoContent = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiProductInfoContent',\n component: {\n lazy: () =>\n import('./components/ApiProductInfoCard').then(m => m.ApiProductInfoCard),\n },\n }),\n);\n\nexport const ApiKeyDetailPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiKeyDetailPage',\n component: () =>\n import('./components/ApiKeyDetailPage').then(m => m.ApiKeyDetailPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const EntityKuadrantApiProductOpenApiAlert = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiProductOpenApiAlert',\n component: {\n lazy: () =>\n import('./components/ApiProductOpenApiAlert').then(m => m.ApiProductOpenApiAlert),\n },\n }),\n);\n\nexport const ApiProductDetailPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiProductDetailPage',\n component: () =>\n import('./components/ApiProductDetailPage').then(m => m.ApiProductDetailPage),\n mountPoint: rootRouteRef,\n }),\n);\n"],"names":["rootRouteRef","createRouteRef","id","resourceRouteRef","createSubRouteRef","parent","path","kuadrantPlugin","createPlugin","routes","root","resource","KuadrantPage","provide","createRoutableExtension","name","component","then","m","ApiProductsPage","mountPoint","MyApiKeysPage","ApiKeyApprovalPage","ApiKeyApprovalPageWithPermissions","EntityKuadrantApiAccessCard","createComponentExtension","lazy","ApiAccessCard","EntityKuadrantApiKeyManagementTab","ApiKeyManagementTab","EntityKuadrantApiKeysContent","EntityKuadrantApiProductInfoContent","ApiProductInfoCard","ApiKeyDetailPage","EntityKuadrantApiProductOpenApiAlert","ApiProductOpenApiAlert","ApiProductDetailPage"],"sourceRoot":""}
@@ -1,2 +1,2 @@
1
- "use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[879,6921],{19833:(e,t,n)=>{n.d(t,{m:()=>r});var a=n(31085),i=(n(95478),n(23015));const r=e=>(0,a.jsxs)(i.A,{...e,viewBox:"0 0 1024 1024",sx:{transform:"scale(0.85)",marginLeft:"4px",...e.sx},children:[(0,a.jsx)("path",{d:"M809,1C993.59,183.56 1065.7,449.65 998.12,699.05C964.778,821.823 899.519,933.607 809,1023L292.27,512L809,1Z",fill:"currentColor"}),(0,a.jsx)("rect",{x:"1",y:"1",width:"218",height:"1022",fill:"currentColor"})]})},34541:(e,t,n)=>{n.d(t,{G:()=>x});var a=n(31085),i=(n(95478),n(25467)),r=n(22097),o=n(42367),s=n(96040),d=n(72501),l=n(10394),c=n(58837),p=n(4387),u=n(91638),A=n(46205),m=n(34955),P=n(89509),y=n(71255),h=n(70980);const v=(0,c.A)(e=>({label:{fontWeight:600,color:e.palette.text.secondary,marginBottom:e.spacing(.5),fontSize:"0.75rem",textTransform:"uppercase"}})),x=()=>{var e,t,n,c,x,g,f,K,j,k;const b=v(),{entity:w}=(0,i.tN)(),I=(0,r.useApi)(h.s),C=(0,r.useApi)(r.identityApiRef),{allowed:E,loading:R}=(0,A.l)(m.Al),S=null===(e=w.metadata.annotations)||void 0===e?void 0:e["kuadrant.io/namespace"],D=null===(t=w.metadata.annotations)||void 0===t?void 0:t["kuadrant.io/apiproduct"],{value:O}=(0,u.A)(async()=>(await C.getBackstageIdentity()).userEntityRef.split("/")[1]||"guest",[C]),{value:z,loading:M,error:L}=(0,u.A)(async()=>S&&D?I.getApiProduct(S,D):null,[I,S,D]),T=null==z||null===(c=z.metadata)||void 0===c||null===(n=c.annotations)||void 0===n?void 0:n["backstage.io/owner"],B=null==T?void 0:T.split("/")[1],$=E||O&&B===O;if(!S||!D)return(0,a.jsx)(s.n,{title:"API Product Information",children:(0,a.jsx)(d.A,{children:"No APIProduct linked to this API entity"})});if(M||R)return(0,a.jsx)(s.n,{title:"API Product Information",children:(0,a.jsx)(l.A,{p:2,children:[...Array(5)].map((e,t)=>(0,a.jsx)(l.A,{mb:2,children:(0,a.jsx)(p.A,{variant:"text",width:"100%"})},t))})});if(z&&!$)return(0,a.jsx)(s.n,{title:"API Product Information",children:(0,a.jsx)(l.A,{p:2,children:(0,a.jsx)(d.A,{variant:"body2",color:"textSecondary",children:"You don't have permission to view this API product's details. Only the API owner or users with admin permissions can view this information."})})});if(L&&L.message.includes("you can only read your own"))return(0,a.jsx)(s.n,{title:"API Product Information",children:(0,a.jsx)(l.A,{p:2,children:(0,a.jsx)(d.A,{variant:"body2",color:"textSecondary",children:"You don't have permission to view this API product's details. Only the API owner or users with admin permissions can view this information."})})});if(L)return(0,a.jsx)(s.n,{title:"API Product Information",children:(0,a.jsx)(o._,{error:L})});if(!z)return(0,a.jsx)(s.n,{title:"API Product Information",children:(0,a.jsx)(d.A,{children:"APIProduct not found"})});const _=(null===(g=z.status)||void 0===g||null===(x=g.discoveredAuthScheme)||void 0===x?void 0:x.authentication)||{},F=Object.values(_).find(e=>e.hasOwnProperty("jwt")),U=Boolean(F),N=null==F||null===(f=F.jwt)||void 0===f?void 0:f.issuerUrl,q=null===(j=z.status)||void 0===j||null===(K=j.oidcDiscovery)||void 0===K?void 0:K.tokenEndpoint;return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(s.n,{title:"API Product Details",children:[(0,a.jsxs)(l.A,{mb:2,children:[(0,a.jsx)(d.A,{variant:"caption",className:b.label,children:"Product Name"}),(0,a.jsx)(d.A,{variant:"h6",children:(null===(k=z.spec)||void 0===k?void 0:k.displayName)||D})]}),(0,a.jsx)(P.O,{product:z,showStatus:!1,showCatalogLink:!1})]}),U&&N&&(0,a.jsx)(l.A,{mt:2,children:(0,a.jsx)(y.n,{issuerUrl:N,tokenEndpoint:q})})]})}},57349:(e,t,n)=>{n.d(t,{z:()=>b});var a=n(31085),i=n(95478),r=n(35015),o=n(42367),s=n(96040),d=n(10394),l=n(72501),c=n(67720),p=n(71677),u=n(29365),A=n(64947),m=n(4387),P=n(18466),y=n(32269),h=n(61524),v=n(99594),x=n(22097),g=n(70980),f=n(25467),K=n(14933),j=n(46205),k=n(34955);const b=({namespace:e})=>{var t,n,b;const{entity:w}=(0,f.tN)(),I=(0,x.useApi)(g.s),C=(0,x.useApi)(x.identityApiRef),E=(0,x.useApi)(x.alertApiRef),[R,S]=(0,i.useState)(""),[D,O]=(0,i.useState)(!1),[z,M]=(0,i.useState)(0),[L,T]=(0,i.useState)(new Set),[B,$]=(0,i.useState)(new Map),[_,F]=(0,i.useState)(new Set),U=(null===(t=w.metadata.annotations)||void 0===t?void 0:t["kuadrant.io/apiproduct"])||w.metadata.name,N=(null===(n=w.metadata.annotations)||void 0===n?void 0:n["kuadrant.io/namespace"])||e||"default";(0,r.A)(async()=>{const e=await C.getProfileInfo();S(e.email||"")},[C]);const{value:q,loading:W,error:V}=(0,r.A)(async()=>((await I.getRequestsByApiProduct(U,N)).items||[]).filter(e=>{var t;return"Approved"===(null===(t=e.status)||void 0===t?void 0:t.phase)}),[N,U,I,z]),{value:Y,loading:G}=(0,r.A)(async()=>{try{var e;return null===(e=(await I.getApiProducts()).items)||void 0===e?void 0:e.find(e=>e.metadata.namespace===N&&e.metadata.name===U)}catch(e){return null}},[N,U,I]),H=Y?`apiproduct:${Y.metadata.namespace}/${Y.metadata.name}`:void 0,{allowed:J,loading:Z}=(0,j.l)(k.dp,H),Q=e=>{T(t=>{const n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})};if(W||G||Z)return(0,a.jsx)(s.n,{title:"Kuadrant API Keys",children:(0,a.jsxs)(d.A,{p:2,children:[(0,a.jsx)(m.A,{variant:"text",width:"80%"}),(0,a.jsx)(m.A,{variant:"text",width:"60%"}),(0,a.jsx)(m.A,{variant:"text",width:"70%"})]})});if(V)return(0,a.jsx)(o._,{error:V});const X=q||[],ee=(null==Y||null===(b=Y.status)||void 0===b?void 0:b.discoveredPlans)||[],te=J&&ee.length>0;return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(s.n,{title:"Kuadrant API Keys",children:(0,a.jsxs)(d.A,{p:2,children:[X.length>0?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(l.A,{variant:"body2",color:"textSecondary",gutterBottom:!0,children:[X.length," active key",1!==X.length?"s":""]}),X.map(e=>{var t,n;const i=`${e.metadata.namespace}/${e.metadata.name}`,r=L.has(e.metadata.name),o=_.has(i),s=B.get(i),A=Boolean(null===(n=e.spec)||void 0===n||null===(t=n.secretRef)||void 0===t?void 0:t.name);return(0,a.jsxs)(d.A,{mb:1,p:1.5,border:1,borderColor:"grey.300",borderRadius:4,children:[(0,a.jsxs)(d.A,{display:"flex",justifyContent:"space-between",alignItems:"center",mb:1,children:[(0,a.jsx)(l.A,{variant:"body2",style:{fontWeight:500},children:e.metadata.name}),(0,a.jsx)(c.A,{label:e.spec.planTier,color:"primary",size:"small"})]}),A&&(0,a.jsxs)(d.A,{display:"flex",alignItems:"center",children:[(0,a.jsx)(l.A,{variant:"body2",style:{fontFamily:"monospace",fontSize:"0.8rem",flex:1,overflow:"hidden",textOverflow:"ellipsis"},children:o?"Loading...":r&&s?s:"••••••••••••••••"}),r&&s&&(0,a.jsx)(p.Ay,{title:"Copy to clipboard",children:(0,a.jsx)(u.A,{size:"small",onClick:async()=>{s&&(await navigator.clipboard.writeText(s),E.post({message:"API key copied to clipboard",severity:"success",display:"transient"}))},children:(0,a.jsx)(v.A,{fontSize:"small"})})}),(0,a.jsx)(p.Ay,{title:r?"Hide API key":"Reveal API key",children:(0,a.jsx)("span",{children:(0,a.jsx)(u.A,{size:"small",onClick:()=>{r?(((e,t)=>{const n=`${e}/${t}`;$(e=>{const t=new Map(e);return t.delete(n),t})})(e.metadata.namespace,e.metadata.name),Q(e.metadata.name)):(async(e,t)=>{const n=`${e}/${t}`;if(!_.has(n)){F(e=>new Set(e).add(n));try{const a=await I.getApiKeySecret(e,t);$(e=>new Map(e).set(n,a.apiKey)),Q(t)}catch(e){console.error("failed to fetch api key:",e);const t=e instanceof Error?e.message:"unknown error occurred";E.post({message:`Failed to fetch APIKey. ${t}`,severity:"error",display:"transient"})}finally{F(e=>{const t=new Set(e);return t.delete(n),t})}}})(e.metadata.namespace,e.metadata.name)},disabled:o,children:r?(0,a.jsx)(h.A,{fontSize:"small"}):(0,a.jsx)(y.A,{fontSize:"small"})})})})]})]},e.metadata.name)})]}):(0,a.jsx)(l.A,{variant:"body1",gutterBottom:!0,children:"You don't have any API keys for this API yet"}),(0,a.jsx)(d.A,{mt:2,children:te?(0,a.jsx)(A.A,{variant:"contained",color:"primary",size:"small",startIcon:(0,a.jsx)(P.A,{}),onClick:()=>O(!0),"data-testid":"request-api-access-button",children:"Request API Access"}):(0,a.jsx)(l.A,{variant:"caption",color:"textSecondary",children:"Visit the API Keys tab to view and manage access"})})]})}),(0,a.jsx)(K.c,{open:D,onClose:()=>O(!1),onSuccess:()=>{O(!1),M(e=>e+1)},apiProductName:U,namespace:N,userEmail:R,plans:ee})]})}},58373:(e,t,n)=>{n.r(t),n.d(t,{ApiAccessCard:()=>i.z,ApiIcon:()=>u,ApiKeyApprovalPage:()=>a.ApiKeyApprovalPage,ApiKeyDetailPage:()=>a.ApiKeyDetailPage,ApiKeyManagementTab:()=>r._,ApiProductDetailPage:()=>a.ApiProductDetailPage,ApiProductInfoCard:()=>o.G,ApiProductsPage:()=>a.ApiProductsPage,ApprovalIcon:()=>m,EntityKuadrantApiAccessCard:()=>a.EntityKuadrantApiAccessCard,EntityKuadrantApiKeyManagementTab:()=>a.EntityKuadrantApiKeyManagementTab,EntityKuadrantApiKeysContent:()=>a.EntityKuadrantApiKeysContent,EntityKuadrantApiProductInfoContent:()=>a.EntityKuadrantApiProductInfoContent,EntityKuadrantApiProductOpenApiAlert:()=>a.EntityKuadrantApiProductOpenApiAlert,KeyIcon:()=>A,KuadrantIcon:()=>s.m,KuadrantPage:()=>a.KuadrantPage,MyApiKeysPage:()=>a.MyApiKeysPage,kuadrantApiFactory:()=>v,kuadrantApiKeyApprovePermission:()=>P.KV,kuadrantApiKeyCreatePermission:()=>P.dp,kuadrantApiKeyDeleteAllPermission:()=>P.jH,kuadrantApiKeyDeleteOwnPermission:()=>P.uL,kuadrantApiKeyReadAllPermission:()=>P.kd,kuadrantApiKeyReadOwnPermission:()=>P.DS,kuadrantApiKeyUpdateAllPermission:()=>P.z4,kuadrantApiKeyUpdateOwnPermission:()=>P.q0,kuadrantApiProductCreatePermission:()=>P.FL,kuadrantApiProductDeleteAllPermission:()=>P.R_,kuadrantApiProductDeleteOwnPermission:()=>P.EM,kuadrantApiProductListPermission:()=>P.vs,kuadrantApiProductReadAllPermission:()=>P.Al,kuadrantApiProductReadOwnPermission:()=>P.T0,kuadrantApiProductUpdateAllPermission:()=>P.v_,kuadrantApiProductUpdateOwnPermission:()=>P.U3,kuadrantApiRef:()=>y.s,kuadrantAuthPolicyListPermission:()=>P.WE,kuadrantPermissions:()=>P.L5,kuadrantPlanPolicyCreatePermission:()=>P.Lb,kuadrantPlanPolicyDeletePermission:()=>P.Kx,kuadrantPlanPolicyListPermission:()=>P.J,kuadrantPlanPolicyReadPermission:()=>P.VS,kuadrantPlanPolicyUpdatePermission:()=>P.sB,kuadrantPlugin:()=>a.kuadrantPlugin,kuadrantRateLimitPolicyListPermission:()=>P.xO});var a=n(72627),i=n(57349),r=n(82251),o=n(34541),s=n(19833),d=n(31085),l=(n(95478),n(2350)),c=n(86733),p=n(98899);const u=e=>(0,d.jsx)(l.A,{...e}),A=e=>(0,d.jsx)(c.A,{...e}),m=e=>(0,d.jsx)(p.A,{...e});var P=n(34955),y=n(70980),h=n(22097);const v=(0,h.createApiFactory)({api:y.s,deps:{discoveryApi:h.discoveryApiRef,fetchApi:h.fetchApiRef,identityApi:h.identityApiRef},factory:({discoveryApi:e,fetchApi:t,identityApi:n})=>new y.y({discoveryApi:e,fetchApi:t,identityApi:n})})},72627:(e,t,n)=>{n.r(t),n.d(t,{ApiKeyApprovalPage:()=>c,ApiKeyDetailPage:()=>P,ApiProductDetailPage:()=>h,ApiProductsPage:()=>d,EntityKuadrantApiAccessCard:()=>p,EntityKuadrantApiKeyManagementTab:()=>u,EntityKuadrantApiKeysContent:()=>A,EntityKuadrantApiProductInfoContent:()=>m,EntityKuadrantApiProductOpenApiAlert:()=>y,KuadrantPage:()=>s,MyApiKeysPage:()=>l,kuadrantPlugin:()=>o});var a=n(22097);const i=(0,a.createRouteRef)({id:"kuadrant"}),r=(0,a.createSubRouteRef)({id:"kuadrant/resource",parent:i,path:"/:kind/:namespace/:name"}),o=(0,a.createPlugin)({id:"kuadrant",routes:{root:i,resource:r}}),s=o.provide((0,a.createRoutableExtension)({name:"KuadrantPage",component:()=>Promise.all([n.e(4083),n.e(9400),n.e(20),n.e(1340),n.e(5197),n.e(5943),n.e(7293),n.e(7076),n.e(6837),n.e(5010),n.e(8563),n.e(1931),n.e(5478),n.e(5427),n.e(9634),n.e(484),n.e(1942),n.e(7976),n.e(3658),n.e(5289),n.e(2821)]).then(n.bind(n,80243)).then(e=>e.ApiProductsPage),mountPoint:i})),d=o.provide((0,a.createRoutableExtension)({name:"ApiProductsPage",component:()=>Promise.all([n.e(4083),n.e(9400),n.e(20),n.e(1340),n.e(5197),n.e(5943),n.e(7293),n.e(7076),n.e(6837),n.e(5010),n.e(8563),n.e(1931),n.e(5478),n.e(5427),n.e(9634),n.e(484),n.e(1942),n.e(7976),n.e(3658),n.e(5289),n.e(2821)]).then(n.bind(n,80243)).then(e=>e.ApiProductsPage),mountPoint:i})),l=o.provide((0,a.createRoutableExtension)({name:"MyApiKeysPage",component:()=>Promise.all([n.e(4083),n.e(9400),n.e(20),n.e(1340),n.e(5197),n.e(5943),n.e(7076),n.e(6837),n.e(5010),n.e(8563),n.e(5478),n.e(5427),n.e(9634),n.e(484),n.e(1942),n.e(7976),n.e(7270)]).then(n.bind(n,37270)).then(e=>e.MyApiKeysPage),mountPoint:i})),c=o.provide((0,a.createRoutableExtension)({name:"ApiKeyApprovalPage",component:()=>Promise.all([n.e(4083),n.e(9400),n.e(20),n.e(1340),n.e(5197),n.e(5943),n.e(7293),n.e(7076),n.e(6837),n.e(5010),n.e(8563),n.e(5478),n.e(5427),n.e(9634),n.e(484),n.e(1942),n.e(7976),n.e(3658),n.e(3917)]).then(n.bind(n,73917)).then(e=>e.ApiKeyApprovalPageWithPermissions),mountPoint:i})),p=o.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiAccessCard",component:{lazy:()=>Promise.all([n.e(4083),n.e(9400),n.e(20),n.e(1340),n.e(5197),n.e(5943),n.e(7293),n.e(438),n.e(5478),n.e(5427),n.e(9634),n.e(484),n.e(1942),n.e(7976),n.e(3658),n.e(1719)]).then(n.bind(n,11719)).then(e=>e.ApiAccessCard)}})),u=o.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiKeyManagementTab",component:{lazy:()=>Promise.all([n.e(4083),n.e(9400),n.e(20),n.e(1340),n.e(5197),n.e(5943),n.e(7293),n.e(7076),n.e(6837),n.e(5010),n.e(5478),n.e(5427),n.e(484),n.e(1942),n.e(7976),n.e(3658),n.e(2251),n.e(980)]).then(n.bind(n,42708)).then(e=>e.ApiKeyManagementTab)}})),A=o.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiKeysContent",component:{lazy:()=>Promise.all([n.e(4083),n.e(9400),n.e(20),n.e(1340),n.e(5197),n.e(5943),n.e(7293),n.e(7076),n.e(6837),n.e(5010),n.e(5478),n.e(5427),n.e(484),n.e(1942),n.e(7976),n.e(3658),n.e(2251),n.e(980)]).then(n.bind(n,42708)).then(e=>e.ApiKeyManagementTab)}})),m=o.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiProductInfoContent",component:{lazy:()=>Promise.all([n.e(4083),n.e(9400),n.e(20),n.e(1340),n.e(7293),n.e(327),n.e(5478),n.e(5427),n.e(9634),n.e(484),n.e(1942),n.e(7976),n.e(3658),n.e(3947),n.e(4908)]).then(n.bind(n,34908)).then(e=>e.ApiProductInfoCard)}})),P=o.provide((0,a.createRoutableExtension)({name:"ApiKeyDetailPage",component:()=>Promise.all([n.e(4083),n.e(9400),n.e(20),n.e(1340),n.e(5197),n.e(7076),n.e(8563),n.e(5478),n.e(5427),n.e(9634),n.e(484),n.e(1942),n.e(7976),n.e(2967)]).then(n.bind(n,72967)).then(e=>e.ApiKeyDetailPage),mountPoint:i})),y=o.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiProductOpenApiAlert",component:{lazy:()=>Promise.all([n.e(9400),n.e(20),n.e(5478),n.e(5427),n.e(9634),n.e(484),n.e(1942),n.e(7976),n.e(6371)]).then(n.bind(n,36371)).then(e=>e.ApiProductOpenApiAlert)}})),h=o.provide((0,a.createRoutableExtension)({name:"ApiProductDetailPage",component:()=>Promise.all([n.e(4083),n.e(9400),n.e(20),n.e(1340),n.e(5197),n.e(5943),n.e(7293),n.e(7076),n.e(6837),n.e(8563),n.e(2769),n.e(5478),n.e(5427),n.e(9634),n.e(484),n.e(1942),n.e(7976),n.e(3658),n.e(3947),n.e(5289),n.e(7791)]).then(n.bind(n,57791)).then(e=>e.ApiProductDetailPage),mountPoint:i}))}}]);
2
- //# sourceMappingURL=exposed-PluginRoot.3a5f9157.chunk.js.map
1
+ "use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[879,6921],{19833:(e,t,n)=>{n.d(t,{m:()=>r});var a=n(31085),i=(n(95478),n(23015));const r=e=>(0,a.jsxs)(i.A,{...e,viewBox:"0 0 1024 1024",sx:{transform:"scale(0.85)",marginLeft:"4px",...e.sx},children:[(0,a.jsx)("path",{d:"M809,1C993.59,183.56 1065.7,449.65 998.12,699.05C964.778,821.823 899.519,933.607 809,1023L292.27,512L809,1Z",fill:"currentColor"}),(0,a.jsx)("rect",{x:"1",y:"1",width:"218",height:"1022",fill:"currentColor"})]})},34541:(e,t,n)=>{n.d(t,{G:()=>x});var a=n(31085),i=(n(95478),n(25467)),r=n(22097),o=n(42367),s=n(96040),d=n(72501),l=n(10394),c=n(58837),p=n(4387),u=n(91638),A=n(46205),m=n(34955),P=n(89509),y=n(71255),h=n(70980);const v=(0,c.A)(e=>({label:{fontWeight:600,color:e.palette.text.secondary,marginBottom:e.spacing(.5),fontSize:"0.75rem",textTransform:"uppercase"}})),x=()=>{var e,t,n,c,x,g,f,K,j,k;const b=v(),{entity:w}=(0,i.tN)(),I=(0,r.useApi)(h.s),C=(0,r.useApi)(r.identityApiRef),{allowed:E,loading:R}=(0,A.l)(m.Al),S=null===(e=w.metadata.annotations)||void 0===e?void 0:e["kuadrant.io/namespace"],D=null===(t=w.metadata.annotations)||void 0===t?void 0:t["kuadrant.io/apiproduct"],{value:O}=(0,u.A)(async()=>(await C.getBackstageIdentity()).userEntityRef.split("/")[1]||"guest",[C]),{value:z,loading:M,error:L}=(0,u.A)(async()=>S&&D?I.getApiProduct(S,D):null,[I,S,D]),T=null==z||null===(c=z.metadata)||void 0===c||null===(n=c.annotations)||void 0===n?void 0:n["backstage.io/owner"],B=null==T?void 0:T.split("/")[1],$=E||O&&B===O;if(!S||!D)return(0,a.jsx)(s.n,{title:"API Product Information",children:(0,a.jsx)(d.A,{children:"No APIProduct linked to this API entity"})});if(M||R)return(0,a.jsx)(s.n,{title:"API Product Information",children:(0,a.jsx)(l.A,{p:2,children:[...Array(5)].map((e,t)=>(0,a.jsx)(l.A,{mb:2,children:(0,a.jsx)(p.A,{variant:"text",width:"100%"})},t))})});if(z&&!$)return(0,a.jsx)(s.n,{title:"API Product Information",children:(0,a.jsx)(l.A,{p:2,children:(0,a.jsx)(d.A,{variant:"body2",color:"textSecondary",children:"You don't have permission to view this API product's details. Only the API owner or users with admin permissions can view this information."})})});if(L&&L.message.includes("you can only read your own"))return(0,a.jsx)(s.n,{title:"API Product Information",children:(0,a.jsx)(l.A,{p:2,children:(0,a.jsx)(d.A,{variant:"body2",color:"textSecondary",children:"You don't have permission to view this API product's details. Only the API owner or users with admin permissions can view this information."})})});if(L)return(0,a.jsx)(s.n,{title:"API Product Information",children:(0,a.jsx)(o._,{error:L})});if(!z)return(0,a.jsx)(s.n,{title:"API Product Information",children:(0,a.jsx)(d.A,{children:"APIProduct not found"})});const _=(null===(g=z.status)||void 0===g||null===(x=g.discoveredAuthScheme)||void 0===x?void 0:x.authentication)||{},F=Object.values(_).find(e=>e.hasOwnProperty("jwt")),U=Boolean(F),N=null==F||null===(f=F.jwt)||void 0===f?void 0:f.issuerUrl,q=null===(j=z.status)||void 0===j||null===(K=j.oidcDiscovery)||void 0===K?void 0:K.tokenEndpoint;return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(s.n,{title:"API Product Details",children:[(0,a.jsxs)(l.A,{mb:2,children:[(0,a.jsx)(d.A,{variant:"caption",className:b.label,children:"Product Name"}),(0,a.jsx)(d.A,{variant:"h6",children:(null===(k=z.spec)||void 0===k?void 0:k.displayName)||D})]}),(0,a.jsx)(P.O,{product:z,showStatus:!1,showCatalogLink:!1})]}),U&&N&&(0,a.jsx)(l.A,{mt:2,children:(0,a.jsx)(y.n,{issuerUrl:N,tokenEndpoint:q})})]})}},57349:(e,t,n)=>{n.d(t,{z:()=>b});var a=n(31085),i=n(95478),r=n(35015),o=n(42367),s=n(96040),d=n(10394),l=n(72501),c=n(67720),p=n(71677),u=n(29365),A=n(64947),m=n(4387),P=n(18466),y=n(32269),h=n(61524),v=n(99594),x=n(22097),g=n(70980),f=n(25467),K=n(14933),j=n(46205),k=n(34955);const b=({namespace:e})=>{var t,n,b;const{entity:w}=(0,f.tN)(),I=(0,x.useApi)(g.s),C=(0,x.useApi)(x.identityApiRef),E=(0,x.useApi)(x.alertApiRef),[R,S]=(0,i.useState)(""),[D,O]=(0,i.useState)(!1),[z,M]=(0,i.useState)(0),[L,T]=(0,i.useState)(new Set),[B,$]=(0,i.useState)(new Map),[_,F]=(0,i.useState)(new Set),U=(null===(t=w.metadata.annotations)||void 0===t?void 0:t["kuadrant.io/apiproduct"])||w.metadata.name,N=(null===(n=w.metadata.annotations)||void 0===n?void 0:n["kuadrant.io/namespace"])||e||"default";(0,r.A)(async()=>{const e=await C.getProfileInfo();S(e.email||"")},[C]);const{value:q,loading:W,error:V}=(0,r.A)(async()=>((await I.getRequestsByApiProduct(U,N)).items||[]).filter(e=>{var t;return"Approved"===(null===(t=e.status)||void 0===t?void 0:t.phase)}),[N,U,I,z]),{value:Y,loading:G}=(0,r.A)(async()=>{try{var e;return null===(e=(await I.getApiProducts()).items)||void 0===e?void 0:e.find(e=>e.metadata.namespace===N&&e.metadata.name===U)}catch(e){return null}},[N,U,I]),H=Y?`apiproduct:${Y.metadata.namespace}/${Y.metadata.name}`:void 0,{allowed:J,loading:Z}=(0,j.l)(k.dp,H),Q=e=>{T(t=>{const n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})};if(W||G||Z)return(0,a.jsx)(s.n,{title:"Kuadrant API Keys",children:(0,a.jsxs)(d.A,{p:2,children:[(0,a.jsx)(m.A,{variant:"text",width:"80%"}),(0,a.jsx)(m.A,{variant:"text",width:"60%"}),(0,a.jsx)(m.A,{variant:"text",width:"70%"})]})});if(V)return(0,a.jsx)(o._,{error:V});const X=q||[],ee=(null==Y||null===(b=Y.status)||void 0===b?void 0:b.discoveredPlans)||[],te=J&&ee.length>0;return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(s.n,{title:"Kuadrant API Keys",children:(0,a.jsxs)(d.A,{p:2,children:[X.length>0?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(l.A,{variant:"body2",color:"textSecondary",gutterBottom:!0,children:[X.length," active key",1!==X.length?"s":""]}),X.map(e=>{var t,n;const i=`${e.metadata.namespace}/${e.metadata.name}`,r=L.has(e.metadata.name),o=_.has(i),s=B.get(i),A=Boolean(null===(n=e.spec)||void 0===n||null===(t=n.secretRef)||void 0===t?void 0:t.name);return(0,a.jsxs)(d.A,{mb:1,p:1.5,border:1,borderColor:"grey.300",borderRadius:4,children:[(0,a.jsxs)(d.A,{display:"flex",justifyContent:"space-between",alignItems:"center",mb:1,children:[(0,a.jsx)(l.A,{variant:"body2",style:{fontWeight:500},children:e.metadata.name}),(0,a.jsx)(c.A,{label:e.spec.planTier,color:"primary",size:"small"})]}),A&&(0,a.jsxs)(d.A,{display:"flex",alignItems:"center",children:[(0,a.jsx)(l.A,{variant:"body2",style:{fontFamily:"monospace",fontSize:"0.8rem",flex:1,overflow:"hidden",textOverflow:"ellipsis"},children:o?"Loading...":r&&s?s:"••••••••••••••••"}),r&&s&&(0,a.jsx)(p.Ay,{title:"Copy to clipboard",children:(0,a.jsx)(u.A,{size:"small",onClick:async()=>{s&&(await navigator.clipboard.writeText(s),E.post({message:"API key copied to clipboard",severity:"success",display:"transient"}))},children:(0,a.jsx)(v.A,{fontSize:"small"})})}),(0,a.jsx)(p.Ay,{title:r?"Hide API key":"Reveal API key",children:(0,a.jsx)("span",{children:(0,a.jsx)(u.A,{size:"small",onClick:()=>{r?(((e,t)=>{const n=`${e}/${t}`;$(e=>{const t=new Map(e);return t.delete(n),t})})(e.metadata.namespace,e.metadata.name),Q(e.metadata.name)):(async(e,t)=>{const n=`${e}/${t}`;if(!_.has(n)){F(e=>new Set(e).add(n));try{const a=await I.getApiKeySecret(e,t);$(e=>new Map(e).set(n,a.apiKey)),Q(t)}catch(e){console.error("failed to fetch api key:",e);const t=e instanceof Error?e.message:"unknown error occurred";E.post({message:`Failed to fetch APIKey. ${t}`,severity:"error",display:"transient"})}finally{F(e=>{const t=new Set(e);return t.delete(n),t})}}})(e.metadata.namespace,e.metadata.name)},disabled:o,children:r?(0,a.jsx)(h.A,{fontSize:"small"}):(0,a.jsx)(y.A,{fontSize:"small"})})})})]})]},e.metadata.name)})]}):(0,a.jsx)(l.A,{variant:"body1",gutterBottom:!0,children:"You don't have any API keys for this API yet"}),(0,a.jsx)(d.A,{mt:2,children:te?(0,a.jsx)(A.A,{variant:"contained",color:"primary",size:"small",startIcon:(0,a.jsx)(P.A,{}),onClick:()=>O(!0),"data-testid":"request-api-access-button",children:"Request API Access"}):(0,a.jsx)(l.A,{variant:"caption",color:"textSecondary",children:"Visit the API Keys tab to view and manage access"})})]})}),(0,a.jsx)(K.c,{open:D,onClose:()=>O(!1),onSuccess:()=>{O(!1),M(e=>e+1)},apiProductName:U,namespace:N,userEmail:R,plans:ee})]})}},58373:(e,t,n)=>{n.r(t),n.d(t,{ApiAccessCard:()=>i.z,ApiIcon:()=>u,ApiKeyApprovalPage:()=>a.ApiKeyApprovalPage,ApiKeyDetailPage:()=>a.ApiKeyDetailPage,ApiKeyManagementTab:()=>r._,ApiProductDetailPage:()=>a.ApiProductDetailPage,ApiProductInfoCard:()=>o.G,ApiProductsPage:()=>a.ApiProductsPage,ApprovalIcon:()=>m,EntityKuadrantApiAccessCard:()=>a.EntityKuadrantApiAccessCard,EntityKuadrantApiKeyManagementTab:()=>a.EntityKuadrantApiKeyManagementTab,EntityKuadrantApiKeysContent:()=>a.EntityKuadrantApiKeysContent,EntityKuadrantApiProductInfoContent:()=>a.EntityKuadrantApiProductInfoContent,EntityKuadrantApiProductOpenApiAlert:()=>a.EntityKuadrantApiProductOpenApiAlert,KeyIcon:()=>A,KuadrantIcon:()=>s.m,KuadrantPage:()=>a.KuadrantPage,MyApiKeysPage:()=>a.MyApiKeysPage,kuadrantApiFactory:()=>v,kuadrantApiKeyApprovePermission:()=>P.KV,kuadrantApiKeyCreatePermission:()=>P.dp,kuadrantApiKeyDeleteAllPermission:()=>P.jH,kuadrantApiKeyDeleteOwnPermission:()=>P.uL,kuadrantApiKeyReadAllPermission:()=>P.kd,kuadrantApiKeyReadOwnPermission:()=>P.DS,kuadrantApiKeyUpdateAllPermission:()=>P.z4,kuadrantApiKeyUpdateOwnPermission:()=>P.q0,kuadrantApiProductCreatePermission:()=>P.FL,kuadrantApiProductDeleteAllPermission:()=>P.R_,kuadrantApiProductDeleteOwnPermission:()=>P.EM,kuadrantApiProductListPermission:()=>P.vs,kuadrantApiProductReadAllPermission:()=>P.Al,kuadrantApiProductReadOwnPermission:()=>P.T0,kuadrantApiProductUpdateAllPermission:()=>P.v_,kuadrantApiProductUpdateOwnPermission:()=>P.U3,kuadrantApiRef:()=>y.s,kuadrantAuthPolicyListPermission:()=>P.WE,kuadrantPermissions:()=>P.L5,kuadrantPlanPolicyCreatePermission:()=>P.Lb,kuadrantPlanPolicyDeletePermission:()=>P.Kx,kuadrantPlanPolicyListPermission:()=>P.J,kuadrantPlanPolicyReadPermission:()=>P.VS,kuadrantPlanPolicyUpdatePermission:()=>P.sB,kuadrantPlugin:()=>a.kuadrantPlugin,kuadrantRateLimitPolicyListPermission:()=>P.xO});var a=n(72627),i=n(57349),r=n(82251),o=n(34541),s=n(19833),d=n(31085),l=(n(95478),n(2350)),c=n(86733),p=n(98899);const u=e=>(0,d.jsx)(l.A,{...e}),A=e=>(0,d.jsx)(c.A,{...e}),m=e=>(0,d.jsx)(p.A,{...e});var P=n(34955),y=n(70980),h=n(22097);const v=(0,h.createApiFactory)({api:y.s,deps:{discoveryApi:h.discoveryApiRef,fetchApi:h.fetchApiRef,identityApi:h.identityApiRef},factory:({discoveryApi:e,fetchApi:t,identityApi:n})=>new y.y({discoveryApi:e,fetchApi:t,identityApi:n})})},72627:(e,t,n)=>{n.r(t),n.d(t,{ApiKeyApprovalPage:()=>c,ApiKeyDetailPage:()=>P,ApiProductDetailPage:()=>h,ApiProductsPage:()=>d,EntityKuadrantApiAccessCard:()=>p,EntityKuadrantApiKeyManagementTab:()=>u,EntityKuadrantApiKeysContent:()=>A,EntityKuadrantApiProductInfoContent:()=>m,EntityKuadrantApiProductOpenApiAlert:()=>y,KuadrantPage:()=>s,MyApiKeysPage:()=>l,kuadrantPlugin:()=>o});var a=n(22097);const i=(0,a.createRouteRef)({id:"kuadrant"}),r=(0,a.createSubRouteRef)({id:"kuadrant/resource",parent:i,path:"/:kind/:namespace/:name"}),o=(0,a.createPlugin)({id:"kuadrant",routes:{root:i,resource:r}}),s=o.provide((0,a.createRoutableExtension)({name:"KuadrantPage",component:()=>Promise.all([n.e(4083),n.e(9400),n.e(20),n.e(1340),n.e(5197),n.e(5943),n.e(7293),n.e(7076),n.e(6837),n.e(5010),n.e(8563),n.e(1931),n.e(5478),n.e(5427),n.e(9634),n.e(484),n.e(1942),n.e(7976),n.e(3658),n.e(5289),n.e(2821)]).then(n.bind(n,80243)).then(e=>e.ApiProductsPage),mountPoint:i})),d=o.provide((0,a.createRoutableExtension)({name:"ApiProductsPage",component:()=>Promise.all([n.e(4083),n.e(9400),n.e(20),n.e(1340),n.e(5197),n.e(5943),n.e(7293),n.e(7076),n.e(6837),n.e(5010),n.e(8563),n.e(1931),n.e(5478),n.e(5427),n.e(9634),n.e(484),n.e(1942),n.e(7976),n.e(3658),n.e(5289),n.e(2821)]).then(n.bind(n,80243)).then(e=>e.ApiProductsPage),mountPoint:i})),l=o.provide((0,a.createRoutableExtension)({name:"MyApiKeysPage",component:()=>Promise.all([n.e(4083),n.e(9400),n.e(20),n.e(1340),n.e(5197),n.e(5943),n.e(7076),n.e(6837),n.e(5010),n.e(8563),n.e(5478),n.e(5427),n.e(9634),n.e(484),n.e(1942),n.e(7976),n.e(7270)]).then(n.bind(n,37270)).then(e=>e.MyApiKeysPage),mountPoint:i})),c=o.provide((0,a.createRoutableExtension)({name:"ApiKeyApprovalPage",component:()=>Promise.all([n.e(4083),n.e(9400),n.e(20),n.e(1340),n.e(5197),n.e(5943),n.e(7293),n.e(7076),n.e(6837),n.e(5010),n.e(8563),n.e(5478),n.e(5427),n.e(9634),n.e(484),n.e(1942),n.e(7976),n.e(3658),n.e(3917)]).then(n.bind(n,73917)).then(e=>e.ApiKeyApprovalPageWithPermissions),mountPoint:i})),p=o.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiAccessCard",component:{lazy:()=>Promise.all([n.e(4083),n.e(9400),n.e(20),n.e(1340),n.e(5197),n.e(5943),n.e(7293),n.e(438),n.e(5478),n.e(5427),n.e(9634),n.e(484),n.e(1942),n.e(7976),n.e(3658),n.e(1719)]).then(n.bind(n,11719)).then(e=>e.ApiAccessCard)}})),u=o.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiKeyManagementTab",component:{lazy:()=>Promise.all([n.e(4083),n.e(9400),n.e(20),n.e(1340),n.e(5197),n.e(5943),n.e(7293),n.e(7076),n.e(6837),n.e(5010),n.e(5478),n.e(5427),n.e(484),n.e(1942),n.e(7976),n.e(3658),n.e(2251),n.e(5922)]).then(n.bind(n,42708)).then(e=>e.ApiKeyManagementTab)}})),A=o.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiKeysContent",component:{lazy:()=>Promise.all([n.e(4083),n.e(9400),n.e(20),n.e(1340),n.e(5197),n.e(5943),n.e(7293),n.e(7076),n.e(6837),n.e(5010),n.e(5478),n.e(5427),n.e(484),n.e(1942),n.e(7976),n.e(3658),n.e(2251),n.e(5922)]).then(n.bind(n,42708)).then(e=>e.ApiKeyManagementTab)}})),m=o.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiProductInfoContent",component:{lazy:()=>Promise.all([n.e(4083),n.e(9400),n.e(20),n.e(1340),n.e(7293),n.e(327),n.e(5478),n.e(5427),n.e(9634),n.e(484),n.e(1942),n.e(7976),n.e(3658),n.e(3947),n.e(4908)]).then(n.bind(n,34908)).then(e=>e.ApiProductInfoCard)}})),P=o.provide((0,a.createRoutableExtension)({name:"ApiKeyDetailPage",component:()=>Promise.all([n.e(4083),n.e(9400),n.e(20),n.e(1340),n.e(5197),n.e(7076),n.e(8563),n.e(5478),n.e(5427),n.e(9634),n.e(484),n.e(1942),n.e(7976),n.e(2967)]).then(n.bind(n,72967)).then(e=>e.ApiKeyDetailPage),mountPoint:i})),y=o.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiProductOpenApiAlert",component:{lazy:()=>Promise.all([n.e(9400),n.e(20),n.e(5478),n.e(5427),n.e(9634),n.e(484),n.e(1942),n.e(7976),n.e(6371)]).then(n.bind(n,36371)).then(e=>e.ApiProductOpenApiAlert)}})),h=o.provide((0,a.createRoutableExtension)({name:"ApiProductDetailPage",component:()=>Promise.all([n.e(4083),n.e(9400),n.e(20),n.e(1340),n.e(5197),n.e(5943),n.e(7293),n.e(7076),n.e(6837),n.e(8563),n.e(2769),n.e(5478),n.e(5427),n.e(9634),n.e(484),n.e(1942),n.e(7976),n.e(3658),n.e(3947),n.e(5289),n.e(7791)]).then(n.bind(n,57791)).then(e=>e.ApiProductDetailPage),mountPoint:i}))}}]);
2
+ //# sourceMappingURL=exposed-PluginRoot.992ab15b.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"static/exposed-PluginRoot.3a5f9157.chunk.js","mappings":"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","sources":["webpack://internal.plugin-kuadrant/./src/components/KuadrantIcon/KuadrantIcon.tsx","webpack://internal.plugin-kuadrant/./src/components/ApiProductInfoCard/ApiProductInfoCard.tsx","webpack://internal.plugin-kuadrant/./src/components/ApiAccessCard/ApiAccessCard.tsx","webpack://internal.plugin-kuadrant/./src/components/icons.tsx","webpack://internal.plugin-kuadrant/./src/apis.ts","webpack://internal.plugin-kuadrant/./src/routes.ts","webpack://internal.plugin-kuadrant/./src/plugin.ts"],"sourcesContent":["import React from 'react';\nimport SvgIcon, { SvgIconProps } from '@mui/material/SvgIcon';\n\nexport const KuadrantIcon = (props: SvgIconProps) => (\n <SvgIcon\n {...props}\n viewBox=\"0 0 1024 1024\"\n sx={{ transform: 'scale(0.85)', marginLeft: '4px', ...props.sx }}\n >\n <path\n d=\"M809,1C993.59,183.56 1065.7,449.65 998.12,699.05C964.778,821.823 899.519,933.607 809,1023L292.27,512L809,1Z\"\n fill=\"currentColor\"\n />\n <rect x=\"1\" y=\"1\" width=\"218\" height=\"1022\" fill=\"currentColor\" />\n </SvgIcon>\n);\n","import React from 'react';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { useApi, identityApiRef } from '@backstage/core-plugin-api';\nimport { InfoCard, ResponseErrorPanel } from '@backstage/core-components';\nimport { Typography, Box, makeStyles } from '@material-ui/core';\nimport { Skeleton } from '@material-ui/lab';\nimport useAsync from 'react-use/lib/useAsync';\nimport { useKuadrantPermission } from '../../utils/permissions';\nimport { kuadrantApiProductReadAllPermission } from '../../permissions';\nimport { ApiProductDetails } from '../ApiProductDetails';\nimport { OidcProviderCard } from '../OidcProviderCard';\nimport { kuadrantApiRef } from '../../api';\n\nconst useStyles = makeStyles((theme) => ({\n label: {\n fontWeight: 600,\n color: theme.palette.text.secondary,\n marginBottom: theme.spacing(0.5),\n fontSize: '0.75rem',\n textTransform: 'uppercase',\n },\n}));\n\nexport const ApiProductInfoCard = () => {\n const classes = useStyles();\n const { entity } = useEntity();\n const kuadrantApi = useApi(kuadrantApiRef);\n const identityApi = useApi(identityApiRef);\n\n const { allowed: canReadAll, loading: permLoading } = useKuadrantPermission(\n kuadrantApiProductReadAllPermission\n );\n\n const namespace = entity.metadata.annotations?.['kuadrant.io/namespace'];\n const apiProductName = entity.metadata.annotations?.['kuadrant.io/apiproduct'];\n\n const { value: currentUserId } = useAsync(async () => {\n const identity = await identityApi.getBackstageIdentity();\n return identity.userEntityRef.split('/')[1] || 'guest';\n }, [identityApi]);\n\n const { value: apiProduct, loading, error } = useAsync(async () => {\n if (!namespace || !apiProductName) {\n return null;\n }\n\n return kuadrantApi.getApiProduct(namespace, apiProductName);\n }, [kuadrantApi, namespace, apiProductName]);\n\n // check if user has permission to view this api product\n const owner = apiProduct?.metadata?.annotations?.['backstage.io/owner'];\n const ownerUserId = owner?.split('/')[1];\n const canView = canReadAll || (currentUserId && ownerUserId === currentUserId);\n\n if (!namespace || !apiProductName) {\n return (\n <InfoCard title=\"API Product Information\">\n <Typography>No APIProduct linked to this API entity</Typography>\n </InfoCard>\n );\n }\n\n if (loading || permLoading) {\n return (\n <InfoCard title=\"API Product Information\">\n <Box p={2}>\n {[...Array(5)].map((_, i) => (\n <Box key={i} mb={2}>\n <Skeleton variant=\"text\" width=\"100%\" />\n </Box>\n ))}\n </Box>\n </InfoCard>\n );\n }\n\n // show permission message if user doesn't have permission\n if (apiProduct && !canView) {\n return (\n <InfoCard title=\"API Product Information\">\n <Box p={2}>\n <Typography variant=\"body2\" color=\"textSecondary\">\n You don't have permission to view this API product's details. Only the API owner or users with admin permissions can view this information.\n </Typography>\n </Box>\n </InfoCard>\n );\n }\n\n // also show permission message if we got a permission error from the backend\n if (error && error.message.includes('you can only read your own')) {\n return (\n <InfoCard title=\"API Product Information\">\n <Box p={2}>\n <Typography variant=\"body2\" color=\"textSecondary\">\n You don't have permission to view this API product's details. Only the API owner or users with admin permissions can view this information.\n </Typography>\n </Box>\n </InfoCard>\n );\n }\n\n if (error) {\n return (\n <InfoCard title=\"API Product Information\">\n <ResponseErrorPanel error={error} />\n </InfoCard>\n );\n }\n\n if (!apiProduct) {\n return (\n <InfoCard title=\"API Product Information\">\n <Typography>APIProduct not found</Typography>\n </InfoCard>\n );\n }\n\n // check for OIDC auth scheme\n const authSchemes = apiProduct.status?.discoveredAuthScheme?.authentication || {};\n const schemeObjects = Object.values(authSchemes);\n const jwtScheme = schemeObjects.find((scheme: any) => scheme.hasOwnProperty('jwt'));\n const hasOidc = Boolean(jwtScheme);\n const jwtIssuer = (jwtScheme as any)?.jwt?.issuerUrl;\n const jwtTokenEndpoint = apiProduct.status?.oidcDiscovery?.tokenEndpoint;\n\n return (\n <>\n <InfoCard title=\"API Product Details\">\n <Box mb={2}>\n <Typography variant=\"caption\" className={classes.label}>\n Product Name\n </Typography>\n <Typography variant=\"h6\">\n {apiProduct.spec?.displayName || apiProductName}\n </Typography>\n </Box>\n <ApiProductDetails\n product={apiProduct}\n showStatus={false}\n showCatalogLink={false}\n />\n </InfoCard>\n {hasOidc && jwtIssuer && (\n <Box mt={2}>\n <OidcProviderCard\n issuerUrl={jwtIssuer}\n tokenEndpoint={jwtTokenEndpoint}\n />\n </Box>\n )}\n </>\n );\n};\n","import React, { useState } from 'react';\nimport { useAsync } from 'react-use';\nimport {\n InfoCard,\n ResponseErrorPanel,\n} from '@backstage/core-components';\nimport {\n Typography,\n Box,\n Chip,\n Button,\n IconButton,\n Tooltip,\n} from '@material-ui/core';\nimport { Skeleton } from '@material-ui/lab';\nimport AddIcon from '@material-ui/icons/Add';\nimport VisibilityIcon from '@material-ui/icons/Visibility';\nimport VisibilityOffIcon from '@material-ui/icons/VisibilityOff';\nimport FileCopyIcon from '@material-ui/icons/FileCopy';\nimport { useApi, identityApiRef, alertApiRef } from '@backstage/core-plugin-api';\nimport { kuadrantApiRef } from '../../api';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { RequestAccessDialog } from '../RequestAccessDialog';\nimport { useKuadrantPermission } from '../../utils/permissions';\nimport { kuadrantApiKeyCreatePermission } from '../../permissions';\nimport { APIKey, APIProduct, Plan } from \"../../types/api-management\";\n\nexport interface ApiAccessCardProps {\n // deprecated: use entity annotations instead\n namespace?: string;\n}\n\nexport const ApiAccessCard = ({ namespace: propNamespace }: ApiAccessCardProps) => {\n const { entity } = useEntity();\n const kuadrantApi = useApi(kuadrantApiRef);\n const identityApi = useApi(identityApiRef);\n const alertApi = useApi(alertApiRef);\n const [userEmail, setUserEmail] = useState<string>('');\n const [requestDialogOpen, setRequestDialogOpen] = useState(false);\n const [refresh, setRefresh] = useState(0);\n\n // key reveal state\n const [visibleKeys, setVisibleKeys] = useState<Set<string>>(new Set());\n const [apiKeyValues, setApiKeyValues] = useState<Map<string, string>>(new Map());\n const [apiKeyLoading, setApiKeyLoading] = useState<Set<string>>(new Set());\n\n // get apiproduct name from entity annotation (set by entity provider)\n const apiProductName = entity.metadata.annotations?.['kuadrant.io/apiproduct'] || entity.metadata.name;\n const namespace = entity.metadata.annotations?.['kuadrant.io/namespace'] || propNamespace || 'default';\n\n // get current user identity\n useAsync(async () => {\n const profile = await identityApi.getProfileInfo();\n setUserEmail(profile.email || '');\n }, [identityApi]);\n\n // fetch user's approved keys for this API product\n // backend filters by apiProductRef.name and scopes to the user's consumer namespace\n const { value: requests, loading: keysLoading, error: keysError } = useAsync(async () => {\n const data = await kuadrantApi.getRequestsByApiProduct(apiProductName, namespace);\n const allRequests = data.items || [];\n return allRequests.filter((r: APIKey) =>\n r.status?.phase === 'Approved'\n );\n }, [namespace, apiProductName, kuadrantApi, refresh]);\n\n // fetch apiproduct to get available plans\n const { value: apiProduct, loading: productLoading } = useAsync(async () => {\n try {\n const data = await kuadrantApi.getApiProducts();\n return data.items?.find(\n (p: APIProduct) =>\n p.metadata.namespace === namespace &&\n p.metadata.name === apiProductName,\n );\n } catch (err) {\n return null;\n }\n }, [namespace, apiProductName, kuadrantApi]);\n\n const resourceRef = apiProduct\n ? `apiproduct:${apiProduct.metadata.namespace}/${apiProduct.metadata.name}`\n : undefined;\n\n const { allowed: canCreateRequest, loading: permissionLoading } = useKuadrantPermission(\n kuadrantApiKeyCreatePermission,\n resourceRef,\n );\n\n const fetchApiKeyFromSecret = async (requestNamespace: string, requestName: string) => {\n const key = `${requestNamespace}/${requestName}`;\n if (apiKeyLoading.has(key)) {\n return;\n }\n\n setApiKeyLoading((prev) => new Set(prev).add(key));\n try {\n const data = await kuadrantApi.getApiKeySecret(requestNamespace, requestName);\n setApiKeyValues((prev) => new Map(prev).set(key, data.apiKey));\n toggleVisibility(requestName);\n } catch (err) {\n console.error('failed to fetch api key:', err);\n const errorMessage = err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to fetch APIKey. ${errorMessage}`,\n severity: 'error',\n display: 'transient',\n });\n } finally {\n setApiKeyLoading((prev) => {\n const next = new Set(prev);\n next.delete(key);\n return next;\n });\n }\n };\n\n const clearApiKeyValue = (requestNamespace: string, requestName: string) => {\n const key = `${requestNamespace}/${requestName}`;\n setApiKeyValues((prev) => {\n const next = new Map(prev);\n next.delete(key);\n return next;\n });\n };\n\n const toggleVisibility = (keyName: string) => {\n setVisibleKeys((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(keyName)) {\n newSet.delete(keyName);\n } else {\n newSet.add(keyName);\n }\n return newSet;\n });\n };\n\n const loading = keysLoading || productLoading || permissionLoading;\n\n if (loading) {\n return (\n <InfoCard title=\"Kuadrant API Keys\">\n <Box p={2}>\n <Skeleton variant=\"text\" width=\"80%\" />\n <Skeleton variant=\"text\" width=\"60%\" />\n <Skeleton variant=\"text\" width=\"70%\" />\n </Box>\n </InfoCard>\n );\n }\n\n if (keysError) {\n return <ResponseErrorPanel error={keysError} />;\n }\n\n const keys = (requests as APIKey[]) || [];\n const plans = (apiProduct?.status?.discoveredPlans || []) as Plan[];\n const canRequest = canCreateRequest && plans.length > 0;\n\n const renderKeyRow = (request: APIKey) => {\n const key = `${request.metadata.namespace}/${request.metadata.name}`;\n const isVisible = visibleKeys.has(request.metadata.name);\n const isLoading = apiKeyLoading.has(key);\n const apiKeyValue = apiKeyValues.get(key);\n const hasSecretRef = Boolean(request.spec?.secretRef?.name);\n\n const handleRevealClick = () => {\n if (isVisible) {\n clearApiKeyValue(request.metadata.namespace, request.metadata.name);\n toggleVisibility(request.metadata.name);\n } else {\n fetchApiKeyFromSecret(request.metadata.namespace, request.metadata.name);\n }\n };\n\n const handleCopy = async () => {\n if (apiKeyValue) {\n await navigator.clipboard.writeText(apiKeyValue);\n alertApi.post({\n message: 'API key copied to clipboard',\n severity: 'success',\n display: 'transient',\n });\n }\n };\n\n return (\n <Box\n key={request.metadata.name}\n mb={1}\n p={1.5}\n border={1}\n borderColor=\"grey.300\"\n borderRadius={4}\n >\n <Box display=\"flex\" justifyContent=\"space-between\" alignItems=\"center\" mb={1}>\n <Typography variant=\"body2\" style={{ fontWeight: 500 }}>\n {request.metadata.name}\n </Typography>\n <Chip label={request.spec.planTier} color=\"primary\" size=\"small\" />\n </Box>\n {hasSecretRef && (\n <Box display=\"flex\" alignItems=\"center\">\n <Typography\n variant=\"body2\"\n style={{\n fontFamily: 'monospace',\n fontSize: '0.8rem',\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {isLoading\n ? 'Loading...'\n : isVisible && apiKeyValue\n ? apiKeyValue\n : '••••••••••••••••'}\n </Typography>\n {isVisible && apiKeyValue && (\n <Tooltip title=\"Copy to clipboard\">\n <IconButton size=\"small\" onClick={handleCopy}>\n <FileCopyIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n <Tooltip title={isVisible ? 'Hide API key' : 'Reveal API key'}>\n <span>\n <IconButton\n size=\"small\"\n onClick={handleRevealClick}\n disabled={isLoading}\n >\n {isVisible ? <VisibilityOffIcon fontSize=\"small\" /> : <VisibilityIcon fontSize=\"small\" />}\n </IconButton>\n </span>\n </Tooltip>\n </Box>\n )}\n </Box>\n );\n };\n\n return (\n <>\n <InfoCard title=\"Kuadrant API Keys\">\n <Box p={2}>\n {keys.length > 0 ? (\n <>\n <Typography variant=\"body2\" color=\"textSecondary\" gutterBottom>\n {keys.length} active key{keys.length !== 1 ? 's' : ''}\n </Typography>\n {keys.map(renderKeyRow)}\n </>\n ) : (\n <Typography variant=\"body1\" gutterBottom>\n You don't have any API keys for this API yet\n </Typography>\n )}\n <Box mt={2}>\n {canRequest ? (\n <Button\n variant=\"contained\"\n color=\"primary\"\n size=\"small\"\n startIcon={<AddIcon />}\n onClick={() => setRequestDialogOpen(true)}\n data-testid=\"request-api-access-button\"\n >\n Request API Access\n </Button>\n ) : (\n <Typography variant=\"caption\" color=\"textSecondary\">\n Visit the API Keys tab to view and manage access\n </Typography>\n )}\n </Box>\n </Box>\n </InfoCard>\n\n <RequestAccessDialog\n open={requestDialogOpen}\n onClose={() => setRequestDialogOpen(false)}\n onSuccess={() => {\n setRequestDialogOpen(false);\n setRefresh((r) => r + 1);\n }}\n apiProductName={apiProductName}\n namespace={namespace}\n userEmail={userEmail}\n plans={plans}\n />\n\n </>\n );\n};\n","import React from 'react';\nimport ApiOutlined from '@mui/icons-material/ApiOutlined';\nimport KeyOutlined from '@mui/icons-material/KeyOutlined';\nimport ApprovalOutlined from '@mui/icons-material/ApprovalOutlined';\nimport { SvgIconProps } from '@mui/material/SvgIcon';\n\nexport const ApiIcon = (props: SvgIconProps) => <ApiOutlined {...props} />;\nexport const KeyIcon = (props: SvgIconProps) => <KeyOutlined {...props} />;\nexport const ApprovalIcon = (props: SvgIconProps) => <ApprovalOutlined {...props} />;\n","import {\n createApiFactory,\n discoveryApiRef,\n fetchApiRef,\n identityApiRef,\n} from '@backstage/core-plugin-api';\nimport { kuadrantApiRef, KuadrantApiClient } from './api';\n\n/**\n * API factory for the Kuadrant plugin\n * This factory creates and configures the KuadrantApiClient with required dependencies\n */\nexport const kuadrantApiFactory = createApiFactory({\n api: kuadrantApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n fetchApi: fetchApiRef,\n identityApi: identityApiRef,\n },\n factory: ({ discoveryApi, fetchApi, identityApi }) =>\n new KuadrantApiClient({ discoveryApi, fetchApi, identityApi }),\n});\n","import { createRouteRef, createSubRouteRef } from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n id: 'kuadrant',\n});\n\nexport const resourceRouteRef = createSubRouteRef({\n id: 'kuadrant/resource',\n parent: rootRouteRef,\n path: '/:kind/:namespace/:name',\n});\n","import {\n createPlugin,\n createRoutableExtension,\n createComponentExtension,\n} from '@backstage/core-plugin-api';\n\nimport { rootRouteRef, resourceRouteRef } from './routes';\n\nexport const kuadrantPlugin = createPlugin({\n id: 'kuadrant',\n routes: {\n root: rootRouteRef,\n resource: resourceRouteRef,\n },\n});\n\nexport const KuadrantPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'KuadrantPage',\n component: () =>\n import('./components/KuadrantPage').then(m => m.ApiProductsPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const ApiProductsPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiProductsPage',\n component: () =>\n import('./components/KuadrantPage').then(m => m.ApiProductsPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const MyApiKeysPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'MyApiKeysPage',\n component: () =>\n import('./components/MyApiKeysPage').then(m => m.MyApiKeysPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const ApiKeyApprovalPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiKeyApprovalPage',\n component: () =>\n import('./components/ApiKeyApprovalPage').then(m => m.ApiKeyApprovalPageWithPermissions),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const EntityKuadrantApiAccessCard = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiAccessCard',\n component: {\n lazy: () =>\n import('./components/ApiAccessCard').then(m => m.ApiAccessCard),\n },\n }),\n);\n\nexport const EntityKuadrantApiKeyManagementTab = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiKeyManagementTab',\n component: {\n lazy: () =>\n import('./components/ApiKeyManagementTab').then(m => m.ApiKeyManagementTab),\n },\n }),\n);\n\n// entity content extension for api keys tab\nexport const EntityKuadrantApiKeysContent = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiKeysContent',\n component: {\n lazy: () =>\n import('./components/ApiKeyManagementTab').then(m => m.ApiKeyManagementTab),\n },\n }),\n);\n\nexport const EntityKuadrantApiProductInfoContent = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiProductInfoContent',\n component: {\n lazy: () =>\n import('./components/ApiProductInfoCard').then(m => m.ApiProductInfoCard),\n },\n }),\n);\n\nexport const ApiKeyDetailPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiKeyDetailPage',\n component: () =>\n import('./components/ApiKeyDetailPage').then(m => m.ApiKeyDetailPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const EntityKuadrantApiProductOpenApiAlert = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiProductOpenApiAlert',\n component: {\n lazy: () =>\n import('./components/ApiProductOpenApiAlert').then(m => m.ApiProductOpenApiAlert),\n },\n }),\n);\n\nexport const ApiProductDetailPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiProductDetailPage',\n component: () =>\n import('./components/ApiProductDetailPage').then(m => m.ApiProductDetailPage),\n mountPoint: rootRouteRef,\n }),\n);\n"],"names":["KuadrantIcon","props","SvgIcon","viewBox","sx","transform","marginLeft","path","d","fill","rect","x","y","width","height","useStyles","makeStyles","theme","label","fontWeight","color","palette","text","secondary","marginBottom","spacing","fontSize","textTransform","ApiProductInfoCard","entity","apiProduct","classes","useEntity","kuadrantApi","useApi","kuadrantApiRef","identityApi","identityApiRef","allowed","canReadAll","loading","permLoading","useKuadrantPermission","kuadrantApiProductReadAllPermission","namespace","metadata","annotations","apiProductName","value","currentUserId","useAsync","async","getBackstageIdentity","userEntityRef","split","error","getApiProduct","owner","ownerUserId","canView","InfoCard","title","Typography","Box","p","Array","map","_","i","mb","Skeleton","variant","message","includes","ResponseErrorPanel","authSchemes","status","discoveredAuthScheme","authentication","jwtScheme","Object","values","find","scheme","hasOwnProperty","hasOidc","Boolean","jwtIssuer","jwt","issuerUrl","jwtTokenEndpoint","oidcDiscovery","tokenEndpoint","className","spec","displayName","ApiProductDetails","product","showStatus","showCatalogLink","mt","OidcProviderCard","ApiAccessCard","propNamespace","alertApi","alertApiRef","userEmail","setUserEmail","useState","requestDialogOpen","setRequestDialogOpen","refresh","setRefresh","visibleKeys","setVisibleKeys","Set","apiKeyValues","setApiKeyValues","Map","apiKeyLoading","setApiKeyLoading","name","profile","getProfileInfo","email","requests","keysLoading","keysError","getRequestsByApiProduct","items","filter","r","phase","productLoading","data","getApiProducts","err","resourceRef","undefined","canCreateRequest","permissionLoading","kuadrantApiKeyCreatePermission","toggleVisibility","keyName","prev","newSet","has","delete","add","keys","plans","discoveredPlans","canRequest","length","gutterBottom","request","key","isVisible","isLoading","apiKeyValue","get","hasSecretRef","secretRef","border","borderColor","borderRadius","display","justifyContent","alignItems","style","Chip","planTier","size","fontFamily","flex","overflow","textOverflow","Tooltip","IconButton","onClick","navigator","clipboard","writeText","post","severity","FileCopyIcon","span","requestNamespace","requestName","next","clearApiKeyValue","getApiKeySecret","set","apiKey","console","errorMessage","Error","fetchApiKeyFromSecret","disabled","VisibilityOffIcon","VisibilityIcon","Button","startIcon","AddIcon","data-testid","RequestAccessDialog","open","onClose","onSuccess","ApiIcon","ApiOutlined","KeyIcon","KeyOutlined","ApprovalIcon","ApprovalOutlined","kuadrantApiFactory","createApiFactory","api","deps","discoveryApi","discoveryApiRef","fetchApi","fetchApiRef","factory","KuadrantApiClient","rootRouteRef","createRouteRef","id","resourceRouteRef","createSubRouteRef","parent","kuadrantPlugin","createPlugin","routes","root","resource","KuadrantPage","provide","createRoutableExtension","component","then","m","ApiProductsPage","mountPoint","MyApiKeysPage","ApiKeyApprovalPage","ApiKeyApprovalPageWithPermissions","EntityKuadrantApiAccessCard","createComponentExtension","lazy","EntityKuadrantApiKeyManagementTab","ApiKeyManagementTab","EntityKuadrantApiKeysContent","EntityKuadrantApiProductInfoContent","ApiKeyDetailPage","EntityKuadrantApiProductOpenApiAlert","ApiProductOpenApiAlert","ApiProductDetailPage"],"sourceRoot":""}
1
+ {"version":3,"file":"static/exposed-PluginRoot.992ab15b.chunk.js","mappings":"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","sources":["webpack://internal.plugin-kuadrant/./src/components/KuadrantIcon/KuadrantIcon.tsx","webpack://internal.plugin-kuadrant/./src/components/ApiProductInfoCard/ApiProductInfoCard.tsx","webpack://internal.plugin-kuadrant/./src/components/ApiAccessCard/ApiAccessCard.tsx","webpack://internal.plugin-kuadrant/./src/components/icons.tsx","webpack://internal.plugin-kuadrant/./src/apis.ts","webpack://internal.plugin-kuadrant/./src/routes.ts","webpack://internal.plugin-kuadrant/./src/plugin.ts"],"sourcesContent":["import React from 'react';\nimport SvgIcon, { SvgIconProps } from '@mui/material/SvgIcon';\n\nexport const KuadrantIcon = (props: SvgIconProps) => (\n <SvgIcon\n {...props}\n viewBox=\"0 0 1024 1024\"\n sx={{ transform: 'scale(0.85)', marginLeft: '4px', ...props.sx }}\n >\n <path\n d=\"M809,1C993.59,183.56 1065.7,449.65 998.12,699.05C964.778,821.823 899.519,933.607 809,1023L292.27,512L809,1Z\"\n fill=\"currentColor\"\n />\n <rect x=\"1\" y=\"1\" width=\"218\" height=\"1022\" fill=\"currentColor\" />\n </SvgIcon>\n);\n","import React from 'react';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { useApi, identityApiRef } from '@backstage/core-plugin-api';\nimport { InfoCard, ResponseErrorPanel } from '@backstage/core-components';\nimport { Typography, Box, makeStyles } from '@material-ui/core';\nimport { Skeleton } from '@material-ui/lab';\nimport useAsync from 'react-use/lib/useAsync';\nimport { useKuadrantPermission } from '../../utils/permissions';\nimport { kuadrantApiProductReadAllPermission } from '../../permissions';\nimport { ApiProductDetails } from '../ApiProductDetails';\nimport { OidcProviderCard } from '../OidcProviderCard';\nimport { kuadrantApiRef } from '../../api';\n\nconst useStyles = makeStyles((theme) => ({\n label: {\n fontWeight: 600,\n color: theme.palette.text.secondary,\n marginBottom: theme.spacing(0.5),\n fontSize: '0.75rem',\n textTransform: 'uppercase',\n },\n}));\n\nexport const ApiProductInfoCard = () => {\n const classes = useStyles();\n const { entity } = useEntity();\n const kuadrantApi = useApi(kuadrantApiRef);\n const identityApi = useApi(identityApiRef);\n\n const { allowed: canReadAll, loading: permLoading } = useKuadrantPermission(\n kuadrantApiProductReadAllPermission\n );\n\n const namespace = entity.metadata.annotations?.['kuadrant.io/namespace'];\n const apiProductName = entity.metadata.annotations?.['kuadrant.io/apiproduct'];\n\n const { value: currentUserId } = useAsync(async () => {\n const identity = await identityApi.getBackstageIdentity();\n return identity.userEntityRef.split('/')[1] || 'guest';\n }, [identityApi]);\n\n const { value: apiProduct, loading, error } = useAsync(async () => {\n if (!namespace || !apiProductName) {\n return null;\n }\n\n return kuadrantApi.getApiProduct(namespace, apiProductName);\n }, [kuadrantApi, namespace, apiProductName]);\n\n // check if user has permission to view this api product\n const owner = apiProduct?.metadata?.annotations?.['backstage.io/owner'];\n const ownerUserId = owner?.split('/')[1];\n const canView = canReadAll || (currentUserId && ownerUserId === currentUserId);\n\n if (!namespace || !apiProductName) {\n return (\n <InfoCard title=\"API Product Information\">\n <Typography>No APIProduct linked to this API entity</Typography>\n </InfoCard>\n );\n }\n\n if (loading || permLoading) {\n return (\n <InfoCard title=\"API Product Information\">\n <Box p={2}>\n {[...Array(5)].map((_, i) => (\n <Box key={i} mb={2}>\n <Skeleton variant=\"text\" width=\"100%\" />\n </Box>\n ))}\n </Box>\n </InfoCard>\n );\n }\n\n // show permission message if user doesn't have permission\n if (apiProduct && !canView) {\n return (\n <InfoCard title=\"API Product Information\">\n <Box p={2}>\n <Typography variant=\"body2\" color=\"textSecondary\">\n You don't have permission to view this API product's details. Only the API owner or users with admin permissions can view this information.\n </Typography>\n </Box>\n </InfoCard>\n );\n }\n\n // also show permission message if we got a permission error from the backend\n if (error && error.message.includes('you can only read your own')) {\n return (\n <InfoCard title=\"API Product Information\">\n <Box p={2}>\n <Typography variant=\"body2\" color=\"textSecondary\">\n You don't have permission to view this API product's details. Only the API owner or users with admin permissions can view this information.\n </Typography>\n </Box>\n </InfoCard>\n );\n }\n\n if (error) {\n return (\n <InfoCard title=\"API Product Information\">\n <ResponseErrorPanel error={error} />\n </InfoCard>\n );\n }\n\n if (!apiProduct) {\n return (\n <InfoCard title=\"API Product Information\">\n <Typography>APIProduct not found</Typography>\n </InfoCard>\n );\n }\n\n // check for OIDC auth scheme\n const authSchemes = apiProduct.status?.discoveredAuthScheme?.authentication || {};\n const schemeObjects = Object.values(authSchemes);\n const jwtScheme = schemeObjects.find((scheme: any) => scheme.hasOwnProperty('jwt'));\n const hasOidc = Boolean(jwtScheme);\n const jwtIssuer = (jwtScheme as any)?.jwt?.issuerUrl;\n const jwtTokenEndpoint = apiProduct.status?.oidcDiscovery?.tokenEndpoint;\n\n return (\n <>\n <InfoCard title=\"API Product Details\">\n <Box mb={2}>\n <Typography variant=\"caption\" className={classes.label}>\n Product Name\n </Typography>\n <Typography variant=\"h6\">\n {apiProduct.spec?.displayName || apiProductName}\n </Typography>\n </Box>\n <ApiProductDetails\n product={apiProduct}\n showStatus={false}\n showCatalogLink={false}\n />\n </InfoCard>\n {hasOidc && jwtIssuer && (\n <Box mt={2}>\n <OidcProviderCard\n issuerUrl={jwtIssuer}\n tokenEndpoint={jwtTokenEndpoint}\n />\n </Box>\n )}\n </>\n );\n};\n","import React, { useState } from 'react';\nimport { useAsync } from 'react-use';\nimport {\n InfoCard,\n ResponseErrorPanel,\n} from '@backstage/core-components';\nimport {\n Typography,\n Box,\n Chip,\n Button,\n IconButton,\n Tooltip,\n} from '@material-ui/core';\nimport { Skeleton } from '@material-ui/lab';\nimport AddIcon from '@material-ui/icons/Add';\nimport VisibilityIcon from '@material-ui/icons/Visibility';\nimport VisibilityOffIcon from '@material-ui/icons/VisibilityOff';\nimport FileCopyIcon from '@material-ui/icons/FileCopy';\nimport { useApi, identityApiRef, alertApiRef } from '@backstage/core-plugin-api';\nimport { kuadrantApiRef } from '../../api';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { RequestAccessDialog } from '../RequestAccessDialog';\nimport { useKuadrantPermission } from '../../utils/permissions';\nimport { kuadrantApiKeyCreatePermission } from '../../permissions';\nimport { APIKey, APIProduct, Plan } from \"../../types/api-management\";\n\nexport interface ApiAccessCardProps {\n // deprecated: use entity annotations instead\n namespace?: string;\n}\n\nexport const ApiAccessCard = ({ namespace: propNamespace }: ApiAccessCardProps) => {\n const { entity } = useEntity();\n const kuadrantApi = useApi(kuadrantApiRef);\n const identityApi = useApi(identityApiRef);\n const alertApi = useApi(alertApiRef);\n const [userEmail, setUserEmail] = useState<string>('');\n const [requestDialogOpen, setRequestDialogOpen] = useState(false);\n const [refresh, setRefresh] = useState(0);\n\n // key reveal state\n const [visibleKeys, setVisibleKeys] = useState<Set<string>>(new Set());\n const [apiKeyValues, setApiKeyValues] = useState<Map<string, string>>(new Map());\n const [apiKeyLoading, setApiKeyLoading] = useState<Set<string>>(new Set());\n\n // get apiproduct name from entity annotation (set by entity provider)\n const apiProductName = entity.metadata.annotations?.['kuadrant.io/apiproduct'] || entity.metadata.name;\n const namespace = entity.metadata.annotations?.['kuadrant.io/namespace'] || propNamespace || 'default';\n\n // get current user identity\n useAsync(async () => {\n const profile = await identityApi.getProfileInfo();\n setUserEmail(profile.email || '');\n }, [identityApi]);\n\n // fetch user's approved keys for this API product\n // backend filters by apiProductRef.name and scopes to the user's consumer namespace\n const { value: requests, loading: keysLoading, error: keysError } = useAsync(async () => {\n const data = await kuadrantApi.getRequestsByApiProduct(apiProductName, namespace);\n const allRequests = data.items || [];\n return allRequests.filter((r: APIKey) =>\n r.status?.phase === 'Approved'\n );\n }, [namespace, apiProductName, kuadrantApi, refresh]);\n\n // fetch apiproduct to get available plans\n const { value: apiProduct, loading: productLoading } = useAsync(async () => {\n try {\n const data = await kuadrantApi.getApiProducts();\n return data.items?.find(\n (p: APIProduct) =>\n p.metadata.namespace === namespace &&\n p.metadata.name === apiProductName,\n );\n } catch (err) {\n return null;\n }\n }, [namespace, apiProductName, kuadrantApi]);\n\n const resourceRef = apiProduct\n ? `apiproduct:${apiProduct.metadata.namespace}/${apiProduct.metadata.name}`\n : undefined;\n\n const { allowed: canCreateRequest, loading: permissionLoading } = useKuadrantPermission(\n kuadrantApiKeyCreatePermission,\n resourceRef,\n );\n\n const fetchApiKeyFromSecret = async (requestNamespace: string, requestName: string) => {\n const key = `${requestNamespace}/${requestName}`;\n if (apiKeyLoading.has(key)) {\n return;\n }\n\n setApiKeyLoading((prev) => new Set(prev).add(key));\n try {\n const data = await kuadrantApi.getApiKeySecret(requestNamespace, requestName);\n setApiKeyValues((prev) => new Map(prev).set(key, data.apiKey));\n toggleVisibility(requestName);\n } catch (err) {\n console.error('failed to fetch api key:', err);\n const errorMessage = err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to fetch APIKey. ${errorMessage}`,\n severity: 'error',\n display: 'transient',\n });\n } finally {\n setApiKeyLoading((prev) => {\n const next = new Set(prev);\n next.delete(key);\n return next;\n });\n }\n };\n\n const clearApiKeyValue = (requestNamespace: string, requestName: string) => {\n const key = `${requestNamespace}/${requestName}`;\n setApiKeyValues((prev) => {\n const next = new Map(prev);\n next.delete(key);\n return next;\n });\n };\n\n const toggleVisibility = (keyName: string) => {\n setVisibleKeys((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(keyName)) {\n newSet.delete(keyName);\n } else {\n newSet.add(keyName);\n }\n return newSet;\n });\n };\n\n const loading = keysLoading || productLoading || permissionLoading;\n\n if (loading) {\n return (\n <InfoCard title=\"Kuadrant API Keys\">\n <Box p={2}>\n <Skeleton variant=\"text\" width=\"80%\" />\n <Skeleton variant=\"text\" width=\"60%\" />\n <Skeleton variant=\"text\" width=\"70%\" />\n </Box>\n </InfoCard>\n );\n }\n\n if (keysError) {\n return <ResponseErrorPanel error={keysError} />;\n }\n\n const keys = (requests as APIKey[]) || [];\n const plans = (apiProduct?.status?.discoveredPlans || []) as Plan[];\n const canRequest = canCreateRequest && plans.length > 0;\n\n const renderKeyRow = (request: APIKey) => {\n const key = `${request.metadata.namespace}/${request.metadata.name}`;\n const isVisible = visibleKeys.has(request.metadata.name);\n const isLoading = apiKeyLoading.has(key);\n const apiKeyValue = apiKeyValues.get(key);\n const hasSecretRef = Boolean(request.spec?.secretRef?.name);\n\n const handleRevealClick = () => {\n if (isVisible) {\n clearApiKeyValue(request.metadata.namespace, request.metadata.name);\n toggleVisibility(request.metadata.name);\n } else {\n fetchApiKeyFromSecret(request.metadata.namespace, request.metadata.name);\n }\n };\n\n const handleCopy = async () => {\n if (apiKeyValue) {\n await navigator.clipboard.writeText(apiKeyValue);\n alertApi.post({\n message: 'API key copied to clipboard',\n severity: 'success',\n display: 'transient',\n });\n }\n };\n\n return (\n <Box\n key={request.metadata.name}\n mb={1}\n p={1.5}\n border={1}\n borderColor=\"grey.300\"\n borderRadius={4}\n >\n <Box display=\"flex\" justifyContent=\"space-between\" alignItems=\"center\" mb={1}>\n <Typography variant=\"body2\" style={{ fontWeight: 500 }}>\n {request.metadata.name}\n </Typography>\n <Chip label={request.spec.planTier} color=\"primary\" size=\"small\" />\n </Box>\n {hasSecretRef && (\n <Box display=\"flex\" alignItems=\"center\">\n <Typography\n variant=\"body2\"\n style={{\n fontFamily: 'monospace',\n fontSize: '0.8rem',\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {isLoading\n ? 'Loading...'\n : isVisible && apiKeyValue\n ? apiKeyValue\n : '••••••••••••••••'}\n </Typography>\n {isVisible && apiKeyValue && (\n <Tooltip title=\"Copy to clipboard\">\n <IconButton size=\"small\" onClick={handleCopy}>\n <FileCopyIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n <Tooltip title={isVisible ? 'Hide API key' : 'Reveal API key'}>\n <span>\n <IconButton\n size=\"small\"\n onClick={handleRevealClick}\n disabled={isLoading}\n >\n {isVisible ? <VisibilityOffIcon fontSize=\"small\" /> : <VisibilityIcon fontSize=\"small\" />}\n </IconButton>\n </span>\n </Tooltip>\n </Box>\n )}\n </Box>\n );\n };\n\n return (\n <>\n <InfoCard title=\"Kuadrant API Keys\">\n <Box p={2}>\n {keys.length > 0 ? (\n <>\n <Typography variant=\"body2\" color=\"textSecondary\" gutterBottom>\n {keys.length} active key{keys.length !== 1 ? 's' : ''}\n </Typography>\n {keys.map(renderKeyRow)}\n </>\n ) : (\n <Typography variant=\"body1\" gutterBottom>\n You don't have any API keys for this API yet\n </Typography>\n )}\n <Box mt={2}>\n {canRequest ? (\n <Button\n variant=\"contained\"\n color=\"primary\"\n size=\"small\"\n startIcon={<AddIcon />}\n onClick={() => setRequestDialogOpen(true)}\n data-testid=\"request-api-access-button\"\n >\n Request API Access\n </Button>\n ) : (\n <Typography variant=\"caption\" color=\"textSecondary\">\n Visit the API Keys tab to view and manage access\n </Typography>\n )}\n </Box>\n </Box>\n </InfoCard>\n\n <RequestAccessDialog\n open={requestDialogOpen}\n onClose={() => setRequestDialogOpen(false)}\n onSuccess={() => {\n setRequestDialogOpen(false);\n setRefresh((r) => r + 1);\n }}\n apiProductName={apiProductName}\n namespace={namespace}\n userEmail={userEmail}\n plans={plans}\n />\n\n </>\n );\n};\n","import React from 'react';\nimport ApiOutlined from '@mui/icons-material/ApiOutlined';\nimport KeyOutlined from '@mui/icons-material/KeyOutlined';\nimport ApprovalOutlined from '@mui/icons-material/ApprovalOutlined';\nimport { SvgIconProps } from '@mui/material/SvgIcon';\n\nexport const ApiIcon = (props: SvgIconProps) => <ApiOutlined {...props} />;\nexport const KeyIcon = (props: SvgIconProps) => <KeyOutlined {...props} />;\nexport const ApprovalIcon = (props: SvgIconProps) => <ApprovalOutlined {...props} />;\n","import {\n createApiFactory,\n discoveryApiRef,\n fetchApiRef,\n identityApiRef,\n} from '@backstage/core-plugin-api';\nimport { kuadrantApiRef, KuadrantApiClient } from './api';\n\n/**\n * API factory for the Kuadrant plugin\n * This factory creates and configures the KuadrantApiClient with required dependencies\n */\nexport const kuadrantApiFactory = createApiFactory({\n api: kuadrantApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n fetchApi: fetchApiRef,\n identityApi: identityApiRef,\n },\n factory: ({ discoveryApi, fetchApi, identityApi }) =>\n new KuadrantApiClient({ discoveryApi, fetchApi, identityApi }),\n});\n","import { createRouteRef, createSubRouteRef } from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n id: 'kuadrant',\n});\n\nexport const resourceRouteRef = createSubRouteRef({\n id: 'kuadrant/resource',\n parent: rootRouteRef,\n path: '/:kind/:namespace/:name',\n});\n","import {\n createPlugin,\n createRoutableExtension,\n createComponentExtension,\n} from '@backstage/core-plugin-api';\n\nimport { rootRouteRef, resourceRouteRef } from './routes';\n\nexport const kuadrantPlugin = createPlugin({\n id: 'kuadrant',\n routes: {\n root: rootRouteRef,\n resource: resourceRouteRef,\n },\n});\n\nexport const KuadrantPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'KuadrantPage',\n component: () =>\n import('./components/KuadrantPage').then(m => m.ApiProductsPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const ApiProductsPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiProductsPage',\n component: () =>\n import('./components/KuadrantPage').then(m => m.ApiProductsPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const MyApiKeysPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'MyApiKeysPage',\n component: () =>\n import('./components/MyApiKeysPage').then(m => m.MyApiKeysPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const ApiKeyApprovalPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiKeyApprovalPage',\n component: () =>\n import('./components/ApiKeyApprovalPage').then(m => m.ApiKeyApprovalPageWithPermissions),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const EntityKuadrantApiAccessCard = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiAccessCard',\n component: {\n lazy: () =>\n import('./components/ApiAccessCard').then(m => m.ApiAccessCard),\n },\n }),\n);\n\nexport const EntityKuadrantApiKeyManagementTab = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiKeyManagementTab',\n component: {\n lazy: () =>\n import('./components/ApiKeyManagementTab').then(m => m.ApiKeyManagementTab),\n },\n }),\n);\n\n// entity content extension for api keys tab\nexport const EntityKuadrantApiKeysContent = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiKeysContent',\n component: {\n lazy: () =>\n import('./components/ApiKeyManagementTab').then(m => m.ApiKeyManagementTab),\n },\n }),\n);\n\nexport const EntityKuadrantApiProductInfoContent = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiProductInfoContent',\n component: {\n lazy: () =>\n import('./components/ApiProductInfoCard').then(m => m.ApiProductInfoCard),\n },\n }),\n);\n\nexport const ApiKeyDetailPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiKeyDetailPage',\n component: () =>\n import('./components/ApiKeyDetailPage').then(m => m.ApiKeyDetailPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const EntityKuadrantApiProductOpenApiAlert = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiProductOpenApiAlert',\n component: {\n lazy: () =>\n import('./components/ApiProductOpenApiAlert').then(m => m.ApiProductOpenApiAlert),\n },\n }),\n);\n\nexport const ApiProductDetailPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiProductDetailPage',\n component: () =>\n import('./components/ApiProductDetailPage').then(m => m.ApiProductDetailPage),\n mountPoint: rootRouteRef,\n }),\n);\n"],"names":["KuadrantIcon","props","SvgIcon","viewBox","sx","transform","marginLeft","path","d","fill","rect","x","y","width","height","useStyles","makeStyles","theme","label","fontWeight","color","palette","text","secondary","marginBottom","spacing","fontSize","textTransform","ApiProductInfoCard","entity","apiProduct","classes","useEntity","kuadrantApi","useApi","kuadrantApiRef","identityApi","identityApiRef","allowed","canReadAll","loading","permLoading","useKuadrantPermission","kuadrantApiProductReadAllPermission","namespace","metadata","annotations","apiProductName","value","currentUserId","useAsync","async","getBackstageIdentity","userEntityRef","split","error","getApiProduct","owner","ownerUserId","canView","InfoCard","title","Typography","Box","p","Array","map","_","i","mb","Skeleton","variant","message","includes","ResponseErrorPanel","authSchemes","status","discoveredAuthScheme","authentication","jwtScheme","Object","values","find","scheme","hasOwnProperty","hasOidc","Boolean","jwtIssuer","jwt","issuerUrl","jwtTokenEndpoint","oidcDiscovery","tokenEndpoint","className","spec","displayName","ApiProductDetails","product","showStatus","showCatalogLink","mt","OidcProviderCard","ApiAccessCard","propNamespace","alertApi","alertApiRef","userEmail","setUserEmail","useState","requestDialogOpen","setRequestDialogOpen","refresh","setRefresh","visibleKeys","setVisibleKeys","Set","apiKeyValues","setApiKeyValues","Map","apiKeyLoading","setApiKeyLoading","name","profile","getProfileInfo","email","requests","keysLoading","keysError","getRequestsByApiProduct","items","filter","r","phase","productLoading","data","getApiProducts","err","resourceRef","undefined","canCreateRequest","permissionLoading","kuadrantApiKeyCreatePermission","toggleVisibility","keyName","prev","newSet","has","delete","add","keys","plans","discoveredPlans","canRequest","length","gutterBottom","request","key","isVisible","isLoading","apiKeyValue","get","hasSecretRef","secretRef","border","borderColor","borderRadius","display","justifyContent","alignItems","style","Chip","planTier","size","fontFamily","flex","overflow","textOverflow","Tooltip","IconButton","onClick","navigator","clipboard","writeText","post","severity","FileCopyIcon","span","requestNamespace","requestName","next","clearApiKeyValue","getApiKeySecret","set","apiKey","console","errorMessage","Error","fetchApiKeyFromSecret","disabled","VisibilityOffIcon","VisibilityIcon","Button","startIcon","AddIcon","data-testid","RequestAccessDialog","open","onClose","onSuccess","ApiIcon","ApiOutlined","KeyIcon","KeyOutlined","ApprovalIcon","ApprovalOutlined","kuadrantApiFactory","createApiFactory","api","deps","discoveryApi","discoveryApiRef","fetchApi","fetchApiRef","factory","KuadrantApiClient","rootRouteRef","createRouteRef","id","resourceRouteRef","createSubRouteRef","parent","kuadrantPlugin","createPlugin","routes","root","resource","KuadrantPage","provide","createRoutableExtension","component","then","m","ApiProductsPage","mountPoint","MyApiKeysPage","ApiKeyApprovalPage","ApiKeyApprovalPageWithPermissions","EntityKuadrantApiAccessCard","createComponentExtension","lazy","EntityKuadrantApiKeyManagementTab","ApiKeyManagementTab","EntityKuadrantApiKeysContent","EntityKuadrantApiProductInfoContent","ApiKeyDetailPage","EntityKuadrantApiProductOpenApiAlert","ApiProductOpenApiAlert","ApiProductDetailPage"],"sourceRoot":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kuadrant/kuadrant-backstage-plugin-frontend",
3
- "version": "0.3.0-aaa46b4",
3
+ "version": "0.4.0-dev1",
4
4
  "license": "Apache-2.0",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[1719],{11719:(e,t,a)=>{a.r(t),a.d(t,{ApiAccessCard:()=>s.z});var s=a(57349)},14933:(e,t,a)=>{a.d(t,{c:()=>f});var s=a(31085),n=a(95478),r=a(76891),i=a(61477),l=a(46805),o=a(10394),d=a(72501),c=a(95061),u=a(48543),m=a(81215),p=a(26343),h=a(16249),A=a(93453),y=a(64947),x=a(78467),v=a(39053),j=a(22097),g=a(70980);const f=({open:e,onClose:t,onSuccess:a,apiProductName:f,namespace:b,userEmail:w,plans:S})=>{const I=(0,j.useApi)(g.s),P=(0,j.useApi)(j.alertApiRef),[k,C]=(0,n.useState)(""),[$,R]=(0,n.useState)(""),[z,q]=(0,n.useState)(!1),[K,T]=(0,n.useState)(null),E=()=>{C(""),R(""),T(null),t()};return(0,s.jsxs)(r.A,{open:e,onClose:E,maxWidth:"sm",fullWidth:!0,children:[(0,s.jsx)(i.A,{children:"Request API Access"}),(0,s.jsxs)(l.A,{children:[(0,s.jsxs)(o.A,{mb:2,p:1.5,bgcolor:"info.light",borderRadius:1,display:"flex",alignItems:"flex-start",style:{gap:8},children:[(0,s.jsx)(v.A,{color:"primary",fontSize:"small",style:{marginTop:2}}),(0,s.jsx)(d.A,{variant:"body2",children:"Your request will be reviewed by an API owner before access is granted."})]}),K&&(0,s.jsx)(o.A,{mb:2,p:2,bgcolor:"error.main",color:"error.contrastText",borderRadius:1,children:(0,s.jsx)(d.A,{variant:"body2",children:K})}),(0,s.jsxs)(c.A,{fullWidth:!0,margin:"normal",disabled:z,"data-testid":"tier-select-form",children:[(0,s.jsx)(u.A,{id:"tier-select-label",children:"Select Tier"}),(0,s.jsx)(m.A,{labelId:"tier-select-label","data-testid":"tier-select",value:k,onChange:e=>C(e.target.value),disabled:z,children:S.map(e=>{const t=Object.entries(e.limits||{}).map(([e,t])=>`${t} per ${e}`).join(", ");return(0,s.jsxs)(p.A,{value:e.tier,"data-testid":`tier-option-${e.tier}`,children:[e.tier," ",t?`(${t})`:""]},e.tier)})})]}),(0,s.jsx)(h.A,{label:"Use Case (optional)",placeholder:"Describe how you plan to use this API",multiline:!0,rows:3,fullWidth:!0,margin:"normal",value:$,onChange:e=>R(e.target.value),helperText:"Explain your intended use of this API for admin review",disabled:z})]}),(0,s.jsxs)(A.A,{children:[(0,s.jsx)(y.A,{onClick:E,disabled:z,children:"Cancel"}),(0,s.jsx)(y.A,{onClick:async()=>{if(k){q(!0),T(null);try{const e=Math.random().toString(36).substring(2,10),t=`${f}-${e}-secret`.toLowerCase().replace(/[^a-z0-9-]/g,"-"),s=crypto.randomUUID().replace(/-/g,"");await I.createSecret(t,s);try{await I.createRequest({apiProductName:f,namespace:b,planTier:k,useCase:$.trim()||"",userEmail:w,secretName:t}),P.post({message:"Request submitted successfully. Pending API owner approval.",severity:"info",display:"transient"}),C(""),R(""),a()}catch(e){try{await I.deleteSecret(t)}catch(e){console.warn("Failed to cleanup orphaned secret:",e)}throw e}}catch(e){const t=e instanceof Error?e.message:"unknown error occurred";P.post({message:`Failed to create request: ${t}`,severity:"error",display:"transient"}),T(t)}finally{q(!1)}}},color:"primary",variant:"contained",disabled:!k||z,startIcon:z?(0,s.jsx)(x.A,{size:16,color:"inherit"}):void 0,children:z?"Submitting...":"Submit Request"})]})]})}},57349:(e,t,a)=>{a.d(t,{z:()=>I});var s=a(31085),n=a(95478),r=a(35015),i=a(42367),l=a(96040),o=a(10394),d=a(72501),c=a(67720),u=a(71677),m=a(29365),p=a(64947),h=a(4387),A=a(18466),y=a(32269),x=a(61524),v=a(99594),j=a(22097),g=a(70980),f=a(25467),b=a(14933),w=a(46205),S=a(34955);const I=({namespace:e})=>{var t,a,I;const{entity:P}=(0,f.tN)(),k=(0,j.useApi)(g.s),C=(0,j.useApi)(j.identityApiRef),$=(0,j.useApi)(j.alertApiRef),[R,z]=(0,n.useState)(""),[q,K]=(0,n.useState)(!1),[T,E]=(0,n.useState)(0),[F,N]=(0,n.useState)(new Set),[W,_]=(0,n.useState)(new Map),[B,M]=(0,n.useState)(new Set),U=(null===(t=P.metadata.annotations)||void 0===t?void 0:t["kuadrant.io/apiproduct"])||P.metadata.name,D=(null===(a=P.metadata.annotations)||void 0===a?void 0:a["kuadrant.io/namespace"])||e||"default";(0,r.A)(async()=>{const e=await C.getProfileInfo();z(e.email||"")},[C]);const{value:L,loading:O,error:Y}=(0,r.A)(async()=>((await k.getRequestsByApiProduct(U,D)).items||[]).filter(e=>{var t;return"Approved"===(null===(t=e.status)||void 0===t?void 0:t.phase)}),[D,U,k,T]),{value:H,loading:V}=(0,r.A)(async()=>{try{var e;return null===(e=(await k.getApiProducts()).items)||void 0===e?void 0:e.find(e=>e.metadata.namespace===D&&e.metadata.name===U)}catch(e){return null}},[D,U,k]),G=H?`apiproduct:${H.metadata.namespace}/${H.metadata.name}`:void 0,{allowed:J,loading:Q}=(0,w.l)(S.dp,G),X=e=>{N(t=>{const a=new Set(t);return a.has(e)?a.delete(e):a.add(e),a})};if(O||V||Q)return(0,s.jsx)(l.n,{title:"Kuadrant API Keys",children:(0,s.jsxs)(o.A,{p:2,children:[(0,s.jsx)(h.A,{variant:"text",width:"80%"}),(0,s.jsx)(h.A,{variant:"text",width:"60%"}),(0,s.jsx)(h.A,{variant:"text",width:"70%"})]})});if(Y)return(0,s.jsx)(i._,{error:Y});const Z=L||[],ee=(null==H||null===(I=H.status)||void 0===I?void 0:I.discoveredPlans)||[],te=J&&ee.length>0;return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(l.n,{title:"Kuadrant API Keys",children:(0,s.jsxs)(o.A,{p:2,children:[Z.length>0?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(d.A,{variant:"body2",color:"textSecondary",gutterBottom:!0,children:[Z.length," active key",1!==Z.length?"s":""]}),Z.map(e=>{var t,a;const n=`${e.metadata.namespace}/${e.metadata.name}`,r=F.has(e.metadata.name),i=B.has(n),l=W.get(n),p=Boolean(null===(a=e.spec)||void 0===a||null===(t=a.secretRef)||void 0===t?void 0:t.name);return(0,s.jsxs)(o.A,{mb:1,p:1.5,border:1,borderColor:"grey.300",borderRadius:4,children:[(0,s.jsxs)(o.A,{display:"flex",justifyContent:"space-between",alignItems:"center",mb:1,children:[(0,s.jsx)(d.A,{variant:"body2",style:{fontWeight:500},children:e.metadata.name}),(0,s.jsx)(c.A,{label:e.spec.planTier,color:"primary",size:"small"})]}),p&&(0,s.jsxs)(o.A,{display:"flex",alignItems:"center",children:[(0,s.jsx)(d.A,{variant:"body2",style:{fontFamily:"monospace",fontSize:"0.8rem",flex:1,overflow:"hidden",textOverflow:"ellipsis"},children:i?"Loading...":r&&l?l:"••••••••••••••••"}),r&&l&&(0,s.jsx)(u.Ay,{title:"Copy to clipboard",children:(0,s.jsx)(m.A,{size:"small",onClick:async()=>{l&&(await navigator.clipboard.writeText(l),$.post({message:"API key copied to clipboard",severity:"success",display:"transient"}))},children:(0,s.jsx)(v.A,{fontSize:"small"})})}),(0,s.jsx)(u.Ay,{title:r?"Hide API key":"Reveal API key",children:(0,s.jsx)("span",{children:(0,s.jsx)(m.A,{size:"small",onClick:()=>{r?(((e,t)=>{const a=`${e}/${t}`;_(e=>{const t=new Map(e);return t.delete(a),t})})(e.metadata.namespace,e.metadata.name),X(e.metadata.name)):(async(e,t)=>{const a=`${e}/${t}`;if(!B.has(a)){M(e=>new Set(e).add(a));try{const s=await k.getApiKeySecret(e,t);_(e=>new Map(e).set(a,s.apiKey)),X(t)}catch(e){console.error("failed to fetch api key:",e);const t=e instanceof Error?e.message:"unknown error occurred";$.post({message:`Failed to fetch APIKey. ${t}`,severity:"error",display:"transient"})}finally{M(e=>{const t=new Set(e);return t.delete(a),t})}}})(e.metadata.namespace,e.metadata.name)},disabled:i,children:r?(0,s.jsx)(x.A,{fontSize:"small"}):(0,s.jsx)(y.A,{fontSize:"small"})})})})]})]},e.metadata.name)})]}):(0,s.jsx)(d.A,{variant:"body1",gutterBottom:!0,children:"You don't have any API keys for this API yet"}),(0,s.jsx)(o.A,{mt:2,children:te?(0,s.jsx)(p.A,{variant:"contained",color:"primary",size:"small",startIcon:(0,s.jsx)(A.A,{}),onClick:()=>K(!0),"data-testid":"request-api-access-button",children:"Request API Access"}):(0,s.jsx)(d.A,{variant:"caption",color:"textSecondary",children:"Visit the API Keys tab to view and manage access"})})]})}),(0,s.jsx)(b.c,{open:q,onClose:()=>K(!1),onSuccess:()=>{K(!1),E(e=>e+1)},apiProductName:U,namespace:D,userEmail:R,plans:ee})]})}}}]);
2
- //# sourceMappingURL=1719.52ca7daf.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"static/1719.52ca7daf.chunk.js","mappings":"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","sources":["webpack://internal.plugin-kuadrant/./src/components/RequestAccessDialog/RequestAccessDialog.tsx","webpack://internal.plugin-kuadrant/./src/components/ApiAccessCard/ApiAccessCard.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Button,\n TextField,\n Select,\n MenuItem,\n FormControl,\n InputLabel,\n Box,\n Typography,\n CircularProgress,\n} from '@material-ui/core';\nimport InfoIcon from '@material-ui/icons/Info';\nimport {\n useApi,\n alertApiRef,\n} from '@backstage/core-plugin-api';\nimport { kuadrantApiRef } from '../../api';\nimport { Plan } from \"../../types/api-management.ts\";\n\nexport interface RequestAccessDialogProps {\n open: boolean;\n onClose: () => void;\n onSuccess: () => void;\n apiProductName: string;\n namespace: string;\n userEmail: string;\n plans: Plan[];\n}\n\nexport const RequestAccessDialog = ({\n open,\n onClose,\n onSuccess,\n apiProductName,\n namespace,\n userEmail,\n plans,\n}: RequestAccessDialogProps) => {\n const kuadrantApi = useApi(kuadrantApiRef);\n const alertApi = useApi(alertApiRef);\n\n const [selectedPlan, setSelectedPlan] = useState('');\n const [useCase, setUseCase] = useState('');\n const [creating, setCreating] = useState(false);\n const [createError, setCreateError] = useState<string | null>(null);\n\n const handleClose = () => {\n setSelectedPlan('');\n setUseCase('');\n setCreateError(null);\n onClose();\n };\n\n const handleRequestAccess = async () => {\n if (!selectedPlan) return;\n\n setCreating(true);\n setCreateError(null);\n\n try {\n // 1. generate secret name and API key value\n const randomSuffix = Math.random().toString(36).substring(2, 10);\n const secretName = `${apiProductName}-${randomSuffix}-secret`\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, '-');\n const apiKeyValue = crypto.randomUUID().replace(/-/g, '');\n\n // 2. create secret in consumer's namespace first (design doc: secret before APIKey)\n await kuadrantApi.createSecret(secretName, apiKeyValue);\n\n try {\n // 3. create APIKey referencing the pre-existing secret\n await kuadrantApi.createRequest({\n apiProductName,\n namespace,\n planTier: selectedPlan,\n useCase: useCase.trim() || '',\n userEmail,\n secretName,\n });\n\n alertApi.post({\n message: `Request submitted successfully. Pending API owner approval.`,\n severity: 'info',\n display: 'transient',\n });\n\n setSelectedPlan('');\n setUseCase('');\n onSuccess();\n\n } catch (apiKeyError) {\n // cleanup orphaned secret if APIKey creation fails\n try {\n await kuadrantApi.deleteSecret(secretName);\n } catch (deleteError) {\n console.warn('Failed to cleanup orphaned secret:', deleteError);\n }\n throw apiKeyError;\n }\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'unknown error occurred';\n alertApi.post({\n message: `Failed to create request: ${errorMessage}`,\n severity: 'error',\n display: 'transient',\n });\n setCreateError(errorMessage);\n } finally {\n setCreating(false);\n }\n };\n\n return (\n <Dialog open={open} onClose={handleClose} maxWidth=\"sm\" fullWidth>\n <DialogTitle>Request API Access</DialogTitle>\n <DialogContent>\n <Box\n mb={2}\n p={1.5}\n bgcolor=\"info.light\"\n borderRadius={1}\n display=\"flex\"\n alignItems=\"flex-start\"\n style={{ gap: 8 }}\n >\n <InfoIcon\n color=\"primary\"\n fontSize=\"small\"\n style={{ marginTop: 2 }}\n />\n <Typography variant=\"body2\">\n Your request will be reviewed by an API owner before access is\n granted.\n </Typography>\n </Box>\n {createError && (\n <Box\n mb={2}\n p={2}\n bgcolor=\"error.main\"\n color=\"error.contrastText\"\n borderRadius={1}\n >\n <Typography variant=\"body2\">{createError}</Typography>\n </Box>\n )}\n <FormControl\n fullWidth\n margin=\"normal\"\n disabled={creating}\n data-testid=\"tier-select-form\"\n >\n <InputLabel id=\"tier-select-label\">Select Tier</InputLabel>\n <Select\n labelId=\"tier-select-label\"\n data-testid=\"tier-select\"\n value={selectedPlan}\n onChange={(e) => setSelectedPlan(e.target.value as string)}\n disabled={creating}\n >\n {plans.map((plan: Plan) => {\n const limitDesc = Object.entries(plan.limits || {})\n .map(([key, val]) => `${val} per ${key}`)\n .join(', ');\n return (\n <MenuItem\n key={plan.tier}\n value={plan.tier}\n data-testid={`tier-option-${plan.tier}`}\n >\n {plan.tier} {limitDesc ? `(${limitDesc})` : ''}\n </MenuItem>\n );\n })}\n </Select>\n </FormControl>\n <TextField\n label=\"Use Case (optional)\"\n placeholder=\"Describe how you plan to use this API\"\n multiline\n rows={3}\n fullWidth\n margin=\"normal\"\n value={useCase}\n onChange={(e) => setUseCase(e.target.value)}\n helperText=\"Explain your intended use of this API for admin review\"\n disabled={creating}\n />\n </DialogContent>\n <DialogActions>\n <Button onClick={handleClose} disabled={creating}>\n Cancel\n </Button>\n <Button\n onClick={handleRequestAccess}\n color=\"primary\"\n variant=\"contained\"\n disabled={!selectedPlan || creating}\n startIcon={\n creating ? (\n <CircularProgress size={16} color=\"inherit\" />\n ) : undefined\n }\n >\n {creating ? 'Submitting...' : 'Submit Request'}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n","import React, { useState } from 'react';\nimport { useAsync } from 'react-use';\nimport {\n InfoCard,\n ResponseErrorPanel,\n} from '@backstage/core-components';\nimport {\n Typography,\n Box,\n Chip,\n Button,\n IconButton,\n Tooltip,\n} from '@material-ui/core';\nimport { Skeleton } from '@material-ui/lab';\nimport AddIcon from '@material-ui/icons/Add';\nimport VisibilityIcon from '@material-ui/icons/Visibility';\nimport VisibilityOffIcon from '@material-ui/icons/VisibilityOff';\nimport FileCopyIcon from '@material-ui/icons/FileCopy';\nimport { useApi, identityApiRef, alertApiRef } from '@backstage/core-plugin-api';\nimport { kuadrantApiRef } from '../../api';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { RequestAccessDialog } from '../RequestAccessDialog';\nimport { useKuadrantPermission } from '../../utils/permissions';\nimport { kuadrantApiKeyCreatePermission } from '../../permissions';\nimport { APIKey, APIProduct, Plan } from \"../../types/api-management\";\n\nexport interface ApiAccessCardProps {\n // deprecated: use entity annotations instead\n namespace?: string;\n}\n\nexport const ApiAccessCard = ({ namespace: propNamespace }: ApiAccessCardProps) => {\n const { entity } = useEntity();\n const kuadrantApi = useApi(kuadrantApiRef);\n const identityApi = useApi(identityApiRef);\n const alertApi = useApi(alertApiRef);\n const [userEmail, setUserEmail] = useState<string>('');\n const [requestDialogOpen, setRequestDialogOpen] = useState(false);\n const [refresh, setRefresh] = useState(0);\n\n // key reveal state\n const [visibleKeys, setVisibleKeys] = useState<Set<string>>(new Set());\n const [apiKeyValues, setApiKeyValues] = useState<Map<string, string>>(new Map());\n const [apiKeyLoading, setApiKeyLoading] = useState<Set<string>>(new Set());\n\n // get apiproduct name from entity annotation (set by entity provider)\n const apiProductName = entity.metadata.annotations?.['kuadrant.io/apiproduct'] || entity.metadata.name;\n const namespace = entity.metadata.annotations?.['kuadrant.io/namespace'] || propNamespace || 'default';\n\n // get current user identity\n useAsync(async () => {\n const profile = await identityApi.getProfileInfo();\n setUserEmail(profile.email || '');\n }, [identityApi]);\n\n // fetch user's approved keys for this API product\n // backend filters by apiProductRef.name and scopes to the user's consumer namespace\n const { value: requests, loading: keysLoading, error: keysError } = useAsync(async () => {\n const data = await kuadrantApi.getRequestsByApiProduct(apiProductName, namespace);\n const allRequests = data.items || [];\n return allRequests.filter((r: APIKey) =>\n r.status?.phase === 'Approved'\n );\n }, [namespace, apiProductName, kuadrantApi, refresh]);\n\n // fetch apiproduct to get available plans\n const { value: apiProduct, loading: productLoading } = useAsync(async () => {\n try {\n const data = await kuadrantApi.getApiProducts();\n return data.items?.find(\n (p: APIProduct) =>\n p.metadata.namespace === namespace &&\n p.metadata.name === apiProductName,\n );\n } catch (err) {\n return null;\n }\n }, [namespace, apiProductName, kuadrantApi]);\n\n const resourceRef = apiProduct\n ? `apiproduct:${apiProduct.metadata.namespace}/${apiProduct.metadata.name}`\n : undefined;\n\n const { allowed: canCreateRequest, loading: permissionLoading } = useKuadrantPermission(\n kuadrantApiKeyCreatePermission,\n resourceRef,\n );\n\n const fetchApiKeyFromSecret = async (requestNamespace: string, requestName: string) => {\n const key = `${requestNamespace}/${requestName}`;\n if (apiKeyLoading.has(key)) {\n return;\n }\n\n setApiKeyLoading((prev) => new Set(prev).add(key));\n try {\n const data = await kuadrantApi.getApiKeySecret(requestNamespace, requestName);\n setApiKeyValues((prev) => new Map(prev).set(key, data.apiKey));\n toggleVisibility(requestName);\n } catch (err) {\n console.error('failed to fetch api key:', err);\n const errorMessage = err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to fetch APIKey. ${errorMessage}`,\n severity: 'error',\n display: 'transient',\n });\n } finally {\n setApiKeyLoading((prev) => {\n const next = new Set(prev);\n next.delete(key);\n return next;\n });\n }\n };\n\n const clearApiKeyValue = (requestNamespace: string, requestName: string) => {\n const key = `${requestNamespace}/${requestName}`;\n setApiKeyValues((prev) => {\n const next = new Map(prev);\n next.delete(key);\n return next;\n });\n };\n\n const toggleVisibility = (keyName: string) => {\n setVisibleKeys((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(keyName)) {\n newSet.delete(keyName);\n } else {\n newSet.add(keyName);\n }\n return newSet;\n });\n };\n\n const loading = keysLoading || productLoading || permissionLoading;\n\n if (loading) {\n return (\n <InfoCard title=\"Kuadrant API Keys\">\n <Box p={2}>\n <Skeleton variant=\"text\" width=\"80%\" />\n <Skeleton variant=\"text\" width=\"60%\" />\n <Skeleton variant=\"text\" width=\"70%\" />\n </Box>\n </InfoCard>\n );\n }\n\n if (keysError) {\n return <ResponseErrorPanel error={keysError} />;\n }\n\n const keys = (requests as APIKey[]) || [];\n const plans = (apiProduct?.status?.discoveredPlans || []) as Plan[];\n const canRequest = canCreateRequest && plans.length > 0;\n\n const renderKeyRow = (request: APIKey) => {\n const key = `${request.metadata.namespace}/${request.metadata.name}`;\n const isVisible = visibleKeys.has(request.metadata.name);\n const isLoading = apiKeyLoading.has(key);\n const apiKeyValue = apiKeyValues.get(key);\n const hasSecretRef = Boolean(request.spec?.secretRef?.name);\n\n const handleRevealClick = () => {\n if (isVisible) {\n clearApiKeyValue(request.metadata.namespace, request.metadata.name);\n toggleVisibility(request.metadata.name);\n } else {\n fetchApiKeyFromSecret(request.metadata.namespace, request.metadata.name);\n }\n };\n\n const handleCopy = async () => {\n if (apiKeyValue) {\n await navigator.clipboard.writeText(apiKeyValue);\n alertApi.post({\n message: 'API key copied to clipboard',\n severity: 'success',\n display: 'transient',\n });\n }\n };\n\n return (\n <Box\n key={request.metadata.name}\n mb={1}\n p={1.5}\n border={1}\n borderColor=\"grey.300\"\n borderRadius={4}\n >\n <Box display=\"flex\" justifyContent=\"space-between\" alignItems=\"center\" mb={1}>\n <Typography variant=\"body2\" style={{ fontWeight: 500 }}>\n {request.metadata.name}\n </Typography>\n <Chip label={request.spec.planTier} color=\"primary\" size=\"small\" />\n </Box>\n {hasSecretRef && (\n <Box display=\"flex\" alignItems=\"center\">\n <Typography\n variant=\"body2\"\n style={{\n fontFamily: 'monospace',\n fontSize: '0.8rem',\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {isLoading\n ? 'Loading...'\n : isVisible && apiKeyValue\n ? apiKeyValue\n : '••••••••••••••••'}\n </Typography>\n {isVisible && apiKeyValue && (\n <Tooltip title=\"Copy to clipboard\">\n <IconButton size=\"small\" onClick={handleCopy}>\n <FileCopyIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n <Tooltip title={isVisible ? 'Hide API key' : 'Reveal API key'}>\n <span>\n <IconButton\n size=\"small\"\n onClick={handleRevealClick}\n disabled={isLoading}\n >\n {isVisible ? <VisibilityOffIcon fontSize=\"small\" /> : <VisibilityIcon fontSize=\"small\" />}\n </IconButton>\n </span>\n </Tooltip>\n </Box>\n )}\n </Box>\n );\n };\n\n return (\n <>\n <InfoCard title=\"Kuadrant API Keys\">\n <Box p={2}>\n {keys.length > 0 ? (\n <>\n <Typography variant=\"body2\" color=\"textSecondary\" gutterBottom>\n {keys.length} active key{keys.length !== 1 ? 's' : ''}\n </Typography>\n {keys.map(renderKeyRow)}\n </>\n ) : (\n <Typography variant=\"body1\" gutterBottom>\n You don't have any API keys for this API yet\n </Typography>\n )}\n <Box mt={2}>\n {canRequest ? (\n <Button\n variant=\"contained\"\n color=\"primary\"\n size=\"small\"\n startIcon={<AddIcon />}\n onClick={() => setRequestDialogOpen(true)}\n data-testid=\"request-api-access-button\"\n >\n Request API Access\n </Button>\n ) : (\n <Typography variant=\"caption\" color=\"textSecondary\">\n Visit the API Keys tab to view and manage access\n </Typography>\n )}\n </Box>\n </Box>\n </InfoCard>\n\n <RequestAccessDialog\n open={requestDialogOpen}\n onClose={() => setRequestDialogOpen(false)}\n onSuccess={() => {\n setRequestDialogOpen(false);\n setRefresh((r) => r + 1);\n }}\n apiProductName={apiProductName}\n namespace={namespace}\n userEmail={userEmail}\n plans={plans}\n />\n\n </>\n );\n};\n"],"names":["RequestAccessDialog","open","onClose","onSuccess","apiProductName","namespace","userEmail","plans","kuadrantApi","useApi","kuadrantApiRef","alertApi","alertApiRef","selectedPlan","setSelectedPlan","useState","useCase","setUseCase","creating","setCreating","createError","setCreateError","handleClose","Dialog","maxWidth","fullWidth","DialogTitle","DialogContent","Box","mb","p","bgcolor","borderRadius","display","alignItems","style","gap","InfoIcon","color","fontSize","marginTop","Typography","variant","FormControl","margin","disabled","data-testid","InputLabel","id","Select","labelId","value","onChange","e","target","map","plan","limitDesc","Object","entries","limits","key","val","join","MenuItem","tier","TextField","label","placeholder","multiline","rows","helperText","DialogActions","Button","onClick","async","randomSuffix","Math","random","toString","substring","secretName","toLowerCase","replace","apiKeyValue","crypto","randomUUID","createSecret","createRequest","planTier","trim","post","message","severity","apiKeyError","deleteSecret","deleteError","console","warn","error","errorMessage","Error","startIcon","CircularProgress","size","undefined","ApiAccessCard","propNamespace","entity","apiProduct","useEntity","identityApi","identityApiRef","setUserEmail","requestDialogOpen","setRequestDialogOpen","refresh","setRefresh","visibleKeys","setVisibleKeys","Set","apiKeyValues","setApiKeyValues","Map","apiKeyLoading","setApiKeyLoading","metadata","annotations","name","useAsync","profile","getProfileInfo","email","requests","loading","keysLoading","keysError","getRequestsByApiProduct","items","filter","r","status","phase","productLoading","data","getApiProducts","find","err","resourceRef","allowed","canCreateRequest","permissionLoading","useKuadrantPermission","kuadrantApiKeyCreatePermission","toggleVisibility","keyName","prev","newSet","has","delete","add","InfoCard","title","Skeleton","width","ResponseErrorPanel","keys","discoveredPlans","canRequest","length","gutterBottom","request","isVisible","isLoading","get","hasSecretRef","Boolean","spec","secretRef","border","borderColor","justifyContent","fontWeight","Chip","fontFamily","flex","overflow","textOverflow","Tooltip","IconButton","navigator","clipboard","writeText","FileCopyIcon","span","requestNamespace","requestName","next","clearApiKeyValue","getApiKeySecret","set","apiKey","fetchApiKeyFromSecret","VisibilityOffIcon","VisibilityIcon","mt","AddIcon"],"sourceRoot":""}