@kuadrant/kuadrant-backstage-plugin-frontend 0.2.1 → 0.3.0-aaa46b4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. package/dist/api.esm.js +40 -2
  2. package/dist/api.esm.js.map +1 -1
  3. package/dist/components/ApiAccessCard/ApiAccessCard.esm.js +20 -85
  4. package/dist/components/ApiAccessCard/ApiAccessCard.esm.js.map +1 -1
  5. package/dist/components/ApiKeyApprovalPage/ApiKeyApprovalPageWithPermissions.esm.js +18 -0
  6. package/dist/components/ApiKeyApprovalPage/ApiKeyApprovalPageWithPermissions.esm.js.map +1 -0
  7. package/dist/components/ApiKeyApprovalPage/index.esm.js +1 -0
  8. package/dist/components/ApiKeyApprovalPage/index.esm.js.map +1 -1
  9. package/dist/components/ApiKeyDetailPage/ApiKeyDetailPage.esm.js +19 -60
  10. package/dist/components/ApiKeyDetailPage/ApiKeyDetailPage.esm.js.map +1 -1
  11. package/dist/components/ApiKeyManagementTab/ApiKeyManagementTab.esm.js +45 -110
  12. package/dist/components/ApiKeyManagementTab/ApiKeyManagementTab.esm.js.map +1 -1
  13. package/dist/components/ApiProductInfoCard/ApiProductInfoCard.esm.js +3 -2
  14. package/dist/components/ApiProductInfoCard/ApiProductInfoCard.esm.js.map +1 -1
  15. package/dist/components/ApprovalQueueTable/ApprovalQueueTable.esm.js +16 -15
  16. package/dist/components/ApprovalQueueTable/ApprovalQueueTable.esm.js.map +1 -1
  17. package/dist/components/EditAPIProductDialog/EditAPIProductDialog.esm.js +2 -3
  18. package/dist/components/EditAPIProductDialog/EditAPIProductDialog.esm.js.map +1 -1
  19. package/dist/components/KuadrantPage/ApiProductsPage.esm.js +5 -18
  20. package/dist/components/KuadrantPage/ApiProductsPage.esm.js.map +1 -1
  21. package/dist/components/MyApiKeysTable/MyApiKeysTable.esm.js +28 -138
  22. package/dist/components/MyApiKeysTable/MyApiKeysTable.esm.js.map +1 -1
  23. package/dist/components/PermissionGate/PermissionGate.esm.js +2 -2
  24. package/dist/components/PermissionGate/PermissionGate.esm.js.map +1 -1
  25. package/dist/components/RequestAccessDialog/RequestAccessDialog.esm.js +32 -18
  26. package/dist/components/RequestAccessDialog/RequestAccessDialog.esm.js.map +1 -1
  27. package/dist/components/SimpleRequestAccessDialog/SimpleRequestAccessDialog.esm.js +13 -2
  28. package/dist/components/SimpleRequestAccessDialog/SimpleRequestAccessDialog.esm.js.map +1 -1
  29. package/dist/index.d.ts +47 -6
  30. package/dist/index.esm.js +1 -1
  31. package/dist/plugin.esm.js +2 -10
  32. package/dist/plugin.esm.js.map +1 -1
  33. package/dist/utils/apikeys.esm.js +21 -0
  34. package/dist/utils/apikeys.esm.js.map +1 -0
  35. package/dist/utils/styles.esm.js +5 -2
  36. package/dist/utils/styles.esm.js.map +1 -1
  37. package/dist-scalprum/internal.plugin-kuadrant.7f1de85661b1b848af15.js +2 -0
  38. package/dist-scalprum/internal.plugin-kuadrant.7f1de85661b1b848af15.js.map +1 -0
  39. package/dist-scalprum/plugin-manifest.json +3 -3
  40. package/dist-scalprum/static/1340.7c4f4722.chunk.js +3 -0
  41. package/dist-scalprum/static/1340.7c4f4722.chunk.js.map +1 -0
  42. package/dist-scalprum/static/1719.52ca7daf.chunk.js +2 -0
  43. package/dist-scalprum/static/1719.52ca7daf.chunk.js.map +1 -0
  44. package/dist-scalprum/static/{1881.56cde36b.chunk.js → 1931.f6a5edbb.chunk.js} +2 -2
  45. package/dist-scalprum/static/1931.f6a5edbb.chunk.js.map +1 -0
  46. package/dist-scalprum/static/20.b3a37d1d.chunk.js +3 -0
  47. package/dist-scalprum/static/20.b3a37d1d.chunk.js.map +1 -0
  48. package/dist-scalprum/static/2251.08f3db99.chunk.js +2 -0
  49. package/dist-scalprum/static/2251.08f3db99.chunk.js.map +1 -0
  50. package/dist-scalprum/static/2769.e09b0ab0.chunk.js +2 -0
  51. package/dist-scalprum/static/2769.e09b0ab0.chunk.js.map +1 -0
  52. package/dist-scalprum/static/2821.1ac360ec.chunk.js +2 -0
  53. package/dist-scalprum/static/2821.1ac360ec.chunk.js.map +1 -0
  54. package/dist-scalprum/static/2967.004a950e.chunk.js +2 -0
  55. package/dist-scalprum/static/2967.004a950e.chunk.js.map +1 -0
  56. package/dist-scalprum/static/327.74ecd572.chunk.js +2 -0
  57. package/dist-scalprum/static/327.74ecd572.chunk.js.map +1 -0
  58. package/dist-scalprum/static/3658.104704cc.chunk.js +2 -0
  59. package/dist-scalprum/static/3658.104704cc.chunk.js.map +1 -0
  60. package/dist-scalprum/static/3917.888fba36.chunk.js +2 -0
  61. package/dist-scalprum/static/3917.888fba36.chunk.js.map +1 -0
  62. package/dist-scalprum/static/3947.f5320e89.chunk.js +2 -0
  63. package/dist-scalprum/static/3947.f5320e89.chunk.js.map +1 -0
  64. package/dist-scalprum/static/438.4335b833.chunk.js +2 -0
  65. package/dist-scalprum/static/438.4335b833.chunk.js.map +1 -0
  66. package/dist-scalprum/static/4908.4f21d453.chunk.js +2 -0
  67. package/dist-scalprum/static/4908.4f21d453.chunk.js.map +1 -0
  68. package/dist-scalprum/static/5197.53535ff4.chunk.js +2 -0
  69. package/dist-scalprum/static/5197.53535ff4.chunk.js.map +1 -0
  70. package/dist-scalprum/static/5289.6c803140.chunk.js +2 -0
  71. package/dist-scalprum/static/5289.6c803140.chunk.js.map +1 -0
  72. package/dist-scalprum/static/5943.4e1dedc5.chunk.js +2 -0
  73. package/dist-scalprum/static/5943.4e1dedc5.chunk.js.map +1 -0
  74. package/dist-scalprum/static/6311.da1849d1.chunk.js +2 -0
  75. package/dist-scalprum/static/6311.da1849d1.chunk.js.map +1 -0
  76. package/dist-scalprum/static/6371.02375475.chunk.js +3 -0
  77. package/dist-scalprum/static/6371.02375475.chunk.js.map +1 -0
  78. package/dist-scalprum/static/6837.6252b97a.chunk.js +2 -0
  79. package/dist-scalprum/static/6837.6252b97a.chunk.js.map +1 -0
  80. package/dist-scalprum/static/7270.8ee9d452.chunk.js +2 -0
  81. package/dist-scalprum/static/7270.8ee9d452.chunk.js.map +1 -0
  82. package/dist-scalprum/static/980.744a4d36.chunk.js +2 -0
  83. package/dist-scalprum/static/980.744a4d36.chunk.js.map +1 -0
  84. package/dist-scalprum/static/exposed-KuadrantPage.f123b200.chunk.js +2 -0
  85. package/dist-scalprum/static/exposed-KuadrantPage.f123b200.chunk.js.map +1 -0
  86. package/dist-scalprum/static/exposed-PluginRoot.3a5f9157.chunk.js +2 -0
  87. package/dist-scalprum/static/exposed-PluginRoot.3a5f9157.chunk.js.map +1 -0
  88. package/package.json +1 -1
  89. package/dist/components/EntityApiApprovalTab/EntityApiApprovalTab.esm.js +0 -265
  90. package/dist/components/EntityApiApprovalTab/EntityApiApprovalTab.esm.js.map +0 -1
  91. package/dist/components/EntityApiApprovalTab/index.esm.js +0 -2
  92. package/dist/components/EntityApiApprovalTab/index.esm.js.map +0 -1
  93. package/dist-scalprum/internal.plugin-kuadrant.c4fb9c2347d3ad03a5d0.js +0 -2
  94. package/dist-scalprum/internal.plugin-kuadrant.c4fb9c2347d3ad03a5d0.js.map +0 -1
  95. package/dist-scalprum/static/1584.1e45e570.chunk.js +0 -3
  96. package/dist-scalprum/static/1584.1e45e570.chunk.js.map +0 -1
  97. package/dist-scalprum/static/1719.246c020d.chunk.js +0 -2
  98. package/dist-scalprum/static/1719.246c020d.chunk.js.map +0 -1
  99. package/dist-scalprum/static/1881.56cde36b.chunk.js.map +0 -1
  100. package/dist-scalprum/static/286.ee43f560.chunk.js +0 -2
  101. package/dist-scalprum/static/286.ee43f560.chunk.js.map +0 -1
  102. package/dist-scalprum/static/2967.0c2ef90e.chunk.js +0 -2
  103. package/dist-scalprum/static/2967.0c2ef90e.chunk.js.map +0 -1
  104. package/dist-scalprum/static/3581.ebe5968a.chunk.js +0 -2
  105. package/dist-scalprum/static/3581.ebe5968a.chunk.js.map +0 -1
  106. package/dist-scalprum/static/369.2374941c.chunk.js +0 -2
  107. package/dist-scalprum/static/369.2374941c.chunk.js.map +0 -1
  108. package/dist-scalprum/static/3947.4f4aa8c2.chunk.js +0 -2
  109. package/dist-scalprum/static/3947.4f4aa8c2.chunk.js.map +0 -1
  110. package/dist-scalprum/static/3976.e8a8fda2.chunk.js +0 -2
  111. package/dist-scalprum/static/3976.e8a8fda2.chunk.js.map +0 -1
  112. package/dist-scalprum/static/4434.f92f6ba4.chunk.js +0 -2
  113. package/dist-scalprum/static/4434.f92f6ba4.chunk.js.map +0 -1
  114. package/dist-scalprum/static/4908.196a4425.chunk.js +0 -2
  115. package/dist-scalprum/static/4908.196a4425.chunk.js.map +0 -1
  116. package/dist-scalprum/static/512.d592d164.chunk.js +0 -2
  117. package/dist-scalprum/static/512.d592d164.chunk.js.map +0 -1
  118. package/dist-scalprum/static/5289.55069930.chunk.js +0 -2
  119. package/dist-scalprum/static/5289.55069930.chunk.js.map +0 -1
  120. package/dist-scalprum/static/5605.430f697e.chunk.js +0 -2
  121. package/dist-scalprum/static/5605.430f697e.chunk.js.map +0 -1
  122. package/dist-scalprum/static/5978.bf347a09.chunk.js +0 -2
  123. package/dist-scalprum/static/5978.bf347a09.chunk.js.map +0 -1
  124. package/dist-scalprum/static/6371.7b57ac27.chunk.js +0 -3
  125. package/dist-scalprum/static/6371.7b57ac27.chunk.js.map +0 -1
  126. package/dist-scalprum/static/6426.4c18bab5.chunk.js +0 -2
  127. package/dist-scalprum/static/6426.4c18bab5.chunk.js.map +0 -1
  128. package/dist-scalprum/static/6777.a2b77ec5.chunk.js +0 -2
  129. package/dist-scalprum/static/6777.a2b77ec5.chunk.js.map +0 -1
  130. package/dist-scalprum/static/6800.a45da2f4.chunk.js +0 -2
  131. package/dist-scalprum/static/6800.a45da2f4.chunk.js.map +0 -1
  132. package/dist-scalprum/static/7005.8190ad95.chunk.js +0 -2
  133. package/dist-scalprum/static/7005.8190ad95.chunk.js.map +0 -1
  134. package/dist-scalprum/static/7057.fcd688c7.chunk.js +0 -2
  135. package/dist-scalprum/static/7057.fcd688c7.chunk.js.map +0 -1
  136. package/dist-scalprum/static/7270.d52407cd.chunk.js +0 -2
  137. package/dist-scalprum/static/7270.d52407cd.chunk.js.map +0 -1
  138. package/dist-scalprum/static/7717.6f5b9dd7.chunk.js +0 -3
  139. package/dist-scalprum/static/7717.6f5b9dd7.chunk.js.map +0 -1
  140. package/dist-scalprum/static/9079.2ddaea57.chunk.js +0 -2
  141. package/dist-scalprum/static/9079.2ddaea57.chunk.js.map +0 -1
  142. package/dist-scalprum/static/9239.1acfe112.chunk.js +0 -2
  143. package/dist-scalprum/static/9239.1acfe112.chunk.js.map +0 -1
  144. package/dist-scalprum/static/9625.b0c6610a.chunk.js +0 -2
  145. package/dist-scalprum/static/9625.b0c6610a.chunk.js.map +0 -1
  146. package/dist-scalprum/static/exposed-KuadrantPage.5ae00605.chunk.js +0 -2
  147. package/dist-scalprum/static/exposed-KuadrantPage.5ae00605.chunk.js.map +0 -1
  148. package/dist-scalprum/static/exposed-PluginRoot.949381c2.chunk.js +0 -2
  149. package/dist-scalprum/static/exposed-PluginRoot.949381c2.chunk.js.map +0 -1
  150. /package/dist-scalprum/static/{1584.1e45e570.chunk.js.LICENSE.txt → 1340.7c4f4722.chunk.js.LICENSE.txt} +0 -0
  151. /package/dist-scalprum/static/{7717.6f5b9dd7.chunk.js.LICENSE.txt → 20.b3a37d1d.chunk.js.LICENSE.txt} +0 -0
  152. /package/dist-scalprum/static/{6371.7b57ac27.chunk.js.LICENSE.txt → 6371.02375475.chunk.js.LICENSE.txt} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static/3917.888fba36.chunk.js","mappings":"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","sources":["webpack://internal.plugin-kuadrant/./src/components/FilterPanel/FilterPanel.tsx","webpack://internal.plugin-kuadrant/./src/utils/apikeys.ts","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/../../node_modules/react-use/esm/useAsync.js","webpack://internal.plugin-kuadrant/../../node_modules/react-use/esm/useAsyncFn.js","webpack://internal.plugin-kuadrant/./src/components/PermissionGate/PermissionGate.tsx","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/./src/components/ApprovalQueueTable/ApprovalQueueTable.tsx","webpack://internal.plugin-kuadrant/./src/components/ApiKeyApprovalPage/ApiKeyApprovalPage.tsx","webpack://internal.plugin-kuadrant/./src/components/ApiKeyApprovalPage/ApiKeyApprovalPageWithPermissions.tsx"],"sourcesContent":["import React from 'react';\nimport {\n Box,\n Typography,\n Checkbox,\n FormControlLabel,\n FormGroup,\n Divider,\n Button,\n Collapse,\n makeStyles,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport ExpandLessIcon from '@material-ui/icons/ExpandLess';\n\nconst useStyles = makeStyles(theme => ({\n root: {\n width: 240,\n minWidth: 240,\n padding: theme.spacing(2),\n borderRight: `1px solid ${theme.palette.divider}`,\n backgroundColor: theme.palette.background.paper,\n height: '100%',\n overflowY: 'auto',\n },\n sectionTitle: {\n fontWeight: 600,\n fontSize: '0.75rem',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n color: theme.palette.text.secondary,\n marginBottom: theme.spacing(1),\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n cursor: 'pointer',\n userSelect: 'none',\n },\n filterSection: {\n marginBottom: theme.spacing(2),\n },\n checkbox: {\n padding: theme.spacing(0.5),\n },\n checkboxLabel: {\n fontSize: '0.875rem',\n },\n clearButton: {\n marginTop: theme.spacing(2),\n },\n count: {\n fontSize: '0.75rem',\n color: theme.palette.text.secondary,\n marginLeft: theme.spacing(1),\n },\n}));\n\nexport interface FilterOption {\n value: string;\n label: string;\n count?: number;\n}\n\nexport interface FilterSection {\n id: string;\n title: string;\n options: FilterOption[];\n collapsed?: boolean;\n}\n\nexport interface FilterState {\n [sectionId: string]: string[];\n}\n\ninterface FilterPanelProps {\n sections: FilterSection[];\n filters: FilterState;\n onChange: (filters: FilterState) => void;\n onClear?: () => void;\n}\n\nexport const FilterPanel = ({\n sections,\n filters,\n onChange,\n onClear,\n}: FilterPanelProps) => {\n const classes = useStyles();\n const [collapsedSections, setCollapsedSections] = React.useState<Set<string>>(\n new Set(sections.filter(s => s.collapsed).map(s => s.id)),\n );\n\n const toggleSection = (sectionId: string) => {\n setCollapsedSections(prev => {\n const next = new Set(prev);\n if (next.has(sectionId)) {\n next.delete(sectionId);\n } else {\n next.add(sectionId);\n }\n return next;\n });\n };\n\n const handleCheckboxChange = (sectionId: string, value: string) => {\n const currentValues = filters[sectionId] || [];\n const newValues = currentValues.includes(value)\n ? currentValues.filter(v => v !== value)\n : [...currentValues, value];\n\n onChange({\n ...filters,\n [sectionId]: newValues,\n });\n };\n\n const hasActiveFilters = Object.values(filters).some(\n values => values.length > 0,\n );\n\n const handleClear = () => {\n const clearedFilters: FilterState = {};\n sections.forEach(section => {\n clearedFilters[section.id] = [];\n });\n onChange(clearedFilters);\n onClear?.();\n };\n\n return (\n <Box className={classes.root}>\n <Box display=\"flex\" justifyContent=\"space-between\" alignItems=\"center\" mb={2}>\n <Typography variant=\"subtitle2\">Filters</Typography>\n {hasActiveFilters && (\n <Button\n size=\"small\"\n color=\"primary\"\n onClick={handleClear}\n >\n Clear all\n </Button>\n )}\n </Box>\n\n <Divider />\n\n {sections.map(section => {\n const isCollapsed = collapsedSections.has(section.id);\n const selectedCount = (filters[section.id] || []).length;\n\n return (\n <Box key={section.id} className={classes.filterSection} mt={2}>\n <Box\n className={classes.sectionTitle}\n onClick={() => toggleSection(section.id)}\n >\n <Box display=\"flex\" alignItems=\"center\">\n <span>{section.title}</span>\n {selectedCount > 0 && (\n <span className={classes.count}>({selectedCount})</span>\n )}\n </Box>\n {isCollapsed ? (\n <ExpandMoreIcon fontSize=\"small\" />\n ) : (\n <ExpandLessIcon fontSize=\"small\" />\n )}\n </Box>\n\n <Collapse in={!isCollapsed}>\n <FormGroup>\n {section.options.map(option => (\n <FormControlLabel\n key={option.value}\n control={\n <Checkbox\n checked={(filters[section.id] || []).includes(option.value)}\n onChange={() =>\n handleCheckboxChange(section.id, option.value)\n }\n size=\"small\"\n className={classes.checkbox}\n color=\"primary\"\n />\n }\n label={\n <Box display=\"flex\" alignItems=\"center\">\n <span className={classes.checkboxLabel}>\n {option.label}\n </span>\n {option.count !== undefined && (\n <span className={classes.count}>({option.count})</span>\n )}\n </Box>\n }\n />\n ))}\n </FormGroup>\n </Collapse>\n </Box>\n );\n })}\n </Box>\n );\n};\n","import { StatusCondition } from '../types/api-management';\n\n/**\n * Derives the APIKey approval phase from Kubernetes conditions.\n *\n * Maps conditions to phases:\n * - Empty conditions array → Pending\n * - Approved condition (status: True) → Approved\n * - Denied condition (status: True) → Denied\n * - Failed condition (status: True) → Failed\n *\n * @param conditions - Array of Kubernetes status conditions\n * @returns Current approval phase\n */\nexport function getAPIKeyPhase(\n conditions?: StatusCondition[]\n): 'Pending' | 'Approved' | 'Denied' | 'Failed' {\n if (!conditions || conditions.length === 0) {\n return 'Pending';\n }\n\n const approved = conditions.find(\n c => c.type === 'Approved' && c.status === 'True'\n );\n if (approved) return 'Approved';\n\n const denied = conditions.find(\n c => c.type === 'Denied' && c.status === 'True'\n );\n if (denied) return 'Denied';\n\n const failed = conditions.find(\n c => c.type === 'Failed' && c.status === 'True'\n );\n if (failed) return 'Failed';\n\n return 'Pending';\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 { useEffect } from 'react';\nimport useAsyncFn from './useAsyncFn';\nexport default function useAsync(fn, deps) {\n if (deps === void 0) { deps = []; }\n var _a = useAsyncFn(fn, deps, {\n loading: true,\n }), state = _a[0], callback = _a[1];\n useEffect(function () {\n callback();\n }, [callback]);\n return state;\n}\n","import { __assign } from \"tslib\";\nimport { useCallback, useRef, useState } from 'react';\nimport useMountedState from './useMountedState';\nexport default function useAsyncFn(fn, deps, initialState) {\n if (deps === void 0) { deps = []; }\n if (initialState === void 0) { initialState = { loading: false }; }\n var lastCallId = useRef(0);\n var isMounted = useMountedState();\n var _a = useState(initialState), state = _a[0], set = _a[1];\n var callback = useCallback(function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var callId = ++lastCallId.current;\n if (!state.loading) {\n set(function (prevState) { return (__assign(__assign({}, prevState), { loading: true })); });\n }\n return fn.apply(void 0, args).then(function (value) {\n isMounted() && callId === lastCallId.current && set({ value: value, loading: false });\n return value;\n }, function (error) {\n isMounted() && callId === lastCallId.current && set({ error: error, loading: false });\n return error;\n });\n }, deps);\n return [state, callback];\n}\n","import React from 'react';\nimport { Typography, Box } from '@material-ui/core';\nimport { Skeleton } from '@material-ui/lab';\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 (\n <Box p={2}>\n {[...Array(5)].map((_, i) => (\n <Box key={i} p={2}>\n <Skeleton variant=\"text\" width=\"100%\" />\n </Box>\n ))}\n </Box>\n );\n }\n\n if (error) {\n return (\n <Box p={4}>\n <Typography color=\"error\">\n Unable to check permissions: {error.message}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Please try again or contact your administrator\n </Typography>\n </Box>\n );\n }\n\n if (!allowed) {\n if (fallback) {\n return <>{fallback}</>;\n }\n return (\n <Box p={4}>\n <Typography color=\"textSecondary\">\n {errorMessage || 'You don\\'t have permission to view this page'}\n </Typography>\n <Box mt={1}>\n <Typography variant=\"caption\" color=\"textSecondary\">\n Required permission: {permission.name}\n </Typography>\n </Box>\n </Box>\n );\n }\n\n return <>{children}</>;\n};\n","import { 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 on the My API Keys page.\n */\nexport const getMyApiKeysStatusChipStyle = (phase: string): CSSProperties => {\n const base = { border: \"none\" };\n switch (phase) {\n case \"Approved\":\n return { ...base, backgroundColor: \"#1976d2\", color: \"#fff\" }; // Blue\n case \"Denied\":\n return { ...base, backgroundColor: \"#d32f2f\", color: \"#fff\" }; // Red\n case \"Failed\":\n return { ...base, backgroundColor: \"#ed6c02\", color: \"#fff\" }; // Orange\n case \"Pending\":\n return { ...base, backgroundColor: \"#9c27b0\", color: \"#fff\" }; // Purple\n default:\n return { ...base, backgroundColor: \"#9c27b0\", color: \"#fff\" }; // Purple (fallback for Pending)\n }\n};\n\n/**\n * Returns inline styles for API key status chips on the Approval Queue page.\n * Uses inline styles to ensure proper specificity with Material-UI Chip.\n */\nexport const getApprovalQueueStatusChipStyle = (phase: string): CSSProperties => {\n const base = { border: \"none\" };\n switch (phase) {\n case \"Approved\":\n return { ...base, backgroundColor: \"#2e7d32\", color: \"#fff\" }; // Green\n case \"Denied\":\n return { ...base, backgroundColor: \"#d32f2f\", color: \"#fff\" }; // Red\n case \"Pending\":\n return { ...base, backgroundColor: \"#ed6c02\", color: \"#fff\" }; // Orange\n default:\n return { ...base, backgroundColor: \"#ed6c02\", color: \"#fff\" }; // Orange (fallback for Pending)\n }\n};\n\n/**\n * Returns inline styles for lifecycle chips.\n * Uses inline styles to ensure proper specificity with Material-UI Chip.\n */\nexport const getLifecycleChipStyle = (lifecycle: string): CSSProperties => {\n switch (lifecycle) {\n case \"production\":\n return { backgroundColor: \"#1976d2\", color: \"#fff\" }; // Blue\n case \"experimental\":\n return { backgroundColor: \"#9c27b0\", color: \"#fff\" }; // Purple\n case \"deprecated\":\n return { backgroundColor: \"#ff9800\", color: \"#fff\" }; // Orange\n case \"retired\":\n return { backgroundColor: \"#d32f2f\", color: \"#fff\" }; // Red\n default:\n return {};\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;","import React, { useState, useMemo } from \"react\";\nimport {\n useApi,\n identityApiRef,\n alertApiRef,\n} from \"@backstage/core-plugin-api\";\nimport { kuadrantApiRef } from '../../api';\nimport { useAsync } from \"react-use\";\nimport {\n Table,\n TableColumn,\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 { Skeleton } from \"@material-ui/lab\";\nimport CheckCircleIcon from \"@material-ui/icons/CheckCircle\";\nimport CancelIcon from \"@material-ui/icons/Cancel\";\nimport { FilterPanel, FilterSection, FilterState } from \"../FilterPanel\";\nimport {APIKey, BulkOperationResult} from \"../../types/api-management\";\nimport { getApprovalQueueStatusChipStyle } from \"../../utils/styles\";\nimport { getAPIKeyPhase } from \"../../utils/apikeys\";\n\nconst useStyles = makeStyles((theme) => ({\n container: {\n display: \"flex\",\n height: \"100%\",\n minHeight: 400,\n },\n tableContainer: {\n flex: 1,\n overflow: \"auto\",\n padding: 10,\n },\n useCasePanel: {\n padding: theme.spacing(2),\n backgroundColor: theme.palette.background.default,\n },\n useCaseLabel: {\n fontWeight: 600,\n marginBottom: theme.spacing(1),\n color: theme.palette.text.secondary,\n textTransform: \"uppercase\",\n fontSize: \"0.75rem\",\n },\n bulkActions: {\n padding: theme.spacing(2),\n backgroundColor: theme.palette.background.default,\n borderBottom: `1px solid ${theme.palette.divider}`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n },\n}));\n\ninterface ApprovalDialogProps {\n open: boolean;\n request: APIKey | null;\n action: \"approve\" | \"reject\";\n processing: boolean;\n onClose: () => void;\n onConfirm: () => void;\n}\n\nconst ApprovalDialog = ({\n open,\n request,\n action,\n processing,\n onClose,\n onConfirm,\n}: ApprovalDialogProps) => {\n const [confirmInput, setConfirmInput] = React.useState(\"\");\n const actionLabel = action === \"approve\" ? \"Approve\" : \"Reject\";\n const processingLabel =\n action === \"approve\" ? \"Approving...\" : \"Rejecting...\";\n\n const isReject = action === \"reject\";\n const confirmText = request?.spec.requestedBy?.userId || \"\";\n const canConfirm = isReject ? confirmInput === confirmText : true;\n\n // reset input when dialog closes\n React.useEffect(() => {\n if (!open) {\n setConfirmInput(\"\");\n }\n }, [open]);\n\n return (\n <Dialog\n open={open}\n onClose={processing ? undefined : onClose}\n maxWidth=\"sm\"\n fullWidth\n >\n <DialogTitle>\n {isReject ? (\n <Box display=\"flex\" alignItems=\"center\" style={{ gap: 8 }}>\n <CancelIcon color=\"error\" />\n <span>{actionLabel} API Key</span>\n </Box>\n ) : (\n <span>{actionLabel} API Key</span>\n )}\n </DialogTitle>\n <DialogContent>\n {request && (\n <>\n <p>\n <strong>User:</strong> {request.spec.requestedBy.userId}\n </p>\n <p>\n <strong>API:</strong>{\" \"}\n {request.spec.apiProductRef?.name || \"unknown\"}\n </p>\n <p>\n <strong>Tier:</strong> {request.spec.planTier}\n </p>\n <Box mb={2}>\n <Typography\n variant=\"body2\"\n component=\"span\"\n style={{ fontWeight: \"bold\" }}\n >\n Use Case:\n </Typography>{\" \"}\n <Typography\n variant=\"body2\"\n component=\"span\"\n style={{ whiteSpace: \"pre-wrap\" }}\n >\n {request.spec.useCase || \"-\"}\n </Typography>\n </Box>\n {isReject && (\n <Box mt={2}>\n <Typography variant=\"body2\" color=\"textSecondary\" gutterBottom>\n Type <strong>{confirmText}</strong> to confirm rejection:\n </Typography>\n <TextField\n fullWidth\n variant=\"outlined\"\n size=\"small\"\n value={confirmInput}\n onChange={(e) => setConfirmInput(e.target.value)}\n disabled={processing}\n autoFocus\n placeholder={confirmText}\n />\n </Box>\n )}\n </>\n )}\n </DialogContent>\n <DialogActions>\n <Button onClick={onClose} disabled={processing}>\n Cancel\n </Button>\n <Button\n onClick={onConfirm}\n color={action === \"approve\" ? \"primary\" : \"secondary\"}\n variant=\"contained\"\n disabled={processing || !canConfirm}\n startIcon={\n processing ? (\n <CircularProgress size={16} color=\"inherit\" />\n ) : undefined\n }\n >\n {processing ? processingLabel : actionLabel}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n\ninterface BulkActionDialogProps {\n open: boolean;\n requests: APIKey[];\n action: \"approve\" | \"reject\";\n processing: boolean;\n onClose: () => void;\n onConfirm: () => void;\n}\n\nconst BulkActionDialog = ({\n open,\n requests,\n action,\n processing,\n onClose,\n onConfirm,\n}: BulkActionDialogProps) => {\n const isApprove = action === \"approve\";\n const actionLabel = isApprove ? \"Approve All\" : \"Reject All\";\n const processingLabel = isApprove ? \"Approving...\" : \"Rejecting...\";\n\n return (\n <Dialog\n open={open}\n onClose={processing ? undefined : onClose}\n maxWidth=\"md\"\n fullWidth\n >\n <DialogTitle>\n {isApprove ? \"Approve\" : \"Reject\"} {requests.length} API Keys\n </DialogTitle>\n <DialogContent>\n <Typography variant=\"body2\" paragraph>\n You are about to {isApprove ? \"approve\" : \"reject\"} the following API\n keys:\n </Typography>\n <Box mb={2} maxHeight={200} overflow=\"auto\">\n {requests.map((request) => (\n <Box\n key={`${request.metadata.namespace}/${request.metadata.name}`}\n mb={1}\n p={1}\n bgcolor=\"background.default\"\n >\n <Typography variant=\"body2\">\n <strong>{request.spec.requestedBy.userId}</strong> -{\" \"}\n {request.spec.apiProductRef?.name || \"unknown\"} (\n {request.spec.planTier})\n </Typography>\n </Box>\n ))}\n </Box>\n </DialogContent>\n <DialogActions>\n <Button onClick={onClose} disabled={processing}>\n Cancel\n </Button>\n <Button\n onClick={onConfirm}\n color={isApprove ? \"primary\" : \"secondary\"}\n variant=\"contained\"\n disabled={processing}\n startIcon={\n processing ? (\n <CircularProgress size={16} color=\"inherit\" />\n ) : undefined\n }\n >\n {processing ? processingLabel : actionLabel}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n\ninterface ExpandedRowProps {\n request: APIKey;\n}\n\nconst ExpandedRowContent = ({ request }: ExpandedRowProps) => {\n const classes = useStyles();\n\n return (\n <Box className={classes.useCasePanel} onClick={(e) => e.stopPropagation()}>\n <Typography className={classes.useCaseLabel}>Use Case</Typography>\n <Typography variant=\"body2\">\n {request.spec.useCase || \"No use case provided\"}\n </Typography>\n </Box>\n );\n};\n\ninterface AlertDialogProps {\n open: boolean;\n results: BulkOperationResult[];\n isApprove: boolean;\n onClose: () => void;\n}\n\nconst useBulkAlertStyles = makeStyles((theme) => ({\n successSection: {\n padding: theme.spacing(2),\n backgroundColor: theme.palette.success.main + '14',\n borderRadius: theme.shape.borderRadius,\n marginBottom: theme.spacing(2),\n border: `1px solid ${theme.palette.success.main}40`,\n },\n failureSection: {\n padding: theme.spacing(2),\n backgroundColor: theme.palette.error.main + '14',\n borderRadius: theme.shape.borderRadius,\n marginBottom: theme.spacing(2),\n border: `1px solid ${theme.palette.error.main}40`,\n },\n warningSection: {\n padding: theme.spacing(2),\n backgroundColor: theme.palette.warning.main + '14',\n borderRadius: theme.shape.borderRadius,\n marginBottom: theme.spacing(2),\n border: `1px solid ${theme.palette.warning.main}40`,\n },\n statRow: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n },\n errorList: {\n marginTop: theme.spacing(2),\n padding: 0,\n listStyle: 'none',\n },\n errorItem: {\n padding: theme.spacing(1.5),\n marginBottom: theme.spacing(1),\n backgroundColor: theme.palette.background.paper,\n borderRadius: theme.shape.borderRadius,\n border: `1px solid ${theme.palette.divider}`,\n },\n errorName: {\n fontWeight: 600,\n fontSize: '0.875rem',\n marginBottom: theme.spacing(0.5),\n },\n errorMessage: {\n fontSize: '0.813rem',\n color: theme.palette.error.main,\n fontFamily: 'monospace',\n wordBreak: 'break-word',\n },\n expandButton: {\n marginTop: theme.spacing(1),\n padding: theme.spacing(0.5),\n },\n}));\n\nconst BulkAlertDialog = ({\n open,\n results,\n isApprove,\n onClose,\n}: AlertDialogProps) => {\n const classes = useBulkAlertStyles();\n const [showErrors, setShowErrors] = useState(true);\n const successResults = results.filter((res: any) => res.success);\n const failedResults = results.filter((res: any) => !res.success);\n const hasPartialSuccess = successResults.length > 0;\n\n return (\n <Dialog\n open={open}\n onClose={onClose}\n maxWidth=\"md\"\n fullWidth\n >\n <DialogTitle>\n <Box display=\"flex\" alignItems=\"center\" style={{ gap: 8 }}>\n {hasPartialSuccess ? (\n <>\n <CancelIcon style={{ color: '#ff9800' }} />\n <span>Bulk {isApprove ? \"Approve\" : \"Reject\"} Completed with Issues</span>\n </>\n ) : (\n <>\n <CancelIcon color=\"error\" />\n <span>Bulk {isApprove ? \"Approve\" : \"Reject\"} Failed</span>\n </>\n )}\n </Box>\n </DialogTitle>\n <DialogContent>\n {hasPartialSuccess && (\n <Box className={classes.successSection}>\n <Box className={classes.statRow}>\n <CheckCircleIcon style={{ color: '#4caf50' }} />\n <Typography variant=\"body1\">\n <strong>{successResults.length}</strong> API key{successResults.length !== 1 ? 's' : ''} {isApprove ? 'approved' : 'denied'} successfully\n </Typography>\n </Box>\n </Box>\n )}\n\n <Box className={hasPartialSuccess ? classes.warningSection : classes.failureSection}>\n <Box className={classes.statRow}>\n <CancelIcon color=\"error\" />\n <Typography variant=\"body1\">\n <strong>{failedResults.length}</strong> request{failedResults.length !== 1 ? 's' : ''} failed\n </Typography>\n </Box>\n\n <Button\n size=\"small\"\n className={classes.expandButton}\n onClick={() => setShowErrors(!showErrors)}\n >\n {showErrors ? 'Hide' : 'Show'} Error Details\n </Button>\n\n {showErrors && (\n <ul className={classes.errorList}>\n {failedResults.map((result, index) => (\n <li key={result.name || index} className={classes.errorItem}>\n <div className={classes.errorName}>\n {result.namespace}/{result.name}\n </div>\n <div className={classes.errorMessage}>\n {result.error || 'Unknown error'}\n </div>\n </li>\n ))}\n </ul>\n )}\n </Box>\n </DialogContent>\n <DialogActions>\n <Button onClick={onClose} color=\"primary\" variant=\"contained\">\n Close\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n\nexport const ApprovalQueueTable = () => {\n const classes = useStyles();\n const identityApi = useApi(identityApiRef);\n const alertApi = useApi(alertApiRef);\n const kuadrantApi = useApi(kuadrantApiRef);\n const [refresh, setRefresh] = useState(0);\n const [selectedRequests, setSelectedRequests] = useState<APIKey[]>([]);\n const [dialogState, setDialogState] = useState<{\n open: boolean;\n request: APIKey | null;\n action: \"approve\" | \"reject\";\n processing: boolean;\n }>({\n open: false,\n request: null,\n action: \"approve\",\n processing: false,\n });\n const [bulkDialogState, setBulkDialogState] = useState<{\n open: boolean;\n requests: APIKey[];\n action: \"approve\" | \"reject\";\n processing: boolean;\n }>({\n open: false,\n requests: [],\n action: \"approve\",\n processing: false,\n });\n const [bulkAlertDialogState, setBulkAlertDialogState] = useState<{\n open: boolean;\n results: BulkOperationResult[];\n isApprove: boolean;\n }>({\n open: false,\n results: [],\n isApprove: true,\n });\n const [filters, setFilters] = useState<FilterState>({\n status: [],\n apiProduct: [],\n tier: [],\n });\n\n const {\n allowed: canUpdateAllRequests,\n loading: updateAllPermissionLoading,\n error: updateAllPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyUpdateAllPermission);\n\n const {\n allowed: canUpdateOwnRequests,\n loading: updateOwnPermissionLoading,\n error: updateOwnPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyUpdateOwnPermission);\n\n const updatePermissionLoading =\n updateAllPermissionLoading || updateOwnPermissionLoading;\n const updatePermissionError =\n updateAllPermissionError || updateOwnPermissionError;\n\n const { value, loading, error } = useAsync(async () => {\n const identity = await identityApi.getBackstageIdentity();\n const reviewedBy = identity.userEntityRef;\n\n try {\n const [apiKeyRequests, apiProducts] = await Promise.all([\n kuadrantApi.getAllRequests(),\n kuadrantApi.getApiProducts(),\n ]);\n\n const allRequests = apiKeyRequests.items || [];\n const ownedApiProducts = new Set<string>();\n\n for (const product of apiProducts.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 return { allRequests, reviewedBy, ownedApiProducts };\n\n } catch(err) {\n const errorMessage = err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to get resources. ${errorMessage}`,\n display: \"transient\",\n severity: \"error\",\n });\n return {\n allRequests: [] as APIKey[],\n reviewedBy,\n ownedApiProducts: new Set<string>(),\n };\n }\n }, [kuadrantApi, identityApi, refresh]);\n\n const filterSections: FilterSection[] = useMemo(() => {\n if (!value?.allRequests) return [];\n\n const statusCounts = { Approved: 0, Pending: 0, Denied: 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 = getAPIKeyPhase(r.status?.conditions);\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: \"Denied\",\n label: \"Denied\",\n count: statusCounts.Denied,\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 = getAPIKeyPhase(r.status?.conditions);\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 apikeyRequestFn = dialogState.action === \"approve\"\n ? (ns: string, n: string, r: string) => kuadrantApi.approveRequest(ns, n, r)\n : (ns: string, n: string, r: string) => kuadrantApi.rejectRequest(ns, n, r)\n try {\n await apikeyRequestFn(dialogState.request.metadata.namespace, dialogState.request.metadata.name, value.reviewedBy);\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\" : \"denied\";\n alertApi.post({\n message: `API key ${action}`,\n severity: \"success\",\n display: \"transient\",\n });\n } catch (err) {\n console.error(`error ${dialogState.action}ing request:`, err);\n setDialogState((prev) => ({ ...prev, processing: false }));\n const errorMessage = err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to ${dialogState.action} API key. ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\n }\n };\n\n const handleBulkApprove = () => {\n if (selectedRequests.length === 0) return;\n setBulkDialogState({\n open: true,\n requests: selectedRequests,\n action: \"approve\",\n processing: false,\n });\n };\n\n const handleBulkReject = () => {\n if (selectedRequests.length === 0) return;\n setBulkDialogState({\n open: true,\n requests: selectedRequests,\n action: \"reject\",\n processing: false,\n });\n };\n\n const handleBulkConfirm = async () => {\n if (!value || bulkDialogState.requests.length === 0) return;\n\n setBulkDialogState((prev) => ({ ...prev, processing: true }));\n setBulkAlertDialogState({ open: false, results: [], isApprove: true, });\n\n const isApprove = bulkDialogState.action === \"approve\";\n const apiKeyRequestsFn = isApprove\n ? (req: { namespace: string, name: string }[], rb: string) => kuadrantApi.bulkApproveRequests(req, rb)\n : (req: { namespace: string, name: string }[], rb: string) => kuadrantApi.bulkRejectRequests(req, rb)\n\n try {\n const requests = bulkDialogState.requests.map((r) => ({\n namespace: r.metadata.namespace,\n name: r.metadata.name,\n }))\n const bulkResponse = await apiKeyRequestsFn(requests, value.reviewedBy) || [];\n\n const successfulItems = bulkResponse.filter((res: any) => res.success);\n const failedItems = bulkResponse.filter((res: any) => !res.success);\n const totalSuccess = failedItems.length === 0;\n\n const action = isApprove ? \"approved\" : \"denied\";\n\n setBulkDialogState({\n open: false,\n requests: [],\n action: \"approve\",\n processing: false,\n });\n setBulkAlertDialogState({\n open: !totalSuccess,\n results: bulkResponse,\n isApprove,\n });\n setSelectedRequests([]);\n setRefresh((r) => r + 1);\n\n if (totalSuccess) {\n alertApi.post({\n message: `${successfulItems.length} API keys ${action}`,\n severity: \"success\",\n display: \"transient\",\n });\n }\n } catch (err) {\n console.error(`error bulk ${bulkDialogState.action}ing requests:`, err);\n setBulkDialogState((prev) => ({ ...prev, processing: false }));\n const errorMessage = err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to bulk ${bulkDialogState.action} API keys. ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\n }\n };\n\n const formatDate = (dateString: string) => {\n const date = new Date(dateString);\n return date.toLocaleDateString(\"en-GB\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n };\n\n const columns: TableColumn<APIKey>[] = [\n {\n title: \"Requester\",\n field: \"spec.requestedBy.userId\",\n render: (row) => (\n <Typography variant=\"body2\">{row.spec.requestedBy.userId}</Typography>\n ),\n },\n {\n title: \"API Product\",\n field: \"spec.apiProductRef.name\",\n render: (row) => {\n const name = row.spec.apiProductRef?.name || \"unknown\";\n return (\n <Link to={`/catalog/default/api/${name}`}>\n <strong>{name}</strong>\n </Link>\n );\n },\n },\n {\n title: \"Status\",\n field: \"status.conditions\",\n render: (row) => {\n const phase = getAPIKeyPhase(row.status?.conditions);\n return (\n <Chip label={phase} size=\"small\" style={getApprovalQueueStatusChipStyle(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 = getAPIKeyPhase(row.status?.conditions);\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 (\n <Box p={2}>\n {[...Array(5)].map((_, i) => (\n <Box key={i} p={2}>\n <Skeleton variant=\"text\" width=\"100%\" />\n </Box>\n ))}\n </Box>\n );\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 getAPIKeyPhase(r.status?.conditions) === \"Pending\",\n ),\n selectionProps: (row: APIKey) => ({\n disabled:\n getAPIKeyPhase(row.status?.conditions) !== \"Pending\",\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) => getAPIKeyPhase(r.status?.conditions) === \"Pending\",\n );\n setSelectedRequests(pendingOnly);\n }}\n detailPanel={detailPanelConfig}\n />\n )}\n </Box>\n </Box>\n\n <ApprovalDialog\n open={dialogState.open}\n request={dialogState.request}\n action={dialogState.action}\n processing={dialogState.processing}\n onClose={() =>\n setDialogState({\n open: false,\n request: null,\n action: \"approve\",\n processing: false,\n })\n }\n onConfirm={handleConfirm}\n />\n <BulkActionDialog\n open={bulkDialogState.open}\n requests={bulkDialogState.requests}\n action={bulkDialogState.action}\n processing={bulkDialogState.processing}\n onClose={() =>\n setBulkDialogState({\n open: false,\n requests: [],\n action: \"approve\",\n processing: false,\n })\n }\n onConfirm={handleBulkConfirm}\n />\n <BulkAlertDialog\n open={bulkAlertDialogState.open}\n results={bulkAlertDialogState.results}\n isApprove={bulkAlertDialogState.isApprove}\n onClose={() =>\n setBulkAlertDialogState({\n open: false,\n results: [],\n isApprove: true,\n })\n }\n />\n </>\n );\n};\n","import React from 'react';\nimport {\n Header,\n Page,\n Content,\n SupportButton,\n} from '@backstage/core-components';\nimport { ApprovalQueueTable } from '../ApprovalQueueTable';\n\nexport const ApiKeyApprovalPage = () => {\n return (\n <Page themeId=\"tool\">\n <Header title=\"API Key Approval\" subtitle=\"Review and approve API key requests\">\n <SupportButton>Approve or reject API key access requests</SupportButton>\n </Header>\n <Content>\n <ApprovalQueueTable />\n </Content>\n </Page>\n );\n};\n","import React from 'react';\nimport { ApiKeyApprovalPage } from './ApiKeyApprovalPage';\nimport { PermissionGate } from '../PermissionGate';\nimport { kuadrantApiKeyApprovePermission } from '../../permissions';\n\nexport const ApiKeyApprovalPageWithPermissions = () => {\n return (\n <PermissionGate\n permission={kuadrantApiKeyApprovePermission}\n errorMessage=\"You don't have permission to approve API keys\"\n >\n <ApiKeyApprovalPage />\n </PermissionGate>\n );\n};\n"],"names":["useStyles","makeStyles","theme","root","width","minWidth","padding","spacing","borderRight","palette","divider","backgroundColor","background","paper","height","overflowY","sectionTitle","fontWeight","fontSize","textTransform","letterSpacing","color","text","secondary","marginBottom","display","alignItems","justifyContent","cursor","userSelect","filterSection","checkbox","checkboxLabel","clearButton","marginTop","count","marginLeft","FilterPanel","sections","filters","onChange","onClear","classes","collapsedSections","setCollapsedSections","React","Set","filter","s","collapsed","map","id","hasActiveFilters","Object","values","some","length","Box","className","mb","Typography","variant","Button","size","onClick","clearedFilters","forEach","section","Divider","isCollapsed","has","selectedCount","mt","toggleSection","sectionId","prev","next","delete","add","span","title","ExpandMoreIcon","ExpandLessIcon","Collapse","in","FormGroup","options","option","FormControlLabel","control","Checkbox","checked","includes","value","currentValues","newValues","v","handleCheckboxChange","label","undefined","getAPIKeyPhase","conditions","find","c","type","status","_interopRequireDefault","_interopRequireWildcard","exports","_default","default","createElement","d","useAsync","fn","deps","_a","initialState","loading","lastCallId","useRef","isMounted","useMountedState","useState","state","set","callback","useCallback","args","_i","arguments","callId","current","prevState","__assign","apply","then","error","useAsyncFn","useEffect","PermissionGate","children","permission","fallback","errorMessage","allowed","useKuadrantPermission","p","Array","_","i","Skeleton","message","name","useDefaultSupportConfig","t","url","items","icon","links","AppIcon","props","key","Fallback","rest","Icon","useApp","getSystemIcon","jsx","HelpIcon","popoverList","maxWidth","menuItem","whiteSpace","SupportIcon","app","SupportLink","link","to","SupportListItem","item","jsxs","MenuItem","button","ListItemIcon","ListItemText","primary","reduce","idx","SupportButton","configItems","config","useApiHolder","get","configApiRef","supportConfig","getOptionalConfig","defaultSupportConfig","getString","getConfigArray","flatMap","itemConf","getOptionalString","getOptionalConfigArray","linkConf","useSupportConfig","popoverOpen","setPopoverOpen","anchorEl","setAnchorEl","useApi","isSmallScreen","useMediaQuery","breakpoints","down","onClickHandler","event","currentTarget","popoverCloseHandler","Fragment","ml","IconButton","startIcon","Popover","open","anchorOrigin","vertical","horizontal","transformOrigin","onClose","MenuList","autoFocusItem","Boolean","Children","child","DialogActions","getMyApiKeysStatusChipStyle","phase","base","border","getApprovalQueueStatusChipStyle","getLifecycleChipStyle","lifecycle","container","minHeight","tableContainer","flex","overflow","useCasePanel","useCaseLabel","bulkActions","borderBottom","ApprovalDialog","request","action","processing","onConfirm","confirmInput","setConfirmInput","actionLabel","processingLabel","isReject","confirmText","spec","requestedBy","userId","canConfirm","Dialog","fullWidth","DialogTitle","style","gap","CancelIcon","DialogContent","strong","apiProductRef","planTier","component","useCase","gutterBottom","TextField","e","target","disabled","autoFocus","placeholder","CircularProgress","BulkActionDialog","requests","isApprove","paragraph","maxHeight","bgcolor","metadata","namespace","ExpandedRowContent","stopPropagation","useBulkAlertStyles","successSection","success","main","borderRadius","shape","failureSection","warningSection","warning","statRow","errorList","listStyle","errorItem","errorName","fontFamily","wordBreak","expandButton","BulkAlertDialog","results","showErrors","setShowErrors","successResults","res","failedResults","hasPartialSuccess","CheckCircleIcon","ul","result","index","li","div","ApprovalQueueTable","identityApi","identityApiRef","alertApi","alertApiRef","kuadrantApi","kuadrantApiRef","refresh","setRefresh","selectedRequests","setSelectedRequests","dialogState","setDialogState","bulkDialogState","setBulkDialogState","bulkAlertDialogState","setBulkAlertDialogState","setFilters","apiProduct","tier","canUpdateAllRequests","updateAllPermissionLoading","updateAllPermissionError","kuadrantApiKeyUpdateAllPermission","canUpdateOwnRequests","updateOwnPermissionLoading","updateOwnPermissionError","kuadrantApiKeyUpdateOwnPermission","updatePermissionLoading","updatePermissionError","async","reviewedBy","getBackstageIdentity","userEntityRef","apiKeyRequests","apiProducts","Promise","all","getAllRequests","getApiProducts","allRequests","ownedApiProducts","product","annotations","err","Error","post","severity","filterSections","useMemo","statusCounts","Approved","Pending","Denied","apiProductCounts","Map","tierCounts","r","from","entries","charAt","toUpperCase","slice","filteredRequests","formatDate","dateString","Date","toLocaleDateString","year","month","day","columns","field","render","row","Link","Chip","creationTimestamp","reviewer","replace","isAutomatic","reviewedAt","filtering","apiProductKey","ownsApiProduct","detailPanelConfig","data","rowData","ResponseErrorPanel","canSelectRows","textAlign","Table","selection","showSelectAllCheckbox","selectionProps","paging","pageSize","search","debounceInterval","showTextRowsSelected","toolbar","emptyRowsWhenPaging","isSelected","selected","tableData","onSelectionChange","rows","pendingOnly","detailPanel","apikeyRequestFn","ns","n","approveRequest","rejectRequest","console","apiKeyRequestsFn","req","rb","bulkApproveRequests","bulkRejectRequests","bulkResponse","successfulItems","totalSuccess","ApiKeyApprovalPage","Page","themeId","Header","subtitle","Content","ApiKeyApprovalPageWithPermissions","kuadrantApiKeyApprovePermission"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[3947],{46299:(e,a,n)=>{n.d(a,{ee:()=>t,g9:()=>i,uU:()=>s});const i=e=>{const a={border:"none"};switch(e){case"Approved":return{...a,backgroundColor:"#1976d2",color:"#fff"};case"Denied":return{...a,backgroundColor:"#d32f2f",color:"#fff"};case"Failed":return{...a,backgroundColor:"#ed6c02",color:"#fff"};default:return{...a,backgroundColor:"#9c27b0",color:"#fff"}}},s=e=>{const a={border:"none"};switch(e){case"Approved":return{...a,backgroundColor:"#2e7d32",color:"#fff"};case"Denied":return{...a,backgroundColor:"#d32f2f",color:"#fff"};default:return{...a,backgroundColor:"#ed6c02",color:"#fff"}}},t=e=>{switch(e){case"production":return{backgroundColor:"#1976d2",color:"#fff"};case"experimental":return{backgroundColor:"#9c27b0",color:"#fff"};case"deprecated":return{backgroundColor:"#ff9800",color:"#fff"};case"retired":return{backgroundColor:"#d32f2f",color:"#fff"};default:return{}}}},71255:(e,a,n)=>{n.d(a,{n:()=>d});var i=n(31085),s=(n(95478),n(82300)),t=n(37725),l=n(96040),r=n(10394),c=n(42899),o=n(72501);const d=({issuerUrl:e,tokenEndpoint:a})=>{const n=a||e;return(0,i.jsx)(l.n,{title:"OIDC Provider Discovery",children:(0,i.jsx)(r.A,{p:2,children:(0,i.jsxs)(c.A,{container:!0,spacing:2,children:[(0,i.jsx)(c.A,{item:!0,xs:12,children:(0,i.jsx)(o.A,{variant:"body2",children:"This API uses OIDC authentication. Obtain a token from the identity provider below."})}),(0,i.jsx)(c.A,{item:!0,xs:12,children:(0,i.jsxs)(o.A,{variant:"body2",children:[(0,i.jsx)("strong",{children:"Identity Provider: "}),(0,i.jsx)(t.N_,{to:e,target:"_blank",children:e})]})}),a&&(0,i.jsx)(c.A,{item:!0,xs:12,children:(0,i.jsxs)(o.A,{variant:"body2",children:[(0,i.jsx)("strong",{children:"Token Endpoint: "}),(0,i.jsx)(t.N_,{to:a,target:"_blank",children:a})]})}),(0,i.jsx)(c.A,{item:!0,xs:12,children:(0,i.jsx)(s.z,{text:`# Example (Client Credentials Flow):\ncurl -X POST \\\n -d "grant_type=client_credentials" \\\n -d "client_id=YOUR_CLIENT_ID" \\\n -d "client_secret=YOUR_CLIENT_SECRET" \\\n ${n}`,language:"bash",showCopyCodeButton:!0})})]})})})}},89509:(e,a,n)=>{n.d(a,{O:()=>A});var i=n(31085),s=(n(95478),n(10394)),t=n(72501),l=n(67720),r=n(61009),c=n(47625),o=n(9719),d=n(54801),m=n(13677),h=n(42899),p=n(58837),u=n(37725),x=n(46299);const j=(0,p.A)(e=>({label:{fontWeight:600,color:e.palette.text.secondary,marginBottom:e.spacing(.5),fontSize:"0.75rem",textTransform:"uppercase"},tierChip:{marginRight:e.spacing(.5),marginBottom:e.spacing(.5)},statusChipPublished:{backgroundColor:e.palette.primary.main,color:e.palette.primary.contrastText},statusChipDraft:{backgroundColor:e.palette.grey[600],color:e.palette.common.white},infoGrid:{display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(180px, 1fr))",gap:e.spacing(3),marginBottom:e.spacing(3)},infoItem:{minWidth:0},apiLink:{color:e.palette.primary.main,textDecoration:"none","&:hover":{textDecoration:"underline"}}})),A=({product:e,showStatus:a=!0,showCatalogLink:n=!0,httpRouteHostnames:p})=>{var A,v,f,b,g,N,y,C,k,I,_,P,D,w,R,L,S,T,O;const U=j(),E=(null===(A=e.spec)||void 0===A?void 0:A.publishStatus)||"Draft",z="Published"===E,B=(null===(v=e.status)||void 0===v?void 0:v.discoveredPlans)||[],F=(null===(b=e.status)||void 0===b||null===(f=b.discoveredAuthScheme)||void 0===f?void 0:f.authentication)||{},G=Object.values(F).some(e=>e.hasOwnProperty("apiKey"));return(0,i.jsxs)(i.Fragment,{children:[(null===(g=e.spec)||void 0===g?void 0:g.description)&&(0,i.jsxs)(s.A,{mb:3,children:[(0,i.jsx)(t.A,{variant:"caption",className:U.label,children:"Description"}),(0,i.jsx)(t.A,{variant:"body1",children:e.spec.description})]}),(0,i.jsxs)(s.A,{className:U.infoGrid,children:[a&&(0,i.jsxs)(s.A,{className:U.infoItem,children:[(0,i.jsx)(t.A,{variant:"caption",className:U.label,children:"Publish Status"}),(0,i.jsx)(s.A,{children:(0,i.jsx)(l.A,{label:E,size:"small",className:z?U.statusChipPublished:U.statusChipDraft,"data-testid":"publish-status-chip"})})]}),(null===(N=e.metadata.labels)||void 0===N?void 0:N.lifecycle)&&(0,i.jsxs)(s.A,{className:U.infoItem,children:[(0,i.jsx)(t.A,{variant:"caption",className:U.label,children:"Lifecycle"}),(0,i.jsx)(s.A,{children:(0,i.jsx)(l.A,{label:e.metadata.labels.lifecycle,size:"small",style:(0,x.ee)(e.metadata.labels.lifecycle),"data-testid":"lifecycle-chip"})})]}),(0,i.jsxs)(s.A,{className:U.infoItem,children:[(0,i.jsx)(t.A,{variant:"caption",className:U.label,children:"Version"}),(0,i.jsx)(t.A,{variant:"body2",children:(null===(y=e.spec)||void 0===y?void 0:y.version)||"v1"})]}),(0,i.jsxs)(s.A,{className:U.infoItem,children:[(0,i.jsx)(t.A,{variant:"caption",className:U.label,children:"Namespace"}),(0,i.jsx)(t.A,{variant:"body2",children:e.metadata.namespace})]}),G&&(0,i.jsxs)(s.A,{className:U.infoItem,children:[(0,i.jsx)(t.A,{variant:"caption",className:U.label,children:"API Key Approval"}),(0,i.jsx)(t.A,{variant:"body2",children:"automatic"===(null===(C=e.spec)||void 0===C?void 0:C.approvalMode)?"Automatic":"Need manual approval"})]}),(null===(k=e.spec)||void 0===k?void 0:k.tags)&&e.spec.tags.length>0&&(0,i.jsxs)(s.A,{className:U.infoItem,children:[(0,i.jsx)(t.A,{variant:"caption",className:U.label,children:"Tags"}),(0,i.jsx)(s.A,{children:e.spec.tags.map(e=>(0,i.jsx)(l.A,{label:e,size:"small",variant:"outlined",className:U.tierChip},e))})]})]}),(0,i.jsxs)(s.A,{className:U.infoGrid,children:[(0,i.jsxs)(s.A,{className:U.infoItem,children:[(0,i.jsx)(t.A,{variant:"caption",className:U.label,children:"API"}),(0,i.jsx)("br",{}),n?(0,i.jsx)(u.N_,{to:`/catalog/default/api/${e.metadata.name}`,className:U.apiLink,children:e.metadata.name}):(0,i.jsx)(t.A,{variant:"body2",children:e.metadata.name})]}),(0,i.jsxs)(s.A,{className:U.infoItem,children:[(0,i.jsx)(t.A,{variant:"caption",className:U.label,children:"Route"}),(0,i.jsx)(t.A,{variant:"body2",children:(null===(_=e.spec)||void 0===_||null===(I=_.targetRef)||void 0===I?void 0:I.name)||"-"})]}),p&&p.length>0&&(0,i.jsxs)(s.A,{className:U.infoItem,children:[(0,i.jsx)(t.A,{variant:"caption",className:U.label,children:p.length>1?"Hostnames":"Hostname"}),p.map((e,a)=>(0,i.jsx)(t.A,{variant:"body2",children:e},a))]})]}),B.length>0&&(0,i.jsxs)(s.A,{mb:3,children:[(0,i.jsx)(t.A,{variant:"caption",className:U.label,children:"Available Tiers"}),(0,i.jsxs)(r.A,{size:"small",children:[(0,i.jsx)(c.A,{children:(0,i.jsxs)(o.A,{children:[(0,i.jsx)(d.A,{children:"Tier"}),(0,i.jsx)(d.A,{children:"Rate Limits"})]})}),(0,i.jsx)(m.A,{children:B.map(e=>(0,i.jsxs)(o.A,{children:[(0,i.jsx)(d.A,{children:(0,i.jsx)(l.A,{label:e.tier,size:"small"})}),(0,i.jsx)(d.A,{children:e.limits&&Object.entries(e.limits).map(([e,a])=>(0,i.jsxs)(t.A,{variant:"body2",children:[String(a)," per ",e]},e))})]},e.tier))})]})]}),(0,i.jsxs)(h.A,{container:!0,spacing:3,children:[((null===(D=e.spec)||void 0===D||null===(P=D.contact)||void 0===P?void 0:P.email)||(null===(R=e.spec)||void 0===R||null===(w=R.contact)||void 0===w?void 0:w.team))&&(0,i.jsxs)(h.A,{item:!0,xs:12,md:6,children:[(0,i.jsx)(t.A,{variant:"caption",className:U.label,children:"Contact Information"}),(0,i.jsxs)(s.A,{mt:1,children:[e.spec.contact.team&&(0,i.jsxs)(t.A,{variant:"body2",children:[(0,i.jsx)("strong",{children:"Team:"})," ",e.spec.contact.team]}),e.spec.contact.email&&(0,i.jsxs)(t.A,{variant:"body2",children:[(0,i.jsx)("strong",{children:"Email:"})," ",(0,i.jsx)(u.N_,{to:`mailto:${e.spec.contact.email}`,children:e.spec.contact.email})]})]})]}),((null===(S=e.spec)||void 0===S||null===(L=S.documentation)||void 0===L?void 0:L.docsURL)||(null===(O=e.spec)||void 0===O||null===(T=O.documentation)||void 0===T?void 0:T.openAPISpecURL))&&(0,i.jsxs)(h.A,{item:!0,xs:12,md:6,children:[(0,i.jsx)(t.A,{variant:"caption",className:U.label,children:"Documentation"}),(0,i.jsxs)(s.A,{mt:1,children:[e.spec.documentation.docsURL&&(0,i.jsxs)(t.A,{variant:"body2",children:[(0,i.jsx)("strong",{children:"Docs:"})," ",(0,i.jsx)(u.N_,{to:e.spec.documentation.docsURL,target:"_blank",children:"View Documentation"})]}),e.spec.documentation.openAPISpecURL&&(0,i.jsxs)(t.A,{variant:"body2",children:[(0,i.jsx)("strong",{children:"OpenAPI Spec:"})," ",(0,i.jsx)(u.N_,{to:e.spec.documentation.openAPISpecURL,target:"_blank",children:"View Spec"})]})]})]})]})]})}}}]);
2
+ //# sourceMappingURL=3947.f5320e89.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static/3947.f5320e89.chunk.js","mappings":"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","sources":["webpack://internal.plugin-kuadrant/./src/utils/styles.ts","webpack://internal.plugin-kuadrant/./src/components/OidcProviderCard/OidcProviderCard.tsx","webpack://internal.plugin-kuadrant/./src/components/ApiProductDetails/ApiProductDetails.tsx"],"sourcesContent":["import { CSSProperties } from \"react\";\n\n/**\n * Returns inline styles for API key status chips on the My API Keys page.\n */\nexport const getMyApiKeysStatusChipStyle = (phase: string): CSSProperties => {\n const base = { border: \"none\" };\n switch (phase) {\n case \"Approved\":\n return { ...base, backgroundColor: \"#1976d2\", color: \"#fff\" }; // Blue\n case \"Denied\":\n return { ...base, backgroundColor: \"#d32f2f\", color: \"#fff\" }; // Red\n case \"Failed\":\n return { ...base, backgroundColor: \"#ed6c02\", color: \"#fff\" }; // Orange\n case \"Pending\":\n return { ...base, backgroundColor: \"#9c27b0\", color: \"#fff\" }; // Purple\n default:\n return { ...base, backgroundColor: \"#9c27b0\", color: \"#fff\" }; // Purple (fallback for Pending)\n }\n};\n\n/**\n * Returns inline styles for API key status chips on the Approval Queue page.\n * Uses inline styles to ensure proper specificity with Material-UI Chip.\n */\nexport const getApprovalQueueStatusChipStyle = (phase: string): CSSProperties => {\n const base = { border: \"none\" };\n switch (phase) {\n case \"Approved\":\n return { ...base, backgroundColor: \"#2e7d32\", color: \"#fff\" }; // Green\n case \"Denied\":\n return { ...base, backgroundColor: \"#d32f2f\", color: \"#fff\" }; // Red\n case \"Pending\":\n return { ...base, backgroundColor: \"#ed6c02\", color: \"#fff\" }; // Orange\n default:\n return { ...base, backgroundColor: \"#ed6c02\", color: \"#fff\" }; // Orange (fallback for Pending)\n }\n};\n\n/**\n * Returns inline styles for lifecycle chips.\n * Uses inline styles to ensure proper specificity with Material-UI Chip.\n */\nexport const getLifecycleChipStyle = (lifecycle: string): CSSProperties => {\n switch (lifecycle) {\n case \"production\":\n return { backgroundColor: \"#1976d2\", color: \"#fff\" }; // Blue\n case \"experimental\":\n return { backgroundColor: \"#9c27b0\", color: \"#fff\" }; // Purple\n case \"deprecated\":\n return { backgroundColor: \"#ff9800\", color: \"#fff\" }; // Orange\n case \"retired\":\n return { backgroundColor: \"#d32f2f\", color: \"#fff\" }; // Red\n default:\n return {};\n }\n};\n","import React from 'react';\nimport { InfoCard, CodeSnippet, Link } from '@backstage/core-components';\nimport { Typography, Box, Grid } from '@material-ui/core';\n\ninterface OidcProviderCardProps {\n issuerUrl: string;\n tokenEndpoint?: string;\n}\n\nexport const OidcProviderCard = ({ issuerUrl, tokenEndpoint }: OidcProviderCardProps) => {\n const effectiveTokenEndpoint = tokenEndpoint || issuerUrl;\n\n return (\n <InfoCard title=\"OIDC Provider Discovery\">\n <Box p={2}>\n <Grid container spacing={2}>\n <Grid item xs={12}>\n <Typography variant=\"body2\">\n This API uses OIDC authentication. Obtain a token from the identity provider below.\n </Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"body2\">\n <strong>Identity Provider: </strong>\n <Link to={issuerUrl} target=\"_blank\">\n {issuerUrl}\n </Link>\n </Typography>\n </Grid>\n {tokenEndpoint && (\n <Grid item xs={12}>\n <Typography variant=\"body2\">\n <strong>Token Endpoint: </strong>\n <Link to={tokenEndpoint} target=\"_blank\">\n {tokenEndpoint}\n </Link>\n </Typography>\n </Grid>\n )}\n <Grid item xs={12}>\n <CodeSnippet\n text={`# Example (Client Credentials Flow):\ncurl -X POST \\\\\n -d \"grant_type=client_credentials\" \\\\\n -d \"client_id=YOUR_CLIENT_ID\" \\\\\n -d \"client_secret=YOUR_CLIENT_SECRET\" \\\\\n ${effectiveTokenEndpoint}`}\n language=\"bash\"\n showCopyCodeButton\n />\n </Grid>\n </Grid>\n </Box>\n </InfoCard>\n );\n};\n","import React from \"react\";\nimport {\n Box,\n Typography,\n Chip,\n makeStyles,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Grid,\n} from \"@material-ui/core\";\nimport { Link } from \"@backstage/core-components\";\nimport { APIProduct, Plan } from \"../../types/api-management\";\nimport { getLifecycleChipStyle } from \"../../utils/styles\";\n\nconst useStyles = makeStyles((theme) => ({\n label: {\n fontWeight: 600,\n color: theme.palette.text.secondary,\n marginBottom: theme.spacing(0.5),\n fontSize: \"0.75rem\",\n textTransform: \"uppercase\",\n },\n tierChip: {\n marginRight: theme.spacing(0.5),\n marginBottom: theme.spacing(0.5),\n },\n statusChipPublished: {\n backgroundColor: theme.palette.primary.main,\n color: theme.palette.primary.contrastText,\n },\n statusChipDraft: {\n backgroundColor: theme.palette.grey[600],\n color: theme.palette.common.white,\n },\n infoGrid: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(180px, 1fr))\",\n gap: theme.spacing(3),\n marginBottom: theme.spacing(3),\n },\n infoItem: {\n minWidth: 0,\n },\n apiLink: {\n color: theme.palette.primary.main,\n textDecoration: \"none\",\n \"&:hover\": {\n textDecoration: \"underline\",\n },\n },\n}));\n\ninterface ApiProductDetailsProps {\n product: APIProduct;\n showStatus?: boolean;\n showCatalogLink?: boolean;\n httpRouteHostnames?: string[] | null;\n}\n\nexport const ApiProductDetails = ({\n product,\n showStatus = true,\n showCatalogLink = true,\n httpRouteHostnames,\n}: ApiProductDetailsProps) => {\n const classes = useStyles();\n\n const publishStatus = product.spec?.publishStatus || \"Draft\";\n const isPublished = publishStatus === \"Published\";\n const tiers = product.status?.discoveredPlans || [];\n\n // check if product has API key auth\n const authSchemes = product.status?.discoveredAuthScheme?.authentication || {};\n const schemeObjects = Object.values(authSchemes);\n const hasApiKey = schemeObjects.some(\n (scheme: any) => scheme.hasOwnProperty(\"apiKey\"),\n );\n\n return (\n <>\n {product.spec?.description && (\n <Box mb={3}>\n <Typography variant=\"caption\" className={classes.label}>\n Description\n </Typography>\n <Typography variant=\"body1\">{product.spec.description}</Typography>\n </Box>\n )}\n\n <Box className={classes.infoGrid}>\n {showStatus && (\n <Box className={classes.infoItem}>\n <Typography variant=\"caption\" className={classes.label}>\n Publish Status\n </Typography>\n <Box>\n <Chip\n label={publishStatus}\n size=\"small\"\n className={\n isPublished\n ? classes.statusChipPublished\n : classes.statusChipDraft\n }\n data-testid=\"publish-status-chip\"\n />\n </Box>\n </Box>\n )}\n {product.metadata.labels?.lifecycle && (\n <Box className={classes.infoItem}>\n <Typography variant=\"caption\" className={classes.label}>\n Lifecycle\n </Typography>\n <Box>\n <Chip\n label={product.metadata.labels.lifecycle}\n size=\"small\"\n style={getLifecycleChipStyle(product.metadata.labels.lifecycle)}\n data-testid=\"lifecycle-chip\"\n />\n </Box>\n </Box>\n )}\n <Box className={classes.infoItem}>\n <Typography variant=\"caption\" className={classes.label}>\n Version\n </Typography>\n <Typography variant=\"body2\">\n {product.spec?.version || \"v1\"}\n </Typography>\n </Box>\n <Box className={classes.infoItem}>\n <Typography variant=\"caption\" className={classes.label}>\n Namespace\n </Typography>\n <Typography variant=\"body2\">{product.metadata.namespace}</Typography>\n </Box>\n {hasApiKey && (\n <Box className={classes.infoItem}>\n <Typography variant=\"caption\" className={classes.label}>\n API Key Approval\n </Typography>\n <Typography variant=\"body2\">\n {product.spec?.approvalMode === \"automatic\"\n ? \"Automatic\"\n : \"Need manual approval\"}\n </Typography>\n </Box>\n )}\n {product.spec?.tags && product.spec.tags.length > 0 && (\n <Box className={classes.infoItem}>\n <Typography variant=\"caption\" className={classes.label}>\n Tags\n </Typography>\n <Box>\n {product.spec.tags.map((tag) => (\n <Chip\n key={tag}\n label={tag}\n size=\"small\"\n variant=\"outlined\"\n className={classes.tierChip}\n />\n ))}\n </Box>\n </Box>\n )}\n </Box>\n\n <Box className={classes.infoGrid}>\n <Box className={classes.infoItem}>\n <Typography variant=\"caption\" className={classes.label}>\n API\n </Typography>\n <br />\n {showCatalogLink ? (\n <Link\n to={`/catalog/default/api/${product.metadata.name}`}\n className={classes.apiLink}\n >\n {product.metadata.name}\n </Link>\n ) : (\n <Typography variant=\"body2\">{product.metadata.name}</Typography>\n )}\n </Box>\n <Box className={classes.infoItem}>\n <Typography variant=\"caption\" className={classes.label}>\n Route\n </Typography>\n <Typography variant=\"body2\">\n {product.spec?.targetRef?.name || \"-\"}\n </Typography>\n </Box>\n {httpRouteHostnames && httpRouteHostnames.length > 0 && (\n <Box className={classes.infoItem}>\n <Typography variant=\"caption\" className={classes.label}>\n {httpRouteHostnames.length > 1 ? \"Hostnames\" : \"Hostname\"}\n </Typography>\n {httpRouteHostnames.map((hostname, index) => (\n <Typography key={index} variant=\"body2\">\n {hostname}\n </Typography>\n ))}\n </Box>\n )}\n </Box>\n\n {tiers.length > 0 && (\n <Box mb={3}>\n <Typography variant=\"caption\" className={classes.label}>\n Available Tiers\n </Typography>\n <Table size=\"small\">\n <TableHead>\n <TableRow>\n <TableCell>Tier</TableCell>\n <TableCell>Rate Limits</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {tiers.map((plan: Plan) => (\n <TableRow key={plan.tier}>\n <TableCell>\n <Chip label={plan.tier} size=\"small\" />\n </TableCell>\n <TableCell>\n {plan.limits &&\n Object.entries(plan.limits).map(([key, value]) => (\n <Typography key={key} variant=\"body2\">\n {String(value)} per {key}\n </Typography>\n ))}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </Box>\n )}\n\n <Grid container spacing={3}>\n {(product.spec?.contact?.email || product.spec?.contact?.team) && (\n <Grid item xs={12} md={6}>\n <Typography variant=\"caption\" className={classes.label}>\n Contact Information\n </Typography>\n <Box mt={1}>\n {product.spec.contact.team && (\n <Typography variant=\"body2\">\n <strong>Team:</strong> {product.spec.contact.team}\n </Typography>\n )}\n {product.spec.contact.email && (\n <Typography variant=\"body2\">\n <strong>Email:</strong>{\" \"}\n <Link to={`mailto:${product.spec.contact.email}`}>\n {product.spec.contact.email}\n </Link>\n </Typography>\n )}\n </Box>\n </Grid>\n )}\n\n {(product.spec?.documentation?.docsURL ||\n product.spec?.documentation?.openAPISpecURL) && (\n <Grid item xs={12} md={6}>\n <Typography variant=\"caption\" className={classes.label}>\n Documentation\n </Typography>\n <Box mt={1}>\n {product.spec.documentation.docsURL && (\n <Typography variant=\"body2\">\n <strong>Docs:</strong>{\" \"}\n <Link to={product.spec.documentation.docsURL} target=\"_blank\">\n View Documentation\n </Link>\n </Typography>\n )}\n {product.spec.documentation.openAPISpecURL && (\n <Typography variant=\"body2\">\n <strong>OpenAPI Spec:</strong>{\" \"}\n <Link\n to={product.spec.documentation.openAPISpecURL}\n target=\"_blank\"\n >\n View Spec\n </Link>\n </Typography>\n )}\n </Box>\n </Grid>\n )}\n </Grid>\n </>\n );\n};\n"],"names":["getMyApiKeysStatusChipStyle","phase","base","border","backgroundColor","color","getApprovalQueueStatusChipStyle","getLifecycleChipStyle","lifecycle","OidcProviderCard","issuerUrl","tokenEndpoint","effectiveTokenEndpoint","InfoCard","title","Box","p","Grid","container","spacing","item","xs","Typography","variant","strong","Link","to","target","CodeSnippet","text","language","showCopyCodeButton","useStyles","makeStyles","theme","label","fontWeight","palette","secondary","marginBottom","fontSize","textTransform","tierChip","marginRight","statusChipPublished","primary","main","contrastText","statusChipDraft","grey","common","white","infoGrid","display","gridTemplateColumns","gap","infoItem","minWidth","apiLink","textDecoration","ApiProductDetails","product","showStatus","showCatalogLink","httpRouteHostnames","classes","publishStatus","spec","isPublished","tiers","status","discoveredPlans","authSchemes","discoveredAuthScheme","authentication","hasApiKey","Object","values","some","scheme","hasOwnProperty","description","mb","className","Chip","size","data-testid","metadata","labels","style","version","namespace","approvalMode","tags","length","map","tag","br","name","targetRef","hostname","index","Table","TableHead","TableRow","TableCell","TableBody","plan","tier","limits","entries","key","value","String","contact","email","team","md","mt","documentation","docsURL","openAPISpecURL"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[438],{18466:(e,t,n)=>{var r=n(4293),a=n(78920);t.A=void 0;var i=a(n(95478)),o=(0,r(n(74044)).default)(i.createElement("path",{d:"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"}),"Add");t.A=o},25467:(e,t,n)=>{n.d(t,{tN:()=>a}),n(31085),n(22097);var r=n(15427);function a(){const e=(0,r.useVersionedContext)("entity-context");if(!e)throw new Error("Entity context is not available");const t=e.atVersion(1);if(!t)throw new Error("EntityContext v1 not available");if(!t.entity)throw new Error("useEntity hook is being called outside of an EntityLayout where the entity has not been loaded. If this is intentional, please use useAsyncEntity instead.");return{entity:t.entity}}(0,r.createVersionedContext)("entity-context")},32269:(e,t,n)=>{var r=n(4293),a=n(78920);t.A=void 0;var i=a(n(95478)),o=(0,r(n(74044)).default)(i.createElement("path",{d:"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z"}),"Visibility");t.A=o},35015:(e,t,n)=>{n.d(t,{A:()=>o});var r=n(95478),a=n(85608),i=n(71581);function o(e,t){void 0===t&&(t=[]);var n=function(e,t,n){void 0===t&&(t=[]),void 0===n&&(n={loading:!1});var o=(0,r.useRef)(0),s=(0,i.A)(),l=(0,r.useState)(n),c=l[0],d=l[1],h=(0,r.useCallback)(function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var r=++o.current;return c.loading||d(function(e){return(0,a.__assign)((0,a.__assign)({},e),{loading:!0})}),e.apply(void 0,t).then(function(e){return s()&&r===o.current&&d({value:e,loading:!1}),e},function(e){return s()&&r===o.current&&d({error:e,loading:!1}),e})},t);return[c,h]}(e,t,{loading:!0}),o=n[0],s=n[1];return(0,r.useEffect)(function(){s()},[s]),o}},37725:(e,t,n)=>{n.d(t,{N_:()=>A});var r=n(31085),a=n(22097),i=n(49203),o=n(37976),s=n(72501),l=n(53373),c=n.n(l),d=n(45250),h=n(95478),p=n(49634),u=n(39330);const f=(0,o.makeStyles)(e=>({visuallyHidden:{clip:"rect(0 0 0 0)",clipPath:"inset(50%)",overflow:"hidden",position:"absolute",userSelect:"none",whiteSpace:"nowrap",height:1,width:1},externalLink:{position:"relative"},externalLinkIcon:{verticalAlign:"bottom",marginLeft:e.spacing(.5)}}),{name:"Link"}),g=()=>{const e=(0,a.useApp)().getSystemIcon("externalLink")||u.A,t=f();return(0,r.jsx)(e,{className:t.externalLinkIcon})},v=e=>/^([a-z+.-]+):/.test(e),m=/^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i,x=window.open;if(x&&!x.__backstage){const e=function(...e){const t=String(e[0]);if(m.test(t))throw new Error("Rejected window.open() with a javascript: URL as a security precaution");return x.apply(this,e)};e.__backstage=!0,window.open=e}const y=e=>e instanceof Array?e.map(y).join(" ").trim():"object"==typeof e&&e?y(e?.props?.children):["string","number"].includes(typeof e)?String(e):"",A=(0,h.forwardRef)(({onClick:e,noTrack:t,externalLinkIcon:n,...o},l)=>{const h=f(),u=(0,a.useAnalytics)(),x=function(){const[e]=(0,p.createRoutesFromChildren)((0,r.jsx)(p.Route,{index:!0,element:(0,r.jsx)("div",{})}));return!e.index}()?(e=>{let t=String(e);const n=(()=>{const e=(()=>{try{return(0,a.useApi)(a.configApiRef).getOptionalString("app.baseUrl")}catch{return}})()??"/",{pathname:t}=new URL(e,"http://sample.dev");return(0,d.trimEnd)(t,"/")})(),r=v(t),i=t.startsWith(n);return r||i||(t=n.concat(t)),t})(o.to):o.to,A=y(o.children)||x,k=v(x),w=k&&!!/^https?:/.exec(x);if(m.test(x))throw new Error("Link component rejected javascript: URL as a security precaution");const b=n=>{e?.(n),t||u.captureEvent("click",A,{attributes:{to:x}})};return k?(0,r.jsxs)(i.A,{...w?{target:"_blank",rel:"noopener"}:{},...o,...o["aria-label"]?{"aria-label":`${o["aria-label"]}, Opens in a new window`}:{},ref:l,href:x,onClick:b,className:c()(h.externalLink,o.className),children:[o.children,n&&(0,r.jsx)(g,{}),(0,r.jsx)(s.A,{component:"span",className:h.visuallyHidden,children:", Opens in a new window"})]}):(0,r.jsx)(i.A,{...o,ref:l,component:p.Link,to:x,onClick:b})})},39053:(e,t,n)=>{var r=n(4293),a=n(78920);t.A=void 0;var i=a(n(95478)),o=(0,r(n(74044)).default)(i.createElement("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"}),"Info");t.A=o},39330:(e,t,n)=>{var r=n(4293),a=n(78920);t.A=void 0;var i=a(n(95478)),o=(0,r(n(74044)).default)(i.createElement("path",{d:"M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"}),"OpenInNew");t.A=o},52235:(e,t,n)=>{var r=n(4293),a=n(78920);t.A=void 0;var i=a(n(95478)),o=(0,r(n(74044)).default)(i.createElement("path",{d:"M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z"}),"ArrowForward");t.A=o},61524:(e,t,n)=>{var r=n(4293),a=n(78920);t.A=void 0;var i=a(n(95478)),o=(0,r(n(74044)).default)(i.createElement("path",{d:"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78l3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z"}),"VisibilityOff");t.A=o},96040:(e,t,n)=>{n.d(t,{n:()=>I});var r=n(31085),a=n(40703),i=n(59469),o=n(48653),s=n(45685),l=n(37197),c=n(37976),d=n(53373),h=n.n(d),p=n(10394),u=n(72501),f=n(52235),g=n(37725);const v=(0,c.makeStyles)(e=>({root:{maxWidth:"fit-content",padding:e.spacing(2,2,2,2.5)},boxTitle:{margin:0,color:e.palette.textSubtle},arrow:{color:e.palette.textSubtle}}),{name:"BackstageBottomLink"});function m(e){const{link:t,title:n,onClick:a}=e,i=v();return(0,r.jsxs)(p.A,{children:[(0,r.jsx)(l.A,{}),(0,r.jsx)(g.N_,{to:t,onClick:a,underline:"none",children:(0,r.jsxs)(p.A,{display:"flex",alignItems:"center",className:i.root,children:[(0,r.jsx)(p.A,{className:i.boxTitle,fontWeight:"fontWeightBold",m:1,children:(0,r.jsx)(u.A,{children:(0,r.jsx)("strong",{children:n})})}),(0,r.jsx)(f.A,{className:i.arrow})]})})]})}var x=n(95478),y=n(64947);const A=(0,x.forwardRef)((e,t)=>(0,r.jsx)(g.N_,{ref:t,...e,color:"initial"})),k=(0,x.forwardRef)((e,t)=>(0,r.jsx)(y.A,{ref:t,component:A,...e}));var w=n(34169),b=n(21006),j=n(67550);const C=e=>{const{slackChannel:t}=e,{t:n}=(0,j.i)(b.O);return t?"string"==typeof t?(0,r.jsx)(u.A,{children:n("errorBoundary.title",{slackChannel:t})}):t.href?(0,r.jsx)(k,{to:t.href,variant:"contained",children:t.name}):(0,r.jsx)(u.A,{children:n("errorBoundary.title",{slackChannel:t.name})}):null},E=class extends x.Component{constructor(e){super(e),this.state={error:void 0,errorInfo:void 0}}componentDidCatch(e,t){console.error(`ErrorBoundary, error: ${e}`,{error:e,errorInfo:t}),this.setState({error:e,errorInfo:t})}render(){const{slackChannel:e,children:t}=this.props,{error:n}=this.state;return n?(0,r.jsx)(w.b,{title:"Something Went Wrong",error:n,children:(0,r.jsx)(C,{slackChannel:e})}):t}},L=(0,c.makeStyles)(e=>({noPadding:{padding:0,"&:last-child":{paddingBottom:0}},contentAlignBottom:{display:"flex",alignItems:"self-end"},header:{padding:e.spacing(2,2,2,2.5)},headerTitle:{fontWeight:e.typography.fontWeightBold},headerSubheader:{paddingTop:e.spacing(1)},headerAvatar:{},headerAction:{},headerContent:{},subheader:{display:"flex"}}),{name:"BackstageInfoCard"}),S=(0,c.withStyles)(e=>({root:{display:"inline-block",padding:e.spacing(8,8,0,0),float:"right"}}),{name:"BackstageInfoCardCardActionsTopRight"})(i.A),N={card:{flex:{display:"flex",flexDirection:"column"},fullHeight:{display:"flex",flexDirection:"column",height:"100%"},gridItem:{display:"flex",flexDirection:"column",height:"calc(100% - 10px)",marginBottom:"10px",breakInside:"avoid-page","@media print":{height:"auto"}}},cardContent:{fullHeight:{flex:1},gridItem:{flex:1}}};function I(e){const{title:t,subheader:n,divider:c=!0,deepLink:d,slackChannel:p,errorBoundaryProps:u,variant:f,alignContent:g="normal",children:v,headerStyle:x,headerProps:y,icon:A,action:k,actionsClassName:w,actions:b,cardClassName:j,actionsTopRight:C,className:I,noPadding:_,titleTypographyProps:z,subheaderTypographyProps:B}=e,R=L();let T={},V={};f&&f.split(/[\s]+/g).forEach(e=>{T={...T,...N.card[e]},V={...V,...N.cardContent[e]}});const M=u||(p?{slackChannel:p}:{});return(0,r.jsx)(a.A,{style:T,className:I,children:(0,r.jsxs)(E,{...M,children:[t&&(0,r.jsx)(s.A,{classes:{root:h()(R.header),title:R.headerTitle,subheader:R.headerSubheader,avatar:R.headerAvatar,action:R.headerAction,content:R.headerContent},title:t,subheader:n||A?(0,r.jsxs)("div",{"data-testid":"info-card-subheader",children:[n&&(0,r.jsx)("div",{className:R.subheader,children:n}),A]}):null,action:k,style:{...x},titleTypographyProps:z,subheaderTypographyProps:B,...y}),C&&(0,r.jsx)(S,{children:C}),c&&(0,r.jsx)(l.A,{}),(0,r.jsx)(o.A,{className:h()(j,{[R.noPadding]:_,[R.contentAlignBottom]:"bottom"===g}),style:V,children:v}),b&&(0,r.jsx)(i.A,{className:w,children:b}),d&&(0,r.jsx)(m,{...d})]})})}}}]);
2
+ //# sourceMappingURL=438.4335b833.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static/438.4335b833.chunk.js","mappings":"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","sources":["webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/Add.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-catalog-react/dist/hooks/useEntity.esm.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/Visibility.js","webpack://internal.plugin-kuadrant/../../node_modules/react-use/esm/useAsync.js","webpack://internal.plugin-kuadrant/../../node_modules/react-use/esm/useAsyncFn.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/core-components/dist/components/Link/Link.esm.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/Info.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/OpenInNew.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/ArrowForward.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/VisibilityOff.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/core-components/dist/layout/BottomLink/BottomLink.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/core-components/dist/components/LinkButton/LinkButton.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/core-components/dist/layout/ErrorBoundary/ErrorBoundary.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/core-components/dist/layout/InfoCard/InfoCard.esm.js"],"sourcesContent":["\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"\n}), 'Add');\n\nexports.default = _default;","import { jsx } from 'react/jsx-runtime';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { AnalyticsContext } from '@backstage/core-plugin-api';\nimport { createVersionedContext, useVersionedContext, createVersionedValueMap } from '@backstage/version-bridge';\n\nconst NewEntityContext = createVersionedContext(\n \"entity-context\"\n);\nconst AsyncEntityProvider = (props) => {\n const { children, entity, loading, error, refresh } = props;\n const value = { entity, loading, error, refresh };\n return /* @__PURE__ */ jsx(NewEntityContext.Provider, { value: createVersionedValueMap({ 1: value }), children: /* @__PURE__ */ jsx(\n AnalyticsContext,\n {\n attributes: {\n ...entity ? { entityRef: stringifyEntityRef(entity) } : void 0\n },\n children\n }\n ) });\n};\nconst EntityProvider = (props) => /* @__PURE__ */ jsx(\n AsyncEntityProvider,\n {\n entity: props.entity,\n loading: !Boolean(props.entity),\n error: void 0,\n refresh: void 0,\n children: props.children\n }\n);\nfunction useEntity() {\n const versionedHolder = useVersionedContext(\n \"entity-context\"\n );\n if (!versionedHolder) {\n throw new Error(\"Entity context is not available\");\n }\n const value = versionedHolder.atVersion(1);\n if (!value) {\n throw new Error(\"EntityContext v1 not available\");\n }\n if (!value.entity) {\n throw new Error(\n \"useEntity hook is being called outside of an EntityLayout where the entity has not been loaded. If this is intentional, please use useAsyncEntity instead.\"\n );\n }\n return { entity: value.entity };\n}\nfunction useAsyncEntity() {\n const versionedHolder = useVersionedContext(\n \"entity-context\"\n );\n if (!versionedHolder) {\n throw new Error(\"Entity context is not available\");\n }\n const value = versionedHolder.atVersion(1);\n if (!value) {\n throw new Error(\"EntityContext v1 not available\");\n }\n const { entity, loading, error, refresh } = value;\n return { entity, loading, error, refresh };\n}\n\nexport { AsyncEntityProvider, EntityProvider, useAsyncEntity, useEntity };\n//# sourceMappingURL=useEntity.esm.js.map\n","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z\"\n}), 'Visibility');\n\nexports.default = _default;","import { useEffect } from 'react';\nimport useAsyncFn from './useAsyncFn';\nexport default function useAsync(fn, deps) {\n if (deps === void 0) { deps = []; }\n var _a = useAsyncFn(fn, deps, {\n loading: true,\n }), state = _a[0], callback = _a[1];\n useEffect(function () {\n callback();\n }, [callback]);\n return state;\n}\n","import { __assign } from \"tslib\";\nimport { useCallback, useRef, useState } from 'react';\nimport useMountedState from './useMountedState';\nexport default function useAsyncFn(fn, deps, initialState) {\n if (deps === void 0) { deps = []; }\n if (initialState === void 0) { initialState = { loading: false }; }\n var lastCallId = useRef(0);\n var isMounted = useMountedState();\n var _a = useState(initialState), state = _a[0], set = _a[1];\n var callback = useCallback(function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var callId = ++lastCallId.current;\n if (!state.loading) {\n set(function (prevState) { return (__assign(__assign({}, prevState), { loading: true })); });\n }\n return fn.apply(void 0, args).then(function (value) {\n isMounted() && callId === lastCallId.current && set({ value: value, loading: false });\n return value;\n }, function (error) {\n isMounted() && callId === lastCallId.current && set({ error: error, loading: false });\n return error;\n });\n }, deps);\n return [state, callback];\n}\n","import { jsxs, jsx } from 'react/jsx-runtime';\nimport { useAnalytics, useApp, useApi, configApiRef } from '@backstage/core-plugin-api';\nimport MaterialLink from '@material-ui/core/Link';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport classNames from 'classnames';\nimport { trimEnd } from 'lodash';\nimport { forwardRef } from 'react';\nimport { Link as Link$1, createRoutesFromChildren, Route } from 'react-router-dom';\nimport OpenInNew from '@material-ui/icons/OpenInNew';\n\nfunction isReactRouterBeta() {\n const [obj] = createRoutesFromChildren(/* @__PURE__ */ jsx(Route, { index: true, element: /* @__PURE__ */ jsx(\"div\", {}) }));\n return !obj.index;\n}\nconst useStyles = makeStyles(\n (theme) => ({\n visuallyHidden: {\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n overflow: \"hidden\",\n position: \"absolute\",\n userSelect: \"none\",\n whiteSpace: \"nowrap\",\n height: 1,\n width: 1\n },\n externalLink: {\n position: \"relative\"\n },\n externalLinkIcon: {\n verticalAlign: \"bottom\",\n marginLeft: theme.spacing(0.5)\n }\n }),\n { name: \"Link\" }\n);\nconst ExternalLinkIcon = () => {\n const app = useApp();\n const Icon = app.getSystemIcon(\"externalLink\") || OpenInNew;\n const classes = useStyles();\n return /* @__PURE__ */ jsx(Icon, { className: classes.externalLinkIcon });\n};\nconst isExternalUri = (uri) => /^([a-z+.-]+):/.test(uri);\nconst scriptProtocolPattern = (\n // eslint-disable-next-line no-control-regex\n /^[\\u0000-\\u001F ]*j[\\r\\n\\t]*a[\\r\\n\\t]*v[\\r\\n\\t]*a[\\r\\n\\t]*s[\\r\\n\\t]*c[\\r\\n\\t]*r[\\r\\n\\t]*i[\\r\\n\\t]*p[\\r\\n\\t]*t[\\r\\n\\t]*\\:/i\n);\nconst originalWindowOpen = window.open;\nif (originalWindowOpen && !originalWindowOpen.__backstage) {\n const newOpen = function open(...args) {\n const url = String(args[0]);\n if (scriptProtocolPattern.test(url)) {\n throw new Error(\n \"Rejected window.open() with a javascript: URL as a security precaution\"\n );\n }\n return originalWindowOpen.apply(this, args);\n };\n newOpen.__backstage = true;\n window.open = newOpen;\n}\nconst useBaseUrl = () => {\n try {\n const config = useApi(configApiRef);\n return config.getOptionalString(\"app.baseUrl\");\n } catch {\n return void 0;\n }\n};\nconst useBasePath = () => {\n const base = \"http://sample.dev\";\n const url = useBaseUrl() ?? \"/\";\n const { pathname } = new URL(url, base);\n return trimEnd(pathname, \"/\");\n};\nconst useResolvedPath = (uri) => {\n let resolvedPath = String(uri);\n const basePath = useBasePath();\n const external = isExternalUri(resolvedPath);\n const startsWithBasePath = resolvedPath.startsWith(basePath);\n if (!external && !startsWithBasePath) {\n resolvedPath = basePath.concat(resolvedPath);\n }\n return resolvedPath;\n};\nconst getNodeText = (node) => {\n if (node instanceof Array) {\n return node.map(getNodeText).join(\" \").trim();\n }\n if (typeof node === \"object\" && node) {\n return getNodeText(node?.props?.children);\n }\n if ([\"string\", \"number\"].includes(typeof node)) {\n return String(node);\n }\n return \"\";\n};\nconst Link = forwardRef(\n ({ onClick, noTrack, externalLinkIcon, ...props }, ref) => {\n const classes = useStyles();\n const analytics = useAnalytics();\n const to = isReactRouterBeta() ? useResolvedPath(props.to) : props.to;\n const linkText = getNodeText(props.children) || to;\n const external = isExternalUri(to);\n const newWindow = external && !!/^https?:/.exec(to);\n if (scriptProtocolPattern.test(to)) {\n throw new Error(\n \"Link component rejected javascript: URL as a security precaution\"\n );\n }\n const handleClick = (event) => {\n onClick?.(event);\n if (!noTrack) {\n analytics.captureEvent(\"click\", linkText, { attributes: { to } });\n }\n };\n return external ? (\n // External links\n /* @__PURE__ */ jsxs(\n MaterialLink,\n {\n ...newWindow ? { target: \"_blank\", rel: \"noopener\" } : {},\n ...props,\n ...props[\"aria-label\"] ? { \"aria-label\": `${props[\"aria-label\"]}, Opens in a new window` } : {},\n ref,\n href: to,\n onClick: handleClick,\n className: classNames(classes.externalLink, props.className),\n children: [\n props.children,\n externalLinkIcon && /* @__PURE__ */ jsx(ExternalLinkIcon, {}),\n /* @__PURE__ */ jsx(Typography, { component: \"span\", className: classes.visuallyHidden, children: \", Opens in a new window\" })\n ]\n }\n )\n ) : (\n // Interact with React Router for internal links\n /* @__PURE__ */ jsx(\n MaterialLink,\n {\n ...props,\n ref,\n component: Link$1,\n to,\n onClick: handleClick\n }\n )\n );\n }\n);\n\nexport { Link, isExternalUri, isReactRouterBeta, useResolvedPath };\n//# sourceMappingURL=Link.esm.js.map\n","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z\"\n}), 'Info');\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: \"M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z\"\n}), 'OpenInNew');\n\nexports.default = _default;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z\"\n}), 'ArrowForward');\n\nexports.default = _default;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78l3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z\"\n}), 'VisibilityOff');\n\nexports.default = _default;","import { jsxs, jsx } from 'react/jsx-runtime';\nimport Box from '@material-ui/core/Box';\nimport Divider from '@material-ui/core/Divider';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport ArrowIcon from '@material-ui/icons/ArrowForward';\nimport { Link } from '../../components/Link/Link.esm.js';\n\nconst useStyles = makeStyles(\n (theme) => ({\n root: {\n maxWidth: \"fit-content\",\n padding: theme.spacing(2, 2, 2, 2.5)\n },\n boxTitle: {\n margin: 0,\n color: theme.palette.textSubtle\n },\n arrow: {\n color: theme.palette.textSubtle\n }\n }),\n { name: \"BackstageBottomLink\" }\n);\nfunction BottomLink(props) {\n const { link, title, onClick } = props;\n const classes = useStyles();\n return /* @__PURE__ */ jsxs(Box, { children: [\n /* @__PURE__ */ jsx(Divider, {}),\n /* @__PURE__ */ jsx(Link, { to: link, onClick, underline: \"none\", children: /* @__PURE__ */ jsxs(Box, { display: \"flex\", alignItems: \"center\", className: classes.root, children: [\n /* @__PURE__ */ jsx(Box, { className: classes.boxTitle, fontWeight: \"fontWeightBold\", m: 1, children: /* @__PURE__ */ jsx(Typography, { children: /* @__PURE__ */ jsx(\"strong\", { children: title }) }) }),\n /* @__PURE__ */ jsx(ArrowIcon, { className: classes.arrow })\n ] }) })\n ] });\n}\n\nexport { BottomLink };\n//# sourceMappingURL=BottomLink.esm.js.map\n","import { jsx } from 'react/jsx-runtime';\nimport Button$1 from '@material-ui/core/Button';\nimport { forwardRef } from 'react';\nimport { Link } from '../Link/Link.esm.js';\n\nconst LinkWrapper = forwardRef((props, ref) => /* @__PURE__ */ jsx(Link, { ref, ...props, color: \"initial\" }));\nconst LinkButton = forwardRef((props, ref) => /* @__PURE__ */ jsx(Button$1, { ref, component: LinkWrapper, ...props }));\nconst Button = LinkButton;\n\nexport { Button, LinkButton };\n//# sourceMappingURL=LinkButton.esm.js.map\n","import { jsx } from 'react/jsx-runtime';\nimport Typography from '@material-ui/core/Typography';\nimport { Component } from 'react';\nimport { LinkButton } from '../../components/LinkButton/LinkButton.esm.js';\nimport { ErrorPanel } from '../../components/ErrorPanel/ErrorPanel.esm.js';\nimport { coreComponentsTranslationRef } from '../../translation.esm.js';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\nconst SlackLink = (props) => {\n const { slackChannel } = props;\n const { t } = useTranslationRef(coreComponentsTranslationRef);\n if (!slackChannel) {\n return null;\n } else if (typeof slackChannel === \"string\") {\n return /* @__PURE__ */ jsx(Typography, { children: t(\"errorBoundary.title\", { slackChannel }) });\n } else if (!slackChannel.href) {\n return /* @__PURE__ */ jsx(Typography, { children: t(\"errorBoundary.title\", {\n slackChannel: slackChannel.name\n }) });\n }\n return /* @__PURE__ */ jsx(LinkButton, { to: slackChannel.href, variant: \"contained\", children: slackChannel.name });\n};\nconst ErrorBoundary = class ErrorBoundary2 extends Component {\n constructor(props) {\n super(props);\n this.state = {\n error: void 0,\n errorInfo: void 0\n };\n }\n componentDidCatch(error, errorInfo) {\n console.error(`ErrorBoundary, error: ${error}`, { error, errorInfo });\n this.setState({ error, errorInfo });\n }\n render() {\n const { slackChannel, children } = this.props;\n const { error } = this.state;\n if (!error) {\n return children;\n }\n return /* @__PURE__ */ jsx(ErrorPanel, { title: \"Something Went Wrong\", error, children: /* @__PURE__ */ jsx(SlackLink, { slackChannel }) });\n }\n};\n\nexport { ErrorBoundary };\n//# sourceMappingURL=ErrorBoundary.esm.js.map\n","import { jsx, jsxs } from 'react/jsx-runtime';\nimport Card from '@material-ui/core/Card';\nimport CardActions from '@material-ui/core/CardActions';\nimport CardContent from '@material-ui/core/CardContent';\nimport CardHeader from '@material-ui/core/CardHeader';\nimport Divider from '@material-ui/core/Divider';\nimport { makeStyles, withStyles } from '@material-ui/core/styles';\nimport classNames from 'classnames';\nimport { BottomLink } from '../BottomLink/BottomLink.esm.js';\nimport { ErrorBoundary } from '../ErrorBoundary/ErrorBoundary.esm.js';\n\nconst useStyles = makeStyles(\n (theme) => ({\n noPadding: {\n padding: 0,\n \"&:last-child\": {\n paddingBottom: 0\n }\n },\n contentAlignBottom: {\n display: \"flex\",\n alignItems: \"self-end\"\n },\n header: {\n padding: theme.spacing(2, 2, 2, 2.5)\n },\n headerTitle: {\n fontWeight: theme.typography.fontWeightBold\n },\n headerSubheader: {\n paddingTop: theme.spacing(1)\n },\n headerAvatar: {},\n headerAction: {},\n headerContent: {},\n subheader: {\n display: \"flex\"\n }\n }),\n { name: \"BackstageInfoCard\" }\n);\nconst CardActionsTopRight = withStyles(\n (theme) => ({\n root: {\n display: \"inline-block\",\n padding: theme.spacing(8, 8, 0, 0),\n float: \"right\"\n }\n }),\n { name: \"BackstageInfoCardCardActionsTopRight\" }\n)(CardActions);\nconst VARIANT_STYLES = {\n card: {\n flex: {\n display: \"flex\",\n flexDirection: \"column\"\n },\n fullHeight: {\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\"\n },\n gridItem: {\n display: \"flex\",\n flexDirection: \"column\",\n height: \"calc(100% - 10px)\",\n // for pages without content header\n marginBottom: \"10px\",\n breakInside: \"avoid-page\",\n \"@media print\": {\n height: \"auto\"\n }\n }\n },\n cardContent: {\n fullHeight: {\n flex: 1\n },\n gridItem: {\n flex: 1\n }\n }\n};\nfunction InfoCard(props) {\n const {\n title,\n subheader,\n divider = true,\n deepLink,\n slackChannel,\n errorBoundaryProps,\n variant,\n alignContent = \"normal\",\n children,\n headerStyle,\n headerProps,\n icon,\n action,\n actionsClassName,\n actions,\n cardClassName,\n actionsTopRight,\n className,\n noPadding,\n titleTypographyProps,\n subheaderTypographyProps\n } = props;\n const classes = useStyles();\n let calculatedStyle = {};\n let calculatedCardStyle = {};\n if (variant) {\n const variants = variant.split(/[\\s]+/g);\n variants.forEach((name) => {\n calculatedStyle = {\n ...calculatedStyle,\n ...VARIANT_STYLES.card[name]\n };\n calculatedCardStyle = {\n ...calculatedCardStyle,\n ...VARIANT_STYLES.cardContent[name]\n };\n });\n }\n const cardSubTitle = () => {\n if (!subheader && !icon) {\n return null;\n }\n return /* @__PURE__ */ jsxs(\"div\", { \"data-testid\": \"info-card-subheader\", children: [\n subheader && /* @__PURE__ */ jsx(\"div\", { className: classes.subheader, children: subheader }),\n icon\n ] });\n };\n const errProps = errorBoundaryProps || (slackChannel ? { slackChannel } : {});\n return /* @__PURE__ */ jsx(Card, { style: calculatedStyle, className, children: /* @__PURE__ */ jsxs(ErrorBoundary, { ...errProps, children: [\n title && /* @__PURE__ */ jsx(\n CardHeader,\n {\n classes: {\n root: classNames(classes.header),\n title: classes.headerTitle,\n subheader: classes.headerSubheader,\n avatar: classes.headerAvatar,\n action: classes.headerAction,\n content: classes.headerContent\n },\n title,\n subheader: cardSubTitle(),\n action,\n style: { ...headerStyle },\n titleTypographyProps,\n subheaderTypographyProps,\n ...headerProps\n }\n ),\n actionsTopRight && /* @__PURE__ */ jsx(CardActionsTopRight, { children: actionsTopRight }),\n divider && /* @__PURE__ */ jsx(Divider, {}),\n /* @__PURE__ */ jsx(\n CardContent,\n {\n className: classNames(cardClassName, {\n [classes.noPadding]: noPadding,\n [classes.contentAlignBottom]: alignContent === \"bottom\"\n }),\n style: calculatedCardStyle,\n children\n }\n ),\n actions && /* @__PURE__ */ jsx(CardActions, { className: actionsClassName, children: actions }),\n deepLink && /* @__PURE__ */ jsx(BottomLink, { ...deepLink })\n ] }) });\n}\n\nexport { InfoCard };\n//# sourceMappingURL=InfoCard.esm.js.map\n"],"names":["_interopRequireDefault","_interopRequireWildcard","exports","React","_default","default","createElement","d","useEntity","versionedHolder","useVersionedContext","Error","value","atVersion","entity","createVersionedContext","useAsync","fn","deps","_a","initialState","loading","lastCallId","useRef","isMounted","useMountedState","useState","state","set","callback","useCallback","args","_i","arguments","length","callId","current","prevState","__assign","apply","then","error","useAsyncFn","useEffect","useStyles","makeStyles","theme","visuallyHidden","clip","clipPath","overflow","position","userSelect","whiteSpace","height","width","externalLink","externalLinkIcon","verticalAlign","marginLeft","spacing","name","ExternalLinkIcon","Icon","useApp","getSystemIcon","classes","jsx","className","isExternalUri","uri","test","scriptProtocolPattern","originalWindowOpen","window","open","__backstage","newOpen","url","String","this","getNodeText","node","Array","map","join","trim","props","children","includes","Link","forwardRef","onClick","noTrack","ref","analytics","useAnalytics","to","obj","createRoutesFromChildren","Route","index","element","isReactRouterBeta","resolvedPath","basePath","useApi","configApiRef","getOptionalString","useBaseUrl","pathname","URL","trimEnd","useBasePath","external","startsWithBasePath","startsWith","concat","useResolvedPath","linkText","newWindow","exec","handleClick","event","captureEvent","attributes","jsxs","target","rel","href","component","root","maxWidth","padding","boxTitle","margin","color","palette","textSubtle","arrow","BottomLink","link","title","Box","Divider","underline","display","alignItems","fontWeight","m","Typography","A","LinkWrapper","LinkButton","Button","SlackLink","slackChannel","t","variant","ErrorBoundary","Component","constructor","super","errorInfo","componentDidCatch","console","setState","render","noPadding","paddingBottom","contentAlignBottom","header","headerTitle","typography","fontWeightBold","headerSubheader","paddingTop","headerAvatar","headerAction","headerContent","subheader","CardActionsTopRight","withStyles","float","CardActions","VARIANT_STYLES","card","flex","flexDirection","fullHeight","gridItem","marginBottom","breakInside","cardContent","InfoCard","divider","deepLink","errorBoundaryProps","alignContent","headerStyle","headerProps","icon","action","actionsClassName","actions","cardClassName","actionsTopRight","titleTypographyProps","subheaderTypographyProps","calculatedStyle","calculatedCardStyle","split","forEach","errProps","Card","style","CardHeader","avatar","content","CardContent"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[4908],{34541:(t,n,i)=>{i.d(n,{G:()=>P});var e=i(31085),o=(i(95478),i(25467)),r=i(22097),a=i(42367),s=i(96040),l=i(72501),d=i(10394),u=i(58837),c=i(4387),h=i(91638),A=i(46205),v=i(34955),p=i(89509),m=i(71255),x=i(70980);const j=(0,u.A)(t=>({label:{fontWeight:600,color:t.palette.text.secondary,marginBottom:t.spacing(.5),fontSize:"0.75rem",textTransform:"uppercase"}})),P=()=>{var t,n,i,u,P,f,I,y,w,g;const k=j(),{entity:b}=(0,o.tN)(),N=(0,r.useApi)(x.s),O=(0,r.useApi)(r.identityApiRef),{allowed:S,loading:_}=(0,A.l)(v.Al),C=null===(t=b.metadata.annotations)||void 0===t?void 0:t["kuadrant.io/namespace"],B=null===(n=b.metadata.annotations)||void 0===n?void 0:n["kuadrant.io/apiproduct"],{value:E}=(0,h.A)(async()=>(await O.getBackstageIdentity()).userEntityRef.split("/")[1]||"guest",[O]),{value:D,loading:G,error:R}=(0,h.A)(async()=>C&&B?N.getApiProduct(C,B):null,[N,C,B]),U=null==D||null===(u=D.metadata)||void 0===u||null===(i=u.annotations)||void 0===i?void 0:i["backstage.io/owner"],Y=null==U?void 0:U.split("/")[1],z=S||E&&Y===E;if(!C||!B)return(0,e.jsx)(s.n,{title:"API Product Information",children:(0,e.jsx)(l.A,{children:"No APIProduct linked to this API entity"})});if(G||_)return(0,e.jsx)(s.n,{title:"API Product Information",children:(0,e.jsx)(d.A,{p:2,children:[...Array(5)].map((t,n)=>(0,e.jsx)(d.A,{mb:2,children:(0,e.jsx)(c.A,{variant:"text",width:"100%"})},n))})});if(D&&!z)return(0,e.jsx)(s.n,{title:"API Product Information",children:(0,e.jsx)(d.A,{p:2,children:(0,e.jsx)(l.A,{variant:"body2",color:"textSecondary",children:"You don't have permission to view this API product's details. Only the API owner or users with admin permissions can view this information."})})});if(R&&R.message.includes("you can only read your own"))return(0,e.jsx)(s.n,{title:"API Product Information",children:(0,e.jsx)(d.A,{p:2,children:(0,e.jsx)(l.A,{variant:"body2",color:"textSecondary",children:"You don't have permission to view this API product's details. Only the API owner or users with admin permissions can view this information."})})});if(R)return(0,e.jsx)(s.n,{title:"API Product Information",children:(0,e.jsx)(a._,{error:R})});if(!D)return(0,e.jsx)(s.n,{title:"API Product Information",children:(0,e.jsx)(l.A,{children:"APIProduct not found"})});const F=(null===(f=D.status)||void 0===f||null===(P=f.discoveredAuthScheme)||void 0===P?void 0:P.authentication)||{},L=Object.values(F).find(t=>t.hasOwnProperty("jwt")),T=Boolean(L),W=null==L||null===(I=L.jwt)||void 0===I?void 0:I.issuerUrl,q=null===(w=D.status)||void 0===w||null===(y=w.oidcDiscovery)||void 0===y?void 0:y.tokenEndpoint;return(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)(s.n,{title:"API Product Details",children:[(0,e.jsxs)(d.A,{mb:2,children:[(0,e.jsx)(l.A,{variant:"caption",className:k.label,children:"Product Name"}),(0,e.jsx)(l.A,{variant:"h6",children:(null===(g=D.spec)||void 0===g?void 0:g.displayName)||B})]}),(0,e.jsx)(p.O,{product:D,showStatus:!1,showCatalogLink:!1})]}),T&&W&&(0,e.jsx)(d.A,{mt:2,children:(0,e.jsx)(m.n,{issuerUrl:W,tokenEndpoint:q})})]})}},34908:(t,n,i)=>{i.r(n),i.d(n,{ApiProductInfoCard:()=>e.G});var e=i(34541)}}]);
2
+ //# sourceMappingURL=4908.4f21d453.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static/4908.4f21d453.chunk.js","mappings":"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","sources":["webpack://internal.plugin-kuadrant/./src/components/ApiProductInfoCard/ApiProductInfoCard.tsx"],"sourcesContent":["import React from 'react';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { useApi, identityApiRef } from '@backstage/core-plugin-api';\nimport { InfoCard, ResponseErrorPanel } from '@backstage/core-components';\nimport { Typography, Box, makeStyles } from '@material-ui/core';\nimport { Skeleton } from '@material-ui/lab';\nimport useAsync from 'react-use/lib/useAsync';\nimport { useKuadrantPermission } from '../../utils/permissions';\nimport { kuadrantApiProductReadAllPermission } from '../../permissions';\nimport { ApiProductDetails } from '../ApiProductDetails';\nimport { OidcProviderCard } from '../OidcProviderCard';\nimport { kuadrantApiRef } from '../../api';\n\nconst useStyles = makeStyles((theme) => ({\n label: {\n fontWeight: 600,\n color: theme.palette.text.secondary,\n marginBottom: theme.spacing(0.5),\n fontSize: '0.75rem',\n textTransform: 'uppercase',\n },\n}));\n\nexport const ApiProductInfoCard = () => {\n const classes = useStyles();\n const { entity } = useEntity();\n const kuadrantApi = useApi(kuadrantApiRef);\n const identityApi = useApi(identityApiRef);\n\n const { allowed: canReadAll, loading: permLoading } = useKuadrantPermission(\n kuadrantApiProductReadAllPermission\n );\n\n const namespace = entity.metadata.annotations?.['kuadrant.io/namespace'];\n const apiProductName = entity.metadata.annotations?.['kuadrant.io/apiproduct'];\n\n const { value: currentUserId } = useAsync(async () => {\n const identity = await identityApi.getBackstageIdentity();\n return identity.userEntityRef.split('/')[1] || 'guest';\n }, [identityApi]);\n\n const { value: apiProduct, loading, error } = useAsync(async () => {\n if (!namespace || !apiProductName) {\n return null;\n }\n\n return kuadrantApi.getApiProduct(namespace, apiProductName);\n }, [kuadrantApi, namespace, apiProductName]);\n\n // check if user has permission to view this api product\n const owner = apiProduct?.metadata?.annotations?.['backstage.io/owner'];\n const ownerUserId = owner?.split('/')[1];\n const canView = canReadAll || (currentUserId && ownerUserId === currentUserId);\n\n if (!namespace || !apiProductName) {\n return (\n <InfoCard title=\"API Product Information\">\n <Typography>No APIProduct linked to this API entity</Typography>\n </InfoCard>\n );\n }\n\n if (loading || permLoading) {\n return (\n <InfoCard title=\"API Product Information\">\n <Box p={2}>\n {[...Array(5)].map((_, i) => (\n <Box key={i} mb={2}>\n <Skeleton variant=\"text\" width=\"100%\" />\n </Box>\n ))}\n </Box>\n </InfoCard>\n );\n }\n\n // show permission message if user doesn't have permission\n if (apiProduct && !canView) {\n return (\n <InfoCard title=\"API Product Information\">\n <Box p={2}>\n <Typography variant=\"body2\" color=\"textSecondary\">\n You don't have permission to view this API product's details. Only the API owner or users with admin permissions can view this information.\n </Typography>\n </Box>\n </InfoCard>\n );\n }\n\n // also show permission message if we got a permission error from the backend\n if (error && error.message.includes('you can only read your own')) {\n return (\n <InfoCard title=\"API Product Information\">\n <Box p={2}>\n <Typography variant=\"body2\" color=\"textSecondary\">\n You don't have permission to view this API product's details. Only the API owner or users with admin permissions can view this information.\n </Typography>\n </Box>\n </InfoCard>\n );\n }\n\n if (error) {\n return (\n <InfoCard title=\"API Product Information\">\n <ResponseErrorPanel error={error} />\n </InfoCard>\n );\n }\n\n if (!apiProduct) {\n return (\n <InfoCard title=\"API Product Information\">\n <Typography>APIProduct not found</Typography>\n </InfoCard>\n );\n }\n\n // check for OIDC auth scheme\n const authSchemes = apiProduct.status?.discoveredAuthScheme?.authentication || {};\n const schemeObjects = Object.values(authSchemes);\n const jwtScheme = schemeObjects.find((scheme: any) => scheme.hasOwnProperty('jwt'));\n const hasOidc = Boolean(jwtScheme);\n const jwtIssuer = (jwtScheme as any)?.jwt?.issuerUrl;\n const jwtTokenEndpoint = apiProduct.status?.oidcDiscovery?.tokenEndpoint;\n\n return (\n <>\n <InfoCard title=\"API Product Details\">\n <Box mb={2}>\n <Typography variant=\"caption\" className={classes.label}>\n Product Name\n </Typography>\n <Typography variant=\"h6\">\n {apiProduct.spec?.displayName || apiProductName}\n </Typography>\n </Box>\n <ApiProductDetails\n product={apiProduct}\n showStatus={false}\n showCatalogLink={false}\n />\n </InfoCard>\n {hasOidc && jwtIssuer && (\n <Box mt={2}>\n <OidcProviderCard\n issuerUrl={jwtIssuer}\n tokenEndpoint={jwtTokenEndpoint}\n />\n </Box>\n )}\n </>\n );\n};\n"],"names":["useStyles","makeStyles","theme","label","fontWeight","color","palette","text","secondary","marginBottom","spacing","fontSize","textTransform","ApiProductInfoCard","entity","apiProduct","classes","useEntity","kuadrantApi","useApi","kuadrantApiRef","identityApi","identityApiRef","allowed","canReadAll","loading","permLoading","useKuadrantPermission","kuadrantApiProductReadAllPermission","namespace","metadata","annotations","apiProductName","value","currentUserId","useAsync","async","getBackstageIdentity","userEntityRef","split","error","getApiProduct","owner","ownerUserId","canView","InfoCard","title","Typography","Box","p","Array","map","_","i","mb","Skeleton","variant","width","message","includes","ResponseErrorPanel","authSchemes","status","discoveredAuthScheme","authentication","jwtScheme","Object","values","find","scheme","hasOwnProperty","hasOidc","Boolean","jwtIssuer","jwt","issuerUrl","jwtTokenEndpoint","oidcDiscovery","tokenEndpoint","className","spec","displayName","ApiProductDetails","product","showStatus","showCatalogLink","mt","OidcProviderCard"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[5197],{4313:(e,n,t)=>{t.d(n,{A:()=>b});var o=t(39850),r=t(89575),i=t(95478),a=t(40484),c=t(11942),l=t(76446),u=t(41883),s=t(37260),d=t(19878),f=t(70020),p=t(26931),h=t(22702),v=t(64927),m={root:{zIndex:-1,position:"fixed",right:0,bottom:0,top:0,left:0,backgroundColor:"rgba(0, 0, 0, 0.5)",WebkitTapHighlightColor:"transparent"},invisible:{backgroundColor:"transparent"}};const g=i.forwardRef(function(e,n){var t=e.invisible,a=void 0!==t&&t,c=e.open,l=(0,o.A)(e,["invisible","open"]);return c?i.createElement("div",(0,r.A)({"aria-hidden":!0,ref:n},l,{style:(0,r.A)({},m.root,a?m.invisible:{},l.style)})):null});var E=new h.A;const b=i.forwardRef(function(e,n){var t=(0,c.useTheme)(),m=(0,c.getThemeProps)({name:"MuiModal",props:(0,r.A)({},e),theme:t}),b=m.BackdropComponent,y=void 0===b?g:b,A=m.BackdropProps,k=m.children,x=m.closeAfterTransition,w=void 0!==x&&x,R=m.container,C=m.disableAutoFocus,P=void 0!==C&&C,T=m.disableBackdropClick,O=void 0!==T&&T,z=m.disableEnforceFocus,I=void 0!==z&&z,M=m.disableEscapeKeyDown,N=void 0!==M&&M,F=m.disablePortal,S=void 0!==F&&F,D=m.disableRestoreFocus,L=void 0!==D&&D,B=m.disableScrollLock,H=void 0!==B&&B,W=m.hideBackdrop,K=void 0!==W&&W,_=m.keepMounted,Y=void 0!==_&&_,j=m.manager,q=void 0===j?E:j,X=m.onBackdropClick,G=m.onClose,J=m.onEscapeKeyDown,Q=m.onRendered,U=m.open,V=(0,o.A)(m,["BackdropComponent","BackdropProps","children","closeAfterTransition","container","disableAutoFocus","disableBackdropClick","disableEnforceFocus","disableEscapeKeyDown","disablePortal","disableRestoreFocus","disableScrollLock","hideBackdrop","keepMounted","manager","onBackdropClick","onClose","onEscapeKeyDown","onRendered","open"]),Z=i.useState(!0),$=Z[0],ee=Z[1],ne=i.useRef({}),te=i.useRef(null),oe=i.useRef(null),re=(0,d.A)(oe,n),ie=function(e){return!!e.children&&e.children.props.hasOwnProperty("in")}(m),ae=function(){return(0,l.A)(te.current)},ce=function(){return ne.current.modalRef=oe.current,ne.current.mountNode=te.current,ne.current},le=function(){q.mount(ce(),{disableScrollLock:H}),oe.current.scrollTop=0},ue=(0,f.A)(function(){var e=function(e){return e="function"==typeof e?e():e,a.findDOMNode(e)}(R)||ae().body;q.add(ce(),e),oe.current&&le()}),se=i.useCallback(function(){return q.isTopModal(ce())},[q]),de=(0,f.A)(function(e){te.current=e,e&&(Q&&Q(),U&&se()?le():(0,h.M)(oe.current,!0))}),fe=i.useCallback(function(){q.remove(ce())},[q]);if(i.useEffect(function(){return function(){fe()}},[fe]),i.useEffect(function(){U?ue():ie&&w||fe()},[U,fe,ie,w,ue]),!Y&&!U&&(!ie||$))return null;var pe=function(e){return{root:{position:"fixed",zIndex:e.zIndex.modal,right:0,bottom:0,top:0,left:0},hidden:{visibility:"hidden"}}}(t||{zIndex:p.A}),he={};return void 0===k.props.tabIndex&&(he.tabIndex=k.props.tabIndex||"-1"),ie&&(he.onEnter=(0,s.A)(function(){ee(!1)},k.props.onEnter),he.onExited=(0,s.A)(function(){ee(!0),w&&fe()},k.props.onExited)),i.createElement(u.A,{ref:de,container:R,disablePortal:S},i.createElement("div",(0,r.A)({ref:re,onKeyDown:function(e){"Escape"===e.key&&se()&&(J&&J(e),N||(e.stopPropagation(),G&&G(e,"escapeKeyDown")))},role:"presentation"},V,{style:(0,r.A)({},pe.root,!U&&$?pe.hidden:{},V.style)}),K?null:i.createElement(y,(0,r.A)({open:U,onClick:function(e){e.target===e.currentTarget&&(X&&X(e),!O&&G&&G(e,"backdropClick"))}},A)),i.createElement(v.A,{disableEnforceFocus:I,disableAutoFocus:P,disableRestoreFocus:L,getDoc:ae,isEnabled:se,open:U},i.cloneElement(k,he))))})},18977:(e,n,t)=>{function o(){var e=document.createElement("div");e.style.width="99px",e.style.height="99px",e.style.position="absolute",e.style.top="-9999px",e.style.overflow="scroll",document.body.appendChild(e);var n=e.offsetWidth-e.clientWidth;return document.body.removeChild(e),n}t.d(n,{A:()=>o})},22702:(e,n,t)=>{t.d(n,{A:()=>p,M:()=>u});var o=t(55152),r=t(30414),i=t(83705),a=t(18977),c=t(76446),l=t(82431);function u(e,n){n?e.setAttribute("aria-hidden","true"):e.removeAttribute("aria-hidden")}function s(e){return parseInt(window.getComputedStyle(e)["padding-right"],10)||0}function d(e,n,t){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],r=arguments.length>4?arguments[4]:void 0,a=[n,t].concat((0,i.A)(o)),c=["TEMPLATE","SCRIPT","STYLE"];[].forEach.call(e.children,function(e){1===e.nodeType&&-1===a.indexOf(e)&&-1===c.indexOf(e.tagName)&&u(e,r)})}function f(e,n){var t=-1;return e.some(function(e,o){return!!n(e)&&(t=o,!0)}),t}var p=function(){function e(){(0,o.A)(this,e),this.modals=[],this.containers=[]}return(0,r.A)(e,[{key:"add",value:function(e,n){var t=this.modals.indexOf(e);if(-1!==t)return t;t=this.modals.length,this.modals.push(e),e.modalRef&&u(e.modalRef,!1);var o=function(e){var n=[];return[].forEach.call(e.children,function(e){e.getAttribute&&"true"===e.getAttribute("aria-hidden")&&n.push(e)}),n}(n);d(n,e.mountNode,e.modalRef,o,!0);var r=f(this.containers,function(e){return e.container===n});return-1!==r?(this.containers[r].modals.push(e),t):(this.containers.push({modals:[e],container:n,restore:null,hiddenSiblingNodes:o}),t)}},{key:"mount",value:function(e,n){var t=f(this.containers,function(n){return-1!==n.modals.indexOf(e)}),o=this.containers[t];o.restore||(o.restore=function(e,n){var t,o=[],r=[],i=e.container;if(!n.disableScrollLock){if(function(e){var n=(0,c.A)(e);return n.body===e?(0,l.A)(n).innerWidth>n.documentElement.clientWidth:e.scrollHeight>e.clientHeight}(i)){var u=(0,a.A)();o.push({value:i.style.paddingRight,key:"padding-right",el:i}),i.style["padding-right"]="".concat(s(i)+u,"px"),t=(0,c.A)(i).querySelectorAll(".mui-fixed"),[].forEach.call(t,function(e){r.push(e.style.paddingRight),e.style.paddingRight="".concat(s(e)+u,"px")})}var d=i.parentElement,f="HTML"===d.nodeName&&"scroll"===window.getComputedStyle(d)["overflow-y"]?d:i;o.push({value:f.style.overflow,key:"overflow",el:f}),f.style.overflow="hidden"}return function(){t&&[].forEach.call(t,function(e,n){r[n]?e.style.paddingRight=r[n]:e.style.removeProperty("padding-right")}),o.forEach(function(e){var n=e.value,t=e.el,o=e.key;n?t.style.setProperty(o,n):t.style.removeProperty(o)})}}(o,n))}},{key:"remove",value:function(e){var n=this.modals.indexOf(e);if(-1===n)return n;var t=f(this.containers,function(n){return-1!==n.modals.indexOf(e)}),o=this.containers[t];if(o.modals.splice(o.modals.indexOf(e),1),this.modals.splice(n,1),0===o.modals.length)o.restore&&o.restore(),e.modalRef&&u(e.modalRef,!0),d(o.container,e.mountNode,e.modalRef,o.hiddenSiblingNodes,!1),this.containers.splice(t,1);else{var r=o.modals[o.modals.length-1];r.modalRef&&u(r.modalRef,!1)}return n}},{key:"isTopModal",value:function(e){return this.modals.length>0&&this.modals[this.modals.length-1]===e}}]),e}()},55197:(e,n,t)=>{t.d(n,{Ay:()=>A});var o=t(89575),r=t(39850),i=t(95478),a=t(40484),c=t(2589),l=t(36274),u=t(76446),s=t(82431),d=t(37260),f=t(7031),p=t(4313),h=t(33145),v=t(4321);function m(e,n){var t=0;return"number"==typeof n?t=n:"center"===n?t=e.height/2:"bottom"===n&&(t=e.height),t}function g(e,n){var t=0;return"number"==typeof n?t=n:"center"===n?t=e.width/2:"right"===n&&(t=e.width),t}function E(e){return[e.horizontal,e.vertical].map(function(e){return"number"==typeof e?"".concat(e,"px"):e}).join(" ")}function b(e){return"function"==typeof e?e():e}var y=i.forwardRef(function(e,n){var t=e.action,f=e.anchorEl,y=e.anchorOrigin,A=void 0===y?{vertical:"top",horizontal:"left"}:y,k=e.anchorPosition,x=e.anchorReference,w=void 0===x?"anchorEl":x,R=e.children,C=e.classes,P=e.className,T=e.container,O=e.elevation,z=void 0===O?8:O,I=e.getContentAnchorEl,M=e.marginThreshold,N=void 0===M?16:M,F=e.onEnter,S=e.onEntered,D=e.onEntering,L=e.onExit,B=e.onExited,H=e.onExiting,W=e.open,K=e.PaperProps,_=void 0===K?{}:K,Y=e.transformOrigin,j=void 0===Y?{vertical:"top",horizontal:"left"}:Y,q=e.TransitionComponent,X=void 0===q?h.A:q,G=e.transitionDuration,J=void 0===G?"auto":G,Q=e.TransitionProps,U=void 0===Q?{}:Q,V=(0,r.A)(e,["action","anchorEl","anchorOrigin","anchorPosition","anchorReference","children","classes","className","container","elevation","getContentAnchorEl","marginThreshold","onEnter","onEntered","onEntering","onExit","onExited","onExiting","open","PaperProps","transformOrigin","TransitionComponent","transitionDuration","TransitionProps"]),Z=i.useRef(),$=i.useCallback(function(e){if("anchorPosition"===w)return k;var n=b(f),t=(n&&1===n.nodeType?n:(0,u.A)(Z.current).body).getBoundingClientRect(),o=0===e?A.vertical:"center";return{top:t.top+m(t,o),left:t.left+g(t,A.horizontal)}},[f,A.horizontal,A.vertical,k,w]),ee=i.useCallback(function(e){var n=0;if(I&&"anchorEl"===w){var t=I(e);if(t&&e.contains(t)){var o=function(e,n){for(var t=n,o=0;t&&t!==e;)o+=(t=t.parentElement).scrollTop;return o}(e,t);n=t.offsetTop+t.clientHeight/2-o||0}}return n},[A.vertical,w,I]),ne=i.useCallback(function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return{vertical:m(e,j.vertical)+n,horizontal:g(e,j.horizontal)}},[j.horizontal,j.vertical]),te=i.useCallback(function(e){var n=ee(e),t={width:e.offsetWidth,height:e.offsetHeight},o=ne(t,n);if("none"===w)return{top:null,left:null,transformOrigin:E(o)};var r=$(n),i=r.top-o.vertical,a=r.left-o.horizontal,c=i+t.height,l=a+t.width,u=(0,s.A)(b(f)),d=u.innerHeight-N,p=u.innerWidth-N;if(i<N){var h=i-N;i-=h,o.vertical+=h}else if(c>d){var v=c-d;i-=v,o.vertical+=v}if(a<N){var m=a-N;a-=m,o.horizontal+=m}else if(l>p){var g=l-p;a-=g,o.horizontal+=g}return{top:"".concat(Math.round(i),"px"),left:"".concat(Math.round(a),"px"),transformOrigin:E(o)}},[f,w,$,ee,ne,N]),oe=i.useCallback(function(){var e=Z.current;if(e){var n=te(e);null!==n.top&&(e.style.top=n.top),null!==n.left&&(e.style.left=n.left),e.style.transformOrigin=n.transformOrigin}},[te]),re=i.useCallback(function(e){Z.current=a.findDOMNode(e)},[]);i.useEffect(function(){W&&oe()}),i.useImperativeHandle(t,function(){return W?{updatePosition:function(){oe()}}:null},[W,oe]),i.useEffect(function(){if(W){var e=(0,c.A)(function(){oe()});return window.addEventListener("resize",e),function(){e.clear(),window.removeEventListener("resize",e)}}},[W,oe]);var ie=J;"auto"!==J||X.muiSupportAuto||(ie=void 0);var ae=T||(f?(0,u.A)(b(f)).body:void 0);return i.createElement(p.A,(0,o.A)({container:ae,open:W,ref:n,BackdropProps:{invisible:!0},className:(0,l.A)(C.root,P)},V),i.createElement(X,(0,o.A)({appear:!0,in:W,onEnter:F,onEntered:S,onExit:L,onExited:B,onExiting:H,timeout:ie},U,{onEntering:(0,d.A)(function(e,n){D&&D(e,n),oe()},U.onEntering)}),i.createElement(v.A,(0,o.A)({elevation:z,ref:re},_,{className:(0,l.A)(C.paper,_.className)}),R)))});const A=(0,f.A)({root:{},paper:{position:"absolute",overflowY:"auto",overflowX:"hidden",minWidth:16,minHeight:16,maxWidth:"calc(100% - 32px)",maxHeight:"calc(100% - 32px)",outline:0}},{name:"MuiPopover"})(y)},64927:(e,n,t)=>{t.d(n,{A:()=>c});var o=t(95478),r=t(40484),i=t(76446),a=t(19878);const c=function(e){var n=e.children,t=e.disableAutoFocus,c=void 0!==t&&t,l=e.disableEnforceFocus,u=void 0!==l&&l,s=e.disableRestoreFocus,d=void 0!==s&&s,f=e.getDoc,p=e.isEnabled,h=e.open,v=o.useRef(),m=o.useRef(null),g=o.useRef(null),E=o.useRef(),b=o.useRef(null),y=o.useCallback(function(e){b.current=r.findDOMNode(e)},[]),A=(0,a.A)(n.ref,y),k=o.useRef();return o.useEffect(function(){k.current=h},[h]),!k.current&&h&&"undefined"!=typeof window&&(E.current=f().activeElement),o.useEffect(function(){if(h){var e=(0,i.A)(b.current);c||!b.current||b.current.contains(e.activeElement)||(b.current.hasAttribute("tabIndex")||b.current.setAttribute("tabIndex",-1),b.current.focus());var n=function(){null!==b.current&&(e.hasFocus()&&!u&&p()&&!v.current?b.current&&!b.current.contains(e.activeElement)&&b.current.focus():v.current=!1)},t=function(n){!u&&p()&&9===n.keyCode&&e.activeElement===b.current&&(v.current=!0,n.shiftKey?g.current.focus():m.current.focus())};e.addEventListener("focus",n,!0),e.addEventListener("keydown",t,!0);var o=setInterval(function(){n()},50);return function(){clearInterval(o),e.removeEventListener("focus",n,!0),e.removeEventListener("keydown",t,!0),d||(E.current&&E.current.focus&&E.current.focus(),E.current=null)}}},[c,u,d,p,h]),o.createElement(o.Fragment,null,o.createElement("div",{tabIndex:0,ref:m,"data-test":"sentinelStart"}),o.cloneElement(n,{ref:A}),o.createElement("div",{tabIndex:0,ref:g,"data-test":"sentinelEnd"}))}}}]);
2
+ //# sourceMappingURL=5197.53535ff4.chunk.js.map