@kuadrant/kuadrant-backstage-plugin-frontend 0.0.1-test.1-20d397d2 → 0.0.1-test.1-d62c1cdb

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.
@@ -2,7 +2,7 @@ import React, { useState } from 'react';
2
2
  import { useApi, configApiRef, fetchApiRef, identityApiRef } from '@backstage/core-plugin-api';
3
3
  import { useAsync } from 'react-use';
4
4
  import { Progress, ResponseErrorPanel, InfoCard, Table } from '@backstage/core-components';
5
- import { Box, Typography, Dialog, DialogTitle, DialogContent, TextField, DialogActions, Button, Chip } from '@material-ui/core';
5
+ import { Box, Typography, Button, Dialog, DialogTitle, DialogContent, TextField, DialogActions, Chip } from '@material-ui/core';
6
6
  import CheckCircleIcon from '@material-ui/icons/CheckCircle';
7
7
  import CancelIcon from '@material-ui/icons/Cancel';
8
8
 
@@ -33,17 +33,51 @@ const ApprovalDialog = ({ open, request, action, onClose, onConfirm }) => {
33
33
  action === "approve" ? "Approve" : "Reject"
34
34
  )));
35
35
  };
36
+ const BulkActionDialog = ({ open, requests, action, onClose, onConfirm }) => {
37
+ const [comment, setComment] = useState("");
38
+ const handleConfirm = () => {
39
+ onConfirm(comment);
40
+ setComment("");
41
+ };
42
+ const isApprove = action === "approve";
43
+ return /* @__PURE__ */ React.createElement(Dialog, { open, onClose, maxWidth: "md", fullWidth: true }, /* @__PURE__ */ React.createElement(DialogTitle, null, isApprove ? "Approve" : "Reject", " ", requests.length, " API Key Requests"), /* @__PURE__ */ React.createElement(DialogContent, null, /* @__PURE__ */ React.createElement(Typography, { variant: "body2", paragraph: true }, "You are about to ", isApprove ? "approve" : "reject", " the following requests:"), /* @__PURE__ */ React.createElement(Box, { mb: 2, maxHeight: 200, overflow: "auto" }, requests.map((request) => /* @__PURE__ */ React.createElement(Box, { key: `${request.metadata.namespace}/${request.metadata.name}`, mb: 1, p: 1, bgcolor: "background.default" }, /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, /* @__PURE__ */ React.createElement("strong", null, request.spec.requestedBy.userId), " - ", request.spec.apiName, " (", request.spec.planTier, ")")))), /* @__PURE__ */ React.createElement(
44
+ TextField,
45
+ {
46
+ label: "Comment (optional)",
47
+ multiline: true,
48
+ fullWidth: true,
49
+ margin: "normal",
50
+ value: comment,
51
+ onChange: (e) => setComment(e.target.value),
52
+ helperText: `This comment will be applied to all ${isApprove ? "approved" : "rejected"} requests`
53
+ }
54
+ )), /* @__PURE__ */ React.createElement(DialogActions, null, /* @__PURE__ */ React.createElement(Button, { onClick: onClose }, "Cancel"), /* @__PURE__ */ React.createElement(
55
+ Button,
56
+ {
57
+ onClick: handleConfirm,
58
+ color: isApprove ? "primary" : "secondary",
59
+ variant: "contained"
60
+ },
61
+ isApprove ? "Approve All" : "Reject All"
62
+ )));
63
+ };
36
64
  const ApprovalQueueCard = () => {
37
65
  const config = useApi(configApiRef);
38
66
  const fetchApi = useApi(fetchApiRef);
39
67
  const identityApi = useApi(identityApiRef);
40
68
  const backendUrl = config.getString("backend.baseUrl");
41
69
  const [refresh, setRefresh] = useState(0);
70
+ const [selectedRequests, setSelectedRequests] = useState([]);
42
71
  const [dialogState, setDialogState] = useState({
43
72
  open: false,
44
73
  request: null,
45
74
  action: "approve"
46
75
  });
76
+ const [bulkDialogState, setBulkDialogState] = useState({
77
+ open: false,
78
+ requests: [],
79
+ action: "approve"
80
+ });
47
81
  const { value, loading, error } = useAsync(async () => {
48
82
  const identity = await identityApi.getBackstageIdentity();
49
83
  const reviewedBy = identity.userEntityRef;
@@ -110,13 +144,51 @@ const ApprovalQueueCard = () => {
110
144
  console.error(`error ${dialogState.action}ing request:`, err);
111
145
  }
112
146
  };
147
+ const handleBulkApprove = () => {
148
+ if (selectedRequests.length === 0) return;
149
+ setBulkDialogState({ open: true, requests: selectedRequests, action: "approve" });
150
+ };
151
+ const handleBulkReject = () => {
152
+ if (selectedRequests.length === 0) return;
153
+ setBulkDialogState({ open: true, requests: selectedRequests, action: "reject" });
154
+ };
155
+ const handleBulkConfirm = async (comment) => {
156
+ if (!value || bulkDialogState.requests.length === 0) return;
157
+ const isApprove = bulkDialogState.action === "approve";
158
+ const endpoint = isApprove ? `${backendUrl}/api/kuadrant/requests/bulk-approve` : `${backendUrl}/api/kuadrant/requests/bulk-reject`;
159
+ try {
160
+ const response = await fetchApi.fetch(endpoint, {
161
+ method: "POST",
162
+ headers: { "Content-Type": "application/json" },
163
+ body: JSON.stringify({
164
+ requests: bulkDialogState.requests.map((r) => ({
165
+ namespace: r.metadata.namespace,
166
+ name: r.metadata.name
167
+ })),
168
+ comment,
169
+ reviewedBy: value.reviewedBy
170
+ })
171
+ });
172
+ if (!response.ok) {
173
+ throw new Error(`failed to bulk ${bulkDialogState.action} requests`);
174
+ }
175
+ setBulkDialogState({ open: false, requests: [], action: "approve" });
176
+ setSelectedRequests([]);
177
+ setRefresh((r) => r + 1);
178
+ } catch (err) {
179
+ console.error(`error bulk ${bulkDialogState.action}ing requests:`, err);
180
+ }
181
+ };
113
182
  if (loading) {
114
183
  return /* @__PURE__ */ React.createElement(Progress, null);
115
184
  }
116
185
  if (error) {
117
186
  return /* @__PURE__ */ React.createElement(ResponseErrorPanel, { error });
118
187
  }
119
- const pending = value?.pending || [];
188
+ const pending = (value?.pending || []).map((req) => ({
189
+ ...req,
190
+ id: req.metadata.name
191
+ }));
120
192
  const approved = value?.approved || [];
121
193
  const rejected = value?.rejected || [];
122
194
  const formatDate = (dateString) => {
@@ -308,18 +380,46 @@ const ApprovalQueueCard = () => {
308
380
  },
309
381
  {
310
382
  title: "Reason",
311
- field: "status.comment",
312
- render: (row) => /* @__PURE__ */ React.createElement(Typography, { variant: "body2", style: { maxWidth: 200 }, noWrap: true, title: row.status?.comment }, row.status?.comment || "-")
383
+ field: "status.reason",
384
+ render: (row) => /* @__PURE__ */ React.createElement(Typography, { variant: "body2", style: { maxWidth: 200 }, noWrap: true, title: row.status?.reason }, row.status?.reason || "-")
313
385
  }
314
386
  ];
315
- return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(InfoCard, { title: `Pending Requests (${pending.length})` }, pending.length === 0 ? /* @__PURE__ */ React.createElement(Typography, { variant: "body2", color: "textSecondary" }, "No pending requests") : /* @__PURE__ */ React.createElement(
387
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(InfoCard, { title: `Pending Requests (${pending.length})` }, pending.length === 0 ? /* @__PURE__ */ React.createElement(Typography, { variant: "body2", color: "textSecondary" }, "No pending requests") : /* @__PURE__ */ React.createElement(React.Fragment, null, selectedRequests.length > 0 && /* @__PURE__ */ React.createElement(Box, { mb: 2, display: "flex", alignItems: "center", justifyContent: "space-between", p: 2, bgcolor: "background.default" }, /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, selectedRequests.length, " request", selectedRequests.length !== 1 ? "s" : "", " selected"), /* @__PURE__ */ React.createElement(Box, { display: "flex", style: { gap: 8 } }, /* @__PURE__ */ React.createElement(
388
+ Button,
389
+ {
390
+ size: "small",
391
+ variant: "contained",
392
+ color: "primary",
393
+ startIcon: /* @__PURE__ */ React.createElement(CheckCircleIcon, null),
394
+ onClick: handleBulkApprove
395
+ },
396
+ "Approve Selected"
397
+ ), /* @__PURE__ */ React.createElement(
398
+ Button,
399
+ {
400
+ size: "small",
401
+ variant: "contained",
402
+ color: "secondary",
403
+ startIcon: /* @__PURE__ */ React.createElement(CancelIcon, null),
404
+ onClick: handleBulkReject
405
+ },
406
+ "Reject Selected"
407
+ ))), /* @__PURE__ */ React.createElement(
316
408
  Table,
317
409
  {
318
- options: { paging: true, pageSize: 5, search: false, toolbar: false },
410
+ options: {
411
+ selection: true,
412
+ paging: true,
413
+ pageSize: 5,
414
+ search: false,
415
+ showTextRowsSelected: false,
416
+ toolbar: false
417
+ },
319
418
  data: pending,
320
- columns: pendingColumns
419
+ columns: pendingColumns,
420
+ onSelectionChange: (rows) => setSelectedRequests(rows)
321
421
  }
322
- )), approved.length > 0 && /* @__PURE__ */ React.createElement(Box, { mt: 3 }, /* @__PURE__ */ React.createElement(InfoCard, { title: `Approved Requests (${approved.length})` }, /* @__PURE__ */ React.createElement(
422
+ ))), approved.length > 0 && /* @__PURE__ */ React.createElement(Box, { mt: 3 }, /* @__PURE__ */ React.createElement(InfoCard, { title: `Approved Requests (${approved.length})` }, /* @__PURE__ */ React.createElement(
323
423
  Table,
324
424
  {
325
425
  options: { paging: true, pageSize: 5, search: false, toolbar: false },
@@ -342,6 +442,15 @@ const ApprovalQueueCard = () => {
342
442
  onClose: () => setDialogState({ open: false, request: null, action: "approve" }),
343
443
  onConfirm: handleConfirm
344
444
  }
445
+ ), /* @__PURE__ */ React.createElement(
446
+ BulkActionDialog,
447
+ {
448
+ open: bulkDialogState.open,
449
+ requests: bulkDialogState.requests,
450
+ action: bulkDialogState.action,
451
+ onClose: () => setBulkDialogState({ open: false, requests: [], action: "approve" }),
452
+ onConfirm: handleBulkConfirm
453
+ }
345
454
  ));
346
455
  };
347
456
 
@@ -1 +1 @@
1
- {"version":3,"file":"ApprovalQueueCard.esm.js","sources":["../../../src/components/ApprovalQueueCard/ApprovalQueueCard.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { useApi, fetchApiRef, identityApiRef, configApiRef } from '@backstage/core-plugin-api';\nimport { useAsync } from 'react-use';\nimport {\n Table,\n TableColumn,\n Progress,\n ResponseErrorPanel,\n InfoCard,\n} from '@backstage/core-components';\nimport {\n Button,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n TextField,\n Chip,\n Typography,\n Box,\n} from '@material-ui/core';\nimport CheckCircleIcon from '@material-ui/icons/CheckCircle';\nimport CancelIcon from '@material-ui/icons/Cancel';\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 const handleConfirm = () => {\n onConfirm(comment);\n setComment('');\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 <p><strong>Use Case:</strong> {request.spec.useCase || '-'}</p>\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\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 [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\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: [], approved: [], rejected: [], 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: [], approved: [], rejected: [], 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 if (loading) {\n return <Progress />;\n }\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\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 <Typography variant=\"body2\" style={{ maxWidth: 200 }} noWrap title={row.spec.useCase}>\n {row.spec.useCase || '-'}\n </Typography>\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 <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 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.comment',\n render: (row) => (\n <Typography variant=\"body2\" style={{ maxWidth: 200 }} noWrap title={row.status?.comment}>\n {row.status?.comment || '-'}\n </Typography>\n ),\n },\n ];\n\n return (\n <>\n <Box>\n <InfoCard title={`Pending Requests (${pending.length})`}>\n {pending.length === 0 ? (\n <Typography variant=\"body2\" color=\"textSecondary\">No pending requests</Typography>\n ) : (\n <Table\n options={{ paging: true, pageSize: 5, search: false, toolbar: false }}\n data={pending}\n columns={pendingColumns}\n />\n )}\n </InfoCard>\n\n {approved.length > 0 && (\n <Box mt={3}>\n <InfoCard title={`Approved Requests (${approved.length})`}>\n <Table\n options={{ paging: true, pageSize: 5, search: false, toolbar: false }}\n data={approved}\n columns={approvedColumns}\n />\n </InfoCard>\n </Box>\n )}\n\n {rejected.length > 0 && (\n <Box mt={3}>\n <InfoCard title={`Rejected Requests (${rejected.length})`}>\n <Table\n options={{ paging: true, pageSize: 5, search: false, toolbar: false }}\n data={rejected}\n columns={rejectedColumns}\n />\n </InfoCard>\n </Box>\n )}\n </Box>\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 </>\n );\n};\n"],"names":["pending","approved","rejected"],"mappings":"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"}
1
+ {"version":3,"file":"ApprovalQueueCard.esm.js","sources":["../../../src/components/ApprovalQueueCard/ApprovalQueueCard.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { 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 {\n Button,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n TextField,\n Chip,\n Typography,\n Box,\n} from '@material-ui/core';\nimport CheckCircleIcon from '@material-ui/icons/CheckCircle';\nimport CancelIcon from '@material-ui/icons/Cancel';\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 const handleConfirm = () => {\n onConfirm(comment);\n setComment('');\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 <p><strong>Use Case:</strong> {request.spec.useCase || '-'}</p>\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 const handleConfirm = () => {\n onConfirm(comment);\n setComment('');\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 [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 { 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: [], approved: [], rejected: [], 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: [], approved: [], rejected: [], 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) {\n return <Progress />;\n }\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n const pending = (value?.pending || []).map((req: APIKeyRequest) => ({\n ...req,\n id: req.metadata.name,\n }));\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 <Typography variant=\"body2\" style={{ maxWidth: 200 }} noWrap title={row.spec.useCase}>\n {row.spec.useCase || '-'}\n </Typography>\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 <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 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 <Typography variant=\"body2\" style={{ maxWidth: 200 }} noWrap title={row.status?.reason}>\n {row.status?.reason || '-'}\n </Typography>\n ),\n },\n ];\n\n return (\n <>\n <Box>\n <InfoCard title={`Pending Requests (${pending.length})`}>\n {pending.length === 0 ? (\n <Typography variant=\"body2\" color=\"textSecondary\">No pending requests</Typography>\n ) : (\n <>\n {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 <Table\n options={{\n selection: true,\n paging: true,\n pageSize: 5,\n search: false,\n showTextRowsSelected: false,\n toolbar: false,\n }}\n data={pending}\n columns={pendingColumns}\n onSelectionChange={(rows) => setSelectedRequests(rows as APIKeyRequest[])}\n />\n </>\n )}\n </InfoCard>\n\n {approved.length > 0 && (\n <Box mt={3}>\n <InfoCard title={`Approved Requests (${approved.length})`}>\n <Table\n options={{ paging: true, pageSize: 5, search: false, toolbar: false }}\n data={approved}\n columns={approvedColumns}\n />\n </InfoCard>\n </Box>\n )}\n\n {rejected.length > 0 && (\n <Box mt={3}>\n <InfoCard title={`Rejected Requests (${rejected.length})`}>\n <Table\n options={{ paging: true, pageSize: 5, search: false, toolbar: false }}\n data={rejected}\n columns={rejectedColumns}\n />\n </InfoCard>\n </Box>\n )}\n </Box>\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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kuadrant/kuadrant-backstage-plugin-frontend",
3
- "version": "0.0.1-test.1-20d397d2",
3
+ "version": "0.0.1-test.1-d62c1cdb",
4
4
  "license": "Apache-2.0",
5
5
  "repository": {
6
6
  "type": "git",