@kuadrant/kuadrant-backstage-plugin-frontend 0.0.2-dev-61ff3d3 → 0.0.2-dev-5c79230
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/ApiKeyDetailPage/ApiKeyDetailPage.esm.js +319 -0
- package/dist/components/ApiKeyDetailPage/ApiKeyDetailPage.esm.js.map +1 -0
- package/dist/components/ApiKeyDetailPage/index.esm.js +2 -0
- package/dist/components/ApiKeyDetailPage/index.esm.js.map +1 -0
- package/dist/components/ApiKeyManagementTab/ApiKeyManagementTab.esm.js +340 -162
- package/dist/components/ApiKeyManagementTab/ApiKeyManagementTab.esm.js.map +1 -1
- package/dist/components/ApiKeysPage/ApiKeysPage.esm.js +43 -0
- package/dist/components/ApiKeysPage/ApiKeysPage.esm.js.map +1 -0
- package/dist/components/ApiKeysPage/index.esm.js +2 -0
- package/dist/components/ApiKeysPage/index.esm.js.map +1 -0
- package/dist/components/ApiProductInfoCard/ApiProductInfoCard.esm.js +23 -2
- package/dist/components/ApiProductInfoCard/ApiProductInfoCard.esm.js.map +1 -1
- package/dist/components/ApprovalQueueCard/ApprovalQueueCard.esm.js +312 -118
- package/dist/components/ApprovalQueueCard/ApprovalQueueCard.esm.js.map +1 -1
- package/dist/components/ApprovalQueueTable/ApprovalQueueTable.esm.js +645 -0
- package/dist/components/ApprovalQueueTable/ApprovalQueueTable.esm.js.map +1 -0
- package/dist/components/EditAPIKeyDialog/EditAPIKeyDialog.esm.js +14 -2
- package/dist/components/EditAPIKeyDialog/EditAPIKeyDialog.esm.js.map +1 -1
- package/dist/components/EntityApiApprovalTab/EntityApiApprovalTab.esm.js +276 -0
- package/dist/components/EntityApiApprovalTab/EntityApiApprovalTab.esm.js.map +1 -0
- package/dist/components/EntityApiApprovalTab/index.esm.js +2 -0
- package/dist/components/EntityApiApprovalTab/index.esm.js.map +1 -0
- package/dist/components/FilterPanel/FilterPanel.esm.js +127 -0
- package/dist/components/FilterPanel/FilterPanel.esm.js.map +1 -0
- package/dist/components/KuadrantPage/KuadrantPage.esm.js +93 -43
- package/dist/components/KuadrantPage/KuadrantPage.esm.js.map +1 -1
- package/dist/components/KuadrantPage/index.esm.js +1 -1
- package/dist/components/{MyApiKeysCard/MyApiKeysCard.esm.js → MyApiKeysTable/MyApiKeysTable.esm.js} +294 -176
- package/dist/components/MyApiKeysTable/MyApiKeysTable.esm.js.map +1 -0
- package/dist/components/PlanPolicyDetailsCard/PlanPolicyDetails.esm.js.map +1 -1
- package/dist/index.d.ts +8 -4
- package/dist/index.esm.js +1 -1
- package/dist/plugin.esm.js +30 -1
- package/dist/plugin.esm.js.map +1 -1
- package/dist/utils/styles.esm.js +14 -0
- package/dist/utils/styles.esm.js.map +1 -0
- package/dist-scalprum/{internal.plugin-kuadrant.90488643192ec2f36944.js → internal.plugin-kuadrant.a36ec4956222cb0faf61.js} +2 -2
- package/dist-scalprum/internal.plugin-kuadrant.a36ec4956222cb0faf61.js.map +1 -0
- package/dist-scalprum/plugin-manifest.json +2 -2
- package/dist-scalprum/static/2967.c684efaf.chunk.js +2 -0
- package/dist-scalprum/static/2967.c684efaf.chunk.js.map +1 -0
- package/dist-scalprum/static/3097.4bd6b35f.chunk.js +2 -0
- package/dist-scalprum/static/3097.4bd6b35f.chunk.js.map +1 -0
- package/dist-scalprum/static/4306.3a218ff1.chunk.js +2 -0
- package/dist-scalprum/static/4306.3a218ff1.chunk.js.map +1 -0
- package/dist-scalprum/static/5010.acf9a415.chunk.js +3 -0
- package/dist-scalprum/static/5010.acf9a415.chunk.js.map +1 -0
- package/dist-scalprum/static/5453.c1f90bdf.chunk.js +2 -0
- package/dist-scalprum/static/5453.c1f90bdf.chunk.js.map +1 -0
- package/dist-scalprum/static/6800.736d5da3.chunk.js +2 -0
- package/dist-scalprum/static/6800.736d5da3.chunk.js.map +1 -0
- package/dist-scalprum/static/6813.036a322f.chunk.js +2 -0
- package/dist-scalprum/static/6813.036a322f.chunk.js.map +1 -0
- package/dist-scalprum/static/6840.4728fab9.chunk.js +2 -0
- package/dist-scalprum/static/6840.4728fab9.chunk.js.map +1 -0
- package/dist-scalprum/static/6979.9699b350.chunk.js +2 -0
- package/dist-scalprum/static/6979.9699b350.chunk.js.map +1 -0
- package/dist-scalprum/static/7684.3d1fc1a1.chunk.js +2 -0
- package/dist-scalprum/static/7684.3d1fc1a1.chunk.js.map +1 -0
- package/dist-scalprum/static/8365.d3360f18.chunk.js +2 -0
- package/dist-scalprum/static/8365.d3360f18.chunk.js.map +1 -0
- package/dist-scalprum/static/8416.3604a311.chunk.js +2 -0
- package/dist-scalprum/static/8416.3604a311.chunk.js.map +1 -0
- package/dist-scalprum/static/8563.7e068fb0.chunk.js +3 -0
- package/dist-scalprum/static/8563.7e068fb0.chunk.js.map +1 -0
- package/dist-scalprum/static/exposed-PluginRoot.0717f1ce.chunk.js +2 -0
- package/dist-scalprum/static/exposed-PluginRoot.0717f1ce.chunk.js.map +1 -0
- package/package.json +1 -1
- package/dist/components/MyApiKeysCard/MyApiKeysCard.esm.js.map +0 -1
- package/dist-scalprum/internal.plugin-kuadrant.90488643192ec2f36944.js.map +0 -1
- package/dist-scalprum/static/1483.be69af13.chunk.js +0 -2
- package/dist-scalprum/static/1483.be69af13.chunk.js.map +0 -1
- package/dist-scalprum/static/3483.2f14a8ca.chunk.js +0 -3
- package/dist-scalprum/static/3483.2f14a8ca.chunk.js.map +0 -1
- package/dist-scalprum/static/4306.b68910c9.chunk.js +0 -2
- package/dist-scalprum/static/4306.b68910c9.chunk.js.map +0 -1
- package/dist-scalprum/static/4556.c6bedfc4.chunk.js +0 -3
- package/dist-scalprum/static/4556.c6bedfc4.chunk.js.map +0 -1
- package/dist-scalprum/static/5222.796292ca.chunk.js +0 -2
- package/dist-scalprum/static/5222.796292ca.chunk.js.map +0 -1
- package/dist-scalprum/static/532.146b1fd6.chunk.js +0 -2
- package/dist-scalprum/static/532.146b1fd6.chunk.js.map +0 -1
- package/dist-scalprum/static/5453.29118045.chunk.js +0 -2
- package/dist-scalprum/static/5453.29118045.chunk.js.map +0 -1
- package/dist-scalprum/static/6281.eb6e16a2.chunk.js +0 -2
- package/dist-scalprum/static/6281.eb6e16a2.chunk.js.map +0 -1
- package/dist-scalprum/static/8365.75ea3581.chunk.js +0 -2
- package/dist-scalprum/static/8365.75ea3581.chunk.js.map +0 -1
- package/dist-scalprum/static/exposed-PluginRoot.4183ceef.chunk.js +0 -2
- package/dist-scalprum/static/exposed-PluginRoot.4183ceef.chunk.js.map +0 -1
- /package/dist-scalprum/static/{4556.c6bedfc4.chunk.js.LICENSE.txt → 5010.acf9a415.chunk.js.LICENSE.txt} +0 -0
- /package/dist-scalprum/static/{3483.2f14a8ca.chunk.js.LICENSE.txt → 8563.7e068fb0.chunk.js.LICENSE.txt} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApprovalQueueCard.esm.js","sources":["../../../src/components/ApprovalQueueCard/ApprovalQueueCard.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { useApi, fetchApiRef, identityApiRef, configApiRef, alertApiRef } from '@backstage/core-plugin-api';\nimport { useAsync } from 'react-use';\nimport {\n Table,\n TableColumn,\n Progress,\n ResponseErrorPanel,\n InfoCard,\n} from '@backstage/core-components';\nimport { kuadrantApiKeyUpdateAllPermission, kuadrantApiKeyUpdateOwnPermission } 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 Tabs,\n Tab,\n Tooltip,\n Accordion,\n AccordionSummary,\n AccordionDetails,\n CircularProgress,\n} from '@material-ui/core';\nimport CheckCircleIcon from '@material-ui/icons/CheckCircle';\nimport CancelIcon from '@material-ui/icons/Cancel';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { APIKey } from '../../types/api-management';\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 = ({ open, request, action, processing, onClose, onConfirm }: ApprovalDialogProps) => {\n const actionLabel = action === 'approve' ? 'Approve' : 'Reject';\n const processingLabel = action === 'approve' ? 'Approving...' : 'Rejecting...';\n\n return (\n <Dialog open={open} onClose={processing ? undefined : onClose} maxWidth=\"sm\" fullWidth>\n <DialogTitle>\n {actionLabel} API Key Request\n </DialogTitle>\n <DialogContent>\n {request && (\n <>\n <p><strong>User:</strong> {request.spec.requestedBy.userId}</p>\n <p><strong>API:</strong> {request.spec.apiProductRef?.name || 'unknown'}</p>\n <p><strong>Tier:</strong> {request.spec.planTier}</p>\n <Box mb={2}>\n <Typography variant=\"body2\" component=\"span\" style={{ fontWeight: 'bold' }}>\n Use Case:\n </Typography>\n {' '}\n <Typography variant=\"body2\" component=\"span\" style={{ whiteSpace: 'pre-wrap' }}>\n {request.spec.useCase || '-'}\n </Typography>\n </Box>\n </>\n )}\n </DialogContent>\n <DialogActions>\n <Button onClick={onClose} disabled={processing}>Cancel</Button>\n <Button\n onClick={onConfirm}\n color={action === 'approve' ? 'primary' : 'secondary'}\n variant=\"contained\"\n disabled={processing}\n startIcon={processing ? <CircularProgress size={16} color=\"inherit\" /> : undefined}\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 = ({ open, requests, action, processing, onClose, onConfirm }: 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 open={open} onClose={processing ? undefined : onClose} maxWidth=\"md\" fullWidth>\n <DialogTitle>\n {isApprove ? 'Approve' : 'Reject'} {requests.length} API Key Requests\n </DialogTitle>\n <DialogContent>\n <Typography variant=\"body2\" paragraph>\n You are about to {isApprove ? 'approve' : 'reject'} the following requests:\n </Typography>\n <Box mb={2} maxHeight={200} overflow=\"auto\">\n {requests.map(request => (\n <Box key={`${request.metadata.namespace}/${request.metadata.name}`} mb={1} p={1} bgcolor=\"background.default\">\n <Typography variant=\"body2\">\n <strong>{request.spec.requestedBy.userId}</strong> - {request.spec.apiProductRef?.name || 'unknown'} ({request.spec.planTier})\n </Typography>\n </Box>\n ))}\n </Box>\n </DialogContent>\n <DialogActions>\n <Button onClick={onClose} disabled={processing}>Cancel</Button>\n <Button\n onClick={onConfirm}\n color={isApprove ? 'primary' : 'secondary'}\n variant=\"contained\"\n disabled={processing}\n startIcon={processing ? <CircularProgress size={16} color=\"inherit\" /> : undefined}\n >\n {processing ? processingLabel : actionLabel}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n\nexport const ApprovalQueueCard = () => {\n const config = useApi(configApiRef);\n const fetchApi = useApi(fetchApiRef);\n const identityApi = useApi(identityApiRef);\n const alertApi = useApi(alertApiRef);\n const backendUrl = config.getString('backend.baseUrl');\n const [refresh, setRefresh] = useState(0);\n const [selectedTab, setSelectedTab] = 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\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 = updateAllPermissionLoading || updateOwnPermissionLoading;\n const updatePermissionError = updateAllPermissionError || updateOwnPermissionError;\n\n const { value, loading, error } = useAsync(async () => {\n const identity = await identityApi.getBackstageIdentity();\n const reviewedBy = identity.userEntityRef;\n\n console.log('ApprovalQueueCard: fetching all requests from', `${backendUrl}/api/kuadrant/requests`);\n\n // fetch requests and api products in parallel\n const [requestsResponse, apiProductsResponse] = await Promise.all([\n fetchApi.fetch(`${backendUrl}/api/kuadrant/requests`),\n fetchApi.fetch(`${backendUrl}/api/kuadrant/apiproducts`),\n ]);\n\n if (!requestsResponse.ok) {\n console.log('ApprovalQueueCard: failed to fetch requests, status:', requestsResponse.status);\n return { pending: [] as APIKey[], approved: [] as APIKey[], rejected: [] as APIKey[], reviewedBy, ownedApiProducts: new Set<string>() };\n }\n\n // check content-type before parsing json\n const contentType = requestsResponse.headers.get('content-type');\n if (!contentType?.includes('application/json')) {\n console.error('ApprovalQueueCard: received non-json response');\n alertApi.post({\n message: 'Unexpected content-type from the server response. Please contact support.',\n display: 'transient',\n severity: 'warning'\n });\n return { pending: [] as APIKey[], approved: [] as APIKey[], rejected: [] as APIKey[], reviewedBy, ownedApiProducts: new Set<string>() };\n\n }\n\n const data = await requestsResponse.json();\n const allRequests = data.items || [];\n\n // build set of api products owned by current user\n const ownedApiProducts = new Set<string>();\n if (apiProductsResponse.ok) {\n const apiProductsData = await apiProductsResponse.json();\n for (const product of apiProductsData.items || []) {\n const owner = product.metadata?.annotations?.['backstage.io/owner'];\n if (owner === reviewedBy) {\n // key is namespace/name to match against request's namespace/apiProductRef.name\n ownedApiProducts.add(`${product.metadata.namespace}/${product.metadata.name}`);\n }\n }\n }\n\n console.log('ApprovalQueueCard: received', allRequests.length, 'total requests');\n console.log('ApprovalQueueCard: user owns', ownedApiProducts.size, 'api products');\n\n // group by status (field is 'phase' not 'status')\n const pending = allRequests.filter((r: APIKey) => {\n const phase = (r.status as any)?.phase || 'Pending';\n return phase === 'Pending';\n });\n const approved = allRequests.filter((r: APIKey) => {\n const phase = (r.status as any)?.phase;\n return phase === 'Approved';\n });\n const rejected = allRequests.filter((r: APIKey) => {\n const phase = (r.status as any)?.phase;\n return phase === 'Rejected';\n });\n\n console.log('ApprovalQueueCard: grouped -', {\n pending: pending.length,\n approved: approved.length,\n rejected: rejected.length,\n });\n\n return { pending, approved, rejected, reviewedBy, ownedApiProducts };\n }, [backendUrl, fetchApi, identityApi, refresh]);\n\n const handleApprove = (request: APIKey) => {\n setDialogState({ open: true, request, action: 'approve', processing: false });\n };\n\n const handleReject = (request: APIKey) => {\n setDialogState({ open: true, request, action: 'reject', processing: false });\n };\n\n const handleConfirm = async () => {\n if (!dialogState.request || !value) return;\n\n setDialogState(prev => ({ ...prev, processing: true }));\n\n const endpoint = dialogState.action === 'approve'\n ? `${backendUrl}/api/kuadrant/requests/${dialogState.request.metadata.namespace}/${dialogState.request.metadata.name}/approve`\n : `${backendUrl}/api/kuadrant/requests/${dialogState.request.metadata.namespace}/${dialogState.request.metadata.name}/reject`;\n\n try {\n const response = await fetchApi.fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n reviewedBy: value.reviewedBy,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`failed to ${dialogState.action} request`);\n }\n\n setDialogState({ open: false, request: null, action: 'approve', processing: false });\n setRefresh(r => r + 1);\n const action = dialogState.action === 'approve' ? 'approved' : 'rejected';\n alertApi.post({ message: `Request ${action}`, severity: 'success', display: 'transient' });\n } catch (err) {\n console.error(`error ${dialogState.action}ing request:`, err);\n setDialogState(prev => ({ ...prev, processing: false }));\n alertApi.post({ message: `Failed to ${dialogState.action} request`, severity: 'error', display: 'transient' });\n }\n };\n\n const handleBulkApprove = () => {\n if (selectedRequests.length === 0) return;\n setBulkDialogState({ open: true, requests: selectedRequests, action: 'approve', processing: false });\n };\n\n const handleBulkReject = () => {\n if (selectedRequests.length === 0) return;\n setBulkDialogState({ open: true, requests: selectedRequests, action: 'reject', processing: false });\n };\n\n const handleBulkConfirm = async () => {\n if (!value || bulkDialogState.requests.length === 0) return;\n\n setBulkDialogState(prev => ({ ...prev, processing: true }));\n\n const isApprove = bulkDialogState.action === 'approve';\n const endpoint = isApprove\n ? `${backendUrl}/api/kuadrant/requests/bulk-approve`\n : `${backendUrl}/api/kuadrant/requests/bulk-reject`;\n\n try {\n const response = await fetchApi.fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n requests: bulkDialogState.requests.map(r => ({\n namespace: r.metadata.namespace,\n name: r.metadata.name,\n })),\n reviewedBy: value.reviewedBy,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`failed to bulk ${bulkDialogState.action} requests`);\n }\n\n const count = bulkDialogState.requests.length;\n const action = isApprove ? 'approved' : 'rejected';\n setBulkDialogState({ open: false, requests: [], action: 'approve', processing: false });\n setSelectedRequests([]);\n setRefresh(r => r + 1);\n alertApi.post({ message: `${count} requests ${action}`, severity: 'success', display: 'transient' });\n } catch (err) {\n console.error(`error bulk ${bulkDialogState.action}ing requests:`, err);\n setBulkDialogState(prev => ({ ...prev, processing: false }));\n alertApi.post({ message: `Failed to bulk ${bulkDialogState.action} requests`, severity: 'error', display: 'transient' });\n }\n };\n\n if (loading || updatePermissionLoading) {\n return <Progress />;\n }\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n if (updatePermissionError) {\n return (\n <Box p={2}>\n <Typography color=\"error\">\n Unable to check permissions: {updatePermissionError.message}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Permission: kuadrant.apikey.update.all\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Please try again or contact your administrator\n </Typography>\n </Box>\n );\n }\n\n const pending = value?.pending || [];\n const approved = value?.approved || [];\n const rejected = value?.rejected || [];\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 hour: '2-digit',\n minute: '2-digit',\n });\n };\n\n const pendingColumns: TableColumn<APIKey>[] = [\n {\n title: 'Request Name',\n field: 'metadata.name',\n render: (row) => <Typography variant=\"body2\">{row.metadata.name}</Typography>,\n },\n {\n title: 'User',\n field: 'spec.requestedBy.userId',\n render: (row) => <Typography variant=\"body2\">{row.spec.requestedBy.userId}</Typography>,\n },\n {\n title: 'API',\n field: 'spec.apiProductRef.name',\n render: (row) => <Typography variant=\"body2\"><strong>{row.spec.apiProductRef?.name || 'unknown'}</strong></Typography>,\n },\n {\n title: 'Namespace',\n field: 'metadata.namespace',\n render: (row) => <Typography variant=\"body2\">{row.metadata.namespace}</Typography>,\n },\n {\n title: 'Tier',\n field: 'spec.planTier',\n render: (row) => (\n <Chip\n label={row.spec.planTier}\n size=\"small\"\n />\n ),\n },\n {\n title: 'Use Case',\n field: 'spec.useCase',\n render: (row) => {\n if (!row.spec.useCase) {\n return <Typography variant=\"body2\">-</Typography>;\n }\n return (\n <Tooltip title={row.spec.useCase} placement=\"top\">\n <Typography\n variant=\"body2\"\n style={{\n maxWidth: '200px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {row.spec.useCase}\n </Typography>\n </Tooltip>\n );\n },\n },\n {\n title: 'Requested',\n field: 'metadata.creationTimestamp',\n render: (row) => (\n <Typography variant=\"body2\">\n {row.metadata.creationTimestamp ? formatDate(row.metadata.creationTimestamp) : '-'}\n </Typography>\n ),\n },\n {\n title: 'Actions',\n filtering: false,\n render: (row) => {\n const apiProductKey = `${row.metadata.namespace}/${row.spec.apiProductRef?.name || 'unknown'}`;\n const ownsApiProduct = value?.ownedApiProducts?.has(apiProductKey) ?? false;\n const canUpdate = canUpdateAllRequests || (canUpdateOwnRequests && ownsApiProduct);\n if (!canUpdate) return null;\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 approvedColumns: TableColumn<APIKey>[] = [\n {\n title: 'Request Name',\n field: 'metadata.name',\n render: (row) => <Typography variant=\"body2\">{row.metadata.name}</Typography>,\n },\n {\n title: 'User',\n field: 'spec.requestedBy.userId',\n render: (row) => <Typography variant=\"body2\">{row.spec.requestedBy.userId}</Typography>,\n },\n {\n title: 'API',\n field: 'spec.apiProductRef.name',\n render: (row) => <Typography variant=\"body2\"><strong>{row.spec.apiProductRef?.name || 'unknown'}</strong></Typography>,\n },\n {\n title: 'Namespace',\n field: 'metadata.namespace',\n render: (row) => <Typography variant=\"body2\">{row.metadata.namespace}</Typography>,\n },\n {\n title: 'Tier',\n field: 'spec.planTier',\n render: (row) => (\n <Chip\n label={row.spec.planTier}\n size=\"small\"\n />\n ),\n },\n {\n title: 'Requested',\n field: 'metadata.creationTimestamp',\n render: (row) => (\n <Typography variant=\"body2\">\n {row.metadata.creationTimestamp ? formatDate(row.metadata.creationTimestamp) : '-'}\n </Typography>\n ),\n },\n {\n title: 'Approved',\n field: 'status.reviewedAt',\n render: (row) => (\n <Typography variant=\"body2\">\n {row.status?.reviewedAt ? formatDate(row.status.reviewedAt) : '-'}\n </Typography>\n ),\n },\n {\n title: 'Reviewed By',\n field: 'status.reviewedBy',\n render: (row) => (\n <Typography variant=\"body2\">\n {row.status?.reviewedBy || '-'}\n </Typography>\n ),\n },\n {\n title: 'Approval Type',\n field: 'status.reviewedBy',\n render: (row) => {\n const isAutomatic = row.status?.reviewedBy === 'system';\n return (\n <Chip\n label={isAutomatic ? 'Automatic' : 'Manual'}\n size=\"small\"\n color={isAutomatic ? 'default' : 'primary'}\n />\n );\n },\n },\n ];\n\n const rejectedColumns: TableColumn<APIKey>[] = [\n {\n title: 'Request Name',\n field: 'metadata.name',\n render: (row) => <Typography variant=\"body2\">{row.metadata.name}</Typography>,\n },\n {\n title: 'User',\n field: 'spec.requestedBy.userId',\n render: (row) => <Typography variant=\"body2\">{row.spec.requestedBy.userId}</Typography>,\n },\n {\n title: 'API',\n field: 'spec.apiProductRef.name',\n render: (row) => <Typography variant=\"body2\"><strong>{row.spec.apiProductRef?.name || 'unknown'}</strong></Typography>,\n },\n {\n title: 'Namespace',\n field: 'metadata.namespace',\n render: (row) => <Typography variant=\"body2\">{row.metadata.namespace}</Typography>,\n },\n {\n title: 'Tier',\n field: 'spec.planTier',\n render: (row) => (\n <Chip\n label={row.spec.planTier}\n size=\"small\"\n />\n ),\n },\n {\n title: 'Requested',\n field: 'metadata.creationTimestamp',\n render: (row) => (\n <Typography variant=\"body2\">\n {row.metadata.creationTimestamp ? formatDate(row.metadata.creationTimestamp) : '-'}\n </Typography>\n ),\n },\n {\n title: 'Rejected',\n field: 'status.reviewedAt',\n render: (row) => (\n <Typography variant=\"body2\">\n {row.status?.reviewedAt ? formatDate(row.status.reviewedAt) : '-'}\n </Typography>\n ),\n },\n {\n title: 'Reviewed By',\n field: 'status.reviewedBy',\n render: (row) => (\n <Typography variant=\"body2\">\n {row.status?.reviewedBy || '-'}\n </Typography>\n ),\n },\n ];\n\n const getTabData = () => {\n const addIds = (data: APIKey[]) =>\n data.map(item => ({ ...item, id: item.metadata.name }));\n\n switch (selectedTab) {\n case 0:\n // pending tab - add tableData.checked to control checkbox state\n const pendingWithSelection = pending.map((row: APIKey) => {\n const isSelected = selectedRequests.some(\n selected => selected.metadata.name === row.metadata.name &&\n selected.metadata.namespace === row.metadata.namespace\n );\n return {\n ...row,\n tableData: { checked: isSelected },\n };\n });\n return { data: pendingWithSelection, columns: pendingColumns, showSelection: true };\n case 1:\n return { data: addIds(approved), columns: approvedColumns, showSelection: false };\n case 2:\n return { data: addIds(rejected), columns: rejectedColumns, showSelection: false };\n default:\n return { data: addIds(pending), columns: pendingColumns, showSelection: true };\n }\n };\n\n const tabData = getTabData();\n\n // group requests by api product (namespace/name)\n const groupByApiProduct = (requests: APIKey[]) => {\n const grouped = new Map<string, APIKey[]>();\n requests.forEach(request => {\n const key = `${request.metadata.namespace}/${request.spec.apiProductRef?.name || 'unknown'}`;\n if (!grouped.has(key)) {\n grouped.set(key, []);\n }\n grouped.get(key)!.push(request);\n });\n return grouped;\n };\n\n const groupedData = groupByApiProduct(tabData.data);\n const apiProductKeys = Array.from(groupedData.keys()).sort();\n\n return (\n <>\n <InfoCard\n title=\"API Access Requests\"\n subheader={`${pending.length} pending, ${approved.length} approved, ${rejected.length} rejected`}\n >\n <Box mb={2} data-testid=\"approval-queue-card\">\n <Tabs\n value={selectedTab}\n onChange={(_, newValue) => {\n setSelectedTab(newValue);\n setSelectedRequests([]);\n }}\n indicatorColor=\"primary\"\n textColor=\"primary\"\n data-testid=\"approval-queue-tabs\"\n >\n <Tab label={`Pending (${pending.length})`} data-testid=\"approval-queue-pending-tab\" />\n <Tab label={`Approved (${approved.length})`} data-testid=\"approval-queue-approved-tab\" />\n <Tab label={`Rejected (${rejected.length})`} data-testid=\"approval-queue-rejected-tab\" />\n </Tabs>\n </Box>\n\n {selectedTab === 0 && selectedRequests.length > 0 && (\n <Box mb={2} display=\"flex\" alignItems=\"center\" justifyContent=\"space-between\" p={2} bgcolor=\"background.default\">\n <Typography variant=\"body2\">\n {selectedRequests.length} request{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 {tabData.data.length === 0 ? (\n <Box p={3} textAlign=\"center\">\n <Typography variant=\"body1\" color=\"textSecondary\">\n {selectedTab === 0 && 'No pending requests.'}\n {selectedTab === 1 && 'No approved requests.'}\n {selectedTab === 2 && 'No rejected requests.'}\n </Typography>\n </Box>\n ) : (\n <Box>\n {apiProductKeys.map(apiProductKey => {\n const requests = groupedData.get(apiProductKey) || [];\n const displayName = requests[0]?.spec.apiProductRef?.name || apiProductKey;\n const ownsThisApiProduct = value?.ownedApiProducts?.has(apiProductKey) ?? false;\n const canSelectRows = canUpdateAllRequests || (canUpdateOwnRequests && ownsThisApiProduct);\n return (\n <Accordion key={apiProductKey} defaultExpanded={apiProductKeys.length === 1}>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Box display=\"flex\" alignItems=\"center\" justifyContent=\"space-between\" width=\"100%\">\n <Typography variant=\"h6\">{displayName}</Typography>\n <Chip\n label={`${requests.length} request${requests.length !== 1 ? 's' : ''}`}\n size=\"small\"\n color=\"primary\"\n style={{ marginRight: 16 }}\n />\n </Box>\n </AccordionSummary>\n <AccordionDetails>\n <Box width=\"100%\">\n <Table\n options={{\n selection: canSelectRows && tabData.showSelection,\n paging: requests.length > 5,\n pageSize: 20,\n search: true,\n filtering: true,\n debounceInterval: 300,\n showTextRowsSelected: false,\n toolbar: true,\n emptyRowsWhenPaging: false,\n }}\n data={requests}\n columns={tabData.columns}\n onSelectionChange={(rows) => {\n // merge selections from this api product with selections from other products\n const otherSelections = selectedRequests.filter(\n r => `${r.metadata.namespace}/${r.spec.apiProductRef?.name || 'unknown'}` !== apiProductKey\n );\n setSelectedRequests([...otherSelections, ...(rows as APIKey[])]);\n }}\n />\n </Box>\n </AccordionDetails>\n </Accordion>\n );\n })}\n </Box>\n )}\n </InfoCard>\n <ApprovalDialog\n open={dialogState.open}\n request={dialogState.request}\n action={dialogState.action}\n processing={dialogState.processing}\n onClose={() => setDialogState({ open: false, request: null, action: 'approve', processing: false })}\n onConfirm={handleConfirm}\n />\n <BulkActionDialog\n open={bulkDialogState.open}\n requests={bulkDialogState.requests}\n action={bulkDialogState.action}\n processing={bulkDialogState.processing}\n onClose={() => setBulkDialogState({ open: false, requests: [], action: 'approve', processing: false })}\n onConfirm={handleBulkConfirm}\n />\n </>\n );\n};\n"],"names":["pending","approved","rejected"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ApprovalQueueCard.esm.js","sources":["../../../src/components/ApprovalQueueCard/ApprovalQueueCard.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport {\n useApi,\n fetchApiRef,\n identityApiRef,\n configApiRef,\n alertApiRef,\n} from \"@backstage/core-plugin-api\";\nimport { useAsync } from \"react-use\";\nimport {\n Table,\n TableColumn,\n Progress,\n ResponseErrorPanel,\n InfoCard,\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 Tabs,\n Tab,\n Tooltip,\n Accordion,\n AccordionSummary,\n AccordionDetails,\n CircularProgress,\n} from \"@material-ui/core\";\nimport CheckCircleIcon from \"@material-ui/icons/CheckCircle\";\nimport CancelIcon from \"@material-ui/icons/Cancel\";\nimport ExpandMoreIcon from \"@material-ui/icons/ExpandMore\";\nimport { APIKey } from \"../../types/api-management\";\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 actionLabel = action === \"approve\" ? \"Approve\" : \"Reject\";\n const processingLabel =\n action === \"approve\" ? \"Approving...\" : \"Rejecting...\";\n\n return (\n <Dialog\n open={open}\n onClose={processing ? undefined : onClose}\n maxWidth=\"sm\"\n fullWidth\n >\n <DialogTitle>{actionLabel} API Key</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 </>\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}\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\nexport const ApprovalQueueCard = () => {\n const config = useApi(configApiRef);\n const fetchApi = useApi(fetchApiRef);\n const identityApi = useApi(identityApiRef);\n const alertApi = useApi(alertApiRef);\n const backendUrl = config.getString(\"backend.baseUrl\");\n const [refresh, setRefresh] = useState(0);\n const [selectedTab, setSelectedTab] = 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\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 console.log(\n \"ApprovalQueueCard: fetching all requests from\",\n `${backendUrl}/api/kuadrant/requests`,\n );\n\n // fetch requests and api products in parallel\n const [requestsResponse, apiProductsResponse] = await Promise.all([\n fetchApi.fetch(`${backendUrl}/api/kuadrant/requests`),\n fetchApi.fetch(`${backendUrl}/api/kuadrant/apiproducts`),\n ]);\n\n if (!requestsResponse.ok) {\n console.log(\n \"ApprovalQueueCard: failed to fetch requests, status:\",\n requestsResponse.status,\n );\n return {\n pending: [] as APIKey[],\n approved: [] as APIKey[],\n rejected: [] as APIKey[],\n reviewedBy,\n ownedApiProducts: new Set<string>(),\n };\n }\n\n // check content-type before parsing json\n const contentType = requestsResponse.headers.get(\"content-type\");\n if (!contentType?.includes(\"application/json\")) {\n console.error(\"ApprovalQueueCard: received non-json response\");\n alertApi.post({\n message:\n \"Unexpected content-type from the server response. Please contact support.\",\n display: \"transient\",\n severity: \"warning\",\n });\n return {\n pending: [] as APIKey[],\n approved: [] as APIKey[],\n rejected: [] as APIKey[],\n reviewedBy,\n ownedApiProducts: new Set<string>(),\n };\n }\n\n const data = await requestsResponse.json();\n const allRequests = data.items || [];\n\n // build set of api products owned by current user\n const ownedApiProducts = new Set<string>();\n if (apiProductsResponse.ok) {\n const apiProductsData = await apiProductsResponse.json();\n for (const product of apiProductsData.items || []) {\n const owner = product.metadata?.annotations?.[\"backstage.io/owner\"];\n if (owner === reviewedBy) {\n // key is namespace/name to match against request's namespace/apiProductRef.name\n ownedApiProducts.add(\n `${product.metadata.namespace}/${product.metadata.name}`,\n );\n }\n }\n }\n\n console.log(\n \"ApprovalQueueCard: received\",\n allRequests.length,\n \"total requests\",\n );\n console.log(\n \"ApprovalQueueCard: user owns\",\n ownedApiProducts.size,\n \"api products\",\n );\n\n // group by status (field is 'phase' not 'status')\n const pending = allRequests.filter((r: APIKey) => {\n const phase = (r.status as any)?.phase || \"Pending\";\n return phase === \"Pending\";\n });\n const approved = allRequests.filter((r: APIKey) => {\n const phase = (r.status as any)?.phase;\n return phase === \"Approved\";\n });\n const rejected = allRequests.filter((r: APIKey) => {\n const phase = (r.status as any)?.phase;\n return phase === \"Rejected\";\n });\n\n console.log(\"ApprovalQueueCard: grouped -\", {\n pending: pending.length,\n approved: approved.length,\n rejected: rejected.length,\n });\n\n return { pending, approved, rejected, reviewedBy, ownedApiProducts };\n }, [backendUrl, fetchApi, identityApi, refresh]);\n\n const handleApprove = (request: APIKey) => {\n setDialogState({\n open: true,\n request,\n action: \"approve\",\n processing: false,\n });\n };\n\n const handleReject = (request: APIKey) => {\n setDialogState({\n open: true,\n request,\n action: \"reject\",\n processing: false,\n });\n };\n\n const handleConfirm = async () => {\n if (!dialogState.request || !value) return;\n\n setDialogState((prev) => ({ ...prev, processing: true }));\n\n const endpoint =\n dialogState.action === \"approve\"\n ? `${backendUrl}/api/kuadrant/requests/${dialogState.request.metadata.namespace}/${dialogState.request.metadata.name}/approve`\n : `${backendUrl}/api/kuadrant/requests/${dialogState.request.metadata.namespace}/${dialogState.request.metadata.name}/reject`;\n\n try {\n const response = await fetchApi.fetch(endpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n reviewedBy: value.reviewedBy,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`failed to ${dialogState.action} request`);\n }\n\n setDialogState({\n open: false,\n request: null,\n action: \"approve\",\n processing: false,\n });\n setRefresh((r) => r + 1);\n const action = dialogState.action === \"approve\" ? \"approved\" : \"rejected\";\n alertApi.post({\n message: `API key ${action}`,\n severity: \"success\",\n display: \"transient\",\n });\n } catch (err) {\n console.error(`error ${dialogState.action}ing request:`, err);\n setDialogState((prev) => ({ ...prev, processing: false }));\n alertApi.post({\n message: `Failed to ${dialogState.action} API key`,\n severity: \"error\",\n display: \"transient\",\n });\n }\n };\n\n const handleBulkApprove = () => {\n if (selectedRequests.length === 0) return;\n setBulkDialogState({\n open: true,\n requests: selectedRequests,\n action: \"approve\",\n processing: false,\n });\n };\n\n const handleBulkReject = () => {\n if (selectedRequests.length === 0) return;\n setBulkDialogState({\n open: true,\n requests: selectedRequests,\n action: \"reject\",\n processing: false,\n });\n };\n\n const handleBulkConfirm = async () => {\n if (!value || bulkDialogState.requests.length === 0) return;\n\n setBulkDialogState((prev) => ({ ...prev, processing: true }));\n\n const isApprove = bulkDialogState.action === \"approve\";\n const endpoint = isApprove\n ? `${backendUrl}/api/kuadrant/requests/bulk-approve`\n : `${backendUrl}/api/kuadrant/requests/bulk-reject`;\n\n try {\n const response = await fetchApi.fetch(endpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n requests: bulkDialogState.requests.map((r) => ({\n namespace: r.metadata.namespace,\n name: r.metadata.name,\n })),\n reviewedBy: value.reviewedBy,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`failed to bulk ${bulkDialogState.action} requests`);\n }\n\n const count = bulkDialogState.requests.length;\n const action = isApprove ? \"approved\" : \"rejected\";\n setBulkDialogState({\n open: false,\n requests: [],\n action: \"approve\",\n processing: false,\n });\n setSelectedRequests([]);\n setRefresh((r) => r + 1);\n alertApi.post({\n message: `${count} API keys ${action}`,\n severity: \"success\",\n display: \"transient\",\n });\n } catch (err) {\n console.error(`error bulk ${bulkDialogState.action}ing requests:`, err);\n setBulkDialogState((prev) => ({ ...prev, processing: false }));\n alertApi.post({\n message: `Failed to bulk ${bulkDialogState.action} API keys`,\n severity: \"error\",\n display: \"transient\",\n });\n }\n };\n\n if (loading || updatePermissionLoading) {\n return <Progress />;\n }\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n if (updatePermissionError) {\n return (\n <Box p={2}>\n <Typography color=\"error\">\n Unable to check permissions: {updatePermissionError.message}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Permission: kuadrant.apikey.update.all\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Please try again or contact your administrator\n </Typography>\n </Box>\n );\n }\n\n const pending = value?.pending || [];\n const approved = value?.approved || [];\n const rejected = value?.rejected || [];\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 hour: \"2-digit\",\n minute: \"2-digit\",\n });\n };\n\n const pendingColumns: TableColumn<APIKey>[] = [\n {\n title: \"Name\",\n field: \"metadata.name\",\n render: (row) => (\n <Typography variant=\"body2\">{row.metadata.name}</Typography>\n ),\n },\n {\n title: \"User\",\n field: \"spec.requestedBy.userId\",\n render: (row) => (\n <Typography variant=\"body2\">{row.spec.requestedBy.userId}</Typography>\n ),\n },\n {\n title: \"API\",\n field: \"spec.apiProductRef.name\",\n render: (row) => (\n <Typography variant=\"body2\">\n <strong>{row.spec.apiProductRef?.name || \"unknown\"}</strong>\n </Typography>\n ),\n },\n {\n title: \"Namespace\",\n field: \"metadata.namespace\",\n render: (row) => (\n <Typography variant=\"body2\">{row.metadata.namespace}</Typography>\n ),\n },\n {\n title: \"Tier\",\n field: \"spec.planTier\",\n render: (row) => <Chip label={row.spec.planTier} size=\"small\" />,\n },\n {\n title: \"Use Case\",\n field: \"spec.useCase\",\n render: (row) => {\n if (!row.spec.useCase) {\n return <Typography variant=\"body2\">-</Typography>;\n }\n return (\n <Tooltip title={row.spec.useCase} placement=\"top\">\n <Typography\n variant=\"body2\"\n style={{\n maxWidth: \"200px\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {row.spec.useCase}\n </Typography>\n </Tooltip>\n );\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: \"Actions\",\n filtering: false,\n render: (row) => {\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 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 approvedColumns: TableColumn<APIKey>[] = [\n {\n title: \"Name\",\n field: \"metadata.name\",\n render: (row) => (\n <Typography variant=\"body2\">{row.metadata.name}</Typography>\n ),\n },\n {\n title: \"User\",\n field: \"spec.requestedBy.userId\",\n render: (row) => (\n <Typography variant=\"body2\">{row.spec.requestedBy.userId}</Typography>\n ),\n },\n {\n title: \"API\",\n field: \"spec.apiProductRef.name\",\n render: (row) => (\n <Typography variant=\"body2\">\n <strong>{row.spec.apiProductRef?.name || \"unknown\"}</strong>\n </Typography>\n ),\n },\n {\n title: \"Namespace\",\n field: \"metadata.namespace\",\n render: (row) => (\n <Typography variant=\"body2\">{row.metadata.namespace}</Typography>\n ),\n },\n {\n title: \"Tier\",\n field: \"spec.planTier\",\n render: (row) => <Chip label={row.spec.planTier} size=\"small\" />,\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: \"Approved\",\n field: \"status.reviewedAt\",\n render: (row) => (\n <Typography variant=\"body2\">\n {row.status?.reviewedAt ? formatDate(row.status.reviewedAt) : \"-\"}\n </Typography>\n ),\n },\n {\n title: \"Reviewed By\",\n field: \"status.reviewedBy\",\n render: (row) => (\n <Typography variant=\"body2\">{row.status?.reviewedBy || \"-\"}</Typography>\n ),\n },\n {\n title: \"Approval Type\",\n field: \"status.reviewedBy\",\n render: (row) => {\n const isAutomatic = row.status?.reviewedBy === \"system\";\n return (\n <Chip\n label={isAutomatic ? \"Automatic\" : \"Manual\"}\n size=\"small\"\n color={isAutomatic ? \"default\" : \"primary\"}\n />\n );\n },\n },\n ];\n\n const rejectedColumns: TableColumn<APIKey>[] = [\n {\n title: \"Name\",\n field: \"metadata.name\",\n render: (row) => (\n <Typography variant=\"body2\">{row.metadata.name}</Typography>\n ),\n },\n {\n title: \"User\",\n field: \"spec.requestedBy.userId\",\n render: (row) => (\n <Typography variant=\"body2\">{row.spec.requestedBy.userId}</Typography>\n ),\n },\n {\n title: \"API\",\n field: \"spec.apiProductRef.name\",\n render: (row) => (\n <Typography variant=\"body2\">\n <strong>{row.spec.apiProductRef?.name || \"unknown\"}</strong>\n </Typography>\n ),\n },\n {\n title: \"Namespace\",\n field: \"metadata.namespace\",\n render: (row) => (\n <Typography variant=\"body2\">{row.metadata.namespace}</Typography>\n ),\n },\n {\n title: \"Tier\",\n field: \"spec.planTier\",\n render: (row) => <Chip label={row.spec.planTier} size=\"small\" />,\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: \"Rejected\",\n field: \"status.reviewedAt\",\n render: (row) => (\n <Typography variant=\"body2\">\n {row.status?.reviewedAt ? formatDate(row.status.reviewedAt) : \"-\"}\n </Typography>\n ),\n },\n {\n title: \"Reviewed By\",\n field: \"status.reviewedBy\",\n render: (row) => (\n <Typography variant=\"body2\">{row.status?.reviewedBy || \"-\"}</Typography>\n ),\n },\n ];\n\n const getTabData = () => {\n const addIds = (data: APIKey[]) =>\n data.map((item) => ({ ...item, id: item.metadata.name }));\n\n switch (selectedTab) {\n case 0:\n // pending tab - add tableData.checked to control checkbox state\n const pendingWithSelection = pending.map((row: APIKey) => {\n const isSelected = selectedRequests.some(\n (selected) =>\n selected.metadata.name === row.metadata.name &&\n selected.metadata.namespace === row.metadata.namespace,\n );\n return {\n ...row,\n tableData: { checked: isSelected },\n };\n });\n return {\n data: pendingWithSelection,\n columns: pendingColumns,\n showSelection: true,\n };\n case 1:\n return {\n data: addIds(approved),\n columns: approvedColumns,\n showSelection: false,\n };\n case 2:\n return {\n data: addIds(rejected),\n columns: rejectedColumns,\n showSelection: false,\n };\n default:\n return {\n data: addIds(pending),\n columns: pendingColumns,\n showSelection: true,\n };\n }\n };\n\n const tabData = getTabData();\n\n // group requests by api product (namespace/name)\n const groupByApiProduct = (requests: APIKey[]) => {\n const grouped = new Map<string, APIKey[]>();\n requests.forEach((request) => {\n const key = `${request.metadata.namespace}/${request.spec.apiProductRef?.name || \"unknown\"}`;\n if (!grouped.has(key)) {\n grouped.set(key, []);\n }\n grouped.get(key)!.push(request);\n });\n return grouped;\n };\n\n const groupedData = groupByApiProduct(tabData.data);\n const apiProductKeys = Array.from(groupedData.keys()).sort();\n\n return (\n <>\n <InfoCard\n title=\"API Access Requests\"\n subheader={`${pending.length} pending, ${approved.length} approved, ${rejected.length} rejected`}\n >\n <Box mb={2} data-testid=\"approval-queue-card\">\n <Tabs\n value={selectedTab}\n onChange={(_, newValue) => {\n setSelectedTab(newValue);\n setSelectedRequests([]);\n }}\n indicatorColor=\"primary\"\n textColor=\"primary\"\n data-testid=\"approval-queue-tabs\"\n >\n <Tab\n label={`Pending (${pending.length})`}\n data-testid=\"approval-queue-pending-tab\"\n />\n <Tab\n label={`Approved (${approved.length})`}\n data-testid=\"approval-queue-approved-tab\"\n />\n <Tab\n label={`Rejected (${rejected.length})`}\n data-testid=\"approval-queue-rejected-tab\"\n />\n </Tabs>\n </Box>\n\n {selectedTab === 0 && selectedRequests.length > 0 && (\n <Box\n mb={2}\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n p={2}\n bgcolor=\"background.default\"\n >\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 {tabData.data.length === 0 ? (\n <Box p={3} textAlign=\"center\">\n <Typography variant=\"body1\" color=\"textSecondary\">\n {selectedTab === 0 && \"No pending requests.\"}\n {selectedTab === 1 && \"No approved requests.\"}\n {selectedTab === 2 && \"No rejected requests.\"}\n </Typography>\n </Box>\n ) : (\n <Box>\n {apiProductKeys.map((apiProductKey) => {\n const requests = groupedData.get(apiProductKey) || [];\n const displayName =\n requests[0]?.spec.apiProductRef?.name || apiProductKey;\n const ownsThisApiProduct =\n value?.ownedApiProducts?.has(apiProductKey) ?? false;\n const canSelectRows =\n canUpdateAllRequests ||\n (canUpdateOwnRequests && ownsThisApiProduct);\n return (\n <Accordion\n key={apiProductKey}\n defaultExpanded={apiProductKeys.length === 1}\n >\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Box\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n width=\"100%\"\n >\n <Typography variant=\"h6\">{displayName}</Typography>\n <Chip\n label={`${requests.length} request${requests.length !== 1 ? \"s\" : \"\"}`}\n size=\"small\"\n color=\"primary\"\n style={{ marginRight: 16 }}\n />\n </Box>\n </AccordionSummary>\n <AccordionDetails>\n <Box width=\"100%\">\n <Table\n options={{\n selection: canSelectRows && tabData.showSelection,\n paging: requests.length > 5,\n pageSize: 20,\n search: true,\n filtering: true,\n debounceInterval: 300,\n showTextRowsSelected: false,\n toolbar: true,\n emptyRowsWhenPaging: false,\n }}\n data={requests}\n columns={tabData.columns}\n onSelectionChange={(rows) => {\n // merge selections from this api product with selections from other products\n const otherSelections = selectedRequests.filter(\n (r) =>\n `${r.metadata.namespace}/${r.spec.apiProductRef?.name || \"unknown\"}` !==\n apiProductKey,\n );\n setSelectedRequests([\n ...otherSelections,\n ...(rows as APIKey[]),\n ]);\n }}\n />\n </Box>\n </AccordionDetails>\n </Accordion>\n );\n })}\n </Box>\n )}\n </InfoCard>\n <ApprovalDialog\n open={dialogState.open}\n request={dialogState.request}\n action={dialogState.action}\n processing={dialogState.processing}\n onClose={() =>\n setDialogState({\n open: false,\n request: null,\n action: \"approve\",\n processing: false,\n })\n }\n onConfirm={handleConfirm}\n />\n <BulkActionDialog\n open={bulkDialogState.open}\n requests={bulkDialogState.requests}\n action={bulkDialogState.action}\n processing={bulkDialogState.processing}\n onClose={() =>\n setBulkDialogState({\n open: false,\n requests: [],\n action: \"approve\",\n processing: false,\n })\n }\n onConfirm={handleBulkConfirm}\n />\n </>\n );\n};\n"],"names":["pending","approved","rejected"],"mappings":"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"}
|