@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.
Files changed (24) hide show
  1. package/dist/components/ApiKeyManagementTab/ApiKeyManagementTab.esm.js +45 -10
  2. package/dist/components/ApiKeyManagementTab/ApiKeyManagementTab.esm.js.map +1 -1
  3. package/dist/components/ApprovalQueueCard/ApprovalQueueCard.esm.js +8 -3
  4. package/dist/components/ApprovalQueueCard/ApprovalQueueCard.esm.js.map +1 -1
  5. package/dist/components/KuadrantPage/KuadrantPage.esm.js +24 -3
  6. package/dist/components/KuadrantPage/KuadrantPage.esm.js.map +1 -1
  7. package/dist/components/MyApiKeysCard/MyApiKeysCard.esm.js +12 -4
  8. package/dist/components/MyApiKeysCard/MyApiKeysCard.esm.js.map +1 -1
  9. package/dist-scalprum/{internal.plugin-kuadrant.86c50e4da6b961c623e9.js → internal.plugin-kuadrant.58f9452dd6d088d4816c.js} +2 -2
  10. package/dist-scalprum/{internal.plugin-kuadrant.86c50e4da6b961c623e9.js.map → internal.plugin-kuadrant.58f9452dd6d088d4816c.js.map} +1 -1
  11. package/dist-scalprum/plugin-manifest.json +2 -2
  12. package/dist-scalprum/static/4306.bc289e67.chunk.js +2 -0
  13. package/dist-scalprum/static/4306.bc289e67.chunk.js.map +1 -0
  14. package/dist-scalprum/static/6281.e7e36f6a.chunk.js +2 -0
  15. package/dist-scalprum/static/6281.e7e36f6a.chunk.js.map +1 -0
  16. package/dist-scalprum/static/7632.4bb9bd69.chunk.js +2 -0
  17. package/dist-scalprum/static/7632.4bb9bd69.chunk.js.map +1 -0
  18. package/package.json +1 -1
  19. package/dist-scalprum/static/4306.04dfa125.chunk.js +0 -2
  20. package/dist-scalprum/static/4306.04dfa125.chunk.js.map +0 -1
  21. package/dist-scalprum/static/6281.14f57b13.chunk.js +0 -2
  22. package/dist-scalprum/static/6281.14f57b13.chunk.js.map +0 -1
  23. package/dist-scalprum/static/7632.646001ce.chunk.js +0 -2
  24. package/dist-scalprum/static/7632.646001ce.chunk.js.map +0 -1
@@ -2,7 +2,7 @@ import React, { useState, useMemo } from 'react';
2
2
  import { useAsync } from 'react-use';
3
3
  import { CodeSnippet, Progress, ResponseErrorPanel, Table } from '@backstage/core-components';
4
4
  import { Box, Typography, Tabs, Tab, Grid, Button, Dialog, DialogTitle, DialogContent, FormControl, InputLabel, Select, MenuItem, TextField, DialogActions, Menu, Chip, IconButton, Tooltip } from '@material-ui/core';
5
- import { useApi, configApiRef, identityApiRef, fetchApiRef } from '@backstage/core-plugin-api';
5
+ import { useApi, configApiRef, identityApiRef, fetchApiRef, alertApiRef } from '@backstage/core-plugin-api';
6
6
  import { useEntity } from '@backstage/plugin-catalog-react';
7
7
  import VisibilityIcon from '@material-ui/icons/Visibility';
8
8
  import VisibilityOffIcon from '@material-ui/icons/VisibilityOff';
@@ -19,6 +19,7 @@ const ApiKeyManagementTab = ({ namespace: propNamespace }) => {
19
19
  const config = useApi(configApiRef);
20
20
  const identityApi = useApi(identityApiRef);
21
21
  const fetchApi = useApi(fetchApiRef);
22
+ const alertApi = useApi(alertApiRef);
22
23
  const backendUrl = config.getString("backend.baseUrl");
23
24
  const [visibleKeys, setVisibleKeys] = useState(/* @__PURE__ */ new Set());
24
25
  const [refresh, setRefresh] = useState(0);
@@ -94,9 +95,17 @@ const ApiKeyManagementTab = ({ namespace: propNamespace }) => {
94
95
  if (!response.ok) {
95
96
  throw new Error("failed to delete request");
96
97
  }
98
+ alertApi.post({
99
+ message: "API key request deleted successfully",
100
+ severity: "success"
101
+ });
97
102
  setRefresh((r) => r + 1);
98
103
  } catch (err) {
99
- console.error("error deleting request:", err);
104
+ const errorMessage = err instanceof Error ? err.message : "unknown error occurred";
105
+ alertApi.post({
106
+ message: `Failed to delete API key request: ${errorMessage}`,
107
+ severity: "error"
108
+ });
100
109
  }
101
110
  };
102
111
  const handleEditRequest = (request) => {
@@ -161,13 +170,21 @@ const ApiKeyManagementTab = ({ namespace: propNamespace }) => {
161
170
  const errorData = await response.json().catch(() => ({}));
162
171
  throw new Error(errorData.error || `failed to create request: ${response.status}`);
163
172
  }
173
+ alertApi.post({
174
+ message: "API access request submitted successfully",
175
+ severity: "success"
176
+ });
164
177
  setOpen(false);
165
178
  setSelectedPlan("");
166
179
  setUseCase("");
167
180
  setRefresh((r) => r + 1);
168
181
  } catch (err) {
169
- console.error("error creating api key request:", err);
170
- setCreateError(err instanceof Error ? err.message : "unknown error occurred");
182
+ const errorMessage = err instanceof Error ? err.message : "unknown error occurred";
183
+ alertApi.post({
184
+ message: `Failed to create API access request: ${errorMessage}`,
185
+ severity: "error"
186
+ });
187
+ setCreateError(errorMessage);
171
188
  } finally {
172
189
  setCreating(false);
173
190
  }
@@ -323,6 +340,7 @@ func main() {
323
340
  title: "API Key",
324
341
  field: "status.apiKey",
325
342
  searchable: false,
343
+ filtering: false,
326
344
  render: (row) => {
327
345
  const isVisible = visibleKeys.has(row.metadata.name);
328
346
  const apiKey = row.status?.apiKey || "N/A";
@@ -350,6 +368,7 @@ func main() {
350
368
  title: "",
351
369
  field: "actions",
352
370
  searchable: false,
371
+ filtering: false,
353
372
  render: (row) => {
354
373
  const ownerId = row.spec.requestedBy.userId;
355
374
  const canDelete = canDeleteResource(ownerId, userId, canDeleteOwnKey, canDeleteAllKeys);
@@ -457,6 +476,7 @@ func main() {
457
476
  title: "",
458
477
  field: "actions",
459
478
  searchable: false,
479
+ filtering: false,
460
480
  render: (row) => {
461
481
  const isPending = !row.status?.phase || row.status.phase === "Pending";
462
482
  const ownerId = row.spec.requestedBy.userId;
@@ -500,8 +520,13 @@ func main() {
500
520
  {
501
521
  title: "Pending Requests",
502
522
  options: {
503
- paging: false,
504
- search: false
523
+ paging: pendingRequests.length > 5,
524
+ pageSize: 20,
525
+ search: true,
526
+ filtering: true,
527
+ debounceInterval: 300,
528
+ toolbar: true,
529
+ emptyRowsWhenPaging: false
505
530
  },
506
531
  columns: pendingRequestColumns,
507
532
  data: pendingRequests
@@ -511,8 +536,13 @@ func main() {
511
536
  {
512
537
  title: "Rejected Requests",
513
538
  options: {
514
- paging: false,
515
- search: false
539
+ paging: rejectedRequests.length > 5,
540
+ pageSize: 20,
541
+ search: true,
542
+ filtering: true,
543
+ debounceInterval: 300,
544
+ toolbar: true,
545
+ emptyRowsWhenPaging: false
516
546
  },
517
547
  columns: requestColumns,
518
548
  data: rejectedRequests
@@ -523,8 +553,13 @@ func main() {
523
553
  key: "api-keys-table",
524
554
  title: "API Keys",
525
555
  options: {
526
- paging: false,
527
- search: false
556
+ paging: approvedRequests.length > 5,
557
+ pageSize: 20,
558
+ search: true,
559
+ filtering: true,
560
+ debounceInterval: 300,
561
+ toolbar: true,
562
+ emptyRowsWhenPaging: false
528
563
  },
529
564
  columns: approvedColumns,
530
565
  data: approvedRequests,
@@ -1 +1 @@
1
- {"version":3,"file":"ApiKeyManagementTab.esm.js","sources":["../../../src/components/ApiKeyManagementTab/ApiKeyManagementTab.tsx"],"sourcesContent":["import React, { useState, useMemo } from 'react';\nimport { useAsync } from 'react-use';\nimport {\n Table,\n TableColumn,\n Progress,\n ResponseErrorPanel,\n CodeSnippet,\n} from '@backstage/core-components';\nimport {\n IconButton,\n Typography,\n Box,\n Chip,\n Grid,\n Button,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n TextField,\n Select,\n MenuItem,\n FormControl,\n InputLabel,\n Tabs,\n Tab,\n Menu,\n Tooltip,\n} from '@material-ui/core';\nimport { useApi, configApiRef, identityApiRef, fetchApiRef } from '@backstage/core-plugin-api';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport VisibilityIcon from '@material-ui/icons/Visibility';\nimport VisibilityOffIcon from '@material-ui/icons/VisibilityOff';\nimport HourglassEmptyIcon from '@material-ui/icons/HourglassEmpty';\nimport CancelIcon from '@material-ui/icons/Cancel';\nimport AddIcon from '@material-ui/icons/Add';\nimport MoreVertIcon from '@material-ui/icons/MoreVert';\nimport { APIKeyRequest } from '../../types/api-management';\nimport {\n kuadrantApiKeyRequestCreatePermission,\n kuadrantApiKeyDeleteOwnPermission,\n kuadrantApiKeyDeleteAllPermission,\n kuadrantApiKeyRequestUpdateOwnPermission,\n} from '../../permissions';\nimport { useKuadrantPermission, canDeleteResource } from '../../utils/permissions';\nimport { EditAPIKeyRequestDialog } from '../EditAPIKeyRequestDialog';\n\ninterface APIProduct {\n metadata: {\n name: string;\n namespace: string;\n };\n spec: {\n plans?: Array<{\n tier: string;\n description?: string;\n limits?: any;\n }>;\n };\n}\n\ninterface Plan {\n tier: string;\n limits: any;\n}\n\nexport interface ApiKeyManagementTabProps {\n namespace?: string;\n}\n\nexport const ApiKeyManagementTab = ({ namespace: propNamespace }: ApiKeyManagementTabProps) => {\n const { entity } = useEntity();\n const config = useApi(configApiRef);\n const identityApi = useApi(identityApiRef);\n const fetchApi = useApi(fetchApiRef);\n const backendUrl = config.getString('backend.baseUrl');\n const [visibleKeys, setVisibleKeys] = useState<Set<string>>(new Set());\n const [refresh, setRefresh] = useState(0);\n const [userId, setUserId] = useState<string>('guest');\n const [userEmail, setUserEmail] = useState<string>('');\n const [open, setOpen] = useState(false);\n const [selectedPlan, setSelectedPlan] = useState('');\n const [useCase, setUseCase] = useState('');\n const [creating, setCreating] = useState(false);\n const [createError, setCreateError] = useState<string | null>(null);\n const [editDialogOpen, setEditDialogOpen] = useState(false);\n const [requestToEdit, setRequestToEdit] = useState<APIKeyRequest | null>(null);\n const [menuAnchor, setMenuAnchor] = useState<{ top: number; left: number } | null>(null);\n const [menuRequest, setMenuRequest] = useState<APIKeyRequest | null>(null);\n\n // get apiproduct name from entity annotation (set by entity provider)\n const apiProductName = entity.metadata.annotations?.['kuadrant.io/apiproduct'] || entity.metadata.name;\n const namespace = entity.metadata.annotations?.['kuadrant.io/namespace'] || propNamespace || 'default';\n\n useAsync(async () => {\n const identity = await identityApi.getBackstageIdentity();\n const profile = await identityApi.getProfileInfo();\n setUserId(identity.userEntityRef.split('/')[1] || 'guest');\n setUserEmail(profile.email || '');\n }, [identityApi]);\n\n const { value: requests, loading: requestsLoading, error: requestsError } = useAsync(async () => {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/requests/my?namespace=${namespace}`\n );\n if (!response.ok) {\n throw new Error('failed to fetch requests');\n }\n const data = await response.json();\n // filter by apiproduct name, not httproute name\n return (data.items || []).filter(\n (r: APIKeyRequest) => r.spec.apiName === apiProductName && r.spec.apiNamespace === namespace\n );\n }, [apiProductName, namespace, refresh, fetchApi, backendUrl]);\n\n const { value: apiProduct, loading: plansLoading, error: plansError } = useAsync(async () => {\n const response = await fetchApi.fetch(`${backendUrl}/api/kuadrant/apiproducts`);\n if (!response.ok) {\n throw new Error('failed to fetch api products');\n }\n const data = await response.json();\n\n const product = data.items?.find((p: APIProduct) =>\n p.metadata.namespace === namespace &&\n p.metadata.name === apiProductName\n );\n\n return product;\n }, [namespace, apiProductName, fetchApi]);\n\n // check permissions with resource reference once we have the apiproduct\n const resourceRef = apiProduct ? `apiproduct:${apiProduct.metadata.namespace}/${apiProduct.metadata.name}` : undefined;\n\n const {\n allowed: canCreateRequest,\n loading: createRequestPermissionLoading,\n error: createRequestPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyRequestCreatePermission, resourceRef);\n\n const {\n allowed: canDeleteOwnKey,\n loading: deleteOwnPermissionLoading,\n error: deleteOwnPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyDeleteOwnPermission);\n\n const {\n allowed: canDeleteAllKeys,\n loading: deleteAllPermissionLoading,\n error: deleteAllPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyDeleteAllPermission);\n\n const {\n allowed: canUpdateRequest,\n loading: updateRequestPermissionLoading,\n error: updateRequestPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyRequestUpdateOwnPermission);\n\n const handleDeleteRequest = async (name: string) => {\n try {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/requests/${namespace}/${name}`,\n { method: 'DELETE' }\n );\n if (!response.ok) {\n throw new Error('failed to delete request');\n }\n setRefresh(r => r + 1);\n } catch (err) {\n console.error('error deleting request:', err);\n }\n };\n\n const handleEditRequest = (request: APIKeyRequest) => {\n setRequestToEdit(request);\n setEditDialogOpen(true);\n };\n\n const handleEditSuccess = () => {\n setRefresh(r => r + 1);\n setEditDialogOpen(false);\n setRequestToEdit(null);\n };\n\n const handleMenuClose = () => {\n setMenuAnchor(null);\n setMenuRequest(null);\n };\n\n const handleMenuEdit = () => {\n if (!menuRequest) return;\n handleEditRequest(menuRequest);\n handleMenuClose();\n };\n\n const handleMenuDelete = async () => {\n if (!menuRequest) return;\n const requestName = menuRequest.metadata.name;\n handleMenuClose();\n\n if (!window.confirm('Are you sure you want to delete this request?')) {\n return;\n }\n\n await handleDeleteRequest(requestName);\n };\n\n const toggleVisibility = (keyName: string) => {\n setVisibleKeys(prev => {\n const newSet = new Set(prev);\n if (newSet.has(keyName)) {\n newSet.delete(keyName);\n } else {\n newSet.add(keyName);\n }\n return newSet;\n });\n };\n\n const handleRequestAccess = async () => {\n if (!selectedPlan) return;\n\n setCreating(true);\n setCreateError(null);\n try {\n const response = await fetchApi.fetch(`${backendUrl}/api/kuadrant/requests`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n apiName: apiProductName,\n apiNamespace: namespace,\n userId,\n userEmail,\n planTier: selectedPlan,\n useCase: useCase.trim() || '',\n namespace,\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || `failed to create request: ${response.status}`);\n }\n\n setOpen(false);\n setSelectedPlan('');\n setUseCase('');\n setRefresh(r => r + 1);\n } catch (err) {\n console.error('error creating api key request:', err);\n setCreateError(err instanceof Error ? err.message : 'unknown error occurred');\n } finally {\n setCreating(false);\n }\n };\n\n const detailPanelConfig = useMemo(() => [\n {\n render: (data: any) => {\n // backstage Table wraps the data in { rowData: actualData }\n const request = data.rowData as APIKeyRequest;\n if (!request?.metadata?.name) {\n return <Box />;\n }\n\n return <DetailPanelContent request={request} apiName={apiProductName} />;\n },\n },\n ], [apiProductName]);\n\n // separate component to isolate state\n const DetailPanelContent = ({ request, apiName: api }: { request: APIKeyRequest; apiName: string }) => {\n const [selectedLanguage, setSelectedLanguage] = useState(0);\n const hostname = request.status?.apiHostname || `${api}.apps.example.com`;\n\n return (\n <Box p={3} bgcolor=\"background.default\" onClick={(e) => e.stopPropagation()}>\n {request.spec.useCase && (\n <Box mb={3}>\n <Typography variant=\"h6\" gutterBottom>\n Use Case\n </Typography>\n <Box p={2} bgcolor=\"background.paper\" borderRadius={1} border=\"1px solid rgba(0, 0, 0, 0.12)\">\n <Typography\n variant=\"body2\"\n style={{\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n overflowWrap: 'break-word',\n }}\n >\n {request.spec.useCase}\n </Typography>\n </Box>\n </Box>\n )}\n <Typography variant=\"h6\" gutterBottom>\n Usage Examples\n </Typography>\n <Typography variant=\"body2\" paragraph>\n Use these code examples to test the API with your {request.spec.planTier} tier key.\n </Typography>\n <Box onClick={(e) => e.stopPropagation()}>\n <Tabs\n value={selectedLanguage}\n onChange={(e, newValue) => {\n e.stopPropagation();\n setSelectedLanguage(newValue);\n }}\n indicatorColor=\"primary\"\n >\n <Tab label=\"cURL\" onClick={(e) => e.stopPropagation()} />\n <Tab label=\"Node.js\" onClick={(e) => e.stopPropagation()} />\n <Tab label=\"Python\" onClick={(e) => e.stopPropagation()} />\n <Tab label=\"Go\" onClick={(e) => e.stopPropagation()} />\n </Tabs>\n </Box>\n <Box mt={2}>\n {selectedLanguage === 0 && (\n <CodeSnippet\n text={`curl -X GET https://${hostname}/api/v1/endpoint \\\\\n -H \"Authorization: Bearer ${request.status?.apiKey}\"`}\n language=\"bash\"\n showCopyCodeButton\n />\n )}\n {selectedLanguage === 1 && (\n <CodeSnippet\n text={`const fetch = require('node-fetch');\n\nconst apiKey = '${request.status?.apiKey}';\nconst endpoint = 'https://${hostname}/api/v1/endpoint';\n\nfetch(endpoint, {\n method: 'GET',\n headers: {\n 'Authorization': \\`Bearer \\${apiKey}\\`\n }\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`}\n language=\"javascript\"\n showCopyCodeButton\n />\n )}\n {selectedLanguage === 2 && (\n <CodeSnippet\n text={`import requests\n\napi_key = '${request.status?.apiKey}'\nendpoint = 'https://${hostname}/api/v1/endpoint'\n\nheaders = {\n 'Authorization': f'Bearer {api_key}'\n}\n\nresponse = requests.get(endpoint, headers=headers)\nprint(response.json())`}\n language=\"python\"\n showCopyCodeButton\n />\n )}\n {selectedLanguage === 3 && (\n <CodeSnippet\n text={`package main\n\nimport (\n \"fmt\"\n \"net/http\"\n \"io\"\n)\n\nfunc main() {\n apiKey := \"${request.status?.apiKey}\"\n endpoint := \"https://${hostname}/api/v1/endpoint\"\n\n client := &http.Client{}\n req, _ := http.NewRequest(\"GET\", endpoint, nil)\n req.Header.Add(\"Authorization\", \"Bearer \" + apiKey)\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println(\"Error:\", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`}\n language=\"go\"\n showCopyCodeButton\n />\n )}\n </Box>\n </Box>\n );\n };\n\n const loading = requestsLoading || plansLoading || createRequestPermissionLoading || deleteOwnPermissionLoading || deleteAllPermissionLoading || updateRequestPermissionLoading;\n const error = requestsError || plansError;\n const permissionError = createRequestPermissionError || deleteOwnPermissionError || deleteAllPermissionError || updateRequestPermissionError;\n\n if (loading) {\n return <Progress />;\n }\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n if (permissionError) {\n const failedPermission = createRequestPermissionError ? 'kuadrant.apikeyrequest.create' :\n deleteOwnPermissionError ? 'kuadrant.apikey.delete.own' :\n deleteAllPermissionError ? 'kuadrant.apikey.delete.all' :\n updateRequestPermissionError ? 'kuadrant.apikeyrequest.update.own' : 'unknown';\n return (\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: {failedPermission}\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 myRequests = (requests || []) as APIKeyRequest[];\n const plans = (apiProduct?.spec?.plans || []) as Plan[];\n\n const pendingRequests = myRequests.filter(r => !r.status?.phase || r.status.phase === 'Pending');\n const approvedRequests = myRequests.filter(r => r.status?.phase === 'Approved');\n const rejectedRequests = myRequests.filter(r => r.status?.phase === 'Rejected');\n\n const approvedColumns: TableColumn<APIKeyRequest>[] = [\n {\n title: 'Plan Tier',\n field: 'spec.planTier',\n render: (row: APIKeyRequest) => (\n <Chip label={row.spec.planTier} color=\"primary\" size=\"small\" />\n ),\n },\n {\n title: 'Approved',\n field: 'status.reviewedAt',\n render: (row: APIKeyRequest) => (\n <Typography variant=\"body2\">\n {row.status?.reviewedAt ? new Date(row.status.reviewedAt).toLocaleDateString() : '-'}\n </Typography>\n ),\n },\n {\n title: 'API Key',\n field: 'status.apiKey',\n searchable: false,\n render: (row: APIKeyRequest) => {\n const isVisible = visibleKeys.has(row.metadata.name);\n const apiKey = row.status?.apiKey || 'N/A';\n\n return (\n <Box display=\"flex\" alignItems=\"center\">\n <Typography\n variant=\"body2\"\n style={{\n fontFamily: 'monospace',\n marginRight: 8,\n }}\n >\n {isVisible ? apiKey : '••••••••••••••••'}\n </Typography>\n <IconButton\n size=\"small\"\n onClick={() => toggleVisibility(row.metadata.name)}\n >\n {isVisible ? <VisibilityOffIcon /> : <VisibilityIcon />}\n </IconButton>\n </Box>\n );\n },\n },\n {\n title: '',\n field: 'actions',\n searchable: false,\n render: (row: APIKeyRequest) => {\n const ownerId = row.spec.requestedBy.userId;\n const canDelete = canDeleteResource(ownerId, userId, canDeleteOwnKey, canDeleteAllKeys);\n if (!canDelete) return null;\n return (\n <IconButton\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n const rect = e.currentTarget.getBoundingClientRect();\n setMenuAnchor({ top: rect.bottom, left: rect.left });\n setMenuRequest(row);\n }}\n title=\"Actions\"\n aria-controls={menuAnchor ? 'actions-menu' : undefined}\n aria-haspopup=\"true\"\n >\n <MoreVertIcon />\n </IconButton>\n );\n },\n },\n ];\n\n const requestColumns: TableColumn<APIKeyRequest>[] = [\n {\n title: 'Status',\n field: 'status.phase',\n render: (row: APIKeyRequest) => {\n const phase = row.status?.phase || 'Pending';\n const isPending = phase === 'Pending';\n return (\n <Chip\n label={phase}\n size=\"small\"\n icon={isPending ? <HourglassEmptyIcon /> : <CancelIcon />}\n color={isPending ? 'default' : 'secondary'}\n />\n );\n },\n },\n {\n title: 'Plan Tier',\n field: 'spec.planTier',\n render: (row: APIKeyRequest) => (\n <Chip label={row.spec.planTier} color=\"primary\" size=\"small\" />\n ),\n },\n {\n title: 'Use Case',\n field: 'spec.useCase',\n render: (row: APIKeyRequest) => {\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: APIKeyRequest) => (\n <Typography variant=\"body2\">\n {row.spec.requestedAt ? new Date(row.spec.requestedAt).toLocaleDateString() : '-'}\n </Typography>\n ),\n },\n {\n title: 'Reviewed',\n field: 'status.reviewedAt',\n render: (row: APIKeyRequest) => {\n if (!row.status?.reviewedAt) return <Typography variant=\"body2\">-</Typography>;\n return (\n <Typography variant=\"body2\">\n {new Date(row.status.reviewedAt).toLocaleDateString()}\n </Typography>\n );\n },\n },\n {\n title: 'Reason',\n field: 'status.reason',\n render: (row: APIKeyRequest) => {\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 title: '',\n field: 'actions',\n searchable: false,\n render: (row: APIKeyRequest) => {\n const isPending = !row.status?.phase || row.status.phase === 'Pending';\n const ownerId = row.spec.requestedBy.userId;\n const canDelete = canDeleteResource(ownerId, userId, canDeleteOwnKey, canDeleteAllKeys);\n const canEdit = canUpdateRequest && ownerId === userId;\n if (!isPending || (!canEdit && !canDelete)) return null;\n return (\n <IconButton\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n const rect = e.currentTarget.getBoundingClientRect();\n setMenuAnchor({ top: rect.bottom, left: rect.left });\n setMenuRequest(row);\n }}\n title=\"Actions\"\n aria-controls={menuAnchor ? 'actions-menu' : undefined}\n aria-haspopup=\"true\"\n >\n <MoreVertIcon />\n </IconButton>\n );\n },\n },\n ];\n\n // Filter columns for pending requests (no Reviewed or Reason)\n const pendingRequestColumns = requestColumns.filter(\n col => col.title !== 'Reviewed' && col.title !== 'Reason'\n );\n\n return (\n <Box p={2}>\n <Grid container spacing={3} direction=\"column\">\n {canCreateRequest && (\n <Grid item>\n <Box display=\"flex\" flexDirection=\"column\" alignItems=\"flex-end\" mb={2}>\n <Button\n variant=\"contained\"\n color=\"primary\"\n startIcon={<AddIcon />}\n onClick={() => setOpen(true)}\n disabled={plans.length === 0}\n >\n Request API Access\n </Button>\n {plans.length === 0 && (\n <Typography variant=\"caption\" color=\"textSecondary\" style={{ marginTop: 4 }}>\n {!apiProduct ? 'API product not found' : 'No plans available'}\n </Typography>\n )}\n </Box>\n </Grid>\n )}\n {pendingRequests.length === 0 && rejectedRequests.length === 0 && approvedRequests.length === 0 && (\n <Grid item>\n <Box p={3} textAlign=\"center\">\n <Typography variant=\"body1\" color=\"textSecondary\">\n No API keys yet. Request access to get started.\n </Typography>\n </Box>\n </Grid>\n )}\n {pendingRequests.length > 0 && (\n <Grid item>\n <Table\n title=\"Pending Requests\"\n options={{\n paging: false,\n search: false,\n }}\n columns={pendingRequestColumns}\n data={pendingRequests}\n />\n </Grid>\n )}\n {rejectedRequests.length > 0 && (\n <Grid item>\n <Table\n title=\"Rejected Requests\"\n options={{\n paging: false,\n search: false,\n }}\n columns={requestColumns}\n data={rejectedRequests}\n />\n </Grid>\n )}\n {approvedRequests.length > 0 && (\n <Grid item>\n <Table\n key=\"api-keys-table\"\n title=\"API Keys\"\n options={{\n paging: false,\n search: false,\n }}\n columns={approvedColumns}\n data={approvedRequests}\n detailPanel={detailPanelConfig}\n />\n </Grid>\n )}\n </Grid>\n\n <Dialog open={open} onClose={() => setOpen(false)} maxWidth=\"sm\" fullWidth>\n <DialogTitle>Request API Access</DialogTitle>\n <DialogContent>\n {createError && (\n <Box mb={2} p={2} bgcolor=\"error.main\" color=\"error.contrastText\" borderRadius={1}>\n <Typography variant=\"body2\">{createError}</Typography>\n </Box>\n )}\n <FormControl fullWidth margin=\"normal\">\n <InputLabel>Select Plan Tier</InputLabel>\n <Select\n value={selectedPlan}\n onChange={(e) => setSelectedPlan(e.target.value as string)}\n >\n {plans.map((plan: Plan) => {\n const limitDesc = Object.entries(plan.limits || {})\n .map(([key, val]) => `${val} per ${key}`)\n .join(', ');\n return (\n <MenuItem key={plan.tier} value={plan.tier}>\n {plan.tier} {limitDesc ? `(${limitDesc})` : ''}\n </MenuItem>\n );\n })}\n </Select>\n </FormControl>\n <TextField\n label=\"Use Case (optional)\"\n placeholder=\"Describe how you plan to use this API\"\n multiline\n rows={3}\n fullWidth\n margin=\"normal\"\n value={useCase}\n onChange={(e) => setUseCase(e.target.value)}\n helperText=\"Explain your intended use of this API for admin review\"\n />\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setOpen(false)}>Cancel</Button>\n <Button\n onClick={handleRequestAccess}\n color=\"primary\"\n disabled={!selectedPlan || creating}\n >\n {creating ? 'Submitting...' : 'Submit Request'}\n </Button>\n </DialogActions>\n </Dialog>\n\n <Menu\n id=\"actions-menu\"\n open={Boolean(menuAnchor)}\n onClose={handleMenuClose}\n anchorReference=\"anchorPosition\"\n anchorPosition={menuAnchor || { top: 0, left: 0 }}\n >\n {menuRequest && (() => {\n const isPending = !menuRequest.status?.phase || menuRequest.status.phase === 'Pending';\n const ownerId = menuRequest.spec.requestedBy.userId;\n const canEdit = canUpdateRequest && ownerId === userId && isPending;\n\n const items = [];\n if (canEdit) {\n items.push(<MenuItem key=\"edit\" onClick={handleMenuEdit}>Edit</MenuItem>);\n }\n items.push(<MenuItem key=\"delete\" onClick={handleMenuDelete}>Delete</MenuItem>);\n return items;\n })()}\n </Menu>\n\n {requestToEdit && (\n <EditAPIKeyRequestDialog\n open={editDialogOpen}\n onClose={() => {\n setEditDialogOpen(false);\n setRequestToEdit(null);\n }}\n onSuccess={handleEditSuccess}\n request={requestToEdit}\n availablePlans={plans}\n />\n )}\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ApiKeyManagementTab.esm.js","sources":["../../../src/components/ApiKeyManagementTab/ApiKeyManagementTab.tsx"],"sourcesContent":["import React, { useState, useMemo } from 'react';\nimport { useAsync } from 'react-use';\nimport {\n Table,\n TableColumn,\n Progress,\n ResponseErrorPanel,\n CodeSnippet,\n} from '@backstage/core-components';\nimport {\n IconButton,\n Typography,\n Box,\n Chip,\n Grid,\n Button,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n TextField,\n Select,\n MenuItem,\n FormControl,\n InputLabel,\n Tabs,\n Tab,\n Menu,\n Tooltip,\n} from '@material-ui/core';\nimport { useApi, configApiRef, identityApiRef, fetchApiRef, alertApiRef } from '@backstage/core-plugin-api';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport VisibilityIcon from '@material-ui/icons/Visibility';\nimport VisibilityOffIcon from '@material-ui/icons/VisibilityOff';\nimport HourglassEmptyIcon from '@material-ui/icons/HourglassEmpty';\nimport CancelIcon from '@material-ui/icons/Cancel';\nimport AddIcon from '@material-ui/icons/Add';\nimport MoreVertIcon from '@material-ui/icons/MoreVert';\nimport { APIKeyRequest } from '../../types/api-management';\nimport {\n kuadrantApiKeyRequestCreatePermission,\n kuadrantApiKeyDeleteOwnPermission,\n kuadrantApiKeyDeleteAllPermission,\n kuadrantApiKeyRequestUpdateOwnPermission,\n} from '../../permissions';\nimport { useKuadrantPermission, canDeleteResource } from '../../utils/permissions';\nimport { EditAPIKeyRequestDialog } from '../EditAPIKeyRequestDialog';\n\ninterface APIProduct {\n metadata: {\n name: string;\n namespace: string;\n };\n spec: {\n plans?: Array<{\n tier: string;\n description?: string;\n limits?: any;\n }>;\n };\n}\n\ninterface Plan {\n tier: string;\n limits: any;\n}\n\nexport interface ApiKeyManagementTabProps {\n namespace?: string;\n}\n\nexport const ApiKeyManagementTab = ({ namespace: propNamespace }: ApiKeyManagementTabProps) => {\n const { entity } = useEntity();\n const config = useApi(configApiRef);\n const identityApi = useApi(identityApiRef);\n const fetchApi = useApi(fetchApiRef);\n const alertApi = useApi(alertApiRef);\n const backendUrl = config.getString('backend.baseUrl');\n const [visibleKeys, setVisibleKeys] = useState<Set<string>>(new Set());\n const [refresh, setRefresh] = useState(0);\n const [userId, setUserId] = useState<string>('guest');\n const [userEmail, setUserEmail] = useState<string>('');\n const [open, setOpen] = useState(false);\n const [selectedPlan, setSelectedPlan] = useState('');\n const [useCase, setUseCase] = useState('');\n const [creating, setCreating] = useState(false);\n const [createError, setCreateError] = useState<string | null>(null);\n const [editDialogOpen, setEditDialogOpen] = useState(false);\n const [requestToEdit, setRequestToEdit] = useState<APIKeyRequest | null>(null);\n const [menuAnchor, setMenuAnchor] = useState<{ top: number; left: number } | null>(null);\n const [menuRequest, setMenuRequest] = useState<APIKeyRequest | null>(null);\n\n // get apiproduct name from entity annotation (set by entity provider)\n const apiProductName = entity.metadata.annotations?.['kuadrant.io/apiproduct'] || entity.metadata.name;\n const namespace = entity.metadata.annotations?.['kuadrant.io/namespace'] || propNamespace || 'default';\n\n useAsync(async () => {\n const identity = await identityApi.getBackstageIdentity();\n const profile = await identityApi.getProfileInfo();\n setUserId(identity.userEntityRef.split('/')[1] || 'guest');\n setUserEmail(profile.email || '');\n }, [identityApi]);\n\n const { value: requests, loading: requestsLoading, error: requestsError } = useAsync(async () => {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/requests/my?namespace=${namespace}`\n );\n if (!response.ok) {\n throw new Error('failed to fetch requests');\n }\n const data = await response.json();\n // filter by apiproduct name, not httproute name\n return (data.items || []).filter(\n (r: APIKeyRequest) => r.spec.apiName === apiProductName && r.spec.apiNamespace === namespace\n );\n }, [apiProductName, namespace, refresh, fetchApi, backendUrl]);\n\n const { value: apiProduct, loading: plansLoading, error: plansError } = useAsync(async () => {\n const response = await fetchApi.fetch(`${backendUrl}/api/kuadrant/apiproducts`);\n if (!response.ok) {\n throw new Error('failed to fetch api products');\n }\n const data = await response.json();\n\n const product = data.items?.find((p: APIProduct) =>\n p.metadata.namespace === namespace &&\n p.metadata.name === apiProductName\n );\n\n return product;\n }, [namespace, apiProductName, fetchApi]);\n\n // check permissions with resource reference once we have the apiproduct\n const resourceRef = apiProduct ? `apiproduct:${apiProduct.metadata.namespace}/${apiProduct.metadata.name}` : undefined;\n\n const {\n allowed: canCreateRequest,\n loading: createRequestPermissionLoading,\n error: createRequestPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyRequestCreatePermission, resourceRef);\n\n const {\n allowed: canDeleteOwnKey,\n loading: deleteOwnPermissionLoading,\n error: deleteOwnPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyDeleteOwnPermission);\n\n const {\n allowed: canDeleteAllKeys,\n loading: deleteAllPermissionLoading,\n error: deleteAllPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyDeleteAllPermission);\n\n const {\n allowed: canUpdateRequest,\n loading: updateRequestPermissionLoading,\n error: updateRequestPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyRequestUpdateOwnPermission);\n\n const handleDeleteRequest = async (name: string) => {\n try {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/requests/${namespace}/${name}`,\n { method: 'DELETE' }\n );\n if (!response.ok) {\n throw new Error('failed to delete request');\n }\n alertApi.post({\n message: 'API key request deleted successfully',\n severity: 'success',\n });\n setRefresh(r => r + 1);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'unknown error occurred';\n alertApi.post({\n message: `Failed to delete API key request: ${errorMessage}`,\n severity: 'error',\n });\n }\n };\n\n const handleEditRequest = (request: APIKeyRequest) => {\n setRequestToEdit(request);\n setEditDialogOpen(true);\n };\n\n const handleEditSuccess = () => {\n setRefresh(r => r + 1);\n setEditDialogOpen(false);\n setRequestToEdit(null);\n };\n\n const handleMenuClose = () => {\n setMenuAnchor(null);\n setMenuRequest(null);\n };\n\n const handleMenuEdit = () => {\n if (!menuRequest) return;\n handleEditRequest(menuRequest);\n handleMenuClose();\n };\n\n const handleMenuDelete = async () => {\n if (!menuRequest) return;\n const requestName = menuRequest.metadata.name;\n handleMenuClose();\n\n if (!window.confirm('Are you sure you want to delete this request?')) {\n return;\n }\n\n await handleDeleteRequest(requestName);\n };\n\n const toggleVisibility = (keyName: string) => {\n setVisibleKeys(prev => {\n const newSet = new Set(prev);\n if (newSet.has(keyName)) {\n newSet.delete(keyName);\n } else {\n newSet.add(keyName);\n }\n return newSet;\n });\n };\n\n const handleRequestAccess = async () => {\n if (!selectedPlan) return;\n\n setCreating(true);\n setCreateError(null);\n try {\n const response = await fetchApi.fetch(`${backendUrl}/api/kuadrant/requests`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n apiName: apiProductName,\n apiNamespace: namespace,\n userId,\n userEmail,\n planTier: selectedPlan,\n useCase: useCase.trim() || '',\n namespace,\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || `failed to create request: ${response.status}`);\n }\n\n alertApi.post({\n message: 'API access request submitted successfully',\n severity: 'success',\n });\n\n setOpen(false);\n setSelectedPlan('');\n setUseCase('');\n setRefresh(r => r + 1);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'unknown error occurred';\n alertApi.post({\n message: `Failed to create API access request: ${errorMessage}`,\n severity: 'error',\n });\n setCreateError(errorMessage);\n } finally {\n setCreating(false);\n }\n };\n\n const detailPanelConfig = useMemo(() => [\n {\n render: (data: any) => {\n // backstage Table wraps the data in { rowData: actualData }\n const request = data.rowData as APIKeyRequest;\n if (!request?.metadata?.name) {\n return <Box />;\n }\n\n return <DetailPanelContent request={request} apiName={apiProductName} />;\n },\n },\n ], [apiProductName]);\n\n // separate component to isolate state\n const DetailPanelContent = ({ request, apiName: api }: { request: APIKeyRequest; apiName: string }) => {\n const [selectedLanguage, setSelectedLanguage] = useState(0);\n const hostname = request.status?.apiHostname || `${api}.apps.example.com`;\n\n return (\n <Box p={3} bgcolor=\"background.default\" onClick={(e) => e.stopPropagation()}>\n {request.spec.useCase && (\n <Box mb={3}>\n <Typography variant=\"h6\" gutterBottom>\n Use Case\n </Typography>\n <Box p={2} bgcolor=\"background.paper\" borderRadius={1} border=\"1px solid rgba(0, 0, 0, 0.12)\">\n <Typography\n variant=\"body2\"\n style={{\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n overflowWrap: 'break-word',\n }}\n >\n {request.spec.useCase}\n </Typography>\n </Box>\n </Box>\n )}\n <Typography variant=\"h6\" gutterBottom>\n Usage Examples\n </Typography>\n <Typography variant=\"body2\" paragraph>\n Use these code examples to test the API with your {request.spec.planTier} tier key.\n </Typography>\n <Box onClick={(e) => e.stopPropagation()}>\n <Tabs\n value={selectedLanguage}\n onChange={(e, newValue) => {\n e.stopPropagation();\n setSelectedLanguage(newValue);\n }}\n indicatorColor=\"primary\"\n >\n <Tab label=\"cURL\" onClick={(e) => e.stopPropagation()} />\n <Tab label=\"Node.js\" onClick={(e) => e.stopPropagation()} />\n <Tab label=\"Python\" onClick={(e) => e.stopPropagation()} />\n <Tab label=\"Go\" onClick={(e) => e.stopPropagation()} />\n </Tabs>\n </Box>\n <Box mt={2}>\n {selectedLanguage === 0 && (\n <CodeSnippet\n text={`curl -X GET https://${hostname}/api/v1/endpoint \\\\\n -H \"Authorization: Bearer ${request.status?.apiKey}\"`}\n language=\"bash\"\n showCopyCodeButton\n />\n )}\n {selectedLanguage === 1 && (\n <CodeSnippet\n text={`const fetch = require('node-fetch');\n\nconst apiKey = '${request.status?.apiKey}';\nconst endpoint = 'https://${hostname}/api/v1/endpoint';\n\nfetch(endpoint, {\n method: 'GET',\n headers: {\n 'Authorization': \\`Bearer \\${apiKey}\\`\n }\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`}\n language=\"javascript\"\n showCopyCodeButton\n />\n )}\n {selectedLanguage === 2 && (\n <CodeSnippet\n text={`import requests\n\napi_key = '${request.status?.apiKey}'\nendpoint = 'https://${hostname}/api/v1/endpoint'\n\nheaders = {\n 'Authorization': f'Bearer {api_key}'\n}\n\nresponse = requests.get(endpoint, headers=headers)\nprint(response.json())`}\n language=\"python\"\n showCopyCodeButton\n />\n )}\n {selectedLanguage === 3 && (\n <CodeSnippet\n text={`package main\n\nimport (\n \"fmt\"\n \"net/http\"\n \"io\"\n)\n\nfunc main() {\n apiKey := \"${request.status?.apiKey}\"\n endpoint := \"https://${hostname}/api/v1/endpoint\"\n\n client := &http.Client{}\n req, _ := http.NewRequest(\"GET\", endpoint, nil)\n req.Header.Add(\"Authorization\", \"Bearer \" + apiKey)\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println(\"Error:\", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`}\n language=\"go\"\n showCopyCodeButton\n />\n )}\n </Box>\n </Box>\n );\n };\n\n const loading = requestsLoading || plansLoading || createRequestPermissionLoading || deleteOwnPermissionLoading || deleteAllPermissionLoading || updateRequestPermissionLoading;\n const error = requestsError || plansError;\n const permissionError = createRequestPermissionError || deleteOwnPermissionError || deleteAllPermissionError || updateRequestPermissionError;\n\n if (loading) {\n return <Progress />;\n }\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n if (permissionError) {\n const failedPermission = createRequestPermissionError ? 'kuadrant.apikeyrequest.create' :\n deleteOwnPermissionError ? 'kuadrant.apikey.delete.own' :\n deleteAllPermissionError ? 'kuadrant.apikey.delete.all' :\n updateRequestPermissionError ? 'kuadrant.apikeyrequest.update.own' : 'unknown';\n return (\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: {failedPermission}\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 myRequests = (requests || []) as APIKeyRequest[];\n const plans = (apiProduct?.spec?.plans || []) as Plan[];\n\n const pendingRequests = myRequests.filter(r => !r.status?.phase || r.status.phase === 'Pending');\n const approvedRequests = myRequests.filter(r => r.status?.phase === 'Approved');\n const rejectedRequests = myRequests.filter(r => r.status?.phase === 'Rejected');\n\n const approvedColumns: TableColumn<APIKeyRequest>[] = [\n {\n title: 'Plan Tier',\n field: 'spec.planTier',\n render: (row: APIKeyRequest) => (\n <Chip label={row.spec.planTier} color=\"primary\" size=\"small\" />\n ),\n },\n {\n title: 'Approved',\n field: 'status.reviewedAt',\n render: (row: APIKeyRequest) => (\n <Typography variant=\"body2\">\n {row.status?.reviewedAt ? new Date(row.status.reviewedAt).toLocaleDateString() : '-'}\n </Typography>\n ),\n },\n {\n title: 'API Key',\n field: 'status.apiKey',\n searchable: false,\n filtering: false,\n render: (row: APIKeyRequest) => {\n const isVisible = visibleKeys.has(row.metadata.name);\n const apiKey = row.status?.apiKey || 'N/A';\n\n return (\n <Box display=\"flex\" alignItems=\"center\">\n <Typography\n variant=\"body2\"\n style={{\n fontFamily: 'monospace',\n marginRight: 8,\n }}\n >\n {isVisible ? apiKey : '••••••••••••••••'}\n </Typography>\n <IconButton\n size=\"small\"\n onClick={() => toggleVisibility(row.metadata.name)}\n >\n {isVisible ? <VisibilityOffIcon /> : <VisibilityIcon />}\n </IconButton>\n </Box>\n );\n },\n },\n {\n title: '',\n field: 'actions',\n searchable: false,\n filtering: false,\n render: (row: APIKeyRequest) => {\n const ownerId = row.spec.requestedBy.userId;\n const canDelete = canDeleteResource(ownerId, userId, canDeleteOwnKey, canDeleteAllKeys);\n if (!canDelete) return null;\n return (\n <IconButton\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n const rect = e.currentTarget.getBoundingClientRect();\n setMenuAnchor({ top: rect.bottom, left: rect.left });\n setMenuRequest(row);\n }}\n title=\"Actions\"\n aria-controls={menuAnchor ? 'actions-menu' : undefined}\n aria-haspopup=\"true\"\n >\n <MoreVertIcon />\n </IconButton>\n );\n },\n },\n ];\n\n const requestColumns: TableColumn<APIKeyRequest>[] = [\n {\n title: 'Status',\n field: 'status.phase',\n render: (row: APIKeyRequest) => {\n const phase = row.status?.phase || 'Pending';\n const isPending = phase === 'Pending';\n return (\n <Chip\n label={phase}\n size=\"small\"\n icon={isPending ? <HourglassEmptyIcon /> : <CancelIcon />}\n color={isPending ? 'default' : 'secondary'}\n />\n );\n },\n },\n {\n title: 'Plan Tier',\n field: 'spec.planTier',\n render: (row: APIKeyRequest) => (\n <Chip label={row.spec.planTier} color=\"primary\" size=\"small\" />\n ),\n },\n {\n title: 'Use Case',\n field: 'spec.useCase',\n render: (row: APIKeyRequest) => {\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: APIKeyRequest) => (\n <Typography variant=\"body2\">\n {row.spec.requestedAt ? new Date(row.spec.requestedAt).toLocaleDateString() : '-'}\n </Typography>\n ),\n },\n {\n title: 'Reviewed',\n field: 'status.reviewedAt',\n render: (row: APIKeyRequest) => {\n if (!row.status?.reviewedAt) return <Typography variant=\"body2\">-</Typography>;\n return (\n <Typography variant=\"body2\">\n {new Date(row.status.reviewedAt).toLocaleDateString()}\n </Typography>\n );\n },\n },\n {\n title: 'Reason',\n field: 'status.reason',\n render: (row: APIKeyRequest) => {\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 title: '',\n field: 'actions',\n searchable: false,\n filtering: false,\n render: (row: APIKeyRequest) => {\n const isPending = !row.status?.phase || row.status.phase === 'Pending';\n const ownerId = row.spec.requestedBy.userId;\n const canDelete = canDeleteResource(ownerId, userId, canDeleteOwnKey, canDeleteAllKeys);\n const canEdit = canUpdateRequest && ownerId === userId;\n if (!isPending || (!canEdit && !canDelete)) return null;\n return (\n <IconButton\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n const rect = e.currentTarget.getBoundingClientRect();\n setMenuAnchor({ top: rect.bottom, left: rect.left });\n setMenuRequest(row);\n }}\n title=\"Actions\"\n aria-controls={menuAnchor ? 'actions-menu' : undefined}\n aria-haspopup=\"true\"\n >\n <MoreVertIcon />\n </IconButton>\n );\n },\n },\n ];\n\n // Filter columns for pending requests (no Reviewed or Reason)\n const pendingRequestColumns = requestColumns.filter(\n col => col.title !== 'Reviewed' && col.title !== 'Reason'\n );\n\n return (\n <Box p={2}>\n <Grid container spacing={3} direction=\"column\">\n {canCreateRequest && (\n <Grid item>\n <Box display=\"flex\" flexDirection=\"column\" alignItems=\"flex-end\" mb={2}>\n <Button\n variant=\"contained\"\n color=\"primary\"\n startIcon={<AddIcon />}\n onClick={() => setOpen(true)}\n disabled={plans.length === 0}\n >\n Request API Access\n </Button>\n {plans.length === 0 && (\n <Typography variant=\"caption\" color=\"textSecondary\" style={{ marginTop: 4 }}>\n {!apiProduct ? 'API product not found' : 'No plans available'}\n </Typography>\n )}\n </Box>\n </Grid>\n )}\n {pendingRequests.length === 0 && rejectedRequests.length === 0 && approvedRequests.length === 0 && (\n <Grid item>\n <Box p={3} textAlign=\"center\">\n <Typography variant=\"body1\" color=\"textSecondary\">\n No API keys yet. Request access to get started.\n </Typography>\n </Box>\n </Grid>\n )}\n {pendingRequests.length > 0 && (\n <Grid item>\n <Table\n title=\"Pending Requests\"\n options={{\n paging: pendingRequests.length > 5,\n pageSize: 20,\n search: true,\n filtering: true,\n debounceInterval: 300,\n toolbar: true,\n emptyRowsWhenPaging: false,\n }}\n columns={pendingRequestColumns}\n data={pendingRequests}\n />\n </Grid>\n )}\n {rejectedRequests.length > 0 && (\n <Grid item>\n <Table\n title=\"Rejected Requests\"\n options={{\n paging: rejectedRequests.length > 5,\n pageSize: 20,\n search: true,\n filtering: true,\n debounceInterval: 300,\n toolbar: true,\n emptyRowsWhenPaging: false,\n }}\n columns={requestColumns}\n data={rejectedRequests}\n />\n </Grid>\n )}\n {approvedRequests.length > 0 && (\n <Grid item>\n <Table\n key=\"api-keys-table\"\n title=\"API Keys\"\n options={{\n paging: approvedRequests.length > 5,\n pageSize: 20,\n search: true,\n filtering: true,\n debounceInterval: 300,\n toolbar: true,\n emptyRowsWhenPaging: false,\n }}\n columns={approvedColumns}\n data={approvedRequests}\n detailPanel={detailPanelConfig}\n />\n </Grid>\n )}\n </Grid>\n\n <Dialog open={open} onClose={() => setOpen(false)} maxWidth=\"sm\" fullWidth>\n <DialogTitle>Request API Access</DialogTitle>\n <DialogContent>\n {createError && (\n <Box mb={2} p={2} bgcolor=\"error.main\" color=\"error.contrastText\" borderRadius={1}>\n <Typography variant=\"body2\">{createError}</Typography>\n </Box>\n )}\n <FormControl fullWidth margin=\"normal\">\n <InputLabel>Select Plan Tier</InputLabel>\n <Select\n value={selectedPlan}\n onChange={(e) => setSelectedPlan(e.target.value as string)}\n >\n {plans.map((plan: Plan) => {\n const limitDesc = Object.entries(plan.limits || {})\n .map(([key, val]) => `${val} per ${key}`)\n .join(', ');\n return (\n <MenuItem key={plan.tier} value={plan.tier}>\n {plan.tier} {limitDesc ? `(${limitDesc})` : ''}\n </MenuItem>\n );\n })}\n </Select>\n </FormControl>\n <TextField\n label=\"Use Case (optional)\"\n placeholder=\"Describe how you plan to use this API\"\n multiline\n rows={3}\n fullWidth\n margin=\"normal\"\n value={useCase}\n onChange={(e) => setUseCase(e.target.value)}\n helperText=\"Explain your intended use of this API for admin review\"\n />\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setOpen(false)}>Cancel</Button>\n <Button\n onClick={handleRequestAccess}\n color=\"primary\"\n disabled={!selectedPlan || creating}\n >\n {creating ? 'Submitting...' : 'Submit Request'}\n </Button>\n </DialogActions>\n </Dialog>\n\n <Menu\n id=\"actions-menu\"\n open={Boolean(menuAnchor)}\n onClose={handleMenuClose}\n anchorReference=\"anchorPosition\"\n anchorPosition={menuAnchor || { top: 0, left: 0 }}\n >\n {menuRequest && (() => {\n const isPending = !menuRequest.status?.phase || menuRequest.status.phase === 'Pending';\n const ownerId = menuRequest.spec.requestedBy.userId;\n const canEdit = canUpdateRequest && ownerId === userId && isPending;\n\n const items = [];\n if (canEdit) {\n items.push(<MenuItem key=\"edit\" onClick={handleMenuEdit}>Edit</MenuItem>);\n }\n items.push(<MenuItem key=\"delete\" onClick={handleMenuDelete}>Delete</MenuItem>);\n return items;\n })()}\n </Menu>\n\n {requestToEdit && (\n <EditAPIKeyRequestDialog\n open={editDialogOpen}\n onClose={() => {\n setEditDialogOpen(false);\n setRequestToEdit(null);\n }}\n onSuccess={handleEditSuccess}\n request={requestToEdit}\n availablePlans={plans}\n />\n )}\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -289,6 +289,7 @@ const ApprovalQueueCard = () => {
289
289
  },
290
290
  {
291
291
  title: "Actions",
292
+ filtering: false,
292
293
  render: (row) => {
293
294
  if (!canUpdateRequests) return null;
294
295
  return /* @__PURE__ */ React.createElement(Box, { display: "flex", style: { gap: 8 } }, /* @__PURE__ */ React.createElement(
@@ -541,10 +542,14 @@ const ApprovalQueueCard = () => {
541
542
  {
542
543
  options: {
543
544
  selection: canUpdateRequests && tabData.showSelection,
544
- paging: false,
545
- search: false,
545
+ paging: requests.length > 5,
546
+ pageSize: 20,
547
+ search: true,
548
+ filtering: true,
549
+ debounceInterval: 300,
546
550
  showTextRowsSelected: false,
547
- toolbar: false
551
+ toolbar: true,
552
+ emptyRowsWhenPaging: false
548
553
  },
549
554
  data: requests,
550
555
  columns: tabData.columns,