@kuadrant/kuadrant-backstage-plugin-frontend 0.0.2-dev-7d09bfa → 0.0.2-dev-e6e0dbf
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -4
- package/dist/index.esm.js +1 -2
- package/dist/index.esm.js.map +1 -1
- package/dist/plugin.esm.js +1 -9
- package/dist/plugin.esm.js.map +1 -1
- package/dist-scalprum/internal.plugin-kuadrant.1ec7b1dc71663b4b9a17.js +2 -0
- package/dist-scalprum/internal.plugin-kuadrant.1ec7b1dc71663b4b9a17.js.map +1 -0
- package/dist-scalprum/plugin-manifest.json +2 -2
- package/dist-scalprum/static/1085.d17e689a.chunk.js +3 -0
- package/dist-scalprum/static/1085.d17e689a.chunk.js.map +1 -0
- package/dist-scalprum/static/1645.db086648.chunk.js +3 -0
- package/dist-scalprum/static/{5568.5dbce633.chunk.js.LICENSE.txt → 1645.db086648.chunk.js.LICENSE.txt} +0 -9
- package/dist-scalprum/static/1645.db086648.chunk.js.map +1 -0
- package/dist-scalprum/static/2233.bf0c10d7.chunk.js +3 -0
- package/dist-scalprum/static/2233.bf0c10d7.chunk.js.LICENSE.txt +9 -0
- package/dist-scalprum/static/2233.bf0c10d7.chunk.js.map +1 -0
- package/dist-scalprum/static/2628.20156dc1.chunk.js +3 -0
- package/dist-scalprum/static/2628.20156dc1.chunk.js.map +1 -0
- package/dist-scalprum/static/2946.a35243f1.chunk.js +3 -0
- package/dist-scalprum/static/{9510.e4112e19.chunk.js.LICENSE.txt → 2946.a35243f1.chunk.js.LICENSE.txt} +10 -0
- package/dist-scalprum/static/2946.a35243f1.chunk.js.map +1 -0
- package/dist-scalprum/static/2952.b3c7e41c.chunk.js +2 -0
- package/dist-scalprum/static/2952.b3c7e41c.chunk.js.map +1 -0
- package/dist-scalprum/static/{2967.8d9c1b1f.chunk.js → 2967.6a1db3ad.chunk.js} +2 -2
- package/dist-scalprum/static/2967.6a1db3ad.chunk.js.map +1 -0
- package/dist-scalprum/static/3091.9a74ea5f.chunk.js +2 -0
- package/dist-scalprum/static/{65.0e01be7c.chunk.js.map → 3091.9a74ea5f.chunk.js.map} +1 -1
- package/dist-scalprum/static/{327.cd6b3fee.chunk.js → 327.a9a99299.chunk.js} +2 -2
- package/dist-scalprum/static/327.a9a99299.chunk.js.map +1 -0
- package/dist-scalprum/static/3504.1c2f2e54.chunk.js +3 -0
- package/dist-scalprum/static/3504.1c2f2e54.chunk.js.LICENSE.txt +9 -0
- package/dist-scalprum/static/3504.1c2f2e54.chunk.js.map +1 -0
- package/dist-scalprum/static/3657.882640ca.chunk.js +3 -0
- package/dist-scalprum/static/3657.882640ca.chunk.js.LICENSE.txt +8 -0
- package/dist-scalprum/static/3657.882640ca.chunk.js.map +1 -0
- package/dist-scalprum/static/3954.12dd8006.chunk.js +3 -0
- package/dist-scalprum/static/3954.12dd8006.chunk.js.LICENSE.txt +9 -0
- package/dist-scalprum/static/3954.12dd8006.chunk.js.map +1 -0
- package/dist-scalprum/static/3984.647ef00c.chunk.js +2 -0
- package/dist-scalprum/static/3984.647ef00c.chunk.js.map +1 -0
- package/dist-scalprum/static/4026.d652a7a1.chunk.js +2 -0
- package/dist-scalprum/static/4026.d652a7a1.chunk.js.map +1 -0
- package/dist-scalprum/static/{6386.6386.ce38cef3.css → 4093.4093.3597955d.css} +1 -1
- package/dist-scalprum/static/4093.4093.3597955d.css.map +1 -0
- package/dist-scalprum/static/4093.ee6f0452.chunk.js +3 -0
- package/dist-scalprum/static/4093.ee6f0452.chunk.js.map +1 -0
- package/dist-scalprum/static/4382.a7363415.chunk.js +3 -0
- package/dist-scalprum/static/4382.a7363415.chunk.js.map +1 -0
- package/dist-scalprum/static/4614.23f2a85b.chunk.js +2 -0
- package/dist-scalprum/static/4614.23f2a85b.chunk.js.map +1 -0
- package/dist-scalprum/static/{4682.3c7098a8.chunk.js → 4682.bd2dfccd.chunk.js} +2 -2
- package/dist-scalprum/static/4682.bd2dfccd.chunk.js.map +1 -0
- package/dist-scalprum/static/4935.e14465ff.chunk.js +3 -0
- package/dist-scalprum/static/4935.e14465ff.chunk.js.LICENSE.txt +9 -0
- package/dist-scalprum/static/4935.e14465ff.chunk.js.map +1 -0
- package/dist-scalprum/static/5010.0cd6c959.chunk.js +3 -0
- package/dist-scalprum/static/5010.0cd6c959.chunk.js.map +1 -0
- package/dist-scalprum/static/{5203.43732b3f.chunk.js → 5203.539ed3ec.chunk.js} +2 -2
- package/dist-scalprum/static/{5203.43732b3f.chunk.js.map → 5203.539ed3ec.chunk.js.map} +1 -1
- package/dist-scalprum/static/{5453.b3ee2392.chunk.js → 5453.ecdee66d.chunk.js} +2 -2
- package/dist-scalprum/static/{5453.b3ee2392.chunk.js.map → 5453.ecdee66d.chunk.js.map} +1 -1
- package/dist-scalprum/static/6038.63d1f832.chunk.js +3 -0
- package/dist-scalprum/static/6038.63d1f832.chunk.js.LICENSE.txt +8 -0
- package/dist-scalprum/static/6038.63d1f832.chunk.js.map +1 -0
- package/dist-scalprum/static/635.e030b18a.chunk.js +3 -0
- package/dist-scalprum/static/635.e030b18a.chunk.js.LICENSE.txt +9 -0
- package/dist-scalprum/static/635.e030b18a.chunk.js.map +1 -0
- package/dist-scalprum/static/6371.d45f37cc.chunk.js +2 -0
- package/dist-scalprum/static/6371.d45f37cc.chunk.js.map +1 -0
- package/dist-scalprum/static/{6800.8ec3a2eb.chunk.js → 6800.6e2a08fe.chunk.js} +2 -2
- package/dist-scalprum/static/{6800.8ec3a2eb.chunk.js.map → 6800.6e2a08fe.chunk.js.map} +1 -1
- package/dist-scalprum/static/{6840.6cc88a16.chunk.js → 6840.3bd67cf4.chunk.js} +2 -2
- package/dist-scalprum/static/{6840.6cc88a16.chunk.js.map → 6840.3bd67cf4.chunk.js.map} +1 -1
- package/dist-scalprum/static/7164.5dc4bc72.chunk.js +2 -0
- package/dist-scalprum/static/7164.5dc4bc72.chunk.js.map +1 -0
- package/dist-scalprum/static/{7791.55db7365.chunk.js → 7791.8135d440.chunk.js} +2 -2
- package/dist-scalprum/static/{7791.55db7365.chunk.js.map → 7791.8135d440.chunk.js.map} +1 -1
- package/dist-scalprum/static/8083.4763f88b.chunk.js +206 -0
- package/dist-scalprum/static/8083.4763f88b.chunk.js.LICENSE.txt +9 -0
- package/dist-scalprum/static/8083.4763f88b.chunk.js.map +1 -0
- package/dist-scalprum/static/{8172.e89bbae7.chunk.js → 8172.cbe1f2c4.chunk.js} +2 -2
- package/dist-scalprum/static/8172.cbe1f2c4.chunk.js.map +1 -0
- package/dist-scalprum/static/{8799.4ea4639c.chunk.js → 8799.83d049f3.chunk.js} +2 -2
- package/dist-scalprum/static/{8799.4ea4639c.chunk.js.map → 8799.83d049f3.chunk.js.map} +1 -1
- package/dist-scalprum/static/{3587.490690d6.chunk.js → 9316.d9f2fe18.chunk.js} +2 -2
- package/dist-scalprum/static/{3587.490690d6.chunk.js.map → 9316.d9f2fe18.chunk.js.map} +1 -1
- package/dist-scalprum/static/{5568.5dbce633.chunk.js → 9655.db0c82b2.chunk.js} +3 -3
- package/dist-scalprum/static/9655.db0c82b2.chunk.js.LICENSE.txt +8 -0
- package/dist-scalprum/static/9655.db0c82b2.chunk.js.map +1 -0
- package/dist-scalprum/static/9710.7ec34777.chunk.js +2 -0
- package/dist-scalprum/static/9710.7ec34777.chunk.js.map +1 -0
- package/dist-scalprum/static/{4302.9a59485e.chunk.js → 9738.b037daf3.chunk.js} +2 -2
- package/dist-scalprum/static/9738.b037daf3.chunk.js.map +1 -0
- package/dist-scalprum/static/exposed-PluginRoot.c3fd0cc1.chunk.js +2 -0
- package/dist-scalprum/static/exposed-PluginRoot.c3fd0cc1.chunk.js.map +1 -0
- package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_http.a55e168b.chunk.js +2 -0
- package/dist-scalprum/static/{react-syntax-highlighter_languages_highlight_http.5859273c.chunk.js.map → react-syntax-highlighter_languages_highlight_http.a55e168b.chunk.js.map} +1 -1
- package/package.json +10 -11
- package/dist/components/ApprovalQueueCard/ApprovalQueueCard.esm.js +0 -761
- package/dist/components/ApprovalQueueCard/ApprovalQueueCard.esm.js.map +0 -1
- package/dist/components/ApprovalQueueCard/index.esm.js +0 -2
- package/dist/components/ApprovalQueueCard/index.esm.js.map +0 -1
- package/dist-scalprum/internal.plugin-kuadrant.5d9e1e73c7f21bbed39a.js +0 -2
- package/dist-scalprum/internal.plugin-kuadrant.5d9e1e73c7f21bbed39a.js.map +0 -1
- package/dist-scalprum/static/1994.19e6a1c5.chunk.js +0 -3
- package/dist-scalprum/static/1994.19e6a1c5.chunk.js.map +0 -1
- package/dist-scalprum/static/2628.0605e07f.chunk.js +0 -3
- package/dist-scalprum/static/2628.0605e07f.chunk.js.map +0 -1
- package/dist-scalprum/static/2752.df63f31c.chunk.js +0 -2
- package/dist-scalprum/static/2752.df63f31c.chunk.js.map +0 -1
- package/dist-scalprum/static/2967.8d9c1b1f.chunk.js.map +0 -1
- package/dist-scalprum/static/3097.582b68d3.chunk.js +0 -2
- package/dist-scalprum/static/3097.582b68d3.chunk.js.map +0 -1
- package/dist-scalprum/static/327.cd6b3fee.chunk.js.map +0 -1
- package/dist-scalprum/static/3584.c820a5c7.chunk.js +0 -2
- package/dist-scalprum/static/3584.c820a5c7.chunk.js.map +0 -1
- package/dist-scalprum/static/3647.67079e5f.chunk.js +0 -2
- package/dist-scalprum/static/3647.67079e5f.chunk.js.map +0 -1
- package/dist-scalprum/static/3984.7bc07774.chunk.js +0 -2
- package/dist-scalprum/static/3984.7bc07774.chunk.js.map +0 -1
- package/dist-scalprum/static/4302.9a59485e.chunk.js.map +0 -1
- package/dist-scalprum/static/4682.3c7098a8.chunk.js.map +0 -1
- package/dist-scalprum/static/5010.2228c754.chunk.js +0 -3
- package/dist-scalprum/static/5010.2228c754.chunk.js.map +0 -1
- package/dist-scalprum/static/5568.5dbce633.chunk.js.map +0 -1
- package/dist-scalprum/static/6272.ef31cb1c.chunk.js +0 -2
- package/dist-scalprum/static/6272.ef31cb1c.chunk.js.map +0 -1
- package/dist-scalprum/static/6371.c4899d73.chunk.js +0 -3
- package/dist-scalprum/static/6371.c4899d73.chunk.js.map +0 -1
- package/dist-scalprum/static/6386.6386.ce38cef3.css.map +0 -1
- package/dist-scalprum/static/6386.903891f3.chunk.js +0 -3
- package/dist-scalprum/static/6386.903891f3.chunk.js.map +0 -1
- package/dist-scalprum/static/65.0e01be7c.chunk.js +0 -2
- package/dist-scalprum/static/6753.76832e72.chunk.js +0 -2
- package/dist-scalprum/static/6753.76832e72.chunk.js.map +0 -1
- package/dist-scalprum/static/8172.e89bbae7.chunk.js.map +0 -1
- package/dist-scalprum/static/8627.111cbac9.chunk.js +0 -2
- package/dist-scalprum/static/8627.111cbac9.chunk.js.map +0 -1
- package/dist-scalprum/static/9510.e4112e19.chunk.js +0 -3
- package/dist-scalprum/static/9510.e4112e19.chunk.js.map +0 -1
- package/dist-scalprum/static/9644.7d342123.chunk.js +0 -2
- package/dist-scalprum/static/9644.7d342123.chunk.js.map +0 -1
- package/dist-scalprum/static/993.c164940e.chunk.js +0 -2
- package/dist-scalprum/static/993.c164940e.chunk.js.map +0 -1
- package/dist-scalprum/static/exposed-PluginRoot.5b6638e2.chunk.js +0 -2
- package/dist-scalprum/static/exposed-PluginRoot.5b6638e2.chunk.js.map +0 -1
- package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_http.5859273c.chunk.js +0 -2
- /package/dist-scalprum/static/{6371.c4899d73.chunk.js.LICENSE.txt → 1085.d17e689a.chunk.js.LICENSE.txt} +0 -0
- /package/dist-scalprum/static/{2628.0605e07f.chunk.js.LICENSE.txt → 2628.20156dc1.chunk.js.LICENSE.txt} +0 -0
- /package/dist-scalprum/static/{6386.903891f3.chunk.js.LICENSE.txt → 4093.ee6f0452.chunk.js.LICENSE.txt} +0 -0
- /package/dist-scalprum/static/{1994.19e6a1c5.chunk.js.LICENSE.txt → 4382.a7363415.chunk.js.LICENSE.txt} +0 -0
- /package/dist-scalprum/static/{5010.2228c754.chunk.js.LICENSE.txt → 5010.0cd6c959.chunk.js.LICENSE.txt} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static/4682.bd2dfccd.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\";\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 }\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 throw new Error(\"Failed to delete request\");\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 alertApi.post({\n message: \"Failed to delete API key\",\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\";\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\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 [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 throw new Error(`failed to ${dialogState.action} request`);\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 alertApi.post({\n message: `Failed to ${dialogState.action} API key`,\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\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 throw new Error(`failed to bulk ${bulkDialogState.action} requests`);\n }\n\n const count = bulkDialogState.requests.length;\n const action = isApprove ? \"approved\" : \"rejected\";\n setBulkDialogState({\n open: false,\n requests: [],\n action: \"approve\",\n processing: false,\n });\n setSelectedRequests([]);\n setRefresh((r) => r + 1);\n alertApi.post({\n message: `${count} API keys ${action}`,\n severity: \"success\",\n display: \"transient\",\n });\n } catch (err) {\n console.error(`error bulk ${bulkDialogState.action}ing requests:`, err);\n setBulkDialogState((prev) => ({ ...prev, processing: false }));\n alertApi.post({\n message: `Failed to bulk ${bulkDialogState.action} API keys`,\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 </>\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","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","post","message","severity","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","method","onCancel","Dialog","maxWidth","DialogTitle","DialogContent","paragraph","DialogActions","response","result","apiKey","errorMessage","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","ApprovalQueueTable","identityApi","identityApiRef","selectedRequests","setSelectedRequests","dialogState","setDialogState","bulkDialogState","setBulkDialogState","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","CheckCircleIcon","canSelectRows","selection","showSelectAllCheckbox","selectionProps","showTextRowsSelected","isSelected","selected","tableData","onSelectionChange","rows","pendingOnly","endpoint","body","JSON","stringify","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,3 @@
|
|
|
1
|
+
/*! For license information please see 4935.e14465ff.chunk.js.LICENSE.txt */
|
|
2
|
+
"use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[1085,4935],{31085:(e,t,n)=>{e.exports=n(73335)},42594:(e,t,n)=>{n.d(t,{m:()=>r}),n(31085),n(15427);const r=(0,n(49930).y)({id:"core.error"})},49930:(e,t,n)=>{n.d(t,{y:()=>a});class r{constructor(e){if(this.config=e,!e.id.split(".").flatMap(e=>e.split("-")).every(e=>e.match(/^[a-z][a-z0-9]*$/)))throw new Error(`API id must only contain period separated lowercase alphanum tokens with dashes, got '${e.id}'`)}get id(){return this.config.id}get T(){throw new Error(`tried to read ApiRef.T of ${this}`)}toString(){return`apiRef{${this.config.id}}`}}function a(e){return new r(e)}},64935:(e,t,n)=>{n.r(t),n.d(t,{AnalyticsContext:()=>c,AnalyticsImplementationBlueprint:()=>ve,ApiBlueprint:()=>we,AppRootElementBlueprint:()=>Ae,AppRootWrapperBlueprint:()=>xe,ErrorDisplay:()=>Me,ExtensionBoundary:()=>Be,IconBundleBlueprint:()=>Pe,NavContentBlueprint:()=>Se,NavItemBlueprint:()=>_e,NotFoundErrorPage:()=>Ne,PageBlueprint:()=>Ve,Progress:()=>Ze,RouterBlueprint:()=>Ge,SessionState:()=>u.SessionState,SignInPageBlueprint:()=>He,SwappableComponentBlueprint:()=>tt,ThemeBlueprint:()=>Je,TranslationBlueprint:()=>Qe,alertApiRef:()=>u.alertApiRef,analyticsApiRef:()=>p,appThemeApiRef:()=>u.appThemeApiRef,appTreeApiRef:()=>m,atlassianAuthApiRef:()=>u.atlassianAuthApiRef,bitbucketAuthApiRef:()=>u.bitbucketAuthApiRef,bitbucketServerAuthApiRef:()=>u.bitbucketServerAuthApiRef,configApiRef:()=>u.configApiRef,coreExtensionData:()=>ke,createApiFactory:()=>u.createApiFactory,createApiRef:()=>u.createApiRef,createExtension:()=>de,createExtensionBlueprint:()=>ge,createExtensionBlueprintParams:()=>le,createExtensionDataRef:()=>te,createExtensionInput:()=>xt,createExternalRouteRef:()=>dt,createFrontendFeatureLoader:()=>Tt,createFrontendModule:()=>St,createFrontendPlugin:()=>Et,createRouteRef:()=>ot,createSubRouteRef:()=>ut,createSwappableComponent:()=>Ie,createTranslationMessages:()=>ht,createTranslationRef:()=>vt,createTranslationResource:()=>gt,dialogApiRef:()=>y,discoveryApiRef:()=>u.discoveryApiRef,errorApiRef:()=>u.errorApiRef,featureFlagsApiRef:()=>u.featureFlagsApiRef,fetchApiRef:()=>u.fetchApiRef,githubAuthApiRef:()=>u.githubAuthApiRef,gitlabAuthApiRef:()=>u.gitlabAuthApiRef,googleAuthApiRef:()=>u.googleAuthApiRef,iconsApiRef:()=>g,identityApiRef:()=>u.identityApiRef,microsoftAuthApiRef:()=>u.microsoftAuthApiRef,oauthRequestApiRef:()=>u.oauthRequestApiRef,oktaAuthApiRef:()=>u.oktaAuthApiRef,oneloginAuthApiRef:()=>u.oneloginAuthApiRef,openshiftAuthApiRef:()=>u.openshiftAuthApiRef,routeResolutionApiRef:()=>v,storageApiRef:()=>u.storageApiRef,swappableComponentsApiRef:()=>h,useAnalytics:()=>l,useApi:()=>u.useApi,useApiHolder:()=>u.useApiHolder,useAppNode:()=>Le,useRouteRef:()=>lt,useRouteRefParams:()=>mt,useTranslationRef:()=>Rt,vmwareCloudAuthApiRef:()=>u.vmwareCloudAuthApiRef,withApis:()=>u.withApis});var r=n(31085),a=n(15427),i=n(95478);const o=(0,a.createVersionedContext)("analytics-context"),s=()=>{const e=(0,i.useContext)(o);if(void 0===e)return{pluginId:"app",extensionId:"app"};const t=e.atVersion(1);if(void 0===t)throw new Error("No context found for version 1.");return t},c=e=>{const{attributes:t,children:n}=e,i={...s(),...t},c=(0,a.createVersionedValueMap)({1:i});return(0,r.jsx)(o.Provider,{value:c,children:n})};var u=n(51723);const p=(0,u.createApiRef)({id:"core.analytics"}),d=(0,a.getOrCreateGlobalSingleton)("core-plugin-api:analytics-tracker-events",()=>({mostRecentGatheredNavigation:void 0,mostRecentRoutableExtensionRender:void 0,beforeUnloadRegistered:!1}));class f{constructor(e,t={pluginId:"root",extensionId:"App"}){this.analyticsApi=e,this.context=t,d.beforeUnloadRegistered||(addEventListener("beforeunload",()=>{d.mostRecentGatheredNavigation&&(this.analyticsApi.captureEvent({...d.mostRecentGatheredNavigation,...d.mostRecentRoutableExtensionRender}),d.mostRecentGatheredNavigation=void 0,d.mostRecentRoutableExtensionRender=void 0)},{once:!0,passive:!0}),d.beforeUnloadRegistered=!0)}setContext(e){this.context=e}captureEvent(e,t,{value:n,attributes:r}={}){const a=this.context;if("_ROUTABLE-EXTENSION-RENDERED"!==e){if(d.mostRecentGatheredNavigation){try{this.analyticsApi.captureEvent({...d.mostRecentGatheredNavigation,...d.mostRecentRoutableExtensionRender})}catch(e){console.warn("Error during analytics event capture. %o",e)}d.mostRecentGatheredNavigation=void 0,d.mostRecentRoutableExtensionRender=void 0}if("navigate"!==e||"root"!==a.pluginId)try{this.analyticsApi.captureEvent({action:e,subject:t,value:n,attributes:r,context:a})}catch(e){console.warn("Error during analytics event capture. %o",e)}else d.mostRecentGatheredNavigation={action:e,subject:t,value:n,attributes:r,context:a}}else d.mostRecentGatheredNavigation&&(d.mostRecentRoutableExtensionRender={context:{...a,extensionId:"App"}})}}function l(){const e=(0,i.useRef)(null),t=s(),n=function(){try{return(0,u.useApi)(p)}catch(e){if("NotImplementedError"===e.name)return{captureEvent:()=>{}};throw e}}(),r=(null===e.current&&(e.current=new f(n)),e.current);return r.setContext(t),r}const m=(0,u.createApiRef)({id:"core.app-tree"}),h=(0,u.createApiRef)({id:"core.swappable-components"}),g=(0,u.createApiRef)({id:"core.icons"}),y=(0,u.createApiRef)({id:"core.dialog"}),v=(0,u.createApiRef)({id:"core.route-resolution"}),b=Symbol("Let zodToJsonSchema decide on which parser to use"),w={name:void 0,$refStrategy:"root",basePath:["#"],effectStrategy:"input",pipeStrategy:"all",dateStrategy:"format:date-time",mapStrategy:"entries",removeAdditionalStrategy:"passthrough",allowedAdditionalProperties:!0,rejectedAdditionalProperties:!1,definitionPath:"definitions",target:"jsonSchema7",strictUnions:!1,definitions:{},errorMessages:!1,markdownDescription:!1,patternStrategy:"escape",applyRegexFlags:!1,emailStrategy:"format:email",base64Strategy:"contentEncoding:base64",nameStrategy:"ref"};var k=n(53215);function A(e,t,n,r){r?.errorMessages&&n&&(e.errorMessage={...e.errorMessage,[t]:n})}function R(e,t,n,r,a){e[t]=n,A(e,t,r,a)}function x(e,t){return X(e.type._def,t)}function $(e,t,n){const r=n??t.dateStrategy;if(Array.isArray(r))return{anyOf:r.map((n,r)=>$(e,t,n))};switch(r){case"string":case"format:date-time":return{type:"string",format:"date-time"};case"format:date":return{type:"string",format:"date"};case"integer":return P(e,t)}}const P=(e,t)=>{const n={type:"integer",format:"unix-time"};if("openApi3"===t.target)return n;for(const r of e.checks)switch(r.kind){case"min":R(n,"minimum",r.value,r.message,t);break;case"max":R(n,"maximum",r.value,r.message,t)}return n};let E;const S=/^[cC][^\s-]{8,}$/,T=/^[0-9a-z]+$/,_=/^[0-9A-HJKMNP-TV-Z]{26}$/,j=/^(?!\.)(?!.*\.\.)([a-zA-Z0-9_'+\-\.]*)[a-zA-Z0-9_+-]@([a-zA-Z0-9][a-zA-Z0-9\-]*\.)+[a-zA-Z]{2,}$/,O=()=>(void 0===E&&(E=RegExp("^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$","u")),E),I=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,Z=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,N=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,M=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,F=/^[a-zA-Z0-9_-]{21}$/,C=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/;function Y(e,t){const n={type:"string"};if(e.checks)for(const r of e.checks)switch(r.kind){case"min":R(n,"minLength","number"==typeof n.minLength?Math.max(n.minLength,r.value):r.value,r.message,t);break;case"max":R(n,"maxLength","number"==typeof n.maxLength?Math.min(n.maxLength,r.value):r.value,r.message,t);break;case"email":switch(t.emailStrategy){case"format:email":D(n,"email",r.message,t);break;case"format:idn-email":D(n,"idn-email",r.message,t);break;case"pattern:zod":B(n,j,r.message,t)}break;case"url":D(n,"uri",r.message,t);break;case"uuid":D(n,"uuid",r.message,t);break;case"regex":B(n,r.regex,r.message,t);break;case"cuid":B(n,S,r.message,t);break;case"cuid2":B(n,T,r.message,t);break;case"startsWith":B(n,RegExp(`^${z(r.value,t)}`),r.message,t);break;case"endsWith":B(n,RegExp(`${z(r.value,t)}$`),r.message,t);break;case"datetime":D(n,"date-time",r.message,t);break;case"date":D(n,"date",r.message,t);break;case"time":D(n,"time",r.message,t);break;case"duration":D(n,"duration",r.message,t);break;case"length":R(n,"minLength","number"==typeof n.minLength?Math.max(n.minLength,r.value):r.value,r.message,t),R(n,"maxLength","number"==typeof n.maxLength?Math.min(n.maxLength,r.value):r.value,r.message,t);break;case"includes":B(n,RegExp(z(r.value,t)),r.message,t);break;case"ip":"v6"!==r.version&&D(n,"ipv4",r.message,t),"v4"!==r.version&&D(n,"ipv6",r.message,t);break;case"base64url":B(n,M,r.message,t);break;case"jwt":B(n,C,r.message,t);break;case"cidr":"v6"!==r.version&&B(n,I,r.message,t),"v4"!==r.version&&B(n,Z,r.message,t);break;case"emoji":B(n,O(),r.message,t);break;case"ulid":B(n,_,r.message,t);break;case"base64":switch(t.base64Strategy){case"format:binary":D(n,"binary",r.message,t);break;case"contentEncoding:base64":R(n,"contentEncoding","base64",r.message,t);break;case"pattern:zod":B(n,N,r.message,t)}break;case"nanoid":B(n,F,r.message,t);case"toLowerCase":case"toUpperCase":case"trim":break;default:(()=>{})()}return n}function z(e,t){return"escape"===t.patternStrategy?function(e){let t="";for(let n=0;n<e.length;n++)L.has(e[n])||(t+="\\"),t+=e[n];return t}(e):e}const L=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");function D(e,t,n,r){e.format||e.anyOf?.some(e=>e.format)?(e.anyOf||(e.anyOf=[]),e.format&&(e.anyOf.push({format:e.format,...e.errorMessage&&r.errorMessages&&{errorMessage:{format:e.errorMessage.format}}}),delete e.format,e.errorMessage&&(delete e.errorMessage.format,0===Object.keys(e.errorMessage).length&&delete e.errorMessage)),e.anyOf.push({format:t,...n&&r.errorMessages&&{errorMessage:{format:n}}})):R(e,"format",t,n,r)}function B(e,t,n,r){e.pattern||e.allOf?.some(e=>e.pattern)?(e.allOf||(e.allOf=[]),e.pattern&&(e.allOf.push({pattern:e.pattern,...e.errorMessage&&r.errorMessages&&{errorMessage:{pattern:e.errorMessage.pattern}}}),delete e.pattern,e.errorMessage&&(delete e.errorMessage.pattern,0===Object.keys(e.errorMessage).length&&delete e.errorMessage)),e.allOf.push({pattern:U(t,r),...n&&r.errorMessages&&{errorMessage:{pattern:n}}})):R(e,"pattern",U(t,r),n,r)}function U(e,t){if(!t.applyRegexFlags||!e.flags)return e.source;const n=e.flags.includes("i"),r=e.flags.includes("m"),a=e.flags.includes("s"),i=n?e.source.toLowerCase():e.source;let o="",s=!1,c=!1,u=!1;for(let e=0;e<i.length;e++)if(s)o+=i[e],s=!1;else{if(n)if(c){if(i[e].match(/[a-z]/)){u?(o+=i[e],o+=`${i[e-2]}-${i[e]}`.toUpperCase(),u=!1):"-"===i[e+1]&&i[e+2]?.match(/[a-z]/)?(o+=i[e],u=!0):o+=`${i[e]}${i[e].toUpperCase()}`;continue}}else if(i[e].match(/[a-z]/)){o+=`[${i[e]}${i[e].toUpperCase()}]`;continue}if(r){if("^"===i[e]){o+="(^|(?<=[\r\n]))";continue}if("$"===i[e]){o+="($|(?=[\r\n]))";continue}}a&&"."===i[e]?o+=c?`${i[e]}\r\n`:`[${i[e]}\r\n]`:(o+=i[e],"\\"===i[e]?s=!0:c&&"]"===i[e]?c=!1:c||"["!==i[e]||(c=!0))}try{new RegExp(o)}catch{return console.warn(`Could not convert regex pattern at ${t.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`),e.source}return o}function V(e,t){if("openAi"===t.target&&console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead."),"openApi3"===t.target&&e.keyType?._def.typeName===k.kY.ZodEnum)return{type:"object",required:e.keyType._def.values,properties:e.keyType._def.values.reduce((n,r)=>({...n,[r]:X(e.valueType._def,{...t,currentPath:[...t.currentPath,"properties",r]})??{}}),{}),additionalProperties:t.rejectedAdditionalProperties};const n={type:"object",additionalProperties:X(e.valueType._def,{...t,currentPath:[...t.currentPath,"additionalProperties"]})??t.allowedAdditionalProperties};if("openApi3"===t.target)return n;if(e.keyType?._def.typeName===k.kY.ZodString&&e.keyType._def.checks?.length){const{type:r,...a}=Y(e.keyType._def,t);return{...n,propertyNames:a}}if(e.keyType?._def.typeName===k.kY.ZodEnum)return{...n,propertyNames:{enum:e.keyType._def.values}};if(e.keyType?._def.typeName===k.kY.ZodBranded&&e.keyType._def.type._def.typeName===k.kY.ZodString&&e.keyType._def.type._def.checks?.length){const{type:r,...a}=x(e.keyType._def,t);return{...n,propertyNames:a}}return n}const q={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"},G=(e,t)=>{const n=(e.options instanceof Map?Array.from(e.options.values()):e.options).map((e,n)=>X(e._def,{...t,currentPath:[...t.currentPath,"anyOf",`${n}`]})).filter(e=>!!e&&(!t.strictUnions||"object"==typeof e&&Object.keys(e).length>0));return n.length?{anyOf:n}:void 0};function W(e){try{return e.isOptional()}catch{return!0}}const H=(e,t,n)=>{switch(t){case k.kY.ZodString:return Y(e,n);case k.kY.ZodNumber:return function(e,t){const n={type:"number"};if(!e.checks)return n;for(const r of e.checks)switch(r.kind){case"int":n.type="integer",A(n,"type",r.message,t);break;case"min":"jsonSchema7"===t.target?r.inclusive?R(n,"minimum",r.value,r.message,t):R(n,"exclusiveMinimum",r.value,r.message,t):(r.inclusive||(n.exclusiveMinimum=!0),R(n,"minimum",r.value,r.message,t));break;case"max":"jsonSchema7"===t.target?r.inclusive?R(n,"maximum",r.value,r.message,t):R(n,"exclusiveMaximum",r.value,r.message,t):(r.inclusive||(n.exclusiveMaximum=!0),R(n,"maximum",r.value,r.message,t));break;case"multipleOf":R(n,"multipleOf",r.value,r.message,t)}return n}(e,n);case k.kY.ZodObject:return function(e,t){const n="openAi"===t.target,r={type:"object",properties:{}},a=[],i=e.shape();for(const e in i){let o=i[e];if(void 0===o||void 0===o._def)continue;let s=W(o);s&&n&&(o instanceof k.Ii&&(o=o._def.innerType),o.isNullable()||(o=o.nullable()),s=!1);const c=X(o._def,{...t,currentPath:[...t.currentPath,"properties",e],propertyPath:[...t.currentPath,"properties",e]});void 0!==c&&(r.properties[e]=c,s||a.push(e))}a.length&&(r.required=a);const o=function(e,t){if("ZodNever"!==e.catchall._def.typeName)return X(e.catchall._def,{...t,currentPath:[...t.currentPath,"additionalProperties"]});switch(e.unknownKeys){case"passthrough":return t.allowedAdditionalProperties;case"strict":return t.rejectedAdditionalProperties;case"strip":return"strict"===t.removeAdditionalStrategy?t.allowedAdditionalProperties:t.rejectedAdditionalProperties}}(e,t);return void 0!==o&&(r.additionalProperties=o),r}(e,n);case k.kY.ZodBigInt:return function(e,t){const n={type:"integer",format:"int64"};if(!e.checks)return n;for(const r of e.checks)switch(r.kind){case"min":"jsonSchema7"===t.target?r.inclusive?R(n,"minimum",r.value,r.message,t):R(n,"exclusiveMinimum",r.value,r.message,t):(r.inclusive||(n.exclusiveMinimum=!0),R(n,"minimum",r.value,r.message,t));break;case"max":"jsonSchema7"===t.target?r.inclusive?R(n,"maximum",r.value,r.message,t):R(n,"exclusiveMaximum",r.value,r.message,t):(r.inclusive||(n.exclusiveMaximum=!0),R(n,"maximum",r.value,r.message,t));break;case"multipleOf":R(n,"multipleOf",r.value,r.message,t)}return n}(e,n);case k.kY.ZodBoolean:return{type:"boolean"};case k.kY.ZodDate:return $(e,n);case k.kY.ZodUndefined:return{not:{}};case k.kY.ZodNull:return function(e){return"openApi3"===e.target?{enum:["null"],nullable:!0}:{type:"null"}}(n);case k.kY.ZodArray:return function(e,t){const n={type:"array"};return e.type?._def&&e.type?._def?.typeName!==k.kY.ZodAny&&(n.items=X(e.type._def,{...t,currentPath:[...t.currentPath,"items"]})),e.minLength&&R(n,"minItems",e.minLength.value,e.minLength.message,t),e.maxLength&&R(n,"maxItems",e.maxLength.value,e.maxLength.message,t),e.exactLength&&(R(n,"minItems",e.exactLength.value,e.exactLength.message,t),R(n,"maxItems",e.exactLength.value,e.exactLength.message,t)),n}(e,n);case k.kY.ZodUnion:case k.kY.ZodDiscriminatedUnion:return function(e,t){if("openApi3"===t.target)return G(e,t);const n=e.options instanceof Map?Array.from(e.options.values()):e.options;if(n.every(e=>e._def.typeName in q&&(!e._def.checks||!e._def.checks.length))){const e=n.reduce((e,t)=>{const n=q[t._def.typeName];return n&&!e.includes(n)?[...e,n]:e},[]);return{type:e.length>1?e:e[0]}}if(n.every(e=>"ZodLiteral"===e._def.typeName&&!e.description)){const e=n.reduce((e,t)=>{const n=typeof t._def.value;switch(n){case"string":case"number":case"boolean":return[...e,n];case"bigint":return[...e,"integer"];case"object":if(null===t._def.value)return[...e,"null"];default:return e}},[]);if(e.length===n.length){const t=e.filter((e,t,n)=>n.indexOf(e)===t);return{type:t.length>1?t:t[0],enum:n.reduce((e,t)=>e.includes(t._def.value)?e:[...e,t._def.value],[])}}}else if(n.every(e=>"ZodEnum"===e._def.typeName))return{type:"string",enum:n.reduce((e,t)=>[...e,...t._def.values.filter(t=>!e.includes(t))],[])};return G(e,t)}(e,n);case k.kY.ZodIntersection:return function(e,t){const n=[X(e.left._def,{...t,currentPath:[...t.currentPath,"allOf","0"]}),X(e.right._def,{...t,currentPath:[...t.currentPath,"allOf","1"]})].filter(e=>!!e);let r="jsonSchema2019-09"===t.target?{unevaluatedProperties:!1}:void 0;const a=[];return n.forEach(e=>{if("type"in(t=e)&&"string"===t.type||!("allOf"in t)){let t=e;if("additionalProperties"in e&&!1===e.additionalProperties){const{additionalProperties:n,...r}=e;t=r}else r=void 0;a.push(t)}else a.push(...e.allOf),void 0===e.unevaluatedProperties&&(r=void 0);var t}),a.length?{allOf:a,...r}:void 0}(e,n);case k.kY.ZodTuple:return function(e,t){return e.rest?{type:"array",minItems:e.items.length,items:e.items.map((e,n)=>X(e._def,{...t,currentPath:[...t.currentPath,"items",`${n}`]})).reduce((e,t)=>void 0===t?e:[...e,t],[]),additionalItems:X(e.rest._def,{...t,currentPath:[...t.currentPath,"additionalItems"]})}:{type:"array",minItems:e.items.length,maxItems:e.items.length,items:e.items.map((e,n)=>X(e._def,{...t,currentPath:[...t.currentPath,"items",`${n}`]})).reduce((e,t)=>void 0===t?e:[...e,t],[])}}(e,n);case k.kY.ZodRecord:return V(e,n);case k.kY.ZodLiteral:return function(e,t){const n=typeof e.value;return"bigint"!==n&&"number"!==n&&"boolean"!==n&&"string"!==n?{type:Array.isArray(e.value)?"array":"object"}:"openApi3"===t.target?{type:"bigint"===n?"integer":n,enum:[e.value]}:{type:"bigint"===n?"integer":n,const:e.value}}(e,n);case k.kY.ZodEnum:return function(e){return{type:"string",enum:Array.from(e.values)}}(e);case k.kY.ZodNativeEnum:return function(e){const t=e.values,n=Object.keys(e.values).filter(e=>"number"!=typeof t[t[e]]).map(e=>t[e]),r=Array.from(new Set(n.map(e=>typeof e)));return{type:1===r.length?"string"===r[0]?"string":"number":["string","number"],enum:n}}(e);case k.kY.ZodNullable:return function(e,t){if(["ZodString","ZodNumber","ZodBigInt","ZodBoolean","ZodNull"].includes(e.innerType._def.typeName)&&(!e.innerType._def.checks||!e.innerType._def.checks.length))return"openApi3"===t.target?{type:q[e.innerType._def.typeName],nullable:!0}:{type:[q[e.innerType._def.typeName],"null"]};if("openApi3"===t.target){const n=X(e.innerType._def,{...t,currentPath:[...t.currentPath]});return n&&"$ref"in n?{allOf:[n],nullable:!0}:n&&{...n,nullable:!0}}const n=X(e.innerType._def,{...t,currentPath:[...t.currentPath,"anyOf","0"]});return n&&{anyOf:[n,{type:"null"}]}}(e,n);case k.kY.ZodOptional:return((e,t)=>{if(t.currentPath.toString()===t.propertyPath?.toString())return X(e.innerType._def,t);const n=X(e.innerType._def,{...t,currentPath:[...t.currentPath,"anyOf","1"]});return n?{anyOf:[{not:{}},n]}:{}})(e,n);case k.kY.ZodMap:return function(e,t){return"record"===t.mapStrategy?V(e,t):{type:"array",maxItems:125,items:{type:"array",items:[X(e.keyType._def,{...t,currentPath:[...t.currentPath,"items","items","0"]})||{},X(e.valueType._def,{...t,currentPath:[...t.currentPath,"items","items","1"]})||{}],minItems:2,maxItems:2}}}(e,n);case k.kY.ZodSet:return function(e,t){const n={type:"array",uniqueItems:!0,items:X(e.valueType._def,{...t,currentPath:[...t.currentPath,"items"]})};return e.minSize&&R(n,"minItems",e.minSize.value,e.minSize.message,t),e.maxSize&&R(n,"maxItems",e.maxSize.value,e.maxSize.message,t),n}(e,n);case k.kY.ZodLazy:return()=>e.getter()._def;case k.kY.ZodPromise:return function(e,t){return X(e.type._def,t)}(e,n);case k.kY.ZodNaN:case k.kY.ZodNever:return{not:{}};case k.kY.ZodEffects:return function(e,t){return"input"===t.effectStrategy?X(e.schema._def,t):{}}(e,n);case k.kY.ZodAny:case k.kY.ZodUnknown:return{};case k.kY.ZodDefault:return function(e,t){return{...X(e.innerType._def,t),default:e.defaultValue()}}(e,n);case k.kY.ZodBranded:return x(e,n);case k.kY.ZodReadonly:case k.kY.ZodCatch:return((e,t)=>X(e.innerType._def,t))(e,n);case k.kY.ZodPipeline:return((e,t)=>{if("input"===t.pipeStrategy)return X(e.in._def,t);if("output"===t.pipeStrategy)return X(e.out._def,t);const n=X(e.in._def,{...t,currentPath:[...t.currentPath,"allOf","0"]});return{allOf:[n,X(e.out._def,{...t,currentPath:[...t.currentPath,"allOf",n?"1":"0"]})].filter(e=>void 0!==e)}})(e,n);case k.kY.ZodFunction:case k.kY.ZodVoid:case k.kY.ZodSymbol:default:return}};function X(e,t,n=!1){const r=t.seen.get(e);if(t.override){const a=t.override?.(e,t,r,n);if(a!==b)return a}if(r&&!n){const e=J(r,t);if(void 0!==e)return e}const a={def:e,path:t.currentPath,jsonSchema:void 0};t.seen.set(e,a);const i=H(e,e.typeName,t),o="function"==typeof i?X(i(),t):i;if(o&&Q(e,t,o),t.postProcess){const n=t.postProcess(o,e,t);return a.jsonSchema=o,n}return a.jsonSchema=o,o}const J=(e,t)=>{switch(t.$refStrategy){case"root":return{$ref:e.path.join("/")};case"relative":return{$ref:K(t.currentPath,e.path)};case"none":case"seen":return e.path.length<t.currentPath.length&&e.path.every((e,n)=>t.currentPath[n]===e)?(console.warn(`Recursive reference detected at ${t.currentPath.join("/")}! Defaulting to any`),{}):"seen"===t.$refStrategy?{}:void 0}},K=(e,t)=>{let n=0;for(;n<e.length&&n<t.length&&e[n]===t[n];n++);return[(e.length-n).toString(),...t.slice(n)].join("/")},Q=(e,t,n)=>(e.description&&(n.description=e.description,t.markdownDescription&&(n.markdownDescription=e.description)),n),ee=(e,t)=>{const n=(e=>{const t=(e=>"string"==typeof e?{...w,name:e}:{...w,...e})(e),n=void 0!==t.name?[...t.basePath,t.definitionPath,t.name]:t.basePath;return{...t,currentPath:n,propertyPath:void 0,seen:new Map(Object.entries(t.definitions).map(([e,n])=>[n._def,{def:n._def,path:[...t.basePath,t.definitionPath,e],jsonSchema:void 0}]))}})(t),r="object"==typeof t&&t.definitions?Object.entries(t.definitions).reduce((e,[t,r])=>({...e,[t]:X(r._def,{...n,currentPath:[...n.basePath,n.definitionPath,t]},!0)??{}}),{}):void 0,a="string"==typeof t?t:"title"===t?.nameStrategy?void 0:t?.name,i=X(e._def,void 0===a?n:{...n,currentPath:[...n.basePath,n.definitionPath,a]},!1)??{},o="object"==typeof t&&void 0!==t.name&&"title"===t.nameStrategy?t.name:void 0;void 0!==o&&(i.title=o);const s=void 0===a?r?{...i,[n.definitionPath]:r}:i:{$ref:[..."relative"===n.$refStrategy?[]:n.basePath,n.definitionPath,a].join("/"),[n.definitionPath]:{...r,[a]:i}};return"jsonSchema7"===n.target?s.$schema="http://json-schema.org/draft-07/schema#":"jsonSchema2019-09"!==n.target&&"openAi"!==n.target||(s.$schema="https://json-schema.org/draft/2019-09/schema#"),"openAi"===n.target&&("anyOf"in s||"oneOf"in s||"allOf"in s||"type"in s&&Array.isArray(s.type))&&console.warn("Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property."),s};function te(){const e=e=>Object.assign(t=>({$$type:"@backstage/ExtensionDataValue",id:e,value:t}),{id:e,$$type:"@backstage/ExtensionDataRef",config:{},optional(){return{...this,config:{...this.config,optional:!0}}},toString(){const t=Boolean(this.config.optional);return`ExtensionDataRef{id=${e},optional=${t}}`}});return{with:t=>e(t.id)}}function ne(e,t,n){if("object"!=typeof e||!e?.[Symbol.iterator])throw new Error(`${t} did not provide an iterable object`);const r=new Map,a=n&&new Map(n.map(e=>[e.id,e]));for(const t of e){if(a&&!a.delete(t.id))throw new Error(`extension data '${t.id}' was provided but not declared`);r.set(t.id,t)}const i=a&&Array.from(a.values()).filter(e=>!e.config.optional);if(i&&i.length>0)throw new Error(`missing required extension data value(s) '${i.map(e=>e.id).join(", ")}'`);return{get:e=>r.get(e.id)?.value,[Symbol.iterator]:()=>r.values()}}function re(e){return e}function ae(e){return e}function ie(e,t,n){if(!e||!t||!n)return t;const r={};for(const a in e){if(!Object.hasOwn(e,a))continue;const i=e[a],o=n[a];if(i.config.singleton){const e=ae(t[a]);if(o){const t=ne(o,"extension input override",i.extensionData);if(!e)throw new Error(`attempted to override data of input '${a}' but it is not present in the original inputs`);r[a]=Object.assign(t,{node:e.node})}}else{const e=re(t[a]);if(!Array.isArray(o))throw new Error(`override data provided for input '${a}' must be an array`);if(0===o.length)r[a]=[];else{const t=o.filter(e=>"node"in e).length;if(0===t){if(e.length!==o.length)throw new Error(`override data provided for input '${a}' must match the length of the original inputs`);r[a]=o.map((t,n)=>{const r=ne(t,"extension input override",i.extensionData);return Object.assign(r,{node:e[n].node})})}else{if(t!==o.length)throw new Error(`override data for input '${a}' may not mix forwarded inputs with data overrides`);r[a]=o}}}}return r}var oe=n(33587);function se(e){if("invalid_union"===e.code)return se(e.unionErrors[0].issues[0]);let t=e.message;return"Required"===t&&(t="Missing required value"),e.path.length&&(t+=` at '${e.path.join(".")}'`),t}class ce{static create(e){return new ce(e.type,new Set(e.versions))}#e;#t;constructor(e,t){this.#e=e,this.#t=t}TPublic=void 0;TInternal=void 0;isType=e=>this.#n(e);toInternal=e=>{if(!this.#n(e))throw new TypeError(`Invalid opaque type, expected '${this.#e}', but got '${this.#r(e)}'`);if(!this.#t.has(e.version)){const t=Array.from(this.#t).map(this.#a);t.length>1&&(t[t.length-1]=`or ${t[t.length-1]}`);const n=t.length>2?t.join(", "):t.join(" ");throw new TypeError(`Invalid opaque type instance, got version ${this.#a(e.version)}, expected ${n}`)}return e};createInstance(e,t){return Object.assign(t,{$$type:this.#e,...e&&{version:e}})}#n(e){return null!==e&&"object"==typeof e&&e.$$type===this.#e}#r(e){return"object"!=typeof e?`<${typeof e}>`:null===e?"<null>":String("$$type"in e?e.$$type:e)}#a=e=>e?`'${e}'`:"undefined"}const ue=ce.create({type:"@backstage/ExtensionDefinition",versions:["v1","v2"]}),pe=Symbol("params");function de(e){const t=e.config?.schema,n=t&&function(){const e=(n=oe).object(Object.fromEntries(Object.entries(t).map(([e,t])=>[e,t(n)])));var n;return{parse:t=>{const n=e.safeParse(t);if(n.success)return n.data;throw new Error(n.error.issues.map(se).join("; "))},schema:ee(e)}}();return ue.createInstance("v2",{T:void 0,kind:e.kind,name:e.name,attachTo:e.attachTo,disabled:e.disabled??!1,inputs:e.inputs??{},output:e.output,configSchema:n,factory:e.factory,toString(){const t=[];return e.kind&&t.push(`kind=${e.kind}`),e.name&&t.push(`name=${e.name}`),t.push(`attachTo=${[e.attachTo].flat().map(e=>`${e.id}@${e.input}`).join("+")}`),`ExtensionDefinition{${t.join(",")}}`},override(t){if(!Array.isArray(e.output))throw new Error("Cannot override an extension that is not declared using the new format with outputs as an array");if(t.output&&!t.factory)throw new Error("Refused to override output without also overriding factory");if(t.params&&t.factory)throw new Error("Refused to override params and factory at the same time");return de({kind:e.kind,name:e.name,attachTo:t.attachTo??e.attachTo,disabled:t.disabled??e.disabled,inputs:{...t.inputs,...e.inputs},output:t.output??e.output,config:e.config||t.config?{schema:{...e.config?.schema,...t.config?.schema}}:void 0,factory:({node:n,apis:r,config:a,inputs:i})=>{if(!t.factory)return e.factory({node:n,apis:r,config:a,inputs:i,[pe]:t.params});const o=t.factory(t=>ne(e.factory({node:n,apis:r,config:t?.config??a,inputs:ie(e.inputs,i,t?.inputs),[pe]:t?.params}),"original extension factory",e.output),{node:n,apis:r,config:a,inputs:i});if("object"!=typeof o||!o?.[Symbol.iterator])throw new Error("extension factory override did not provide an iterable object");const s=new Map;for(const e of o)s.set(e.id,e);return s.values()}})}})}const fe=ce.create({type:"@backstage/BlueprintParams",versions:["v1"]});function le(e){return fe.createInstance("v1",{T:null,params:e})}function me(e,t,n){const r=e(t);try{return fe.toInternal(r).params}catch(e){throw new TypeError(`Invalid invocation of blueprint with kind '${n}', the parameter definition callback function did not return a valid parameter definition object; Caused by: ${e.message}`)}}function he(e,t,n,r){const a=t[pe];if(n){if(a){if("function"!=typeof a)throw new TypeError(`Invalid extension override of blueprint with kind '${r}', the override params were passed as a plain object, but this blueprint requires them to be passed in callback form`);return me(a,n,r)}if("function"!=typeof e)throw new TypeError(`Invalid invocation of blueprint with kind '${r}', the parameters where passed as a plain object, but this blueprint requires them to be passed in callback form`);return me(e,n,r)}return{..."function"==typeof e?me(e,le,r):e,..."function"==typeof a?me(a,le,r):a}}function ge(e){const t=e.defineParams;return{dataRefs:e.dataRefs,make:n=>de({kind:e.kind,name:n.name,attachTo:n.attachTo??e.attachTo,disabled:n.disabled??e.disabled,inputs:e.inputs,output:e.output,config:e.config,factory:r=>e.factory(he(n.params,r,t,e.kind),r)}),makeWithOverrides:n=>de({kind:e.kind,name:n.name,attachTo:n.attachTo??e.attachTo,disabled:n.disabled??e.disabled,inputs:{...n.inputs,...e.inputs},output:n.output??e.output,config:e.config||n.config?{schema:{...e.config?.schema,...n.config?.schema}}:void 0,factory:r=>{const{node:a,config:i,inputs:o,apis:s}=r;return n.factory((n,c)=>ne(e.factory(he(n,r,t,e.kind),{apis:s,node:a,config:c?.config??i,inputs:ie(e.inputs,o,c?.inputs)}),"original blueprint factory",e.output),{apis:s,node:a,config:i,inputs:o})}})}}const ye=te().with({id:"core.analytics.factory"}),ve=ge({kind:"analytics",attachTo:[{id:"api:app/analytics",input:"implementations"}],output:[ye],dataRefs:{factory:ye},defineParams:e=>le(e),*factory(e){yield ye(e)}}),be=te().with({id:"core.api.factory"}),we=ge({kind:"api",attachTo:{id:"root",input:"apis"},output:[be],dataRefs:{factory:be},defineParams:e=>le(e),*factory(e){yield be(e)}}),ke={reactElement:te().with({id:"core.reactElement"}),routePath:te().with({id:"core.routing.path"}),routeRef:te().with({id:"core.routing.ref"})},Ae=ge({kind:"app-root-element",attachTo:{id:"app/root",input:"elements"},output:[ke.reactElement],*factory(e){yield ke.reactElement(e.element)}}),Re=te().with({id:"app.root.wrapper"}),xe=ge({kind:"app-root-wrapper",attachTo:{id:"app/root",input:"wrappers"},output:[Re],dataRefs:{component:Re},*factory(e){yield Re(e.component)}}),$e=te().with({id:"core.icons"}),Pe=ge({kind:"icon-bundle",attachTo:{id:"api:app/icons",input:"icons"},output:[$e],factory:e=>[$e(e.icons)],dataRefs:{icons:$e}}),Ee=te().with({id:"core.nav-content.component"}),Se=ge({kind:"nav-content",attachTo:{id:"app/nav",input:"content"},output:[Ee],dataRefs:{component:Ee},*factory(e){yield Ee(e.component)}}),Te=te().with({id:"core.nav-item.target"}),_e=ge({kind:"nav-item",attachTo:{id:"app/nav",input:"items"},output:[Te],dataRefs:{target:Te},factory:({icon:e,routeRef:t,title:n},{config:r})=>[Te({title:r.title??n,icon:e,routeRef:t})],config:{schema:{title:e=>e.string().optional()}}}),je=ce.create({versions:["v1"],type:"@backstage/SwappableComponentRef"}),Oe=()=>{try{return(0,u.useApi)(h)}catch(e){return}};function Ie(e){const t=t=>(0,r.jsx)("div",{"data-testid":e.id,...t}),n=je.createInstance("v1",{id:e.id,TProps:null,TExternalProps:null,toString:()=>`SwappableComponentRef{id=${e.id}}`,defaultComponent:(0,i.lazy)(async()=>({default:await(e.loader?.())??t})),transformProps:e.transformProps}),a=e=>{const t=Oe();if(!t){const t=je.toInternal(n),a=t.defaultComponent,i=t.transformProps?.(e)??e;return(0,r.jsx)(a,{...i})}const a=t.getComponent(n);return(0,r.jsx)(a,{...e})};return Object.assign(a,{ref:n}),a}const Ze=Ie({id:"core-progress"}),Ne=Ie({id:"core-not-found-error-page"}),Me=Ie({id:"core-error-display",loader:()=>e=>(0,r.jsx)("div",{"data-testid":"core-error-display",children:e.error.message})});class Fe extends i.Component{static getDerivedStateFromError(e){return{error:e}}state={error:void 0};handleErrorReset=()=>{this.setState({error:void 0})};render(){const{error:e}=this.state,{plugin:t,children:n}=this.props;return e?(0,r.jsx)(Me,{plugin:t,error:e,resetError:this.handleErrorReset}):n}}(0,a.getOrCreateGlobalSingleton)("core-plugin-api:analytics-tracker-events",()=>({mostRecentGatheredNavigation:void 0,mostRecentRoutableExtensionRender:void 0,beforeUnloadRegistered:!1}));const Ce="app-node-context",Ye=(0,a.createVersionedContext)(Ce);function ze({node:e,children:t}){const n=(0,a.createVersionedValueMap)({1:{node:e}});return(0,r.jsx)(Ye.Provider,{value:n,children:t})}function Le(){const e=(0,a.useVersionedContext)(Ce);if(!e)return;const t=e.atVersion(1);if(!t)throw new Error("AppNodeContext v1 not available");return t.node}const De=e=>{const{enabled:t,children:n}=e,a=(0,u.useAnalytics)();return(0,i.useEffect)(()=>{t&&a.captureEvent("_ROUTABLE-EXTENSION-RENDERED","")},[a,t]),(0,r.jsx)(r.Fragment,{children:n})};function Be(e){const{node:t,children:n}=e,a=Boolean(t.instance?.getData(ke.routePath)),o=t.spec.plugin,s={extensionId:t.spec.id,pluginId:t.spec.plugin?.id??"app"};return(0,r.jsx)(ze,{node:t,children:(0,r.jsx)(i.Suspense,{fallback:(0,r.jsx)(Ze,{}),children:(0,r.jsx)(Fe,{plugin:o,children:(0,r.jsx)(u.AnalyticsContext,{attributes:s,children:(0,r.jsx)(De,{enabled:a,children:n})})})})})}var Ue;(Ue=Be||(Be={})).lazy=function(e,t){const n=(0,i.lazy)(()=>t().then(e=>({default:()=>e})));return(0,r.jsx)(Ue,{node:e,children:(0,r.jsx)(n,{})})},Ue.lazyComponent=function(e,t){const n=(0,i.lazy)(()=>t().then(e=>({default:e})));return t=>(0,r.jsx)(Ue,{node:e,children:(0,r.jsx)(n,{...t})})};const Ve=ge({kind:"page",attachTo:{id:"app/routes",input:"routes"},output:[ke.routePath,ke.reactElement,ke.routeRef.optional()],config:{schema:{path:e=>e.string().optional()}},*factory(e,{config:t,node:n}){yield ke.routePath(t.path??e.path),yield ke.reactElement(Be.lazy(n,e.loader)),e.routeRef&&(yield ke.routeRef(e.routeRef))}}),qe=te().with({id:"app.router.wrapper"}),Ge=ge({kind:"app-router-component",attachTo:{id:"app/root",input:"router"},output:[qe],dataRefs:{component:qe},*factory(e){yield qe(e.component)}}),We=te().with({id:"core.sign-in-page.component"}),He=ge({kind:"sign-in-page",attachTo:{id:"app/root",input:"signInPage"},output:[We],dataRefs:{component:We},*factory({loader:e},{node:t}){const n=(0,i.lazy)(()=>e().then(e=>({default:e})));yield We(e=>(0,r.jsx)(Be,{node:t,children:(0,r.jsx)(n,{...e})}))}}),Xe=te().with({id:"core.theme.theme"}),Je=ge({kind:"theme",attachTo:{id:"api:app/app-theme",input:"themes"},output:[Xe],dataRefs:{theme:Xe},factory:({theme:e})=>[Xe(e)]}),Ke=te().with({id:"core.translation.translation"}),Qe=ge({kind:"translation",attachTo:{id:"api:app/translations",input:"translations"},output:[Ke],dataRefs:{translation:Ke},factory:({resource:e})=>[Ke(e)]}),et=te().with({id:"core.swappableComponent"}),tt=ge({kind:"component",attachTo:{id:"api:app/swappable-components",input:"components"},output:[et],dataRefs:{component:et},defineParams:e=>le(e),factory:e=>[et({ref:e.component.ref,loader:e.loader})]}),nt="eHgtF5hmbrXyiEvo";function rt(e=Error){const{stack:t}=new e(nt);if(!t)return"<unknown>";const n=t.includes(nt)?t.indexOf("\n")+1:0,r=t.indexOf("\n",t.indexOf("\n",n)+1)+1,a=t.indexOf("\n",r),i=t.substring(r,a).trim();return i?i.includes("(")?i.substring(i.indexOf("(")+1,i.indexOf(")")):i.includes("@")?i.substring(i.indexOf("@")+1):i:"unknown"}function at(e){const t=e;if("@backstage/RouteRef"!==t.$$type)throw new Error(`Invalid RouteRef, bad type '${t.$$type}'`);return t}class it{constructor(e=[],t,n){this.params=e,this.#i=e,this.#o=t,this.#s=n}$$type="@backstage/RouteRef";version="v1";#c;#i;#o;#s;getParams(){return this.#i}get alias(){return this.#s}getDescription(){return this.#c?this.#c:`created at '${this.#o}'`}get#u(){return this.$$type.slice(11)}setId(e){if(!e)throw new Error(`${this.#u} id must be a non-empty string`);if(this.#c&&this.#c!==e)throw new Error(`${this.#u} was referenced twice as both '${this.#c}' and '${e}'`);this.#c=e}toString(){return`${this.#u}{${this.getDescription()}}`}}function ot(e){return new it(e?.params,rt(),e?.aliasFor)}const st=/^\w+$/;class ct{constructor(e,t,n){this.path=e,this.#i=t,this.#p=n}$$type="@backstage/SubRouteRef";version="v1";#i;#p;getParams(){return this.#i}getParent(){return this.#p}getDescription(){const e=at(this.#p);return`at ${this.path} with parent ${e.getDescription()}`}toString(){return`SubRouteRef{${this.getDescription()}}`}}function ut(e){const{path:t,parent:n}=e,r=at(n).getParams(),a=t.split("/").filter(e=>e.startsWith(":")).map(e=>e.substring(1)),i=[...r,...a];if(r.some(e=>a.includes(e)))throw new Error("SubRouteRef may not have params that overlap with its parent");if(!t.startsWith("/"))throw new Error(`SubRouteRef path must start with '/', got '${t}'`);if(t.endsWith("/"))throw new Error(`SubRouteRef path must not end with '/', got '${t}'`);for(const e of a)if(!st.test(e))throw new Error(`SubRouteRef path has invalid param, got '${e}'`);return new ct(t,i,n)}class pt extends it{constructor(e=[],t,n){super(e,n),this.params=e,this.defaultTarget=t}$$type="@backstage/ExternalRouteRef";getDefaultTarget(){return this.defaultTarget}}function dt(e){return new pt(e?.params,e?.defaultTarget,rt())}var ft=n(49634);function lt(e){const{pathname:t}=(0,ft.useLocation)(),n=(0,u.useApi)(v);return(0,i.useMemo)(()=>n.resolve(e,{sourcePath:t}),[n,e,t])}function mt(e){return(0,ft.useParams)()}function ht(e){return{$$type:"@backstage/TranslationMessages",id:e.ref.id,full:Boolean(e.full),messages:e.messages}}function gt(e){return{$$type:"@backstage/TranslationResource",version:"v1",id:e.ref.id,resources:Object.entries(e.translations).map(([e,t])=>({language:e,loader:()=>t().then(e=>{const t=e.default;return{messages:"@backstage/TranslationMessages"===t?.$$type?t.messages:t}})}))}}class yt{#c;#d;#f;constructor(e){this.#c=e.id,this.#d=function(e){const t=new Array;return function e(n,r){for(const[a,i]of Object.entries(n))"string"==typeof i?t.push([r+a,i]):e(i,`${r}${a}.`)}(e,""),Object.fromEntries(t)}(e.messages)}$$type="@backstage/TranslationRef";version="v1";get id(){return this.#c}get T(){throw new Error("Not implemented")}getDefaultMessages(){return this.#d}setDefaultResource(e){this.#f=e}getDefaultResource(){return this.#f}toString(){return`TranslationRef{id=${this.id}}`}}function vt(e){const t=new yt(e);return e.translations&&t.setDefaultResource(gt({ref:t,translations:e.translations})),t}var bt=n(82206),wt=n(42594);const kt=(0,u.createApiRef)({id:"core.translation"}),At=new WeakSet,Rt=e=>{const t=(0,bt.gf)(wt.m),n=(0,bt.gf)(kt),[r,a]=(0,i.useState)(()=>n.getTranslation(e)),o=(0,i.useMemo)(()=>n.translation$(e),[n,e]),s=(0,i.useCallback)(n=>{if(!At.has(e)){const r=`Failed to load translation resource '${e.id}'; caused by ${n}`;console.error(r),t.post(new Error(r)),At.add(e)}},[t,e]);(0,i.useEffect)(()=>{const e=o.subscribe({next(e){e.ready&&a(e)},error(e){s(e)}});return()=>{e.unsubscribe()}},[o,s]);const c=(0,i.useRef)(!0);if((0,i.useEffect)(()=>{c.current?c.current=!1:a(n.getTranslation(e))},[n,e]),!r.ready)throw new Promise(e=>{const t=o.subscribe({next(n){n.ready&&(t.unsubscribe(),e())},error(n){t.unsubscribe(),s(n),e()}})});return{t:r.t}};function xt(e,t){return{$$type:"@backstage/ExtensionInput",extensionData:e,config:{singleton:Boolean(t?.singleton),optional:Boolean(t?.optional)},replaces:t?.replaces}}function $t(e,t){const n=ue.toInternal(e),{name:r,kind:a,namespace:i,override:o,...s}=n,c=n.namespace??t?.namespace,u=r&&c?`${c}/${r}`:c||r;if(!u)throw new Error(`Extension must declare an explicit namespace or name as it could not be resolved from context, kind=${a} namespace=${c} name=${r}`);const p=a?`${a}:${u}`:u;return{...s,$$type:"@backstage/Extension",version:n.version,id:p,toString:()=>`Extension{id=${p}}`}}const Pt=ce.create({type:"@backstage/FrontendPlugin",versions:["v1"]});function Et(e){const t=e.pluginId,n=new Array,r=new Map;for(const a of e.extensions??[]){const e=ue.toInternal(a),i=$t(a,{namespace:t});n.push(i),r.set(i.id,{...e,namespace:t})}if(n.length!==r.size){const e=n.map(e=>e.id),r=Array.from(new Set(e.filter((t,n)=>e.indexOf(t)!==n)));throw new Error(`Plugin '${t}' provided duplicate extensions: ${r.join(", ")}`)}return Pt.createInstance("v1",{id:t,routes:e.routes??{},externalRoutes:e.externalRoutes??{},featureFlags:e.featureFlags??[],extensions:n,infoOptions:e.info,async info(){throw new Error(`Attempted to load plugin info for plugin '${t}', but the plugin instance is not installed in an app`)},getExtension(e){const n=r.get(e);if(!n)throw new Error(`Attempted to get non-existent extension '${e}' from plugin '${t}'`);return n},toString:()=>`Plugin{id=${t}}`,withOverrides(n){const r=new Set(n.extensions.map(e=>$t(e,{namespace:t}).id)),a=(e.extensions??[]).filter(e=>!r.has($t(e,{namespace:t}).id));return Et({...e,pluginId:t,extensions:[...a,...n.extensions],info:{...e.info,...n.info}})}})}function St(e){const{pluginId:t}=e,n=new Array,r=new Map;for(const a of e.extensions??[]){const e=ue.toInternal(a),i=$t(a,{namespace:t});n.push(i),r.set(i.id,{...e,namespace:t})}if(n.length!==r.size){const e=n.map(e=>e.id),r=Array.from(new Set(e.filter((t,n)=>e.indexOf(t)!==n)));throw new Error(`Plugin '${t}' provided duplicate extensions: ${r.join(", ")}`)}return{$$type:"@backstage/FrontendModule",version:"v1",pluginId:t,featureFlags:e.featureFlags??[],extensions:n,toString:()=>`Module{pluginId=${t}}`}}function Tt(e){const t=`created at '${rt()}'`;return{$$type:"@backstage/FrontendFeatureLoader",version:"v1",description:t,toString:()=>`FeatureLoader{description=${t}}`,async loader(t){const n=await e.loader(t),r=new Array;for await(const e of n)if(_t(e))r.push(e);else{if(!("default"in e))throw new Error(`Invalid item "${e}"`);r.push(e.default)}return r}}}function _t(e){return null!==e&&"object"==typeof e&&"$$type"in e&&("@backstage/FrontendPlugin"===e.$$type||"@backstage/FrontendModule"===e.$$type||"@backstage/FrontendFeatureLoader"===e.$$type)}},73335:(e,t,n)=>{var r=n(95478),a=Symbol.for("react.element"),i=Symbol.for("react.fragment"),o=Object.prototype.hasOwnProperty,s=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,c={key:!0,ref:!0,__self:!0,__source:!0};function u(e,t,n){var r,i={},u=null,p=null;for(r in void 0!==n&&(u=""+n),void 0!==t.key&&(u=""+t.key),void 0!==t.ref&&(p=t.ref),t)o.call(t,r)&&!c.hasOwnProperty(r)&&(i[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps)void 0===i[r]&&(i[r]=t[r]);return{$$typeof:a,type:e,key:u,ref:p,props:i,_owner:s.current}}t.Fragment=i,t.jsx=u,t.jsxs=u},82206:(e,t,n)=>{n.d(t,{Q2:()=>o,gf:()=>s,wV:()=>c});var r=n(31085),a=n(15427),i=n(57556);function o(){const e=(0,a.useVersionedContext)("api-context");if(!e)throw new i.EH("API context is not available");const t=e.atVersion(1);if(!t)throw new i.EH("ApiContext v1 not available");return t}function s(e){const t=o().get(e);if(!t)throw new i.EH(`No implementation available for ${e}`);return t}function c(e){return function(t){const n=n=>{const a=o(),s={};for(const t in e)if(e.hasOwnProperty(t)){const n=e[t],r=a.get(n);if(!r)throw new i.EH(`No implementation available for ${n}`);s[t]=r}return(0,r.jsx)(t,{...n,...s})},a=t.displayName||t.name||"Component";return n.displayName=`withApis(${a})`,n}}}}]);
|
|
3
|
+
//# sourceMappingURL=4935.e14465ff.chunk.js.map
|