@kuadrant/kuadrant-backstage-plugin-frontend 0.0.2-dev-3d7caf4 → 0.0.2-dev-24d0757
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/assets/empty-state-illustration.png +0 -0
- package/dist/components/ApiKeyManagementTab/ApiKeyManagementTab.esm.js +6 -1
- package/dist/components/ApiKeyManagementTab/ApiKeyManagementTab.esm.js.map +1 -1
- package/dist/components/ApiProductDetailPage/ApiProductDetailPage.esm.js +248 -0
- package/dist/components/ApiProductDetailPage/ApiProductDetailPage.esm.js.map +1 -0
- package/dist/components/ApiProductDetailPage/index.esm.js +2 -0
- package/dist/components/ApiProductDetailPage/index.esm.js.map +1 -0
- package/dist/components/ApiProductDetails/ApiProductDetails.esm.js +86 -0
- package/dist/components/ApiProductDetails/ApiProductDetails.esm.js.map +1 -0
- package/dist/components/ApiProductInfoCard/ApiProductInfoCard.esm.js +24 -43
- package/dist/components/ApiProductInfoCard/ApiProductInfoCard.esm.js.map +1 -1
- package/dist/components/ApprovalQueueTable/ApprovalQueueTable.esm.js +2 -1
- package/dist/components/ApprovalQueueTable/ApprovalQueueTable.esm.js.map +1 -1
- package/dist/components/CreateAPIProductDialog/CreateAPIProductDialog.esm.js +148 -134
- package/dist/components/CreateAPIProductDialog/CreateAPIProductDialog.esm.js.map +1 -1
- package/dist/components/EditAPIProductDialog/EditAPIProductDialog.esm.js +104 -128
- package/dist/components/EditAPIProductDialog/EditAPIProductDialog.esm.js.map +1 -1
- package/dist/components/KuadrantPage/KuadrantPage.esm.js +328 -125
- package/dist/components/KuadrantPage/KuadrantPage.esm.js.map +1 -1
- package/dist/components/MyApiKeysTable/MyApiKeysTable.esm.js +8 -2
- package/dist/components/MyApiKeysTable/MyApiKeysTable.esm.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.esm.js +1 -1
- package/dist/plugin.esm.js +8 -1
- package/dist/plugin.esm.js.map +1 -1
- package/dist/utils/validation.esm.js +1 -11
- package/dist/utils/validation.esm.js.map +1 -1
- package/dist-scalprum/{internal.plugin-kuadrant.793ab10dddb55e70abe2.js → internal.plugin-kuadrant.95817f34e88db81b5e8f.js} +2 -2
- package/dist-scalprum/internal.plugin-kuadrant.95817f34e88db81b5e8f.js.map +1 -0
- package/dist-scalprum/plugin-manifest.json +2 -2
- package/dist-scalprum/static/2759.fceb317f.chunk.js +2 -0
- package/dist-scalprum/static/2759.fceb317f.chunk.js.map +1 -0
- package/dist-scalprum/static/2928.4303c12e.chunk.js +3 -0
- package/dist-scalprum/static/2928.4303c12e.chunk.js.map +1 -0
- package/dist-scalprum/static/2967.ac3a4bee.chunk.js +2 -0
- package/dist-scalprum/static/2967.ac3a4bee.chunk.js.map +1 -0
- package/dist-scalprum/static/{6979.9699b350.chunk.js → 2987.1da15560.chunk.js} +2 -2
- package/dist-scalprum/static/2987.1da15560.chunk.js.map +1 -0
- package/dist-scalprum/static/3459.5c90b5a3.chunk.js +2 -0
- package/dist-scalprum/static/3459.5c90b5a3.chunk.js.map +1 -0
- package/dist-scalprum/static/3503.66b6e510.chunk.js +2 -0
- package/dist-scalprum/static/3503.66b6e510.chunk.js.map +1 -0
- package/dist-scalprum/static/{3650.aa8552f3.chunk.js → 3650.515c743a.chunk.js} +2 -2
- package/dist-scalprum/static/3650.515c743a.chunk.js.map +1 -0
- package/dist-scalprum/static/4682.6959fcd1.chunk.js +2 -0
- package/dist-scalprum/static/4682.6959fcd1.chunk.js.map +1 -0
- package/dist-scalprum/static/5010.a4aa0f8e.chunk.js +3 -0
- package/dist-scalprum/static/5010.a4aa0f8e.chunk.js.map +1 -0
- package/dist-scalprum/static/5453.280127dd.chunk.js +2 -0
- package/dist-scalprum/static/5453.280127dd.chunk.js.map +1 -0
- package/dist-scalprum/static/6422.97baf774.chunk.js +2 -0
- package/dist-scalprum/static/6422.97baf774.chunk.js.map +1 -0
- package/dist-scalprum/static/7791.12162a71.chunk.js +2 -0
- package/dist-scalprum/static/7791.12162a71.chunk.js.map +1 -0
- package/dist-scalprum/static/8799.7c749838.chunk.js +2 -0
- package/dist-scalprum/static/8799.7c749838.chunk.js.map +1 -0
- package/dist-scalprum/static/empty-state-illustration.7e3ad5a9..png +0 -0
- package/dist-scalprum/static/exposed-PluginRoot.a5792fb2.chunk.js +2 -0
- package/dist-scalprum/static/exposed-PluginRoot.a5792fb2.chunk.js.map +1 -0
- package/package.json +1 -1
- package/dist-scalprum/internal.plugin-kuadrant.793ab10dddb55e70abe2.js.map +0 -1
- package/dist-scalprum/static/2120.44884438.chunk.js +0 -3
- package/dist-scalprum/static/2120.44884438.chunk.js.map +0 -1
- package/dist-scalprum/static/2967.c684efaf.chunk.js +0 -2
- package/dist-scalprum/static/2967.c684efaf.chunk.js.map +0 -1
- package/dist-scalprum/static/3650.aa8552f3.chunk.js.map +0 -1
- package/dist-scalprum/static/5010.acf9a415.chunk.js +0 -3
- package/dist-scalprum/static/5010.acf9a415.chunk.js.map +0 -1
- package/dist-scalprum/static/5453.c1f90bdf.chunk.js +0 -2
- package/dist-scalprum/static/5453.c1f90bdf.chunk.js.map +0 -1
- package/dist-scalprum/static/6813.036a322f.chunk.js +0 -2
- package/dist-scalprum/static/6813.036a322f.chunk.js.map +0 -1
- package/dist-scalprum/static/6979.9699b350.chunk.js.map +0 -1
- package/dist-scalprum/static/7684.3d1fc1a1.chunk.js +0 -2
- package/dist-scalprum/static/7684.3d1fc1a1.chunk.js.map +0 -1
- package/dist-scalprum/static/8416.3604a311.chunk.js +0 -2
- package/dist-scalprum/static/8416.3604a311.chunk.js.map +0 -1
- package/dist-scalprum/static/exposed-PluginRoot.16bf7897.chunk.js +0 -2
- package/dist-scalprum/static/exposed-PluginRoot.16bf7897.chunk.js.map +0 -1
- /package/dist-scalprum/static/{2120.44884438.chunk.js.LICENSE.txt → 2928.4303c12e.chunk.js.LICENSE.txt} +0 -0
- /package/dist-scalprum/static/{5010.acf9a415.chunk.js.LICENSE.txt → 5010.a4aa0f8e.chunk.js.LICENSE.txt} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static/3459.5c90b5a3.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/KuadrantPage.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';\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 const data = await response.json();\n // filter to only show httproutes annotated for backstage exposure\n return (data.items || []).filter((route: any) =>\n route.metadata.annotations?.['backstage.io/expose'] === 'true'\n );\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 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 errorData = await response.json();\n throw new Error(errorData.error || 'failed to create apiproduct');\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. Eg.backstage.io/expose:true. API product 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 { 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\nexport const 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 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 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 const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/planpolicies`,\n );\n return await response.json();\n }, [backendUrl, fetchApi, refreshTrigger]);\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 return [\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: \"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 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 }, [allProducts, getPolicyForProduct, getAuthSchemes]);\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 if (response.ok) {\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 }\n } catch (err) {\n console.warn(\"Failed to fetch delete stats:\", err);\n }\n\n setDeleteDialogOpen(true);\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 throw new Error(\"failed to delete apiproduct\");\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 console.error(\"error deleting apiproduct:\", err);\n alertApi.post({\n message: \"Failed to delete API Product\",\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 throw new Error(\"failed to update publish status\");\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 console.error(\"error updating publish status:\", err);\n alertApi.post({\n message: \"Failed to update publish status\",\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 {\n title: \"Policy\",\n field: \"policy\",\n render: (row: any) => getPolicyForProduct(row) || \"N/A\",\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 KuadrantPage = () => {\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","json","items","route","metadata","annotations","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","routeNs","policyInfo","policy","spec","plans","tiers","entries","plan","limit","limits","requests","period","join","formatTierInfo","getPolicyInfoForRoute","PlanPolicyDetails","alertSeverity","alertMessage","includeTopMargin","FormControl","component","RadioGroup","row","Radio","DialogActions","Error","selectedRouteNamespace","selectedRouteName","apiProduct","apiVersion","group","contact","email","team","documentation","openAPISpecURL","method","headers","body","JSON","stringify","ok","errorData","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","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","filteredProducts","a","t","columns","field","render","Link","to","customFilterAndSearch","term","toLowerCase","hasApiKey","hasJwt","icon","VpnKeyIcon","LockIcon","fontStyle","filtering","isOwner","canEdit","canDelete","isPublished","newStatus","post","console","handlePublishToggle","handleEditClick","EditIcon","related","r","apiName","apiNamespace","approved","phase","secrets","warn","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","KuadrantPage","kuadrantApiProductListPermission"],"sourceRoot":""}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[3503],{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(),c=a.useState(n),s=c[0],d=c[1],u=a.useCallback(function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var a=++i.current;return s.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[s,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)(),c=(0,r.useState)(n),s=c[0],d=c[1],u=(0,r.useCallback)(function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var r=++i.current;return s.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[s,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},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},77225:(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:"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z"}),"Warning");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 c=n(37976),s=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"),g=(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 m=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(g,{fontSize:"small"}),y=o.forwardRef(function(e,t){var n=e.action,i=e.children,c=e.classes,d=e.className,u=e.closeText,h=void 0===u?"Close":u,f=e.color,p=e.icon,g=e.iconMapping,y=void 0===g?A:g,C=e.onClose,b=e.role,k=void 0===b?"alert":b,E=e.severity,j=void 0===E?"success":E,z=e.variant,M=void 0===z?"standard":z,S=(0,r.A)(e,["action","children","classes","className","closeText","color","icon","iconMapping","onClose","role","severity","variant"]);return o.createElement(s.A,(0,a.A)({role:k,square:!0,elevation:0,className:l(c.root,c["".concat(M).concat((0,v.A)(f||j))],d),ref:t},S),!1!==p?o.createElement("div",{className:c.icon},p||y[j]||A[j]):null,o.createElement("div",{className:c.message},i),null!=n?o.createElement("div",{className:c.action},n):null,null==n&&C?o.createElement("div",{className:c.action},o.createElement(m.A,{size:"small","aria-label":h,title:h,color:"inherit",onClick:C},x)):null)});const C=(0,c.withStyles)(function(e){var t="light"===e.palette.type?c.darken:c.lighten,n="light"===e.palette.type?c.lighten:c.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:()=>L});var r=n(31085),a=n(40703),o=n(59469),i=n(48653),l=n(45685),c=n(37197),s=n(37976),d=n(53373),u=n.n(d),h=n(10394),f=n(72501),p=n(52235),g=n(37725);const m=(0,s.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=m();return(0,r.jsxs)(h.A,{children:[(0,r.jsx)(c.A,{}),(0,r.jsx)(g.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)(g.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(34169),k=n(16098),E=n(67550);const j=e=>{const{slackChannel:t}=e,{t:n}=(0,E.i)(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},z=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)(j,{slackChannel:e})}):t}},M=(0,s.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"}),S=(0,s.withStyles)(e=>({root:{display:"inline-block",padding:e.spacing(8,8,0,0),float:"right"}}),{name:"BackstageInfoCardCardActionsTopRight"})(o.A),_={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 L(e){const{title:t,subheader:n,divider:s=!0,deepLink:d,slackChannel:h,errorBoundaryProps:f,variant:p,alignContent:g="normal",children:m,headerStyle:A,headerProps:x,icon:y,action:C,actionsClassName:b,actions:k,cardClassName:E,actionsTopRight:j,className:L,noPadding:w,titleTypographyProps:N,subheaderTypographyProps:W}=e,I=M();let B={},H={};p&&p.split(/[\s]+/g).forEach(e=>{B={...B,..._.card[e]},H={...H,..._.cardContent[e]}});const R=f||(h?{slackChannel:h}:{});return(0,r.jsx)(a.A,{style:B,className:L,children:(0,r.jsxs)(z,{...R,children:[t&&(0,r.jsx)(l.A,{classes:{root:u()(I.header),title:I.headerTitle,subheader:I.headerSubheader,avatar:I.headerAvatar,action:I.headerAction,content:I.headerContent},title:t,subheader:n||y?(0,r.jsxs)("div",{"data-testid":"info-card-subheader",children:[n&&(0,r.jsx)("div",{className:I.subheader,children:n}),y]}):null,action:C,style:{...A},titleTypographyProps:N,subheaderTypographyProps:W,...x}),j&&(0,r.jsx)(S,{children:j}),s&&(0,r.jsx)(c.A,{}),(0,r.jsx)(i.A,{className:u()(E,{[I.noPadding]:w,[I.contentAlignBottom]:"bottom"===g}),style:H,children:m}),k&&(0,r.jsx)(o.A,{className:b,children:k}),d&&(0,r.jsx)(v,{...d})]})})}}}]);
|
|
2
|
+
//# sourceMappingURL=3503.66b6e510.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static/3503.66b6e510.chunk.js","mappings":"oIACAA,OAAOC,eAAeC,EAAS,aAAc,CAAEC,OAAO,IACtD,IAAIC,EAAU,EAAQ,OAClBC,EAAU,EAAQ,OAClBC,EAAoBF,EAAQG,gBAAgB,EAAQ,QA0BxDL,EAAA,QAzBA,SAAoBM,EAAIC,EAAMC,QACb,IAATD,IAAmBA,EAAO,SACT,IAAjBC,IAA2BA,EAAe,CAAEC,SAAS,IACzD,IAAIC,EAAaP,EAAQQ,OAAO,GAC5BC,EAAYR,EAAkBS,UAC9BC,EAAKX,EAAQY,SAASP,GAAeQ,EAAQF,EAAG,GAAIG,EAAMH,EAAG,GAC7DI,EAAWf,EAAQgB,YAAY,WAE/B,IADA,IAAIC,EAAO,GACFC,EAAK,EAAGA,EAAKC,UAAUC,OAAQF,IACpCD,EAAKC,GAAMC,UAAUD,GAEzB,IAAIG,IAAWd,EAAWe,QAI1B,OAHKT,EAAMP,SACPQ,EAAI,SAAUS,GAAa,OAAQxB,EAAQyB,SAASzB,EAAQyB,SAAS,CAAC,EAAGD,GAAY,CAAEjB,SAAS,GAAU,GAEvGH,EAAGsB,WAAM,EAAQR,GAAMS,KAAK,SAAU5B,GAEzC,OADAW,KAAeY,IAAWd,EAAWe,SAAWR,EAAI,CAAEhB,MAAOA,EAAOQ,SAAS,IACtER,CACX,EAAG,SAAU6B,GAET,OADAlB,KAAeY,IAAWd,EAAWe,SAAWR,EAAI,CAAEa,MAAOA,EAAOrB,SAAS,IACtEqB,CACX,EACJ,EAAGvB,GACH,MAAO,CAACS,EAAOE,EACnB,C,kBC5BApB,OAAOC,eAAeC,EAAS,aAAc,CAAEC,OAAO,IACtD,IAAIE,EAAU,EAAQ,OAYtBH,EAAA,QAXA,WACI,IAAI+B,EAAa5B,EAAQQ,QAAO,GAC5BqB,EAAM7B,EAAQgB,YAAY,WAAc,OAAOY,EAAWN,OAAS,EAAG,IAO1E,OANAtB,EAAQ8B,UAAU,WAEd,OADAF,EAAWN,SAAU,EACd,WACHM,EAAWN,SAAU,CACzB,CACJ,EAAG,IACIO,CACX,C,sBCXIE,EAAyB,EAAQ,MAEjCC,EAA0B,EAAQ,OAKtCnC,EAAQ,OAAU,EAElB,IAAIoC,EAAQD,EAAwB,EAAQ,QAIxCE,GAAW,EAFMH,EAAuB,EAAQ,QAElBrB,SAAuBuB,EAAME,cAAc,OAAQ,CACnFC,EAAG,wCACD,OAEJvC,EAAQ,EAAUqC,C,wECjBH,SAASG,EAASlC,EAAIC,QACpB,IAATA,IAAmBA,EAAO,IAC9B,IAAIO,ECDO,SAAoBR,EAAIC,EAAMC,QAC5B,IAATD,IAAmBA,EAAO,SACT,IAAjBC,IAA2BA,EAAe,CAAEC,SAAS,IACzD,IAAIC,GAAa,IAAAC,QAAO,GACpBC,GAAY,EAAA6B,EAAA,KACZ3B,GAAK,IAAAC,UAASP,GAAeQ,EAAQF,EAAG,GAAIG,EAAMH,EAAG,GACrDI,GAAW,IAAAC,aAAY,WAEvB,IADA,IAAIC,EAAO,GACFC,EAAK,EAAGA,EAAKC,UAAUC,OAAQF,IACpCD,EAAKC,GAAMC,UAAUD,GAEzB,IAAIG,IAAWd,EAAWe,QAI1B,OAHKT,EAAMP,SACPQ,EAAI,SAAUS,GAAa,OAAQ,IAAAC,WAAS,IAAAA,UAAS,CAAC,EAAGD,GAAY,CAAEjB,SAAS,GAAU,GAEvFH,EAAGsB,WAAM,EAAQR,GAAMS,KAAK,SAAU5B,GAEzC,OADAW,KAAeY,IAAWd,EAAWe,SAAWR,EAAI,CAAEhB,MAAOA,EAAOQ,SAAS,IACtER,CACX,EAAG,SAAU6B,GAET,OADAlB,KAAeY,IAAWd,EAAWe,SAAWR,EAAI,CAAEa,MAAOA,EAAOrB,SAAS,IACtEqB,CACX,EACJ,EAAGvB,GACH,MAAO,CAACS,EAAOE,EACnB,CDvBawB,CAAWpC,EAAIC,EAAM,CAC1BE,SAAS,IACTO,EAAQF,EAAG,GAAII,EAAWJ,EAAG,GAIjC,OAHA,IAAAmB,WAAU,WACNf,GACJ,EAAG,CAACA,IACGF,CACX,C,sBETIkB,EAAyB,EAAQ,MAEjCC,EAA0B,EAAQ,OAKtCnC,EAAQ,OAAU,EAElB,IAAIoC,EAAQD,EAAwB,EAAQ,QAIxCE,GAAW,EAFMH,EAAuB,EAAQ,QAElBrB,SAAuBuB,EAAME,cAAc,OAAQ,CACnFC,EAAG,kFACD,UAEJvC,EAAQ,EAAUqC,C,sBCjBdH,EAAyB,EAAQ,MAEjCC,EAA0B,EAAQ,OAKtCnC,EAAQ,OAAU,EAElB,IAAIoC,EAAQD,EAAwB,EAAQ,QAIxCE,GAAW,EAFMH,EAAuB,EAAQ,QAElBrB,SAAuBuB,EAAME,cAAc,OAAQ,CACnFC,EAAG,8DACD,gBAEJvC,EAAQ,EAAUqC,C,sBCjBdH,EAAyB,EAAQ,MAEjCC,EAA0B,EAAQ,OAKtCnC,EAAQ,OAAU,EAElB,IAAIoC,EAAQD,EAAwB,EAAQ,QAIxCE,GAAW,EAFMH,EAAuB,EAAQ,QAElBrB,SAAuBuB,EAAME,cAAc,OAAQ,CACnFC,EAAG,iEACD,aAEJvC,EAAQ,EAAUqC,C,sBCjBdH,EAAyB,EAAQ,MAEjCC,EAA0B,EAAQ,OAKtCnC,EAAQ,OAAU,EAElB,IAAIoC,EAAQD,EAAwB,EAAQ,QAIxCE,GAAW,EAFMH,EAAuB,EAAQ,QAElBrB,SAAuBuB,EAAME,cAAc,OAAQ,CACnFC,EAAG,uDACD,WAEJvC,EAAQ,EAAUqC,C,wECnBlB,SAASM,EAAEC,GAAG,IAAIC,EAAEC,EAAEC,EAAE,GAAG,GAAG,iBAAiBH,GAAG,iBAAiBA,EAAEG,GAAGH,OAAO,GAAG,iBAAiBA,EAAE,GAAGI,MAAMC,QAAQL,GAAG,IAAIC,EAAE,EAAEA,EAAED,EAAErB,OAAOsB,IAAID,EAAEC,KAAKC,EAAEH,EAAEC,EAAEC,OAAOE,IAAIA,GAAG,KAAKA,GAAGD,QAAQ,IAAID,KAAKD,EAAEA,EAAEC,KAAKE,IAAIA,GAAG,KAAKA,GAAGF,GAAG,OAAOE,CAAC,CAA2H,QAAnH,WAAgB,IAAI,IAAIH,EAAEC,EAAEC,EAAE,EAAEC,EAAE,GAAGD,EAAExB,UAAUC,SAASqB,EAAEtB,UAAUwB,QAAQD,EAAEF,EAAEC,MAAMG,IAAIA,GAAG,KAAKA,GAAGF,GAAG,OAAOE,CAAC,E,oCCMjW,SAAe,EAAAG,EAAA,GAA4B,gBAAoB,OAAQ,CACrEX,EAAG,8OACD,mBCFJ,GAAe,EAAAW,EAAA,GAA4B,gBAAoB,OAAQ,CACrEX,EAAG,qFACD,yBCFJ,GAAe,EAAAW,EAAA,GAA4B,gBAAoB,OAAQ,CACrEX,EAAG,4KACD,gBCFJ,GAAe,EAAAW,EAAA,GAA4B,gBAAoB,OAAQ,CACrEX,EAAG,8MACD,gBCFJ,GAAe,EAAAW,EAAA,GAA4B,gBAAoB,OAAQ,CACrEX,EAAG,0GACD,S,0BC8IAY,EAAqB,CACvBC,QAAsB,gBAAoBC,EAAqB,CAC7DC,SAAU,YAEZC,QAAsB,gBAAoBC,EAA2B,CACnEF,SAAU,YAEZxB,MAAoB,gBAAoB2B,EAAkB,CACxDH,SAAU,YAEZI,KAAmB,gBAAoBC,EAAkB,CACvDL,SAAU,aAIVM,EAAoB,gBAAoBC,EAAW,CACrDP,SAAU,UAGRQ,EAAqB,aAAiB,SAAeC,EAAOC,GAC9D,IAAIC,EAASF,EAAME,OACfC,EAAWH,EAAMG,SACjBC,EAAUJ,EAAMI,QAChBC,EAAYL,EAAMK,UAClBC,EAAmBN,EAAMO,UACzBA,OAAiC,IAArBD,EAA8B,QAAUA,EACpDE,EAAQR,EAAMQ,MACdC,EAAOT,EAAMS,KACbC,EAAqBV,EAAMW,YAC3BA,OAAqC,IAAvBD,EAAgCtB,EAAqBsB,EACnEE,EAAUZ,EAAMY,QAChBC,EAAcb,EAAMc,KACpBA,OAAuB,IAAhBD,EAAyB,QAAUA,EAC1CE,EAAkBf,EAAMgB,SACxBA,OAA+B,IAApBD,EAA6B,UAAYA,EACpDE,EAAiBjB,EAAMkB,QACvBA,OAA6B,IAAnBD,EAA4B,WAAaA,EACnDE,GAAQ,OAAyBnB,EAAO,CAAC,SAAU,WAAY,UAAW,YAAa,YAAa,QAAS,OAAQ,cAAe,UAAW,OAAQ,WAAY,YAEvK,OAAoB,gBAAoBoB,EAAA,GAAO,OAAS,CACtDN,KAAMA,EACNO,QAAQ,EACRC,UAAW,EACXjB,UAAW,EAAKD,EAAQmB,KAAMnB,EAAQ,GAAGoB,OAAON,GAASM,QAAO,EAAAC,EAAA,GAAWjB,GAASQ,KAAaX,GACjGJ,IAAKA,GACJkB,IAAiB,IAATV,EAA8B,gBAAoB,MAAO,CAClEJ,UAAWD,EAAQK,MAClBA,GAAQE,EAAYK,IAAa5B,EAAmB4B,IAAa,KAAmB,gBAAoB,MAAO,CAChHX,UAAWD,EAAQsB,SAClBvB,GAAqB,MAAVD,EAA8B,gBAAoB,MAAO,CACrEG,UAAWD,EAAQF,QAClBA,GAAU,KAAgB,MAAVA,GAAkBU,EAAuB,gBAAoB,MAAO,CACrFP,UAAWD,EAAQF,QACL,gBAAoByB,EAAA,EAAY,CAC9CC,KAAM,QACN,aAAcrB,EACdsB,MAAOtB,EACPC,MAAO,UACPsB,QAASlB,GACRf,IAAS,KACd,GAkFA,SAAe,IAAAkC,YAtRK,SAAgBC,GAClC,IAAIC,EAAkC,UAAvBD,EAAME,QAAQC,KAAmB,EAAAC,OAAS,EAAAC,QACrDC,EAA4C,UAAvBN,EAAME,QAAQC,KAAmB,EAAAE,QAAU,EAAAD,OACpE,MAAO,CAELb,MAAM,OAAS,CAAC,EAAGS,EAAMO,WAAWC,MAAO,CACzCC,aAAcT,EAAMU,MAAMD,aAC1BE,gBAAiB,cACjBC,QAAS,OACTC,QAAS,aAIXC,gBAAiB,CACftC,MAAOyB,EAASD,EAAME,QAAQ7C,QAAQ0D,KAAM,IAC5CJ,gBAAiBL,EAAmBN,EAAME,QAAQ7C,QAAQ0D,KAAM,IAChE,UAAW,CACTvC,MAAOwB,EAAME,QAAQ7C,QAAQ0D,OAKjCC,aAAc,CACZxC,MAAOyB,EAASD,EAAME,QAAQvC,KAAKoD,KAAM,IACzCJ,gBAAiBL,EAAmBN,EAAME,QAAQvC,KAAKoD,KAAM,IAC7D,UAAW,CACTvC,MAAOwB,EAAME,QAAQvC,KAAKoD,OAK9BE,gBAAiB,CACfzC,MAAOyB,EAASD,EAAME,QAAQ1C,QAAQuD,KAAM,IAC5CJ,gBAAiBL,EAAmBN,EAAME,QAAQ1C,QAAQuD,KAAM,IAChE,UAAW,CACTvC,MAAOwB,EAAME,QAAQ1C,QAAQuD,OAKjCG,cAAe,CACb1C,MAAOyB,EAASD,EAAME,QAAQnE,MAAMgF,KAAM,IAC1CJ,gBAAiBL,EAAmBN,EAAME,QAAQnE,MAAMgF,KAAM,IAC9D,UAAW,CACTvC,MAAOwB,EAAME,QAAQnE,MAAMgF,OAK/BI,gBAAiB,CACf3C,MAAOyB,EAASD,EAAME,QAAQ7C,QAAQ0D,KAAM,IAC5CK,OAAQ,aAAa5B,OAAOQ,EAAME,QAAQ7C,QAAQ0D,MAClD,UAAW,CACTvC,MAAOwB,EAAME,QAAQ7C,QAAQ0D,OAKjCM,aAAc,CACZ7C,MAAOyB,EAASD,EAAME,QAAQvC,KAAKoD,KAAM,IACzCK,OAAQ,aAAa5B,OAAOQ,EAAME,QAAQvC,KAAKoD,MAC/C,UAAW,CACTvC,MAAOwB,EAAME,QAAQvC,KAAKoD,OAK9BO,gBAAiB,CACf9C,MAAOyB,EAASD,EAAME,QAAQ1C,QAAQuD,KAAM,IAC5CK,OAAQ,aAAa5B,OAAOQ,EAAME,QAAQ1C,QAAQuD,MAClD,UAAW,CACTvC,MAAOwB,EAAME,QAAQ1C,QAAQuD,OAKjCQ,cAAe,CACb/C,MAAOyB,EAASD,EAAME,QAAQnE,MAAMgF,KAAM,IAC1CK,OAAQ,aAAa5B,OAAOQ,EAAME,QAAQnE,MAAMgF,MAChD,UAAW,CACTvC,MAAOwB,EAAME,QAAQnE,MAAMgF,OAK/BS,cAAe,CACbhD,MAAO,OACPiD,WAAYzB,EAAMO,WAAWmB,iBAC7Bf,gBAAiBX,EAAME,QAAQ7C,QAAQ0D,MAIzCY,WAAY,CACVnD,MAAO,OACPiD,WAAYzB,EAAMO,WAAWmB,iBAC7Bf,gBAAiBX,EAAME,QAAQvC,KAAKoD,MAItCa,cAAe,CACbpD,MAAO,OACPiD,WAAYzB,EAAMO,WAAWmB,iBAC7Bf,gBAAiBX,EAAME,QAAQ1C,QAAQuD,MAIzCc,YAAa,CACXrD,MAAO,OACPiD,WAAYzB,EAAMO,WAAWmB,iBAC7Bf,gBAAiBX,EAAME,QAAQnE,MAAMgF,MAIvCtC,KAAM,CACJqD,YAAa,GACbjB,QAAS,QACTD,QAAS,OACTrD,SAAU,GACVwE,QAAS,IAIXrC,QAAS,CACPmB,QAAS,SAIX3C,OAAQ,CACN0C,QAAS,OACToB,WAAY,SACZC,WAAY,OACZC,YAAa,GACbJ,aAAc,GAGpB,EA+IkC,CAChCK,KAAM,YADR,CAEGpE,E,sBCpSC5B,EAAyB,EAAQ,MAEjCC,EAA0B,EAAQ,OAKtCnC,EAAQ,OAAU,EAElB,IAAIoC,EAAQD,EAAwB,EAAQ,QAIxCE,GAAW,EAFMH,EAAuB,EAAQ,QAElBrB,SAAuBuB,EAAME,cAAc,OAAQ,CACnFC,EAAG,yJACD,gBAEJvC,EAAQ,EAAUqC,C,kBCjBlB,IAAInC,EAAU,EAAQ,OAClBC,EAAU,EAAQ,OAClBgI,EAAejI,EAAQG,gBAAgB,EAAQ,OAWnDL,EAAQ,EAVR,SAAkBM,EAAIC,QACL,IAATA,IAAmBA,EAAO,IAC9B,IAAIO,EAAKqH,EAAatH,QAAQP,EAAIC,EAAM,CACpCE,SAAS,IACTO,EAAQF,EAAG,GAAII,EAAWJ,EAAG,GAIjC,OAHAX,EAAQ8B,UAAU,WACdf,GACJ,EAAG,CAACA,IACGF,CACX,C,oLCNA,MAAMoH,GAAY,IAAAC,YACftC,IAAU,CACTT,KAAM,CACJgD,SAAU,cACV1B,QAASb,EAAMwC,QAAQ,EAAG,EAAG,EAAG,MAElCC,SAAU,CACRC,OAAQ,EACRlE,MAAOwB,EAAME,QAAQyC,YAEvBC,MAAO,CACLpE,MAAOwB,EAAME,QAAQyC,cAGzB,CAAER,KAAM,wBAEV,SAASU,EAAW7E,GAClB,MAAM,KAAE8E,EAAI,MAAEjD,EAAK,QAAEC,GAAY9B,EAC3BI,EAAUiE,IAChB,OAAuB,IAAAU,MAAKC,EAAA,EAAK,CAAE7E,SAAU,EAC3B,IAAA8E,KAAIC,EAAA,EAAS,CAAC,IACd,IAAAD,KAAI,KAAM,CAAEE,GAAIL,EAAMhD,UAASsD,UAAW,OAAQjF,UAA0B,IAAA4E,MAAKC,EAAA,EAAK,CAAEpC,QAAS,OAAQoB,WAAY,SAAU3D,UAAWD,EAAQmB,KAAMpB,SAAU,EAChK,IAAA8E,KAAID,EAAA,EAAK,CAAE3E,UAAWD,EAAQqE,SAAUhB,WAAY,iBAAkB4B,EAAG,EAAGlF,UAA0B,IAAA8E,KAAIK,EAAA,EAAY,CAAEnF,UAA0B,IAAA8E,KAAI,SAAU,CAAE9E,SAAU0B,SAC5K,IAAAoD,KAAI,EAAAM,EAAW,CAAElF,UAAWD,EAAQwE,eAG1D,C,0BC7BA,MAAMY,GAAc,IAAAC,YAAW,CAACzF,EAAOC,KAAwB,IAAAgF,KAAI,KAAM,CAAEhF,SAAQD,EAAOQ,MAAO,aAC3FkF,GAAa,IAAAD,YAAW,CAACzF,EAAOC,KAAwB,IAAAgF,KAAIU,EAAA,EAAU,CAAE1F,MAAK2F,UAAWJ,KAAgBxF,K,qCCE9G,MAAM6F,EAAa7F,IACjB,MAAM,aAAE8F,GAAiB9F,GACnB,EAAElB,IAAM,OAAkB,KAChC,OAAKgH,EAE8B,iBAAjBA,GACO,IAAAb,KAAIK,EAAA,EAAY,CAAEnF,SAAUrB,EAAE,sBAAuB,CAAEgH,mBACpEA,EAAaC,MAKF,IAAAd,KAAIS,EAAY,CAAEP,GAAIW,EAAaC,KAAM7E,QAAS,YAAaf,SAAU2F,EAAa3B,QAJpF,IAAAc,KAAIK,EAAA,EAAY,CAAEnF,SAAUrB,EAAE,sBAAuB,CAC1EgH,aAAcA,EAAa3B,SALtB,MAUL6B,EAAgB,cAA6B,EAAAC,UACjD,WAAAC,CAAYlG,GACVmG,MAAMnG,GACNoG,KAAKnJ,MAAQ,CACXc,WAAO,EACPsI,eAAW,EAEf,CACA,iBAAAC,CAAkBvI,EAAOsI,GACvBE,QAAQxI,MAAM,yBAAyBA,IAAS,CAAEA,QAAOsI,cACzDD,KAAKI,SAAS,CAAEzI,QAAOsI,aACzB,CACA,MAAAI,GACE,MAAM,aAAEX,EAAY,SAAE3F,GAAaiG,KAAKpG,OAClC,MAAEjC,GAAUqI,KAAKnJ,MACvB,OAAKc,GAGkB,IAAAkH,KAAI,IAAY,CAAEpD,MAAO,uBAAwB9D,QAAOoC,UAA0B,IAAA8E,KAAIY,EAAW,CAAEC,mBAFjH3F,CAGX,GC9BI,GAAY,IAAAmE,YACftC,IAAU,CACT0E,UAAW,CACT7D,QAAS,EACT,eAAgB,CACd8D,cAAe,IAGnBC,mBAAoB,CAClBhE,QAAS,OACToB,WAAY,YAEd6C,OAAQ,CACNhE,QAASb,EAAMwC,QAAQ,EAAG,EAAG,EAAG,MAElCsC,YAAa,CACXrD,WAAYzB,EAAMO,WAAWwE,gBAE/BC,gBAAiB,CACfC,WAAYjF,EAAMwC,QAAQ,IAE5B0C,aAAc,CAAC,EACfC,aAAc,CAAC,EACfC,cAAe,CAAC,EAChBC,UAAW,CACTzE,QAAS,UAGb,CAAEuB,KAAM,sBAEJmD,GAAsB,IAAAvF,YACzBC,IAAU,CACTT,KAAM,CACJqB,QAAS,eACTC,QAASb,EAAMwC,QAAQ,EAAG,EAAG,EAAG,GAChC+C,MAAO,WAGX,CAAEpD,KAAM,wCARkB,CAS1BqD,EAAA,GACIC,EAAiB,CACrBC,KAAM,CACJC,KAAM,CACJ/E,QAAS,OACTgF,cAAe,UAEjBC,WAAY,CACVjF,QAAS,OACTgF,cAAe,SACfE,OAAQ,QAEVC,SAAU,CACRnF,QAAS,OACTgF,cAAe,SACfE,OAAQ,oBAERE,aAAc,OACdC,YAAa,aACb,eAAgB,CACdH,OAAQ,UAIdI,YAAa,CACXL,WAAY,CACVF,KAAM,GAERI,SAAU,CACRJ,KAAM,KAIZ,SAASQ,EAASnI,GAChB,MAAM,MACJ6B,EAAK,UACLwF,EAAS,QACTe,GAAU,EAAI,SACdC,EAAQ,aACRvC,EAAY,mBACZwC,EAAkB,QAClBpH,EAAO,aACPqH,EAAe,SAAQ,SACvBpI,EAAQ,YACRqI,EAAW,YACXC,EAAW,KACXhI,EAAI,OACJP,EAAM,iBACNwI,EAAgB,QAChBC,EAAO,cACPC,EAAa,gBACbC,EAAe,UACfxI,EAAS,UACTqG,EAAS,qBACToC,EAAoB,yBACpBC,GACE/I,EACEI,EAAU,IAChB,IAAI4I,EAAkB,CAAC,EACnBC,EAAsB,CAAC,EACvB/H,GACeA,EAAQgI,MAAM,UACtBC,QAAShF,IAChB6E,EAAkB,IACbA,KACAvB,EAAeC,KAAKvD,IAEzB8E,EAAsB,IACjBA,KACAxB,EAAeS,YAAY/D,MAIpC,MASMiF,EAAWd,IAAuBxC,EAAe,CAAEA,gBAAiB,CAAC,GAC3E,OAAuB,IAAAb,KAAIoE,EAAA,EAAM,CAAEC,MAAON,EAAiB3I,YAAWF,UAA0B,IAAA4E,MAAKiB,EAAe,IAAKoD,EAAUjJ,SAAU,CAC3I0B,IAAyB,IAAAoD,KACvBsE,EAAA,EACA,CACEnJ,QAAS,CACPmB,KAAM,IAAWnB,EAAQyG,QACzBhF,MAAOzB,EAAQ0G,YACfO,UAAWjH,EAAQ4G,gBACnBwC,OAAQpJ,EAAQ8G,aAChBhH,OAAQE,EAAQ+G,aAChBsC,QAASrJ,EAAQgH,eAEnBvF,QACAwF,UAtBCA,GAAc5G,GAGI,IAAAsE,MAAK,MAAO,CAAE,cAAe,sBAAuB5E,SAAU,CACnFkH,IAA6B,IAAApC,KAAI,MAAO,CAAE5E,UAAWD,EAAQiH,UAAWlH,SAAUkH,IAClF5G,KAJO,KAsBLP,SACAoJ,MAAO,IAAKd,GACZM,uBACAC,8BACGN,IAGPI,IAAmC,IAAA5D,KAAIqC,EAAqB,CAAEnH,SAAU0I,IACxET,IAA2B,IAAAnD,KAAIC,EAAA,EAAS,CAAC,IACzB,IAAAD,KACdyE,EAAA,EACA,CACErJ,UAAW,IAAWuI,EAAe,CACnC,CAACxI,EAAQsG,WAAYA,EACrB,CAACtG,EAAQwG,oBAAsC,WAAjB2B,IAEhCe,MAAOL,EACP9I,aAGJwI,IAA2B,IAAA1D,KAAIuC,EAAA,EAAa,CAAEnH,UAAWqI,EAAkBvI,SAAUwI,IACrFN,IAA4B,IAAApD,KAAIJ,EAAY,IAAKwD,QAErD,C","sources":["webpack://internal.plugin-kuadrant/../../node_modules/react-use/lib/useAsyncFn.js","webpack://internal.plugin-kuadrant/../../node_modules/react-use/lib/useMountedState.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/Add.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/../../node_modules/@material-ui/icons/Delete.js","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/Warning.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/lab/node_modules/clsx/dist/clsx.m.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/lab/esm/internal/svg-icons/SuccessOutlined.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/lab/esm/internal/svg-icons/ReportProblemOutlined.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/lab/esm/internal/svg-icons/ErrorOutline.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/lab/esm/internal/svg-icons/InfoOutlined.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/lab/esm/internal/svg-icons/Close.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/lab/esm/Alert/Alert.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/InfoOutlined.js","webpack://internal.plugin-kuadrant/../../node_modules/react-use/lib/useAsync.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\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar tslib_1 = require(\"tslib\");\nvar react_1 = require(\"react\");\nvar useMountedState_1 = tslib_1.__importDefault(require(\"./useMountedState\"));\nfunction useAsyncFn(fn, deps, initialState) {\n if (deps === void 0) { deps = []; }\n if (initialState === void 0) { initialState = { loading: false }; }\n var lastCallId = react_1.useRef(0);\n var isMounted = useMountedState_1.default();\n var _a = react_1.useState(initialState), state = _a[0], set = _a[1];\n var callback = react_1.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 (tslib_1.__assign(tslib_1.__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}\nexports.default = useAsyncFn;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar react_1 = require(\"react\");\nfunction useMountedState() {\n var mountedRef = react_1.useRef(false);\n var get = react_1.useCallback(function () { return mountedRef.current; }, []);\n react_1.useEffect(function () {\n mountedRef.current = true;\n return function () {\n mountedRef.current = false;\n };\n }, []);\n return get;\n}\nexports.default = useMountedState;\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: \"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"\n}), 'Add');\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","\"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: \"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\"\n}), 'Delete');\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 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: \"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"\n}), 'Warning');\n\nexports.default = _default;","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e))for(t=0;t<e.length;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f);else for(t in e)e[t]&&(n&&(n+=\" \"),n+=t);return n}export function clsx(){for(var e,t,f=0,n=\"\";f<arguments.length;)(e=arguments[f++])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","import * as React from 'react';\nimport { createSvgIcon } from '@material-ui/core/utils';\n/**\n * @ignore - internal component.\n */\n\nexport default createSvgIcon( /*#__PURE__*/React.createElement(\"path\", {\n 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\"\n}), 'SuccessOutlined');","import * as React from 'react';\nimport { createSvgIcon } from '@material-ui/core/utils';\n/**\n * @ignore - internal component.\n */\n\nexport default createSvgIcon( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12 5.99L19.53 19H4.47L12 5.99M12 2L1 21h22L12 2zm1 14h-2v2h2v-2zm0-6h-2v4h2v-4z\"\n}), 'ReportProblemOutlined');","import * as React from 'react';\nimport { createSvgIcon } from '@material-ui/core/utils';\n/**\n * @ignore - internal component.\n */\n\nexport default createSvgIcon( /*#__PURE__*/React.createElement(\"path\", {\n 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\"\n}), 'ErrorOutline');","import * as React from 'react';\nimport { createSvgIcon } from '@material-ui/core/utils';\n/**\n * @ignore - internal component.\n */\n\nexport default createSvgIcon( /*#__PURE__*/React.createElement(\"path\", {\n 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\"\n}), 'InfoOutlined');","import * as React from 'react';\nimport { createSvgIcon } from '@material-ui/core/utils';\n/**\n * @ignore - internal component.\n */\n\nexport default createSvgIcon( /*#__PURE__*/React.createElement(\"path\", {\n 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\"\n}), 'Close');","import _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport { withStyles, lighten, darken } from '@material-ui/core/styles';\nimport Paper from '@material-ui/core/Paper';\nimport SuccessOutlinedIcon from '../internal/svg-icons/SuccessOutlined';\nimport ReportProblemOutlinedIcon from '../internal/svg-icons/ReportProblemOutlined';\nimport ErrorOutlineIcon from '../internal/svg-icons/ErrorOutline';\nimport InfoOutlinedIcon from '../internal/svg-icons/InfoOutlined';\nimport CloseIcon from '../internal/svg-icons/Close';\nimport IconButton from '@material-ui/core/IconButton';\nimport { capitalize } from '@material-ui/core/utils';\nexport var styles = function styles(theme) {\n var getColor = theme.palette.type === 'light' ? darken : lighten;\n var getBackgroundColor = theme.palette.type === 'light' ? lighten : darken;\n return {\n /* Styles applied to the root element. */\n root: _extends({}, theme.typography.body2, {\n borderRadius: theme.shape.borderRadius,\n backgroundColor: 'transparent',\n display: 'flex',\n padding: '6px 16px'\n }),\n\n /* Styles applied to the root element if `variant=\"standard\"` and `color=\"success\"`. */\n standardSuccess: {\n color: getColor(theme.palette.success.main, 0.6),\n backgroundColor: getBackgroundColor(theme.palette.success.main, 0.9),\n '& $icon': {\n color: theme.palette.success.main\n }\n },\n\n /* Styles applied to the root element if `variant=\"standard\"` and `color=\"info\"`. */\n standardInfo: {\n color: getColor(theme.palette.info.main, 0.6),\n backgroundColor: getBackgroundColor(theme.palette.info.main, 0.9),\n '& $icon': {\n color: theme.palette.info.main\n }\n },\n\n /* Styles applied to the root element if `variant=\"standard\"` and `color=\"warning\"`. */\n standardWarning: {\n color: getColor(theme.palette.warning.main, 0.6),\n backgroundColor: getBackgroundColor(theme.palette.warning.main, 0.9),\n '& $icon': {\n color: theme.palette.warning.main\n }\n },\n\n /* Styles applied to the root element if `variant=\"standard\"` and `color=\"error\"`. */\n standardError: {\n color: getColor(theme.palette.error.main, 0.6),\n backgroundColor: getBackgroundColor(theme.palette.error.main, 0.9),\n '& $icon': {\n color: theme.palette.error.main\n }\n },\n\n /* Styles applied to the root element if `variant=\"outlined\"` and `color=\"success\"`. */\n outlinedSuccess: {\n color: getColor(theme.palette.success.main, 0.6),\n border: \"1px solid \".concat(theme.palette.success.main),\n '& $icon': {\n color: theme.palette.success.main\n }\n },\n\n /* Styles applied to the root element if `variant=\"outlined\"` and `color=\"info\"`. */\n outlinedInfo: {\n color: getColor(theme.palette.info.main, 0.6),\n border: \"1px solid \".concat(theme.palette.info.main),\n '& $icon': {\n color: theme.palette.info.main\n }\n },\n\n /* Styles applied to the root element if `variant=\"outlined\"` and `color=\"warning\"`. */\n outlinedWarning: {\n color: getColor(theme.palette.warning.main, 0.6),\n border: \"1px solid \".concat(theme.palette.warning.main),\n '& $icon': {\n color: theme.palette.warning.main\n }\n },\n\n /* Styles applied to the root element if `variant=\"outlined\"` and `color=\"error\"`. */\n outlinedError: {\n color: getColor(theme.palette.error.main, 0.6),\n border: \"1px solid \".concat(theme.palette.error.main),\n '& $icon': {\n color: theme.palette.error.main\n }\n },\n\n /* Styles applied to the root element if `variant=\"filled\"` and `color=\"success\"`. */\n filledSuccess: {\n color: '#fff',\n fontWeight: theme.typography.fontWeightMedium,\n backgroundColor: theme.palette.success.main\n },\n\n /* Styles applied to the root element if `variant=\"filled\"` and `color=\"info\"`. */\n filledInfo: {\n color: '#fff',\n fontWeight: theme.typography.fontWeightMedium,\n backgroundColor: theme.palette.info.main\n },\n\n /* Styles applied to the root element if `variant=\"filled\"` and `color=\"warning\"`. */\n filledWarning: {\n color: '#fff',\n fontWeight: theme.typography.fontWeightMedium,\n backgroundColor: theme.palette.warning.main\n },\n\n /* Styles applied to the root element if `variant=\"filled\"` and `color=\"error\"`. */\n filledError: {\n color: '#fff',\n fontWeight: theme.typography.fontWeightMedium,\n backgroundColor: theme.palette.error.main\n },\n\n /* Styles applied to the icon wrapper element. */\n icon: {\n marginRight: 12,\n padding: '7px 0',\n display: 'flex',\n fontSize: 22,\n opacity: 0.9\n },\n\n /* Styles applied to the message wrapper element. */\n message: {\n padding: '8px 0'\n },\n\n /* Styles applied to the action wrapper element if `action` is provided. */\n action: {\n display: 'flex',\n alignItems: 'center',\n marginLeft: 'auto',\n paddingLeft: 16,\n marginRight: -8\n }\n };\n};\nvar defaultIconMapping = {\n success: /*#__PURE__*/React.createElement(SuccessOutlinedIcon, {\n fontSize: \"inherit\"\n }),\n warning: /*#__PURE__*/React.createElement(ReportProblemOutlinedIcon, {\n fontSize: \"inherit\"\n }),\n error: /*#__PURE__*/React.createElement(ErrorOutlineIcon, {\n fontSize: \"inherit\"\n }),\n info: /*#__PURE__*/React.createElement(InfoOutlinedIcon, {\n fontSize: \"inherit\"\n })\n};\n\nvar _ref = /*#__PURE__*/React.createElement(CloseIcon, {\n fontSize: \"small\"\n});\n\nvar Alert = /*#__PURE__*/React.forwardRef(function Alert(props, ref) {\n var action = props.action,\n children = props.children,\n classes = props.classes,\n className = props.className,\n _props$closeText = props.closeText,\n closeText = _props$closeText === void 0 ? 'Close' : _props$closeText,\n color = props.color,\n icon = props.icon,\n _props$iconMapping = props.iconMapping,\n iconMapping = _props$iconMapping === void 0 ? defaultIconMapping : _props$iconMapping,\n onClose = props.onClose,\n _props$role = props.role,\n role = _props$role === void 0 ? 'alert' : _props$role,\n _props$severity = props.severity,\n severity = _props$severity === void 0 ? 'success' : _props$severity,\n _props$variant = props.variant,\n variant = _props$variant === void 0 ? 'standard' : _props$variant,\n other = _objectWithoutProperties(props, [\"action\", \"children\", \"classes\", \"className\", \"closeText\", \"color\", \"icon\", \"iconMapping\", \"onClose\", \"role\", \"severity\", \"variant\"]);\n\n return /*#__PURE__*/React.createElement(Paper, _extends({\n role: role,\n square: true,\n elevation: 0,\n className: clsx(classes.root, classes[\"\".concat(variant).concat(capitalize(color || severity))], className),\n ref: ref\n }, other), icon !== false ? /*#__PURE__*/React.createElement(\"div\", {\n className: classes.icon\n }, icon || iconMapping[severity] || defaultIconMapping[severity]) : null, /*#__PURE__*/React.createElement(\"div\", {\n className: classes.message\n }, children), action != null ? /*#__PURE__*/React.createElement(\"div\", {\n className: classes.action\n }, action) : null, action == null && onClose ? /*#__PURE__*/React.createElement(\"div\", {\n className: classes.action\n }, /*#__PURE__*/React.createElement(IconButton, {\n size: \"small\",\n \"aria-label\": closeText,\n title: closeText,\n color: \"inherit\",\n onClick: onClose\n }, _ref)) : null);\n});\nprocess.env.NODE_ENV !== \"production\" ? Alert.propTypes = {\n // ----------------------------- Warning --------------------------------\n // | These PropTypes are generated from the TypeScript type definitions |\n // | To update them edit the d.ts file and run \"yarn proptypes\" |\n // ----------------------------------------------------------------------\n\n /**\n * The action to display. It renders after the message, at the end of the alert.\n */\n action: PropTypes.node,\n\n /**\n * The content of the component.\n */\n children: PropTypes.node,\n\n /**\n * Override or extend the styles applied to the component.\n * See [CSS API](#css) below for more details.\n */\n classes: PropTypes.object,\n\n /**\n * @ignore\n */\n className: PropTypes.string,\n\n /**\n * Override the default label for the *close popup* icon button.\n *\n * For localization purposes, you can use the provided [translations](/guides/localization/).\n */\n closeText: PropTypes.string,\n\n /**\n * The main color for the alert. Unless provided, the value is taken from the `severity` prop.\n */\n color: PropTypes.oneOf(['error', 'info', 'success', 'warning']),\n\n /**\n * Override the icon displayed before the children.\n * Unless provided, the icon is mapped to the value of the `severity` prop.\n */\n icon: PropTypes.node,\n\n /**\n * The component maps the `severity` prop to a range of different icons,\n * for instance success to `<SuccessOutlined>`.\n * If you wish to change this mapping, you can provide your own.\n * Alternatively, you can use the `icon` prop to override the icon displayed.\n */\n iconMapping: PropTypes.shape({\n error: PropTypes.node,\n info: PropTypes.node,\n success: PropTypes.node,\n warning: PropTypes.node\n }),\n\n /**\n * Callback fired when the component requests to be closed.\n * When provided and no `action` prop is set, a close icon button is displayed that triggers the callback when clicked.\n *\n * @param {object} event The event source of the callback.\n */\n onClose: PropTypes.func,\n\n /**\n * The ARIA role attribute of the element.\n */\n role: PropTypes.string,\n\n /**\n * The severity of the alert. This defines the color and icon used.\n */\n severity: PropTypes.oneOf(['error', 'info', 'success', 'warning']),\n\n /**\n * The variant to use.\n */\n variant: PropTypes.oneOf(['filled', 'outlined', 'standard'])\n} : void 0;\nexport default withStyles(styles, {\n name: 'MuiAlert'\n})(Alert);","\"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: \"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\"\n}), 'InfoOutlined');\n\nexports.default = _default;","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar tslib_1 = require(\"tslib\");\nvar react_1 = require(\"react\");\nvar useAsyncFn_1 = tslib_1.__importDefault(require(\"./useAsyncFn\"));\nfunction useAsync(fn, deps) {\n if (deps === void 0) { deps = []; }\n var _a = useAsyncFn_1.default(fn, deps, {\n loading: true,\n }), state = _a[0], callback = _a[1];\n react_1.useEffect(function () {\n callback();\n }, [callback]);\n return state;\n}\nexports.default = useAsync;\n","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":["Object","defineProperty","exports","value","tslib_1","react_1","useMountedState_1","__importDefault","fn","deps","initialState","loading","lastCallId","useRef","isMounted","default","_a","useState","state","set","callback","useCallback","args","_i","arguments","length","callId","current","prevState","__assign","apply","then","error","mountedRef","get","useEffect","_interopRequireDefault","_interopRequireWildcard","React","_default","createElement","d","useAsync","useMountedState","useAsyncFn","r","e","t","f","n","Array","isArray","createSvgIcon","defaultIconMapping","success","SuccessOutlined","fontSize","warning","ReportProblemOutlined","ErrorOutline","info","InfoOutlined","_ref","Close","Alert","props","ref","action","children","classes","className","_props$closeText","closeText","color","icon","_props$iconMapping","iconMapping","onClose","_props$role","role","_props$severity","severity","_props$variant","variant","other","Paper","square","elevation","root","concat","capitalize","message","IconButton","size","title","onClick","withStyles","theme","getColor","palette","type","darken","lighten","getBackgroundColor","typography","body2","borderRadius","shape","backgroundColor","display","padding","standardSuccess","main","standardInfo","standardWarning","standardError","outlinedSuccess","border","outlinedInfo","outlinedWarning","outlinedError","filledSuccess","fontWeight","fontWeightMedium","filledInfo","filledWarning","filledError","marginRight","opacity","alignItems","marginLeft","paddingLeft","name","useAsyncFn_1","useStyles","makeStyles","maxWidth","spacing","boxTitle","margin","textSubtle","arrow","BottomLink","link","jsxs","Box","jsx","Divider","to","underline","m","Typography","A","LinkWrapper","forwardRef","LinkButton","Button","component","SlackLink","slackChannel","href","ErrorBoundary","Component","constructor","super","this","errorInfo","componentDidCatch","console","setState","render","noPadding","paddingBottom","contentAlignBottom","header","headerTitle","fontWeightBold","headerSubheader","paddingTop","headerAvatar","headerAction","headerContent","subheader","CardActionsTopRight","float","CardActions","VARIANT_STYLES","card","flex","flexDirection","fullHeight","height","gridItem","marginBottom","breakInside","cardContent","InfoCard","divider","deepLink","errorBoundaryProps","alignContent","headerStyle","headerProps","actionsClassName","actions","cardClassName","actionsTopRight","titleTypographyProps","subheaderTypographyProps","calculatedStyle","calculatedCardStyle","split","forEach","errProps","Card","style","CardHeader","avatar","content","CardContent"],"sourceRoot":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[3650],{16400:(e,n,t)=>{t.d(n,{tN:()=>r}),t(31085),t(26659);var a=t(64218);function r(){const e=(0,a.useVersionedContext)("entity-context");if(!e)throw new Error("Entity context is not available");const n=e.atVersion(1);if(!n)throw new Error("EntityContext v1 not available");if(!n.entity)throw new Error("useEntity hook is being called outside of an EntityLayout where the entity has not been loaded. If this is intentional, please use useAsyncEntity instead.");return{entity:n.entity}}(0,a.createVersionedContext)("entity-context")},18466:(e,n,t)=>{var a=t(4293),r=t(78920);n.A=void 0;var s=r(t(95478)),i=(0,a(t(74044)).default)(s.createElement("path",{d:"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"}),"Add");n.A=i},23650:(e,n,t)=>{t.r(n),t.d(n,{ApiKeyManagementTab:()=>U});var a=t(31085),r=t(95478),s=t(35015),i=t(26648),o=t(86687),l=t(42367),d=t(25010),c=t(10394),p=t(72501),u=t(31653),h=t(38605),m=t(67720),y=t(71677),v=t(29365),g=t(78467),A=t(42899),f=t(64947),x=t(76891),j=t(61477),b=t(46805),w=t(95061),k=t(48543),$=t(81215),C=t(26343),P=t(16249),S=t(93453),q=t(37757),E=t(22097),R=t(16400),I=t(32269),T=t(61524),z=t(93246),K=t(92399),B=t(18466),_=t(71407),H=t(99594),D=t(77225),N=t(39053),G=t(34955),V=t(46205),W=t(16397),M=t(63221);function L(e,n,t){const a=t?`${t} `:"";return{curl:`curl -X GET ${e} \\\n -H "Authorization: ${t?`${t} ${n}`:n}"`,nodejs:`const fetch = require('node-fetch');\n\nconst apiKey = '${n}';\nconst endpoint = '${e}';\n\nfetch(endpoint, {\n method: 'GET',\n headers: {\n 'Authorization': '${a}' + apiKey\n }\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,python:`import requests\n\napi_key = '${n}'\nendpoint = '${e}'\n\nheaders = {\n 'Authorization': '${a}' + api_key\n}\n\nresponse = requests.get(endpoint, headers=headers)\nprint(response.json())`,go:`package main\n\nimport (\n "fmt"\n "net/http"\n "io"\n)\n\nfunc main() {\n apiKey := "${n}"\n endpoint := "${e}"\n\n client := &http.Client{}\n req, _ := http.NewRequest("GET", endpoint, nil)\n req.Header.Add("Authorization", "${a}" + apiKey)\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println("Error:", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`}}const U=({namespace:e})=>{var n,t,U,X,F;const{entity:O}=(0,R.tN)(),J=(0,E.useApi)(E.configApiRef),Y=(0,E.useApi)(E.identityApiRef),Q=(0,E.useApi)(E.fetchApiRef),Z=(0,E.useApi)(E.alertApiRef),ee=J.getString("backend.baseUrl"),[ne,te]=(0,r.useState)(new Set),[ae,re]=(0,r.useState)(0),[se,ie]=(0,r.useState)(""),[oe,le]=(0,r.useState)(""),[de,ce]=(0,r.useState)(!1),[pe,ue]=(0,r.useState)(""),[he,me]=(0,r.useState)(""),[ye,ve]=(0,r.useState)(!1),[ge,Ae]=(0,r.useState)(null),[fe,xe]=(0,r.useState)(!1),[je,be]=(0,r.useState)(null),[we,ke]=(0,r.useState)(null),[$e,Ce]=(0,r.useState)(null),[Pe,Se]=(0,r.useState)(null),[qe,Ee]=(0,r.useState)(new Set),[Re,Ie]=(0,r.useState)({open:!1,request:null}),[Te,ze]=(0,r.useState)(new Map),[Ke,Be]=(0,r.useState)(new Set),[_e,He]=(0,r.useState)(new Set),[De,Ne]=(0,r.useState)(!1),[Ge,Ve]=(0,r.useState)(null),We=(null===(n=O.metadata.annotations)||void 0===n?void 0:n["kuadrant.io/apiproduct"])||O.metadata.name,Me=(null===(t=O.metadata.annotations)||void 0===t?void 0:t["kuadrant.io/namespace"])||e||"default";(0,s.A)(async()=>{const e=await Y.getBackstageIdentity(),n=await Y.getProfileInfo();ie(e.userEntityRef),le(n.email||"")},[Y]);const{value:Le,loading:Ue,error:Xe}=(0,s.A)(async()=>{const e=await Q.fetch(`${ee}/api/kuadrant/requests/my?namespace=${Me}`);if(!e.ok)throw new Error("failed to fetch requests");return((await e.json()).items||[]).filter(e=>e.spec.apiProductRef.name===We&&e.metadata.namespace===Me)},[We,Me,ae,Q,ee]),{value:Fe,loading:Oe,error:Je}=(0,s.A)(async()=>{var e;const n=await Q.fetch(`${ee}/api/kuadrant/apiproducts`);if(!n.ok)throw new Error("failed to fetch api products");return null===(e=(await n.json()).items)||void 0===e?void 0:e.find(e=>e.metadata.namespace===Me&&e.metadata.name===We)},[Me,We,Q]),Ye=Fe?`apiproduct:${Fe.metadata.namespace}/${Fe.metadata.name}`:void 0,{allowed:Qe,loading:Ze,error:en}=(0,V.l)(G.dp,Ye),{allowed:nn,loading:tn,error:an}=(0,V.l)(G.uL),{allowed:rn,loading:sn,error:on}=(0,V.l)(G.jH),{allowed:ln,loading:dn,error:cn}=(0,V.l)(G.q0),pn=()=>{ke(null),Ce(null)},un=()=>{$e&&(be($e),xe(!0),pn())},hn=()=>{if(!$e)return;const e=$e;pn(),Ie({open:!0,request:e})},mn=e=>{te(n=>{const t=new Set(n);return t.has(e)?t.delete(e):t.add(e),t})},yn=(0,r.useMemo)(()=>[{render:e=>{var n;const t=e.rowData;if(!(null==t||null===(n=t.metadata)||void 0===n?void 0:n.name))return(0,a.jsx)(c.A,{});const r=`${t.metadata.namespace}/${t.metadata.name}`,s=Te.get(r);return(0,a.jsx)(vn,{request:t,apiName:We,revealedApiKey:s})}}],[We,Te]),vn=({request:e,apiName:n,revealedApiKey:t})=>{var s,o,l;const[d,m]=(0,r.useState)(0),y=(null===(s=e.status)||void 0===s?void 0:s.apiHostname)||`${n}.apps.example.com`,v=t||"<your-api-key>",g=function(e,n,t){const a=`https://${n}/api/v1/endpoint`;return e?e.authorizationHeader?L(a,t,e.authorizationHeader.prefix||""):e.customHeader?function(e,n,t,a){return{curl:`curl -X GET ${e} \\\n -H "${t}: ${a?`${a}${n}`:n}"`,nodejs:`const fetch = require('node-fetch');\n\nconst apiKey = '${n}';\nconst endpoint = '${e}';\n\nfetch(endpoint, {\n method: 'GET',\n headers: {\n '${t}': '${a}' + apiKey\n }\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,python:`import requests\n\napi_key = '${n}'\nendpoint = '${e}'\n\nheaders = {\n '${t}': '${a}' + api_key\n}\n\nresponse = requests.get(endpoint, headers=headers)\nprint(response.json())`,go:`package main\n\nimport (\n "fmt"\n "net/http"\n "io"\n)\n\nfunc main() {\n apiKey := "${n}"\n endpoint := "${e}"\n\n client := &http.Client{}\n req, _ := http.NewRequest("GET", endpoint, nil)\n req.Header.Add("${t}", "${a}" + apiKey)\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println("Error:", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`}}(a,t,e.customHeader.name,e.customHeader.prefix||""):e.queryString?function(e,n,t){return{curl:`curl -X GET "${e}?${t}=${n}"`,nodejs:`const fetch = require('node-fetch');\n\nconst apiKey = '${n}';\nconst endpoint = '${e}?${t}=' + apiKey;\n\nfetch(endpoint, {\n method: 'GET'\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,python:`import requests\n\napi_key = '${n}'\nendpoint = '${e}'\n\nparams = {\n '${t}': api_key\n}\n\nresponse = requests.get(endpoint, params=params)\nprint(response.json())`,go:`package main\n\nimport (\n "fmt"\n "net/http"\n "io"\n)\n\nfunc main() {\n apiKey := "${n}"\n endpoint := "${e}?${t}=" + apiKey\n\n client := &http.Client{}\n req, _ := http.NewRequest("GET", endpoint, nil)\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println("Error:", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`}}(a,t,e.queryString.name):e.cookie?function(e,n,t){return{curl:`curl -X GET ${e} \\\n --cookie "${t}=${n}"`,nodejs:`const fetch = require('node-fetch');\n\nconst apiKey = '${n}';\nconst endpoint = '${e}';\n\nfetch(endpoint, {\n method: 'GET',\n headers: {\n 'Cookie': '${t}=' + apiKey\n }\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,python:`import requests\n\napi_key = '${n}'\nendpoint = '${e}'\n\ncookies = {\n '${t}': api_key\n}\n\nresponse = requests.get(endpoint, cookies=cookies)\nprint(response.json())`,go:`package main\n\nimport (\n "fmt"\n "net/http"\n "io"\n)\n\nfunc main() {\n apiKey := "${n}"\n endpoint := "${e}"\n\n client := &http.Client{}\n req, _ := http.NewRequest("GET", endpoint, nil)\n req.AddCookie(&http.Cookie{\n Name: "${t}",\n Value: apiKey,\n })\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println("Error:", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`}}(a,t,e.cookie.name):L(a,t,"Bearer"):L(a,t,"Bearer")}(null===(l=e.status)||void 0===l||null===(o=l.authScheme)||void 0===o?void 0:o.credentials,y,v);return(0,a.jsxs)(c.A,{p:3,bgcolor:"background.default",onClick:e=>e.stopPropagation(),children:[e.spec.useCase&&(0,a.jsxs)(c.A,{mb:3,children:[(0,a.jsx)(p.A,{variant:"h6",gutterBottom:!0,children:"Use Case"}),(0,a.jsx)(c.A,{p:2,bgcolor:"background.paper",borderRadius:1,border:"1px solid rgba(0, 0, 0, 0.12)",children:(0,a.jsx)(p.A,{variant:"body2",style:{whiteSpace:"pre-wrap",wordBreak:"break-word",overflowWrap:"break-word"},children:e.spec.useCase})})]}),(0,a.jsx)(p.A,{variant:"h6",gutterBottom:!0,children:"Usage Examples"}),(0,a.jsxs)(p.A,{variant:"body2",paragraph:!0,children:["Use these code examples to test the API with your"," ",e.spec.planTier," tier key."]}),(0,a.jsx)(c.A,{onClick:e=>e.stopPropagation(),children:(0,a.jsxs)(u.A,{value:d,onChange:(e,n)=>{e.stopPropagation(),m(n)},indicatorColor:"primary",children:[(0,a.jsx)(h.A,{label:"cURL",onClick:e=>e.stopPropagation()}),(0,a.jsx)(h.A,{label:"Node.js",onClick:e=>e.stopPropagation()}),(0,a.jsx)(h.A,{label:"Python",onClick:e=>e.stopPropagation()}),(0,a.jsx)(h.A,{label:"Go",onClick:e=>e.stopPropagation()})]})}),(0,a.jsxs)(c.A,{mt:2,children:[0===d&&(0,a.jsx)(i.z,{text:g.curl,language:"bash",showCopyCodeButton:!0}),1===d&&(0,a.jsx)(i.z,{text:g.nodejs,language:"javascript",showCopyCodeButton:!0}),2===d&&(0,a.jsx)(i.z,{text:g.python,language:"python",showCopyCodeButton:!0}),3===d&&(0,a.jsx)(i.z,{text:g.go,language:"go",showCopyCodeButton:!0})]})]})},gn=Xe||Je,An=en||an||on||cn;if(Ue||Oe||Ze||tn||sn||dn)return(0,a.jsx)(o.k,{});if(gn)return(0,a.jsx)(l._,{error:gn});if(An){const e=en?"kuadrant.apikey.create":an?"kuadrant.apikey.delete.own":on?"kuadrant.apikey.delete.all":cn?"kuadrant.apikey.update.own":"unknown";return(0,a.jsxs)(c.A,{p:2,children:[(0,a.jsxs)(p.A,{color:"error",children:["Unable to check permissions: ",An.message]}),(0,a.jsxs)(p.A,{variant:"body2",color:"textSecondary",children:["Permission: ",e]}),(0,a.jsx)(p.A,{variant:"body2",color:"textSecondary",children:"Please try again or contact your administrator"})]})}const fn=(Le||[]).filter(e=>!qe.has(e.metadata.name)),xn=(null==Fe||null===(U=Fe.status)||void 0===U?void 0:U.discoveredPlans)||[],jn=fn.filter(e=>{var n;return!(null===(n=e.status)||void 0===n?void 0:n.phase)||"Pending"===e.status.phase}),bn=fn.filter(e=>{var n;return"Approved"===(null===(n=e.status)||void 0===n?void 0:n.phase)}),wn=fn.filter(e=>{var n;return"Rejected"===(null===(n=e.status)||void 0===n?void 0:n.phase)}),kn=[{title:"Tier",field:"spec.planTier",render:e=>(0,a.jsx)(m.A,{label:e.spec.planTier,color:"primary",size:"small"})},{title:"Approved",field:"status.reviewedAt",render:e=>{var n;return(0,a.jsx)(p.A,{variant:"body2",children:(null===(n=e.status)||void 0===n?void 0:n.reviewedAt)?new Date(e.status.reviewedAt).toLocaleDateString():"-"})}},{title:"API Key",field:"status.secretRef",searchable:!1,filtering:!1,render:e=>{var n,t,r;const s=`${e.metadata.namespace}/${e.metadata.name}`,i=ne.has(e.metadata.name),o=Ke.has(s),l=Te.get(s),d=null===(t=e.status)||void 0===t||null===(n=t.secretRef)||void 0===n?void 0:n.name,u=!1!==(null===(r=e.status)||void 0===r?void 0:r.canReadSecret),h=_e.has(s)||!u;return d?h&&!l?(0,a.jsx)(y.Ay,{title:"This API key has already been viewed and cannot be retrieved again",children:(0,a.jsxs)(c.A,{display:"flex",alignItems:"center",children:[(0,a.jsx)(p.A,{variant:"body2",color:"textSecondary",style:{fontFamily:"monospace",marginRight:8},children:"Already viewed"}),(0,a.jsx)(T.A,{fontSize:"small",color:"disabled"})]})}):(0,a.jsxs)(c.A,{display:"flex",alignItems:"center",children:[(0,a.jsx)(p.A,{variant:"body2",style:{fontFamily:"monospace",marginRight:8},children:o?"Loading...":i&&l?l:"••••••••••••••••"}),i&&l&&(0,a.jsx)(y.Ay,{title:"Copy to clipboard",children:(0,a.jsx)(v.A,{size:"small",onClick:async()=>{l&&(await navigator.clipboard.writeText(l),Z.post({message:"API key copied to clipboard",severity:"success",display:"transient"}))},children:(0,a.jsx)(H.A,{fontSize:"small"})})}),(0,a.jsx)(y.Ay,{title:i?"Hide API key":"Reveal API key (one-time only)",children:(0,a.jsx)("span",{children:(0,a.jsx)(v.A,{size:"small",onClick:()=>{i?(((e,n)=>{const t=`${e}/${n}`;ze(e=>{const n=new Map(e);return n.delete(t),n})})(e.metadata.namespace,e.metadata.name),mn(e.metadata.name)):h||(Ve({namespace:e.metadata.namespace,name:e.metadata.name}),Ne(!0))},disabled:o||h&&!l,children:i?(0,a.jsx)(T.A,{}):(0,a.jsx)(I.A,{})})})})]}):(0,a.jsx)(p.A,{variant:"body2",color:"textSecondary",children:"Awaiting secret..."})}},{title:"",field:"actions",searchable:!1,filtering:!1,render:e=>{if(Pe===e.metadata.name)return(0,a.jsx)(g.A,{size:20});const n=e.spec.requestedBy.userId;return(0,V.W)(n,se,nn,rn)?(0,a.jsx)(v.A,{size:"small",onClick:n=>{n.stopPropagation();const t=n.currentTarget.getBoundingClientRect();ke({top:t.bottom,left:t.left}),Ce(e)},title:"Actions","aria-controls":we?"actions-menu":void 0,"aria-haspopup":"true",children:(0,a.jsx)(_.A,{})}):null}}],$n=[{title:"Status",field:"status.phase",render:e=>{var n;const t=(null===(n=e.status)||void 0===n?void 0:n.phase)||"Pending",r="Pending"===t;return(0,a.jsx)(m.A,{label:t,size:"small",icon:r?(0,a.jsx)(z.A,{}):(0,a.jsx)(K.A,{}),color:r?"default":"secondary"})}},{title:"Tier",field:"spec.planTier",render:e=>(0,a.jsx)(m.A,{label:e.spec.planTier,color:"primary",size:"small"})},{title:"Use Case",field:"spec.useCase",render:e=>e.spec.useCase?(0,a.jsx)(y.Ay,{title:e.spec.useCase,placement:"top",children:(0,a.jsx)(p.A,{variant:"body2",style:{maxWidth:"200px",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.spec.useCase})}):(0,a.jsx)(p.A,{variant:"body2",children:"-"})},{title:"Requested",field:"metadata.creationTimestamp",render:e=>(0,a.jsx)(p.A,{variant:"body2",children:e.metadata.creationTimestamp?new Date(e.metadata.creationTimestamp).toLocaleDateString():"-"})},{title:"Reviewed",field:"status.reviewedAt",render:e=>{var n;return(null===(n=e.status)||void 0===n?void 0:n.reviewedAt)?(0,a.jsx)(p.A,{variant:"body2",children:new Date(e.status.reviewedAt).toLocaleDateString()}):(0,a.jsx)(p.A,{variant:"body2",children:"-"})}},{title:"",field:"actions",searchable:!1,filtering:!1,render:e=>{var n;if(Pe===e.metadata.name)return(0,a.jsx)(g.A,{size:20});const t=!(null===(n=e.status)||void 0===n?void 0:n.phase)||"Pending"===e.status.phase,r=e.spec.requestedBy.userId,s=(0,V.W)(r,se,nn,rn);return t&&(ln&&r===se||s)?(0,a.jsx)(v.A,{size:"small",onClick:n=>{n.stopPropagation();const t=n.currentTarget.getBoundingClientRect();ke({top:t.bottom,left:t.left}),Ce(e)},title:"Actions","aria-controls":we?"actions-menu":void 0,"aria-haspopup":"true",children:(0,a.jsx)(_.A,{})}):null}}],Cn=$n.filter(e=>"Reviewed"!==e.title&&"Reason"!==e.title);return(0,a.jsxs)(c.A,{p:2,children:[(0,a.jsxs)(A.A,{container:!0,spacing:3,direction:"column",children:[Qe&&(0,a.jsx)(A.A,{item:!0,children:(0,a.jsxs)(c.A,{display:"flex",flexDirection:"column",alignItems:"flex-end",mb:2,children:[(0,a.jsx)(f.A,{variant:"contained",color:"primary",startIcon:(0,a.jsx)(B.A,{}),onClick:()=>ce(!0),disabled:0===xn.length,"data-testid":"request-api-access-button","data-plans-count":xn.length,children:"Request API Access"}),0===xn.length&&(0,a.jsx)(p.A,{variant:"caption",color:"textSecondary",style:{marginTop:4},"data-testid":"no-plans-message",children:Fe?(()=>{var e,n,t,a;const r=null===(n=Fe.status)||void 0===n||null===(e=n.conditions)||void 0===e?void 0:e.find(e=>"Ready"===e.type),s=null===(a=Fe.status)||void 0===a||null===(t=a.conditions)||void 0===t?void 0:t.find(e=>"PlanPolicyDiscovered"===e.type);return"True"!==(null==r?void 0:r.status)?`HTTPRoute not ready: ${(null==r?void 0:r.message)||"unknown"}`:"True"!==(null==s?void 0:s.status)?`No plans discovered: ${(null==s?void 0:s.message)||"no PlanPolicy found"}`:"No plans available"})():"API product not found"})]})}),0===jn.length&&0===wn.length&&0===bn.length&&(0,a.jsx)(A.A,{item:!0,children:(0,a.jsx)(c.A,{p:3,textAlign:"center",children:(0,a.jsx)(p.A,{variant:"body1",color:"textSecondary",children:"No API keys yet. Request access to get started."})})}),jn.length>0&&(0,a.jsx)(A.A,{item:!0,children:(0,a.jsx)(d.X,{title:"Pending Requests",options:{paging:jn.length>5,pageSize:20,search:!0,filtering:!0,debounceInterval:300,toolbar:!0,emptyRowsWhenPaging:!1},columns:Cn,data:jn})}),wn.length>0&&(0,a.jsx)(A.A,{item:!0,children:(0,a.jsx)(d.X,{title:"Rejected Requests",options:{paging:wn.length>5,pageSize:20,search:!0,filtering:!0,debounceInterval:300,toolbar:!0,emptyRowsWhenPaging:!1},columns:$n,data:wn})}),bn.length>0&&(0,a.jsx)(A.A,{item:!0,children:(0,a.jsx)(d.X,{title:"API Keys",options:{paging:bn.length>5,pageSize:20,search:!0,filtering:!0,debounceInterval:300,toolbar:!0,emptyRowsWhenPaging:!1},columns:kn,data:bn,detailPanel:yn},"api-keys-table")})]}),(0,a.jsxs)(x.A,{open:de,onClose:()=>ce(!1),maxWidth:"sm",fullWidth:!0,children:[(0,a.jsx)(j.A,{children:"Request API Access"}),(0,a.jsxs)(b.A,{children:[(0,a.jsxs)(c.A,{mb:2,p:1.5,bgcolor:"info.light",borderRadius:1,display:"flex",alignItems:"flex-start",style:{gap:8},children:[(0,a.jsx)(N.A,{color:"primary",fontSize:"small",style:{marginTop:2}}),(0,a.jsx)(p.A,{variant:"body2",children:"Your request will be reviewed by an API owner before access is granted."})]}),ge&&(0,a.jsx)(c.A,{mb:2,p:2,bgcolor:"error.main",color:"error.contrastText",borderRadius:1,children:(0,a.jsx)(p.A,{variant:"body2",children:ge})}),(0,a.jsxs)(w.A,{fullWidth:!0,margin:"normal",disabled:ye,"data-testid":"tier-select-form",children:[(0,a.jsx)(k.A,{id:"tier-select-label",children:"Select Tier"}),(0,a.jsx)($.A,{labelId:"tier-select-label","data-testid":"tier-select",value:pe,onChange:e=>ue(e.target.value),disabled:ye,children:xn.map(e=>{const n=Object.entries(e.limits||{}).map(([e,n])=>`${n} per ${e}`).join(", ");return(0,a.jsxs)(C.A,{value:e.tier,"data-testid":`tier-option-${e.tier}`,children:[e.tier," ",n?`(${n})`:""]},e.tier)})})]}),(0,a.jsx)(P.A,{label:"Use Case (optional)",placeholder:"Describe how you plan to use this API",multiline:!0,rows:3,fullWidth:!0,margin:"normal",value:he,onChange:e=>me(e.target.value),helperText:"Explain your intended use of this API for admin review",disabled:ye})]}),(0,a.jsxs)(S.A,{children:[(0,a.jsx)(f.A,{onClick:()=>ce(!1),disabled:ye,children:"Cancel"}),(0,a.jsx)(f.A,{onClick:async()=>{if(pe){ve(!0),Ae(null);try{const e=await Q.fetch(`${ee}/api/kuadrant/requests`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiProductName:We,namespace:Me,planTier:pe,useCase:he.trim()||"",userEmail:oe})});if(!e.ok){const n=await e.json().catch(()=>({}));throw new Error(n.error||`failed to create request: ${e.status}`)}Z.post({message:"API key requested successfully",severity:"success",display:"transient"}),ce(!1),ue(""),me(""),re(e=>e+1)}catch(e){const n=e instanceof Error?e.message:"unknown error occurred";Z.post({message:`Failed to request API key: ${n}`,severity:"error",display:"transient"}),Ae(n)}finally{ve(!1)}}},color:"primary",variant:"contained",disabled:!pe||ye,startIcon:ye?(0,a.jsx)(g.A,{size:16,color:"inherit"}):void 0,children:ye?"Submitting...":"Submit Request"})]})]}),(0,a.jsx)(q.A,{id:"actions-menu",open:Boolean(we),onClose:pn,anchorReference:"anchorPosition",anchorPosition:we||{top:0,left:0},children:$e&&(()=>{var e;const n=!(null===(e=$e.status)||void 0===e?void 0:e.phase)||"Pending"===$e.status.phase,t=$e.spec.requestedBy.userId,r=[];return ln&&t===se&&n&&r.push((0,a.jsx)(C.A,{onClick:un,children:"Edit"},"edit")),r.push((0,a.jsx)(C.A,{onClick:hn,children:"Delete"},"delete")),r})()}),je&&(0,a.jsx)(W.e,{open:fe,onClose:()=>{xe(!1),be(null)},onSuccess:()=>{re(e=>e+1),xe(!1),Z.post({message:"API key updated",severity:"success",display:"transient"}),be(null)},request:je,availablePlans:xn}),(0,a.jsx)(M.K,{open:Re.open,title:"Delete Request",description:`Are you sure you want to delete this ${"Approved"===(null===(F=Re.request)||void 0===F||null===(X=F.status)||void 0===X?void 0:X.phase)?"API key":"request"}?`,deleting:null!==Pe,onConfirm:async()=>{Re.request&&(await(async e=>{Ee(n=>new Set(n).add(e)),Se(e);try{if(!(await Q.fetch(`${ee}/api/kuadrant/requests/${Me}/${e}`,{method:"DELETE"})).ok)throw new Error("failed to delete request");Z.post({message:"API key deleted successfully",severity:"success",display:"transient"}),re(e=>e+1)}catch(n){const t=n instanceof Error?n.message:"unknown error occurred";Ee(n=>{const t=new Set(n);return t.delete(e),t}),Z.post({message:`Failed to delete API key: ${t}`,severity:"error",display:"transient"})}finally{Se(null)}})(Re.request.metadata.name),Ie({open:!1,request:null}))},onCancel:()=>{Ie({open:!1,request:null})}}),(0,a.jsxs)(x.A,{open:De,onClose:()=>{Ne(!1),Ve(null)},maxWidth:"sm",children:[(0,a.jsx)(j.A,{children:(0,a.jsxs)(c.A,{display:"flex",alignItems:"center",children:[(0,a.jsx)(D.A,{color:"primary",style:{marginRight:8}}),"View API Key"]})}),(0,a.jsxs)(b.A,{children:[(0,a.jsxs)(p.A,{variant:"body1",paragraph:!0,children:["This API key can only be viewed ",(0,a.jsx)("strong",{children:"once"}),". After you reveal it, you will not be able to retrieve it again."]}),(0,a.jsx)(p.A,{variant:"body2",color:"textSecondary",children:"Make sure to copy and store it securely before closing this view."})]}),(0,a.jsxs)(S.A,{children:[(0,a.jsx)(f.A,{onClick:()=>{Ne(!1),Ve(null)},children:"Cancel"}),(0,a.jsx)(f.A,{variant:"contained",color:"primary",onClick:()=>{Ge&&((async(e,n)=>{const t=`${e}/${n}`;if(!Ke.has(t)){Be(e=>new Set(e).add(t));try{const a=await Q.fetch(`${ee}/api/kuadrant/apikeys/${e}/${n}/secret`);if(a.ok){const e=await a.json();ze(n=>new Map(n).set(t,e.apiKey)),He(e=>new Set(e).add(t))}else 403===a.status&&(He(e=>new Set(e).add(t)),Z.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)}finally{Be(e=>{const n=new Set(e);return n.delete(t),n})}}})(Ge.namespace,Ge.name),mn(Ge.name)),Ne(!1),Ve(null)},children:"Reveal API Key"})]})]})]})}},39053:(e,n,t)=>{var a=t(4293),r=t(78920);n.A=void 0;var s=r(t(95478)),i=(0,a(t(74044)).default)(s.createElement("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"}),"Info");n.A=i},71407:(e,n,t)=>{var a=t(4293),r=t(78920);n.A=void 0;var s=r(t(95478)),i=(0,a(t(74044)).default)(s.createElement("path",{d:"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"}),"MoreVert");n.A=i},93246:(e,n,t)=>{var a=t(4293),r=t(78920);n.A=void 0;var s=r(t(95478)),i=(0,a(t(74044)).default)(s.createElement("path",{d:"M6 2v6h.01L6 8.01 10 12l-4 4 .01.01H6V22h12v-5.99h-.01L18 16l-4-4 4-3.99-.01-.01H18V2H6zm10 14.5V20H8v-3.5l4-4 4 4zm-4-5l-4-4V4h8v3.5l-4 4z"}),"HourglassEmpty");n.A=i}}]);
|
|
2
|
-
//# sourceMappingURL=3650.
|
|
1
|
+
"use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[3650],{16400:(e,n,t)=>{t.d(n,{tN:()=>r}),t(31085),t(26659);var a=t(64218);function r(){const e=(0,a.useVersionedContext)("entity-context");if(!e)throw new Error("Entity context is not available");const n=e.atVersion(1);if(!n)throw new Error("EntityContext v1 not available");if(!n.entity)throw new Error("useEntity hook is being called outside of an EntityLayout where the entity has not been loaded. If this is intentional, please use useAsyncEntity instead.");return{entity:n.entity}}(0,a.createVersionedContext)("entity-context")},18466:(e,n,t)=>{var a=t(4293),r=t(78920);n.A=void 0;var s=r(t(95478)),i=(0,a(t(74044)).default)(s.createElement("path",{d:"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"}),"Add");n.A=i},23650:(e,n,t)=>{t.r(n),t.d(n,{ApiKeyManagementTab:()=>U});var a=t(31085),r=t(95478),s=t(35015),i=t(26648),o=t(86687),l=t(42367),d=t(25010),c=t(10394),p=t(72501),u=t(31653),h=t(38605),m=t(67720),y=t(71677),v=t(29365),g=t(78467),A=t(42899),f=t(64947),x=t(76891),j=t(61477),b=t(46805),w=t(95061),k=t(48543),$=t(81215),C=t(26343),P=t(16249),S=t(93453),q=t(37757),E=t(22097),R=t(16400),I=t(32269),T=t(61524),z=t(93246),K=t(92399),B=t(18466),_=t(71407),H=t(99594),D=t(77225),N=t(39053),G=t(34955),V=t(46205),W=t(16397),M=t(63221);function L(e,n,t){const a=t?`${t} `:"";return{curl:`curl -X GET ${e} \\\n -H "Authorization: ${t?`${t} ${n}`:n}"`,nodejs:`const fetch = require('node-fetch');\n\nconst apiKey = '${n}';\nconst endpoint = '${e}';\n\nfetch(endpoint, {\n method: 'GET',\n headers: {\n 'Authorization': '${a}' + apiKey\n }\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,python:`import requests\n\napi_key = '${n}'\nendpoint = '${e}'\n\nheaders = {\n 'Authorization': '${a}' + api_key\n}\n\nresponse = requests.get(endpoint, headers=headers)\nprint(response.json())`,go:`package main\n\nimport (\n "fmt"\n "net/http"\n "io"\n)\n\nfunc main() {\n apiKey := "${n}"\n endpoint := "${e}"\n\n client := &http.Client{}\n req, _ := http.NewRequest("GET", endpoint, nil)\n req.Header.Add("Authorization", "${a}" + apiKey)\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println("Error:", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`}}const U=({namespace:e})=>{var n,t,U,X,F;const{entity:O}=(0,R.tN)(),J=(0,E.useApi)(E.configApiRef),Y=(0,E.useApi)(E.identityApiRef),Q=(0,E.useApi)(E.fetchApiRef),Z=(0,E.useApi)(E.alertApiRef),ee=J.getString("backend.baseUrl"),[ne,te]=(0,r.useState)(new Set),[ae,re]=(0,r.useState)(0),[se,ie]=(0,r.useState)(""),[oe,le]=(0,r.useState)(""),[de,ce]=(0,r.useState)(!1),[pe,ue]=(0,r.useState)(""),[he,me]=(0,r.useState)(""),[ye,ve]=(0,r.useState)(!1),[ge,Ae]=(0,r.useState)(null),[fe,xe]=(0,r.useState)(!1),[je,be]=(0,r.useState)(null),[we,ke]=(0,r.useState)(null),[$e,Ce]=(0,r.useState)(null),[Pe,Se]=(0,r.useState)(null),[qe,Ee]=(0,r.useState)(new Set),[Re,Ie]=(0,r.useState)({open:!1,request:null}),[Te,ze]=(0,r.useState)(new Map),[Ke,Be]=(0,r.useState)(new Set),[_e,He]=(0,r.useState)(new Set),[De,Ne]=(0,r.useState)(!1),[Ge,Ve]=(0,r.useState)(null),We=(null===(n=O.metadata.annotations)||void 0===n?void 0:n["kuadrant.io/apiproduct"])||O.metadata.name,Me=(null===(t=O.metadata.annotations)||void 0===t?void 0:t["kuadrant.io/namespace"])||e||"default";(0,s.A)(async()=>{const e=await Y.getBackstageIdentity(),n=await Y.getProfileInfo();ie(e.userEntityRef),le(n.email||"")},[Y]);const{value:Le,loading:Ue,error:Xe}=(0,s.A)(async()=>{const e=await Q.fetch(`${ee}/api/kuadrant/requests/my?namespace=${Me}`);if(!e.ok)throw new Error("failed to fetch requests");return((await e.json()).items||[]).filter(e=>e.spec.apiProductRef.name===We&&e.metadata.namespace===Me)},[We,Me,ae,Q,ee]),{value:Fe,loading:Oe,error:Je}=(0,s.A)(async()=>{var e;const n=await Q.fetch(`${ee}/api/kuadrant/apiproducts`);if(!n.ok)throw new Error("failed to fetch api products");return null===(e=(await n.json()).items)||void 0===e?void 0:e.find(e=>e.metadata.namespace===Me&&e.metadata.name===We)},[Me,We,Q]),Ye=Fe?`apiproduct:${Fe.metadata.namespace}/${Fe.metadata.name}`:void 0,{allowed:Qe,loading:Ze,error:en}=(0,V.l)(G.dp,Ye),{allowed:nn,loading:tn,error:an}=(0,V.l)(G.uL),{allowed:rn,loading:sn,error:on}=(0,V.l)(G.jH),{allowed:ln,loading:dn,error:cn}=(0,V.l)(G.q0),pn=()=>{ke(null),Ce(null)},un=()=>{$e&&(be($e),xe(!0),pn())},hn=()=>{if(!$e)return;const e=$e;pn(),Ie({open:!0,request:e})},mn=e=>{te(n=>{const t=new Set(n);return t.has(e)?t.delete(e):t.add(e),t})},yn=(0,r.useMemo)(()=>[{render:e=>{var n;const t=e.rowData;if(!(null==t||null===(n=t.metadata)||void 0===n?void 0:n.name))return(0,a.jsx)(c.A,{});const r=`${t.metadata.namespace}/${t.metadata.name}`,s=Te.get(r);return(0,a.jsx)(vn,{request:t,apiName:We,revealedApiKey:s})}}],[We,Te]),vn=({request:e,apiName:n,revealedApiKey:t})=>{var s,o,l;const[d,m]=(0,r.useState)(0),y=(null===(s=e.status)||void 0===s?void 0:s.apiHostname)||`${n}.apps.example.com`,v=t||"<your-api-key>",g=function(e,n,t){const a=`https://${n}/api/v1/endpoint`;return e?e.authorizationHeader?L(a,t,e.authorizationHeader.prefix||""):e.customHeader?function(e,n,t,a){return{curl:`curl -X GET ${e} \\\n -H "${t}: ${a?`${a}${n}`:n}"`,nodejs:`const fetch = require('node-fetch');\n\nconst apiKey = '${n}';\nconst endpoint = '${e}';\n\nfetch(endpoint, {\n method: 'GET',\n headers: {\n '${t}': '${a}' + apiKey\n }\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,python:`import requests\n\napi_key = '${n}'\nendpoint = '${e}'\n\nheaders = {\n '${t}': '${a}' + api_key\n}\n\nresponse = requests.get(endpoint, headers=headers)\nprint(response.json())`,go:`package main\n\nimport (\n "fmt"\n "net/http"\n "io"\n)\n\nfunc main() {\n apiKey := "${n}"\n endpoint := "${e}"\n\n client := &http.Client{}\n req, _ := http.NewRequest("GET", endpoint, nil)\n req.Header.Add("${t}", "${a}" + apiKey)\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println("Error:", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`}}(a,t,e.customHeader.name,e.customHeader.prefix||""):e.queryString?function(e,n,t){return{curl:`curl -X GET "${e}?${t}=${n}"`,nodejs:`const fetch = require('node-fetch');\n\nconst apiKey = '${n}';\nconst endpoint = '${e}?${t}=' + apiKey;\n\nfetch(endpoint, {\n method: 'GET'\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,python:`import requests\n\napi_key = '${n}'\nendpoint = '${e}'\n\nparams = {\n '${t}': api_key\n}\n\nresponse = requests.get(endpoint, params=params)\nprint(response.json())`,go:`package main\n\nimport (\n "fmt"\n "net/http"\n "io"\n)\n\nfunc main() {\n apiKey := "${n}"\n endpoint := "${e}?${t}=" + apiKey\n\n client := &http.Client{}\n req, _ := http.NewRequest("GET", endpoint, nil)\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println("Error:", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`}}(a,t,e.queryString.name):e.cookie?function(e,n,t){return{curl:`curl -X GET ${e} \\\n --cookie "${t}=${n}"`,nodejs:`const fetch = require('node-fetch');\n\nconst apiKey = '${n}';\nconst endpoint = '${e}';\n\nfetch(endpoint, {\n method: 'GET',\n headers: {\n 'Cookie': '${t}=' + apiKey\n }\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,python:`import requests\n\napi_key = '${n}'\nendpoint = '${e}'\n\ncookies = {\n '${t}': api_key\n}\n\nresponse = requests.get(endpoint, cookies=cookies)\nprint(response.json())`,go:`package main\n\nimport (\n "fmt"\n "net/http"\n "io"\n)\n\nfunc main() {\n apiKey := "${n}"\n endpoint := "${e}"\n\n client := &http.Client{}\n req, _ := http.NewRequest("GET", endpoint, nil)\n req.AddCookie(&http.Cookie{\n Name: "${t}",\n Value: apiKey,\n })\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println("Error:", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`}}(a,t,e.cookie.name):L(a,t,"Bearer"):L(a,t,"Bearer")}(null===(l=e.status)||void 0===l||null===(o=l.authScheme)||void 0===o?void 0:o.credentials,y,v);return(0,a.jsxs)(c.A,{p:3,bgcolor:"background.default",onClick:e=>e.stopPropagation(),children:[e.spec.useCase&&(0,a.jsxs)(c.A,{mb:3,children:[(0,a.jsx)(p.A,{variant:"h6",gutterBottom:!0,children:"Use Case"}),(0,a.jsx)(c.A,{p:2,bgcolor:"background.paper",borderRadius:1,border:"1px solid rgba(0, 0, 0, 0.12)",children:(0,a.jsx)(p.A,{variant:"body2",style:{whiteSpace:"pre-wrap",wordBreak:"break-word",overflowWrap:"break-word"},children:e.spec.useCase})})]}),(0,a.jsx)(p.A,{variant:"h6",gutterBottom:!0,children:"Usage Examples"}),(0,a.jsxs)(p.A,{variant:"body2",paragraph:!0,children:["Use these code examples to test the API with your"," ",e.spec.planTier," tier key."]}),(0,a.jsx)(c.A,{onClick:e=>e.stopPropagation(),children:(0,a.jsxs)(u.A,{value:d,onChange:(e,n)=>{e.stopPropagation(),m(n)},indicatorColor:"primary",children:[(0,a.jsx)(h.A,{label:"cURL",onClick:e=>e.stopPropagation()}),(0,a.jsx)(h.A,{label:"Node.js",onClick:e=>e.stopPropagation()}),(0,a.jsx)(h.A,{label:"Python",onClick:e=>e.stopPropagation()}),(0,a.jsx)(h.A,{label:"Go",onClick:e=>e.stopPropagation()})]})}),(0,a.jsxs)(c.A,{mt:2,children:[0===d&&(0,a.jsx)(i.z,{text:g.curl,language:"bash",showCopyCodeButton:!0}),1===d&&(0,a.jsx)(i.z,{text:g.nodejs,language:"javascript",showCopyCodeButton:!0}),2===d&&(0,a.jsx)(i.z,{text:g.python,language:"python",showCopyCodeButton:!0}),3===d&&(0,a.jsx)(i.z,{text:g.go,language:"go",showCopyCodeButton:!0})]})]})},gn=Xe||Je,An=en||an||on||cn;if(Ue||Oe||Ze||tn||sn||dn)return(0,a.jsx)(o.k,{});if(gn)return(0,a.jsx)(l._,{error:gn});if(An){const e=en?"kuadrant.apikey.create":an?"kuadrant.apikey.delete.own":on?"kuadrant.apikey.delete.all":cn?"kuadrant.apikey.update.own":"unknown";return(0,a.jsxs)(c.A,{p:2,children:[(0,a.jsxs)(p.A,{color:"error",children:["Unable to check permissions: ",An.message]}),(0,a.jsxs)(p.A,{variant:"body2",color:"textSecondary",children:["Permission: ",e]}),(0,a.jsx)(p.A,{variant:"body2",color:"textSecondary",children:"Please try again or contact your administrator"})]})}const fn=(Le||[]).filter(e=>!qe.has(e.metadata.name)),xn=(null==Fe||null===(U=Fe.status)||void 0===U?void 0:U.discoveredPlans)||[],jn=fn.filter(e=>{var n;return!(null===(n=e.status)||void 0===n?void 0:n.phase)||"Pending"===e.status.phase}),bn=fn.filter(e=>{var n;return"Approved"===(null===(n=e.status)||void 0===n?void 0:n.phase)}),wn=fn.filter(e=>{var n;return"Rejected"===(null===(n=e.status)||void 0===n?void 0:n.phase)}),kn=[{title:"Tier",field:"spec.planTier",render:e=>(0,a.jsx)(m.A,{label:e.spec.planTier,color:"primary",size:"small"})},{title:"Approved",field:"status.reviewedAt",render:e=>{var n;return(0,a.jsx)(p.A,{variant:"body2",children:(null===(n=e.status)||void 0===n?void 0:n.reviewedAt)?new Date(e.status.reviewedAt).toLocaleDateString():"-"})}},{title:"API Key",field:"status.secretRef",searchable:!1,filtering:!1,render:e=>{var n,t,r;const s=`${e.metadata.namespace}/${e.metadata.name}`,i=ne.has(e.metadata.name),o=Ke.has(s),l=Te.get(s),d=null===(t=e.status)||void 0===t||null===(n=t.secretRef)||void 0===n?void 0:n.name,u=!1!==(null===(r=e.status)||void 0===r?void 0:r.canReadSecret),h=_e.has(s)||!u;return d?h&&!l?(0,a.jsx)(y.Ay,{title:"This API key has already been viewed and cannot be retrieved again",children:(0,a.jsxs)(c.A,{display:"flex",alignItems:"center",children:[(0,a.jsx)(p.A,{variant:"body2",color:"textSecondary",style:{fontFamily:"monospace",marginRight:8},children:"Already viewed"}),(0,a.jsx)(T.A,{fontSize:"small",color:"disabled"})]})}):(0,a.jsxs)(c.A,{display:"flex",alignItems:"center",children:[(0,a.jsx)(p.A,{variant:"body2",style:{fontFamily:"monospace",marginRight:8},children:o?"Loading...":i&&l?l:"••••••••••••••••"}),i&&l&&(0,a.jsx)(y.Ay,{title:"Copy to clipboard",children:(0,a.jsx)(v.A,{size:"small",onClick:async()=>{l&&(await navigator.clipboard.writeText(l),Z.post({message:"API key copied to clipboard",severity:"success",display:"transient"}))},children:(0,a.jsx)(H.A,{fontSize:"small"})})}),(0,a.jsx)(y.Ay,{title:i?"Hide API key":"Reveal API key (one-time only)",children:(0,a.jsx)("span",{children:(0,a.jsx)(v.A,{size:"small",onClick:()=>{i?(((e,n)=>{const t=`${e}/${n}`;ze(e=>{const n=new Map(e);return n.delete(t),n})})(e.metadata.namespace,e.metadata.name),mn(e.metadata.name)):h||(Ve({namespace:e.metadata.namespace,name:e.metadata.name}),Ne(!0))},disabled:o||h&&!l,children:i?(0,a.jsx)(T.A,{}):(0,a.jsx)(I.A,{})})})})]}):(0,a.jsx)(p.A,{variant:"body2",color:"textSecondary",children:"Awaiting secret..."})}},{title:"",field:"actions",searchable:!1,filtering:!1,render:e=>{if(Pe===e.metadata.name)return(0,a.jsx)(g.A,{size:20});const n=e.spec.requestedBy.userId;return(0,V.W)(n,se,nn,rn)?(0,a.jsx)(v.A,{size:"small",onClick:n=>{n.stopPropagation();const t=n.currentTarget.getBoundingClientRect();ke({top:t.bottom,left:t.left}),Ce(e)},title:"Actions","aria-controls":we?"actions-menu":void 0,"aria-haspopup":"true",children:(0,a.jsx)(_.A,{})}):null}}],$n=[{title:"Status",field:"status.phase",render:e=>{var n;const t=(null===(n=e.status)||void 0===n?void 0:n.phase)||"Pending",r="Pending"===t;return(0,a.jsx)(m.A,{label:t,size:"small",icon:r?(0,a.jsx)(z.A,{}):(0,a.jsx)(K.A,{}),color:r?"default":"secondary"})}},{title:"Tier",field:"spec.planTier",render:e=>(0,a.jsx)(m.A,{label:e.spec.planTier,color:"primary",size:"small"})},{title:"Use Case",field:"spec.useCase",render:e=>e.spec.useCase?(0,a.jsx)(y.Ay,{title:e.spec.useCase,placement:"top",children:(0,a.jsx)(p.A,{variant:"body2",style:{maxWidth:"200px",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.spec.useCase})}):(0,a.jsx)(p.A,{variant:"body2",children:"-"})},{title:"Requested",field:"metadata.creationTimestamp",render:e=>(0,a.jsx)(p.A,{variant:"body2",children:e.metadata.creationTimestamp?new Date(e.metadata.creationTimestamp).toLocaleDateString():"-"})},{title:"Reviewed",field:"status.reviewedAt",render:e=>{var n;return(null===(n=e.status)||void 0===n?void 0:n.reviewedAt)?(0,a.jsx)(p.A,{variant:"body2",children:new Date(e.status.reviewedAt).toLocaleDateString()}):(0,a.jsx)(p.A,{variant:"body2",children:"-"})}},{title:"",field:"actions",searchable:!1,filtering:!1,render:e=>{var n;if(Pe===e.metadata.name)return(0,a.jsx)(g.A,{size:20});const t=!(null===(n=e.status)||void 0===n?void 0:n.phase)||"Pending"===e.status.phase,r=e.spec.requestedBy.userId,s=(0,V.W)(r,se,nn,rn);return t&&(ln&&r===se||s)?(0,a.jsx)(v.A,{size:"small",onClick:n=>{n.stopPropagation();const t=n.currentTarget.getBoundingClientRect();ke({top:t.bottom,left:t.left}),Ce(e)},title:"Actions","aria-controls":we?"actions-menu":void 0,"aria-haspopup":"true",children:(0,a.jsx)(_.A,{})}):null}}],Cn=$n.filter(e=>"Reviewed"!==e.title&&"Reason"!==e.title);return(0,a.jsxs)(c.A,{p:2,children:[(0,a.jsxs)(A.A,{container:!0,spacing:3,direction:"column",children:[Qe&&(0,a.jsx)(A.A,{item:!0,children:(0,a.jsxs)(c.A,{display:"flex",flexDirection:"column",alignItems:"flex-end",mb:2,children:[(0,a.jsx)(f.A,{variant:"contained",color:"primary",startIcon:(0,a.jsx)(B.A,{}),onClick:()=>ce(!0),disabled:0===xn.length,"data-testid":"request-api-access-button","data-plans-count":xn.length,children:"Request API Access"}),0===xn.length&&(0,a.jsx)(p.A,{variant:"caption",color:"textSecondary",style:{marginTop:4},"data-testid":"no-plans-message",children:Fe?(()=>{var e,n,t,a;const r=null===(n=Fe.status)||void 0===n||null===(e=n.conditions)||void 0===e?void 0:e.find(e=>"Ready"===e.type),s=null===(a=Fe.status)||void 0===a||null===(t=a.conditions)||void 0===t?void 0:t.find(e=>"PlanPolicyDiscovered"===e.type);return"True"!==(null==r?void 0:r.status)?`HTTPRoute not ready: ${(null==r?void 0:r.message)||"unknown"}`:"True"!==(null==s?void 0:s.status)?`No plans discovered: ${(null==s?void 0:s.message)||"no PlanPolicy found"}`:"No plans available"})():"API product not found"})]})}),0===jn.length&&0===wn.length&&0===bn.length&&(0,a.jsx)(A.A,{item:!0,children:(0,a.jsx)(c.A,{p:3,textAlign:"center",children:(0,a.jsx)(p.A,{variant:"body1",color:"textSecondary",children:"No API keys yet. Request access to get started."})})}),jn.length>0&&(0,a.jsx)(A.A,{item:!0,children:(0,a.jsx)(d.X,{title:"Pending Requests",options:{paging:jn.length>5,pageSize:20,search:!0,filtering:!0,debounceInterval:300,toolbar:!0,emptyRowsWhenPaging:!1},columns:Cn,data:jn})}),wn.length>0&&(0,a.jsx)(A.A,{item:!0,children:(0,a.jsx)(d.X,{title:"Rejected Requests",options:{paging:wn.length>5,pageSize:20,search:!0,filtering:!0,debounceInterval:300,toolbar:!0,emptyRowsWhenPaging:!1},columns:$n,data:wn})}),bn.length>0&&(0,a.jsx)(A.A,{item:!0,children:(0,a.jsx)(d.X,{title:"API Keys",options:{paging:bn.length>5,pageSize:20,search:!0,filtering:!0,debounceInterval:300,toolbar:!0,emptyRowsWhenPaging:!1},columns:kn,data:bn,detailPanel:yn},"api-keys-table")})]}),(0,a.jsxs)(x.A,{open:de,onClose:()=>ce(!1),maxWidth:"sm",fullWidth:!0,children:[(0,a.jsx)(j.A,{children:"Request API Access"}),(0,a.jsxs)(b.A,{children:[(0,a.jsxs)(c.A,{mb:2,p:1.5,bgcolor:"info.light",borderRadius:1,display:"flex",alignItems:"flex-start",style:{gap:8},children:[(0,a.jsx)(N.A,{color:"primary",fontSize:"small",style:{marginTop:2}}),(0,a.jsx)(p.A,{variant:"body2",children:"Your request will be reviewed by an API owner before access is granted."})]}),ge&&(0,a.jsx)(c.A,{mb:2,p:2,bgcolor:"error.main",color:"error.contrastText",borderRadius:1,children:(0,a.jsx)(p.A,{variant:"body2",children:ge})}),(0,a.jsxs)(w.A,{fullWidth:!0,margin:"normal",disabled:ye,"data-testid":"tier-select-form",children:[(0,a.jsx)(k.A,{id:"tier-select-label",children:"Select Tier"}),(0,a.jsx)($.A,{labelId:"tier-select-label","data-testid":"tier-select",value:pe,onChange:e=>ue(e.target.value),disabled:ye,children:xn.map(e=>{const n=Object.entries(e.limits||{}).map(([e,n])=>`${n} per ${e}`).join(", ");return(0,a.jsxs)(C.A,{value:e.tier,"data-testid":`tier-option-${e.tier}`,children:[e.tier," ",n?`(${n})`:""]},e.tier)})})]}),(0,a.jsx)(P.A,{label:"Use Case (optional)",placeholder:"Describe how you plan to use this API",multiline:!0,rows:3,fullWidth:!0,margin:"normal",value:he,onChange:e=>me(e.target.value),helperText:"Explain your intended use of this API for admin review",disabled:ye})]}),(0,a.jsxs)(S.A,{children:[(0,a.jsx)(f.A,{onClick:()=>ce(!1),disabled:ye,children:"Cancel"}),(0,a.jsx)(f.A,{onClick:async()=>{if(pe){ve(!0),Ae(null);try{const e=await Q.fetch(`${ee}/api/kuadrant/requests`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiProductName:We,namespace:Me,planTier:pe,useCase:he.trim()||"",userEmail:oe})});if(!e.ok){const n=await e.json().catch(()=>({}));throw new Error(n.error||`failed to create request: ${e.status}`)}Z.post({message:"API key requested successfully",severity:"success",display:"transient"}),ce(!1),ue(""),me(""),re(e=>e+1)}catch(e){const n=e instanceof Error?e.message:"unknown error occurred";Z.post({message:`Failed to request API key: ${n}`,severity:"error",display:"transient"}),Ae(n)}finally{ve(!1)}}},color:"primary",variant:"contained",disabled:!pe||ye,startIcon:ye?(0,a.jsx)(g.A,{size:16,color:"inherit"}):void 0,children:ye?"Submitting...":"Submit Request"})]})]}),(0,a.jsx)(q.A,{id:"actions-menu",open:Boolean(we),onClose:pn,anchorReference:"anchorPosition",anchorPosition:we||{top:0,left:0},children:$e&&(()=>{var e;const n=!(null===(e=$e.status)||void 0===e?void 0:e.phase)||"Pending"===$e.status.phase,t=$e.spec.requestedBy.userId,r=[];return ln&&t===se&&n&&r.push((0,a.jsx)(C.A,{onClick:un,children:"Edit"},"edit")),r.push((0,a.jsx)(C.A,{onClick:hn,children:"Delete"},"delete")),r})()}),je&&(0,a.jsx)(W.e,{open:fe,onClose:()=>{xe(!1),be(null)},onSuccess:()=>{re(e=>e+1),xe(!1),Z.post({message:"API key updated",severity:"success",display:"transient"}),be(null)},request:je,availablePlans:xn}),(0,a.jsx)(M.K,{open:Re.open,title:"Delete Request",description:`Are you sure you want to delete this ${"Approved"===(null===(F=Re.request)||void 0===F||null===(X=F.status)||void 0===X?void 0:X.phase)?"API key":"request"}?`,deleting:null!==Pe,onConfirm:async()=>{Re.request&&(await(async e=>{Ee(n=>new Set(n).add(e)),Se(e);try{if(!(await Q.fetch(`${ee}/api/kuadrant/requests/${Me}/${e}`,{method:"DELETE"})).ok)throw new Error("failed to delete request");Z.post({message:"API key deleted successfully",severity:"success",display:"transient"}),re(e=>e+1)}catch(n){const t=n instanceof Error?n.message:"unknown error occurred";Ee(n=>{const t=new Set(n);return t.delete(e),t}),Z.post({message:`Failed to delete API key: ${t}`,severity:"error",display:"transient"})}finally{Se(null)}})(Re.request.metadata.name),Ie({open:!1,request:null}))},onCancel:()=>{Ie({open:!1,request:null})}}),(0,a.jsxs)(x.A,{open:De,onClose:()=>{Ne(!1),Ve(null)},maxWidth:"sm",children:[(0,a.jsx)(j.A,{children:(0,a.jsxs)(c.A,{display:"flex",alignItems:"center",children:[(0,a.jsx)(D.A,{color:"primary",style:{marginRight:8}}),"View API Key"]})}),(0,a.jsxs)(b.A,{children:[(0,a.jsxs)(p.A,{variant:"body1",paragraph:!0,children:["This API key can only be viewed ",(0,a.jsx)("strong",{children:"once"}),". After you reveal it, you will not be able to retrieve it again."]}),(0,a.jsx)(p.A,{variant:"body2",color:"textSecondary",children:"Make sure to copy and store it securely before closing this view."})]}),(0,a.jsxs)(S.A,{children:[(0,a.jsx)(f.A,{onClick:()=>{Ne(!1),Ve(null)},children:"Cancel"}),(0,a.jsx)(f.A,{variant:"contained",color:"primary",onClick:()=>{Ge&&((async(e,n)=>{const t=`${e}/${n}`;if(!Ke.has(t)){Be(e=>new Set(e).add(t));try{const a=await Q.fetch(`${ee}/api/kuadrant/apikeys/${e}/${n}/secret`);if(a.ok){const e=await a.json();ze(n=>new Map(n).set(t,e.apiKey)),He(e=>new Set(e).add(t))}else 403===a.status&&(He(e=>new Set(e).add(t)),Z.post({message:"This API key has already been viewed and cannot be retrieved again.",severity:"warning",display:"transient"}))}catch(e){const n=e instanceof Error?e.message:"unknown error occurred";Z.post({message:`Failed to fetch api key: ${n}`,severity:"error",display:"transient"})}finally{Be(e=>{const n=new Set(e);return n.delete(t),n})}}})(Ge.namespace,Ge.name),mn(Ge.name)),Ne(!1),Ve(null)},children:"Reveal API Key"})]})]})]})}},39053:(e,n,t)=>{var a=t(4293),r=t(78920);n.A=void 0;var s=r(t(95478)),i=(0,a(t(74044)).default)(s.createElement("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"}),"Info");n.A=i},71407:(e,n,t)=>{var a=t(4293),r=t(78920);n.A=void 0;var s=r(t(95478)),i=(0,a(t(74044)).default)(s.createElement("path",{d:"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"}),"MoreVert");n.A=i},93246:(e,n,t)=>{var a=t(4293),r=t(78920);n.A=void 0;var s=r(t(95478)),i=(0,a(t(74044)).default)(s.createElement("path",{d:"M6 2v6h.01L6 8.01 10 12l-4 4 .01.01H6V22h12v-5.99h-.01L18 16l-4-4 4-3.99-.01-.01H18V2H6zm10 14.5V20H8v-3.5l4-4 4 4zm-4-5l-4-4V4h8v3.5l-4 4z"}),"HourglassEmpty");n.A=i}}]);
|
|
2
|
+
//# sourceMappingURL=3650.515c743a.chunk.js.map
|