@kuadrant/kuadrant-backstage-plugin-frontend 0.0.2-dev-8f2e157 → 0.0.2-dev-844db4d
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/ApiKeyManagementTab/ApiKeyManagementTab.esm.js +45 -10
- package/dist/components/ApiKeyManagementTab/ApiKeyManagementTab.esm.js.map +1 -1
- package/dist/components/ApprovalQueueCard/ApprovalQueueCard.esm.js +8 -3
- package/dist/components/ApprovalQueueCard/ApprovalQueueCard.esm.js.map +1 -1
- package/dist/components/KuadrantPage/KuadrantPage.esm.js +24 -3
- package/dist/components/KuadrantPage/KuadrantPage.esm.js.map +1 -1
- package/dist/components/MyApiKeysCard/MyApiKeysCard.esm.js +12 -4
- package/dist/components/MyApiKeysCard/MyApiKeysCard.esm.js.map +1 -1
- package/dist-scalprum/{internal.plugin-kuadrant.86c50e4da6b961c623e9.js → internal.plugin-kuadrant.58f9452dd6d088d4816c.js} +2 -2
- package/dist-scalprum/{internal.plugin-kuadrant.86c50e4da6b961c623e9.js.map → internal.plugin-kuadrant.58f9452dd6d088d4816c.js.map} +1 -1
- package/dist-scalprum/plugin-manifest.json +2 -2
- package/dist-scalprum/static/4306.bc289e67.chunk.js +2 -0
- package/dist-scalprum/static/4306.bc289e67.chunk.js.map +1 -0
- package/dist-scalprum/static/6281.e7e36f6a.chunk.js +2 -0
- package/dist-scalprum/static/6281.e7e36f6a.chunk.js.map +1 -0
- package/dist-scalprum/static/7632.4bb9bd69.chunk.js +2 -0
- package/dist-scalprum/static/7632.4bb9bd69.chunk.js.map +1 -0
- package/package.json +1 -1
- package/dist-scalprum/static/4306.04dfa125.chunk.js +0 -2
- package/dist-scalprum/static/4306.04dfa125.chunk.js.map +0 -1
- package/dist-scalprum/static/6281.14f57b13.chunk.js +0 -2
- package/dist-scalprum/static/6281.14f57b13.chunk.js.map +0 -1
- package/dist-scalprum/static/7632.646001ce.chunk.js +0 -2
- package/dist-scalprum/static/7632.646001ce.chunk.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApprovalQueueCard.esm.js","sources":["../../../src/components/ApprovalQueueCard/ApprovalQueueCard.tsx"],"sourcesContent":["import React, { useState, useEffect } from 'react';\nimport { useApi, fetchApiRef, identityApiRef, configApiRef } 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 { kuadrantApiKeyRequestUpdateAllPermission, kuadrantApiKeyRequestUpdateOwnPermission } from '../../permissions';\nimport { useKuadrantPermission } from '../../utils/permissions';\nimport {\n Button,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n TextField,\n Chip,\n Typography,\n Box,\n Tabs,\n Tab,\n Tooltip,\n Accordion,\n AccordionSummary,\n AccordionDetails,\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 { APIKeyRequest } from '../../types/api-management';\n\ninterface ApprovalDialogProps {\n open: boolean;\n request: APIKeyRequest | null;\n action: 'approve' | 'reject';\n onClose: () => void;\n onConfirm: (comment: string) => void;\n}\n\nconst ApprovalDialog = ({ open, request, action, onClose, onConfirm }: ApprovalDialogProps) => {\n const [comment, setComment] = useState('');\n\n // reset comment when dialog closes\n useEffect(() => {\n if (!open) {\n setComment('');\n }\n }, [open]);\n\n const handleConfirm = () => {\n onConfirm(comment);\n onClose();\n };\n\n return (\n <Dialog open={open} onClose={onClose} maxWidth=\"sm\" fullWidth>\n <DialogTitle>\n {action === 'approve' ? 'Approve' : 'Reject'} 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.apiName}</p>\n <p><strong>Plan:</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 <TextField\n label=\"Comment (optional)\"\n multiline\n rows={3}\n fullWidth\n margin=\"normal\"\n value={comment}\n onChange={(e) => setComment(e.target.value)}\n />\n </>\n )}\n </DialogContent>\n <DialogActions>\n <Button onClick={onClose}>Cancel</Button>\n <Button\n onClick={handleConfirm}\n color={action === 'approve' ? 'primary' : 'secondary'}\n variant=\"contained\"\n >\n {action === 'approve' ? 'Approve' : 'Reject'}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n\ninterface BulkActionDialogProps {\n open: boolean;\n requests: APIKeyRequest[];\n action: 'approve' | 'reject';\n onClose: () => void;\n onConfirm: (comment: string) => void;\n}\n\nconst BulkActionDialog = ({ open, requests, action, onClose, onConfirm }: BulkActionDialogProps) => {\n const [comment, setComment] = useState('');\n\n // reset comment when dialog closes\n useEffect(() => {\n if (!open) {\n setComment('');\n }\n }, [open]);\n\n const handleConfirm = () => {\n onConfirm(comment);\n onClose();\n };\n\n const isApprove = action === 'approve';\n\n return (\n <Dialog open={open} onClose={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.apiName} ({request.spec.planTier})\n </Typography>\n </Box>\n ))}\n </Box>\n <TextField\n label=\"Comment (optional)\"\n multiline\n fullWidth\n margin=\"normal\"\n value={comment}\n onChange={(e) => setComment(e.target.value)}\n helperText={`This comment will be applied to all ${isApprove ? 'approved' : 'rejected'} requests`}\n />\n </DialogContent>\n <DialogActions>\n <Button onClick={onClose}>Cancel</Button>\n <Button\n onClick={handleConfirm}\n color={isApprove ? 'primary' : 'secondary'}\n variant=\"contained\"\n >\n {isApprove ? 'Approve All' : 'Reject All'}\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 backendUrl = config.getString('backend.baseUrl');\n const [refresh, setRefresh] = useState(0);\n const [selectedTab, setSelectedTab] = useState(0);\n const [selectedRequests, setSelectedRequests] = useState<APIKeyRequest[]>([]);\n const [dialogState, setDialogState] = useState<{\n open: boolean;\n request: APIKeyRequest | null;\n action: 'approve' | 'reject';\n }>({\n open: false,\n request: null,\n action: 'approve',\n });\n const [bulkDialogState, setBulkDialogState] = useState<{\n open: boolean;\n requests: APIKeyRequest[];\n action: 'approve' | 'reject';\n }>({\n open: false,\n requests: [],\n action: 'approve',\n });\n\n const {\n allowed: canUpdateAllRequests,\n loading: updateAllPermissionLoading,\n error: updateAllPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyRequestUpdateAllPermission);\n\n const {\n allowed: canUpdateOwnRequests,\n loading: updateOwnPermissionLoading,\n error: updateOwnPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyRequestUpdateOwnPermission);\n\n const canUpdateRequests = canUpdateAllRequests || canUpdateOwnRequests;\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 const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/requests`\n );\n if (!response.ok) {\n console.log('ApprovalQueueCard: failed to fetch requests, status:', response.status);\n return { pending: [] as APIKeyRequest[], approved: [] as APIKeyRequest[], rejected: [] as APIKeyRequest[], reviewedBy };\n }\n\n // check content-type before parsing json\n const contentType = response.headers.get('content-type');\n if (!contentType || !contentType.includes('application/json')) {\n console.log('ApprovalQueueCard: received non-json response');\n return { pending: [] as APIKeyRequest[], approved: [] as APIKeyRequest[], rejected: [] as APIKeyRequest[], reviewedBy };\n }\n\n const data = await response.json();\n const allRequests = data.items || [];\n\n console.log('ApprovalQueueCard: received', allRequests.length, 'total requests');\n console.log('ApprovalQueueCard: raw requests:', allRequests);\n\n // group by status (field is 'phase' not 'status')\n const pending = allRequests.filter((r: APIKeyRequest) => {\n const phase = (r.status as any)?.phase || 'Pending';\n return phase === 'Pending';\n });\n const approved = allRequests.filter((r: APIKeyRequest) => {\n const phase = (r.status as any)?.phase;\n return phase === 'Approved';\n });\n const rejected = allRequests.filter((r: APIKeyRequest) => {\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 };\n }, [backendUrl, fetchApi, identityApi, refresh]);\n\n const handleApprove = (request: APIKeyRequest) => {\n setDialogState({ open: true, request, action: 'approve' });\n };\n\n const handleReject = (request: APIKeyRequest) => {\n setDialogState({ open: true, request, action: 'reject' });\n };\n\n const handleConfirm = async (comment: string) => {\n if (!dialogState.request || !value) return;\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 comment,\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' });\n setRefresh(r => r + 1);\n } catch (err) {\n console.error(`error ${dialogState.action}ing request:`, err);\n }\n };\n\n const handleBulkApprove = () => {\n if (selectedRequests.length === 0) return;\n setBulkDialogState({ open: true, requests: selectedRequests, action: 'approve' });\n };\n\n const handleBulkReject = () => {\n if (selectedRequests.length === 0) return;\n setBulkDialogState({ open: true, requests: selectedRequests, action: 'reject' });\n };\n\n const handleBulkConfirm = async (comment: string) => {\n if (!value || bulkDialogState.requests.length === 0) return;\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 comment,\n reviewedBy: value.reviewedBy,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`failed to bulk ${bulkDialogState.action} requests`);\n }\n\n setBulkDialogState({ open: false, requests: [], action: 'approve' });\n setSelectedRequests([]);\n setRefresh(r => r + 1);\n } catch (err) {\n console.error(`error bulk ${bulkDialogState.action}ing requests:`, err);\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.apikeyrequest.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<APIKeyRequest>[] = [\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.apiName',\n render: (row) => <Typography variant=\"body2\"><strong>{row.spec.apiName}</strong></Typography>,\n },\n {\n title: 'Namespace',\n field: 'spec.apiNamespace',\n render: (row) => <Typography variant=\"body2\">{row.spec.apiNamespace}</Typography>,\n },\n {\n title: 'Plan',\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: 'spec.requestedAt',\n render: (row) => (\n <Typography variant=\"body2\">\n {row.spec.requestedAt ? formatDate(row.spec.requestedAt) : '-'}\n </Typography>\n ),\n },\n {\n title: 'Actions',\n render: (row) => {\n if (!canUpdateRequests) 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<APIKeyRequest>[] = [\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.apiName',\n render: (row) => <Typography variant=\"body2\"><strong>{row.spec.apiName}</strong></Typography>,\n },\n {\n title: 'Namespace',\n field: 'spec.apiNamespace',\n render: (row) => <Typography variant=\"body2\">{row.spec.apiNamespace}</Typography>,\n },\n {\n title: 'Plan',\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: 'spec.requestedAt',\n render: (row) => (\n <Typography variant=\"body2\">\n {row.spec.requestedAt ? formatDate(row.spec.requestedAt) : '-'}\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<APIKeyRequest>[] = [\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.apiName',\n render: (row) => <Typography variant=\"body2\"><strong>{row.spec.apiName}</strong></Typography>,\n },\n {\n title: 'Namespace',\n field: 'spec.apiNamespace',\n render: (row) => <Typography variant=\"body2\">{row.spec.apiNamespace}</Typography>,\n },\n {\n title: 'Plan',\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: 'spec.requestedAt',\n render: (row) => (\n <Typography variant=\"body2\">\n {row.spec.requestedAt ? formatDate(row.spec.requestedAt) : '-'}\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 title: 'Reason',\n field: 'status.reason',\n render: (row) => {\n if (!row.status?.reason) {\n return <Typography variant=\"body2\">-</Typography>;\n }\n return (\n <Tooltip title={row.status.reason} 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.status.reason}\n </Typography>\n </Tooltip>\n );\n },\n },\n ];\n\n const getTabData = () => {\n const addIds = (data: APIKeyRequest[]) =>\n data.map(item => ({ ...item, id: item.metadata.name }));\n\n switch (selectedTab) {\n case 0:\n return { data: addIds(approved), columns: approvedColumns, showSelection: false };\n case 1:\n // Add tableData.checked to control checkbox state\n const pendingWithSelection = pending.map((row: APIKeyRequest) => {\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 2:\n return { data: addIds(rejected), columns: rejectedColumns, showSelection: false };\n default:\n return { data: addIds(approved), columns: approvedColumns, showSelection: false };\n }\n };\n\n const tabData = getTabData();\n\n // group requests by api product\n const groupByApiProduct = (requests: APIKeyRequest[]) => {\n const grouped = new Map<string, APIKeyRequest[]>();\n requests.forEach(request => {\n const apiName = request.spec.apiName;\n if (!grouped.has(apiName)) {\n grouped.set(apiName, []);\n }\n grouped.get(apiName)!.push(request);\n });\n return grouped;\n };\n\n const groupedData = groupByApiProduct(tabData.data);\n const apiProducts = 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}>\n <Tabs\n value={selectedTab}\n onChange={(_, newValue) => {\n setSelectedTab(newValue);\n setSelectedRequests([]);\n }}\n indicatorColor=\"primary\"\n textColor=\"primary\"\n >\n <Tab label={`Approved (${approved.length})`} />\n <Tab label={`Pending (${pending.length})`} />\n <Tab label={`Rejected (${rejected.length})`} />\n </Tabs>\n </Box>\n\n {canUpdateRequests && selectedTab === 1 && 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 approved requests.'}\n {selectedTab === 1 && 'No pending requests.'}\n {selectedTab === 2 && 'No rejected requests.'}\n </Typography>\n </Box>\n ) : (\n <Box>\n {apiProducts.map(apiName => {\n const requests = groupedData.get(apiName) || [];\n return (\n <Accordion key={apiName} defaultExpanded={apiProducts.length === 1}>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Box display=\"flex\" alignItems=\"center\" justifyContent=\"space-between\" width=\"100%\">\n <Typography variant=\"h6\">{apiName}</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: canUpdateRequests && tabData.showSelection,\n paging: false,\n search: false,\n showTextRowsSelected: false,\n toolbar: 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.spec.apiName !== apiName\n );\n setSelectedRequests([...otherSelections, ...(rows as APIKeyRequest[])]);\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 onClose={() => setDialogState({ open: false, request: null, action: 'approve' })}\n onConfirm={handleConfirm}\n />\n <BulkActionDialog\n open={bulkDialogState.open}\n requests={bulkDialogState.requests}\n action={bulkDialogState.action}\n onClose={() => setBulkDialogState({ open: false, requests: [], action: 'approve' })}\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, useEffect } from 'react';\nimport { useApi, fetchApiRef, identityApiRef, configApiRef } 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 { kuadrantApiKeyRequestUpdateAllPermission, kuadrantApiKeyRequestUpdateOwnPermission } from '../../permissions';\nimport { useKuadrantPermission } from '../../utils/permissions';\nimport {\n Button,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n TextField,\n Chip,\n Typography,\n Box,\n Tabs,\n Tab,\n Tooltip,\n Accordion,\n AccordionSummary,\n AccordionDetails,\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 { APIKeyRequest } from '../../types/api-management';\n\ninterface ApprovalDialogProps {\n open: boolean;\n request: APIKeyRequest | null;\n action: 'approve' | 'reject';\n onClose: () => void;\n onConfirm: (comment: string) => void;\n}\n\nconst ApprovalDialog = ({ open, request, action, onClose, onConfirm }: ApprovalDialogProps) => {\n const [comment, setComment] = useState('');\n\n // reset comment when dialog closes\n useEffect(() => {\n if (!open) {\n setComment('');\n }\n }, [open]);\n\n const handleConfirm = () => {\n onConfirm(comment);\n onClose();\n };\n\n return (\n <Dialog open={open} onClose={onClose} maxWidth=\"sm\" fullWidth>\n <DialogTitle>\n {action === 'approve' ? 'Approve' : 'Reject'} 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.apiName}</p>\n <p><strong>Plan:</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 <TextField\n label=\"Comment (optional)\"\n multiline\n rows={3}\n fullWidth\n margin=\"normal\"\n value={comment}\n onChange={(e) => setComment(e.target.value)}\n />\n </>\n )}\n </DialogContent>\n <DialogActions>\n <Button onClick={onClose}>Cancel</Button>\n <Button\n onClick={handleConfirm}\n color={action === 'approve' ? 'primary' : 'secondary'}\n variant=\"contained\"\n >\n {action === 'approve' ? 'Approve' : 'Reject'}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n\ninterface BulkActionDialogProps {\n open: boolean;\n requests: APIKeyRequest[];\n action: 'approve' | 'reject';\n onClose: () => void;\n onConfirm: (comment: string) => void;\n}\n\nconst BulkActionDialog = ({ open, requests, action, onClose, onConfirm }: BulkActionDialogProps) => {\n const [comment, setComment] = useState('');\n\n // reset comment when dialog closes\n useEffect(() => {\n if (!open) {\n setComment('');\n }\n }, [open]);\n\n const handleConfirm = () => {\n onConfirm(comment);\n onClose();\n };\n\n const isApprove = action === 'approve';\n\n return (\n <Dialog open={open} onClose={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.apiName} ({request.spec.planTier})\n </Typography>\n </Box>\n ))}\n </Box>\n <TextField\n label=\"Comment (optional)\"\n multiline\n fullWidth\n margin=\"normal\"\n value={comment}\n onChange={(e) => setComment(e.target.value)}\n helperText={`This comment will be applied to all ${isApprove ? 'approved' : 'rejected'} requests`}\n />\n </DialogContent>\n <DialogActions>\n <Button onClick={onClose}>Cancel</Button>\n <Button\n onClick={handleConfirm}\n color={isApprove ? 'primary' : 'secondary'}\n variant=\"contained\"\n >\n {isApprove ? 'Approve All' : 'Reject All'}\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 backendUrl = config.getString('backend.baseUrl');\n const [refresh, setRefresh] = useState(0);\n const [selectedTab, setSelectedTab] = useState(0);\n const [selectedRequests, setSelectedRequests] = useState<APIKeyRequest[]>([]);\n const [dialogState, setDialogState] = useState<{\n open: boolean;\n request: APIKeyRequest | null;\n action: 'approve' | 'reject';\n }>({\n open: false,\n request: null,\n action: 'approve',\n });\n const [bulkDialogState, setBulkDialogState] = useState<{\n open: boolean;\n requests: APIKeyRequest[];\n action: 'approve' | 'reject';\n }>({\n open: false,\n requests: [],\n action: 'approve',\n });\n\n const {\n allowed: canUpdateAllRequests,\n loading: updateAllPermissionLoading,\n error: updateAllPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyRequestUpdateAllPermission);\n\n const {\n allowed: canUpdateOwnRequests,\n loading: updateOwnPermissionLoading,\n error: updateOwnPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyRequestUpdateOwnPermission);\n\n const canUpdateRequests = canUpdateAllRequests || canUpdateOwnRequests;\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 const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/requests`\n );\n if (!response.ok) {\n console.log('ApprovalQueueCard: failed to fetch requests, status:', response.status);\n return { pending: [] as APIKeyRequest[], approved: [] as APIKeyRequest[], rejected: [] as APIKeyRequest[], reviewedBy };\n }\n\n // check content-type before parsing json\n const contentType = response.headers.get('content-type');\n if (!contentType || !contentType.includes('application/json')) {\n console.log('ApprovalQueueCard: received non-json response');\n return { pending: [] as APIKeyRequest[], approved: [] as APIKeyRequest[], rejected: [] as APIKeyRequest[], reviewedBy };\n }\n\n const data = await response.json();\n const allRequests = data.items || [];\n\n console.log('ApprovalQueueCard: received', allRequests.length, 'total requests');\n console.log('ApprovalQueueCard: raw requests:', allRequests);\n\n // group by status (field is 'phase' not 'status')\n const pending = allRequests.filter((r: APIKeyRequest) => {\n const phase = (r.status as any)?.phase || 'Pending';\n return phase === 'Pending';\n });\n const approved = allRequests.filter((r: APIKeyRequest) => {\n const phase = (r.status as any)?.phase;\n return phase === 'Approved';\n });\n const rejected = allRequests.filter((r: APIKeyRequest) => {\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 };\n }, [backendUrl, fetchApi, identityApi, refresh]);\n\n const handleApprove = (request: APIKeyRequest) => {\n setDialogState({ open: true, request, action: 'approve' });\n };\n\n const handleReject = (request: APIKeyRequest) => {\n setDialogState({ open: true, request, action: 'reject' });\n };\n\n const handleConfirm = async (comment: string) => {\n if (!dialogState.request || !value) return;\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 comment,\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' });\n setRefresh(r => r + 1);\n } catch (err) {\n console.error(`error ${dialogState.action}ing request:`, err);\n }\n };\n\n const handleBulkApprove = () => {\n if (selectedRequests.length === 0) return;\n setBulkDialogState({ open: true, requests: selectedRequests, action: 'approve' });\n };\n\n const handleBulkReject = () => {\n if (selectedRequests.length === 0) return;\n setBulkDialogState({ open: true, requests: selectedRequests, action: 'reject' });\n };\n\n const handleBulkConfirm = async (comment: string) => {\n if (!value || bulkDialogState.requests.length === 0) return;\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 comment,\n reviewedBy: value.reviewedBy,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`failed to bulk ${bulkDialogState.action} requests`);\n }\n\n setBulkDialogState({ open: false, requests: [], action: 'approve' });\n setSelectedRequests([]);\n setRefresh(r => r + 1);\n } catch (err) {\n console.error(`error bulk ${bulkDialogState.action}ing requests:`, err);\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.apikeyrequest.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<APIKeyRequest>[] = [\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.apiName',\n render: (row) => <Typography variant=\"body2\"><strong>{row.spec.apiName}</strong></Typography>,\n },\n {\n title: 'Namespace',\n field: 'spec.apiNamespace',\n render: (row) => <Typography variant=\"body2\">{row.spec.apiNamespace}</Typography>,\n },\n {\n title: 'Plan',\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: 'spec.requestedAt',\n render: (row) => (\n <Typography variant=\"body2\">\n {row.spec.requestedAt ? formatDate(row.spec.requestedAt) : '-'}\n </Typography>\n ),\n },\n {\n title: 'Actions',\n filtering: false,\n render: (row) => {\n if (!canUpdateRequests) 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<APIKeyRequest>[] = [\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.apiName',\n render: (row) => <Typography variant=\"body2\"><strong>{row.spec.apiName}</strong></Typography>,\n },\n {\n title: 'Namespace',\n field: 'spec.apiNamespace',\n render: (row) => <Typography variant=\"body2\">{row.spec.apiNamespace}</Typography>,\n },\n {\n title: 'Plan',\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: 'spec.requestedAt',\n render: (row) => (\n <Typography variant=\"body2\">\n {row.spec.requestedAt ? formatDate(row.spec.requestedAt) : '-'}\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<APIKeyRequest>[] = [\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.apiName',\n render: (row) => <Typography variant=\"body2\"><strong>{row.spec.apiName}</strong></Typography>,\n },\n {\n title: 'Namespace',\n field: 'spec.apiNamespace',\n render: (row) => <Typography variant=\"body2\">{row.spec.apiNamespace}</Typography>,\n },\n {\n title: 'Plan',\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: 'spec.requestedAt',\n render: (row) => (\n <Typography variant=\"body2\">\n {row.spec.requestedAt ? formatDate(row.spec.requestedAt) : '-'}\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 title: 'Reason',\n field: 'status.reason',\n render: (row) => {\n if (!row.status?.reason) {\n return <Typography variant=\"body2\">-</Typography>;\n }\n return (\n <Tooltip title={row.status.reason} 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.status.reason}\n </Typography>\n </Tooltip>\n );\n },\n },\n ];\n\n const getTabData = () => {\n const addIds = (data: APIKeyRequest[]) =>\n data.map(item => ({ ...item, id: item.metadata.name }));\n\n switch (selectedTab) {\n case 0:\n return { data: addIds(approved), columns: approvedColumns, showSelection: false };\n case 1:\n // Add tableData.checked to control checkbox state\n const pendingWithSelection = pending.map((row: APIKeyRequest) => {\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 2:\n return { data: addIds(rejected), columns: rejectedColumns, showSelection: false };\n default:\n return { data: addIds(approved), columns: approvedColumns, showSelection: false };\n }\n };\n\n const tabData = getTabData();\n\n // group requests by api product\n const groupByApiProduct = (requests: APIKeyRequest[]) => {\n const grouped = new Map<string, APIKeyRequest[]>();\n requests.forEach(request => {\n const apiName = request.spec.apiName;\n if (!grouped.has(apiName)) {\n grouped.set(apiName, []);\n }\n grouped.get(apiName)!.push(request);\n });\n return grouped;\n };\n\n const groupedData = groupByApiProduct(tabData.data);\n const apiProducts = 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}>\n <Tabs\n value={selectedTab}\n onChange={(_, newValue) => {\n setSelectedTab(newValue);\n setSelectedRequests([]);\n }}\n indicatorColor=\"primary\"\n textColor=\"primary\"\n >\n <Tab label={`Approved (${approved.length})`} />\n <Tab label={`Pending (${pending.length})`} />\n <Tab label={`Rejected (${rejected.length})`} />\n </Tabs>\n </Box>\n\n {canUpdateRequests && selectedTab === 1 && 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 approved requests.'}\n {selectedTab === 1 && 'No pending requests.'}\n {selectedTab === 2 && 'No rejected requests.'}\n </Typography>\n </Box>\n ) : (\n <Box>\n {apiProducts.map(apiName => {\n const requests = groupedData.get(apiName) || [];\n return (\n <Accordion key={apiName} defaultExpanded={apiProducts.length === 1}>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Box display=\"flex\" alignItems=\"center\" justifyContent=\"space-between\" width=\"100%\">\n <Typography variant=\"h6\">{apiName}</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: canUpdateRequests && 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.spec.apiName !== apiName\n );\n setSelectedRequests([...otherSelections, ...(rows as APIKeyRequest[])]);\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 onClose={() => setDialogState({ open: false, request: null, action: 'approve' })}\n onConfirm={handleConfirm}\n />\n <BulkActionDialog\n open={bulkDialogState.open}\n requests={bulkDialogState.requests}\n action={bulkDialogState.action}\n onClose={() => setBulkDialogState({ open: false, requests: [], action: 'approve' })}\n onConfirm={handleBulkConfirm}\n />\n </>\n );\n};\n"],"names":["pending","approved","rejected"],"mappings":"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"}
|
|
@@ -124,8 +124,20 @@ const ResourceList = () => {
|
|
|
124
124
|
const columns = [
|
|
125
125
|
{
|
|
126
126
|
title: "Name",
|
|
127
|
-
field: "
|
|
128
|
-
render: (row) =>
|
|
127
|
+
field: "spec.displayName",
|
|
128
|
+
render: (row) => {
|
|
129
|
+
const publishStatus = row.spec?.publishStatus;
|
|
130
|
+
const isPublished = publishStatus === "Published";
|
|
131
|
+
const displayName = row.spec?.displayName ?? row.metadata.name;
|
|
132
|
+
if (isPublished) {
|
|
133
|
+
return /* @__PURE__ */ React.createElement(Link, { to: `/catalog/default/api/${row.metadata.name}/api-product` }, /* @__PURE__ */ React.createElement("strong", null, displayName));
|
|
134
|
+
}
|
|
135
|
+
return /* @__PURE__ */ React.createElement("span", { className: "text-muted" }, /* @__PURE__ */ React.createElement("strong", null, displayName));
|
|
136
|
+
},
|
|
137
|
+
customFilterAndSearch: (term, row) => {
|
|
138
|
+
const displayName = row.spec?.displayName || row.metadata.name || "";
|
|
139
|
+
return displayName.toLowerCase().includes(term.toLowerCase());
|
|
140
|
+
}
|
|
129
141
|
},
|
|
130
142
|
{
|
|
131
143
|
title: "Resource Name",
|
|
@@ -183,6 +195,7 @@ const ResourceList = () => {
|
|
|
183
195
|
{
|
|
184
196
|
title: "Actions",
|
|
185
197
|
field: "actions",
|
|
198
|
+
filtering: false,
|
|
186
199
|
render: (row) => /* @__PURE__ */ React.createElement(Box, { display: "flex", style: { gap: 4 } }, canUpdateApiProduct && /* @__PURE__ */ React.createElement(
|
|
187
200
|
IconButton,
|
|
188
201
|
{
|
|
@@ -220,7 +233,15 @@ const ResourceList = () => {
|
|
|
220
233
|
return /* @__PURE__ */ React.createElement(
|
|
221
234
|
Table,
|
|
222
235
|
{
|
|
223
|
-
options: {
|
|
236
|
+
options: {
|
|
237
|
+
paging: resources.length > 5,
|
|
238
|
+
pageSize: 20,
|
|
239
|
+
search: true,
|
|
240
|
+
filtering: true,
|
|
241
|
+
debounceInterval: 300,
|
|
242
|
+
toolbar: true,
|
|
243
|
+
emptyRowsWhenPaging: false
|
|
244
|
+
},
|
|
224
245
|
columns,
|
|
225
246
|
data: resources
|
|
226
247
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KuadrantPage.esm.js","sources":["../../../src/components/KuadrantPage/KuadrantPage.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { Typography, Grid, Box, Chip, Button, IconButton, Dialog, DialogTitle, DialogContent, DialogContentText, DialogActions } from '@material-ui/core';\nimport AddIcon from '@material-ui/icons/Add';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport EditIcon from '@material-ui/icons/Edit';\nimport {\n InfoCard,\n Header,\n Page,\n Content,\n SupportButton,\n Progress,\n ResponseErrorPanel,\n Link,\n Table,\n TableColumn,\n} from '@backstage/core-components';\nimport useAsync from 'react-use/lib/useAsync';\nimport { useApi, configApiRef, fetchApiRef } from '@backstage/core-plugin-api';\nimport { ApprovalQueueCard } from '../ApprovalQueueCard';\nimport { MyApiKeysCard } from '../MyApiKeysCard';\nimport { PermissionGate } from '../PermissionGate';\nimport { CreateAPIProductDialog } from '../CreateAPIProductDialog';\nimport {\n kuadrantApiProductCreatePermission,\n kuadrantApiProductDeleteOwnPermission,\n kuadrantApiProductDeleteAllPermission,\n kuadrantApiProductUpdateOwnPermission,\n kuadrantApiProductUpdateAllPermission,\n kuadrantApiProductListPermission,\n kuadrantApiKeyRequestReadAllPermission,\n kuadrantApiKeyRequestReadOwnPermission,\n kuadrantPlanPolicyListPermission,\n} from '../../permissions';\nimport { useKuadrantPermission } from '../../utils/permissions';\nimport { EditAPIProductDialog } from '../EditAPIProductDialog';\n\ntype KuadrantResource = {\n metadata: {\n name: string;\n namespace: string;\n creationTimestamp: string;\n };\n spec?: any;\n};\n\ntype KuadrantList = {\n items: KuadrantResource[];\n};\n\nexport const ResourceList = () => {\n const config = useApi(configApiRef);\n const fetchApi = useApi(fetchApiRef);\n const backendUrl = config.getString('backend.baseUrl');\n const [createDialogOpen, setCreateDialogOpen] = useState(false);\n const [editDialogOpen, setEditDialogOpen] = useState(false);\n const [refreshTrigger, setRefreshTrigger] = useState(0);\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);\n const [apiProductToDelete, setApiProductToDelete] = useState<{ namespace: string; name: string } | null>(null);\n const [apiProductToEdit, setApiProductToEdit] = useState<{ namespace: string; name: string } | null>(null);\n const [deleting, setDeleting] = useState(false);\n\n const {\n allowed: canCreateApiProduct,\n loading: createPermissionLoading,\n error: createPermissionError,\n } = useKuadrantPermission(kuadrantApiProductCreatePermission);\n\n const {\n allowed: canViewAllRequests,\n loading: approvalQueueAllPermissionLoading,\n } = useKuadrantPermission(kuadrantApiKeyRequestReadAllPermission);\n\n const {\n allowed: canViewOwnRequests,\n loading: approvalQueueOwnPermissionLoading,\n error: approvalQueuePermissionError,\n } = useKuadrantPermission(kuadrantApiKeyRequestReadOwnPermission);\n\n const canViewApprovalQueue = canViewAllRequests || canViewOwnRequests;\n const approvalQueuePermissionLoading = approvalQueueAllPermissionLoading || approvalQueueOwnPermissionLoading;\n\n const {\n allowed: canDeleteOwnApiProduct,\n loading: deleteOwnPermissionLoading,\n } = useKuadrantPermission(kuadrantApiProductDeleteOwnPermission);\n\n const {\n allowed: canDeleteAllApiProducts,\n loading: deleteAllPermissionLoading,\n error: deletePermissionError,\n } = useKuadrantPermission(kuadrantApiProductDeleteAllPermission);\n\n const {\n allowed: canUpdateOwnApiProduct,\n } = useKuadrantPermission(kuadrantApiProductUpdateOwnPermission);\n\n const {\n allowed: canUpdateAllApiProducts,\n } = useKuadrantPermission(kuadrantApiProductUpdateAllPermission);\n\n const canDeleteApiProduct = canDeleteOwnApiProduct || canDeleteAllApiProducts;\n const canUpdateApiProduct = canUpdateOwnApiProduct || canUpdateAllApiProducts;\n const deletePermissionLoading = deleteOwnPermissionLoading || deleteAllPermissionLoading;\n\n const {\n allowed: canListPlanPolicies,\n loading: planPolicyPermissionLoading,\n error: planPolicyPermissionError,\n } = useKuadrantPermission(kuadrantPlanPolicyListPermission);\n\n const { value: apiProducts, loading: apiProductsLoading, error: apiProductsError } = useAsync(async (): Promise<KuadrantList> => {\n const response = await fetchApi.fetch(`${backendUrl}/api/kuadrant/apiproducts`);\n return await response.json();\n }, [backendUrl, fetchApi, refreshTrigger]);\n\n const { value: planPolicies, loading: planPoliciesLoading, error: planPoliciesError } = useAsync(async (): Promise<KuadrantList> => {\n const response = await fetchApi.fetch(`${backendUrl}/api/kuadrant/planpolicies`);\n return await response.json();\n }, [backendUrl, fetchApi, refreshTrigger]);\n\n const loading = apiProductsLoading || planPoliciesLoading || createPermissionLoading || approvalQueuePermissionLoading || deletePermissionLoading || planPolicyPermissionLoading;\n const error = apiProductsError || planPoliciesError;\n const permissionError = createPermissionError || approvalQueuePermissionError || deletePermissionError || planPolicyPermissionError;\n\n const handleCreateSuccess = () => {\n setRefreshTrigger(prev => prev + 1);\n };\n\n const handleEditClick = (namespace: string, name: string) => {\n setApiProductToEdit({ namespace, name });\n setEditDialogOpen(true);\n };\n\n const handleEditSuccess = () => {\n setRefreshTrigger(prev => prev + 1);\n };\n\n const handleDeleteClick = (namespace: string, name: string) => {\n setApiProductToDelete({ namespace, name });\n setDeleteDialogOpen(true);\n };\n\n const handleDeleteConfirm = async () => {\n if (!apiProductToDelete) return;\n\n setDeleting(true);\n try {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/apiproducts/${apiProductToDelete.namespace}/${apiProductToDelete.name}`,\n { method: 'DELETE' }\n );\n\n if (!response.ok) {\n throw new Error('failed to delete apiproduct');\n }\n\n setRefreshTrigger(prev => prev + 1);\n } catch (err) {\n console.error('error deleting apiproduct:', err);\n } finally {\n setDeleting(false);\n setDeleteDialogOpen(false);\n setApiProductToDelete(null);\n }\n };\n\n const handleDeleteCancel = () => {\n setDeleteDialogOpen(false);\n setApiProductToDelete(null);\n };\n\n const 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[] = [\n {\n title: 'Name',\n field: 'name',\n render: (row: any) => (\n <Link to={`/catalog/default/api/${row.metadata.name}/api-product`}>\n <strong>{row.spec?.displayName || row.metadata.name}</strong>\n </Link>\n ),\n },\n {\n title: 'Resource Name',\n field: 'metadata.name',\n },\n {\n title: 'Version',\n field: 'spec.version',\n render: (row: any) => row.spec?.version || '-',\n },\n {\n title: 'HTTPRoute',\n field: 'spec.targetRef.name',\n render: (row: any) => row.spec?.targetRef?.name || '-',\n },\n {\n title: 'Publish Status',\n field: 'spec.publishStatus',\n render: (row: any) => {\n const status = row.spec?.publishStatus || 'Draft';\n return (\n <Chip\n label={status}\n size=\"small\"\n color={status === 'Published' ? 'primary' : 'default'}\n />\n );\n },\n },\n {\n title: 'Approval Mode',\n field: 'spec.approvalMode',\n render: (row: any) => {\n const mode = row.spec?.approvalMode || 'manual';\n return (\n <Chip\n label={mode}\n size=\"small\"\n color={mode === 'automatic' ? 'secondary' : 'default'}\n />\n );\n },\n },\n {\n title: 'Namespace',\n field: 'metadata.namespace',\n },\n {\n title: 'Created',\n field: 'metadata.creationTimestamp',\n render: (row: any) => formatDate(row.metadata.creationTimestamp),\n },\n {\n title: 'Actions',\n field: 'actions',\n render: (row: any) => (\n <Box display=\"flex\" style={{ gap: 4 }}>\n {canUpdateApiProduct && (\n <IconButton\n size=\"small\"\n onClick={() => handleEditClick(row.metadata.namespace, row.metadata.name)}\n title=\"Edit API Product\"\n >\n <EditIcon fontSize=\"small\" />\n </IconButton>\n )}\n \n {canDeleteApiProduct && (\n <IconButton\n size=\"small\"\n onClick={() => handleDeleteClick(row.metadata.namespace, row.metadata.name)}\n title=\"Delete API Product\"\n >\n <DeleteIcon fontSize=\"small\" />\n </IconButton>\n )}\n </Box>\n ),\n },\n ];\n\n const planPolicyColumns: TableColumn[] = [\n {\n title: 'Name',\n field: 'metadata.name',\n render: (row: any) => (\n <Link to={`/kuadrant/planpolicy/${row.metadata.namespace}/${row.metadata.name}`}>\n <strong>{row.metadata.name}</strong>\n </Link>\n ),\n },\n {\n title: 'Namespace',\n field: 'metadata.namespace',\n },\n ];\n\n const renderResources = (resources: KuadrantResource[] | undefined) => {\n if (!resources || resources.length === 0) {\n return <Typography variant=\"body2\" color=\"textSecondary\">No API products found</Typography>;\n }\n return (\n <Table\n options={{ paging: false, search: false, toolbar: false }}\n columns={columns}\n data={resources}\n />\n );\n };\n\n const renderPlanPolicies = (resources: KuadrantResource[] | undefined) => {\n if (!resources || resources.length === 0) {\n return <Typography variant=\"body2\" color=\"textSecondary\">No plan policies found</Typography>;\n }\n return (\n <Table\n options={{ paging: false, search: false, toolbar: false }}\n columns={planPolicyColumns}\n data={resources}\n />\n );\n };\n\n return (\n <Page themeId=\"tool\">\n <Header title=\"Kuadrant\" subtitle=\"API management for Kubernetes\">\n <SupportButton>Manage API products and access requests</SupportButton>\n </Header>\n <Content>\n {loading && <Progress />}\n {error && <ResponseErrorPanel error={error} />}\n {permissionError && (\n <Box p={2}>\n <Typography color=\"error\">\n unable to check permissions: {permissionError.message}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n permission: {createPermissionError ? 'kuadrant.apiproduct.create' :\n deletePermissionError ? 'kuadrant.apiproduct.delete' :\n approvalQueuePermissionError ? 'kuadrant.apikeyrequest.read.all' :\n planPolicyPermissionError ? 'kuadrant.planpolicy.list' : 'unknown'}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n please try again or contact your administrator\n </Typography>\n </Box>\n )}\n {!loading && !error && !permissionError && (\n <Grid container spacing={3} direction=\"column\">\n <Grid item>\n <MyApiKeysCard />\n </Grid>\n\n <Grid item>\n <InfoCard\n title=\"API Products\"\n action={\n canCreateApiProduct ? (\n <Box display=\"flex\" alignItems=\"center\" height=\"100%\" mt={1}>\n <Button\n variant=\"contained\"\n color=\"primary\"\n size=\"small\"\n startIcon={<AddIcon />}\n onClick={() => setCreateDialogOpen(true)}\n >\n Create API Product\n </Button>\n </Box>\n ) : undefined\n }\n >\n {renderResources(apiProducts?.items)}\n </InfoCard>\n </Grid>\n\n {canListPlanPolicies && (\n <Grid item>\n <InfoCard title=\"Plan Policies\">\n {renderPlanPolicies(planPolicies?.items)}\n </InfoCard>\n </Grid>\n )}\n\n {canViewApprovalQueue && (\n <Grid item>\n <ApprovalQueueCard />\n </Grid>\n )}\n </Grid>\n )}\n <CreateAPIProductDialog\n open={createDialogOpen}\n onClose={() => setCreateDialogOpen(false)}\n onSuccess={handleCreateSuccess}\n />\n <EditAPIProductDialog\n open={editDialogOpen}\n onClose={() => setEditDialogOpen(false)}\n onSuccess={handleEditSuccess}\n namespace={apiProductToEdit?.namespace || ''}\n name={apiProductToEdit?.name || ''}\n />\n <Dialog open={deleteDialogOpen} onClose={handleDeleteCancel}>\n <DialogTitle>Delete API Product</DialogTitle>\n <DialogContent>\n <DialogContentText>\n Are you sure you want to delete {apiProductToDelete?.name} from namespace {apiProductToDelete?.namespace}?\n This will permanently remove the API Product from Kubernetes.\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button onClick={handleDeleteCancel} color=\"primary\">\n Cancel\n </Button>\n <Button onClick={handleDeleteConfirm} color=\"secondary\" disabled={deleting}>\n {deleting ? 'Deleting...' : 'Delete'}\n </Button>\n </DialogActions>\n </Dialog>\n </Content>\n </Page>\n );\n};\n\nexport const KuadrantPage = () => {\n return (\n <PermissionGate\n permission={kuadrantApiProductListPermission}\n errorMessage=\"you don't have permission to view the Kuadrant page\"\n >\n <ResourceList />\n </PermissionGate>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"KuadrantPage.esm.js","sources":["../../../src/components/KuadrantPage/KuadrantPage.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { Typography, Grid, Box, Chip, Button, IconButton, Dialog, DialogTitle, DialogContent, DialogContentText, DialogActions } from '@material-ui/core';\nimport AddIcon from '@material-ui/icons/Add';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport EditIcon from '@material-ui/icons/Edit';\nimport {\n InfoCard,\n Header,\n Page,\n Content,\n SupportButton,\n Progress,\n ResponseErrorPanel,\n Link,\n Table,\n TableColumn,\n} from '@backstage/core-components';\nimport useAsync from 'react-use/lib/useAsync';\nimport { useApi, configApiRef, fetchApiRef } from '@backstage/core-plugin-api';\nimport { ApprovalQueueCard } from '../ApprovalQueueCard';\nimport { MyApiKeysCard } from '../MyApiKeysCard';\nimport { PermissionGate } from '../PermissionGate';\nimport { CreateAPIProductDialog } from '../CreateAPIProductDialog';\nimport {\n kuadrantApiProductCreatePermission,\n kuadrantApiProductDeleteOwnPermission,\n kuadrantApiProductDeleteAllPermission,\n kuadrantApiProductUpdateOwnPermission,\n kuadrantApiProductUpdateAllPermission,\n kuadrantApiProductListPermission,\n kuadrantApiKeyRequestReadAllPermission,\n kuadrantApiKeyRequestReadOwnPermission,\n kuadrantPlanPolicyListPermission,\n} from '../../permissions';\nimport { useKuadrantPermission } from '../../utils/permissions';\nimport { EditAPIProductDialog } from '../EditAPIProductDialog';\n\ntype KuadrantResource = {\n metadata: {\n name: string;\n namespace: string;\n creationTimestamp: string;\n };\n spec?: any;\n};\n\ntype KuadrantList = {\n items: KuadrantResource[];\n};\n\nexport const ResourceList = () => {\n const config = useApi(configApiRef);\n const fetchApi = useApi(fetchApiRef);\n const backendUrl = config.getString('backend.baseUrl');\n const [createDialogOpen, setCreateDialogOpen] = useState(false);\n const [editDialogOpen, setEditDialogOpen] = useState(false);\n const [refreshTrigger, setRefreshTrigger] = useState(0);\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);\n const [apiProductToDelete, setApiProductToDelete] = useState<{ namespace: string; name: string } | null>(null);\n const [apiProductToEdit, setApiProductToEdit] = useState<{ namespace: string; name: string } | null>(null);\n const [deleting, setDeleting] = useState(false);\n\n const {\n allowed: canCreateApiProduct,\n loading: createPermissionLoading,\n error: createPermissionError,\n } = useKuadrantPermission(kuadrantApiProductCreatePermission);\n\n const {\n allowed: canViewAllRequests,\n loading: approvalQueueAllPermissionLoading,\n } = useKuadrantPermission(kuadrantApiKeyRequestReadAllPermission);\n\n const {\n allowed: canViewOwnRequests,\n loading: approvalQueueOwnPermissionLoading,\n error: approvalQueuePermissionError,\n } = useKuadrantPermission(kuadrantApiKeyRequestReadOwnPermission);\n\n const canViewApprovalQueue = canViewAllRequests || canViewOwnRequests;\n const approvalQueuePermissionLoading = approvalQueueAllPermissionLoading || approvalQueueOwnPermissionLoading;\n\n const {\n allowed: canDeleteOwnApiProduct,\n loading: deleteOwnPermissionLoading,\n } = useKuadrantPermission(kuadrantApiProductDeleteOwnPermission);\n\n const {\n allowed: canDeleteAllApiProducts,\n loading: deleteAllPermissionLoading,\n error: deletePermissionError,\n } = useKuadrantPermission(kuadrantApiProductDeleteAllPermission);\n\n const {\n allowed: canUpdateOwnApiProduct,\n } = useKuadrantPermission(kuadrantApiProductUpdateOwnPermission);\n\n const {\n allowed: canUpdateAllApiProducts,\n } = useKuadrantPermission(kuadrantApiProductUpdateAllPermission);\n\n const canDeleteApiProduct = canDeleteOwnApiProduct || canDeleteAllApiProducts;\n const canUpdateApiProduct = canUpdateOwnApiProduct || canUpdateAllApiProducts;\n const deletePermissionLoading = deleteOwnPermissionLoading || deleteAllPermissionLoading;\n\n const {\n allowed: canListPlanPolicies,\n loading: planPolicyPermissionLoading,\n error: planPolicyPermissionError,\n } = useKuadrantPermission(kuadrantPlanPolicyListPermission);\n\n const { value: apiProducts, loading: apiProductsLoading, error: apiProductsError } = useAsync(async (): Promise<KuadrantList> => {\n const response = await fetchApi.fetch(`${backendUrl}/api/kuadrant/apiproducts`);\n return await response.json();\n }, [backendUrl, fetchApi, refreshTrigger]);\n\n const { value: planPolicies, loading: planPoliciesLoading, error: planPoliciesError } = useAsync(async (): Promise<KuadrantList> => {\n const response = await fetchApi.fetch(`${backendUrl}/api/kuadrant/planpolicies`);\n return await response.json();\n }, [backendUrl, fetchApi, refreshTrigger]);\n\n const loading = apiProductsLoading || planPoliciesLoading || createPermissionLoading || approvalQueuePermissionLoading || deletePermissionLoading || planPolicyPermissionLoading;\n const error = apiProductsError || planPoliciesError;\n const permissionError = createPermissionError || approvalQueuePermissionError || deletePermissionError || planPolicyPermissionError;\n\n const handleCreateSuccess = () => {\n setRefreshTrigger(prev => prev + 1);\n };\n\n const handleEditClick = (namespace: string, name: string) => {\n setApiProductToEdit({ namespace, name });\n setEditDialogOpen(true);\n };\n\n const handleEditSuccess = () => {\n setRefreshTrigger(prev => prev + 1);\n };\n\n const handleDeleteClick = (namespace: string, name: string) => {\n setApiProductToDelete({ namespace, name });\n setDeleteDialogOpen(true);\n };\n\n const handleDeleteConfirm = async () => {\n if (!apiProductToDelete) return;\n\n setDeleting(true);\n try {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/apiproducts/${apiProductToDelete.namespace}/${apiProductToDelete.name}`,\n { method: 'DELETE' }\n );\n\n if (!response.ok) {\n throw new Error('failed to delete apiproduct');\n }\n\n setRefreshTrigger(prev => prev + 1);\n } catch (err) {\n console.error('error deleting apiproduct:', err);\n } finally {\n setDeleting(false);\n setDeleteDialogOpen(false);\n setApiProductToDelete(null);\n }\n };\n\n const handleDeleteCancel = () => {\n setDeleteDialogOpen(false);\n setApiProductToDelete(null);\n };\n\n const 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[] = [\n {\n title: 'Name',\n field: 'spec.displayName',\n render: (row: any) => {\n const publishStatus = row.spec?.publishStatus;\n const isPublished = publishStatus === 'Published';\n const displayName = row.spec?.displayName ?? row.metadata.name;\n\n if (isPublished) {\n return (\n <Link to={`/catalog/default/api/${row.metadata.name}/api-product`}>\n <strong>{displayName}</strong>\n </Link>\n );\n }\n\n return (\n <span className=\"text-muted\">\n <strong>{displayName}</strong>\n </span>\n );\n },\n customFilterAndSearch: (term, row: any) => {\n const displayName = row.spec?.displayName || row.metadata.name || '';\n return displayName.toLowerCase().includes(term.toLowerCase());\n },\n },\n {\n title: 'Resource Name',\n field: 'metadata.name',\n },\n {\n title: 'Version',\n field: 'spec.version',\n render: (row: any) => row.spec?.version || '-',\n },\n {\n title: 'HTTPRoute',\n field: 'spec.targetRef.name',\n render: (row: any) => row.spec?.targetRef?.name || '-',\n },\n {\n title: 'Publish Status',\n field: 'spec.publishStatus',\n render: (row: any) => {\n const status = row.spec?.publishStatus || 'Draft';\n return (\n <Chip\n label={status}\n size=\"small\"\n color={status === 'Published' ? 'primary' : 'default'}\n />\n );\n },\n },\n {\n title: 'Approval Mode',\n field: 'spec.approvalMode',\n render: (row: any) => {\n const mode = row.spec?.approvalMode || 'manual';\n return (\n <Chip\n label={mode}\n size=\"small\"\n color={mode === 'automatic' ? 'secondary' : 'default'}\n />\n );\n },\n },\n {\n title: 'Namespace',\n field: 'metadata.namespace',\n },\n {\n title: 'Created',\n field: 'metadata.creationTimestamp',\n render: (row: any) => formatDate(row.metadata.creationTimestamp),\n },\n {\n title: 'Actions',\n field: 'actions',\n filtering: false,\n render: (row: any) => (\n <Box display=\"flex\" style={{ gap: 4 }}>\n {canUpdateApiProduct && (\n <IconButton\n size=\"small\"\n onClick={() => handleEditClick(row.metadata.namespace, row.metadata.name)}\n title=\"Edit API Product\"\n >\n <EditIcon fontSize=\"small\" />\n </IconButton>\n )}\n\n {canDeleteApiProduct && (\n <IconButton\n size=\"small\"\n onClick={() => handleDeleteClick(row.metadata.namespace, row.metadata.name)}\n title=\"Delete API Product\"\n >\n <DeleteIcon fontSize=\"small\" />\n </IconButton>\n )}\n </Box>\n ),\n },\n ];\n\n const planPolicyColumns: TableColumn[] = [\n {\n title: 'Name',\n field: 'metadata.name',\n render: (row: any) => (\n <Link to={`/kuadrant/planpolicy/${row.metadata.namespace}/${row.metadata.name}`}>\n <strong>{row.metadata.name}</strong>\n </Link>\n ),\n },\n {\n title: 'Namespace',\n field: 'metadata.namespace',\n },\n ];\n\n const renderResources = (resources: KuadrantResource[] | undefined) => {\n if (!resources || resources.length === 0) {\n return <Typography variant=\"body2\" color=\"textSecondary\">No API products found</Typography>;\n }\n return (\n <Table\n options={{\n paging: resources.length > 5,\n pageSize: 20,\n search: true,\n filtering: true,\n debounceInterval: 300,\n toolbar: true,\n emptyRowsWhenPaging: false,\n }}\n columns={columns}\n data={resources}\n />\n );\n };\n\n const renderPlanPolicies = (resources: KuadrantResource[] | undefined) => {\n if (!resources || resources.length === 0) {\n return <Typography variant=\"body2\" color=\"textSecondary\">No plan policies found</Typography>;\n }\n return (\n <Table\n options={{ paging: false, search: false, toolbar: false }}\n columns={planPolicyColumns}\n data={resources}\n />\n );\n };\n\n return (\n <Page themeId=\"tool\">\n <Header title=\"Kuadrant\" subtitle=\"API management for Kubernetes\">\n <SupportButton>Manage API products and access requests</SupportButton>\n </Header>\n <Content>\n {loading && <Progress />}\n {error && <ResponseErrorPanel error={error} />}\n {permissionError && (\n <Box p={2}>\n <Typography color=\"error\">\n unable to check permissions: {permissionError.message}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n permission: {createPermissionError ? 'kuadrant.apiproduct.create' :\n deletePermissionError ? 'kuadrant.apiproduct.delete' :\n approvalQueuePermissionError ? 'kuadrant.apikeyrequest.read.all' :\n planPolicyPermissionError ? 'kuadrant.planpolicy.list' : 'unknown'}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n please try again or contact your administrator\n </Typography>\n </Box>\n )}\n {!loading && !error && !permissionError && (\n <Grid container spacing={3} direction=\"column\">\n <Grid item>\n <MyApiKeysCard />\n </Grid>\n\n <Grid item>\n <InfoCard\n title=\"API Products\"\n action={\n canCreateApiProduct ? (\n <Box display=\"flex\" alignItems=\"center\" height=\"100%\" mt={1}>\n <Button\n variant=\"contained\"\n color=\"primary\"\n size=\"small\"\n startIcon={<AddIcon />}\n onClick={() => setCreateDialogOpen(true)}\n >\n Create API Product\n </Button>\n </Box>\n ) : undefined\n }\n >\n {renderResources(apiProducts?.items)}\n </InfoCard>\n </Grid>\n\n {canListPlanPolicies && (\n <Grid item>\n <InfoCard title=\"Plan Policies\">\n {renderPlanPolicies(planPolicies?.items)}\n </InfoCard>\n </Grid>\n )}\n\n {canViewApprovalQueue && (\n <Grid item>\n <ApprovalQueueCard />\n </Grid>\n )}\n </Grid>\n )}\n <CreateAPIProductDialog\n open={createDialogOpen}\n onClose={() => setCreateDialogOpen(false)}\n onSuccess={handleCreateSuccess}\n />\n <EditAPIProductDialog\n open={editDialogOpen}\n onClose={() => setEditDialogOpen(false)}\n onSuccess={handleEditSuccess}\n namespace={apiProductToEdit?.namespace || ''}\n name={apiProductToEdit?.name || ''}\n />\n <Dialog open={deleteDialogOpen} onClose={handleDeleteCancel}>\n <DialogTitle>Delete API Product</DialogTitle>\n <DialogContent>\n <DialogContentText>\n Are you sure you want to delete {apiProductToDelete?.name} from namespace {apiProductToDelete?.namespace}?\n This will permanently remove the API Product from Kubernetes.\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button onClick={handleDeleteCancel} color=\"primary\">\n Cancel\n </Button>\n <Button onClick={handleDeleteConfirm} color=\"secondary\" disabled={deleting}>\n {deleting ? 'Deleting...' : 'Delete'}\n </Button>\n </DialogActions>\n </Dialog>\n </Content>\n </Page>\n );\n};\n\nexport const KuadrantPage = () => {\n return (\n <PermissionGate\n permission={kuadrantApiProductListPermission}\n errorMessage=\"you don't have permission to view the Kuadrant page\"\n >\n <ResourceList />\n </PermissionGate>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -154,6 +154,7 @@ const MyApiKeysCard = () => {
|
|
|
154
154
|
},
|
|
155
155
|
{
|
|
156
156
|
title: "Reason",
|
|
157
|
+
field: "status.reason",
|
|
157
158
|
render: (row) => {
|
|
158
159
|
if (row.status?.reason) {
|
|
159
160
|
const color = row.status.phase === "Rejected" ? "error" : "textPrimary";
|
|
@@ -177,6 +178,7 @@ const MyApiKeysCard = () => {
|
|
|
177
178
|
},
|
|
178
179
|
{
|
|
179
180
|
title: "Reviewed By",
|
|
181
|
+
field: "status.reviewedBy",
|
|
180
182
|
render: (row) => {
|
|
181
183
|
if ((row.status?.phase === "Approved" || row.status?.phase === "Rejected") && row.status.reviewedBy) {
|
|
182
184
|
const reviewedDate = row.status.reviewedAt ? new Date(row.status.reviewedAt).toLocaleDateString() : "";
|
|
@@ -187,6 +189,8 @@ const MyApiKeysCard = () => {
|
|
|
187
189
|
},
|
|
188
190
|
{
|
|
189
191
|
title: "API Key",
|
|
192
|
+
field: "status.apiKey",
|
|
193
|
+
filtering: false,
|
|
190
194
|
render: (row) => {
|
|
191
195
|
if (row.status?.phase === "Approved" && row.status.apiKey) {
|
|
192
196
|
const isVisible = visibleKeys.has(row.metadata.name);
|
|
@@ -215,6 +219,7 @@ const MyApiKeysCard = () => {
|
|
|
215
219
|
},
|
|
216
220
|
{
|
|
217
221
|
title: "",
|
|
222
|
+
filtering: false,
|
|
218
223
|
render: (row) => {
|
|
219
224
|
return /* @__PURE__ */ React.createElement(
|
|
220
225
|
IconButton,
|
|
@@ -285,10 +290,13 @@ const MyApiKeysCard = () => {
|
|
|
285
290
|
Table,
|
|
286
291
|
{
|
|
287
292
|
options: {
|
|
288
|
-
paging: tabData.length >
|
|
289
|
-
pageSize:
|
|
290
|
-
search:
|
|
291
|
-
|
|
293
|
+
paging: tabData.length > 5,
|
|
294
|
+
pageSize: 20,
|
|
295
|
+
search: true,
|
|
296
|
+
filtering: true,
|
|
297
|
+
debounceInterval: 300,
|
|
298
|
+
toolbar: true,
|
|
299
|
+
emptyRowsWhenPaging: false
|
|
292
300
|
},
|
|
293
301
|
columns: tabColumns,
|
|
294
302
|
data: tabData.map((item) => ({
|