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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/dist/components/ApprovalQueueTable/ApprovalQueueTable.esm.js +123 -6
  2. package/dist/components/ApprovalQueueTable/ApprovalQueueTable.esm.js.map +1 -1
  3. package/dist/components/CreateAPIProductDialog/CreateAPIProductDialog.esm.js +2 -2
  4. package/dist/components/CreateAPIProductDialog/CreateAPIProductDialog.esm.js.map +1 -1
  5. package/dist/components/EditAPIProductDialog/EditAPIProductDialog.esm.js +5 -23
  6. package/dist/components/EditAPIProductDialog/EditAPIProductDialog.esm.js.map +1 -1
  7. package/dist/components/PlanPolicyDetailsCard/PlanPolicyDetails.esm.js +4 -4
  8. package/dist/components/PlanPolicyDetailsCard/PlanPolicyDetails.esm.js.map +1 -1
  9. package/dist-scalprum/{internal.plugin-kuadrant.09545fa30927eb9a66fd.js → internal.plugin-kuadrant.114cbbe1d3ddb939d776.js} +2 -2
  10. package/dist-scalprum/{internal.plugin-kuadrant.09545fa30927eb9a66fd.js.map → internal.plugin-kuadrant.114cbbe1d3ddb939d776.js.map} +1 -1
  11. package/dist-scalprum/plugin-manifest.json +2 -2
  12. package/dist-scalprum/static/2821.0829f14d.chunk.js +2 -0
  13. package/dist-scalprum/static/2821.0829f14d.chunk.js.map +1 -0
  14. package/dist-scalprum/static/4682.75f17114.chunk.js +2 -0
  15. package/dist-scalprum/static/4682.75f17114.chunk.js.map +1 -0
  16. package/dist-scalprum/static/7236.f3886d59.chunk.js +2 -0
  17. package/dist-scalprum/static/7236.f3886d59.chunk.js.map +1 -0
  18. package/dist-scalprum/static/8799.939d14f9.chunk.js +2 -0
  19. package/dist-scalprum/static/8799.939d14f9.chunk.js.map +1 -0
  20. package/dist-scalprum/static/{exposed-PluginRoot.55777e36.chunk.js → exposed-PluginRoot.ed95fa78.chunk.js} +2 -2
  21. package/dist-scalprum/static/{exposed-PluginRoot.55777e36.chunk.js.map → exposed-PluginRoot.ed95fa78.chunk.js.map} +1 -1
  22. package/package.json +1 -1
  23. package/dist-scalprum/static/2821.972ae33b.chunk.js +0 -2
  24. package/dist-scalprum/static/2821.972ae33b.chunk.js.map +0 -1
  25. package/dist-scalprum/static/3091.9a74ea5f.chunk.js +0 -2
  26. package/dist-scalprum/static/3091.9a74ea5f.chunk.js.map +0 -1
  27. package/dist-scalprum/static/4682.51e5be13.chunk.js +0 -2
  28. package/dist-scalprum/static/4682.51e5be13.chunk.js.map +0 -1
  29. package/dist-scalprum/static/8799.52bbeef1.chunk.js +0 -2
  30. package/dist-scalprum/static/8799.52bbeef1.chunk.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static/4682.75f17114.chunk.js","mappings":"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","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/./src/components/FilterPanel/FilterPanel.tsx","webpack://internal.plugin-kuadrant/./src/components/MyApiKeysTable/MyApiKeysTable.tsx","webpack://internal.plugin-kuadrant/./src/components/ApprovalQueueTable/ApprovalQueueTable.tsx","webpack://internal.plugin-kuadrant/./src/components/ApiKeysPage/ApiKeysPage.tsx","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/ExpandLess.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/BrokenImage.js","webpack://internal.plugin-kuadrant/./src/components/PermissionGate/PermissionGate.tsx","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/Delete.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/core-components/dist/hooks/useSupportConfig.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/core-components/dist/icons/icons.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/core-components/dist/components/SupportButton/SupportButton.esm.js","webpack://internal.plugin-kuadrant/./src/utils/styles.ts","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/CheckCircle.js","webpack://internal.plugin-kuadrant/../../node_modules/react-use/lib/useAsync.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","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, { useState, useMemo } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport {\n Table,\n TableColumn,\n Link,\n Progress,\n ResponseErrorPanel,\n} from \"@backstage/core-components\";\nimport {\n useApi,\n configApiRef,\n fetchApiRef,\n alertApiRef,\n} from \"@backstage/core-plugin-api\";\nimport useAsync from \"react-use/lib/useAsync\";\nimport {\n Box,\n Chip,\n Typography,\n IconButton,\n Tooltip,\n Menu,\n MenuItem,\n CircularProgress,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Button,\n makeStyles,\n} from \"@material-ui/core\";\nimport VisibilityIcon from \"@material-ui/icons/Visibility\";\nimport VisibilityOffIcon from \"@material-ui/icons/VisibilityOff\";\nimport FileCopyIcon from \"@material-ui/icons/FileCopy\";\nimport WarningIcon from \"@material-ui/icons/Warning\";\nimport DeleteIcon from \"@material-ui/icons/Delete\";\nimport { EditAPIKeyDialog } from \"../EditAPIKeyDialog\";\nimport { ConfirmDeleteDialog } from \"../ConfirmDeleteDialog\";\nimport { FilterPanel, FilterSection, FilterState } from \"../FilterPanel\";\nimport { APIKey, APIProduct } from \"../../types/api-management\";\nimport { getStatusChipStyle } from \"../../utils/styles\";\nimport {handleFetchError} from \"../../utils/errors.ts\";\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 useCasePanel: {\n padding: theme.spacing(2),\n backgroundColor: theme.palette.background.default,\n },\n useCaseLabel: {\n fontWeight: 600,\n marginBottom: theme.spacing(1),\n color: theme.palette.text.secondary,\n textTransform: \"uppercase\",\n fontSize: \"0.75rem\",\n },\n rejectedBanner: {\n backgroundColor: theme.palette.error.light,\n border: `1px solid ${theme.palette.error.main}`,\n borderRadius: theme.shape.borderRadius,\n padding: theme.spacing(1.5, 2),\n marginBottom: theme.spacing(2),\n display: \"flex\",\n alignItems: \"center\",\n gap: theme.spacing(1),\n },\n}));\n\ninterface ExpandedRowProps {\n request: APIKey;\n}\n\nconst ExpandedRowContent = ({ request }: ExpandedRowProps) => {\n const classes = useStyles();\n const isRejected = request.status?.phase === \"Rejected\";\n const apiProductName = request.spec.apiProductRef?.name || \"unknown\";\n\n return (\n <Box className={classes.useCasePanel} onClick={(e) => e.stopPropagation()}>\n {isRejected && (\n <Box className={classes.rejectedBanner}>\n <WarningIcon color=\"error\" fontSize=\"small\" />\n <Typography variant=\"body2\">\n This API key was rejected.{\" \"}\n <Link to={`/catalog/default/api/${apiProductName}/api-keys`}>\n Request a new API key\n </Link>\n </Typography>\n </Box>\n )}\n <Typography className={classes.useCaseLabel}>Use Case</Typography>\n <Typography variant=\"body2\">\n {request.spec.useCase || \"No use case provided\"}\n </Typography>\n </Box>\n );\n};\n\nexport const MyApiKeysTable = () => {\n const classes = useStyles();\n const navigate = useNavigate();\n const config = useApi(configApiRef);\n const fetchApi = useApi(fetchApiRef);\n const alertApi = useApi(alertApiRef);\n const backendUrl = config.getString(\"backend.baseUrl\");\n\n const [visibleKeys, setVisibleKeys] = useState<Set<string>>(new Set());\n const [menuAnchor, setMenuAnchor] = useState<{\n top: number;\n left: number;\n } | null>(null);\n const [menuRequest, setMenuRequest] = useState<APIKey | null>(null);\n const [editDialogState, setEditDialogState] = useState<{\n open: boolean;\n request: APIKey | null;\n plans: any[];\n }>({ open: false, request: null, plans: [] });\n const [refresh, setRefresh] = useState(0);\n const [deleting, setDeleting] = useState<string | null>(null);\n const [deleteDialogState, setDeleteDialogState] = useState<{\n open: boolean;\n request: APIKey | null;\n }>({ open: false, request: null });\n const [apiKeyValues, setApiKeyValues] = useState<Map<string, string>>(\n new Map(),\n );\n const [apiKeyLoading, setApiKeyLoading] = useState<Set<string>>(new Set());\n const [alreadyReadKeys, setAlreadyReadKeys] = useState<Set<string>>(\n new Set(),\n );\n const [showOnceWarningOpen, setShowOnceWarningOpen] = useState(false);\n const [pendingKeyReveal, setPendingKeyReveal] = useState<{\n namespace: string;\n name: string;\n } | null>(null);\n const [optimisticallyDeleted, setOptimisticallyDeleted] = useState<\n Set<string>\n >(new Set());\n\n const [filters, setFilters] = useState<FilterState>({\n status: [],\n apiProduct: [],\n tier: [],\n });\n\n const {\n value: data,\n loading,\n error,\n } = useAsync(async () => {\n const [requestsResponse, productsResponse] = await Promise.all([\n fetchApi.fetch(`${backendUrl}/api/kuadrant/requests/my`),\n fetchApi.fetch(`${backendUrl}/api/kuadrant/apiproducts`),\n ]);\n\n if (!requestsResponse.ok) {\n throw new Error(\"failed to fetch requests\");\n }\n\n const requestsData = await requestsResponse.json();\n const requests: APIKey[] = requestsData.items || [];\n\n let products: APIProduct[] = [];\n if (productsResponse.ok) {\n const productsData = await productsResponse.json();\n products = productsData.items || [];\n }\n\n // build owner map from products\n const ownerMap = new Map<string, string>();\n products.forEach((p) => {\n const key = `${p.metadata.namespace}/${p.metadata.name}`;\n const owner = p.metadata.annotations?.[\"backstage.io/owner\"] || \"unknown\";\n ownerMap.set(key, owner);\n });\n\n return { requests, products, ownerMap };\n }, [backendUrl, fetchApi, refresh]);\n\n const allRequests = useMemo(() => {\n if (!data?.requests) return [];\n return data.requests.filter(\n (r: APIKey) => !optimisticallyDeleted.has(r.metadata.name),\n );\n }, [data?.requests, optimisticallyDeleted]);\n\n // filter options from data\n const filterSections: FilterSection[] = useMemo(() => {\n const statusCounts = { Approved: 0, Pending: 0, Rejected: 0 };\n const apiProductCounts = new Map<string, number>();\n const tierCounts = new Map<string, number>();\n\n allRequests.forEach((r: APIKey) => {\n const status = r.status?.phase || \"Pending\";\n statusCounts[status as keyof typeof statusCounts]++;\n\n const apiProduct = r.spec.apiProductRef?.name || \"unknown\";\n apiProductCounts.set(\n apiProduct,\n (apiProductCounts.get(apiProduct) || 0) + 1,\n );\n\n const tier = r.spec.planTier || \"unknown\";\n tierCounts.set(tier, (tierCounts.get(tier) || 0) + 1);\n });\n\n return [\n {\n id: \"status\",\n title: \"Status\",\n options: [\n { value: \"Approved\", label: \"Active\", count: statusCounts.Approved },\n { value: \"Pending\", label: \"Pending\", count: statusCounts.Pending },\n {\n value: \"Rejected\",\n label: \"Rejected\",\n count: statusCounts.Rejected,\n },\n ],\n },\n {\n id: \"apiProduct\",\n title: \"API Product\",\n options: Array.from(apiProductCounts.entries()).map(\n ([name, count]) => ({\n value: name,\n label: name,\n count,\n }),\n ),\n collapsed: apiProductCounts.size > 5,\n },\n {\n id: \"tier\",\n title: \"Tier\",\n options: Array.from(tierCounts.entries()).map(([tier, count]) => ({\n value: tier,\n label: tier.charAt(0).toUpperCase() + tier.slice(1),\n count,\n })),\n },\n ];\n }, [allRequests]);\n\n // filtered requests\n const filteredRequests = useMemo(() => {\n return allRequests.filter((r: APIKey) => {\n // status filter\n if (filters.status.length > 0) {\n const status = r.status?.phase || \"Pending\";\n if (!filters.status.includes(status)) return false;\n }\n\n // api product filter\n if (filters.apiProduct.length > 0) {\n const apiProduct = r.spec.apiProductRef?.name || \"unknown\";\n if (!filters.apiProduct.includes(apiProduct)) return false;\n }\n\n // tier filter\n if (filters.tier.length > 0) {\n const tier = r.spec.planTier || \"unknown\";\n if (!filters.tier.includes(tier)) return false;\n }\n\n return true;\n });\n }, [allRequests, filters]);\n\n const toggleKeyVisibility = (keyName: string) => {\n setVisibleKeys((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(keyName)) {\n newSet.delete(keyName);\n } else {\n newSet.add(keyName);\n }\n return newSet;\n });\n };\n\n const fetchApiKeyFromSecret = async (\n requestNamespace: string,\n requestName: string,\n ) => {\n const key = `${requestNamespace}/${requestName}`;\n if (apiKeyLoading.has(key)) return;\n\n setApiKeyLoading((prev) => new Set(prev).add(key));\n try {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/apikeys/${requestNamespace}/${requestName}/secret`,\n );\n if (response.ok) {\n const result = await response.json();\n setApiKeyValues((prev) => new Map(prev).set(key, result.apiKey));\n setAlreadyReadKeys((prev) => new Set(prev).add(key));\n } else if (response.status === 403) {\n setAlreadyReadKeys((prev) => new Set(prev).add(key));\n alertApi.post({\n message:\n \"This API key has already been viewed and cannot be retrieved again.\",\n severity: \"warning\",\n display: \"transient\",\n });\n }\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to fetch api key: ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\n } finally {\n setApiKeyLoading((prev) => {\n const next = new Set(prev);\n next.delete(key);\n return next;\n });\n }\n };\n\n const clearApiKeyValue = (requestNamespace: string, requestName: string) => {\n const key = `${requestNamespace}/${requestName}`;\n setApiKeyValues((prev) => {\n const next = new Map(prev);\n next.delete(key);\n return next;\n });\n };\n\n const handleMenuClose = () => {\n setMenuAnchor(null);\n setMenuRequest(null);\n };\n\n const handleEdit = async () => {\n if (!menuRequest) return;\n\n const request = menuRequest;\n handleMenuClose();\n\n try {\n const apiProductName = request.spec.apiProductRef?.name;\n const apiProductNamespace = request.metadata.namespace;\n const apiProductResponse = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/apiproducts/${apiProductNamespace}/${apiProductName}`,\n );\n\n if (apiProductResponse.ok) {\n const apiProduct = await apiProductResponse.json();\n const plans = apiProduct.spec?.plans || [];\n setEditDialogState({ open: true, request, plans });\n } else {\n setEditDialogState({ open: true, request, plans: [] });\n }\n } catch (err) {\n console.error(\"Error fetching plans:\", err);\n setEditDialogState({ open: true, request, plans: [] });\n const errorMessage = err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to fetch Plans. ${errorMessage}`,\n severity: 'error',\n display: 'transient',\n });\n }\n };\n\n const handleDeleteClick = () => {\n if (!menuRequest) return;\n const request = menuRequest;\n handleMenuClose();\n setDeleteDialogState({ open: true, request });\n };\n\n const handleDeleteConfirm = async () => {\n if (!deleteDialogState.request) return;\n\n const request = deleteDialogState.request;\n const requestName = request.metadata.name;\n\n setOptimisticallyDeleted((prev) => new Set(prev).add(requestName));\n setDeleting(requestName);\n\n try {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/requests/${request.metadata.namespace}/${request.metadata.name}`,\n { method: \"DELETE\" },\n );\n\n if (!response.ok) {\n const err = await handleFetchError(response);\n throw new Error(`Failed to delete request. ${err}`);\n }\n\n setRefresh((r) => r + 1);\n alertApi.post({\n message: \"API key deleted\",\n severity: \"success\",\n display: \"transient\",\n });\n setDeleteDialogState({ open: false, request: null });\n } catch (err) {\n console.error(\"Error deleting request:\", err);\n setOptimisticallyDeleted((prev) => {\n const next = new Set(prev);\n next.delete(requestName);\n return next;\n });\n const errorMessage = err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to delete APIKey. ${errorMessage}`,\n severity: 'error',\n display: 'transient',\n });\n } finally {\n setDeleting(null);\n }\n };\n\n const handleDeleteCancel = () => {\n setDeleteDialogState({ open: false, request: null });\n };\n\n const columns: TableColumn<APIKey>[] = [\n {\n title: \"API Product\",\n field: \"spec.apiProductRef.name\",\n render: (row: APIKey) => {\n const apiProductName = row.spec.apiProductRef?.name || \"unknown\";\n return (\n <Link to={`/catalog/default/api/${apiProductName}/api-keys`}>\n <strong>{apiProductName}</strong>\n </Link>\n );\n },\n },\n {\n title: \"Owner\",\n field: \"owner\",\n render: (row: APIKey) => {\n const key = `${row.metadata.namespace}/${row.spec.apiProductRef?.name}`;\n const owner = data?.ownerMap?.get(key) || \"unknown\";\n // strip 'user:default/' prefix if present\n const displayOwner = owner.replace(/^user:default\\//, \"\");\n return <Typography variant=\"body2\">{displayOwner}</Typography>;\n },\n },\n {\n title: \"Status\",\n field: \"status.phase\",\n render: (row: APIKey) => {\n const phase = row.status?.phase || \"Pending\";\n const label = phase === \"Approved\" ? \"Active\" : phase;\n return (\n <Chip label={label} size=\"small\" style={getStatusChipStyle(phase)} />\n );\n },\n },\n {\n title: \"Tier\",\n field: \"spec.planTier\",\n render: (row: APIKey) => (\n <Chip label={row.spec.planTier} size=\"small\" variant=\"outlined\" />\n ),\n },\n {\n title: \"API Key\",\n field: \"status.secretRef\",\n filtering: false,\n render: (row: APIKey) => {\n if (row.status?.phase !== \"Approved\") {\n return (\n <Typography variant=\"body2\" color=\"textSecondary\">\n -\n </Typography>\n );\n }\n\n const key = `${row.metadata.namespace}/${row.metadata.name}`;\n const hasSecretRef = row.status?.secretRef?.name;\n const isVisible = visibleKeys.has(row.metadata.name);\n const isLoading = apiKeyLoading.has(key);\n const apiKeyValue = apiKeyValues.get(key);\n const canReadSecret = row.status?.canReadSecret !== false;\n const isAlreadyRead = alreadyReadKeys.has(key) || !canReadSecret;\n\n if (!hasSecretRef) {\n return (\n <Typography variant=\"body2\" color=\"textSecondary\">\n Awaiting secret...\n </Typography>\n );\n }\n\n if (isAlreadyRead && !apiKeyValue) {\n return (\n <Tooltip title=\"This API key has already been viewed and cannot be retrieved again\">\n <Box display=\"flex\" alignItems=\"center\">\n <Typography\n variant=\"body2\"\n color=\"textSecondary\"\n style={{ fontFamily: \"monospace\", marginRight: 8 }}\n >\n Already viewed\n </Typography>\n <VisibilityOffIcon fontSize=\"small\" color=\"disabled\" />\n </Box>\n </Tooltip>\n );\n }\n\n const handleRevealClick = () => {\n if (isVisible) {\n clearApiKeyValue(row.metadata.namespace, row.metadata.name);\n toggleKeyVisibility(row.metadata.name);\n } else if (!isAlreadyRead) {\n setPendingKeyReveal({\n namespace: row.metadata.namespace,\n name: row.metadata.name,\n });\n setShowOnceWarningOpen(true);\n }\n };\n\n const handleCopy = async () => {\n if (apiKeyValue) {\n await navigator.clipboard.writeText(apiKeyValue);\n alertApi.post({\n message: \"API key copied to clipboard\",\n severity: \"success\",\n display: \"transient\",\n });\n }\n };\n\n return (\n <Box display=\"flex\" alignItems=\"center\" style={{ gap: 8 }}>\n <Box fontFamily=\"monospace\" fontSize=\"0.875rem\">\n {isLoading\n ? \"Loading...\"\n : isVisible && apiKeyValue\n ? apiKeyValue\n : \"•\".repeat(20) + \"...\"}\n </Box>\n {isVisible && apiKeyValue && (\n <Tooltip title=\"Copy to clipboard\">\n <IconButton size=\"small\" onClick={handleCopy}>\n <FileCopyIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n <Tooltip\n title={\n isVisible ? \"Hide API key\" : \"Reveal API key (one-time only)\"\n }\n >\n <span>\n <IconButton\n size=\"small\"\n onClick={handleRevealClick}\n disabled={isLoading || (isAlreadyRead && !apiKeyValue)}\n >\n {isVisible ? (\n <VisibilityOffIcon fontSize=\"small\" />\n ) : (\n <VisibilityIcon fontSize=\"small\" />\n )}\n </IconButton>\n </span>\n </Tooltip>\n </Box>\n );\n },\n },\n {\n title: \"Requested\",\n field: \"metadata.creationTimestamp\",\n render: (row: APIKey) => {\n if (!row.metadata.creationTimestamp) {\n return <Typography variant=\"body2\">-</Typography>;\n }\n const date = new Date(row.metadata.creationTimestamp);\n return (\n <Typography variant=\"body2\">{date.toLocaleDateString()}</Typography>\n );\n },\n },\n {\n title: \"Actions\",\n filtering: false,\n width: \"100px\",\n render: (row: APIKey) => {\n const isDeleting = deleting === row.metadata.name;\n if (isDeleting) {\n return <CircularProgress size={20} />;\n }\n return (\n <Box display=\"flex\" style={{ gap: 4 }}>\n <Tooltip title=\"View details\">\n <IconButton\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n navigate(\n `/kuadrant/api-keys/${row.metadata.namespace}/${row.metadata.name}`,\n );\n }}\n >\n <VisibilityIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n <Tooltip title=\"Delete\">\n <IconButton\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n setDeleteDialogState({ open: true, request: row });\n }}\n >\n <DeleteIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n </Box>\n );\n },\n },\n ];\n\n const detailPanelConfig = useMemo(\n () => [\n {\n render: (data: any) => {\n const request = data.rowData as APIKey;\n if (!request?.metadata?.name) {\n return <Box />;\n }\n return <ExpandedRowContent request={request} />;\n },\n },\n ],\n [],\n );\n\n if (loading) {\n return <Progress />;\n }\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n const isPending = (row: APIKey) =>\n !row.status || row.status.phase === \"Pending\";\n\n return (\n <>\n <Box className={classes.container}>\n <FilterPanel\n sections={filterSections}\n filters={filters}\n onChange={setFilters}\n />\n <Box className={classes.tableContainer}>\n {filteredRequests.length === 0 ? (\n <Box p={4} textAlign=\"center\">\n <Typography variant=\"body1\" color=\"textSecondary\">\n {allRequests.length === 0\n ? \"No API keys found. Request access to an API to get started.\"\n : \"No API keys match the selected filters.\"}\n </Typography>\n </Box>\n ) : (\n <Table\n options={{\n paging: filteredRequests.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={filteredRequests.map((item: APIKey) => ({\n ...item,\n id: item.metadata.name,\n }))}\n detailPanel={detailPanelConfig}\n />\n )}\n </Box>\n </Box>\n\n <Menu\n id=\"myapikeys-menu\"\n open={Boolean(menuAnchor)}\n onClose={handleMenuClose}\n anchorReference=\"anchorPosition\"\n anchorPosition={menuAnchor || { top: 0, left: 0 }}\n >\n {menuRequest &&\n (() => {\n const items = [];\n items.push(\n <MenuItem\n key=\"view\"\n onClick={() => {\n navigate(\n `/kuadrant/api-keys/${menuRequest.metadata.namespace}/${menuRequest.metadata.name}`,\n );\n handleMenuClose();\n }}\n >\n View Details\n </MenuItem>,\n );\n if (isPending(menuRequest)) {\n items.push(\n <MenuItem key=\"edit\" onClick={handleEdit}>\n Edit\n </MenuItem>,\n );\n }\n items.push(\n <MenuItem key=\"delete\" onClick={handleDeleteClick}>\n Delete\n </MenuItem>,\n );\n return items;\n })()}\n </Menu>\n\n {editDialogState.request && (\n <EditAPIKeyDialog\n open={editDialogState.open}\n request={editDialogState.request}\n availablePlans={editDialogState.plans}\n onClose={() =>\n setEditDialogState({ open: false, request: null, plans: [] })\n }\n onSuccess={() => {\n setEditDialogState({ open: false, request: null, plans: [] });\n setRefresh((r) => r + 1);\n }}\n />\n )}\n\n <ConfirmDeleteDialog\n open={deleteDialogState.open}\n title=\"Delete API Key\"\n description={`Are you sure you want to delete this API key for ${deleteDialogState.request?.spec.apiProductRef?.name || \"this API\"}?`}\n deleting={deleting !== null}\n onConfirm={handleDeleteConfirm}\n onCancel={handleDeleteCancel}\n />\n\n <Dialog\n open={showOnceWarningOpen}\n onClose={() => {\n setShowOnceWarningOpen(false);\n setPendingKeyReveal(null);\n }}\n maxWidth=\"sm\"\n >\n <DialogTitle>\n <Box display=\"flex\" alignItems=\"center\">\n <WarningIcon color=\"primary\" style={{ marginRight: 8 }} />\n View API Key\n </Box>\n </DialogTitle>\n <DialogContent>\n <Typography variant=\"body1\" paragraph>\n This API key can only be viewed <strong>once</strong>. After you\n reveal it, you will not be able to retrieve it again.\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Make sure to copy and store it securely before closing this view.\n </Typography>\n </DialogContent>\n <DialogActions>\n <Button\n onClick={() => {\n setShowOnceWarningOpen(false);\n setPendingKeyReveal(null);\n }}\n >\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={() => {\n if (pendingKeyReveal) {\n fetchApiKeyFromSecret(\n pendingKeyReveal.namespace,\n pendingKeyReveal.name,\n );\n toggleKeyVisibility(pendingKeyReveal.name);\n }\n setShowOnceWarningOpen(false);\n setPendingKeyReveal(null);\n }}\n >\n Reveal API Key\n </Button>\n </DialogActions>\n </Dialog>\n </>\n );\n};\n","import React, { useState, useMemo } from \"react\";\nimport {\n useApi,\n fetchApiRef,\n identityApiRef,\n configApiRef,\n alertApiRef,\n} from \"@backstage/core-plugin-api\";\nimport { useAsync } from \"react-use\";\nimport {\n Table,\n TableColumn,\n Progress,\n ResponseErrorPanel,\n Link,\n} from \"@backstage/core-components\";\nimport {\n kuadrantApiKeyUpdateAllPermission,\n kuadrantApiKeyUpdateOwnPermission,\n} from \"../../permissions\";\nimport { useKuadrantPermission } from \"../../utils/permissions\";\nimport {\n Button,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Chip,\n Typography,\n Box,\n CircularProgress,\n TextField,\n makeStyles,\n} from \"@material-ui/core\";\nimport CheckCircleIcon from \"@material-ui/icons/CheckCircle\";\nimport CancelIcon from \"@material-ui/icons/Cancel\";\nimport { FilterPanel, FilterSection, FilterState } from \"../FilterPanel\";\nimport { APIKey } from \"../../types/api-management\";\nimport { getStatusChipStyle } from \"../../utils/styles\";\nimport { handleFetchError } from \"../../utils/errors.ts\";\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 useCasePanel: {\n padding: theme.spacing(2),\n backgroundColor: theme.palette.background.default,\n },\n useCaseLabel: {\n fontWeight: 600,\n marginBottom: theme.spacing(1),\n color: theme.palette.text.secondary,\n textTransform: \"uppercase\",\n fontSize: \"0.75rem\",\n },\n bulkActions: {\n padding: theme.spacing(2),\n backgroundColor: theme.palette.background.default,\n borderBottom: `1px solid ${theme.palette.divider}`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n },\n}));\n\ninterface ApprovalDialogProps {\n open: boolean;\n request: APIKey | null;\n action: \"approve\" | \"reject\";\n processing: boolean;\n onClose: () => void;\n onConfirm: () => void;\n}\n\nconst ApprovalDialog = ({\n open,\n request,\n action,\n processing,\n onClose,\n onConfirm,\n}: ApprovalDialogProps) => {\n const [confirmInput, setConfirmInput] = React.useState(\"\");\n const actionLabel = action === \"approve\" ? \"Approve\" : \"Reject\";\n const processingLabel =\n action === \"approve\" ? \"Approving...\" : \"Rejecting...\";\n\n const isReject = action === \"reject\";\n const confirmText = request?.spec.requestedBy?.userId || \"\";\n const canConfirm = isReject ? confirmInput === confirmText : true;\n\n // reset input when dialog closes\n React.useEffect(() => {\n if (!open) {\n setConfirmInput(\"\");\n }\n }, [open]);\n\n return (\n <Dialog\n open={open}\n onClose={processing ? undefined : onClose}\n maxWidth=\"sm\"\n fullWidth\n >\n <DialogTitle>\n {isReject ? (\n <Box display=\"flex\" alignItems=\"center\" style={{ gap: 8 }}>\n <CancelIcon color=\"error\" />\n <span>{actionLabel} API Key</span>\n </Box>\n ) : (\n <span>{actionLabel} API Key</span>\n )}\n </DialogTitle>\n <DialogContent>\n {request && (\n <>\n <p>\n <strong>User:</strong> {request.spec.requestedBy.userId}\n </p>\n <p>\n <strong>API:</strong>{\" \"}\n {request.spec.apiProductRef?.name || \"unknown\"}\n </p>\n <p>\n <strong>Tier:</strong> {request.spec.planTier}\n </p>\n <Box mb={2}>\n <Typography\n variant=\"body2\"\n component=\"span\"\n style={{ fontWeight: \"bold\" }}\n >\n Use Case:\n </Typography>{\" \"}\n <Typography\n variant=\"body2\"\n component=\"span\"\n style={{ whiteSpace: \"pre-wrap\" }}\n >\n {request.spec.useCase || \"-\"}\n </Typography>\n </Box>\n {isReject && (\n <Box mt={2}>\n <Typography variant=\"body2\" color=\"textSecondary\" gutterBottom>\n Type <strong>{confirmText}</strong> to confirm rejection:\n </Typography>\n <TextField\n fullWidth\n variant=\"outlined\"\n size=\"small\"\n value={confirmInput}\n onChange={(e) => setConfirmInput(e.target.value)}\n disabled={processing}\n autoFocus\n placeholder={confirmText}\n />\n </Box>\n )}\n </>\n )}\n </DialogContent>\n <DialogActions>\n <Button onClick={onClose} disabled={processing}>\n Cancel\n </Button>\n <Button\n onClick={onConfirm}\n color={action === \"approve\" ? \"primary\" : \"secondary\"}\n variant=\"contained\"\n disabled={processing || !canConfirm}\n startIcon={\n processing ? (\n <CircularProgress size={16} color=\"inherit\" />\n ) : undefined\n }\n >\n {processing ? processingLabel : actionLabel}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n\ninterface BulkActionDialogProps {\n open: boolean;\n requests: APIKey[];\n action: \"approve\" | \"reject\";\n processing: boolean;\n onClose: () => void;\n onConfirm: () => void;\n}\n\nconst BulkActionDialog = ({\n open,\n requests,\n action,\n processing,\n onClose,\n onConfirm,\n}: BulkActionDialogProps) => {\n const isApprove = action === \"approve\";\n const actionLabel = isApprove ? \"Approve All\" : \"Reject All\";\n const processingLabel = isApprove ? \"Approving...\" : \"Rejecting...\";\n\n return (\n <Dialog\n open={open}\n onClose={processing ? undefined : onClose}\n maxWidth=\"md\"\n fullWidth\n >\n <DialogTitle>\n {isApprove ? \"Approve\" : \"Reject\"} {requests.length} API Keys\n </DialogTitle>\n <DialogContent>\n <Typography variant=\"body2\" paragraph>\n You are about to {isApprove ? \"approve\" : \"reject\"} the following API\n keys:\n </Typography>\n <Box mb={2} maxHeight={200} overflow=\"auto\">\n {requests.map((request) => (\n <Box\n key={`${request.metadata.namespace}/${request.metadata.name}`}\n mb={1}\n p={1}\n bgcolor=\"background.default\"\n >\n <Typography variant=\"body2\">\n <strong>{request.spec.requestedBy.userId}</strong> -{\" \"}\n {request.spec.apiProductRef?.name || \"unknown\"} (\n {request.spec.planTier})\n </Typography>\n </Box>\n ))}\n </Box>\n </DialogContent>\n <DialogActions>\n <Button onClick={onClose} disabled={processing}>\n Cancel\n </Button>\n <Button\n onClick={onConfirm}\n color={isApprove ? \"primary\" : \"secondary\"}\n variant=\"contained\"\n disabled={processing}\n startIcon={\n processing ? (\n <CircularProgress size={16} color=\"inherit\" />\n ) : undefined\n }\n >\n {processing ? processingLabel : actionLabel}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n\ninterface ExpandedRowProps {\n request: APIKey;\n}\n\nconst ExpandedRowContent = ({ request }: ExpandedRowProps) => {\n const classes = useStyles();\n\n return (\n <Box className={classes.useCasePanel} onClick={(e) => e.stopPropagation()}>\n <Typography className={classes.useCaseLabel}>Use Case</Typography>\n <Typography variant=\"body2\">\n {request.spec.useCase || \"No use case provided\"}\n </Typography>\n </Box>\n );\n};\n\ninterface BulkRequestResult {\n name: string;\n namespace: string;\n success: boolean;\n error: string | null;\n}\n\ninterface AlertDialogProps {\n open: boolean;\n results: BulkRequestResult[];\n isApprove: boolean;\n onClose: () => void;\n}\n\nconst useBulkAlertStyles = makeStyles((theme) => ({\n successSection: {\n padding: theme.spacing(2),\n backgroundColor: theme.palette.success.main + '14',\n borderRadius: theme.shape.borderRadius,\n marginBottom: theme.spacing(2),\n border: `1px solid ${theme.palette.success.main}40`,\n },\n failureSection: {\n padding: theme.spacing(2),\n backgroundColor: theme.palette.error.main + '14',\n borderRadius: theme.shape.borderRadius,\n marginBottom: theme.spacing(2),\n border: `1px solid ${theme.palette.error.main}40`,\n },\n warningSection: {\n padding: theme.spacing(2),\n backgroundColor: theme.palette.warning.main + '14',\n borderRadius: theme.shape.borderRadius,\n marginBottom: theme.spacing(2),\n border: `1px solid ${theme.palette.warning.main}40`,\n },\n statRow: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n },\n errorList: {\n marginTop: theme.spacing(2),\n padding: 0,\n listStyle: 'none',\n },\n errorItem: {\n padding: theme.spacing(1.5),\n marginBottom: theme.spacing(1),\n backgroundColor: theme.palette.background.paper,\n borderRadius: theme.shape.borderRadius,\n border: `1px solid ${theme.palette.divider}`,\n },\n errorName: {\n fontWeight: 600,\n fontSize: '0.875rem',\n marginBottom: theme.spacing(0.5),\n },\n errorMessage: {\n fontSize: '0.813rem',\n color: theme.palette.error.main,\n fontFamily: 'monospace',\n wordBreak: 'break-word',\n },\n expandButton: {\n marginTop: theme.spacing(1),\n padding: theme.spacing(0.5),\n },\n}));\n\nconst BulkAlertDialog = ({\n open,\n results,\n isApprove,\n onClose,\n}: AlertDialogProps) => {\n const classes = useBulkAlertStyles();\n const [showErrors, setShowErrors] = useState(true);\n const successResults = results.filter((res: any) => res.success);\n const failedResults = results.filter((res: any) => !res.success);\n const hasPartialSuccess = successResults.length > 0;\n\n return (\n <Dialog\n open={open}\n onClose={onClose}\n maxWidth=\"md\"\n fullWidth\n >\n <DialogTitle>\n <Box display=\"flex\" alignItems=\"center\" style={{ gap: 8 }}>\n {hasPartialSuccess ? (\n <>\n <CancelIcon style={{ color: '#ff9800' }} />\n <span>Bulk {isApprove ? \"Approve\" : \"Reject\"} Completed with Issues</span>\n </>\n ) : (\n <>\n <CancelIcon color=\"error\" />\n <span>Bulk {isApprove ? \"Approve\" : \"Reject\"} Failed</span>\n </>\n )}\n </Box>\n </DialogTitle>\n <DialogContent>\n {hasPartialSuccess && (\n <Box className={classes.successSection}>\n <Box className={classes.statRow}>\n <CheckCircleIcon style={{ color: '#4caf50' }} />\n <Typography variant=\"body1\">\n <strong>{successResults.length}</strong> API key{successResults.length !== 1 ? 's' : ''} {isApprove ? 'approved' : 'rejected'} successfully\n </Typography>\n </Box>\n </Box>\n )}\n\n <Box className={hasPartialSuccess ? classes.warningSection : classes.failureSection}>\n <Box className={classes.statRow}>\n <CancelIcon color=\"error\" />\n <Typography variant=\"body1\">\n <strong>{failedResults.length}</strong> request{failedResults.length !== 1 ? 's' : ''} failed\n </Typography>\n </Box>\n\n <Button\n size=\"small\"\n className={classes.expandButton}\n onClick={() => setShowErrors(!showErrors)}\n >\n {showErrors ? 'Hide' : 'Show'} Error Details\n </Button>\n\n {showErrors && (\n <ul className={classes.errorList}>\n {failedResults.map((result, index) => (\n <li key={result.name || index} className={classes.errorItem}>\n <div className={classes.errorName}>\n {result.namespace}/{result.name}\n </div>\n <div className={classes.errorMessage}>\n {result.error || 'Unknown error'}\n </div>\n </li>\n ))}\n </ul>\n )}\n </Box>\n </DialogContent>\n <DialogActions>\n <Button onClick={onClose} color=\"primary\" variant=\"contained\">\n Close\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n\nexport const ApprovalQueueTable = () => {\n const classes = useStyles();\n const config = useApi(configApiRef);\n const fetchApi = useApi(fetchApiRef);\n const identityApi = useApi(identityApiRef);\n const alertApi = useApi(alertApiRef);\n const backendUrl = config.getString(\"backend.baseUrl\");\n const [refresh, setRefresh] = useState(0);\n const [selectedRequests, setSelectedRequests] = useState<APIKey[]>([]);\n const [dialogState, setDialogState] = useState<{\n open: boolean;\n request: APIKey | null;\n action: \"approve\" | \"reject\";\n processing: boolean;\n }>({\n open: false,\n request: null,\n action: \"approve\",\n processing: false,\n });\n const [bulkDialogState, setBulkDialogState] = useState<{\n open: boolean;\n requests: APIKey[];\n action: \"approve\" | \"reject\";\n processing: boolean;\n }>({\n open: false,\n requests: [],\n action: \"approve\",\n processing: false,\n });\n const [bulkAlertDialogState, setBulkAlertDialogState] = useState<{\n open: boolean;\n results: BulkRequestResult[];\n isApprove: boolean;\n }>({\n open: false,\n results: [],\n isApprove: true,\n });\n const [filters, setFilters] = useState<FilterState>({\n status: [],\n apiProduct: [],\n tier: [],\n });\n\n const {\n allowed: canUpdateAllRequests,\n loading: updateAllPermissionLoading,\n error: updateAllPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyUpdateAllPermission);\n\n const {\n allowed: canUpdateOwnRequests,\n loading: updateOwnPermissionLoading,\n error: updateOwnPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyUpdateOwnPermission);\n\n const updatePermissionLoading =\n updateAllPermissionLoading || updateOwnPermissionLoading;\n const updatePermissionError =\n updateAllPermissionError || updateOwnPermissionError;\n\n const { value, loading, error } = useAsync(async () => {\n const identity = await identityApi.getBackstageIdentity();\n const reviewedBy = identity.userEntityRef;\n\n const [requestsResponse, apiProductsResponse] = await Promise.all([\n fetchApi.fetch(`${backendUrl}/api/kuadrant/requests`),\n fetchApi.fetch(`${backendUrl}/api/kuadrant/apiproducts`),\n ]);\n\n if (!requestsResponse.ok) {\n return {\n allRequests: [] as APIKey[],\n reviewedBy,\n ownedApiProducts: new Set<string>(),\n };\n }\n\n const contentType = requestsResponse.headers.get(\"content-type\");\n if (!contentType?.includes(\"application/json\")) {\n alertApi.post({\n message: \"Unexpected content-type from the server response.\",\n display: \"transient\",\n severity: \"warning\",\n });\n return {\n allRequests: [] as APIKey[],\n reviewedBy,\n ownedApiProducts: new Set<string>(),\n };\n }\n\n const data = await requestsResponse.json();\n const allRequests = data.items || [];\n\n const ownedApiProducts = new Set<string>();\n if (apiProductsResponse.ok) {\n const apiProductsData = await apiProductsResponse.json();\n for (const product of apiProductsData.items || []) {\n const owner = product.metadata?.annotations?.[\"backstage.io/owner\"];\n if (owner === reviewedBy) {\n ownedApiProducts.add(\n `${product.metadata.namespace}/${product.metadata.name}`,\n );\n }\n }\n }\n\n return { allRequests, reviewedBy, ownedApiProducts };\n }, [backendUrl, fetchApi, identityApi, refresh]);\n\n const filterSections: FilterSection[] = useMemo(() => {\n if (!value?.allRequests) return [];\n\n const statusCounts = { Approved: 0, Pending: 0, Rejected: 0 };\n const apiProductCounts = new Map<string, number>();\n const tierCounts = new Map<string, number>();\n\n value.allRequests.forEach((r: APIKey) => {\n const status = r.status?.phase || \"Pending\";\n statusCounts[status as keyof typeof statusCounts]++;\n\n const apiProduct = r.spec.apiProductRef?.name || \"unknown\";\n apiProductCounts.set(\n apiProduct,\n (apiProductCounts.get(apiProduct) || 0) + 1,\n );\n\n const tier = r.spec.planTier || \"unknown\";\n tierCounts.set(tier, (tierCounts.get(tier) || 0) + 1);\n });\n\n return [\n {\n id: \"status\",\n title: \"Status\",\n options: [\n { value: \"Pending\", label: \"Pending\", count: statusCounts.Pending },\n {\n value: \"Approved\",\n label: \"Approved\",\n count: statusCounts.Approved,\n },\n {\n value: \"Rejected\",\n label: \"Rejected\",\n count: statusCounts.Rejected,\n },\n ],\n },\n {\n id: \"apiProduct\",\n title: \"API Product\",\n options: Array.from(apiProductCounts.entries()).map(\n ([name, count]) => ({\n value: name,\n label: name,\n count,\n }),\n ),\n collapsed: apiProductCounts.size > 5,\n },\n {\n id: \"tier\",\n title: \"Tier\",\n options: Array.from(tierCounts.entries()).map(([tier, count]) => ({\n value: tier,\n label: tier.charAt(0).toUpperCase() + tier.slice(1),\n count,\n })),\n },\n ];\n }, [value?.allRequests]);\n\n const filteredRequests = useMemo(() => {\n if (!value?.allRequests) return [];\n\n return value.allRequests.filter((r: APIKey) => {\n if (filters.status.length > 0) {\n const status = r.status?.phase || \"Pending\";\n if (!filters.status.includes(status)) return false;\n }\n if (filters.apiProduct.length > 0) {\n const apiProduct = r.spec.apiProductRef?.name || \"unknown\";\n if (!filters.apiProduct.includes(apiProduct)) return false;\n }\n if (filters.tier.length > 0) {\n const tier = r.spec.planTier || \"unknown\";\n if (!filters.tier.includes(tier)) return false;\n }\n return true;\n });\n }, [value?.allRequests, filters]);\n\n const handleApprove = (request: APIKey) => {\n setDialogState({\n open: true,\n request,\n action: \"approve\",\n processing: false,\n });\n };\n\n const handleReject = (request: APIKey) => {\n setDialogState({\n open: true,\n request,\n action: \"reject\",\n processing: false,\n });\n };\n\n const handleConfirm = async () => {\n if (!dialogState.request || !value) return;\n\n setDialogState((prev) => ({ ...prev, processing: true }));\n\n const endpoint =\n dialogState.action === \"approve\"\n ? `${backendUrl}/api/kuadrant/requests/${dialogState.request.metadata.namespace}/${dialogState.request.metadata.name}/approve`\n : `${backendUrl}/api/kuadrant/requests/${dialogState.request.metadata.namespace}/${dialogState.request.metadata.name}/reject`;\n\n try {\n const response = await fetchApi.fetch(endpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ reviewedBy: value.reviewedBy }),\n });\n\n if (!response.ok) {\n const err = await handleFetchError(response);\n throw new Error(err);\n }\n\n setDialogState({\n open: false,\n request: null,\n action: \"approve\",\n processing: false,\n });\n // remove the processed request from selection\n setSelectedRequests((prev) =>\n prev.filter(\n (r) =>\n r.metadata.name !== dialogState.request?.metadata.name ||\n r.metadata.namespace !== dialogState.request?.metadata.namespace,\n ),\n );\n setRefresh((r) => r + 1);\n const action = dialogState.action === \"approve\" ? \"approved\" : \"rejected\";\n alertApi.post({\n message: `API key ${action}`,\n severity: \"success\",\n display: \"transient\",\n });\n } catch (err) {\n console.error(`error ${dialogState.action}ing request:`, err);\n setDialogState((prev) => ({ ...prev, processing: false }));\n const errorMessage = err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to ${dialogState.action} API key. ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\n }\n };\n\n const handleBulkApprove = () => {\n if (selectedRequests.length === 0) return;\n setBulkDialogState({\n open: true,\n requests: selectedRequests,\n action: \"approve\",\n processing: false,\n });\n };\n\n const handleBulkReject = () => {\n if (selectedRequests.length === 0) return;\n setBulkDialogState({\n open: true,\n requests: selectedRequests,\n action: \"reject\",\n processing: false,\n });\n };\n\n const handleBulkConfirm = async () => {\n if (!value || bulkDialogState.requests.length === 0) return;\n\n setBulkDialogState((prev) => ({ ...prev, processing: true }));\n setBulkAlertDialogState({ open: false, results: [], isApprove: true, });\n\n const isApprove = bulkDialogState.action === \"approve\";\n const endpoint = isApprove\n ? `${backendUrl}/api/kuadrant/requests/bulk-approve`\n : `${backendUrl}/api/kuadrant/requests/bulk-reject`;\n\n try {\n const response = await fetchApi.fetch(endpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n requests: bulkDialogState.requests.map((r) => ({\n namespace: r.metadata.namespace,\n name: r.metadata.name,\n })),\n reviewedBy: value.reviewedBy,\n }),\n });\n\n if (!response.ok) {\n const err = await handleFetchError(response);\n throw new Error(err);\n }\n const bulkResponseRaw = await response.json();\n const bulkResponse = bulkResponseRaw.results || [];\n\n const successfulItems = bulkResponse.filter((res: any) => res.success);\n const failedItems = bulkResponse.filter((res: any) => !res.success);\n const totalSuccess = failedItems.length === 0;\n\n const action = isApprove ? \"approved\" : \"rejected\";\n\n setBulkDialogState({\n open: false,\n requests: [],\n action: \"approve\",\n processing: false,\n });\n setBulkAlertDialogState({\n open: !totalSuccess,\n results: bulkResponse,\n isApprove,\n });\n setSelectedRequests([]);\n setRefresh((r) => r + 1);\n\n if (totalSuccess) {\n alertApi.post({\n message: `${successfulItems.length} API keys ${action}`,\n severity: \"success\",\n display: \"transient\",\n });\n }\n } catch (err) {\n console.error(`error bulk ${bulkDialogState.action}ing requests:`, err);\n setBulkDialogState((prev) => ({ ...prev, processing: false }));\n const errorMessage = err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to bulk ${bulkDialogState.action} API keys. ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\n }\n };\n\n const formatDate = (dateString: string) => {\n const date = new Date(dateString);\n return date.toLocaleDateString(\"en-GB\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n };\n\n const columns: TableColumn<APIKey>[] = [\n {\n title: \"Requester\",\n field: \"spec.requestedBy.userId\",\n render: (row) => (\n <Typography variant=\"body2\">{row.spec.requestedBy.userId}</Typography>\n ),\n },\n {\n title: \"API Product\",\n field: \"spec.apiProductRef.name\",\n render: (row) => {\n const name = row.spec.apiProductRef?.name || \"unknown\";\n return (\n <Link to={`/catalog/default/api/${name}`}>\n <strong>{name}</strong>\n </Link>\n );\n },\n },\n {\n title: \"Status\",\n field: \"status.phase\",\n render: (row) => {\n const phase = row.status?.phase || \"Pending\";\n return (\n <Chip label={phase} size=\"small\" style={getStatusChipStyle(phase)} />\n );\n },\n },\n {\n title: \"Tier\",\n field: \"spec.planTier\",\n render: (row) => (\n <Chip label={row.spec.planTier} size=\"small\" variant=\"outlined\" />\n ),\n },\n {\n title: \"Requested\",\n field: \"metadata.creationTimestamp\",\n render: (row) => (\n <Typography variant=\"body2\">\n {row.metadata.creationTimestamp\n ? formatDate(row.metadata.creationTimestamp)\n : \"-\"}\n </Typography>\n ),\n },\n {\n title: \"Reviewed By\",\n field: \"status.reviewedBy\",\n render: (row) => {\n if (!row.status?.reviewedBy)\n return (\n <Typography variant=\"body2\" color=\"textSecondary\">\n -\n </Typography>\n );\n const reviewer = row.status.reviewedBy.replace(/^user:default\\//, \"\");\n const isAutomatic = reviewer === \"system\";\n return (\n <Box>\n <Typography variant=\"body2\">\n {isAutomatic ? \"Automatic\" : reviewer}\n </Typography>\n {row.status.reviewedAt && (\n <Typography variant=\"caption\" color=\"textSecondary\">\n {formatDate(row.status.reviewedAt)}\n </Typography>\n )}\n </Box>\n );\n },\n },\n {\n title: \"Actions\",\n filtering: false,\n render: (row) => {\n const phase = row.status?.phase || \"Pending\";\n if (phase !== \"Pending\") return null;\n\n const apiProductKey = `${row.metadata.namespace}/${row.spec.apiProductRef?.name || \"unknown\"}`;\n const ownsApiProduct =\n value?.ownedApiProducts?.has(apiProductKey) ?? false;\n const canUpdate =\n canUpdateAllRequests || (canUpdateOwnRequests && ownsApiProduct);\n if (!canUpdate) return null;\n\n return (\n <Box display=\"flex\" style={{ gap: 8 }}>\n <Button\n size=\"small\"\n startIcon={<CheckCircleIcon />}\n onClick={() => handleApprove(row)}\n color=\"primary\"\n variant=\"outlined\"\n >\n Approve\n </Button>\n <Button\n size=\"small\"\n startIcon={<CancelIcon />}\n onClick={() => handleReject(row)}\n color=\"secondary\"\n variant=\"outlined\"\n >\n Reject\n </Button>\n </Box>\n );\n },\n },\n ];\n\n const detailPanelConfig = useMemo(\n () => [\n {\n render: (data: any) => {\n const request = data.rowData as APIKey;\n if (!request?.metadata?.name) {\n return <Box />;\n }\n return <ExpandedRowContent request={request} />;\n },\n },\n ],\n [],\n );\n\n if (loading || updatePermissionLoading) {\n return <Progress />;\n }\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n if (updatePermissionError) {\n return (\n <Box p={2}>\n <Typography color=\"error\">\n Unable to check permissions: {updatePermissionError.message}\n </Typography>\n </Box>\n );\n }\n\n const canSelectRows = canUpdateAllRequests || canUpdateOwnRequests;\n\n return (\n <>\n <Box className={classes.container}>\n <FilterPanel\n sections={filterSections}\n filters={filters}\n onChange={setFilters}\n />\n <Box className={classes.tableContainer}>\n {selectedRequests.length > 0 && (\n <Box className={classes.bulkActions}>\n <Typography variant=\"body2\">\n {selectedRequests.length} request\n {selectedRequests.length !== 1 ? \"s\" : \"\"} selected\n </Typography>\n <Box display=\"flex\" style={{ gap: 8 }}>\n <Button\n size=\"small\"\n variant=\"contained\"\n color=\"primary\"\n startIcon={<CheckCircleIcon />}\n onClick={handleBulkApprove}\n >\n Approve Selected\n </Button>\n <Button\n size=\"small\"\n variant=\"contained\"\n color=\"secondary\"\n startIcon={<CancelIcon />}\n onClick={handleBulkReject}\n >\n Reject Selected\n </Button>\n </Box>\n </Box>\n )}\n\n {filteredRequests.length === 0 ? (\n <Box p={4} textAlign=\"center\">\n <Typography variant=\"body1\" color=\"textSecondary\">\n {value?.allRequests?.length === 0\n ? \"No API keys found.\"\n : \"No API keys match the selected filters.\"}\n </Typography>\n </Box>\n ) : (\n <Table\n options={{\n selection: canSelectRows,\n showSelectAllCheckbox: filteredRequests.some(\n (r: APIKey) =>\n !r.status?.phase || r.status.phase === \"Pending\",\n ),\n selectionProps: (row: APIKey) => ({\n disabled:\n row.status?.phase !== \"Pending\" &&\n row.status?.phase !== undefined,\n }),\n paging: filteredRequests.length > 10,\n pageSize: 20,\n search: true,\n filtering: false,\n debounceInterval: 300,\n showTextRowsSelected: false,\n toolbar: true,\n emptyRowsWhenPaging: false,\n }}\n columns={columns}\n data={filteredRequests.map((item: APIKey) => {\n const isSelected = selectedRequests.some(\n (selected) =>\n selected.metadata.name === item.metadata.name &&\n selected.metadata.namespace === item.metadata.namespace,\n );\n return {\n ...item,\n id: item.metadata.name,\n tableData: { checked: isSelected },\n };\n })}\n onSelectionChange={(rows) => {\n // only allow selecting pending requests\n const pendingOnly = (rows as APIKey[]).filter(\n (r) => !r.status?.phase || r.status.phase === \"Pending\",\n );\n setSelectedRequests(pendingOnly);\n }}\n detailPanel={detailPanelConfig}\n />\n )}\n </Box>\n </Box>\n\n <ApprovalDialog\n open={dialogState.open}\n request={dialogState.request}\n action={dialogState.action}\n processing={dialogState.processing}\n onClose={() =>\n setDialogState({\n open: false,\n request: null,\n action: \"approve\",\n processing: false,\n })\n }\n onConfirm={handleConfirm}\n />\n <BulkActionDialog\n open={bulkDialogState.open}\n requests={bulkDialogState.requests}\n action={bulkDialogState.action}\n processing={bulkDialogState.processing}\n onClose={() =>\n setBulkDialogState({\n open: false,\n requests: [],\n action: \"approve\",\n processing: false,\n })\n }\n onConfirm={handleBulkConfirm}\n />\n <BulkAlertDialog\n open={bulkAlertDialogState.open}\n results={bulkAlertDialogState.results}\n isApprove={bulkAlertDialogState.isApprove}\n onClose={() =>\n setBulkAlertDialogState({\n open: false,\n results: [],\n isApprove: true,\n })\n }\n />\n </>\n );\n};\n","import React, { useState } from 'react';\nimport { Box, Tabs, Tab } from '@material-ui/core';\nimport {\n Header,\n Page,\n Content,\n SupportButton,\n} from '@backstage/core-components';\nimport { PermissionGate } from '../PermissionGate';\nimport { MyApiKeysTable } from '../MyApiKeysTable';\nimport { ApprovalQueueTable } from '../ApprovalQueueTable';\nimport {\n kuadrantApiKeyReadOwnPermission,\n kuadrantApiKeyApprovePermission,\n} from '../../permissions';\nimport { useKuadrantPermission } from '../../utils/permissions';\n\nconst ApiKeysContent = () => {\n const [selectedTab, setSelectedTab] = useState(0);\n\n const {\n allowed: canViewApprovalQueue,\n loading: approvalQueuePermissionLoading,\n } = useKuadrantPermission(kuadrantApiKeyApprovePermission);\n\n const handleTabChange = (_event: React.ChangeEvent<{}>, newValue: number) => {\n setSelectedTab(newValue);\n };\n\n return (\n <Page themeId=\"tool\">\n <Header title=\"API Keys\" subtitle=\"API keys management for Kubernetes\">\n <SupportButton>Manage your API keys and access requests</SupportButton>\n </Header>\n <Content>\n <Box mb={2}>\n <Tabs\n value={selectedTab}\n onChange={handleTabChange}\n indicatorColor=\"primary\"\n textColor=\"primary\"\n >\n <Tab label=\"My API keys\" data-testid=\"my-api-keys-tab\" />\n {!approvalQueuePermissionLoading && canViewApprovalQueue && (\n <Tab label=\"API keys approval\" data-testid=\"api-keys-approval-tab\" />\n )}\n </Tabs>\n </Box>\n\n {selectedTab === 0 && <MyApiKeysTable />}\n {selectedTab === 1 && canViewApprovalQueue && <ApprovalQueueTable />}\n </Content>\n </Page>\n );\n};\n\nexport const ApiKeysPage = () => {\n return (\n <PermissionGate\n permission={kuadrantApiKeyReadOwnPermission}\n errorMessage=\"you don't have permission to view the API Keys page\"\n >\n <ApiKeysContent />\n </PermissionGate>\n );\n};\n","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z\"\n}), 'ExpandLess');\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: \"M21 5v6.59l-3-3.01-4 4.01-4-4-4 4-3-3.01V5c0-1.1.9-2 2-2h14c1.1 0 2 .9 2 2zm-3 6.42l3 3.01V19c0 1.1-.9 2-2 2H5c-1.1 0-2-.9-2-2v-6.58l3 2.99 4-4 4 4 4-3.99z\"\n}), 'BrokenImage');\n\nexports.default = _default;","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","\"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;","import { useApiHolder, configApiRef } from '@backstage/core-plugin-api';\nimport { coreComponentsTranslationRef } from '../translation.esm.js';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\nconst useDefaultSupportConfig = () => {\n const { t } = useTranslationRef(coreComponentsTranslationRef);\n return {\n url: \"https://github.com/backstage/backstage/issues\",\n items: [\n {\n title: t(\"supportConfig.default.title\"),\n icon: \"warning\",\n links: [\n {\n // TODO: Update to dedicated support page on backstage.io/docs\n title: t(\"supportConfig.default.linkTitle\"),\n url: \"https://github.com/backstage/backstage/blob/master/app-config.yaml\"\n }\n ]\n }\n ]\n };\n};\nfunction useSupportConfig() {\n const apiHolder = useApiHolder();\n const config = apiHolder.get(configApiRef);\n const supportConfig = config?.getOptionalConfig(\"app.support\");\n const defaultSupportConfig = useDefaultSupportConfig();\n if (!supportConfig) {\n return defaultSupportConfig;\n }\n return {\n url: supportConfig.getString(\"url\"),\n items: supportConfig.getConfigArray(\"items\").flatMap((itemConf) => ({\n title: itemConf.getString(\"title\"),\n icon: itemConf.getOptionalString(\"icon\"),\n links: (itemConf.getOptionalConfigArray(\"links\") ?? []).flatMap(\n (linkConf) => ({\n url: linkConf.getString(\"url\"),\n title: linkConf.getOptionalString(\"title\") ?? \"\"\n })\n )\n }))\n };\n}\n\nexport { useSupportConfig };\n//# sourceMappingURL=useSupportConfig.esm.js.map\n","import { jsx } from 'react/jsx-runtime';\nimport { useApp } from '@backstage/core-plugin-api';\nimport MuiBrokenImageIcon from '@material-ui/icons/BrokenImage';\n\nfunction AppIcon(props) {\n const { id: key, Fallback = MuiBrokenImageIcon, ...rest } = props;\n const app = useApp();\n const Icon = app.getSystemIcon(key) ?? Fallback;\n return /* @__PURE__ */ jsx(Icon, { ...rest });\n}\nfunction BrokenImageIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"brokenImage\", ...props });\n}\nfunction CatalogIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"catalog\", ...props });\n}\nfunction ChatIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"chat\", ...props });\n}\nfunction DashboardIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"dashboard\", ...props });\n}\nfunction DocsIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"docs\", ...props });\n}\nfunction EmailIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"email\", ...props });\n}\nfunction GitHubIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"github\", ...props });\n}\nfunction GroupIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"group\", ...props });\n}\nfunction HelpIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"help\", ...props });\n}\nfunction UserIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"user\", ...props });\n}\nfunction WarningIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"warning\", ...props });\n}\nfunction StarIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"star\", ...props });\n}\nfunction UnstarredIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"unstarred\", ...props });\n}\n\nexport { AppIcon, BrokenImageIcon, CatalogIcon, ChatIcon, DashboardIcon, DocsIcon, EmailIcon, GitHubIcon, GroupIcon, HelpIcon, StarIcon, UnstarredIcon, UserIcon, WarningIcon };\n//# sourceMappingURL=icons.esm.js.map\n","import { jsxs, Fragment, jsx } from 'react/jsx-runtime';\nimport { useApi, configApiRef, useApp } from '@backstage/core-plugin-api';\nimport Box from '@material-ui/core/Box';\nimport Button from '@material-ui/core/Button';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport IconButton from '@material-ui/core/IconButton';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport MenuList from '@material-ui/core/MenuList';\nimport Popover from '@material-ui/core/Popover';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\nimport { useState, Children } from 'react';\nimport 'lodash';\nimport 'qs';\nimport 'react-router-dom';\nimport '@react-hookz/web';\nimport { useSupportConfig } from '../../hooks/useSupportConfig.esm.js';\nimport { HelpIcon } from '../../icons/icons.esm.js';\nimport { Link } from '../Link/Link.esm.js';\nimport { coreComponentsTranslationRef } from '../../translation.esm.js';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\nconst useStyles = makeStyles(\n {\n popoverList: {\n minWidth: 260,\n maxWidth: 400\n },\n menuItem: {\n whiteSpace: \"normal\"\n }\n },\n { name: \"BackstageSupportButton\" }\n);\nconst SupportIcon = ({ icon }) => {\n const app = useApp();\n const Icon = icon ? app.getSystemIcon(icon) ?? HelpIcon : HelpIcon;\n return /* @__PURE__ */ jsx(Icon, {});\n};\nconst SupportLink = ({ link }) => /* @__PURE__ */ jsx(Link, { to: link.url, children: link.title ?? link.url });\nconst SupportListItem = ({ item }) => {\n return /* @__PURE__ */ jsxs(MenuItem, { button: false, children: [\n /* @__PURE__ */ jsx(ListItemIcon, { children: /* @__PURE__ */ jsx(SupportIcon, { icon: item.icon }) }),\n /* @__PURE__ */ jsx(\n ListItemText,\n {\n primary: item.title,\n secondary: item.links?.reduce(\n (prev, link, idx) => [\n ...prev,\n idx > 0 && /* @__PURE__ */ jsx(\"br\", {}, idx),\n /* @__PURE__ */ jsx(SupportLink, { link }, link.url)\n ],\n []\n )\n }\n )\n ] });\n};\nfunction SupportButton(props) {\n const { t } = useTranslationRef(coreComponentsTranslationRef);\n const { title, items, children } = props;\n const { items: configItems } = useSupportConfig();\n const [popoverOpen, setPopoverOpen] = useState(false);\n const [anchorEl, setAnchorEl] = useState(null);\n const classes = useStyles();\n const supportConfig = useApi(configApiRef).getOptionalConfig(\"app.support\");\n const isSmallScreen = useMediaQuery(\n (theme) => theme.breakpoints.down(\"sm\")\n );\n const onClickHandler = (event) => {\n setAnchorEl(event.currentTarget);\n setPopoverOpen(true);\n };\n const popoverCloseHandler = () => {\n setPopoverOpen(false);\n };\n if (!supportConfig) {\n return null;\n }\n return /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(Box, { display: \"flex\", ml: 1, children: isSmallScreen ? /* @__PURE__ */ jsx(\n IconButton,\n {\n color: \"primary\",\n size: \"small\",\n onClick: onClickHandler,\n \"data-testid\": \"support-button\",\n \"aria-label\": \"Support\",\n children: /* @__PURE__ */ jsx(HelpIcon, {})\n }\n ) : /* @__PURE__ */ jsx(\n Button,\n {\n \"data-testid\": \"support-button\",\n \"aria-label\": \"Support\",\n color: \"primary\",\n onClick: onClickHandler,\n startIcon: /* @__PURE__ */ jsx(HelpIcon, {}),\n children: t(\"supportButton.title\")\n }\n ) }),\n /* @__PURE__ */ jsxs(\n Popover,\n {\n \"data-testid\": \"support-button-popover\",\n open: popoverOpen,\n anchorEl,\n anchorOrigin: {\n vertical: \"bottom\",\n horizontal: \"right\"\n },\n transformOrigin: {\n vertical: \"top\",\n horizontal: \"right\"\n },\n onClose: popoverCloseHandler,\n children: [\n /* @__PURE__ */ jsxs(\n MenuList,\n {\n className: classes.popoverList,\n autoFocusItem: Boolean(anchorEl),\n children: [\n title && /* @__PURE__ */ jsx(\n MenuItem,\n {\n button: false,\n alignItems: \"flex-start\",\n className: classes.menuItem,\n children: /* @__PURE__ */ jsx(Typography, { variant: \"subtitle1\", children: title })\n }\n ),\n Children.map(children, (child, i) => /* @__PURE__ */ jsx(\n MenuItem,\n {\n button: false,\n alignItems: \"flex-start\",\n className: classes.menuItem,\n children: child\n },\n `child-${i}`\n )),\n (items ?? configItems).map((item, i) => /* @__PURE__ */ jsx(SupportListItem, { item }, `item-${i}`))\n ]\n }\n ),\n /* @__PURE__ */ jsx(DialogActions, { children: /* @__PURE__ */ jsx(\n Button,\n {\n color: \"primary\",\n onClick: popoverCloseHandler,\n \"aria-label\": \"Close\",\n children: t(\"supportButton.close\")\n }\n ) })\n ]\n }\n )\n ] });\n}\n\nexport { SupportButton };\n//# sourceMappingURL=SupportButton.esm.js.map\n","import { CSSProperties } from \"react\";\n\n/**\n * Returns inline styles for API key status chips.\n * Uses inline styles to ensure proper specificity with Material-UI Chip.\n */\nexport const getStatusChipStyle = (phase: string): CSSProperties => {\n const base = { border: \"none\" };\n switch (phase) {\n case \"Approved\":\n return { ...base, backgroundColor: \"#4caf50\", color: \"#fff\" };\n case \"Rejected\":\n return { ...base, backgroundColor: \"#f44336\", color: \"#fff\" };\n default:\n return { ...base, backgroundColor: \"#ff9800\", color: \"#fff\" };\n }\n};\n","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"\n}), 'CheckCircle');\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"],"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","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","values","some","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","currentValues","newValues","v","handleCheckboxChange","label","undefined","container","minHeight","tableContainer","flex","overflow","useCasePanel","useCaseLabel","rejectedBanner","light","border","main","borderRadius","shape","gap","ExpandedRowContent","request","isRejected","status","phase","apiProductName","spec","apiProductRef","name","e","stopPropagation","WarningIcon","Link","to","useCase","MyApiKeysTable","deleteDialogState","navigate","useNavigate","config","useApi","configApiRef","fetchApi","fetchApiRef","alertApi","alertApiRef","backendUrl","getString","visibleKeys","setVisibleKeys","menuAnchor","setMenuAnchor","menuRequest","setMenuRequest","editDialogState","setEditDialogState","open","plans","refresh","setRefresh","deleting","setDeleting","setDeleteDialogState","apiKeyValues","setApiKeyValues","Map","apiKeyLoading","setApiKeyLoading","alreadyReadKeys","setAlreadyReadKeys","showOnceWarningOpen","setShowOnceWarningOpen","pendingKeyReveal","setPendingKeyReveal","optimisticallyDeleted","setOptimisticallyDeleted","setFilters","apiProduct","tier","data","useAsync","async","requestsResponse","productsResponse","Promise","all","fetch","ok","Error","requests","json","items","products","ownerMap","p","key","metadata","namespace","owner","annotations","allRequests","useMemo","r","filterSections","statusCounts","Approved","Pending","Rejected","apiProductCounts","tierCounts","planTier","Array","from","entries","charAt","toUpperCase","slice","filteredRequests","toggleKeyVisibility","keyName","newSet","handleMenuClose","handleEdit","apiProductNamespace","apiProductResponse","err","console","errorMessage","message","post","severity","handleDeleteClick","columns","field","render","row","strong","displayOwner","replace","Chip","style","getStatusChipStyle","filtering","hasSecretRef","secretRef","isVisible","isLoading","apiKeyValue","canReadSecret","isAlreadyRead","Tooltip","fontFamily","marginRight","VisibilityOffIcon","repeat","IconButton","navigator","clipboard","writeText","FileCopyIcon","requestNamespace","requestName","clearApiKeyValue","disabled","VisibilityIcon","creationTimestamp","date","Date","toLocaleDateString","CircularProgress","DeleteIcon","detailPanelConfig","rowData","Progress","ResponseErrorPanel","textAlign","Table","paging","pageSize","search","debounceInterval","toolbar","emptyRowsWhenPaging","item","detailPanel","Menu","Boolean","onClose","anchorReference","anchorPosition","top","left","push","MenuItem","EditAPIKeyDialog","availablePlans","onSuccess","ConfirmDeleteDialog","description","onConfirm","response","method","handleFetchError","onCancel","Dialog","maxWidth","DialogTitle","DialogContent","paragraph","DialogActions","result","apiKey","fetchApiKeyFromSecret","bulkActions","borderBottom","ApprovalDialog","action","processing","confirmInput","setConfirmInput","actionLabel","processingLabel","isReject","confirmText","requestedBy","userId","canConfirm","fullWidth","CancelIcon","component","whiteSpace","gutterBottom","TextField","target","autoFocus","placeholder","startIcon","BulkActionDialog","isApprove","maxHeight","bgcolor","useBulkAlertStyles","successSection","success","failureSection","warningSection","warning","statRow","errorList","listStyle","errorItem","errorName","wordBreak","expandButton","BulkAlertDialog","results","showErrors","setShowErrors","successResults","res","failedResults","hasPartialSuccess","CheckCircleIcon","ul","index","li","div","ApprovalQueueTable","identityApi","identityApiRef","selectedRequests","setSelectedRequests","dialogState","setDialogState","bulkDialogState","setBulkDialogState","bulkAlertDialogState","setBulkAlertDialogState","allowed","canUpdateAllRequests","updateAllPermissionLoading","updateAllPermissionError","useKuadrantPermission","kuadrantApiKeyUpdateAllPermission","canUpdateOwnRequests","updateOwnPermissionLoading","updateOwnPermissionError","kuadrantApiKeyUpdateOwnPermission","updatePermissionLoading","updatePermissionError","reviewedBy","getBackstageIdentity","userEntityRef","apiProductsResponse","ownedApiProducts","contentType","headers","apiProductsData","product","formatDate","dateString","year","month","day","reviewer","isAutomatic","reviewedAt","apiProductKey","ownsApiProduct","canSelectRows","selection","showSelectAllCheckbox","selectionProps","showTextRowsSelected","isSelected","selected","tableData","onSelectionChange","rows","pendingOnly","endpoint","body","JSON","stringify","bulkResponse","successfulItems","totalSuccess","ApiKeysContent","selectedTab","setSelectedTab","canViewApprovalQueue","approvalQueuePermissionLoading","kuadrantApiKeyApprovePermission","Page","themeId","Header","subtitle","SupportButton","Content","Tabs","_event","newValue","indicatorColor","textColor","Tab","data-testid","ApiKeysPage","PermissionGate","permission","kuadrantApiKeyReadOwnPermission","_interopRequireDefault","_interopRequireWildcard","_default","createElement","d","children","fallback","useDefaultSupportConfig","t","useTranslationRef","url","icon","links","AppIcon","props","Fallback","rest","Icon","useApp","getSystemIcon","jsx","HelpIcon","popoverList","menuItem","SupportIcon","app","SupportLink","link","SupportListItem","jsxs","button","ListItemIcon","ListItemText","primary","reduce","idx","configItems","useApiHolder","supportConfig","getOptionalConfig","defaultSupportConfig","getConfigArray","flatMap","itemConf","getOptionalString","getOptionalConfigArray","linkConf","useSupportConfig","popoverOpen","setPopoverOpen","anchorEl","setAnchorEl","isSmallScreen","useMediaQuery","breakpoints","down","onClickHandler","event","currentTarget","popoverCloseHandler","Fragment","ml","Popover","anchorOrigin","vertical","horizontal","transformOrigin","MenuList","autoFocusItem","Children","child","i","base","useAsyncFn_1"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[7236],{18466:(e,t,n)=>{var r=n(4293),a=n(78920);t.A=void 0;var o=a(n(95478)),i=(0,r(n(74044)).default)(o.createElement("path",{d:"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"}),"Add");t.A=i},35015:(e,t,n)=>{n.d(t,{A:()=>i});var r=n(95478),a=n(85608),o=n(71581);function i(e,t){void 0===t&&(t=[]);var n=function(e,t,n){void 0===t&&(t=[]),void 0===n&&(n={loading:!1});var i=(0,r.useRef)(0),l=(0,o.A)(),s=(0,r.useState)(n),c=s[0],d=s[1],h=(0,r.useCallback)(function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var r=++i.current;return c.loading||d(function(e){return(0,a.__assign)((0,a.__assign)({},e),{loading:!0})}),e.apply(void 0,t).then(function(e){return l()&&r===i.current&&d({value:e,loading:!1}),e},function(e){return l()&&r===i.current&&d({error:e,loading:!1}),e})},t);return[c,h]}(e,t,{loading:!0}),i=n[0],l=n[1];return(0,r.useEffect)(function(){l()},[l]),i}},39590:(e,t,n)=>{var r=n(4293),a=n(78920);t.A=void 0;var o=a(n(95478)),i=(0,r(n(74044)).default)(o.createElement("path",{d:"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"}),"Delete");t.A=i},41241:(e,t,n)=>{n.d(t,{S:()=>d});var r=n(31085),a=n(10394),o=n(88951),i=n(37976),l=n(95478);function s(e){const t=(0,i.useTheme)(),[n,s]=(0,l.useState)(!1);return(0,l.useEffect)(()=>{const e=setTimeout(()=>s(!0),t.transitions.duration.short);return()=>clearTimeout(e)},[t.transitions.duration.short]),n?(0,r.jsx)(o.A,{...e,"data-testid":"progress"}):(0,r.jsx)(a.A,{display:"none","data-testid":"progress"})}const c=(0,l.lazy)(()=>Promise.all([n.e(9655),n.e(8727),n.e(4093)]).then(n.bind(n,74093)).then(e=>({default:e.OpenApiDefinition}))),d=e=>{const t=e.supportedSubmitMethods?.map(e=>e.toLocaleLowerCase());return(0,r.jsx)(l.Suspense,{fallback:(0,r.jsx)(s,{}),children:(0,r.jsx)(c,{...e,supportedSubmitMethods:t})})}},52235:(e,t,n)=>{var r=n(4293),a=n(78920);t.A=void 0;var o=a(n(95478)),i=(0,r(n(74044)).default)(o.createElement("path",{d:"M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z"}),"ArrowForward");t.A=i},55735:(e,t,n)=>{var r=n(4293),a=n(78920);t.A=void 0;var o=a(n(95478)),i=(0,r(n(74044)).default)(o.createElement("path",{d:"M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z"}),"ArrowBack");t.A=i},84441:(e,t,n)=>{n.d(t,{A:()=>C});var r=n(39850),a=n(89575),o=n(95478);function i(e){var t,n,r="";if("string"==typeof e||"number"==typeof e)r+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;t<e.length;t++)e[t]&&(n=i(e[t]))&&(r&&(r+=" "),r+=n);else for(t in e)e[t]&&(r&&(r+=" "),r+=t);return r}const l=function(){for(var e,t,n=0,r="";n<arguments.length;)(e=arguments[n++])&&(t=i(e))&&(r&&(r+=" "),r+=t);return r};var s=n(37976),c=n(4321),d=n(38483);const h=(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"),p=(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"),u=(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"),f=(0,d.A)(o.createElement("path",{d:"M11,9H13V7H11M12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4C16.41,4 20,7.59 20, 12C20,16.41 16.41,20 12,20M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10, 10 0 0,0 12,2M11,17H13V11H11V17Z"}),"InfoOutlined"),m=(0,d.A)(o.createElement("path",{d:"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"}),"Close");var g=n(29365),v=n(11192),A={success:o.createElement(h,{fontSize:"inherit"}),warning:o.createElement(p,{fontSize:"inherit"}),error:o.createElement(u,{fontSize:"inherit"}),info:o.createElement(f,{fontSize:"inherit"})},x=o.createElement(m,{fontSize:"small"}),y=o.forwardRef(function(e,t){var n=e.action,i=e.children,s=e.classes,d=e.className,h=e.closeText,p=void 0===h?"Close":h,u=e.color,f=e.icon,m=e.iconMapping,y=void 0===m?A:m,C=e.onClose,b=e.role,k=void 0===b?"alert":b,j=e.severity,E=void 0===j?"success":j,S=e.variant,M=void 0===S?"standard":S,z=(0,r.A)(e,["action","children","classes","className","closeText","color","icon","iconMapping","onClose","role","severity","variant"]);return o.createElement(c.A,(0,a.A)({role:k,square:!0,elevation:0,className:l(s.root,s["".concat(M).concat((0,v.A)(u||E))],d),ref:t},z),!1!==f?o.createElement("div",{className:s.icon},f||y[E]||A[E]):null,o.createElement("div",{className:s.message},i),null!=n?o.createElement("div",{className:s.action},n):null,null==n&&C?o.createElement("div",{className:s.action},o.createElement(g.A,{size:"small","aria-label":p,title:p,color:"inherit",onClick:C},x)):null)});const C=(0,s.withStyles)(function(e){var t="light"===e.palette.type?s.darken:s.lighten,n="light"===e.palette.type?s.lighten:s.darken;return{root:(0,a.A)({},e.typography.body2,{borderRadius:e.shape.borderRadius,backgroundColor:"transparent",display:"flex",padding:"6px 16px"}),standardSuccess:{color:t(e.palette.success.main,.6),backgroundColor:n(e.palette.success.main,.9),"& $icon":{color:e.palette.success.main}},standardInfo:{color:t(e.palette.info.main,.6),backgroundColor:n(e.palette.info.main,.9),"& $icon":{color:e.palette.info.main}},standardWarning:{color:t(e.palette.warning.main,.6),backgroundColor:n(e.palette.warning.main,.9),"& $icon":{color:e.palette.warning.main}},standardError:{color:t(e.palette.error.main,.6),backgroundColor:n(e.palette.error.main,.9),"& $icon":{color:e.palette.error.main}},outlinedSuccess:{color:t(e.palette.success.main,.6),border:"1px solid ".concat(e.palette.success.main),"& $icon":{color:e.palette.success.main}},outlinedInfo:{color:t(e.palette.info.main,.6),border:"1px solid ".concat(e.palette.info.main),"& $icon":{color:e.palette.info.main}},outlinedWarning:{color:t(e.palette.warning.main,.6),border:"1px solid ".concat(e.palette.warning.main),"& $icon":{color:e.palette.warning.main}},outlinedError:{color:t(e.palette.error.main,.6),border:"1px solid ".concat(e.palette.error.main),"& $icon":{color:e.palette.error.main}},filledSuccess:{color:"#fff",fontWeight:e.typography.fontWeightMedium,backgroundColor:e.palette.success.main},filledInfo:{color:"#fff",fontWeight:e.typography.fontWeightMedium,backgroundColor:e.palette.info.main},filledWarning:{color:"#fff",fontWeight:e.typography.fontWeightMedium,backgroundColor:e.palette.warning.main},filledError:{color:"#fff",fontWeight:e.typography.fontWeightMedium,backgroundColor:e.palette.error.main},icon:{marginRight:12,padding:"7px 0",display:"flex",fontSize:22,opacity:.9},message:{padding:"8px 0"},action:{display:"flex",alignItems:"center",marginLeft:"auto",paddingLeft:16,marginRight:-8}}},{name:"MuiAlert"})(y)},89031:(e,t,n)=>{var r=n(4293),a=n(78920);t.A=void 0;var o=a(n(95478)),i=(0,r(n(74044)).default)(o.createElement("path",{d:"M11 7h2v2h-2zm0 4h2v6h-2zm1-9C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"}),"InfoOutlined");t.A=i},96040:(e,t,n)=>{n.d(t,{n:()=>w});var r=n(31085),a=n(40703),o=n(59469),i=n(48653),l=n(45685),s=n(37197),c=n(37976),d=n(53373),h=n.n(d),p=n(10394),u=n(72501),f=n(52235),m=n(37725);const g=(0,c.makeStyles)(e=>({root:{maxWidth:"fit-content",padding:e.spacing(2,2,2,2.5)},boxTitle:{margin:0,color:e.palette.textSubtle},arrow:{color:e.palette.textSubtle}}),{name:"BackstageBottomLink"});function v(e){const{link:t,title:n,onClick:a}=e,o=g();return(0,r.jsxs)(p.A,{children:[(0,r.jsx)(s.A,{}),(0,r.jsx)(m.N_,{to:t,onClick:a,underline:"none",children:(0,r.jsxs)(p.A,{display:"flex",alignItems:"center",className:o.root,children:[(0,r.jsx)(p.A,{className:o.boxTitle,fontWeight:"fontWeightBold",m:1,children:(0,r.jsx)(u.A,{children:(0,r.jsx)("strong",{children:n})})}),(0,r.jsx)(f.A,{className:o.arrow})]})})]})}var A=n(95478),x=n(64947);const y=(0,A.forwardRef)((e,t)=>(0,r.jsx)(m.N_,{ref:t,...e,color:"initial"})),C=(0,A.forwardRef)((e,t)=>(0,r.jsx)(x.A,{ref:t,component:y,...e}));var b=n(56573),k=n(21006),j=n(75501);const E=e=>{const{slackChannel:t}=e,{t:n}=(0,j.useTranslationRef)(k.O);return t?"string"==typeof t?(0,r.jsx)(u.A,{children:n("errorBoundary.title",{slackChannel:t})}):t.href?(0,r.jsx)(C,{to:t.href,variant:"contained",children:t.name}):(0,r.jsx)(u.A,{children:n("errorBoundary.title",{slackChannel:t.name})}):null},S=class extends A.Component{constructor(e){super(e),this.state={error:void 0,errorInfo:void 0}}componentDidCatch(e,t){console.error(`ErrorBoundary, error: ${e}`,{error:e,errorInfo:t}),this.setState({error:e,errorInfo:t})}render(){const{slackChannel:e,children:t}=this.props,{error:n}=this.state;return n?(0,r.jsx)(b.b,{title:"Something Went Wrong",error:n,children:(0,r.jsx)(E,{slackChannel:e})}):t}},M=(0,c.makeStyles)(e=>({noPadding:{padding:0,"&:last-child":{paddingBottom:0}},contentAlignBottom:{display:"flex",alignItems:"self-end"},header:{padding:e.spacing(2,2,2,2.5)},headerTitle:{fontWeight:e.typography.fontWeightBold},headerSubheader:{paddingTop:e.spacing(1)},headerAvatar:{},headerAction:{},headerContent:{},subheader:{display:"flex"}}),{name:"BackstageInfoCard"}),z=(0,c.withStyles)(e=>({root:{display:"inline-block",padding:e.spacing(8,8,0,0),float:"right"}}),{name:"BackstageInfoCardCardActionsTopRight"})(o.A),L={card:{flex:{display:"flex",flexDirection:"column"},fullHeight:{display:"flex",flexDirection:"column",height:"100%"},gridItem:{display:"flex",flexDirection:"column",height:"calc(100% - 10px)",marginBottom:"10px",breakInside:"avoid-page","@media print":{height:"auto"}}},cardContent:{fullHeight:{flex:1},gridItem:{flex:1}}};function w(e){const{title:t,subheader:n,divider:c=!0,deepLink:d,slackChannel:p,errorBoundaryProps:u,variant:f,alignContent:m="normal",children:g,headerStyle:A,headerProps:x,icon:y,action:C,actionsClassName:b,actions:k,cardClassName:j,actionsTopRight:E,className:w,noPadding:N,titleTypographyProps:W,subheaderTypographyProps:T}=e,I=M();let B={},H={};f&&f.split(/[\s]+/g).forEach(e=>{B={...B,...L.card[e]},H={...H,...L.cardContent[e]}});const R=u||(p?{slackChannel:p}:{});return(0,r.jsx)(a.A,{style:B,className:w,children:(0,r.jsxs)(S,{...R,children:[t&&(0,r.jsx)(l.A,{classes:{root:h()(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:W,subheaderTypographyProps:T,...x}),E&&(0,r.jsx)(z,{children:E}),c&&(0,r.jsx)(s.A,{}),(0,r.jsx)(i.A,{className:h()(j,{[I.noPadding]:N,[I.contentAlignBottom]:"bottom"===m}),style:H,children:g}),k&&(0,r.jsx)(o.A,{className:b,children:k}),d&&(0,r.jsx)(v,{...d})]})})}}}]);
2
+ //# sourceMappingURL=7236.f3886d59.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static/7236.f3886d59.chunk.js","mappings":"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","sources":["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/@backstage/plugin-api-docs/node_modules/@backstage/core-components/dist/components/Progress/Progress.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-api-docs/dist/components/OpenApiDefinitionWidget/OpenApiDefinitionWidget.esm.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/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/@backstage/core-components/dist/layout/BottomLink/BottomLink.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/core-components/dist/components/LinkButton/LinkButton.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/core-components/dist/layout/ErrorBoundary/ErrorBoundary.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/core-components/dist/layout/InfoCard/InfoCard.esm.js"],"sourcesContent":["\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"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;","import { jsx } from 'react/jsx-runtime';\nimport Box from '@material-ui/core/Box';\nimport LinearProgress from '@material-ui/core/LinearProgress';\nimport { useTheme } from '@material-ui/core/styles';\nimport { useState, useEffect } from 'react';\n\nfunction Progress(props) {\n const theme = useTheme();\n const [isVisible, setIsVisible] = useState(false);\n useEffect(() => {\n const handle = setTimeout(\n () => setIsVisible(true),\n theme.transitions.duration.short\n );\n return () => clearTimeout(handle);\n }, [theme.transitions.duration.short]);\n return isVisible ? /* @__PURE__ */ jsx(LinearProgress, { ...props, \"data-testid\": \"progress\" }) : /* @__PURE__ */ jsx(Box, { display: \"none\", \"data-testid\": \"progress\" });\n}\n\nexport { Progress };\n//# sourceMappingURL=Progress.esm.js.map\n","import { jsx } from 'react/jsx-runtime';\nimport { Progress } from '@backstage/core-components';\nimport { lazy, Suspense } from 'react';\n\nconst LazyOpenApiDefinition = lazy(\n () => import('./OpenApiDefinition.esm.js').then((m) => ({\n default: m.OpenApiDefinition\n }))\n);\nconst OpenApiDefinitionWidget = (props) => {\n const validSubmitMethods = props.supportedSubmitMethods?.map(\n (method) => method.toLocaleLowerCase()\n );\n return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(Progress, {}), children: /* @__PURE__ */ jsx(\n LazyOpenApiDefinition,\n {\n ...props,\n supportedSubmitMethods: validSubmitMethods\n }\n ) });\n};\n\nexport { OpenApiDefinitionWidget };\n//# sourceMappingURL=OpenApiDefinitionWidget.esm.js.map\n","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z\"\n}), 'ArrowForward');\n\nexports.default = _default;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z\"\n}), 'ArrowBack');\n\nexports.default = _default;","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;","import { jsxs, jsx } from 'react/jsx-runtime';\nimport Box from '@material-ui/core/Box';\nimport Divider from '@material-ui/core/Divider';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport ArrowIcon from '@material-ui/icons/ArrowForward';\nimport { Link } from '../../components/Link/Link.esm.js';\n\nconst useStyles = makeStyles(\n (theme) => ({\n root: {\n maxWidth: \"fit-content\",\n padding: theme.spacing(2, 2, 2, 2.5)\n },\n boxTitle: {\n margin: 0,\n color: theme.palette.textSubtle\n },\n arrow: {\n color: theme.palette.textSubtle\n }\n }),\n { name: \"BackstageBottomLink\" }\n);\nfunction BottomLink(props) {\n const { link, title, onClick } = props;\n const classes = useStyles();\n return /* @__PURE__ */ jsxs(Box, { children: [\n /* @__PURE__ */ jsx(Divider, {}),\n /* @__PURE__ */ jsx(Link, { to: link, onClick, underline: \"none\", children: /* @__PURE__ */ jsxs(Box, { display: \"flex\", alignItems: \"center\", className: classes.root, children: [\n /* @__PURE__ */ jsx(Box, { className: classes.boxTitle, fontWeight: \"fontWeightBold\", m: 1, children: /* @__PURE__ */ jsx(Typography, { children: /* @__PURE__ */ jsx(\"strong\", { children: title }) }) }),\n /* @__PURE__ */ jsx(ArrowIcon, { className: classes.arrow })\n ] }) })\n ] });\n}\n\nexport { BottomLink };\n//# sourceMappingURL=BottomLink.esm.js.map\n","import { jsx } from 'react/jsx-runtime';\nimport Button$1 from '@material-ui/core/Button';\nimport { forwardRef } from 'react';\nimport { Link } from '../Link/Link.esm.js';\n\nconst LinkWrapper = forwardRef((props, ref) => /* @__PURE__ */ jsx(Link, { ref, ...props, color: \"initial\" }));\nconst LinkButton = forwardRef((props, ref) => /* @__PURE__ */ jsx(Button$1, { ref, component: LinkWrapper, ...props }));\nconst Button = LinkButton;\n\nexport { Button, LinkButton };\n//# sourceMappingURL=LinkButton.esm.js.map\n","import { jsx } from 'react/jsx-runtime';\nimport Typography from '@material-ui/core/Typography';\nimport { Component } from 'react';\nimport { LinkButton } from '../../components/LinkButton/LinkButton.esm.js';\nimport { ErrorPanel } from '../../components/ErrorPanel/ErrorPanel.esm.js';\nimport { coreComponentsTranslationRef } from '../../translation.esm.js';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\nconst SlackLink = (props) => {\n const { slackChannel } = props;\n const { t } = useTranslationRef(coreComponentsTranslationRef);\n if (!slackChannel) {\n return null;\n } else if (typeof slackChannel === \"string\") {\n return /* @__PURE__ */ jsx(Typography, { children: t(\"errorBoundary.title\", { slackChannel }) });\n } else if (!slackChannel.href) {\n return /* @__PURE__ */ jsx(Typography, { children: t(\"errorBoundary.title\", {\n slackChannel: slackChannel.name\n }) });\n }\n return /* @__PURE__ */ jsx(LinkButton, { to: slackChannel.href, variant: \"contained\", children: slackChannel.name });\n};\nconst ErrorBoundary = class ErrorBoundary2 extends Component {\n constructor(props) {\n super(props);\n this.state = {\n error: void 0,\n errorInfo: void 0\n };\n }\n componentDidCatch(error, errorInfo) {\n console.error(`ErrorBoundary, error: ${error}`, { error, errorInfo });\n this.setState({ error, errorInfo });\n }\n render() {\n const { slackChannel, children } = this.props;\n const { error } = this.state;\n if (!error) {\n return children;\n }\n return /* @__PURE__ */ jsx(ErrorPanel, { title: \"Something Went Wrong\", error, children: /* @__PURE__ */ jsx(SlackLink, { slackChannel }) });\n }\n};\n\nexport { ErrorBoundary };\n//# sourceMappingURL=ErrorBoundary.esm.js.map\n","import { jsx, jsxs } from 'react/jsx-runtime';\nimport Card from '@material-ui/core/Card';\nimport CardActions from '@material-ui/core/CardActions';\nimport CardContent from '@material-ui/core/CardContent';\nimport CardHeader from '@material-ui/core/CardHeader';\nimport Divider from '@material-ui/core/Divider';\nimport { makeStyles, withStyles } from '@material-ui/core/styles';\nimport classNames from 'classnames';\nimport { BottomLink } from '../BottomLink/BottomLink.esm.js';\nimport { ErrorBoundary } from '../ErrorBoundary/ErrorBoundary.esm.js';\n\nconst useStyles = makeStyles(\n (theme) => ({\n noPadding: {\n padding: 0,\n \"&:last-child\": {\n paddingBottom: 0\n }\n },\n contentAlignBottom: {\n display: \"flex\",\n alignItems: \"self-end\"\n },\n header: {\n padding: theme.spacing(2, 2, 2, 2.5)\n },\n headerTitle: {\n fontWeight: theme.typography.fontWeightBold\n },\n headerSubheader: {\n paddingTop: theme.spacing(1)\n },\n headerAvatar: {},\n headerAction: {},\n headerContent: {},\n subheader: {\n display: \"flex\"\n }\n }),\n { name: \"BackstageInfoCard\" }\n);\nconst CardActionsTopRight = withStyles(\n (theme) => ({\n root: {\n display: \"inline-block\",\n padding: theme.spacing(8, 8, 0, 0),\n float: \"right\"\n }\n }),\n { name: \"BackstageInfoCardCardActionsTopRight\" }\n)(CardActions);\nconst VARIANT_STYLES = {\n card: {\n flex: {\n display: \"flex\",\n flexDirection: \"column\"\n },\n fullHeight: {\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\"\n },\n gridItem: {\n display: \"flex\",\n flexDirection: \"column\",\n height: \"calc(100% - 10px)\",\n // for pages without content header\n marginBottom: \"10px\",\n breakInside: \"avoid-page\",\n \"@media print\": {\n height: \"auto\"\n }\n }\n },\n cardContent: {\n fullHeight: {\n flex: 1\n },\n gridItem: {\n flex: 1\n }\n }\n};\nfunction InfoCard(props) {\n const {\n title,\n subheader,\n divider = true,\n deepLink,\n slackChannel,\n errorBoundaryProps,\n variant,\n alignContent = \"normal\",\n children,\n headerStyle,\n headerProps,\n icon,\n action,\n actionsClassName,\n actions,\n cardClassName,\n actionsTopRight,\n className,\n noPadding,\n titleTypographyProps,\n subheaderTypographyProps\n } = props;\n const classes = useStyles();\n let calculatedStyle = {};\n let calculatedCardStyle = {};\n if (variant) {\n const variants = variant.split(/[\\s]+/g);\n variants.forEach((name) => {\n calculatedStyle = {\n ...calculatedStyle,\n ...VARIANT_STYLES.card[name]\n };\n calculatedCardStyle = {\n ...calculatedCardStyle,\n ...VARIANT_STYLES.cardContent[name]\n };\n });\n }\n const cardSubTitle = () => {\n if (!subheader && !icon) {\n return null;\n }\n return /* @__PURE__ */ jsxs(\"div\", { \"data-testid\": \"info-card-subheader\", children: [\n subheader && /* @__PURE__ */ jsx(\"div\", { className: classes.subheader, children: subheader }),\n icon\n ] });\n };\n const errProps = errorBoundaryProps || (slackChannel ? { slackChannel } : {});\n return /* @__PURE__ */ jsx(Card, { style: calculatedStyle, className, children: /* @__PURE__ */ jsxs(ErrorBoundary, { ...errProps, children: [\n title && /* @__PURE__ */ jsx(\n CardHeader,\n {\n classes: {\n root: classNames(classes.header),\n title: classes.headerTitle,\n subheader: classes.headerSubheader,\n avatar: classes.headerAvatar,\n action: classes.headerAction,\n content: classes.headerContent\n },\n title,\n subheader: cardSubTitle(),\n action,\n style: { ...headerStyle },\n titleTypographyProps,\n subheaderTypographyProps,\n ...headerProps\n }\n ),\n actionsTopRight && /* @__PURE__ */ jsx(CardActionsTopRight, { children: actionsTopRight }),\n divider && /* @__PURE__ */ jsx(Divider, {}),\n /* @__PURE__ */ jsx(\n CardContent,\n {\n className: classNames(cardClassName, {\n [classes.noPadding]: noPadding,\n [classes.contentAlignBottom]: alignContent === \"bottom\"\n }),\n style: calculatedCardStyle,\n children\n }\n ),\n actions && /* @__PURE__ */ jsx(CardActions, { className: actionsClassName, children: actions }),\n deepLink && /* @__PURE__ */ jsx(BottomLink, { ...deepLink })\n ] }) });\n}\n\nexport { InfoCard };\n//# sourceMappingURL=InfoCard.esm.js.map\n"],"names":["_interopRequireDefault","_interopRequireWildcard","exports","React","_default","default","createElement","d","useAsync","fn","deps","_a","initialState","loading","lastCallId","useRef","isMounted","useMountedState","useState","state","set","callback","useCallback","args","_i","arguments","length","callId","current","prevState","__assign","apply","then","value","error","useAsyncFn","useEffect","Progress","props","theme","useTheme","isVisible","setIsVisible","handle","setTimeout","transitions","duration","short","clearTimeout","jsx","LinearProgress","Box","display","LazyOpenApiDefinition","lazy","m","OpenApiDefinition","OpenApiDefinitionWidget","validSubmitMethods","supportedSubmitMethods","map","method","toLocaleLowerCase","Suspense","fallback","children","r","e","t","f","n","Array","isArray","createSvgIcon","defaultIconMapping","success","SuccessOutlined","fontSize","warning","ReportProblemOutlined","ErrorOutline","info","InfoOutlined","_ref","Close","Alert","ref","action","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","getColor","palette","type","darken","lighten","getBackgroundColor","typography","body2","borderRadius","shape","backgroundColor","padding","standardSuccess","main","standardInfo","standardWarning","standardError","outlinedSuccess","border","outlinedInfo","outlinedWarning","outlinedError","filledSuccess","fontWeight","fontWeightMedium","filledInfo","filledWarning","filledError","marginRight","opacity","alignItems","marginLeft","paddingLeft","name","useStyles","makeStyles","maxWidth","spacing","boxTitle","margin","textSubtle","arrow","BottomLink","link","jsxs","Divider","to","underline","Typography","A","LinkWrapper","forwardRef","LinkButton","Button","component","SlackLink","slackChannel","useTranslationRef","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":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[8799],{24170:(e,a,t)=>{t.d(a,{o:()=>i,q:()=>r});const i=e=>e&&e.trim()?e.length>253?"Must be 253 characters or less":/^[a-z0-9]([-a-z0-9]*[a-z0-9])?$/.test(e)?null:"Must be lowercase alphanumeric with hyphens, start and end with alphanumeric":"Name is required",r=e=>{if(!e)return null;try{const a=new URL(e);return["http:","https:"].includes(a.protocol)?null:"Must be a valid HTTP or HTTPS URL"}catch{return"Must be a valid URL"}}},26997:(e,a,t)=>{t.d(a,{C:()=>H});var i=t(31085),r=t(95478),n=t(76891),s=t(61477),l=t(46805),o=t(10394),d=t(72501),c=t(42899),u=t(16249),p=t(34839),h=t(29365),m=t(67720),x=t(71677),A=t(95061),v=t(29635),g=t(86901),j=t(30285),y=t(93453),b=t(64947),f=t(78467),k=t(58837),P=t(89031),S=t(18466),T=t(22097),w=t(84441),I=t(86687),C=t(65867),R=t(24170),$=t(77318);const N=(0,k.A)(e=>({asterisk:{color:"#f44336"},sectionHeader:{display:"flex",alignItems:"center",gap:e.spacing(.5),marginTop:e.spacing(2),marginBottom:e.spacing(1)},infoIcon:{fontSize:18,color:e.palette.text.secondary},tagChip:{marginRight:e.spacing(.5),marginBottom:e.spacing(.5)}})),H=({open:e,onClose:a,onSuccess:t,namespace:k,name:H})=>{const W=N(),L=(0,T.useApi)(T.configApiRef),q=(0,T.useApi)(T.fetchApiRef),z=L.getString("backend.baseUrl"),[M,U]=(0,r.useState)(!1),[E,D]=(0,r.useState)(""),[F,K]=(0,r.useState)(""),[_,B]=(0,r.useState)("v1"),[J,G]=(0,r.useState)("Draft"),[O,V]=(0,r.useState)("manual"),[Q,X]=(0,r.useState)([]),[Y,Z]=(0,r.useState)(null),[ee,ae]=(0,r.useState)(""),[te,ie]=(0,r.useState)(""),[re,ne]=(0,r.useState)(""),[se,le]=(0,r.useState)(""),[oe,de]=(0,r.useState)(""),[ce,ue]=(0,r.useState)([]),[pe,he]=(0,r.useState)(""),[me,xe]=(0,r.useState)(!1),[Ae,ve]=(0,r.useState)(null);(0,r.useEffect)(()=>{e&&k&&H&&(U(!0),he(""),q.fetch(`${z}/api/kuadrant/apiproducts/${k}/${H}`).then(async e=>{if(!e.ok){const a=await(0,$.T)(e);throw new Error(`failed to load API product. ${a}`)}return e.json()}).then(e=>{var a,t,i,r;D(e.spec.displayName||""),K(e.spec.description||""),B(e.spec.version||"v1"),G(e.spec.publishStatus||"Draft"),V(e.spec.approvalMode||"manual"),X(e.spec.tags||[]),Z(e.spec.targetRef||null),ie((null===(a=e.spec.contact)||void 0===a?void 0:a.email)||""),ne((null===(t=e.spec.contact)||void 0===t?void 0:t.team)||""),le((null===(i=e.spec.documentation)||void 0===i?void 0:i.docsURL)||""),de((null===(r=e.spec.documentation)||void 0===r?void 0:r.openAPISpecURL)||""),ue(e.status.discoveredPlans||null),ve(null),U(!1)}).catch(e=>{he(e.message||"Failed to load API product"),U(!1)}))},[e,k,H,z,q]),(0,r.useEffect)(()=>{e&&ve(null)},[e]);const ge=()=>{ee.trim()&&!Q.includes(ee.trim())&&(X([...Q,ee.trim()]),ae(""))};return(0,i.jsxs)(n.A,{open:e,onClose:a,maxWidth:"md",fullWidth:!0,children:[(0,i.jsx)(s.A,{children:"Edit API Product"}),(0,i.jsxs)(l.A,{children:[pe&&(0,i.jsx)(w.A,{severity:"error",style:{marginBottom:16},children:pe}),M?(0,i.jsx)(I.k,{}):(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.A,{className:W.sectionHeader,children:(0,i.jsx)(d.A,{variant:"subtitle1",children:(0,i.jsx)("strong",{children:"API product info"})})}),(0,i.jsxs)(c.A,{container:!0,spacing:2,children:[(0,i.jsx)(c.A,{item:!0,xs:6,children:(0,i.jsx)(u.A,{fullWidth:!0,label:"API product name",value:E,onChange:e=>D(e.target.value),placeholder:"My API",helperText:"Give a unique name for your API product",margin:"normal",required:!0,disabled:me,InputLabelProps:{classes:{asterisk:W.asterisk}}})}),(0,i.jsx)(c.A,{item:!0,xs:6,children:(0,i.jsx)(u.A,{fullWidth:!0,label:"Resource name",value:H,disabled:!0,helperText:"Kubernetes resource name (immutable)",margin:"normal"})}),(0,i.jsx)(c.A,{item:!0,xs:6,children:(0,i.jsx)(u.A,{fullWidth:!0,label:"Version",value:_,onChange:e=>B(e.target.value),placeholder:"v1",helperText:"Give a version to your API product",margin:"normal",disabled:me})}),(0,i.jsx)(c.A,{item:!0,xs:6,children:(0,i.jsx)(u.A,{fullWidth:!0,label:"Tag",value:ee,onChange:e=>ae(e.target.value),onKeyPress:e=>{"Enter"===e.key&&(e.preventDefault(),ge())},placeholder:"Add tag",helperText:"Add a tag to your API product",margin:"normal",disabled:me,InputProps:{endAdornment:ee?(0,i.jsx)(p.A,{position:"end",children:(0,i.jsx)(h.A,{size:"small",onClick:ge,disabled:me,children:(0,i.jsx)(S.A,{fontSize:"small"})})}):void 0}})}),Q.length>0&&(0,i.jsx)(c.A,{item:!0,xs:12,children:(0,i.jsx)(o.A,{display:"flex",flexWrap:"wrap",children:Q.map(e=>(0,i.jsx)(m.A,{label:e,onDelete:me?void 0:()=>{return a=e,void X(Q.filter(e=>e!==a));var a},size:"small",className:W.tagChip,disabled:me},e))})}),(0,i.jsx)(c.A,{item:!0,xs:12,children:(0,i.jsx)(u.A,{fullWidth:!0,label:"Description",value:F,onChange:e=>K(e.target.value),placeholder:"API description",margin:"normal",multiline:!0,rows:2,required:!0,disabled:me,InputLabelProps:{classes:{asterisk:W.asterisk}}})})]}),(0,i.jsxs)(o.A,{className:W.sectionHeader,children:[(0,i.jsx)(d.A,{variant:"subtitle1",children:(0,i.jsx)("strong",{children:"Associated route"})}),(0,i.jsx)(x.Ay,{title:"The HTTPRoute this API product is associated with",children:(0,i.jsx)(P.A,{className:W.infoIcon})})]}),(0,i.jsxs)(c.A,{container:!0,spacing:2,children:[(0,i.jsx)(c.A,{item:!0,xs:12,children:(0,i.jsx)(u.A,{fullWidth:!0,label:"OpenAPI Spec URL",value:oe,onChange:e=>{return a=e.target.value,de(a),void ve((0,R.q)(a));var a},placeholder:"https://api.example.com/openapi.json",helperText:Ae||"Enter the full path to your API spec file",error:!!Ae,margin:"normal",disabled:me})}),(0,i.jsx)(c.A,{item:!0,xs:12,children:(0,i.jsx)(u.A,{fullWidth:!0,label:"Documentation URL",value:se,onChange:e=>le(e.target.value),placeholder:"https://docs.example.com/api",helperText:"Link to external documentation for this API",margin:"normal",disabled:me})}),Y&&(0,i.jsx)(c.A,{item:!0,xs:12,children:(0,i.jsx)(u.A,{fullWidth:!0,label:"HTTPRoute",value:`${Y.namespace||k}/${Y.name}`,disabled:!0,helperText:"Target HTTPRoute (immutable)",margin:"normal"})})]}),Y&&(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(o.A,{className:W.sectionHeader,children:[(0,i.jsx)(d.A,{variant:"subtitle1",children:(0,i.jsx)("strong",{children:"HTTPRoute policies"})}),(0,i.jsx)(x.Ay,{title:"Shows the associated policies and rate limit tiers for the HTTPRoute",children:(0,i.jsx)(P.A,{className:W.infoIcon})})]}),(0,i.jsx)(C.g,{discoveredPlans:ce,alertSeverity:"info",alertMessage:"No PlanPolicy found for this HTTPRoute.",includeTopMargin:!1})]}),(0,i.jsxs)(o.A,{className:W.sectionHeader,children:[(0,i.jsx)(d.A,{variant:"subtitle1",children:(0,i.jsx)("strong",{children:"API Key approval"})}),(0,i.jsx)(x.Ay,{title:"Choose how API key requests are handled for this product",children:(0,i.jsx)(P.A,{className:W.infoIcon})})]}),(0,i.jsx)(A.A,{component:"fieldset",disabled:me,children:(0,i.jsxs)(v.A,{row:!0,value:O,onChange:e=>V(e.target.value),children:[(0,i.jsx)(g.A,{value:"manual",control:(0,i.jsx)(j.A,{color:"primary"}),label:(0,i.jsxs)(o.A,{children:[(0,i.jsx)(d.A,{variant:"body2",children:"Need manual approval"}),(0,i.jsx)(d.A,{variant:"caption",color:"textSecondary",children:"Requires approval for requesting this API"})]})}),(0,i.jsx)(g.A,{value:"automatic",control:(0,i.jsx)(j.A,{color:"primary"}),label:(0,i.jsxs)(o.A,{children:[(0,i.jsx)(d.A,{variant:"body2",children:"Automatic"}),(0,i.jsx)(d.A,{variant:"caption",color:"textSecondary",children:"Keys are created without need to be approved"})]})})]})})]})]}),(0,i.jsxs)(y.A,{children:[(0,i.jsx)(b.A,{onClick:a,disabled:me,children:"Cancel"}),(0,i.jsx)(b.A,{onClick:async()=>{he(""),xe(!0);try{const e={spec:{displayName:E,description:F,version:_,publishStatus:J,approvalMode:O,tags:Q,targetRef:Y,...te||re?{contact:{...te&&{email:te},...re&&{team:re}}}:{},...se||oe?{documentation:{...se&&{docsURL:se},...oe&&{openAPISpecURL:oe}}}:{}}},i=await q.fetch(`${z}/api/kuadrant/apiproducts/${k}/${H}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(!i.ok){const e=await(0,$.T)(i);throw new Error(`failed to patch APIProduct. ${e}`)}t(),a()}catch(e){he(e instanceof Error?e.message:String(e))}finally{xe(!1)}},color:"primary",variant:"contained",disabled:me||M||!E||!F||!!Ae,startIcon:me?(0,i.jsx)(f.A,{size:16,color:"inherit"}):void 0,children:me?"Saving...":"Save"})]})]})}},34955:(e,a,t)=>{t.d(a,{Al:()=>s,DS:()=>h,EM:()=>d,FL:()=>n,J:()=>r,KV:()=>g,R_:()=>c,U3:()=>l,dp:()=>p,jH:()=>v,q0:()=>m,uL:()=>A,v_:()=>o,vs:()=>u,z4:()=>x});var i=t(83572);(0,i.i)({name:"kuadrant.planpolicy.create",attributes:{action:"create"}}),(0,i.i)({name:"kuadrant.planpolicy.read",attributes:{action:"read"}}),(0,i.i)({name:"kuadrant.planpolicy.update",attributes:{action:"update"}}),(0,i.i)({name:"kuadrant.planpolicy.delete",attributes:{action:"delete"}});const r=(0,i.i)({name:"kuadrant.planpolicy.list",attributes:{action:"read"}}),n=(0,i.i)({name:"kuadrant.apiproduct.create",attributes:{action:"create"}}),s=((0,i.i)({name:"kuadrant.apiproduct.read.own",attributes:{action:"read"}}),(0,i.i)({name:"kuadrant.apiproduct.read.all",attributes:{action:"read"}})),l=(0,i.i)({name:"kuadrant.apiproduct.update.own",attributes:{action:"update"}}),o=(0,i.i)({name:"kuadrant.apiproduct.update.all",attributes:{action:"update"}}),d=(0,i.i)({name:"kuadrant.apiproduct.delete.own",attributes:{action:"delete"}}),c=(0,i.i)({name:"kuadrant.apiproduct.delete.all",attributes:{action:"delete"}}),u=(0,i.i)({name:"kuadrant.apiproduct.list",attributes:{action:"read"}}),p=(0,i.i)({name:"kuadrant.apikey.create",attributes:{action:"create"},resourceType:"apiproduct"}),h=(0,i.i)({name:"kuadrant.apikey.read.own",attributes:{action:"read"}}),m=((0,i.i)({name:"kuadrant.apikey.read.all",attributes:{action:"read"}}),(0,i.i)({name:"kuadrant.apikey.update.own",attributes:{action:"update"}})),x=(0,i.i)({name:"kuadrant.apikey.update.all",attributes:{action:"update"}}),A=(0,i.i)({name:"kuadrant.apikey.delete.own",attributes:{action:"delete"}}),v=(0,i.i)({name:"kuadrant.apikey.delete.all",attributes:{action:"delete"}}),g=(0,i.i)({name:"kuadrant.apikey.approve",attributes:{action:"update"}})},46205:(e,a,t)=>{t.d(a,{W:()=>n,l:()=>r});var i=t(24217);function r(e,a){const t="resourceType"in e?{permission:e,resourceRef:a}:{permission:e},r=(0,i.J)(t);return{allowed:r.allowed,loading:r.loading,error:r.error}}function n(e,a,t,i){return!!i||!(!t||e!==a)}},63221:(e,a,t)=>{t.d(a,{K:()=>A});var i=t(31085),r=t(95478),n=t(76891),s=t(61477),l=t(10394),o=t(46805),d=t(59461),c=t(72501),u=t(16249),p=t(93453),h=t(64947),m=t(78467),x=t(77225);const A=({open:e,title:a,description:t,confirmText:A,severity:v="normal",deleting:g=!1,onConfirm:j,onCancel:y})=>{const[b,f]=(0,r.useState)("");(0,r.useEffect)(()=>{e||f("")},[e]);const k="high"===v&&A,P=!k||b===A;return(0,i.jsxs)(n.A,{open:e,onClose:g?void 0:y,maxWidth:"sm",fullWidth:!0,children:[(0,i.jsxs)(s.A,{children:["high"===v&&(0,i.jsxs)(l.A,{display:"flex",alignItems:"center",style:{gap:8},children:[(0,i.jsx)(x.A,{color:"error"}),(0,i.jsx)("span",{children:a})]}),"high"!==v&&a]}),(0,i.jsxs)(o.A,{children:[(0,i.jsx)(d.A,{style:{whiteSpace:"pre-line"},children:t}),k&&(0,i.jsxs)(l.A,{mt:2,children:[(0,i.jsxs)(c.A,{variant:"body2",color:"textSecondary",gutterBottom:!0,children:["Type ",(0,i.jsx)("strong",{children:A})," to confirm:"]}),(0,i.jsx)(u.A,{fullWidth:!0,variant:"outlined",size:"small",value:b,onChange:e=>f(e.target.value),disabled:g,autoFocus:!0,placeholder:A})]})]}),(0,i.jsxs)(p.A,{children:[(0,i.jsx)(h.A,{onClick:y,disabled:g,children:"Cancel"}),(0,i.jsx)(h.A,{onClick:()=>{P&&j()},color:"secondary",variant:"contained",disabled:g||!P,startIcon:g?(0,i.jsx)(m.A,{size:16,color:"inherit"}):void 0,children:g?"Deleting...":"Delete"})]})]})}},65867:(e,a,t)=>{t.d(a,{g:()=>d});var i=t(31085),r=(t(95478),t(10394)),n=t(72501),s=t(67720),l=t(54917),o=t(84441);const d=({discoveredPlans:e,alertSeverity:a="warning",alertMessage:t="No PlanPolicy found for this HTTPRoute. API keys and rate limiting may not be available.",includeTopMargin:d=!0})=>{const c=(0,l.A)();return(0,i.jsx)(r.A,{mt:d?1:0,p:2,bgcolor:c.palette.background.default,borderRadius:1,border:`1px solid ${c.palette.divider}`,children:e?(0,i.jsx)(i.Fragment,{children:e.length>0?(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.A,{variant:"caption",display:"block",gutterBottom:!0,color:"textSecondary",style:{marginTop:8},children:"Available PlanPolicy Tiers:"}),(0,i.jsx)(r.A,{display:"flex",flexWrap:"wrap",mt:1,style:{gap:8},children:e.map((e,a)=>{var t,r,n;const l=(null===(t=e.limits)||void 0===t?void 0:t.daily)?`${e.limits.daily}/day`:(null===(r=e.limits)||void 0===r?void 0:r.monthly)?`${e.limits.monthly}/month`:(null===(n=e.limits)||void 0===n?void 0:n.yearly)?`${e.limits.yearly}/year`:"No limit";return(0,i.jsx)(s.A,{label:`${e.tier}: ${l}`,size:"small",variant:"outlined",color:"primary"},a)})})]}):(0,i.jsx)(n.A,{variant:"caption",color:"textSecondary",children:"No plans defined in this PlanPolicy"})}):(0,i.jsx)(o.A,{severity:a,children:t})})}},77318:(e,a,t)=>{async function i(e){const a=await e.json().catch(()=>({}));switch(e.status){case 400:return a.error||"Invalid request. Please check your input.";case 403:return"Permission denied. Contact your administrator.";case 404:return"Resource not found. It may have been deleted.";case 409:return"Resource already exists or conflicts with existing data.";case 500:return"Server error. Please try again or contact support.";default:return a.error||`Request failed (${e.status})`}}t.d(a,{T:()=>i})}}]);
2
+ //# sourceMappingURL=8799.939d14f9.chunk.js.map