@kuadrant/kuadrant-backstage-plugin-frontend 0.0.2-dev-cd184fc → 0.0.2-dev-d2ba42b
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.
- package/dist/components/ApiAccessCard/ApiAccessCard.esm.js +2 -1
- package/dist/components/ApiAccessCard/ApiAccessCard.esm.js.map +1 -1
- package/dist/components/ApiKeyApprovalPage/ApiKeyApprovalPage.esm.js +10 -0
- package/dist/components/ApiKeyApprovalPage/ApiKeyApprovalPage.esm.js.map +1 -0
- package/dist/components/ApiKeyApprovalPage/index.esm.js +2 -0
- package/dist/components/ApiKeyDetailPage/ApiKeyDetailPage.esm.js +4 -4
- package/dist/components/ApiKeyDetailPage/ApiKeyDetailPage.esm.js.map +1 -1
- package/dist/components/ApiProductDetailPage/ApiProductDetailPage.esm.js +28 -2
- package/dist/components/ApiProductDetailPage/ApiProductDetailPage.esm.js.map +1 -1
- package/dist/components/ApiProductDetails/ApiProductDetails.esm.js +13 -3
- package/dist/components/ApiProductDetails/ApiProductDetails.esm.js.map +1 -1
- package/dist/components/ApprovalQueueTable/ApprovalQueueTable.esm.js +2 -2
- package/dist/components/ApprovalQueueTable/ApprovalQueueTable.esm.js.map +1 -1
- package/dist/components/CreateAPIProductDialog/CreateAPIProductDialog.esm.js +117 -10
- package/dist/components/CreateAPIProductDialog/CreateAPIProductDialog.esm.js.map +1 -1
- package/dist/components/EditAPIProductDialog/EditAPIProductDialog.esm.js +48 -24
- package/dist/components/EditAPIProductDialog/EditAPIProductDialog.esm.js.map +1 -1
- package/dist/components/EntityApiApprovalTab/EntityApiApprovalTab.esm.js +2 -2
- package/dist/components/EntityApiApprovalTab/EntityApiApprovalTab.esm.js.map +1 -1
- package/dist/components/KuadrantPage/ApiProductsPage.esm.js +53 -3
- package/dist/components/KuadrantPage/ApiProductsPage.esm.js.map +1 -1
- package/dist/components/MyApiKeysPage/MyApiKeysPage.esm.js +10 -0
- package/dist/components/MyApiKeysPage/MyApiKeysPage.esm.js.map +1 -0
- package/dist/components/MyApiKeysPage/index.esm.js +2 -0
- package/dist/components/MyApiKeysPage/index.esm.js.map +1 -0
- package/dist/components/MyApiKeysTable/MyApiKeysTable.esm.js +26 -5
- package/dist/components/MyApiKeysTable/MyApiKeysTable.esm.js.map +1 -1
- package/dist/components/PlanPolicyDetailsCard/PlanPolicyDetails.esm.js +4 -4
- package/dist/components/PlanPolicyDetailsCard/PlanPolicyDetails.esm.js.map +1 -1
- package/dist/components/SimpleRequestAccessDialog/SimpleRequestAccessDialog.esm.js +206 -0
- package/dist/components/SimpleRequestAccessDialog/SimpleRequestAccessDialog.esm.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.esm.js +1 -1
- package/dist/plugin.esm.js +11 -4
- package/dist/plugin.esm.js.map +1 -1
- package/dist/utils/styles.esm.js +44 -5
- package/dist/utils/styles.esm.js.map +1 -1
- package/dist-scalprum/internal.plugin-kuadrant.eacc31ca4d6c1340f8a8.js +2 -0
- package/dist-scalprum/{internal.plugin-kuadrant.c830fc2d56f9e96a055e.js.map → internal.plugin-kuadrant.eacc31ca4d6c1340f8a8.js.map} +1 -1
- package/dist-scalprum/plugin-manifest.json +3 -3
- package/dist-scalprum/static/2118.82433765.chunk.js +2 -0
- package/dist-scalprum/static/2118.82433765.chunk.js.map +1 -0
- package/dist-scalprum/static/2967.5bade048.chunk.js +2 -0
- package/dist-scalprum/static/2967.5bade048.chunk.js.map +1 -0
- package/dist-scalprum/static/3650.89dfc64c.chunk.js +2 -0
- package/dist-scalprum/static/3650.89dfc64c.chunk.js.map +1 -0
- package/dist-scalprum/static/369.2374941c.chunk.js +2 -0
- package/dist-scalprum/static/369.2374941c.chunk.js.map +1 -0
- package/dist-scalprum/static/3947.ff1c25cf.chunk.js +2 -0
- package/dist-scalprum/static/3947.ff1c25cf.chunk.js.map +1 -0
- package/dist-scalprum/static/3976.4cf18515.chunk.js +2 -0
- package/dist-scalprum/static/3976.4cf18515.chunk.js.map +1 -0
- package/dist-scalprum/static/4447.adbf663f.chunk.js +2 -0
- package/dist-scalprum/static/4447.adbf663f.chunk.js.map +1 -0
- package/dist-scalprum/static/5010.4ef96c87.chunk.js +3 -0
- package/dist-scalprum/static/5010.4ef96c87.chunk.js.map +1 -0
- package/dist-scalprum/static/5203.fce2a28f.chunk.js +2 -0
- package/dist-scalprum/static/5203.fce2a28f.chunk.js.map +1 -0
- package/dist-scalprum/static/6422.969d9b8c.chunk.js +2 -0
- package/dist-scalprum/static/6422.969d9b8c.chunk.js.map +1 -0
- package/dist-scalprum/static/6800.cd5c7bcb.chunk.js +2 -0
- package/dist-scalprum/static/6800.cd5c7bcb.chunk.js.map +1 -0
- package/dist-scalprum/static/7005.72759857.chunk.js +2 -0
- package/dist-scalprum/static/7005.72759857.chunk.js.map +1 -0
- package/dist-scalprum/static/7270.9473c969.chunk.js +2 -0
- package/dist-scalprum/static/7270.9473c969.chunk.js.map +1 -0
- package/dist-scalprum/static/7791.01371352.chunk.js +2 -0
- package/dist-scalprum/static/7791.01371352.chunk.js.map +1 -0
- package/dist-scalprum/static/{6763.d6cd937f.chunk.js → 8563.46f1a3e1.chunk.js} +3 -3
- package/dist-scalprum/static/8563.46f1a3e1.chunk.js.map +1 -0
- package/dist-scalprum/static/8789.30227526.chunk.js +2 -0
- package/dist-scalprum/static/8789.30227526.chunk.js.map +1 -0
- package/dist-scalprum/static/8804.63919453.chunk.js +2 -0
- package/dist-scalprum/static/8804.63919453.chunk.js.map +1 -0
- package/dist-scalprum/static/exposed-PluginRoot.8d8f0b09.chunk.js +2 -0
- package/dist-scalprum/static/exposed-PluginRoot.8d8f0b09.chunk.js.map +1 -0
- package/package.json +1 -1
- package/dist/components/ApiKeysPage/ApiKeysPage.esm.js +0 -43
- package/dist/components/ApiKeysPage/ApiKeysPage.esm.js.map +0 -1
- package/dist/components/ApiKeysPage/index.esm.js +0 -2
- package/dist-scalprum/internal.plugin-kuadrant.c830fc2d56f9e96a055e.js +0 -2
- package/dist-scalprum/static/2821.972ae33b.chunk.js +0 -2
- package/dist-scalprum/static/2821.972ae33b.chunk.js.map +0 -1
- package/dist-scalprum/static/2967.65c51af8.chunk.js +0 -2
- package/dist-scalprum/static/2967.65c51af8.chunk.js.map +0 -1
- package/dist-scalprum/static/3091.9a74ea5f.chunk.js +0 -2
- package/dist-scalprum/static/3091.9a74ea5f.chunk.js.map +0 -1
- package/dist-scalprum/static/3650.ee76eba9.chunk.js +0 -2
- package/dist-scalprum/static/3650.ee76eba9.chunk.js.map +0 -1
- package/dist-scalprum/static/3947.7458971d.chunk.js +0 -2
- package/dist-scalprum/static/3947.7458971d.chunk.js.map +0 -1
- package/dist-scalprum/static/3984.647ef00c.chunk.js +0 -2
- package/dist-scalprum/static/3984.647ef00c.chunk.js.map +0 -1
- package/dist-scalprum/static/4651.c85cecc4.chunk.js +0 -2
- package/dist-scalprum/static/4651.c85cecc4.chunk.js.map +0 -1
- package/dist-scalprum/static/4682.75f17114.chunk.js +0 -2
- package/dist-scalprum/static/4682.75f17114.chunk.js.map +0 -1
- package/dist-scalprum/static/5010.0cd6c959.chunk.js +0 -3
- package/dist-scalprum/static/5010.0cd6c959.chunk.js.map +0 -1
- package/dist-scalprum/static/5203.b654e8e0.chunk.js +0 -2
- package/dist-scalprum/static/5203.b654e8e0.chunk.js.map +0 -1
- package/dist-scalprum/static/5453.ecdee66d.chunk.js +0 -2
- package/dist-scalprum/static/5453.ecdee66d.chunk.js.map +0 -1
- package/dist-scalprum/static/6763.d6cd937f.chunk.js.map +0 -1
- package/dist-scalprum/static/6800.20f46859.chunk.js +0 -2
- package/dist-scalprum/static/6800.20f46859.chunk.js.map +0 -1
- package/dist-scalprum/static/6840.1653e6b0.chunk.js +0 -2
- package/dist-scalprum/static/6840.1653e6b0.chunk.js.map +0 -1
- package/dist-scalprum/static/7791.ac1ac509.chunk.js +0 -2
- package/dist-scalprum/static/7791.ac1ac509.chunk.js.map +0 -1
- package/dist-scalprum/static/8172.cbe1f2c4.chunk.js +0 -2
- package/dist-scalprum/static/8172.cbe1f2c4.chunk.js.map +0 -1
- package/dist-scalprum/static/8799.52bbeef1.chunk.js +0 -2
- package/dist-scalprum/static/8799.52bbeef1.chunk.js.map +0 -1
- package/dist-scalprum/static/exposed-PluginRoot.55777e36.chunk.js +0 -2
- package/dist-scalprum/static/exposed-PluginRoot.55777e36.chunk.js.map +0 -1
- /package/dist/components/{ApiKeysPage → ApiKeyApprovalPage}/index.esm.js.map +0 -0
- /package/dist-scalprum/static/{5010.0cd6c959.chunk.js.LICENSE.txt → 5010.4ef96c87.chunk.js.LICENSE.txt} +0 -0
- /package/dist-scalprum/static/{6763.d6cd937f.chunk.js.LICENSE.txt → 8563.46f1a3e1.chunk.js.LICENSE.txt} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"static/2821.972ae33b.chunk.js","mappings":"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","sources":["webpack://internal.plugin-kuadrant/./src/components/FilterPanel/FilterPanel.tsx","webpack://internal.plugin-kuadrant/./src/components/PermissionGate/PermissionGate.tsx","webpack://internal.plugin-kuadrant/./src/components/CreateAPIProductDialog/CreateAPIProductDialog.tsx","webpack://internal.plugin-kuadrant/./src/components/KuadrantPage/ApiProductsPage.tsx"],"sourcesContent":["import React from 'react';\nimport {\n Box,\n Typography,\n Checkbox,\n FormControlLabel,\n FormGroup,\n Divider,\n Button,\n Collapse,\n makeStyles,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport ExpandLessIcon from '@material-ui/icons/ExpandLess';\n\nconst useStyles = makeStyles(theme => ({\n root: {\n width: 240,\n minWidth: 240,\n padding: theme.spacing(2),\n borderRight: `1px solid ${theme.palette.divider}`,\n backgroundColor: theme.palette.background.paper,\n height: '100%',\n overflowY: 'auto',\n },\n sectionTitle: {\n fontWeight: 600,\n fontSize: '0.75rem',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n color: theme.palette.text.secondary,\n marginBottom: theme.spacing(1),\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n cursor: 'pointer',\n userSelect: 'none',\n },\n filterSection: {\n marginBottom: theme.spacing(2),\n },\n checkbox: {\n padding: theme.spacing(0.5),\n },\n checkboxLabel: {\n fontSize: '0.875rem',\n },\n clearButton: {\n marginTop: theme.spacing(2),\n },\n count: {\n fontSize: '0.75rem',\n color: theme.palette.text.secondary,\n marginLeft: theme.spacing(1),\n },\n}));\n\nexport interface FilterOption {\n value: string;\n label: string;\n count?: number;\n}\n\nexport interface FilterSection {\n id: string;\n title: string;\n options: FilterOption[];\n collapsed?: boolean;\n}\n\nexport interface FilterState {\n [sectionId: string]: string[];\n}\n\ninterface FilterPanelProps {\n sections: FilterSection[];\n filters: FilterState;\n onChange: (filters: FilterState) => void;\n onClear?: () => void;\n}\n\nexport const FilterPanel = ({\n sections,\n filters,\n onChange,\n onClear,\n}: FilterPanelProps) => {\n const classes = useStyles();\n const [collapsedSections, setCollapsedSections] = React.useState<Set<string>>(\n new Set(sections.filter(s => s.collapsed).map(s => s.id)),\n );\n\n const toggleSection = (sectionId: string) => {\n setCollapsedSections(prev => {\n const next = new Set(prev);\n if (next.has(sectionId)) {\n next.delete(sectionId);\n } else {\n next.add(sectionId);\n }\n return next;\n });\n };\n\n const handleCheckboxChange = (sectionId: string, value: string) => {\n const currentValues = filters[sectionId] || [];\n const newValues = currentValues.includes(value)\n ? currentValues.filter(v => v !== value)\n : [...currentValues, value];\n\n onChange({\n ...filters,\n [sectionId]: newValues,\n });\n };\n\n const hasActiveFilters = Object.values(filters).some(\n values => values.length > 0,\n );\n\n const handleClear = () => {\n const clearedFilters: FilterState = {};\n sections.forEach(section => {\n clearedFilters[section.id] = [];\n });\n onChange(clearedFilters);\n onClear?.();\n };\n\n return (\n <Box className={classes.root}>\n <Box display=\"flex\" justifyContent=\"space-between\" alignItems=\"center\" mb={2}>\n <Typography variant=\"subtitle2\">Filters</Typography>\n {hasActiveFilters && (\n <Button\n size=\"small\"\n color=\"primary\"\n onClick={handleClear}\n >\n Clear all\n </Button>\n )}\n </Box>\n\n <Divider />\n\n {sections.map(section => {\n const isCollapsed = collapsedSections.has(section.id);\n const selectedCount = (filters[section.id] || []).length;\n\n return (\n <Box key={section.id} className={classes.filterSection} mt={2}>\n <Box\n className={classes.sectionTitle}\n onClick={() => toggleSection(section.id)}\n >\n <Box display=\"flex\" alignItems=\"center\">\n <span>{section.title}</span>\n {selectedCount > 0 && (\n <span className={classes.count}>({selectedCount})</span>\n )}\n </Box>\n {isCollapsed ? (\n <ExpandMoreIcon fontSize=\"small\" />\n ) : (\n <ExpandLessIcon fontSize=\"small\" />\n )}\n </Box>\n\n <Collapse in={!isCollapsed}>\n <FormGroup>\n {section.options.map(option => (\n <FormControlLabel\n key={option.value}\n control={\n <Checkbox\n checked={(filters[section.id] || []).includes(option.value)}\n onChange={() =>\n handleCheckboxChange(section.id, option.value)\n }\n size=\"small\"\n className={classes.checkbox}\n color=\"primary\"\n />\n }\n label={\n <Box display=\"flex\" alignItems=\"center\">\n <span className={classes.checkboxLabel}>\n {option.label}\n </span>\n {option.count !== undefined && (\n <span className={classes.count}>({option.count})</span>\n )}\n </Box>\n }\n />\n ))}\n </FormGroup>\n </Collapse>\n </Box>\n );\n })}\n </Box>\n );\n};\n","import React from 'react';\nimport { Typography, Box } from '@material-ui/core';\nimport { Progress } from '@backstage/core-components';\nimport { Permission } from '@backstage/plugin-permission-common';\nimport { useKuadrantPermission } from '../../utils/permissions';\n\ninterface PermissionGateProps {\n children: React.ReactNode;\n permission: Permission;\n fallback?: React.ReactNode;\n errorMessage?: string;\n}\n\nexport const PermissionGate = ({ children, permission, fallback, errorMessage }: PermissionGateProps) => {\n const { allowed, loading, error } = useKuadrantPermission(permission);\n\n if (loading) {\n return <Progress />;\n }\n\n if (error) {\n return (\n <Box p={4}>\n <Typography color=\"error\">\n Unable to check permissions: {error.message}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Please try again or contact your administrator\n </Typography>\n </Box>\n );\n }\n\n if (!allowed) {\n if (fallback) {\n return <>{fallback}</>;\n }\n return (\n <Box p={4}>\n <Typography color=\"textSecondary\">\n {errorMessage || 'You don\\'t have permission to view this page'}\n </Typography>\n <Box mt={1}>\n <Typography variant=\"caption\" color=\"textSecondary\">\n Required permission: {permission.name}\n </Typography>\n </Box>\n </Box>\n );\n }\n\n return <>{children}</>;\n};\n","import React, { useEffect, useState } from 'react';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Button,\n TextField,\n Box,\n Typography,\n Chip,\n Grid,\n MenuItem,\n CircularProgress,\n makeStyles,\n FormControl,\n RadioGroup,\n FormControlLabel,\n Radio,\n Tooltip,\n IconButton,\n InputAdornment,\n} from '@material-ui/core';\nimport InfoOutlinedIcon from '@material-ui/icons/InfoOutlined';\nimport AddIcon from '@material-ui/icons/Add';\nimport { useApi, configApiRef, fetchApiRef } from '@backstage/core-plugin-api';\nimport { Alert } from '@material-ui/lab';\nimport useAsync from 'react-use/lib/useAsync';\nimport { PlanPolicyDetails } from '../PlanPolicyDetailsCard';\nimport { validateKubernetesName, validateURL } from '../../utils/validation';\nimport { handleFetchError } from \"../../utils/errors\";\n\nconst useStyles = makeStyles((theme) => ({\n asterisk: {\n color: '#f44336',\n },\n sectionHeader: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n marginTop: theme.spacing(2),\n marginBottom: theme.spacing(1),\n },\n infoIcon: {\n fontSize: 18,\n color: theme.palette.text.secondary,\n },\n tagChip: {\n marginRight: theme.spacing(0.5),\n marginBottom: theme.spacing(0.5),\n },\n}));\n\ninterface CreateAPIProductDialogProps {\n open: boolean;\n onClose: () => void;\n onSuccess: (productInfo: { namespace: string; name: string; displayName: string }) => void;\n}\n\nexport const CreateAPIProductDialog = ({ open, onClose, onSuccess }: CreateAPIProductDialogProps) => {\n const classes = useStyles();\n const config = useApi(configApiRef);\n const fetchApi = useApi(fetchApiRef);\n const backendUrl = config.getString('backend.baseUrl');\n\n const [name, setName] = useState('');\n const [displayName, setDisplayName] = useState('');\n const [description, setDescription] = useState('');\n const [version, setVersion] = useState('v1');\n const [approvalMode, setApprovalMode] = useState<'automatic' | 'manual'>('manual');\n const [publishStatus, setPublishStatus] = useState<'Draft' | 'Published'>('Published');\n const [tags, setTags] = useState<string[]>([]);\n const [tagInput, setTagInput] = useState('');\n const [selectedHTTPRoute, setSelectedHTTPRoute] = useState('');\n const [contactEmail, setContactEmail] = useState('');\n const [contactTeam, setContactTeam] = useState('');\n const [docsURL, setDocsURL] = useState('');\n const [openAPISpec, setOpenAPISpec] = useState('');\n const [error, setError] = useState('');\n const [creating, setCreating] = useState(false);\n const [httpRoutesRetry, setHttpRoutesRetry] = useState(0);\n const [nameError, setNameError] = useState<string | null>(null);\n const [openAPISpecError, setOpenAPISpecError] = useState<string | null>(null);\n const {\n value: httpRoutes,\n loading: httpRoutesLoading,\n error: httpRoutesError\n } = useAsync(async () => {\n const response = await fetchApi.fetch(`${backendUrl}/api/kuadrant/httproutes`);\n\n if (!response.ok) {\n const error = await handleFetchError(response);\n throw new Error(`failed to fetch routes. ${error}`);\n }\n\n const data = await response.json();\n return data.items || [];\n }, [backendUrl, fetchApi, open, httpRoutesRetry]);\n\n // load planpolicies with full details to show associated plans\n const {\n value: planPolicies,\n error: planPoliciesError\n } = useAsync(async () => {\n const response = await fetchApi.fetch(`${backendUrl}/api/kuadrant/planpolicies`);\n\n if (!response.ok) {\n const error = await handleFetchError(response);\n throw new Error(`failed to fetch PlanPolicies. ${error}`);\n }\n\n return await response.json();\n }, [backendUrl, fetchApi, open]);\n\n // find planpolicy associated with selected httproute\n const getPlanPolicyForRoute = (routeNamespace: string, routeName: string) => {\n if (!planPolicies?.items) return null;\n\n return planPolicies.items.find((pp: any) => {\n const ref = pp.targetRef;\n return (\n ref?.kind === 'HTTPRoute' &&\n ref?.name === routeName &&\n (!ref?.namespace || ref?.namespace === routeNamespace)\n );\n });\n };\n\n const selectedRouteInfo = selectedHTTPRoute ? selectedHTTPRoute.split('/') : null;\n const selectedPolicy = selectedRouteInfo\n ? getPlanPolicyForRoute(selectedRouteInfo[0], selectedRouteInfo[1])\n : null;\n\n // format tier info for dropdown display\n const formatTierInfo = (policy: any): string => {\n if (!policy?.spec?.plans) return '';\n const tiers = Object.entries(policy.spec.plans)\n .map(([name, plan]: [string, any]) => {\n const limit = plan?.limits?.requests;\n if (!limit) return name;\n return `${name}: ${limit.count}/${limit.period}`;\n })\n .join('; ');\n return tiers ? ` (${tiers})` : '';\n };\n\n // get policy info for a route (for dropdown display)\n const getPolicyInfoForRoute = (routeNamespace: string, routeName: string): string => {\n const policy = getPlanPolicyForRoute(routeNamespace, routeName);\n if (!policy) return 'N/A';\n return `${policy.metadata.name}${formatTierInfo(policy)}`;\n };\n\n useEffect(() => {\n if (open) {\n setNameError(null);\n setOpenAPISpecError(null);\n }\n }, [open]);\n\n // validate handlers\n const handleNameChange = (value: string) => {\n setName(value);\n setNameError(validateKubernetesName(value));\n };\n\n const handleOpenAPISpecChange = (value: string) => {\n setOpenAPISpec(value);\n setOpenAPISpecError(validateURL(value));\n };\n\n const handleAddTag = () => {\n if (tagInput.trim() && !tags.includes(tagInput.trim())) {\n setTags([...tags, tagInput.trim()]);\n setTagInput('');\n }\n };\n\n const handleDeleteTag = (tagToDelete: string) => {\n setTags(tags.filter(tag => tag !== tagToDelete));\n };\n\n const handleCreate = async () => {\n setError('');\n setCreating(true);\n\n try {\n if (!selectedHTTPRoute) {\n throw new Error('Please select an HTTPRoute');\n }\n\n const [selectedRouteNamespace, selectedRouteName] = selectedHTTPRoute.split('/');\n\n // derive namespace from selected httproute\n const namespace = selectedRouteNamespace;\n\n const apiProduct = {\n apiVersion: 'devportal.kuadrant.io/v1alpha1',\n kind: 'APIProduct',\n metadata: {\n name,\n namespace,\n },\n spec: {\n displayName,\n description,\n version,\n approvalMode,\n publishStatus,\n tags,\n targetRef: {\n group: 'gateway.networking.k8s.io',\n kind: 'HTTPRoute',\n name: selectedRouteName,\n namespace: selectedRouteNamespace,\n },\n ...(contactEmail || contactTeam ? {\n contact: {\n ...(contactEmail && { email: contactEmail }),\n ...(contactTeam && { team: contactTeam }),\n },\n } : {}),\n ...(docsURL || openAPISpec ? {\n documentation: {\n ...(docsURL && { docsURL }),\n ...(openAPISpec && { openAPISpecURL: openAPISpec }),\n },\n } : {}),\n },\n };\n\n const response = await fetchApi.fetch(`${backendUrl}/api/kuadrant/apiproducts`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(apiProduct),\n });\n\n if (!response.ok) {\n const error = await handleFetchError(response);\n throw new Error(`failed to create APIProduct. ${error}`);\n }\n\n onSuccess({ namespace, name, displayName });\n handleClose();\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setCreating(false);\n }\n };\n\n const handleClose = () => {\n setName('');\n setDisplayName('');\n setDescription('');\n setVersion('v1');\n setApprovalMode('manual');\n setPublishStatus('Published');\n setTags([]);\n setTagInput('');\n setSelectedHTTPRoute('');\n setContactEmail('');\n setContactTeam('');\n setDocsURL('');\n setOpenAPISpec('');\n setError('');\n setNameError(null);\n setOpenAPISpecError(null);\n onClose();\n };\n\n const hasValidationErrors = !!nameError || !!openAPISpecError;\n\n return (\n <Dialog open={open} onClose={handleClose} maxWidth=\"md\" fullWidth>\n <DialogTitle>Create API Product</DialogTitle>\n <DialogContent>\n {error && (\n <Alert severity=\"error\" style={{ marginBottom: 16 }}>\n {error}\n </Alert>\n )}\n {httpRoutesError && (\n <Alert severity=\"error\" style={{ marginBottom: 16 }}>\n <strong>Failed to load HTTPRoutes:</strong> {httpRoutesError.message}\n <Box mt={1}>\n <Button\n size=\"small\"\n variant=\"outlined\"\n onClick={() => setHttpRoutesRetry(prev => prev + 1)}\n >\n Retry\n </Button>\n </Box>\n </Alert>\n )}\n\n {planPoliciesError && (\n <Alert severity=\"warning\" style={{ marginBottom: 16 }}>\n <strong>Failed to load PlanPolicies:</strong> {planPoliciesError.message}\n <Typography variant=\"body2\" style={{ marginTop: 8 }}>\n You can still create the API Product, but plan information may be incomplete.\n </Typography>\n </Alert>\n )}\n {/* API product info section */}\n <Box className={classes.sectionHeader}>\n <Typography variant=\"subtitle1\"><strong>API product info</strong></Typography>\n </Box>\n <Grid container spacing={2}>\n <Grid item xs={6}>\n <TextField\n fullWidth\n label=\"API product name\"\n value={displayName}\n onChange={e => setDisplayName(e.target.value)}\n placeholder=\"My API\"\n helperText=\"Give a unique name for your API product\"\n margin=\"normal\"\n required\n disabled={creating}\n InputLabelProps={{\n classes: {\n asterisk: classes.asterisk,\n },\n }}\n />\n </Grid>\n <Grid item xs={6}>\n <TextField\n fullWidth\n label=\"Resource name\"\n value={name}\n onChange={e => handleNameChange(e.target.value)}\n placeholder=\"my-api\"\n helperText={nameError || \"Kubernetes resource name with lowercase, hyphens. Eg.flight_API\"}\n error={!!nameError}\n margin=\"normal\"\n required\n disabled={creating}\n InputLabelProps={{\n classes: {\n asterisk: classes.asterisk,\n },\n }}\n />\n </Grid>\n <Grid item xs={6}>\n <TextField\n fullWidth\n label=\"Version\"\n value={version}\n onChange={e => setVersion(e.target.value)}\n placeholder=\"v1\"\n helperText=\"Give a version to your API product\"\n margin=\"normal\"\n required\n disabled={creating}\n InputLabelProps={{\n classes: {\n asterisk: classes.asterisk,\n },\n }}\n />\n </Grid>\n <Grid item xs={6}>\n <TextField\n fullWidth\n label=\"Tag\"\n value={tagInput}\n onChange={e => setTagInput(e.target.value)}\n onKeyPress={e => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleAddTag();\n }\n }}\n placeholder=\"Add tag\"\n helperText=\"Add a tag to your API product\"\n margin=\"normal\"\n disabled={creating}\n InputProps={{\n endAdornment: tagInput ? (\n <InputAdornment position=\"end\">\n <IconButton size=\"small\" onClick={handleAddTag} disabled={creating}>\n <AddIcon fontSize=\"small\" />\n </IconButton>\n </InputAdornment>\n ) : undefined,\n }}\n />\n </Grid>\n {tags.length > 0 && (\n <Grid item xs={12}>\n <Box display=\"flex\" flexWrap=\"wrap\">\n {tags.map(tag => (\n <Chip\n key={tag}\n label={tag}\n onDelete={creating ? undefined : () => handleDeleteTag(tag)}\n size=\"small\"\n className={classes.tagChip}\n disabled={creating}\n />\n ))}\n </Box>\n </Grid>\n )}\n <Grid item xs={12}>\n <TextField\n fullWidth\n label=\"Description\"\n value={description}\n onChange={e => setDescription(e.target.value)}\n placeholder=\"API description\"\n margin=\"normal\"\n multiline\n rows={2}\n required\n disabled={creating}\n InputLabelProps={{\n classes: {\n asterisk: classes.asterisk,\n },\n }}\n />\n </Grid>\n </Grid>\n\n {/* Add API and Associate route section */}\n <Box className={classes.sectionHeader}>\n <Typography variant=\"subtitle1\"><strong>Add API and Associate route</strong></Typography>\n <Tooltip title=\"Register an existing API and associate HTTPRoute for your API product\">\n <InfoOutlinedIcon className={classes.infoIcon} />\n </Tooltip>\n </Box>\n <Grid container spacing={2}>\n <Grid item xs={12}>\n <TextField\n fullWidth\n label=\"OpenAPI Spec URL\"\n value={openAPISpec}\n onChange={e => handleOpenAPISpecChange(e.target.value)}\n placeholder=\"https://api.example.com/openapi.json\"\n helperText={openAPISpecError || \"Enter the full path to your API spec file\"}\n error={!!openAPISpecError}\n margin=\"normal\"\n required\n disabled={creating}\n InputLabelProps={{\n classes: {\n asterisk: classes.asterisk,\n },\n }}\n />\n </Grid>\n <Grid item xs={12}>\n <TextField\n fullWidth\n label=\"Documentation URL\"\n value={docsURL}\n onChange={e => setDocsURL(e.target.value)}\n placeholder=\"https://docs.example.com/api\"\n helperText=\"Link to external documentation for this API\"\n margin=\"normal\"\n disabled={creating}\n />\n </Grid>\n <Grid item xs={12}>\n <TextField\n fullWidth\n select\n label=\"HTTPRoute\"\n value={selectedHTTPRoute}\n onChange={e => setSelectedHTTPRoute(e.target.value)}\n margin=\"normal\"\n required\n helperText={\n httpRoutesError\n ? \"Unable to load HTTPRoutes. Please retry.\"\n : \"Select an HTTPRoute. APIProduct will be created in the same namespace.\"\n }\n error={!!httpRoutesError}\n disabled={httpRoutesLoading || creating || !!httpRoutesError}\n InputLabelProps={{\n classes: {\n asterisk: classes.asterisk,\n },\n }}\n SelectProps={{\n 'data-testid': 'httproute-select',\n } as any}\n >\n {httpRoutesLoading && (\n <MenuItem value=\"\">Loading...</MenuItem>\n )}\n {httpRoutesError && (\n <MenuItem value=\"\">Error loading routes</MenuItem>\n )}\n {!httpRoutesLoading && !httpRoutesError && httpRoutes && httpRoutes.length === 0 && (\n <MenuItem value=\"\">No HTTPRoutes available</MenuItem>\n )}\n {!httpRoutesLoading && !httpRoutesError && httpRoutes && httpRoutes.map((route: any) => {\n const routeNs = route.metadata.namespace;\n const routeName = route.metadata.name;\n const policyInfo = getPolicyInfoForRoute(routeNs, routeName);\n return (\n <MenuItem\n key={`${routeNs}/${routeName}`}\n value={`${routeNs}/${routeName}`}\n >\n <Box>\n <Typography variant=\"body1\">{routeName}</Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n Associated PlanPolicy: {policyInfo}\n </Typography>\n </Box>\n </MenuItem>\n );\n })}\n </TextField>\n </Grid>\n </Grid>\n\n {/* HTTPRoute policies section */}\n {selectedHTTPRoute && (\n <>\n <Box className={classes.sectionHeader}>\n <Typography variant=\"subtitle1\"><strong>HTTPRoute policies</strong></Typography>\n <Tooltip title=\"Shows the associated policies and rate limit tiers for the selected HTTPRoute\">\n <InfoOutlinedIcon className={classes.infoIcon} />\n </Tooltip>\n </Box>\n <PlanPolicyDetails\n selectedPolicy={selectedPolicy}\n alertSeverity=\"warning\"\n alertMessage=\"No PlanPolicy found for this HTTPRoute. API keys and rate limiting may not be available.\"\n includeTopMargin={false}\n />\n </>\n )}\n\n {/* API Key approval section */}\n <Box className={classes.sectionHeader}>\n <Typography variant=\"subtitle1\"><strong>API Key approval</strong></Typography>\n <Tooltip title=\"Choose how API key requests are handled for this product\">\n <InfoOutlinedIcon className={classes.infoIcon} />\n </Tooltip>\n </Box>\n <FormControl component=\"fieldset\" disabled={creating}>\n <RadioGroup\n row\n value={approvalMode}\n onChange={e => setApprovalMode(e.target.value as 'automatic' | 'manual')}\n >\n <FormControlLabel\n value=\"manual\"\n control={<Radio color=\"primary\" />}\n label={\n <Box>\n <Typography variant=\"body2\">Need manual approval</Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n Requires approval for requesting this API\n </Typography>\n </Box>\n }\n />\n <FormControlLabel\n value=\"automatic\"\n control={<Radio color=\"primary\" />}\n label={\n <Box>\n <Typography variant=\"body2\">Automatic</Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n Keys are created without need to be approved\n </Typography>\n </Box>\n }\n />\n </RadioGroup>\n </FormControl>\n </DialogContent>\n <DialogActions>\n <Button onClick={handleClose} disabled={creating}>Cancel</Button>\n <Button\n onClick={handleCreate}\n color=\"primary\"\n variant=\"contained\"\n disabled={creating || !name || !displayName || !description || !selectedHTTPRoute || hasValidationErrors}\n startIcon={creating ? <CircularProgress size={16} color=\"inherit\" /> : undefined}\n >\n {creating ? 'Creating...' : 'Create'}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n","import React, { useState, useMemo, useCallback } from \"react\";\nimport {\n Typography,\n Box,\n Chip,\n Button,\n IconButton,\n CircularProgress,\n makeStyles,\n} from \"@material-ui/core\";\nimport AddIcon from \"@material-ui/icons/Add\";\nimport DeleteIcon from \"@material-ui/icons/Delete\";\nimport EditIcon from \"@material-ui/icons/Edit\";\nimport VpnKeyIcon from \"@material-ui/icons/VpnKey\";\nimport LockIcon from \"@material-ui/icons/Lock\";\nimport { FilterPanel, FilterSection, FilterState } from \"../FilterPanel\";\nimport {\n Header,\n Page,\n Content,\n SupportButton,\n ResponseErrorPanel,\n Link,\n Table,\n TableColumn,\n} from \"@backstage/core-components\";\nimport useAsync from \"react-use/lib/useAsync\";\nimport {\n useApi,\n configApiRef,\n fetchApiRef,\n alertApiRef,\n identityApiRef,\n} from \"@backstage/core-plugin-api\";\nimport { PermissionGate } from \"../PermissionGate\";\nimport { CreateAPIProductDialog } from \"../CreateAPIProductDialog\";\nimport {\n kuadrantApiProductCreatePermission,\n kuadrantApiProductDeleteOwnPermission,\n kuadrantApiProductDeleteAllPermission,\n kuadrantApiProductUpdateOwnPermission,\n kuadrantApiProductUpdateAllPermission,\n kuadrantApiProductListPermission,\n kuadrantPlanPolicyListPermission,\n} from \"../../permissions\";\nimport { useKuadrantPermission } from \"../../utils/permissions\";\nimport { handleFetchError } from \"../../utils/errors\";\nimport { EditAPIProductDialog } from \"../EditAPIProductDialog\";\nimport { ConfirmDeleteDialog } from \"../ConfirmDeleteDialog\";\nimport emptyStateIllustration from \"../../assets/empty-state-illustration.png\";\n\ntype KuadrantResource = {\n metadata: {\n name: string;\n namespace: string;\n creationTimestamp: string;\n annotations?: Record<string, string>;\n };\n spec?: any;\n status?: any;\n};\n\ntype KuadrantList = {\n items: KuadrantResource[];\n};\n\nconst useStyles = makeStyles((theme) => ({\n container: {\n display: \"flex\",\n height: \"100%\",\n minHeight: 400,\n },\n tableContainer: {\n flex: 1,\n overflow: \"auto\",\n padding: 10,\n },\n emptyState: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: theme.spacing(6),\n minHeight: 400,\n },\n emptyStateContent: {\n display: \"flex\",\n alignItems: \"center\",\n gap: theme.spacing(6),\n maxWidth: 900,\n },\n emptyStateText: {\n flex: 1,\n },\n emptyStateTitle: {\n marginBottom: theme.spacing(2),\n },\n emptyStateDescription: {\n marginBottom: theme.spacing(3),\n color: theme.palette.text.secondary,\n },\n emptyStateImage: {\n maxWidth: 400,\n height: \"auto\",\n },\n}));\n\nconst ResourceList = () => {\n const classes = useStyles();\n const config = useApi(configApiRef);\n const fetchApi = useApi(fetchApiRef);\n const alertApi = useApi(alertApiRef);\n const identityApi = useApi(identityApiRef);\n const backendUrl = config.getString(\"backend.baseUrl\");\n const [userEntityRef, setUserEntityRef] = useState<string>(\"\");\n const [createDialogOpen, setCreateDialogOpen] = useState(false);\n const [editDialogOpen, setEditDialogOpen] = useState(false);\n const [refreshTrigger, setRefreshTrigger] = useState(0);\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);\n const [apiProductToDelete, setApiProductToDelete] = useState<{\n namespace: string;\n name: string;\n } | null>(null);\n const [apiProductToEdit, setApiProductToEdit] = useState<{\n namespace: string;\n name: string;\n } | null>(null);\n const [deleting, setDeleting] = useState(false);\n const [deleteStats, setDeleteStats] = useState<{\n requests: number;\n secrets: number;\n } | null>(null);\n const [filters, setFilters] = useState<FilterState>({\n status: [],\n policy: [],\n route: [],\n namespace: [],\n tags: [],\n authentication: [],\n });\n\n const {\n allowed: canCreateApiProduct,\n loading: createPermissionLoading,\n error: createPermissionError,\n } = useKuadrantPermission(kuadrantApiProductCreatePermission);\n\n const {\n allowed: canDeleteOwnApiProduct,\n loading: deleteOwnPermissionLoading,\n } = useKuadrantPermission(kuadrantApiProductDeleteOwnPermission);\n\n const {\n allowed: canDeleteAllApiProducts,\n loading: deleteAllPermissionLoading,\n error: deletePermissionError,\n } = useKuadrantPermission(kuadrantApiProductDeleteAllPermission);\n\n const { allowed: canUpdateOwnApiProduct } = useKuadrantPermission(\n kuadrantApiProductUpdateOwnPermission,\n );\n\n const { allowed: canUpdateAllApiProducts } = useKuadrantPermission(\n kuadrantApiProductUpdateAllPermission,\n );\n\n const deletePermissionLoading =\n deleteOwnPermissionLoading || deleteAllPermissionLoading;\n\n const {\n allowed: canListPlanPolicies,\n loading: planPolicyPermissionLoading,\n error: planPolicyPermissionError,\n } = useKuadrantPermission(kuadrantPlanPolicyListPermission);\n\n useAsync(async () => {\n const identity = await identityApi.getBackstageIdentity();\n setUserEntityRef(identity.userEntityRef);\n }, [identityApi]);\n\n const {\n value: apiProducts,\n loading: apiProductsLoading,\n error: apiProductsError,\n } = useAsync(async (): Promise<KuadrantList> => {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/apiproducts`,\n );\n if (!response.ok) {\n const error = await handleFetchError(response);\n throw new Error(`failed to fetch APIProducts. ${error}`);\n }\n return await response.json();\n }, [backendUrl, fetchApi, refreshTrigger]);\n\n const {\n value: planPolicies,\n loading: planPoliciesLoading,\n error: planPoliciesError,\n } = useAsync(async (): Promise<KuadrantList> => {\n // skip fetch if user doesn't have permission\n if (!canListPlanPolicies) {\n return { items: [] };\n }\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/planpolicies`,\n );\n if (!response.ok) {\n const error = await handleFetchError(response);\n throw new Error(`failed to fetch PlanPolicies: ${error}`);\n }\n return await response.json();\n }, [backendUrl, fetchApi, refreshTrigger, canListPlanPolicies]);\n\n // helper to find policy for a given route\n const getPolicyForProduct = useCallback((product: KuadrantResource): string | null => {\n if (!planPolicies?.items) return null;\n const targetRef = product.spec?.targetRef;\n if (!targetRef) return null;\n\n const policy = planPolicies.items.find((pp: KuadrantResource) => {\n const ref = (pp as any).targetRef;\n return (\n ref?.kind === \"HTTPRoute\" &&\n ref?.name === targetRef.name &&\n (!ref?.namespace || ref?.namespace === (targetRef.namespace || product.metadata.namespace))\n );\n });\n return policy?.metadata.name || null;\n }, [planPolicies]);\n\n // helper to get auth schemes for a product\n const getAuthSchemes = useCallback((product: KuadrantResource): string[] => {\n const authSchemes = product.status?.discoveredAuthScheme?.authentication || {};\n const schemeObjects = Object.values(authSchemes);\n const schemes: string[] = [];\n\n if (schemeObjects.some((scheme: any) => scheme.hasOwnProperty(\"apiKey\"))) {\n schemes.push(\"API Key\");\n }\n if (schemeObjects.some((scheme: any) => scheme.hasOwnProperty(\"jwt\"))) {\n schemes.push(\"OIDC\");\n }\n if (schemes.length === 0) {\n schemes.push(\"Unknown\");\n }\n return schemes;\n }, []);\n\n const loading =\n apiProductsLoading ||\n planPoliciesLoading ||\n createPermissionLoading ||\n deletePermissionLoading ||\n planPolicyPermissionLoading;\n const error = apiProductsError || planPoliciesError;\n const permissionError =\n createPermissionError || deletePermissionError || planPolicyPermissionError;\n\n const allProducts = useMemo(() => {\n return apiProducts?.items || [];\n }, [apiProducts]);\n\n const filterSections: FilterSection[] = useMemo(() => {\n const statusCounts = { Draft: 0, Published: 0 };\n const policyCounts = new Map<string, number>();\n const routeCounts = new Map<string, number>();\n const namespaceCounts = new Map<string, number>();\n const tagCounts = new Map<string, number>();\n const authCounts = new Map<string, number>();\n\n allProducts.forEach((p: KuadrantResource) => {\n const status = p.spec?.publishStatus || \"Draft\";\n statusCounts[status as keyof typeof statusCounts]++;\n\n const policy = getPolicyForProduct(p) || \"N/A\";\n policyCounts.set(policy, (policyCounts.get(policy) || 0) + 1);\n\n const route = p.spec?.targetRef?.name || \"unknown\";\n routeCounts.set(route, (routeCounts.get(route) || 0) + 1);\n\n const ns = p.metadata.namespace;\n namespaceCounts.set(ns, (namespaceCounts.get(ns) || 0) + 1);\n\n const tags = p.spec?.tags || [];\n tags.forEach((tag: string) => {\n tagCounts.set(tag, (tagCounts.get(tag) || 0) + 1);\n });\n\n const authSchemes = getAuthSchemes(p);\n authSchemes.forEach((scheme: string) => {\n authCounts.set(scheme, (authCounts.get(scheme) || 0) + 1);\n });\n });\n\n const sections: FilterSection[] = [\n {\n id: \"status\",\n title: \"Status\",\n options: [\n { value: \"Draft\", label: \"Draft\", count: statusCounts.Draft },\n { value: \"Published\", label: \"Published\", count: statusCounts.Published },\n ],\n },\n {\n id: \"authentication\",\n title: \"Authentication\",\n options: Array.from(authCounts.entries()).map(([scheme, count]) => ({\n value: scheme,\n label: scheme,\n count,\n })),\n },\n {\n id: \"route\",\n title: \"Route\",\n options: Array.from(routeCounts.entries()).map(([name, count]) => ({\n value: name,\n label: name,\n count,\n })),\n collapsed: routeCounts.size > 5,\n },\n {\n id: \"namespace\",\n title: \"Namespace\",\n options: Array.from(namespaceCounts.entries()).map(([ns, count]) => ({\n value: ns,\n label: ns,\n count,\n })),\n collapsed: namespaceCounts.size > 5,\n },\n {\n id: \"tags\",\n title: \"Tags\",\n options: Array.from(tagCounts.entries()).map(([tag, count]) => ({\n value: tag,\n label: tag,\n count,\n })),\n collapsed: tagCounts.size > 5,\n },\n ];\n\n // only show policy filter if user can list planpolicies\n if (canListPlanPolicies) {\n sections.splice(2, 0, {\n id: \"policy\",\n title: \"Policy\",\n options: Array.from(policyCounts.entries()).map(([name, count]) => ({\n value: name,\n label: name,\n count,\n })),\n collapsed: policyCounts.size > 5,\n });\n }\n\n return sections;\n }, [allProducts, getPolicyForProduct, getAuthSchemes, canListPlanPolicies]);\n\n const filteredProducts = useMemo(() => {\n return allProducts.filter((p: KuadrantResource) => {\n if (filters.status.length > 0) {\n const status = p.spec?.publishStatus || \"Draft\";\n if (!filters.status.includes(status)) return false;\n }\n\n if (filters.authentication.length > 0) {\n const authSchemes = getAuthSchemes(p);\n if (!filters.authentication.some((a: string) => authSchemes.includes(a))) return false;\n }\n\n if (filters.policy.length > 0) {\n const policy = getPolicyForProduct(p) || \"N/A\";\n if (!filters.policy.includes(policy)) return false;\n }\n\n if (filters.route.length > 0) {\n const route = p.spec?.targetRef?.name || \"unknown\";\n if (!filters.route.includes(route)) return false;\n }\n\n if (filters.namespace.length > 0) {\n if (!filters.namespace.includes(p.metadata.namespace)) return false;\n }\n\n if (filters.tags.length > 0) {\n const tags = p.spec?.tags || [];\n if (!filters.tags.some((t: string) => tags.includes(t))) return false;\n }\n\n return true;\n });\n }, [allProducts, filters, getPolicyForProduct, getAuthSchemes]);\n\n const handleCreateSuccess = (productInfo: { namespace: string; name: string; displayName: string }) => {\n setRefreshTrigger((prev) => prev + 1);\n alertApi.post({\n message: `\"${productInfo.displayName}\" created successfully`,\n severity: \"success\",\n display: \"transient\",\n });\n };\n\n const handleEditClick = (namespace: string, name: string) => {\n setApiProductToEdit({ namespace, name });\n setEditDialogOpen(true);\n };\n\n const handleEditSuccess = () => {\n setRefreshTrigger((prev) => prev + 1);\n const productName = apiProductToEdit?.name || \"API Product\";\n alertApi.post({\n message: `\"${productName}\" updated successfully`,\n severity: \"success\",\n display: \"transient\",\n });\n };\n\n const handleDeleteClick = async (namespace: string, name: string) => {\n setApiProductToDelete({ namespace, name });\n setDeleteStats(null);\n\n try {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/requests?namespace=${namespace}`,\n );\n\n if (!response.ok) {\n const error = await handleFetchError(response);\n throw new Error(error);\n }\n\n const data = await response.json();\n const related = (data.items || []).filter(\n (r: any) =>\n r.spec.apiName === name && r.spec.apiNamespace === namespace,\n );\n const approved = related.filter(\n (r: any) => r.status?.phase === \"Approved\",\n ).length;\n setDeleteStats({ requests: related.length, secrets: approved });\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to delete access request: ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\n } finally {\n setDeleteDialogOpen(true);\n }\n\n };\n\n const handleDeleteConfirm = async () => {\n if (!apiProductToDelete) return;\n\n setDeleting(true);\n try {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/apiproducts/${apiProductToDelete.namespace}/${apiProductToDelete.name}`,\n { method: \"DELETE\" },\n );\n\n if (!response.ok) {\n const error = await handleFetchError(response);\n throw new Error(error);\n }\n\n const deletedName = apiProductToDelete?.name || \"API Product\";\n setRefreshTrigger((prev) => prev + 1);\n alertApi.post({\n message: `\"${deletedName}\" deleted successfully`,\n severity: \"success\",\n display: \"transient\",\n });\n } catch (err) {\n const errorMessage =\n 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 setDeleteDialogOpen(false);\n setApiProductToDelete(null);\n }\n };\n\n const handleDeleteCancel = () => {\n setDeleteDialogOpen(false);\n setApiProductToDelete(null);\n };\n\n const handlePublishToggle = async (row: any) => {\n const namespace = row.metadata.namespace;\n const name = row.metadata.name;\n const displayName = row.spec?.displayName || name;\n const currentStatus = row.spec?.publishStatus || \"Draft\";\n const newStatus = currentStatus === \"Published\" ? \"Draft\" : \"Published\";\n\n try {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/apiproducts/${namespace}/${name}`,\n {\n method: \"PATCH\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n spec: { publishStatus: newStatus },\n }),\n },\n );\n\n if (!response.ok) {\n const error = await handleFetchError(response);\n throw new Error(error);\n }\n\n setRefreshTrigger((prev) => prev + 1);\n alertApi.post({\n message: `\"${displayName}\" ${newStatus === \"Published\" ? \"published\" : \"unpublished\"} successfully`,\n severity: \"success\",\n display: \"transient\",\n });\n } catch (err) {\n const errorMessage =\n 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 columns: TableColumn[] = [\n {\n title: \"Name\",\n field: \"spec.displayName\",\n render: (row: any) => {\n const displayName = row.spec?.displayName ?? row.metadata.name;\n return (\n <Link to={`/kuadrant/api-products/${row.metadata.namespace}/${row.metadata.name}`}>\n <strong>{displayName}</strong>\n </Link>\n );\n },\n customFilterAndSearch: (term, row: any) => {\n const displayName = row.spec?.displayName || row.metadata.name || \"\";\n return displayName.toLowerCase().includes(term.toLowerCase());\n },\n },\n {\n title: \"Version\",\n field: \"spec.version\",\n render: (row: any) => row.spec?.version || \"-\",\n },\n {\n title: \"Route\",\n field: \"spec.targetRef.name\",\n render: (row: any) => row.spec?.targetRef?.name || \"-\",\n },\n // only show policy column if user can list planpolicies\n ...(canListPlanPolicies\n ? [\n {\n title: \"Policy\",\n field: \"policy\",\n render: (row: any) => getPolicyForProduct(row) || \"N/A\",\n },\n ]\n : []),\n {\n title: \"Tags\",\n field: \"spec.tags\",\n render: (row: any) => {\n const tags = row.spec?.tags || [];\n if (tags.length === 0) return \"-\";\n return (\n <Box display=\"flex\" style={{ gap: 4, flexWrap: \"wrap\" }}>\n {tags.map((tag: string) => (\n <Chip key={tag} label={tag} size=\"small\" variant=\"outlined\" />\n ))}\n </Box>\n );\n },\n },\n {\n title: \"Status\",\n field: \"spec.publishStatus\",\n render: (row: any) => {\n const status = row.spec?.publishStatus || \"Draft\";\n return (\n <Chip\n label={status}\n size=\"small\"\n color={status === \"Published\" ? \"primary\" : \"default\"}\n />\n );\n },\n },\n {\n title: \"Authentication\",\n field: \"status.discoveredAuthScheme\",\n render: (row: any) => {\n const authSchemes =\n row.status?.discoveredAuthScheme?.authentication || {};\n const schemeObjects = Object.values(authSchemes);\n\n const hasApiKey = schemeObjects.some((scheme: any) =>\n scheme.hasOwnProperty(\"apiKey\"),\n );\n const hasJwt = schemeObjects.some((scheme: any) =>\n scheme.hasOwnProperty(\"jwt\"),\n );\n\n if (!hasApiKey && !hasJwt) {\n return (\n <Typography variant=\"body2\" style={{ fontStyle: \"italic\" }}>\n unknown\n </Typography>\n );\n }\n\n return (\n <Box display=\"flex\" style={{ gap: 4 }}>\n {hasApiKey && (\n <Chip\n icon={<VpnKeyIcon />}\n label=\"API Key\"\n size=\"small\"\n color=\"primary\"\n />\n )}\n {hasJwt && (\n <Chip\n icon={<LockIcon />}\n label=\"OIDC\"\n size=\"small\"\n color=\"secondary\"\n />\n )}\n </Box>\n );\n },\n },\n {\n title: \"Namespace\",\n field: \"metadata.namespace\",\n },\n {\n title: \"Actions\",\n field: \"actions\",\n filtering: false,\n render: (row: any) => {\n const owner = row.metadata?.annotations?.[\"backstage.io/owner\"];\n const isOwner = owner === userEntityRef;\n const canEdit =\n canUpdateAllApiProducts || (canUpdateOwnApiProduct && isOwner);\n const canDelete =\n canDeleteAllApiProducts || (canDeleteOwnApiProduct && isOwner);\n const isPublished = row.spec?.publishStatus === \"Published\";\n\n return (\n <Box display=\"flex\" alignItems=\"center\" style={{ gap: 4 }}>\n {canEdit && (\n <Button\n size=\"small\"\n color=\"primary\"\n onClick={() => handlePublishToggle(row)}\n style={{ marginRight: 4, textTransform: \"none\" }}\n >\n {isPublished ? \"Unpublish\" : \"Publish\"}\n </Button>\n )}\n {canEdit && (\n <IconButton\n size=\"small\"\n onClick={() =>\n handleEditClick(row.metadata.namespace, row.metadata.name)\n }\n title=\"Edit API Product\"\n >\n <EditIcon fontSize=\"small\" />\n </IconButton>\n )}\n {canDelete && (\n <IconButton\n size=\"small\"\n onClick={() =>\n handleDeleteClick(row.metadata.namespace, row.metadata.name)\n }\n title=\"Delete API Product\"\n >\n <DeleteIcon fontSize=\"small\" />\n </IconButton>\n )}\n </Box>\n );\n },\n },\n ];\n\n return (\n <Page themeId=\"tool\">\n <Header\n title=\"API Products\"\n subtitle=\"Manage API products for Kubernetes\"\n >\n <SupportButton>Manage API products and plan policies</SupportButton>\n </Header>\n <Content>\n {loading && (\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"center\"\n justifyContent=\"center\"\n minHeight={300}\n >\n <CircularProgress />\n <Typography variant=\"h6\" style={{ marginTop: 16 }}>\n Loading data...\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Preparing your data... This should only take a moment.\n </Typography>\n </Box>\n )}\n {error && <ResponseErrorPanel error={error} />}\n {permissionError && (\n <Box p={2}>\n <Typography color=\"error\">\n unable to check permissions: {permissionError.message}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n permission:{\" \"}\n {createPermissionError\n ? \"kuadrant.apiproduct.create\"\n : deletePermissionError\n ? \"kuadrant.apiproduct.delete\"\n : planPolicyPermissionError\n ? \"kuadrant.planpolicy.list\"\n : \"unknown\"}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n please try again or contact your administrator\n </Typography>\n </Box>\n )}\n {!loading && !error && !permissionError && allProducts.length === 0 && (\n <Box className={classes.emptyState}>\n <Box className={classes.emptyStateContent}>\n <Box className={classes.emptyStateText}>\n <Typography variant=\"h4\" className={classes.emptyStateTitle}>\n API Product\n </Typography>\n <Typography\n variant=\"body1\"\n className={classes.emptyStateDescription}\n >\n Create API product by registering existing API, associate\n route and policy\n </Typography>\n {canCreateApiProduct && (\n <Button\n variant=\"contained\"\n color=\"primary\"\n startIcon={<AddIcon />}\n onClick={() => setCreateDialogOpen(true)}\n >\n Create API Product\n </Button>\n )}\n </Box>\n <img\n src={emptyStateIllustration}\n alt=\"API Product illustration\"\n className={classes.emptyStateImage}\n />\n </Box>\n </Box>\n )}\n {!loading && !error && !permissionError && allProducts.length > 0 && (\n <Box className={classes.container}>\n <FilterPanel\n sections={filterSections}\n filters={filters}\n onChange={setFilters}\n />\n <Box className={classes.tableContainer}>\n <Box display=\"flex\" justifyContent=\"flex-end\" mb={2}>\n {canCreateApiProduct && (\n <Button\n variant=\"contained\"\n color=\"primary\"\n size=\"small\"\n startIcon={<AddIcon />}\n onClick={() => setCreateDialogOpen(true)}\n >\n Create API Product\n </Button>\n )}\n </Box>\n {filteredProducts.length === 0 ? (\n <Box p={4} textAlign=\"center\">\n <Typography variant=\"body1\" color=\"textSecondary\">\n No API products match the selected filters.\n </Typography>\n </Box>\n ) : (\n <Table\n options={{\n paging: filteredProducts.length > 10,\n pageSize: 20,\n search: true,\n filtering: false,\n debounceInterval: 300,\n toolbar: true,\n emptyRowsWhenPaging: false,\n }}\n columns={columns}\n data={filteredProducts}\n />\n )}\n </Box>\n </Box>\n )}\n <CreateAPIProductDialog\n open={createDialogOpen}\n onClose={() => setCreateDialogOpen(false)}\n onSuccess={handleCreateSuccess}\n />\n <EditAPIProductDialog\n open={editDialogOpen}\n onClose={() => setEditDialogOpen(false)}\n onSuccess={handleEditSuccess}\n namespace={apiProductToEdit?.namespace || \"\"}\n name={apiProductToEdit?.name || \"\"}\n />\n <ConfirmDeleteDialog\n open={deleteDialogOpen}\n title=\"Delete API Product\"\n description={\n deleteStats\n ? `Deleting \"${apiProductToDelete?.name}\" will also remove:\n\n• ${deleteStats.requests} API Key(s)\n• ${deleteStats.secrets} API Key Secret(s)\n\nThis action cannot be undone.`\n : `Deleting \"${apiProductToDelete?.name}\" will also remove all associated API Keys and Secrets.\nThis action cannot be undone.`\n }\n confirmText={apiProductToDelete?.name}\n severity=\"high\"\n deleting={deleting}\n onConfirm={handleDeleteConfirm}\n onCancel={handleDeleteCancel}\n />\n </Content>\n </Page>\n );\n};\n\nexport const ApiProductsPage = () => {\n return (\n <PermissionGate\n permission={kuadrantApiProductListPermission}\n errorMessage=\"you don't have permission to view the Kuadrant page\"\n >\n <ResourceList />\n </PermissionGate>\n );\n};\n"],"names":["useStyles","makeStyles","theme","root","width","minWidth","padding","spacing","borderRight","palette","divider","backgroundColor","background","paper","height","overflowY","sectionTitle","fontWeight","fontSize","textTransform","letterSpacing","color","text","secondary","marginBottom","display","alignItems","justifyContent","cursor","userSelect","filterSection","checkbox","checkboxLabel","clearButton","marginTop","count","marginLeft","FilterPanel","sections","filters","onChange","onClear","classes","collapsedSections","setCollapsedSections","React","Set","filter","s","collapsed","map","id","hasActiveFilters","Object","values","some","length","Box","className","mb","Typography","variant","Button","size","onClick","clearedFilters","forEach","section","Divider","isCollapsed","has","selectedCount","mt","toggleSection","sectionId","prev","next","delete","add","span","title","ExpandMoreIcon","ExpandLessIcon","Collapse","in","FormGroup","options","option","FormControlLabel","control","Checkbox","checked","includes","value","currentValues","newValues","v","handleCheckboxChange","label","undefined","PermissionGate","children","permission","fallback","errorMessage","allowed","loading","error","useKuadrantPermission","Progress","p","message","name","asterisk","sectionHeader","gap","infoIcon","tagChip","marginRight","CreateAPIProductDialog","open","onClose","onSuccess","config","useApi","configApiRef","fetchApi","fetchApiRef","backendUrl","getString","setName","useState","displayName","setDisplayName","description","setDescription","version","setVersion","approvalMode","setApprovalMode","publishStatus","setPublishStatus","tags","setTags","tagInput","setTagInput","selectedHTTPRoute","setSelectedHTTPRoute","contactEmail","setContactEmail","contactTeam","setContactTeam","docsURL","setDocsURL","openAPISpec","setOpenAPISpec","setError","creating","setCreating","httpRoutesRetry","setHttpRoutesRetry","nameError","setNameError","openAPISpecError","setOpenAPISpecError","httpRoutes","httpRoutesLoading","httpRoutesError","useAsync","async","response","fetch","ok","handleFetchError","Error","json","items","planPolicies","planPoliciesError","getPlanPolicyForRoute","routeNamespace","routeName","find","pp","ref","targetRef","kind","namespace","selectedRouteInfo","split","selectedPolicy","useEffect","handleAddTag","trim","handleClose","hasValidationErrors","Dialog","maxWidth","fullWidth","DialogTitle","DialogContent","Alert","severity","style","strong","Grid","container","item","xs","TextField","e","target","placeholder","helperText","margin","required","disabled","InputLabelProps","handleNameChange","validateKubernetesName","onKeyPress","key","preventDefault","InputProps","endAdornment","InputAdornment","position","IconButton","AddIcon","flexWrap","tag","Chip","onDelete","handleDeleteTag","tagToDelete","multiline","rows","Tooltip","InfoOutlinedIcon","handleOpenAPISpecChange","validateURL","select","SelectProps","MenuItem","route","routeNs","metadata","policyInfo","policy","spec","plans","tiers","entries","plan","limit","limits","requests","period","join","formatTierInfo","getPolicyInfoForRoute","PlanPolicyDetails","alertSeverity","alertMessage","includeTopMargin","FormControl","component","RadioGroup","row","Radio","DialogActions","selectedRouteNamespace","selectedRouteName","apiProduct","apiVersion","group","contact","email","team","documentation","openAPISpecURL","method","headers","body","JSON","stringify","err","String","startIcon","CircularProgress","minHeight","tableContainer","flex","overflow","emptyState","emptyStateContent","emptyStateText","emptyStateTitle","emptyStateDescription","emptyStateImage","ResourceList","alertApi","alertApiRef","identityApi","identityApiRef","userEntityRef","setUserEntityRef","createDialogOpen","setCreateDialogOpen","editDialogOpen","setEditDialogOpen","refreshTrigger","setRefreshTrigger","deleteDialogOpen","setDeleteDialogOpen","apiProductToDelete","setApiProductToDelete","apiProductToEdit","setApiProductToEdit","deleting","setDeleting","deleteStats","setDeleteStats","setFilters","status","authentication","canCreateApiProduct","createPermissionLoading","createPermissionError","kuadrantApiProductCreatePermission","canDeleteOwnApiProduct","deleteOwnPermissionLoading","kuadrantApiProductDeleteOwnPermission","canDeleteAllApiProducts","deleteAllPermissionLoading","deletePermissionError","kuadrantApiProductDeleteAllPermission","canUpdateOwnApiProduct","kuadrantApiProductUpdateOwnPermission","canUpdateAllApiProducts","kuadrantApiProductUpdateAllPermission","deletePermissionLoading","canListPlanPolicies","planPolicyPermissionLoading","planPolicyPermissionError","kuadrantPlanPolicyListPermission","identity","getBackstageIdentity","apiProducts","apiProductsLoading","apiProductsError","planPoliciesLoading","getPolicyForProduct","useCallback","product","getAuthSchemes","authSchemes","discoveredAuthScheme","schemeObjects","schemes","scheme","hasOwnProperty","push","permissionError","allProducts","useMemo","filterSections","statusCounts","Draft","Published","policyCounts","Map","routeCounts","namespaceCounts","tagCounts","authCounts","set","get","ns","Array","from","splice","filteredProducts","a","t","columns","field","render","Link","to","customFilterAndSearch","term","toLowerCase","hasApiKey","hasJwt","icon","VpnKeyIcon","LockIcon","fontStyle","filtering","isOwner","annotations","canEdit","canDelete","isPublished","newStatus","post","handlePublishToggle","handleEditClick","EditIcon","related","r","apiName","apiNamespace","approved","phase","secrets","handleDeleteClick","DeleteIcon","Page","themeId","Header","subtitle","SupportButton","Content","flexDirection","ResponseErrorPanel","img","src","emptyStateIllustration","alt","textAlign","Table","paging","pageSize","search","debounceInterval","toolbar","emptyRowsWhenPaging","data","productInfo","EditAPIProductDialog","productName","ConfirmDeleteDialog","confirmText","onConfirm","deletedName","onCancel","ApiProductsPage","kuadrantApiProductListPermission"],"sourceRoot":""}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[2967],{32269:(e,a,t)=>{var n=t(4293),r=t(78920);a.A=void 0;var i=r(t(95478)),s=(0,n(t(74044)).default)(i.createElement("path",{d:"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z"}),"Visibility");a.A=s},35015:(e,a,t)=>{t.d(a,{A:()=>s});var n=t(95478),r=t(85608),i=t(71581);function s(e,a){void 0===a&&(a=[]);var t=function(e,a,t){void 0===a&&(a=[]),void 0===t&&(t={loading:!1});var s=(0,n.useRef)(0),l=(0,i.A)(),o=(0,n.useState)(t),c=o[0],d=o[1],h=(0,n.useCallback)(function(){for(var a=[],t=0;t<arguments.length;t++)a[t]=arguments[t];var n=++s.current;return c.loading||d(function(e){return(0,r.__assign)((0,r.__assign)({},e),{loading:!0})}),e.apply(void 0,a).then(function(e){return l()&&n===s.current&&d({value:e,loading:!1}),e},function(e){return l()&&n===s.current&&d({error:e,loading:!1}),e})},a);return[c,h]}(e,a,{loading:!0}),s=t[0],l=t[1];return(0,n.useEffect)(function(){l()},[l]),s}},46299:(e,a,t)=>{t.d(a,{S:()=>n});const n=e=>{const a={border:"none"};switch(e){case"Approved":return{...a,backgroundColor:"#4caf50",color:"#fff"};case"Rejected":return{...a,backgroundColor:"#f44336",color:"#fff"};default:return{...a,backgroundColor:"#ff9800",color:"#fff"}}}},52235:(e,a,t)=>{var n=t(4293),r=t(78920);a.A=void 0;var i=r(t(95478)),s=(0,n(t(74044)).default)(i.createElement("path",{d:"M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z"}),"ArrowForward");a.A=s},55735:(e,a,t)=>{var n=t(4293),r=t(78920);a.A=void 0;var i=r(t(95478)),s=(0,n(t(74044)).default)(i.createElement("path",{d:"M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z"}),"ArrowBack");a.A=s},61524:(e,a,t)=>{var n=t(4293),r=t(78920);a.A=void 0;var i=r(t(95478)),s=(0,n(t(74044)).default)(i.createElement("path",{d:"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78l3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z"}),"VisibilityOff");a.A=s},72967:(e,a,t)=>{t.r(a),t.d(a,{ApiKeyDetailPage:()=>H});var n=t(31085),r=t(95478),i=t(49634),s=t(22097),l=t(35015),o=t(86687),c=t(42367),d=t(289),h=t(15831),p=t(37725),u=t(46681),m=t(94641),x=t(96040),A=t(58837),v=t(10394),y=t(71677),f=t(29365),j=t(64947),g=t(72501),b=t(42899),k=t(67720),C=t(31653),w=t(38605),P=t(76891),S=t(61477),N=t(46805),I=t(93453),B=t(32269),R=t(61524),z=t(99594),T=t(77225),$=t(55735),_=t(39330),L=t(85121),E=t(46299);const K=(0,A.A)(e=>({label:{fontWeight:600,color:e.palette.text.secondary,marginBottom:e.spacing(.5)},value:{marginBottom:e.spacing(2)},codeBlock:{backgroundColor:e.palette.background.default,padding:e.spacing(2),borderRadius:e.shape.borderRadius,fontFamily:"monospace",fontSize:"0.875rem",overflow:"auto",whiteSpace:"pre-wrap",wordBreak:"break-all"},apiKeyContainer:{display:"flex",alignItems:"center",gap:e.spacing(1),padding:e.spacing(1.5),backgroundColor:e.palette.background.default,borderRadius:e.shape.borderRadius,fontFamily:"monospace"},tabPanel:{marginTop:e.spacing(2)}})),D=({code:e,onCopy:a})=>{const t=K();return(0,n.jsxs)(v.A,{position:"relative",children:[(0,n.jsx)(v.A,{className:t.codeBlock,children:e}),(0,n.jsx)(y.Ay,{title:"Copy code",children:(0,n.jsx)(f.A,{size:"small",style:{position:"absolute",top:8,right:8},onClick:a,children:(0,n.jsx)(z.A,{fontSize:"small"})})})]})},H=()=>{var e,a,t,A,H,M,W,q,F,V;const U=K(),{namespace:O,name:G}=(0,i.useParams)(),Y=(0,s.useApi)(s.configApiRef),J=(0,s.useApi)(s.fetchApiRef),Q=(0,s.useApi)(s.alertApiRef),X=Y.getString("backend.baseUrl"),[Z,ee]=(0,r.useState)(0),[ae,te]=(0,r.useState)(!1),[ne,re]=(0,r.useState)(null),[ie,se]=(0,r.useState)(!1),[le,oe]=(0,r.useState)(!1),[ce,de]=(0,r.useState)(!1),{value:he,loading:pe,error:ue}=(0,l.A)(async()=>{var e;const[a,t]=await Promise.all([J.fetch(`${X}/api/kuadrant/apikeys/${O}/${G}`),J.fetch(`${X}/api/kuadrant/apiproducts`)]);if(!a.ok)throw new Error("Failed to fetch API key");const n=await a.json();let r;return!1===(null===(e=n.status)||void 0===e?void 0:e.canReadSecret)&&oe(!0),t.ok&&(r=((await t.json()).items||[]).find(e=>{var a;return e.metadata.name===(null===(a=n.spec.apiProductRef)||void 0===a?void 0:a.name)&&e.metadata.namespace===n.metadata.namespace})),{apiKey:n,apiProduct:r}},[O,G,X,J]),me=null==he?void 0:he.apiKey,xe=null==he?void 0:he.apiProduct,Ae=async e=>{await navigator.clipboard.writeText(e),Q.post({message:"Copied to clipboard",severity:"success",display:"transient"})};if(pe)return(0,n.jsx)(o.k,{});if(ue||!me)return(0,n.jsx)(c._,{error:ue||new Error("API key not found")});const ve=(null===(e=me.status)||void 0===e?void 0:e.phase)||"Pending",ye="Approved"===ve?"Active":ve,fe=(null===(a=me.status)||void 0===a?void 0:a.apiHostname)||"api.example.com",je=ne||"<your-api-key>",ge=[{label:"cURL",code:`curl -H "Authorization: Bearer ${je}" \\\n https://${fe}/`},{label:"Node.js",code:`const response = await fetch('https://${fe}/', {\n headers: {\n 'Authorization': 'Bearer ${je}'\n }\n});\nconst data = await response.json();`},{label:"Python",code:`import requests\n\nresponse = requests.get(\n 'https://${fe}/',\n headers={'Authorization': 'Bearer ${je}'}\n)\ndata = response.json()`},{label:"Go",code:`package main\n\nimport (\n "net/http"\n)\n\nfunc main() {\n client := &http.Client{}\n req, _ := http.NewRequest("GET", "https://${fe}/", nil)\n req.Header.Set("Authorization", "Bearer ${je}")\n resp, _ := client.Do(req)\n defer resp.Body.Close()\n}`}];return(0,n.jsxs)(d.Y,{themeId:"tool",children:[(0,n.jsx)(h.Y,{title:me.metadata.name,subtitle:`API Key for ${(null===(t=me.spec.apiProductRef)||void 0===t?void 0:t.name)||"unknown"}`,children:(0,n.jsx)(p.N_,{to:"/kuadrant/api-keys",children:(0,n.jsx)(j.A,{startIcon:(0,n.jsx)($.A,{}),children:"Back to API Keys"})})}),(0,n.jsxs)(u.U,{children:[(0,n.jsx)(v.A,{mb:2,children:(0,n.jsxs)(m.B,{"aria-label":"breadcrumb",children:[(0,n.jsx)(p.N_,{to:"/kuadrant/api-keys",children:"API keys"}),(0,n.jsx)(g.A,{children:me.metadata.name})]})}),(0,n.jsxs)(v.A,{mb:3,display:"flex",style:{gap:8},children:[(0,n.jsx)(p.N_,{to:`/catalog/default/api/${null===(A=me.spec.apiProductRef)||void 0===A?void 0:A.name}`,children:(0,n.jsx)(j.A,{variant:"outlined",startIcon:(0,n.jsx)(_.A,{}),"data-testid":"view-api-button",children:"View API"})}),(null==xe||null===(H=xe.spec)||void 0===H?void 0:H.contact)&&(xe.spec.contact.email||xe.spec.contact.url||xe.spec.contact.slack)&&(0,n.jsx)(j.A,{variant:"outlined",startIcon:(0,n.jsx)(L.A,{}),href:xe.spec.contact.email?`mailto:${xe.spec.contact.email}`:xe.spec.contact.slack?xe.spec.contact.slack:xe.spec.contact.url||"#",target:"_blank",rel:"noopener noreferrer",children:"Contact Owner"})]}),(0,n.jsxs)(b.A,{container:!0,spacing:3,children:[(0,n.jsx)(b.A,{item:!0,xs:12,md:6,children:(0,n.jsx)(x.n,{title:"API Key Details",children:(0,n.jsxs)(v.A,{children:[(0,n.jsx)(g.A,{variant:"caption",className:U.label,children:"Status"}),(0,n.jsx)(v.A,{className:U.value,children:(0,n.jsx)(k.A,{label:ye,size:"small",style:(0,E.S)(ve),"data-testid":"api-key-status-chip"})}),(0,n.jsx)(g.A,{variant:"caption",className:U.label,children:"API Product"}),(0,n.jsx)(g.A,{variant:"body1",className:U.value,children:(0,n.jsx)(p.N_,{to:`/catalog/default/api/${null===(M=me.spec.apiProductRef)||void 0===M?void 0:M.name}/api-keys`,children:(null===(W=me.spec.apiProductRef)||void 0===W?void 0:W.name)||"unknown"})}),(0,n.jsx)(g.A,{variant:"caption",className:U.label,children:"Tier"}),(0,n.jsx)(v.A,{className:U.value,children:(0,n.jsx)(k.A,{label:me.spec.planTier,size:"small",variant:"outlined"})}),(0,n.jsx)(g.A,{variant:"caption",className:U.label,children:"Requester"}),(0,n.jsx)(g.A,{variant:"body1",className:U.value,children:null===(q=me.spec.requestedBy)||void 0===q?void 0:q.userId}),(0,n.jsx)(g.A,{variant:"caption",className:U.label,children:"Requested"}),(0,n.jsx)(g.A,{variant:"body1",className:U.value,children:me.metadata.creationTimestamp?new Date(me.metadata.creationTimestamp).toLocaleDateString():"-"}),(null===(F=me.status)||void 0===F?void 0:F.reviewedBy)&&(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(g.A,{variant:"caption",className:U.label,children:"Reviewed By"}),(0,n.jsxs)(g.A,{variant:"body1",className:U.value,children:[me.status.reviewedBy.replace(/^user:default\//,""),me.status.reviewedAt&&(0,n.jsxs)(g.A,{variant:"caption",color:"textSecondary",children:[" ","on"," ",new Date(me.status.reviewedAt).toLocaleDateString()]})]})]})]})})}),(0,n.jsxs)(b.A,{item:!0,xs:12,md:6,children:[(0,n.jsx)(x.n,{title:"Use Case",children:(0,n.jsx)(g.A,{variant:"body1",children:me.spec.useCase||"No use case provided"})}),"Approved"===ve&&(0,n.jsx)(v.A,{mt:2,children:(0,n.jsx)(x.n,{title:"API Key",children:le&&!ne?(0,n.jsx)(y.Ay,{title:"This API key has already been viewed and cannot be retrieved again",children:(0,n.jsxs)(v.A,{display:"flex",alignItems:"center",children:[(0,n.jsx)(g.A,{variant:"body2",color:"textSecondary",children:"Already viewed - cannot be retrieved again"}),(0,n.jsx)(R.A,{fontSize:"small",color:"disabled",style:{marginLeft:8}})]})}):(0,n.jsxs)(v.A,{className:U.apiKeyContainer,children:[(0,n.jsx)(g.A,{variant:"body2",style:{fontFamily:"monospace",flex:1},children:ie?"Loading...":ae&&ne?ne:"•".repeat(32)}),ae&&ne&&(0,n.jsx)(y.Ay,{title:"Copy to clipboard",children:(0,n.jsx)(f.A,{size:"small",onClick:()=>Ae(ne),children:(0,n.jsx)(z.A,{fontSize:"small"})})}),(0,n.jsx)(y.Ay,{title:ae?"Hide API key":"Reveal API key (one-time only)",children:(0,n.jsx)("span",{children:(0,n.jsx)(f.A,{size:"small",onClick:()=>{ae?(te(!1),re(null)):le||de(!0)},disabled:ie||le&&!ne,children:ae?(0,n.jsx)(R.A,{fontSize:"small"}):(0,n.jsx)(B.A,{fontSize:"small"})})})})]})})})]}),"Approved"===ve&&(0,n.jsx)(b.A,{item:!0,xs:12,children:(0,n.jsx)(x.n,{title:"Code Examples",children:(0,n.jsxs)(v.A,{children:[(0,n.jsx)(C.A,{value:Z,onChange:(e,a)=>ee(a),indicatorColor:"primary",textColor:"primary",children:ge.map(e=>(0,n.jsx)(w.A,{label:e.label},e.label))}),(0,n.jsx)(v.A,{className:U.tabPanel,children:(0,n.jsx)(D,{code:ge[Z].code,onCopy:()=>Ae(ge[Z].code)})})]})})}),(null===(V=me.status)||void 0===V?void 0:V.limits)&&(0,n.jsx)(b.A,{item:!0,xs:12,children:(0,n.jsx)(x.n,{title:"Rate Limits",children:(0,n.jsxs)(b.A,{container:!0,spacing:2,children:[me.status.limits.daily&&(0,n.jsxs)(b.A,{item:!0,children:[(0,n.jsx)(g.A,{variant:"caption",className:U.label,children:"Daily"}),(0,n.jsx)(g.A,{variant:"h6",children:me.status.limits.daily.toLocaleString()})]}),me.status.limits.weekly&&(0,n.jsxs)(b.A,{item:!0,children:[(0,n.jsx)(g.A,{variant:"caption",className:U.label,children:"Weekly"}),(0,n.jsx)(g.A,{variant:"h6",children:me.status.limits.weekly.toLocaleString()})]}),me.status.limits.monthly&&(0,n.jsxs)(b.A,{item:!0,children:[(0,n.jsx)(g.A,{variant:"caption",className:U.label,children:"Monthly"}),(0,n.jsx)(g.A,{variant:"h6",children:me.status.limits.monthly.toLocaleString()})]})]})})})]})]}),(0,n.jsxs)(P.A,{open:ce,onClose:()=>de(!1),maxWidth:"sm",children:[(0,n.jsx)(S.A,{children:(0,n.jsxs)(v.A,{display:"flex",alignItems:"center",children:[(0,n.jsx)(T.A,{color:"primary",style:{marginRight:8}}),"View API Key"]})}),(0,n.jsxs)(N.A,{children:[(0,n.jsxs)(g.A,{variant:"body1",paragraph:!0,children:["This API key can only be viewed ",(0,n.jsx)("strong",{children:"once"}),". After you reveal it, you will not be able to retrieve it again."]}),(0,n.jsx)(g.A,{variant:"body2",color:"textSecondary",children:"Make sure to copy and store it securely before closing this view."})]}),(0,n.jsxs)(I.A,{children:[(0,n.jsx)(j.A,{onClick:()=>de(!1),children:"Cancel"}),(0,n.jsx)(j.A,{variant:"contained",color:"primary",onClick:()=>{de(!1),(async()=>{se(!0);try{const e=await J.fetch(`${X}/api/kuadrant/apikeys/${O}/${G}/secret`);if(e.ok){const a=await e.json();re(a.apiKey),oe(!0),te(!0)}else 403===e.status&&(oe(!0),Q.post({message:"This API key has already been viewed and cannot be retrieved again.",severity:"warning",display:"transient"}))}catch(e){console.error("Failed to fetch API key:",e);const a=e instanceof Error?e.message:"unknown error occurred";Q.post({message:`Failed to fetch APIKey. ${a}`,severity:"error",display:"transient"})}finally{se(!1)}})()},children:"Reveal API Key"})]})]})]})}},85121:(e,a,t)=>{var n=t(4293),r=t(78920);a.A=void 0;var i=r(t(95478)),s=(0,n(t(74044)).default)(i.createElement("path",{d:"M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z"}),"Email");a.A=s},96040:(e,a,t)=>{t.d(a,{n:()=>B});var n=t(31085),r=t(40703),i=t(59469),s=t(48653),l=t(45685),o=t(37197),c=t(37976),d=t(53373),h=t.n(d),p=t(10394),u=t(72501),m=t(52235),x=t(37725);const A=(0,c.makeStyles)(e=>({root:{maxWidth:"fit-content",padding:e.spacing(2,2,2,2.5)},boxTitle:{margin:0,color:e.palette.textSubtle},arrow:{color:e.palette.textSubtle}}),{name:"BackstageBottomLink"});function v(e){const{link:a,title:t,onClick:r}=e,i=A();return(0,n.jsxs)(p.A,{children:[(0,n.jsx)(o.A,{}),(0,n.jsx)(x.N_,{to:a,onClick:r,underline:"none",children:(0,n.jsxs)(p.A,{display:"flex",alignItems:"center",className:i.root,children:[(0,n.jsx)(p.A,{className:i.boxTitle,fontWeight:"fontWeightBold",m:1,children:(0,n.jsx)(u.A,{children:(0,n.jsx)("strong",{children:t})})}),(0,n.jsx)(m.A,{className:i.arrow})]})})]})}var y=t(95478),f=t(64947);const j=(0,y.forwardRef)((e,a)=>(0,n.jsx)(x.N_,{ref:a,...e,color:"initial"})),g=(0,y.forwardRef)((e,a)=>(0,n.jsx)(f.A,{ref:a,component:j,...e}));var b=t(56573),k=t(21006),C=t(75501);const w=e=>{const{slackChannel:a}=e,{t}=(0,C.useTranslationRef)(k.O);return a?"string"==typeof a?(0,n.jsx)(u.A,{children:t("errorBoundary.title",{slackChannel:a})}):a.href?(0,n.jsx)(g,{to:a.href,variant:"contained",children:a.name}):(0,n.jsx)(u.A,{children:t("errorBoundary.title",{slackChannel:a.name})}):null},P=class extends y.Component{constructor(e){super(e),this.state={error:void 0,errorInfo:void 0}}componentDidCatch(e,a){console.error(`ErrorBoundary, error: ${e}`,{error:e,errorInfo:a}),this.setState({error:e,errorInfo:a})}render(){const{slackChannel:e,children:a}=this.props,{error:t}=this.state;return t?(0,n.jsx)(b.b,{title:"Something Went Wrong",error:t,children:(0,n.jsx)(w,{slackChannel:e})}):a}},S=(0,c.makeStyles)(e=>({noPadding:{padding:0,"&:last-child":{paddingBottom:0}},contentAlignBottom:{display:"flex",alignItems:"self-end"},header:{padding:e.spacing(2,2,2,2.5)},headerTitle:{fontWeight:e.typography.fontWeightBold},headerSubheader:{paddingTop:e.spacing(1)},headerAvatar:{},headerAction:{},headerContent:{},subheader:{display:"flex"}}),{name:"BackstageInfoCard"}),N=(0,c.withStyles)(e=>({root:{display:"inline-block",padding:e.spacing(8,8,0,0),float:"right"}}),{name:"BackstageInfoCardCardActionsTopRight"})(i.A),I={card:{flex:{display:"flex",flexDirection:"column"},fullHeight:{display:"flex",flexDirection:"column",height:"100%"},gridItem:{display:"flex",flexDirection:"column",height:"calc(100% - 10px)",marginBottom:"10px",breakInside:"avoid-page","@media print":{height:"auto"}}},cardContent:{fullHeight:{flex:1},gridItem:{flex:1}}};function B(e){const{title:a,subheader:t,divider:c=!0,deepLink:d,slackChannel:p,errorBoundaryProps:u,variant:m,alignContent:x="normal",children:A,headerStyle:y,headerProps:f,icon:j,action:g,actionsClassName:b,actions:k,cardClassName:C,actionsTopRight:w,className:B,noPadding:R,titleTypographyProps:z,subheaderTypographyProps:T}=e,$=S();let _={},L={};m&&m.split(/[\s]+/g).forEach(e=>{_={..._,...I.card[e]},L={...L,...I.cardContent[e]}});const E=u||(p?{slackChannel:p}:{});return(0,n.jsx)(r.A,{style:_,className:B,children:(0,n.jsxs)(P,{...E,children:[a&&(0,n.jsx)(l.A,{classes:{root:h()($.header),title:$.headerTitle,subheader:$.headerSubheader,avatar:$.headerAvatar,action:$.headerAction,content:$.headerContent},title:a,subheader:t||j?(0,n.jsxs)("div",{"data-testid":"info-card-subheader",children:[t&&(0,n.jsx)("div",{className:$.subheader,children:t}),j]}):null,action:g,style:{...y},titleTypographyProps:z,subheaderTypographyProps:T,...f}),w&&(0,n.jsx)(N,{children:w}),c&&(0,n.jsx)(o.A,{}),(0,n.jsx)(s.A,{className:h()(C,{[$.noPadding]:R,[$.contentAlignBottom]:"bottom"===x}),style:L,children:A}),k&&(0,n.jsx)(i.A,{className:b,children:k}),d&&(0,n.jsx)(v,{...d})]})})}}}]);
|
|
2
|
-
//# sourceMappingURL=2967.65c51af8.chunk.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"static/2967.65c51af8.chunk.js","mappings":"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","sources":["webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/Visibility.js","webpack://internal.plugin-kuadrant/../../node_modules/react-use/esm/useAsync.js","webpack://internal.plugin-kuadrant/../../node_modules/react-use/esm/useAsyncFn.js","webpack://internal.plugin-kuadrant/./src/utils/styles.ts","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/ArrowForward.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/ArrowBack.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/VisibilityOff.js","webpack://internal.plugin-kuadrant/./src/components/ApiKeyDetailPage/ApiKeyDetailPage.tsx","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/Email.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/core-components/dist/layout/BottomLink/BottomLink.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/core-components/dist/components/LinkButton/LinkButton.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/core-components/dist/layout/ErrorBoundary/ErrorBoundary.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/core-components/dist/layout/InfoCard/InfoCard.esm.js"],"sourcesContent":["\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z\"\n}), 'Visibility');\n\nexports.default = _default;","import { useEffect } from 'react';\nimport useAsyncFn from './useAsyncFn';\nexport default function useAsync(fn, deps) {\n if (deps === void 0) { deps = []; }\n var _a = useAsyncFn(fn, deps, {\n loading: true,\n }), state = _a[0], callback = _a[1];\n useEffect(function () {\n callback();\n }, [callback]);\n return state;\n}\n","import { __assign } from \"tslib\";\nimport { useCallback, useRef, useState } from 'react';\nimport useMountedState from './useMountedState';\nexport default function useAsyncFn(fn, deps, initialState) {\n if (deps === void 0) { deps = []; }\n if (initialState === void 0) { initialState = { loading: false }; }\n var lastCallId = useRef(0);\n var isMounted = useMountedState();\n var _a = useState(initialState), state = _a[0], set = _a[1];\n var callback = useCallback(function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var callId = ++lastCallId.current;\n if (!state.loading) {\n set(function (prevState) { return (__assign(__assign({}, prevState), { loading: true })); });\n }\n return fn.apply(void 0, args).then(function (value) {\n isMounted() && callId === lastCallId.current && set({ value: value, loading: false });\n return value;\n }, function (error) {\n isMounted() && callId === lastCallId.current && set({ error: error, loading: false });\n return error;\n });\n }, deps);\n return [state, callback];\n}\n","import { CSSProperties } from \"react\";\n\n/**\n * Returns inline styles for API key status chips.\n * Uses inline styles to ensure proper specificity with Material-UI Chip.\n */\nexport const getStatusChipStyle = (phase: string): CSSProperties => {\n const base = { border: \"none\" };\n switch (phase) {\n case \"Approved\":\n return { ...base, backgroundColor: \"#4caf50\", color: \"#fff\" };\n case \"Rejected\":\n return { ...base, backgroundColor: \"#f44336\", color: \"#fff\" };\n default:\n return { ...base, backgroundColor: \"#ff9800\", color: \"#fff\" };\n }\n};\n","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z\"\n}), 'ArrowForward');\n\nexports.default = _default;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z\"\n}), 'ArrowBack');\n\nexports.default = _default;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78l3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z\"\n}), 'VisibilityOff');\n\nexports.default = _default;","import React, { useState } from \"react\";\nimport { useParams } from \"react-router-dom\";\nimport {\n useApi,\n configApiRef,\n fetchApiRef,\n alertApiRef,\n} from \"@backstage/core-plugin-api\";\nimport { useAsync } from \"react-use\";\nimport {\n Header,\n Page,\n Content,\n Progress,\n ResponseErrorPanel,\n InfoCard,\n Link,\n Breadcrumbs,\n} from \"@backstage/core-components\";\nimport {\n Box,\n Grid,\n Typography,\n Chip,\n IconButton,\n Tooltip,\n Tabs,\n Tab,\n Button,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n makeStyles,\n} from \"@material-ui/core\";\nimport VisibilityIcon from \"@material-ui/icons/Visibility\";\nimport VisibilityOffIcon from \"@material-ui/icons/VisibilityOff\";\nimport FileCopyIcon from \"@material-ui/icons/FileCopy\";\nimport WarningIcon from \"@material-ui/icons/Warning\";\nimport ArrowBackIcon from \"@material-ui/icons/ArrowBack\";\nimport OpenInNewIcon from \"@material-ui/icons/OpenInNew\";\nimport EmailIcon from \"@material-ui/icons/Email\";\nimport { APIKey, APIProduct } from \"../../types/api-management\";\nimport { getStatusChipStyle } from \"../../utils/styles\";\n\nconst useStyles = makeStyles((theme) => ({\n label: {\n fontWeight: 600,\n color: theme.palette.text.secondary,\n marginBottom: theme.spacing(0.5),\n },\n value: {\n marginBottom: theme.spacing(2),\n },\n codeBlock: {\n backgroundColor: theme.palette.background.default,\n padding: theme.spacing(2),\n borderRadius: theme.shape.borderRadius,\n fontFamily: \"monospace\",\n fontSize: \"0.875rem\",\n overflow: \"auto\",\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-all\",\n },\n apiKeyContainer: {\n display: \"flex\",\n alignItems: \"center\",\n gap: theme.spacing(1),\n padding: theme.spacing(1.5),\n backgroundColor: theme.palette.background.default,\n borderRadius: theme.shape.borderRadius,\n fontFamily: \"monospace\",\n },\n tabPanel: {\n marginTop: theme.spacing(2),\n },\n}));\n\nconst CodeExample = ({\n code,\n onCopy,\n}: {\n code: string;\n onCopy: () => void;\n}) => {\n const classes = useStyles();\n\n return (\n <Box position=\"relative\">\n <Box className={classes.codeBlock}>{code}</Box>\n <Tooltip title=\"Copy code\">\n <IconButton\n size=\"small\"\n style={{ position: \"absolute\", top: 8, right: 8 }}\n onClick={onCopy}\n >\n <FileCopyIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n </Box>\n );\n};\n\nexport const ApiKeyDetailPage = () => {\n const classes = useStyles();\n const { namespace, name } = useParams<{ namespace: string; name: string }>();\n const config = useApi(configApiRef);\n const fetchApi = useApi(fetchApiRef);\n const alertApi = useApi(alertApiRef);\n const backendUrl = config.getString(\"backend.baseUrl\");\n\n const [selectedTab, setSelectedTab] = useState(0);\n const [showApiKey, setShowApiKey] = useState(false);\n const [apiKeyValue, setApiKeyValue] = useState<string | null>(null);\n const [apiKeyLoading, setApiKeyLoading] = useState(false);\n const [alreadyRead, setAlreadyRead] = useState(false);\n const [showWarning, setShowWarning] = useState(false);\n\n const {\n value: data,\n loading,\n error,\n } = useAsync(async () => {\n const [apiKeyResponse, productsResponse] = await Promise.all([\n fetchApi.fetch(`${backendUrl}/api/kuadrant/apikeys/${namespace}/${name}`),\n fetchApi.fetch(`${backendUrl}/api/kuadrant/apiproducts`),\n ]);\n\n if (!apiKeyResponse.ok) {\n throw new Error(\"Failed to fetch API key\");\n }\n const apiKeyData = await apiKeyResponse.json();\n\n // check if key has already been read\n if (apiKeyData.status?.canReadSecret === false) {\n setAlreadyRead(true);\n }\n\n // find matching api product to get contact info\n let apiProduct: APIProduct | undefined;\n if (productsResponse.ok) {\n const productsData = await productsResponse.json();\n apiProduct = (productsData.items || []).find(\n (p: APIProduct) =>\n p.metadata.name === apiKeyData.spec.apiProductRef?.name &&\n p.metadata.namespace === apiKeyData.metadata.namespace,\n );\n }\n\n return { apiKey: apiKeyData as APIKey, apiProduct };\n }, [namespace, name, backendUrl, fetchApi]);\n\n const apiKey = data?.apiKey;\n const apiProduct = data?.apiProduct;\n\n const fetchApiKeySecret = async () => {\n setApiKeyLoading(true);\n try {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/apikeys/${namespace}/${name}/secret`,\n );\n if (response.ok) {\n const data = await response.json();\n setApiKeyValue(data.apiKey);\n setAlreadyRead(true);\n setShowApiKey(true);\n } else if (response.status === 403) {\n setAlreadyRead(true);\n alertApi.post({\n message:\n \"This API key has already been viewed and cannot be retrieved again.\",\n severity: \"warning\",\n display: \"transient\",\n });\n }\n } catch (err) {\n 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(false);\n }\n };\n\n const handleRevealClick = () => {\n if (showApiKey) {\n setShowApiKey(false);\n setApiKeyValue(null);\n } else if (!alreadyRead) {\n setShowWarning(true);\n }\n };\n\n const handleConfirmReveal = () => {\n setShowWarning(false);\n fetchApiKeySecret();\n };\n\n const handleCopy = async (text: string) => {\n await navigator.clipboard.writeText(text);\n alertApi.post({\n message: \"Copied to clipboard\",\n severity: \"success\",\n display: \"transient\",\n });\n };\n\n if (loading) {\n return <Progress />;\n }\n\n if (error || !apiKey) {\n return (\n <ResponseErrorPanel error={error || new Error(\"API key not found\")} />\n );\n }\n\n const phase = apiKey.status?.phase || \"Pending\";\n const statusLabel = phase === \"Approved\" ? \"Active\" : phase;\n const hostname = apiKey.status?.apiHostname || \"api.example.com\";\n const displayApiKey = apiKeyValue || \"<your-api-key>\";\n\n // code examples\n const curlExample = `curl -H \"Authorization: Bearer ${displayApiKey}\" \\\\\n https://${hostname}/`;\n\n const nodeExample = `const response = await fetch('https://${hostname}/', {\n headers: {\n 'Authorization': 'Bearer ${displayApiKey}'\n }\n});\nconst data = await response.json();`;\n\n const pythonExample = `import requests\n\nresponse = requests.get(\n 'https://${hostname}/',\n headers={'Authorization': 'Bearer ${displayApiKey}'}\n)\ndata = response.json()`;\n\n const goExample = `package main\n\nimport (\n \"net/http\"\n)\n\nfunc main() {\n client := &http.Client{}\n req, _ := http.NewRequest(\"GET\", \"https://${hostname}/\", nil)\n req.Header.Set(\"Authorization\", \"Bearer ${displayApiKey}\")\n resp, _ := client.Do(req)\n defer resp.Body.Close()\n}`;\n\n const codeExamples = [\n { label: \"cURL\", code: curlExample },\n { label: \"Node.js\", code: nodeExample },\n { label: \"Python\", code: pythonExample },\n { label: \"Go\", code: goExample },\n ];\n\n return (\n <Page themeId=\"tool\">\n <Header\n title={apiKey.metadata.name}\n subtitle={`API Key for ${apiKey.spec.apiProductRef?.name || \"unknown\"}`}\n >\n <Link to=\"/kuadrant/api-keys\">\n <Button startIcon={<ArrowBackIcon />}>Back to API Keys</Button>\n </Link>\n </Header>\n <Content>\n <Box mb={2}>\n <Breadcrumbs aria-label=\"breadcrumb\">\n <Link to=\"/kuadrant/api-keys\">API keys</Link>\n <Typography>{apiKey.metadata.name}</Typography>\n </Breadcrumbs>\n </Box>\n\n <Box mb={3} display=\"flex\" style={{ gap: 8 }}>\n <Link to={`/catalog/default/api/${apiKey.spec.apiProductRef?.name}`}>\n <Button\n variant=\"outlined\"\n startIcon={<OpenInNewIcon />}\n data-testid=\"view-api-button\"\n >\n View API\n </Button>\n </Link>\n {apiProduct?.spec?.contact &&\n (apiProduct.spec.contact.email ||\n apiProduct.spec.contact.url ||\n apiProduct.spec.contact.slack) && (\n <Button\n variant=\"outlined\"\n startIcon={<EmailIcon />}\n href={\n apiProduct.spec.contact.email\n ? `mailto:${apiProduct.spec.contact.email}`\n : apiProduct.spec.contact.slack\n ? apiProduct.spec.contact.slack\n : apiProduct.spec.contact.url || \"#\"\n }\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Contact Owner\n </Button>\n )}\n </Box>\n\n <Grid container spacing={3}>\n <Grid item xs={12} md={6}>\n <InfoCard title=\"API Key Details\">\n <Box>\n <Typography variant=\"caption\" className={classes.label}>\n Status\n </Typography>\n <Box className={classes.value}>\n <Chip\n label={statusLabel}\n size=\"small\"\n style={getStatusChipStyle(phase)}\n data-testid=\"api-key-status-chip\"\n />\n </Box>\n\n <Typography variant=\"caption\" className={classes.label}>\n API Product\n </Typography>\n <Typography variant=\"body1\" className={classes.value}>\n <Link\n to={`/catalog/default/api/${apiKey.spec.apiProductRef?.name}/api-keys`}\n >\n {apiKey.spec.apiProductRef?.name || \"unknown\"}\n </Link>\n </Typography>\n\n <Typography variant=\"caption\" className={classes.label}>\n Tier\n </Typography>\n <Box className={classes.value}>\n <Chip\n label={apiKey.spec.planTier}\n size=\"small\"\n variant=\"outlined\"\n />\n </Box>\n\n <Typography variant=\"caption\" className={classes.label}>\n Requester\n </Typography>\n <Typography variant=\"body1\" className={classes.value}>\n {apiKey.spec.requestedBy?.userId}\n </Typography>\n\n <Typography variant=\"caption\" className={classes.label}>\n Requested\n </Typography>\n <Typography variant=\"body1\" className={classes.value}>\n {apiKey.metadata.creationTimestamp\n ? new Date(\n apiKey.metadata.creationTimestamp,\n ).toLocaleDateString()\n : \"-\"}\n </Typography>\n\n {apiKey.status?.reviewedBy && (\n <>\n <Typography variant=\"caption\" className={classes.label}>\n Reviewed By\n </Typography>\n <Typography variant=\"body1\" className={classes.value}>\n {apiKey.status.reviewedBy.replace(/^user:default\\//, \"\")}\n {apiKey.status.reviewedAt && (\n <Typography variant=\"caption\" color=\"textSecondary\">\n {\" \"}\n on{\" \"}\n {new Date(\n apiKey.status.reviewedAt,\n ).toLocaleDateString()}\n </Typography>\n )}\n </Typography>\n </>\n )}\n </Box>\n </InfoCard>\n </Grid>\n\n <Grid item xs={12} md={6}>\n <InfoCard title=\"Use Case\">\n <Typography variant=\"body1\">\n {apiKey.spec.useCase || \"No use case provided\"}\n </Typography>\n </InfoCard>\n\n {phase === \"Approved\" && (\n <Box mt={2}>\n <InfoCard title=\"API Key\">\n {alreadyRead && !apiKeyValue ? (\n <Tooltip title=\"This API key has already been viewed and cannot be retrieved again\">\n <Box display=\"flex\" alignItems=\"center\">\n <Typography variant=\"body2\" color=\"textSecondary\">\n Already viewed - cannot be retrieved again\n </Typography>\n <VisibilityOffIcon\n fontSize=\"small\"\n color=\"disabled\"\n style={{ marginLeft: 8 }}\n />\n </Box>\n </Tooltip>\n ) : (\n <Box className={classes.apiKeyContainer}>\n <Typography\n variant=\"body2\"\n style={{ fontFamily: \"monospace\", flex: 1 }}\n >\n {apiKeyLoading\n ? \"Loading...\"\n : showApiKey && apiKeyValue\n ? apiKeyValue\n : \"•\".repeat(32)}\n </Typography>\n {showApiKey && apiKeyValue && (\n <Tooltip title=\"Copy to clipboard\">\n <IconButton\n size=\"small\"\n onClick={() => handleCopy(apiKeyValue)}\n >\n <FileCopyIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n <Tooltip\n title={\n showApiKey\n ? \"Hide API key\"\n : \"Reveal API key (one-time only)\"\n }\n >\n <span>\n <IconButton\n size=\"small\"\n onClick={handleRevealClick}\n disabled={\n apiKeyLoading || (alreadyRead && !apiKeyValue)\n }\n >\n {showApiKey ? (\n <VisibilityOffIcon fontSize=\"small\" />\n ) : (\n <VisibilityIcon fontSize=\"small\" />\n )}\n </IconButton>\n </span>\n </Tooltip>\n </Box>\n )}\n </InfoCard>\n </Box>\n )}\n </Grid>\n\n {phase === \"Approved\" && (\n <Grid item xs={12}>\n <InfoCard title=\"Code Examples\">\n <Box>\n <Tabs\n value={selectedTab}\n onChange={(_, newValue) => setSelectedTab(newValue)}\n indicatorColor=\"primary\"\n textColor=\"primary\"\n >\n {codeExamples.map((ex) => (\n <Tab key={ex.label} label={ex.label} />\n ))}\n </Tabs>\n <Box className={classes.tabPanel}>\n <CodeExample\n code={codeExamples[selectedTab].code}\n onCopy={() => handleCopy(codeExamples[selectedTab].code)}\n />\n </Box>\n </Box>\n </InfoCard>\n </Grid>\n )}\n\n {apiKey.status?.limits && (\n <Grid item xs={12}>\n <InfoCard title=\"Rate Limits\">\n <Grid container spacing={2}>\n {apiKey.status.limits.daily && (\n <Grid item>\n <Typography variant=\"caption\" className={classes.label}>\n Daily\n </Typography>\n <Typography variant=\"h6\">\n {apiKey.status.limits.daily.toLocaleString()}\n </Typography>\n </Grid>\n )}\n {apiKey.status.limits.weekly && (\n <Grid item>\n <Typography variant=\"caption\" className={classes.label}>\n Weekly\n </Typography>\n <Typography variant=\"h6\">\n {apiKey.status.limits.weekly.toLocaleString()}\n </Typography>\n </Grid>\n )}\n {apiKey.status.limits.monthly && (\n <Grid item>\n <Typography variant=\"caption\" className={classes.label}>\n Monthly\n </Typography>\n <Typography variant=\"h6\">\n {apiKey.status.limits.monthly.toLocaleString()}\n </Typography>\n </Grid>\n )}\n </Grid>\n </InfoCard>\n </Grid>\n )}\n </Grid>\n </Content>\n\n <Dialog\n open={showWarning}\n onClose={() => setShowWarning(false)}\n maxWidth=\"sm\"\n >\n <DialogTitle>\n <Box display=\"flex\" alignItems=\"center\">\n <WarningIcon color=\"primary\" style={{ marginRight: 8 }} />\n View API Key\n </Box>\n </DialogTitle>\n <DialogContent>\n <Typography variant=\"body1\" paragraph>\n This API key can only be viewed <strong>once</strong>. After you\n reveal it, you will not be able to retrieve it again.\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Make sure to copy and store it securely before closing this view.\n </Typography>\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setShowWarning(false)}>Cancel</Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={handleConfirmReveal}\n >\n Reveal API Key\n </Button>\n </DialogActions>\n </Dialog>\n </Page>\n );\n};\n","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z\"\n}), 'Email');\n\nexports.default = _default;","import { jsxs, jsx } from 'react/jsx-runtime';\nimport Box from '@material-ui/core/Box';\nimport Divider from '@material-ui/core/Divider';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport ArrowIcon from '@material-ui/icons/ArrowForward';\nimport { Link } from '../../components/Link/Link.esm.js';\n\nconst useStyles = makeStyles(\n (theme) => ({\n root: {\n maxWidth: \"fit-content\",\n padding: theme.spacing(2, 2, 2, 2.5)\n },\n boxTitle: {\n margin: 0,\n color: theme.palette.textSubtle\n },\n arrow: {\n color: theme.palette.textSubtle\n }\n }),\n { name: \"BackstageBottomLink\" }\n);\nfunction BottomLink(props) {\n const { link, title, onClick } = props;\n const classes = useStyles();\n return /* @__PURE__ */ jsxs(Box, { children: [\n /* @__PURE__ */ jsx(Divider, {}),\n /* @__PURE__ */ jsx(Link, { to: link, onClick, underline: \"none\", children: /* @__PURE__ */ jsxs(Box, { display: \"flex\", alignItems: \"center\", className: classes.root, children: [\n /* @__PURE__ */ jsx(Box, { className: classes.boxTitle, fontWeight: \"fontWeightBold\", m: 1, children: /* @__PURE__ */ jsx(Typography, { children: /* @__PURE__ */ jsx(\"strong\", { children: title }) }) }),\n /* @__PURE__ */ jsx(ArrowIcon, { className: classes.arrow })\n ] }) })\n ] });\n}\n\nexport { BottomLink };\n//# sourceMappingURL=BottomLink.esm.js.map\n","import { jsx } from 'react/jsx-runtime';\nimport Button$1 from '@material-ui/core/Button';\nimport { forwardRef } from 'react';\nimport { Link } from '../Link/Link.esm.js';\n\nconst LinkWrapper = forwardRef((props, ref) => /* @__PURE__ */ jsx(Link, { ref, ...props, color: \"initial\" }));\nconst LinkButton = forwardRef((props, ref) => /* @__PURE__ */ jsx(Button$1, { ref, component: LinkWrapper, ...props }));\nconst Button = LinkButton;\n\nexport { Button, LinkButton };\n//# sourceMappingURL=LinkButton.esm.js.map\n","import { jsx } from 'react/jsx-runtime';\nimport Typography from '@material-ui/core/Typography';\nimport { Component } from 'react';\nimport { LinkButton } from '../../components/LinkButton/LinkButton.esm.js';\nimport { ErrorPanel } from '../../components/ErrorPanel/ErrorPanel.esm.js';\nimport { coreComponentsTranslationRef } from '../../translation.esm.js';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\nconst SlackLink = (props) => {\n const { slackChannel } = props;\n const { t } = useTranslationRef(coreComponentsTranslationRef);\n if (!slackChannel) {\n return null;\n } else if (typeof slackChannel === \"string\") {\n return /* @__PURE__ */ jsx(Typography, { children: t(\"errorBoundary.title\", { slackChannel }) });\n } else if (!slackChannel.href) {\n return /* @__PURE__ */ jsx(Typography, { children: t(\"errorBoundary.title\", {\n slackChannel: slackChannel.name\n }) });\n }\n return /* @__PURE__ */ jsx(LinkButton, { to: slackChannel.href, variant: \"contained\", children: slackChannel.name });\n};\nconst ErrorBoundary = class ErrorBoundary2 extends Component {\n constructor(props) {\n super(props);\n this.state = {\n error: void 0,\n errorInfo: void 0\n };\n }\n componentDidCatch(error, errorInfo) {\n console.error(`ErrorBoundary, error: ${error}`, { error, errorInfo });\n this.setState({ error, errorInfo });\n }\n render() {\n const { slackChannel, children } = this.props;\n const { error } = this.state;\n if (!error) {\n return children;\n }\n return /* @__PURE__ */ jsx(ErrorPanel, { title: \"Something Went Wrong\", error, children: /* @__PURE__ */ jsx(SlackLink, { slackChannel }) });\n }\n};\n\nexport { ErrorBoundary };\n//# sourceMappingURL=ErrorBoundary.esm.js.map\n","import { jsx, jsxs } from 'react/jsx-runtime';\nimport Card from '@material-ui/core/Card';\nimport CardActions from '@material-ui/core/CardActions';\nimport CardContent from '@material-ui/core/CardContent';\nimport CardHeader from '@material-ui/core/CardHeader';\nimport Divider from '@material-ui/core/Divider';\nimport { makeStyles, withStyles } from '@material-ui/core/styles';\nimport classNames from 'classnames';\nimport { BottomLink } from '../BottomLink/BottomLink.esm.js';\nimport { ErrorBoundary } from '../ErrorBoundary/ErrorBoundary.esm.js';\n\nconst useStyles = makeStyles(\n (theme) => ({\n noPadding: {\n padding: 0,\n \"&:last-child\": {\n paddingBottom: 0\n }\n },\n contentAlignBottom: {\n display: \"flex\",\n alignItems: \"self-end\"\n },\n header: {\n padding: theme.spacing(2, 2, 2, 2.5)\n },\n headerTitle: {\n fontWeight: theme.typography.fontWeightBold\n },\n headerSubheader: {\n paddingTop: theme.spacing(1)\n },\n headerAvatar: {},\n headerAction: {},\n headerContent: {},\n subheader: {\n display: \"flex\"\n }\n }),\n { name: \"BackstageInfoCard\" }\n);\nconst CardActionsTopRight = withStyles(\n (theme) => ({\n root: {\n display: \"inline-block\",\n padding: theme.spacing(8, 8, 0, 0),\n float: \"right\"\n }\n }),\n { name: \"BackstageInfoCardCardActionsTopRight\" }\n)(CardActions);\nconst VARIANT_STYLES = {\n card: {\n flex: {\n display: \"flex\",\n flexDirection: \"column\"\n },\n fullHeight: {\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\"\n },\n gridItem: {\n display: \"flex\",\n flexDirection: \"column\",\n height: \"calc(100% - 10px)\",\n // for pages without content header\n marginBottom: \"10px\",\n breakInside: \"avoid-page\",\n \"@media print\": {\n height: \"auto\"\n }\n }\n },\n cardContent: {\n fullHeight: {\n flex: 1\n },\n gridItem: {\n flex: 1\n }\n }\n};\nfunction InfoCard(props) {\n const {\n title,\n subheader,\n divider = true,\n deepLink,\n slackChannel,\n errorBoundaryProps,\n variant,\n alignContent = \"normal\",\n children,\n headerStyle,\n headerProps,\n icon,\n action,\n actionsClassName,\n actions,\n cardClassName,\n actionsTopRight,\n className,\n noPadding,\n titleTypographyProps,\n subheaderTypographyProps\n } = props;\n const classes = useStyles();\n let calculatedStyle = {};\n let calculatedCardStyle = {};\n if (variant) {\n const variants = variant.split(/[\\s]+/g);\n variants.forEach((name) => {\n calculatedStyle = {\n ...calculatedStyle,\n ...VARIANT_STYLES.card[name]\n };\n calculatedCardStyle = {\n ...calculatedCardStyle,\n ...VARIANT_STYLES.cardContent[name]\n };\n });\n }\n const cardSubTitle = () => {\n if (!subheader && !icon) {\n return null;\n }\n return /* @__PURE__ */ jsxs(\"div\", { \"data-testid\": \"info-card-subheader\", children: [\n subheader && /* @__PURE__ */ jsx(\"div\", { className: classes.subheader, children: subheader }),\n icon\n ] });\n };\n const errProps = errorBoundaryProps || (slackChannel ? { slackChannel } : {});\n return /* @__PURE__ */ jsx(Card, { style: calculatedStyle, className, children: /* @__PURE__ */ jsxs(ErrorBoundary, { ...errProps, children: [\n title && /* @__PURE__ */ jsx(\n CardHeader,\n {\n classes: {\n root: classNames(classes.header),\n title: classes.headerTitle,\n subheader: classes.headerSubheader,\n avatar: classes.headerAvatar,\n action: classes.headerAction,\n content: classes.headerContent\n },\n title,\n subheader: cardSubTitle(),\n action,\n style: { ...headerStyle },\n titleTypographyProps,\n subheaderTypographyProps,\n ...headerProps\n }\n ),\n actionsTopRight && /* @__PURE__ */ jsx(CardActionsTopRight, { children: actionsTopRight }),\n divider && /* @__PURE__ */ jsx(Divider, {}),\n /* @__PURE__ */ jsx(\n CardContent,\n {\n className: classNames(cardClassName, {\n [classes.noPadding]: noPadding,\n [classes.contentAlignBottom]: alignContent === \"bottom\"\n }),\n style: calculatedCardStyle,\n children\n }\n ),\n actions && /* @__PURE__ */ jsx(CardActions, { className: actionsClassName, children: actions }),\n deepLink && /* @__PURE__ */ jsx(BottomLink, { ...deepLink })\n ] }) });\n}\n\nexport { InfoCard };\n//# sourceMappingURL=InfoCard.esm.js.map\n"],"names":["_interopRequireDefault","_interopRequireWildcard","exports","React","_default","default","createElement","d","useAsync","fn","deps","_a","initialState","loading","lastCallId","useRef","isMounted","useMountedState","useState","state","set","callback","useCallback","args","_i","arguments","length","callId","current","prevState","__assign","apply","then","value","error","useAsyncFn","useEffect","getStatusChipStyle","phase","base","border","backgroundColor","color","useStyles","makeStyles","theme","label","fontWeight","palette","text","secondary","marginBottom","spacing","codeBlock","background","padding","borderRadius","shape","fontFamily","fontSize","overflow","whiteSpace","wordBreak","apiKeyContainer","display","alignItems","gap","tabPanel","marginTop","CodeExample","code","onCopy","classes","Box","position","className","Tooltip","title","IconButton","size","style","top","right","onClick","FileCopyIcon","ApiKeyDetailPage","apiKey","apiProduct","namespace","name","useParams","config","useApi","configApiRef","fetchApi","fetchApiRef","alertApi","alertApiRef","backendUrl","getString","selectedTab","setSelectedTab","showApiKey","setShowApiKey","apiKeyValue","setApiKeyValue","apiKeyLoading","setApiKeyLoading","alreadyRead","setAlreadyRead","showWarning","setShowWarning","data","async","apiKeyData","apiKeyResponse","productsResponse","Promise","all","fetch","ok","Error","json","status","canReadSecret","items","find","p","metadata","spec","apiProductRef","handleCopy","navigator","clipboard","writeText","post","message","severity","Progress","ResponseErrorPanel","statusLabel","hostname","apiHostname","displayApiKey","codeExamples","Page","themeId","Header","subtitle","Link","to","Button","startIcon","ArrowBackIcon","Content","mb","Breadcrumbs","aria-label","Typography","variant","OpenInNewIcon","data-testid","contact","email","url","slack","EmailIcon","href","target","rel","Grid","container","item","xs","md","InfoCard","Chip","planTier","requestedBy","userId","creationTimestamp","Date","toLocaleDateString","reviewedBy","replace","reviewedAt","useCase","mt","VisibilityOffIcon","marginLeft","flex","repeat","span","disabled","VisibilityIcon","Tabs","onChange","_","newValue","indicatorColor","textColor","map","ex","Tab","limits","daily","toLocaleString","weekly","monthly","Dialog","open","onClose","maxWidth","DialogTitle","WarningIcon","marginRight","DialogContent","paragraph","strong","DialogActions","response","err","console","errorMessage","fetchApiKeySecret","root","boxTitle","margin","textSubtle","arrow","BottomLink","props","link","jsxs","children","jsx","Divider","underline","m","A","LinkWrapper","forwardRef","ref","LinkButton","component","SlackLink","slackChannel","useTranslationRef","t","ErrorBoundary","Component","constructor","super","this","errorInfo","componentDidCatch","setState","render","noPadding","paddingBottom","contentAlignBottom","header","headerTitle","typography","fontWeightBold","headerSubheader","paddingTop","headerAvatar","headerAction","headerContent","subheader","CardActionsTopRight","withStyles","float","CardActions","VARIANT_STYLES","card","flexDirection","fullHeight","height","gridItem","breakInside","cardContent","divider","deepLink","errorBoundaryProps","alignContent","headerStyle","headerProps","icon","action","actionsClassName","actions","cardClassName","actionsTopRight","titleTypographyProps","subheaderTypographyProps","calculatedStyle","calculatedCardStyle","split","forEach","errProps","Card","CardHeader","avatar","content","CardContent"],"sourceRoot":""}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[3091],{5030:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});var r=n(85608),a=n(95478),o=r.__importDefault(n(10009));t.default=function(e,t,n){void 0===t&&(t=[]),void 0===n&&(n={loading:!1});var i=a.useRef(0),l=o.default(),s=a.useState(n),c=s[0],d=s[1],u=a.useCallback(function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var a=++i.current;return c.loading||d(function(e){return r.__assign(r.__assign({},e),{loading:!0})}),e.apply(void 0,t).then(function(e){return l()&&a===i.current&&d({value:e,loading:!1}),e},function(e){return l()&&a===i.current&&d({error:e,loading:!1}),e})},t);return[c,u]}},10009:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});var r=n(95478);t.default=function(){var e=r.useRef(!1),t=r.useCallback(function(){return e.current},[]);return r.useEffect(function(){return e.current=!0,function(){e.current=!1}},[]),t}},18466:(e,t,n)=>{var r=n(4293),a=n(78920);t.A=void 0;var o=a(n(95478)),i=(0,r(n(74044)).default)(o.createElement("path",{d:"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"}),"Add");t.A=i},35015:(e,t,n)=>{n.d(t,{A:()=>i});var r=n(95478),a=n(85608),o=n(71581);function i(e,t){void 0===t&&(t=[]);var n=function(e,t,n){void 0===t&&(t=[]),void 0===n&&(n={loading:!1});var i=(0,r.useRef)(0),l=(0,o.A)(),s=(0,r.useState)(n),c=s[0],d=s[1],u=(0,r.useCallback)(function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var r=++i.current;return c.loading||d(function(e){return(0,a.__assign)((0,a.__assign)({},e),{loading:!0})}),e.apply(void 0,t).then(function(e){return l()&&r===i.current&&d({value:e,loading:!1}),e},function(e){return l()&&r===i.current&&d({error:e,loading:!1}),e})},t);return[c,u]}(e,t,{loading:!0}),i=n[0],l=n[1];return(0,r.useEffect)(function(){l()},[l]),i}},39590:(e,t,n)=>{var r=n(4293),a=n(78920);t.A=void 0;var o=a(n(95478)),i=(0,r(n(74044)).default)(o.createElement("path",{d:"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"}),"Delete");t.A=i},41241:(e,t,n)=>{n.d(t,{S:()=>d});var r=n(31085),a=n(10394),o=n(88951),i=n(37976),l=n(95478);function s(e){const t=(0,i.useTheme)(),[n,s]=(0,l.useState)(!1);return(0,l.useEffect)(()=>{const e=setTimeout(()=>s(!0),t.transitions.duration.short);return()=>clearTimeout(e)},[t.transitions.duration.short]),n?(0,r.jsx)(o.A,{...e,"data-testid":"progress"}):(0,r.jsx)(a.A,{display:"none","data-testid":"progress"})}const c=(0,l.lazy)(()=>Promise.all([n.e(9655),n.e(8727),n.e(4093)]).then(n.bind(n,74093)).then(e=>({default:e.OpenApiDefinition}))),d=e=>{const t=e.supportedSubmitMethods?.map(e=>e.toLocaleLowerCase());return(0,r.jsx)(l.Suspense,{fallback:(0,r.jsx)(s,{}),children:(0,r.jsx)(c,{...e,supportedSubmitMethods:t})})}},52235:(e,t,n)=>{var r=n(4293),a=n(78920);t.A=void 0;var o=a(n(95478)),i=(0,r(n(74044)).default)(o.createElement("path",{d:"M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z"}),"ArrowForward");t.A=i},55735:(e,t,n)=>{var r=n(4293),a=n(78920);t.A=void 0;var o=a(n(95478)),i=(0,r(n(74044)).default)(o.createElement("path",{d:"M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z"}),"ArrowBack");t.A=i},84441:(e,t,n)=>{n.d(t,{A:()=>C});var r=n(39850),a=n(89575),o=n(95478);function i(e){var t,n,r="";if("string"==typeof e||"number"==typeof e)r+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;t<e.length;t++)e[t]&&(n=i(e[t]))&&(r&&(r+=" "),r+=n);else for(t in e)e[t]&&(r&&(r+=" "),r+=t);return r}const l=function(){for(var e,t,n=0,r="";n<arguments.length;)(e=arguments[n++])&&(t=i(e))&&(r&&(r+=" "),r+=t);return r};var s=n(37976),c=n(4321),d=n(38483);const u=(0,d.A)(o.createElement("path",{d:"M20,12A8,8 0 0,1 12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4C12.76,4 13.5,4.11 14.2, 4.31L15.77,2.74C14.61,2.26 13.34,2 12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0, 0 22,12M7.91,10.08L6.5,11.5L11,16L21,6L19.59,4.58L11,13.17L7.91,10.08Z"}),"SuccessOutlined"),h=(0,d.A)(o.createElement("path",{d:"M12 5.99L19.53 19H4.47L12 5.99M12 2L1 21h22L12 2zm1 14h-2v2h2v-2zm0-6h-2v4h2v-4z"}),"ReportProblemOutlined"),f=(0,d.A)(o.createElement("path",{d:"M11 15h2v2h-2zm0-8h2v6h-2zm.99-5C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"}),"ErrorOutline"),p=(0,d.A)(o.createElement("path",{d:"M11,9H13V7H11M12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4C16.41,4 20,7.59 20, 12C20,16.41 16.41,20 12,20M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10, 10 0 0,0 12,2M11,17H13V11H11V17Z"}),"InfoOutlined"),m=(0,d.A)(o.createElement("path",{d:"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"}),"Close");var g=n(29365),v=n(11192),A={success:o.createElement(u,{fontSize:"inherit"}),warning:o.createElement(h,{fontSize:"inherit"}),error:o.createElement(f,{fontSize:"inherit"}),info:o.createElement(p,{fontSize:"inherit"})},x=o.createElement(m,{fontSize:"small"}),y=o.forwardRef(function(e,t){var n=e.action,i=e.children,s=e.classes,d=e.className,u=e.closeText,h=void 0===u?"Close":u,f=e.color,p=e.icon,m=e.iconMapping,y=void 0===m?A:m,C=e.onClose,b=e.role,k=void 0===b?"alert":b,j=e.severity,E=void 0===j?"success":j,S=e.variant,M=void 0===S?"standard":S,z=(0,r.A)(e,["action","children","classes","className","closeText","color","icon","iconMapping","onClose","role","severity","variant"]);return o.createElement(c.A,(0,a.A)({role:k,square:!0,elevation:0,className:l(s.root,s["".concat(M).concat((0,v.A)(f||E))],d),ref:t},z),!1!==p?o.createElement("div",{className:s.icon},p||y[E]||A[E]):null,o.createElement("div",{className:s.message},i),null!=n?o.createElement("div",{className:s.action},n):null,null==n&&C?o.createElement("div",{className:s.action},o.createElement(g.A,{size:"small","aria-label":h,title:h,color:"inherit",onClick:C},x)):null)});const C=(0,s.withStyles)(function(e){var t="light"===e.palette.type?s.darken:s.lighten,n="light"===e.palette.type?s.lighten:s.darken;return{root:(0,a.A)({},e.typography.body2,{borderRadius:e.shape.borderRadius,backgroundColor:"transparent",display:"flex",padding:"6px 16px"}),standardSuccess:{color:t(e.palette.success.main,.6),backgroundColor:n(e.palette.success.main,.9),"& $icon":{color:e.palette.success.main}},standardInfo:{color:t(e.palette.info.main,.6),backgroundColor:n(e.palette.info.main,.9),"& $icon":{color:e.palette.info.main}},standardWarning:{color:t(e.palette.warning.main,.6),backgroundColor:n(e.palette.warning.main,.9),"& $icon":{color:e.palette.warning.main}},standardError:{color:t(e.palette.error.main,.6),backgroundColor:n(e.palette.error.main,.9),"& $icon":{color:e.palette.error.main}},outlinedSuccess:{color:t(e.palette.success.main,.6),border:"1px solid ".concat(e.palette.success.main),"& $icon":{color:e.palette.success.main}},outlinedInfo:{color:t(e.palette.info.main,.6),border:"1px solid ".concat(e.palette.info.main),"& $icon":{color:e.palette.info.main}},outlinedWarning:{color:t(e.palette.warning.main,.6),border:"1px solid ".concat(e.palette.warning.main),"& $icon":{color:e.palette.warning.main}},outlinedError:{color:t(e.palette.error.main,.6),border:"1px solid ".concat(e.palette.error.main),"& $icon":{color:e.palette.error.main}},filledSuccess:{color:"#fff",fontWeight:e.typography.fontWeightMedium,backgroundColor:e.palette.success.main},filledInfo:{color:"#fff",fontWeight:e.typography.fontWeightMedium,backgroundColor:e.palette.info.main},filledWarning:{color:"#fff",fontWeight:e.typography.fontWeightMedium,backgroundColor:e.palette.warning.main},filledError:{color:"#fff",fontWeight:e.typography.fontWeightMedium,backgroundColor:e.palette.error.main},icon:{marginRight:12,padding:"7px 0",display:"flex",fontSize:22,opacity:.9},message:{padding:"8px 0"},action:{display:"flex",alignItems:"center",marginLeft:"auto",paddingLeft:16,marginRight:-8}}},{name:"MuiAlert"})(y)},89031:(e,t,n)=>{var r=n(4293),a=n(78920);t.A=void 0;var o=a(n(95478)),i=(0,r(n(74044)).default)(o.createElement("path",{d:"M11 7h2v2h-2zm0 4h2v6h-2zm1-9C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"}),"InfoOutlined");t.A=i},91638:(e,t,n)=>{var r=n(85608),a=n(95478),o=r.__importDefault(n(5030));t.A=function(e,t){void 0===t&&(t=[]);var n=o.default(e,t,{loading:!0}),r=n[0],i=n[1];return a.useEffect(function(){i()},[i]),r}},96040:(e,t,n)=>{n.d(t,{n:()=>_});var r=n(31085),a=n(40703),o=n(59469),i=n(48653),l=n(45685),s=n(37197),c=n(37976),d=n(53373),u=n.n(d),h=n(10394),f=n(72501),p=n(52235),m=n(37725);const g=(0,c.makeStyles)(e=>({root:{maxWidth:"fit-content",padding:e.spacing(2,2,2,2.5)},boxTitle:{margin:0,color:e.palette.textSubtle},arrow:{color:e.palette.textSubtle}}),{name:"BackstageBottomLink"});function v(e){const{link:t,title:n,onClick:a}=e,o=g();return(0,r.jsxs)(h.A,{children:[(0,r.jsx)(s.A,{}),(0,r.jsx)(m.N_,{to:t,onClick:a,underline:"none",children:(0,r.jsxs)(h.A,{display:"flex",alignItems:"center",className:o.root,children:[(0,r.jsx)(h.A,{className:o.boxTitle,fontWeight:"fontWeightBold",m:1,children:(0,r.jsx)(f.A,{children:(0,r.jsx)("strong",{children:n})})}),(0,r.jsx)(p.A,{className:o.arrow})]})})]})}var A=n(95478),x=n(64947);const y=(0,A.forwardRef)((e,t)=>(0,r.jsx)(m.N_,{ref:t,...e,color:"initial"})),C=(0,A.forwardRef)((e,t)=>(0,r.jsx)(x.A,{ref:t,component:y,...e}));var b=n(56573),k=n(21006),j=n(75501);const E=e=>{const{slackChannel:t}=e,{t:n}=(0,j.useTranslationRef)(k.O);return t?"string"==typeof t?(0,r.jsx)(f.A,{children:n("errorBoundary.title",{slackChannel:t})}):t.href?(0,r.jsx)(C,{to:t.href,variant:"contained",children:t.name}):(0,r.jsx)(f.A,{children:n("errorBoundary.title",{slackChannel:t.name})}):null},S=class extends A.Component{constructor(e){super(e),this.state={error:void 0,errorInfo:void 0}}componentDidCatch(e,t){console.error(`ErrorBoundary, error: ${e}`,{error:e,errorInfo:t}),this.setState({error:e,errorInfo:t})}render(){const{slackChannel:e,children:t}=this.props,{error:n}=this.state;return n?(0,r.jsx)(b.b,{title:"Something Went Wrong",error:n,children:(0,r.jsx)(E,{slackChannel:e})}):t}},M=(0,c.makeStyles)(e=>({noPadding:{padding:0,"&:last-child":{paddingBottom:0}},contentAlignBottom:{display:"flex",alignItems:"self-end"},header:{padding:e.spacing(2,2,2,2.5)},headerTitle:{fontWeight:e.typography.fontWeightBold},headerSubheader:{paddingTop:e.spacing(1)},headerAvatar:{},headerAction:{},headerContent:{},subheader:{display:"flex"}}),{name:"BackstageInfoCard"}),z=(0,c.withStyles)(e=>({root:{display:"inline-block",padding:e.spacing(8,8,0,0),float:"right"}}),{name:"BackstageInfoCardCardActionsTopRight"})(o.A),L={card:{flex:{display:"flex",flexDirection:"column"},fullHeight:{display:"flex",flexDirection:"column",height:"100%"},gridItem:{display:"flex",flexDirection:"column",height:"calc(100% - 10px)",marginBottom:"10px",breakInside:"avoid-page","@media print":{height:"auto"}}},cardContent:{fullHeight:{flex:1},gridItem:{flex:1}}};function _(e){const{title:t,subheader:n,divider:c=!0,deepLink:d,slackChannel:h,errorBoundaryProps:f,variant:p,alignContent:m="normal",children:g,headerStyle:A,headerProps:x,icon:y,action:C,actionsClassName:b,actions:k,cardClassName:j,actionsTopRight:E,className:_,noPadding:w,titleTypographyProps:N,subheaderTypographyProps:W}=e,T=M();let I={},B={};p&&p.split(/[\s]+/g).forEach(e=>{I={...I,...L.card[e]},B={...B,...L.cardContent[e]}});const R=f||(h?{slackChannel:h}:{});return(0,r.jsx)(a.A,{style:I,className:_,children:(0,r.jsxs)(S,{...R,children:[t&&(0,r.jsx)(l.A,{classes:{root:u()(T.header),title:T.headerTitle,subheader:T.headerSubheader,avatar:T.headerAvatar,action:T.headerAction,content:T.headerContent},title:t,subheader:n||y?(0,r.jsxs)("div",{"data-testid":"info-card-subheader",children:[n&&(0,r.jsx)("div",{className:T.subheader,children:n}),y]}):null,action:C,style:{...A},titleTypographyProps:N,subheaderTypographyProps:W,...x}),E&&(0,r.jsx)(z,{children:E}),c&&(0,r.jsx)(s.A,{}),(0,r.jsx)(i.A,{className:u()(j,{[T.noPadding]:w,[T.contentAlignBottom]:"bottom"===m}),style:B,children:g}),k&&(0,r.jsx)(o.A,{className:b,children:k}),d&&(0,r.jsx)(v,{...d})]})})}}}]);
|
|
2
|
-
//# sourceMappingURL=3091.9a74ea5f.chunk.js.map
|