@kuadrant/kuadrant-backstage-plugin-frontend 0.0.2-dev-9be93a3 → 0.0.2-dev-8189c1c
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/api.esm.js +16 -0
- package/dist/api.esm.js.map +1 -1
- package/dist/components/ApiAccessCard/ApiAccessCard.esm.js.map +1 -1
- package/dist/components/ApiKeyManagementTab/ApiKeyManagementTab.esm.js.map +1 -1
- package/dist/components/ApiProductDetails/ApiProductDetails.esm.js.map +1 -1
- package/dist/components/ApiProductPolicies/ApiProductPolicies.esm.js +113 -0
- package/dist/components/ApiProductPolicies/ApiProductPolicies.esm.js.map +1 -0
- package/dist/components/CreateAPIProductDialog/CreateAPIProductDialog.esm.js +57 -13
- package/dist/components/CreateAPIProductDialog/CreateAPIProductDialog.esm.js.map +1 -1
- package/dist/components/EditAPIProductDialog/EditAPIProductDialog.esm.js +49 -8
- package/dist/components/EditAPIProductDialog/EditAPIProductDialog.esm.js.map +1 -1
- package/dist/components/KuadrantPage/ApiProductsPage.esm.js +1 -1
- package/dist/components/KuadrantPage/ApiProductsPage.esm.js.map +1 -1
- package/dist/components/RequestAccessDialog/RequestAccessDialog.esm.js.map +1 -1
- package/dist/index.d.ts +59 -8
- package/dist/index.esm.js +1 -1
- package/dist/permissions.esm.js +12 -2
- package/dist/permissions.esm.js.map +1 -1
- package/dist/utils/policies.esm.js +11 -0
- package/dist/utils/policies.esm.js.map +1 -0
- package/dist-scalprum/{internal.plugin-kuadrant.8bf02d5482a5a3ed6337.js → internal.plugin-kuadrant.1ed3b3b414caa08ac5be.js} +2 -2
- package/dist-scalprum/{internal.plugin-kuadrant.8bf02d5482a5a3ed6337.js.map → internal.plugin-kuadrant.1ed3b3b414caa08ac5be.js.map} +1 -1
- package/dist-scalprum/plugin-manifest.json +3 -3
- package/dist-scalprum/static/{2967.28e7c7f8.chunk.js → 2967.17aec2fb.chunk.js} +1 -1
- package/dist-scalprum/static/2967.17aec2fb.chunk.js.map +1 -0
- package/dist-scalprum/static/{3947.ff1c25cf.chunk.js → 3947.ad129ba4.chunk.js} +1 -1
- package/dist-scalprum/static/{3947.ff1c25cf.chunk.js.map → 3947.ad129ba4.chunk.js.map} +1 -1
- package/dist-scalprum/static/{3976.cf3ec7be.chunk.js → 3976.c8138b52.chunk.js} +1 -1
- package/dist-scalprum/static/{3976.cf3ec7be.chunk.js.map → 3976.c8138b52.chunk.js.map} +1 -1
- package/dist-scalprum/static/4447.d924bc59.chunk.js +2 -0
- package/dist-scalprum/static/4447.d924bc59.chunk.js.map +1 -0
- package/dist-scalprum/static/{5203.e92a3353.chunk.js → 5203.11ef2211.chunk.js} +1 -1
- package/dist-scalprum/static/5203.11ef2211.chunk.js.map +1 -0
- package/dist-scalprum/static/{6371.6ee1f11d.chunk.js → 6371.d849c508.chunk.js} +1 -1
- package/dist-scalprum/static/6371.d849c508.chunk.js.map +1 -0
- package/dist-scalprum/static/6387.79be6155.chunk.js +2 -0
- package/dist-scalprum/static/6387.79be6155.chunk.js.map +1 -0
- package/dist-scalprum/static/{6800.a7645f4c.chunk.js → 6800.6faeb7c6.chunk.js} +1 -1
- package/dist-scalprum/static/{6800.a7645f4c.chunk.js.map → 6800.6faeb7c6.chunk.js.map} +1 -1
- package/dist-scalprum/static/69.b6afd1fe.chunk.js +2 -0
- package/dist-scalprum/static/69.b6afd1fe.chunk.js.map +1 -0
- package/dist-scalprum/static/7005.98c5e400.chunk.js +2 -0
- package/dist-scalprum/static/7005.98c5e400.chunk.js.map +1 -0
- package/dist-scalprum/static/{7270.b0e185f1.chunk.js → 7270.4a71807b.chunk.js} +1 -1
- package/dist-scalprum/static/{7270.b0e185f1.chunk.js.map → 7270.4a71807b.chunk.js.map} +1 -1
- package/dist-scalprum/static/{7791.5c1eea8a.chunk.js → 7791.0a1d55bc.chunk.js} +1 -1
- package/dist-scalprum/static/{7791.5c1eea8a.chunk.js.map → 7791.0a1d55bc.chunk.js.map} +1 -1
- package/dist-scalprum/static/8789.2f437443.chunk.js +2 -0
- package/dist-scalprum/static/8789.2f437443.chunk.js.map +1 -0
- package/dist-scalprum/static/{9051.db875198.chunk.js → 9051.d45ac154.chunk.js} +2 -2
- package/dist-scalprum/static/9051.d45ac154.chunk.js.map +1 -0
- package/dist-scalprum/static/{9838.5df9b1de.chunk.js → 9838.966ce0a0.chunk.js} +1 -1
- package/dist-scalprum/static/9838.966ce0a0.chunk.js.map +1 -0
- package/dist-scalprum/static/{exposed-PluginRoot.8a8dd91f.chunk.js → exposed-PluginRoot.3b24e5af.chunk.js} +2 -2
- package/dist-scalprum/static/{exposed-PluginRoot.8a8dd91f.chunk.js.map → exposed-PluginRoot.3b24e5af.chunk.js.map} +1 -1
- package/package.json +1 -1
- package/dist/components/PlanPolicyDetailsCard/PlanPolicyDetails.esm.js +0 -48
- package/dist/components/PlanPolicyDetailsCard/PlanPolicyDetails.esm.js.map +0 -1
- package/dist-scalprum/static/2967.28e7c7f8.chunk.js.map +0 -1
- package/dist-scalprum/static/4447.222bb58d.chunk.js +0 -2
- package/dist-scalprum/static/4447.222bb58d.chunk.js.map +0 -1
- package/dist-scalprum/static/5203.e92a3353.chunk.js.map +0 -1
- package/dist-scalprum/static/6371.6ee1f11d.chunk.js.map +0 -1
- package/dist-scalprum/static/69.1decc5e8.chunk.js +0 -2
- package/dist-scalprum/static/69.1decc5e8.chunk.js.map +0 -1
- package/dist-scalprum/static/7005.a9f73153.chunk.js +0 -2
- package/dist-scalprum/static/7005.a9f73153.chunk.js.map +0 -1
- package/dist-scalprum/static/8789.84963cbc.chunk.js +0 -2
- package/dist-scalprum/static/8789.84963cbc.chunk.js.map +0 -1
- package/dist-scalprum/static/8804.63919453.chunk.js +0 -2
- package/dist-scalprum/static/8804.63919453.chunk.js.map +0 -1
- package/dist-scalprum/static/9051.db875198.chunk.js.map +0 -1
- package/dist-scalprum/static/9838.5df9b1de.chunk.js.map +0 -1
|
@@ -5,9 +5,11 @@ import AddIcon from '@material-ui/icons/Add';
|
|
|
5
5
|
import { useApi } from '@backstage/core-plugin-api';
|
|
6
6
|
import { kuadrantApiRef } from '../../api.esm.js';
|
|
7
7
|
import { Alert } from '@material-ui/lab';
|
|
8
|
+
import useAsync from 'react-use/lib/useAsync';
|
|
8
9
|
import { Progress } from '@backstage/core-components';
|
|
9
|
-
import {
|
|
10
|
+
import { ApiProductPolicies } from '../ApiProductPolicies/ApiProductPolicies.esm.js';
|
|
10
11
|
import { validateURL } from '../../utils/validation.esm.js';
|
|
12
|
+
import { getPolicyForRoute } from '../../utils/policies.esm.js';
|
|
11
13
|
|
|
12
14
|
const useStyles = makeStyles((theme) => ({
|
|
13
15
|
asterisk: {
|
|
@@ -46,7 +48,8 @@ const EditAPIProductDialog = ({ open, onClose, onSuccess, namespace, name }) =>
|
|
|
46
48
|
const [contactTeam, setContactTeam] = useState("");
|
|
47
49
|
const [docsURL, setDocsURL] = useState("");
|
|
48
50
|
const [openAPISpec, setOpenAPISpec] = useState("");
|
|
49
|
-
const [
|
|
51
|
+
const [planPolicyProps, setPlanPoliciesProps] = useState(null);
|
|
52
|
+
const [authPolicyProps, setAuthPolicyProps] = useState(null);
|
|
50
53
|
const [error, setError] = useState("");
|
|
51
54
|
const [saving, setSaving] = useState(false);
|
|
52
55
|
const [openAPISpecError, setOpenAPISpecError] = useState(null);
|
|
@@ -67,7 +70,28 @@ const EditAPIProductDialog = ({ open, onClose, onSuccess, namespace, name }) =>
|
|
|
67
70
|
setContactTeam(data.spec.contact?.team || "");
|
|
68
71
|
setDocsURL(data.spec.documentation?.docsURL || "");
|
|
69
72
|
setOpenAPISpec(data.spec.documentation?.openAPISpecURL || "");
|
|
70
|
-
|
|
73
|
+
const planPolicyCondition = data.status?.conditions?.find(
|
|
74
|
+
(c) => c.type === "PlanPolicyDiscovered"
|
|
75
|
+
) || null;
|
|
76
|
+
setPlanPoliciesProps({
|
|
77
|
+
statusCondition: planPolicyCondition,
|
|
78
|
+
discoveredPlans: data.status?.discoveredPlans || null
|
|
79
|
+
});
|
|
80
|
+
const authPolicyCondition = data.status?.conditions?.find(
|
|
81
|
+
(c) => c.type === "AuthPolicyDiscovered"
|
|
82
|
+
) || null;
|
|
83
|
+
const parseNameFromMessage = (value) => {
|
|
84
|
+
const parts = value.split(" ");
|
|
85
|
+
return parts.length >= 3 ? parts[2] : "";
|
|
86
|
+
};
|
|
87
|
+
const authPolicyName = authPolicyCondition?.status === "True" ? parseNameFromMessage(authPolicyCondition.message ?? "") : "";
|
|
88
|
+
setAuthPolicyProps({
|
|
89
|
+
statusCondition: authPolicyCondition,
|
|
90
|
+
namespacedName: {
|
|
91
|
+
name: authPolicyName,
|
|
92
|
+
namespace: data.metadata.namespace
|
|
93
|
+
}
|
|
94
|
+
});
|
|
71
95
|
setOpenAPISpecError(null);
|
|
72
96
|
setLoading(false);
|
|
73
97
|
}).catch((err) => {
|
|
@@ -81,6 +105,23 @@ const EditAPIProductDialog = ({ open, onClose, onSuccess, namespace, name }) =>
|
|
|
81
105
|
setOpenAPISpecError(null);
|
|
82
106
|
}
|
|
83
107
|
}, [open]);
|
|
108
|
+
const {
|
|
109
|
+
value: rateLimitPolicies,
|
|
110
|
+
error: rateLimitPoliciesError
|
|
111
|
+
} = useAsync(async () => {
|
|
112
|
+
return await kuadrantApi.getRateLimitPolicies();
|
|
113
|
+
}, [kuadrantApi, open]);
|
|
114
|
+
const selectedRateLimitPolicy = targetRef ? getPolicyForRoute(rateLimitPolicies?.items, namespace, targetRef.name) : null;
|
|
115
|
+
const rateLimitPolicyAcceptedCondition = selectedRateLimitPolicy?.status?.conditions?.find(
|
|
116
|
+
(c) => c.type === "Accepted"
|
|
117
|
+
);
|
|
118
|
+
const rateLimitPolicyProps = {
|
|
119
|
+
namespacedName: {
|
|
120
|
+
namespace: selectedRateLimitPolicy?.metadata.namespace,
|
|
121
|
+
name: selectedRateLimitPolicy?.metadata.name
|
|
122
|
+
},
|
|
123
|
+
statusCondition: rateLimitPolicyAcceptedCondition
|
|
124
|
+
};
|
|
84
125
|
const handleOpenAPISpecChange = (value) => {
|
|
85
126
|
setOpenAPISpec(value);
|
|
86
127
|
setOpenAPISpecError(validateURL(value));
|
|
@@ -141,7 +182,7 @@ const EditAPIProductDialog = ({ open, onClose, onSuccess, namespace, name }) =>
|
|
|
141
182
|
setSaving(false);
|
|
142
183
|
}
|
|
143
184
|
};
|
|
144
|
-
return /* @__PURE__ */ React.createElement(Dialog, { open, onClose, maxWidth: "md", fullWidth: true }, /* @__PURE__ */ React.createElement(DialogTitle, null, "Edit API Product"), /* @__PURE__ */ React.createElement(DialogContent, null, error && /* @__PURE__ */ React.createElement(Alert, { severity: "error", style: { marginBottom: 16 } }, error), loading ? /* @__PURE__ */ React.createElement(Progress, null) : /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Box, { className: classes.sectionHeader }, /* @__PURE__ */ React.createElement(Typography, { variant: "subtitle1" }, /* @__PURE__ */ React.createElement("strong", null, "API product info"))), /* @__PURE__ */ React.createElement(Grid, { container: true, spacing: 2 }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 6 }, /* @__PURE__ */ React.createElement(
|
|
185
|
+
return /* @__PURE__ */ React.createElement(Dialog, { open, onClose, maxWidth: "md", fullWidth: true }, /* @__PURE__ */ React.createElement(DialogTitle, null, "Edit API Product"), /* @__PURE__ */ React.createElement(DialogContent, null, error && /* @__PURE__ */ React.createElement(Alert, { severity: "error", style: { marginBottom: 16 } }, error), rateLimitPoliciesError && /* @__PURE__ */ React.createElement(Alert, { severity: "error", style: { marginBottom: 16 } }, /* @__PURE__ */ React.createElement("strong", null, "Failed to load RateLimitPolicies:"), " ", rateLimitPoliciesError.message), loading ? /* @__PURE__ */ React.createElement(Progress, null) : /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Box, { className: classes.sectionHeader }, /* @__PURE__ */ React.createElement(Typography, { variant: "subtitle1" }, /* @__PURE__ */ React.createElement("strong", null, "API product info"))), /* @__PURE__ */ React.createElement(Grid, { container: true, spacing: 2 }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 6 }, /* @__PURE__ */ React.createElement(
|
|
145
186
|
TextField,
|
|
146
187
|
{
|
|
147
188
|
fullWidth: true,
|
|
@@ -267,11 +308,11 @@ const EditAPIProductDialog = ({ open, onClose, onSuccess, namespace, name }) =>
|
|
|
267
308
|
margin: "normal"
|
|
268
309
|
}
|
|
269
310
|
))), targetRef && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Box, { className: classes.sectionHeader }, /* @__PURE__ */ React.createElement(Typography, { variant: "subtitle1" }, /* @__PURE__ */ React.createElement("strong", null, "HTTPRoute policies")), /* @__PURE__ */ React.createElement(Tooltip, { title: "Shows the associated policies and rate limit tiers for the HTTPRoute" }, /* @__PURE__ */ React.createElement(InfoOutlinedIcon, { className: classes.infoIcon }))), /* @__PURE__ */ React.createElement(
|
|
270
|
-
|
|
311
|
+
ApiProductPolicies,
|
|
271
312
|
{
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
313
|
+
planPolicy: planPolicyProps,
|
|
314
|
+
authPolicy: authPolicyProps,
|
|
315
|
+
rateLimitPolicy: rateLimitPolicyProps,
|
|
275
316
|
includeTopMargin: false
|
|
276
317
|
}
|
|
277
318
|
)), /* @__PURE__ */ React.createElement(Box, { className: classes.sectionHeader }, /* @__PURE__ */ React.createElement(Typography, { variant: "subtitle1" }, /* @__PURE__ */ React.createElement("strong", null, "Lifecycle and Visibility")), /* @__PURE__ */ React.createElement(Tooltip, { title: "Control the lifecycle state and catalog visibility of this API product" }, /* @__PURE__ */ React.createElement(InfoOutlinedIcon, { className: classes.infoIcon }))), /* @__PURE__ */ React.createElement(Grid, { container: true, spacing: 2 }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 6 }, /* @__PURE__ */ React.createElement(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditAPIProductDialog.esm.js","sources":["../../../src/components/EditAPIProductDialog/EditAPIProductDialog.tsx"],"sourcesContent":["import React, { useState, useEffect } from 'react';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Button,\n TextField,\n Box,\n Typography,\n Chip,\n Grid,\n MenuItem,\n CircularProgress,\n makeStyles,\n FormControl,\n RadioGroup,\n FormControlLabel,\n Radio,\n Tooltip,\n IconButton,\n InputAdornment,\n} from '@material-ui/core';\nimport InfoOutlinedIcon from '@material-ui/icons/InfoOutlined';\nimport AddIcon from '@material-ui/icons/Add';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { kuadrantApiRef } from '../../api';\nimport { Alert } from '@material-ui/lab';\nimport { Progress } from '@backstage/core-components';\nimport { PlanPolicyDetails } from '../PlanPolicyDetailsCard';\nimport { validateURL } from '../../utils/validation';\nimport {APIProduct, Plan} from \"../../types/api-management.ts\";\nimport { Lifecycle } from '../../types/api-management';\n\nconst useStyles = makeStyles((theme) => ({\n asterisk: {\n color: '#f44336',\n },\n sectionHeader: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n marginTop: theme.spacing(2),\n marginBottom: theme.spacing(1),\n },\n infoIcon: {\n fontSize: 18,\n color: theme.palette.text.secondary,\n },\n tagChip: {\n marginRight: theme.spacing(0.5),\n marginBottom: theme.spacing(0.5),\n },\n}));\n\ninterface EditAPIProductDialogProps {\n open: boolean;\n onClose: () => void;\n onSuccess: () => void;\n namespace: string;\n name: string;\n}\n\nexport const EditAPIProductDialog = ({ open, onClose, onSuccess, namespace, name }: EditAPIProductDialogProps) => {\n const classes = useStyles();\n const kuadrantApi = useApi(kuadrantApiRef);\n const [loading, setLoading] = useState(false);\n const [displayName, setDisplayName] = useState('');\n const [description, setDescription] = useState('');\n const [version, setVersion] = useState('v1');\n const [publishStatus, setPublishStatus] = useState<'Draft' | 'Published'>('Draft');\n const [lifecycle, setLifecycle] = useState<Lifecycle>('production');\n const [approvalMode, setApprovalMode] = useState<'automatic' | 'manual'>('manual');\n const [tags, setTags] = useState<string[]>([]);\n const [targetRef, setTargetRef] = useState<any>(null);\n const [tagInput, setTagInput] = useState('');\n const [contactEmail, setContactEmail] = useState('');\n const [contactTeam, setContactTeam] = useState('');\n const [docsURL, setDocsURL] = useState('');\n const [openAPISpec, setOpenAPISpec] = useState('');\n const [discoveredPlans, setdiscoveredPlans] = useState<Plan[]>([]);\n const [error, setError] = useState('');\n const [saving, setSaving] = useState(false);\n const [openAPISpecError, setOpenAPISpecError] = useState<string | null>(null);\n\n // Load APIProduct data when dialog opens\n useEffect(() => {\n if (open && namespace && name) {\n setLoading(true);\n setError('');\n kuadrantApi.getApiProduct(namespace, name)\n .then(data => {\n setDisplayName(data.spec.displayName || '');\n setDescription(data.spec.description || '');\n setVersion(data.spec.version || 'v1');\n setPublishStatus(data.spec.publishStatus || 'Draft');\n setLifecycle(data.metadata.labels?.lifecycle as Lifecycle || 'production' as Lifecycle);\n setApprovalMode(data.spec.approvalMode || 'manual');\n setTags(data.spec.tags || []);\n setTargetRef(data.spec.targetRef || null);\n setContactEmail(data.spec.contact?.email || '');\n setContactTeam(data.spec.contact?.team || '');\n setDocsURL(data.spec.documentation?.docsURL || '');\n setOpenAPISpec(data.spec.documentation?.openAPISpecURL || '');\n setdiscoveredPlans(data.status?.discoveredPlans || []);\n setOpenAPISpecError(null);\n setLoading(false);\n })\n .catch(err => {\n setError(err.message || 'Failed to load API product');\n setLoading(false);\n });\n }\n }, [open, namespace, name, kuadrantApi]);\n\n useEffect(() => {\n if (open) {\n setOpenAPISpecError(null);\n }\n }, [open]);\n\n const handleOpenAPISpecChange = (value: string) => {\n setOpenAPISpec(value);\n setOpenAPISpecError(validateURL(value));\n };\n\n const handleAddTag = () => {\n if (tagInput.trim() && !tags.includes(tagInput.trim())) {\n setTags([...tags, tagInput.trim()]);\n setTagInput('');\n }\n };\n\n const handleDeleteTag = (tagToDelete: string) => {\n setTags(tags.filter(tag => tag !== tagToDelete));\n };\n\n const handleSave = async () => {\n setError('');\n setSaving(true);\n\n // validate retired APIs cannot be published\n if (lifecycle === 'retired' && publishStatus === 'Published') {\n setError('Cannot publish a retired API product. Please set publish status to Draft.');\n setSaving(false);\n return;\n }\n\n try {\n const patch: Partial<APIProduct> = {\n // @ts-ignore We are applying a partial obj, not full\n metadata: {\n labels: {\n lifecycle,\n },\n },\n spec: {\n displayName,\n description,\n version,\n publishStatus,\n approvalMode,\n tags,\n targetRef,\n ...(contactEmail || contactTeam ? {\n contact: {\n ...(contactEmail && { email: contactEmail }),\n ...(contactTeam && { team: contactTeam }),\n },\n } : {}),\n ...(docsURL || openAPISpec ? {\n documentation: {\n ...(docsURL && { docsURL }),\n ...(openAPISpec && { openAPISpecURL: openAPISpec }),\n },\n } : {}),\n },\n };\n\n await kuadrantApi.updateApiProduct(namespace, name, patch);\n onSuccess();\n onClose();\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setSaving(false);\n }\n };\n\n return (\n <Dialog open={open} onClose={onClose} maxWidth=\"md\" fullWidth>\n <DialogTitle>Edit API Product</DialogTitle>\n <DialogContent>\n {error && (\n <Alert severity=\"error\" style={{ marginBottom: 16 }}>\n {error}\n </Alert>\n )}\n {loading ? (\n <Progress />\n ) : (\n <>\n {/* API product info section */}\n <Box className={classes.sectionHeader}>\n <Typography variant=\"subtitle1\"><strong>API product info</strong></Typography>\n </Box>\n <Grid container spacing={2}>\n <Grid item xs={6}>\n <TextField\n fullWidth\n label=\"API product name\"\n value={displayName}\n onChange={e => setDisplayName(e.target.value)}\n placeholder=\"My API\"\n helperText=\"Give a unique name for your API product\"\n margin=\"normal\"\n required\n disabled={saving}\n InputLabelProps={{\n classes: {\n asterisk: classes.asterisk,\n },\n }}\n />\n </Grid>\n <Grid item xs={6}>\n <TextField\n fullWidth\n label=\"Resource name\"\n value={name}\n disabled\n helperText=\"Kubernetes resource name (immutable)\"\n margin=\"normal\"\n />\n </Grid>\n <Grid item xs={6}>\n <TextField\n fullWidth\n label=\"Version\"\n value={version}\n onChange={e => setVersion(e.target.value)}\n placeholder=\"v1\"\n helperText=\"Give a version to your API product\"\n margin=\"normal\"\n disabled={saving}\n />\n </Grid>\n <Grid item xs={6}>\n <TextField\n fullWidth\n label=\"Tag\"\n value={tagInput}\n onChange={e => setTagInput(e.target.value)}\n onKeyPress={e => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleAddTag();\n }\n }}\n placeholder=\"Add tag\"\n helperText=\"Add a tag to your API product\"\n margin=\"normal\"\n disabled={saving}\n InputProps={{\n endAdornment: tagInput ? (\n <InputAdornment position=\"end\">\n <IconButton size=\"small\" onClick={handleAddTag} disabled={saving}>\n <AddIcon fontSize=\"small\" />\n </IconButton>\n </InputAdornment>\n ) : undefined,\n }}\n />\n </Grid>\n {tags.length > 0 && (\n <Grid item xs={12}>\n <Box display=\"flex\" flexWrap=\"wrap\">\n {tags.map(tag => (\n <Chip\n key={tag}\n label={tag}\n onDelete={saving ? undefined : () => handleDeleteTag(tag)}\n size=\"small\"\n className={classes.tagChip}\n disabled={saving}\n />\n ))}\n </Box>\n </Grid>\n )}\n <Grid item xs={12}>\n <TextField\n fullWidth\n label=\"Description\"\n value={description}\n onChange={e => setDescription(e.target.value)}\n placeholder=\"API description\"\n margin=\"normal\"\n multiline\n rows={2}\n required\n disabled={saving}\n InputLabelProps={{\n classes: {\n asterisk: classes.asterisk,\n },\n }}\n />\n </Grid>\n </Grid>\n\n {/* Associated route section */}\n <Box className={classes.sectionHeader}>\n <Typography variant=\"subtitle1\"><strong>Associated route</strong></Typography>\n <Tooltip title=\"The HTTPRoute this API product is associated with\">\n <InfoOutlinedIcon className={classes.infoIcon} />\n </Tooltip>\n </Box>\n <Grid container spacing={2}>\n <Grid item xs={12}>\n <TextField\n fullWidth\n label=\"OpenAPI Spec URL\"\n value={openAPISpec}\n onChange={e => handleOpenAPISpecChange(e.target.value)}\n placeholder=\"https://api.example.com/openapi.json\"\n helperText={openAPISpecError || \"Enter the full path to your API spec file\"}\n error={!!openAPISpecError}\n margin=\"normal\"\n disabled={saving}\n />\n </Grid>\n <Grid item xs={12}>\n <TextField\n fullWidth\n label=\"Documentation URL\"\n value={docsURL}\n onChange={e => setDocsURL(e.target.value)}\n placeholder=\"https://docs.example.com/api\"\n helperText=\"Link to external documentation for this API\"\n margin=\"normal\"\n disabled={saving}\n />\n </Grid>\n {targetRef && (\n <Grid item xs={12}>\n <TextField\n fullWidth\n label=\"HTTPRoute\"\n value={`${targetRef.namespace || namespace}/${targetRef.name}`}\n disabled\n helperText=\"Target HTTPRoute (immutable)\"\n margin=\"normal\"\n />\n </Grid>\n )}\n </Grid>\n\n {/* HTTPRoute policies section */}\n {targetRef && (\n <>\n <Box className={classes.sectionHeader}>\n <Typography variant=\"subtitle1\"><strong>HTTPRoute policies</strong></Typography>\n <Tooltip title=\"Shows the associated policies and rate limit tiers for the HTTPRoute\">\n <InfoOutlinedIcon className={classes.infoIcon} />\n </Tooltip>\n </Box>\n <PlanPolicyDetails\n discoveredPlans={discoveredPlans}\n alertSeverity=\"info\"\n alertMessage=\"No PlanPolicy found for this HTTPRoute.\"\n includeTopMargin={false}\n />\n </>\n )}\n\n {/* Lifecycle and Visibility section */}\n <Box className={classes.sectionHeader}>\n <Typography variant=\"subtitle1\"><strong>Lifecycle and Visibility</strong></Typography>\n <Tooltip title=\"Control the lifecycle state and catalog visibility of this API product\">\n <InfoOutlinedIcon className={classes.infoIcon} />\n </Tooltip>\n </Box>\n <Grid container spacing={2}>\n <Grid item xs={6}>\n <TextField\n fullWidth\n select\n label=\"Lifecycle\"\n value={lifecycle}\n onChange={e => setLifecycle(e.target.value as Lifecycle)}\n margin=\"normal\"\n helperText=\"API lifecycle state\"\n disabled={saving}\n >\n <MenuItem value=\"experimental\">Experimental</MenuItem>\n <MenuItem value=\"production\">Production</MenuItem>\n <MenuItem value=\"deprecated\">Deprecated</MenuItem>\n <MenuItem value=\"retired\">Retired</MenuItem>\n </TextField>\n </Grid>\n <Grid item xs={6}>\n <TextField\n fullWidth\n select\n label=\"Publish Status\"\n value={publishStatus}\n onChange={e => setPublishStatus(e.target.value as 'Draft' | 'Published')}\n margin=\"normal\"\n helperText=\"Controls catalog visibility\"\n disabled={saving}\n >\n <MenuItem value=\"Draft\">Draft</MenuItem>\n <MenuItem value=\"Published\">Published</MenuItem>\n </TextField>\n </Grid>\n </Grid>\n\n {/* API Key approval section */}\n <Box className={classes.sectionHeader}>\n <Typography variant=\"subtitle1\"><strong>API Key approval</strong></Typography>\n <Tooltip title=\"Choose how API key requests are handled for this product\">\n <InfoOutlinedIcon className={classes.infoIcon} />\n </Tooltip>\n </Box>\n <FormControl component=\"fieldset\" disabled={saving}>\n <RadioGroup\n row\n value={approvalMode}\n onChange={e => setApprovalMode(e.target.value as 'automatic' | 'manual')}\n >\n <FormControlLabel\n value=\"manual\"\n control={<Radio color=\"primary\" />}\n label={\n <Box>\n <Typography variant=\"body2\">Need manual approval</Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n Requires approval for requesting this API\n </Typography>\n </Box>\n }\n />\n <FormControlLabel\n value=\"automatic\"\n control={<Radio color=\"primary\" />}\n label={\n <Box>\n <Typography variant=\"body2\">Automatic</Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n Keys are created without need to be approved\n </Typography>\n </Box>\n }\n />\n </RadioGroup>\n </FormControl>\n </>\n )}\n </DialogContent>\n <DialogActions>\n <Button onClick={onClose} disabled={saving}>Cancel</Button>\n <Button\n onClick={handleSave}\n color=\"primary\"\n variant=\"contained\"\n disabled={saving || loading || !displayName || !description || !!openAPISpecError}\n startIcon={saving ? <CircularProgress size={16} color=\"inherit\" /> : undefined}\n >\n {saving ? 'Saving...' : 'Save'}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EditAPIProductDialog.esm.js","sources":["../../../src/components/EditAPIProductDialog/EditAPIProductDialog.tsx"],"sourcesContent":["import React, { useState, useEffect } from 'react';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Button,\n TextField,\n Box,\n Typography,\n Chip,\n Grid,\n MenuItem,\n CircularProgress,\n makeStyles,\n FormControl,\n RadioGroup,\n FormControlLabel,\n Radio,\n Tooltip,\n IconButton,\n InputAdornment,\n} from '@material-ui/core';\nimport InfoOutlinedIcon from '@material-ui/icons/InfoOutlined';\nimport AddIcon from '@material-ui/icons/Add';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { kuadrantApiRef } from '../../api';\nimport { Alert } from '@material-ui/lab';\nimport useAsync from 'react-use/lib/useAsync';\nimport { Progress } from '@backstage/core-components';\nimport { ApiProductPolicies, PlanPoliciesProps, AuthPoliciesProps, RateLimitPoliciesProps } from '../ApiProductPolicies';\nimport { validateURL } from '../../utils/validation';\nimport { APIProduct } from \"../../types/api-management.ts\";\nimport { Lifecycle } from '../../types/api-management';\nimport { getPolicyForRoute } from '../../utils/policies';\n\nconst useStyles = makeStyles((theme) => ({\n asterisk: {\n color: '#f44336',\n },\n sectionHeader: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n marginTop: theme.spacing(2),\n marginBottom: theme.spacing(1),\n },\n infoIcon: {\n fontSize: 18,\n color: theme.palette.text.secondary,\n },\n tagChip: {\n marginRight: theme.spacing(0.5),\n marginBottom: theme.spacing(0.5),\n },\n}));\n\ninterface EditAPIProductDialogProps {\n open: boolean;\n onClose: () => void;\n onSuccess: () => void;\n namespace: string;\n name: string;\n}\n\nexport const EditAPIProductDialog = ({ open, onClose, onSuccess, namespace, name }: EditAPIProductDialogProps) => {\n const classes = useStyles();\n const kuadrantApi = useApi(kuadrantApiRef);\n const [loading, setLoading] = useState(false);\n const [displayName, setDisplayName] = useState('');\n const [description, setDescription] = useState('');\n const [version, setVersion] = useState('v1');\n const [publishStatus, setPublishStatus] = useState<'Draft' | 'Published'>('Draft');\n const [lifecycle, setLifecycle] = useState<Lifecycle>('production');\n const [approvalMode, setApprovalMode] = useState<'automatic' | 'manual'>('manual');\n const [tags, setTags] = useState<string[]>([]);\n const [targetRef, setTargetRef] = useState<any>(null);\n const [tagInput, setTagInput] = useState('');\n const [contactEmail, setContactEmail] = useState('');\n const [contactTeam, setContactTeam] = useState('');\n const [docsURL, setDocsURL] = useState('');\n const [openAPISpec, setOpenAPISpec] = useState('');\n const [planPolicyProps, setPlanPoliciesProps] = useState<PlanPoliciesProps | null>(null);\n const [authPolicyProps, setAuthPolicyProps] = useState<AuthPoliciesProps | null>(null);\n const [error, setError] = useState('');\n const [saving, setSaving] = useState(false);\n const [openAPISpecError, setOpenAPISpecError] = useState<string | null>(null);\n\n // Load APIProduct data when dialog opens\n useEffect(() => {\n if (open && namespace && name) {\n setLoading(true);\n setError('');\n kuadrantApi.getApiProduct(namespace, name)\n .then(data => {\n setDisplayName(data.spec.displayName || '');\n setDescription(data.spec.description || '');\n setVersion(data.spec.version || 'v1');\n setPublishStatus(data.spec.publishStatus || 'Draft');\n setLifecycle(data.metadata.labels?.lifecycle as Lifecycle || 'production' as Lifecycle);\n setApprovalMode(data.spec.approvalMode || 'manual');\n setTags(data.spec.tags || []);\n setTargetRef(data.spec.targetRef || null);\n setContactEmail(data.spec.contact?.email || '');\n setContactTeam(data.spec.contact?.team || '');\n setDocsURL(data.spec.documentation?.docsURL || '');\n setOpenAPISpec(data.spec.documentation?.openAPISpecURL || '');\n const planPolicyCondition = data.status?.conditions?.find(\n (c: any) => c.type === \"PlanPolicyDiscovered\"\n ) || null;\n setPlanPoliciesProps({\n statusCondition: planPolicyCondition,\n discoveredPlans: data.status?.discoveredPlans || null,\n });\n const authPolicyCondition = data.status?.conditions?.find(\n (c: any) => c.type === \"AuthPolicyDiscovered\"\n ) || null;\n // Parse the auth policy name from the AuthPolicyDiscovered condition message\n // It's the only place to get the policy name without fetching all the policies.\n // Consider enhancing the developer portal controller to provide name in an structured way\n const parseNameFromMessage = (value: string) => {\n const parts = value.split(' ');\n return parts.length >= 3 ? parts[2] : '';\n };\n const authPolicyName = authPolicyCondition?.status === \"True\" ? parseNameFromMessage(authPolicyCondition.message ?? \"\") : \"\";\n setAuthPolicyProps({\n statusCondition: authPolicyCondition,\n namespacedName: {\n name: authPolicyName,\n namespace: data.metadata.namespace,\n },\n });\n setOpenAPISpecError(null);\n setLoading(false);\n })\n .catch(err => {\n setError(err.message || 'Failed to load API product');\n setLoading(false);\n });\n }\n }, [open, namespace, name, kuadrantApi]);\n\n useEffect(() => {\n if (open) {\n setOpenAPISpecError(null);\n }\n }, [open]);\n\n // load ratelimitpolicies\n const {\n value: rateLimitPolicies,\n error: rateLimitPoliciesError\n } = useAsync(async () => {\n return await kuadrantApi.getRateLimitPolicies();\n }, [kuadrantApi, open]);\n\n const selectedRateLimitPolicy = targetRef\n ? getPolicyForRoute(rateLimitPolicies?.items, namespace, targetRef.name)\n : null;\n const rateLimitPolicyAcceptedCondition = selectedRateLimitPolicy?.status?.conditions?.find(\n (c: any) => c.type === \"Accepted\"\n );\n const rateLimitPolicyProps: RateLimitPoliciesProps = {\n namespacedName: {\n namespace: selectedRateLimitPolicy?.metadata.namespace,\n name: selectedRateLimitPolicy?.metadata.name,\n },\n statusCondition: rateLimitPolicyAcceptedCondition,\n }\n\n const handleOpenAPISpecChange = (value: string) => {\n setOpenAPISpec(value);\n setOpenAPISpecError(validateURL(value));\n };\n\n const handleAddTag = () => {\n if (tagInput.trim() && !tags.includes(tagInput.trim())) {\n setTags([...tags, tagInput.trim()]);\n setTagInput('');\n }\n };\n\n const handleDeleteTag = (tagToDelete: string) => {\n setTags(tags.filter(tag => tag !== tagToDelete));\n };\n\n const handleSave = async () => {\n setError('');\n setSaving(true);\n\n // validate retired APIs cannot be published\n if (lifecycle === 'retired' && publishStatus === 'Published') {\n setError('Cannot publish a retired API product. Please set publish status to Draft.');\n setSaving(false);\n return;\n }\n\n try {\n const patch: Partial<APIProduct> = {\n // @ts-ignore We are applying a partial obj, not full\n metadata: {\n labels: {\n lifecycle,\n },\n },\n spec: {\n displayName,\n description,\n version,\n publishStatus,\n approvalMode,\n tags,\n targetRef,\n ...(contactEmail || contactTeam ? {\n contact: {\n ...(contactEmail && { email: contactEmail }),\n ...(contactTeam && { team: contactTeam }),\n },\n } : {}),\n ...(docsURL || openAPISpec ? {\n documentation: {\n ...(docsURL && { docsURL }),\n ...(openAPISpec && { openAPISpecURL: openAPISpec }),\n },\n } : {}),\n },\n };\n\n await kuadrantApi.updateApiProduct(namespace, name, patch);\n onSuccess();\n onClose();\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setSaving(false);\n }\n };\n\n return (\n <Dialog open={open} onClose={onClose} maxWidth=\"md\" fullWidth>\n <DialogTitle>Edit API Product</DialogTitle>\n <DialogContent>\n {error && (\n <Alert severity=\"error\" style={{ marginBottom: 16 }}>\n {error}\n </Alert>\n )}\n {rateLimitPoliciesError && (\n <Alert severity=\"error\" style={{ marginBottom: 16 }}>\n <strong>Failed to load RateLimitPolicies:</strong> {rateLimitPoliciesError.message}\n </Alert>\n )}\n {loading ? (\n <Progress />\n ) : (\n <>\n {/* API product info section */}\n <Box className={classes.sectionHeader}>\n <Typography variant=\"subtitle1\"><strong>API product info</strong></Typography>\n </Box>\n <Grid container spacing={2}>\n <Grid item xs={6}>\n <TextField\n fullWidth\n label=\"API product name\"\n value={displayName}\n onChange={e => setDisplayName(e.target.value)}\n placeholder=\"My API\"\n helperText=\"Give a unique name for your API product\"\n margin=\"normal\"\n required\n disabled={saving}\n InputLabelProps={{\n classes: {\n asterisk: classes.asterisk,\n },\n }}\n />\n </Grid>\n <Grid item xs={6}>\n <TextField\n fullWidth\n label=\"Resource name\"\n value={name}\n disabled\n helperText=\"Kubernetes resource name (immutable)\"\n margin=\"normal\"\n />\n </Grid>\n <Grid item xs={6}>\n <TextField\n fullWidth\n label=\"Version\"\n value={version}\n onChange={e => setVersion(e.target.value)}\n placeholder=\"v1\"\n helperText=\"Give a version to your API product\"\n margin=\"normal\"\n disabled={saving}\n />\n </Grid>\n <Grid item xs={6}>\n <TextField\n fullWidth\n label=\"Tag\"\n value={tagInput}\n onChange={e => setTagInput(e.target.value)}\n onKeyPress={e => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleAddTag();\n }\n }}\n placeholder=\"Add tag\"\n helperText=\"Add a tag to your API product\"\n margin=\"normal\"\n disabled={saving}\n InputProps={{\n endAdornment: tagInput ? (\n <InputAdornment position=\"end\">\n <IconButton size=\"small\" onClick={handleAddTag} disabled={saving}>\n <AddIcon fontSize=\"small\" />\n </IconButton>\n </InputAdornment>\n ) : undefined,\n }}\n />\n </Grid>\n {tags.length > 0 && (\n <Grid item xs={12}>\n <Box display=\"flex\" flexWrap=\"wrap\">\n {tags.map(tag => (\n <Chip\n key={tag}\n label={tag}\n onDelete={saving ? undefined : () => handleDeleteTag(tag)}\n size=\"small\"\n className={classes.tagChip}\n disabled={saving}\n />\n ))}\n </Box>\n </Grid>\n )}\n <Grid item xs={12}>\n <TextField\n fullWidth\n label=\"Description\"\n value={description}\n onChange={e => setDescription(e.target.value)}\n placeholder=\"API description\"\n margin=\"normal\"\n multiline\n rows={2}\n required\n disabled={saving}\n InputLabelProps={{\n classes: {\n asterisk: classes.asterisk,\n },\n }}\n />\n </Grid>\n </Grid>\n\n {/* Associated route section */}\n <Box className={classes.sectionHeader}>\n <Typography variant=\"subtitle1\"><strong>Associated route</strong></Typography>\n <Tooltip title=\"The HTTPRoute this API product is associated with\">\n <InfoOutlinedIcon className={classes.infoIcon} />\n </Tooltip>\n </Box>\n <Grid container spacing={2}>\n <Grid item xs={12}>\n <TextField\n fullWidth\n label=\"OpenAPI Spec URL\"\n value={openAPISpec}\n onChange={e => handleOpenAPISpecChange(e.target.value)}\n placeholder=\"https://api.example.com/openapi.json\"\n helperText={openAPISpecError || \"Enter the full path to your API spec file\"}\n error={!!openAPISpecError}\n margin=\"normal\"\n disabled={saving}\n />\n </Grid>\n <Grid item xs={12}>\n <TextField\n fullWidth\n label=\"Documentation URL\"\n value={docsURL}\n onChange={e => setDocsURL(e.target.value)}\n placeholder=\"https://docs.example.com/api\"\n helperText=\"Link to external documentation for this API\"\n margin=\"normal\"\n disabled={saving}\n />\n </Grid>\n {targetRef && (\n <Grid item xs={12}>\n <TextField\n fullWidth\n label=\"HTTPRoute\"\n value={`${targetRef.namespace || namespace}/${targetRef.name}`}\n disabled\n helperText=\"Target HTTPRoute (immutable)\"\n margin=\"normal\"\n />\n </Grid>\n )}\n </Grid>\n\n {/* HTTPRoute policies section */}\n {targetRef && (\n <>\n <Box className={classes.sectionHeader}>\n <Typography variant=\"subtitle1\"><strong>HTTPRoute policies</strong></Typography>\n <Tooltip title=\"Shows the associated policies and rate limit tiers for the HTTPRoute\">\n <InfoOutlinedIcon className={classes.infoIcon} />\n </Tooltip>\n </Box>\n <ApiProductPolicies\n planPolicy={planPolicyProps}\n authPolicy={authPolicyProps}\n rateLimitPolicy={rateLimitPolicyProps}\n includeTopMargin={false}\n />\n </>\n )}\n\n {/* Lifecycle and Visibility section */}\n <Box className={classes.sectionHeader}>\n <Typography variant=\"subtitle1\"><strong>Lifecycle and Visibility</strong></Typography>\n <Tooltip title=\"Control the lifecycle state and catalog visibility of this API product\">\n <InfoOutlinedIcon className={classes.infoIcon} />\n </Tooltip>\n </Box>\n <Grid container spacing={2}>\n <Grid item xs={6}>\n <TextField\n fullWidth\n select\n label=\"Lifecycle\"\n value={lifecycle}\n onChange={e => setLifecycle(e.target.value as Lifecycle)}\n margin=\"normal\"\n helperText=\"API lifecycle state\"\n disabled={saving}\n >\n <MenuItem value=\"experimental\">Experimental</MenuItem>\n <MenuItem value=\"production\">Production</MenuItem>\n <MenuItem value=\"deprecated\">Deprecated</MenuItem>\n <MenuItem value=\"retired\">Retired</MenuItem>\n </TextField>\n </Grid>\n <Grid item xs={6}>\n <TextField\n fullWidth\n select\n label=\"Publish Status\"\n value={publishStatus}\n onChange={e => setPublishStatus(e.target.value as 'Draft' | 'Published')}\n margin=\"normal\"\n helperText=\"Controls catalog visibility\"\n disabled={saving}\n >\n <MenuItem value=\"Draft\">Draft</MenuItem>\n <MenuItem value=\"Published\">Published</MenuItem>\n </TextField>\n </Grid>\n </Grid>\n\n {/* API Key approval section */}\n <Box className={classes.sectionHeader}>\n <Typography variant=\"subtitle1\"><strong>API Key approval</strong></Typography>\n <Tooltip title=\"Choose how API key requests are handled for this product\">\n <InfoOutlinedIcon className={classes.infoIcon} />\n </Tooltip>\n </Box>\n <FormControl component=\"fieldset\" disabled={saving}>\n <RadioGroup\n row\n value={approvalMode}\n onChange={e => setApprovalMode(e.target.value as 'automatic' | 'manual')}\n >\n <FormControlLabel\n value=\"manual\"\n control={<Radio color=\"primary\" />}\n label={\n <Box>\n <Typography variant=\"body2\">Need manual approval</Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n Requires approval for requesting this API\n </Typography>\n </Box>\n }\n />\n <FormControlLabel\n value=\"automatic\"\n control={<Radio color=\"primary\" />}\n label={\n <Box>\n <Typography variant=\"body2\">Automatic</Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n Keys are created without need to be approved\n </Typography>\n </Box>\n }\n />\n </RadioGroup>\n </FormControl>\n </>\n )}\n </DialogContent>\n <DialogActions>\n <Button onClick={onClose} disabled={saving}>Cancel</Button>\n <Button\n onClick={handleSave}\n color=\"primary\"\n variant=\"contained\"\n disabled={saving || loading || !displayName || !description || !!openAPISpecError}\n startIcon={saving ? <CircularProgress size={16} color=\"inherit\" /> : undefined}\n >\n {saving ? 'Saving...' : 'Save'}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -133,7 +133,7 @@ const ResourceList = () => {
|
|
|
133
133
|
const targetRef = product.spec?.targetRef;
|
|
134
134
|
if (!targetRef) return null;
|
|
135
135
|
const policy = planPolicies.items.find((pp) => {
|
|
136
|
-
const ref = pp.targetRef;
|
|
136
|
+
const ref = pp.spec.targetRef;
|
|
137
137
|
return ref?.kind === "HTTPRoute" && ref?.name === targetRef.name && (!ref?.namespace || ref?.namespace === (targetRef.namespace || product.metadata.namespace));
|
|
138
138
|
});
|
|
139
139
|
return policy?.metadata.name || null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiProductsPage.esm.js","sources":["../../../src/components/KuadrantPage/ApiProductsPage.tsx"],"sourcesContent":["import React, { useState, useMemo, useCallback } from \"react\";\nimport {\n Typography,\n Box,\n Chip,\n Button,\n IconButton,\n CircularProgress,\n makeStyles,\n} 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 VpnKeyIcon from \"@material-ui/icons/VpnKey\";\nimport LockIcon from \"@material-ui/icons/Lock\";\nimport { FilterPanel, FilterSection, FilterState } from \"../FilterPanel\";\nimport {\n Header,\n Page,\n Content,\n SupportButton,\n ResponseErrorPanel,\n Link,\n Table,\n TableColumn,\n} from \"@backstage/core-components\";\nimport useAsync from \"react-use/lib/useAsync\";\nimport {\n useApi,\n alertApiRef,\n identityApiRef,\n} from \"@backstage/core-plugin-api\";\nimport {kuadrantApiRef, KuadrantList} from \"../../api\";\nimport { PermissionGate } from \"../PermissionGate\";\nimport { CreateAPIProductDialog } from \"../CreateAPIProductDialog\";\nimport {\n kuadrantApiProductCreatePermission,\n kuadrantApiProductDeleteOwnPermission,\n kuadrantApiProductDeleteAllPermission,\n kuadrantApiProductUpdateOwnPermission,\n kuadrantApiProductUpdateAllPermission,\n kuadrantApiProductListPermission,\n kuadrantPlanPolicyListPermission,\n} from \"../../permissions\";\nimport { useKuadrantPermission } from \"../../utils/permissions\";\nimport { EditAPIProductDialog } from \"../EditAPIProductDialog\";\nimport { ConfirmDeleteDialog } from \"../ConfirmDeleteDialog\";\nimport { getLifecycleChipStyle } from \"../../utils/styles\";\nimport emptyStateIllustration from \"../../assets/empty-state-illustration.png\";\nimport {APIProduct, PlanPolicy} from \"../../types/api-management.ts\";\n\nconst useStyles = makeStyles((theme) => ({\n container: {\n display: \"flex\",\n height: \"100%\",\n minHeight: 400,\n },\n tableContainer: {\n flex: 1,\n overflow: \"auto\",\n padding: 10,\n },\n emptyState: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: theme.spacing(6),\n minHeight: 400,\n },\n emptyStateContent: {\n display: \"flex\",\n alignItems: \"center\",\n gap: theme.spacing(6),\n maxWidth: 900,\n },\n emptyStateText: {\n flex: 1,\n },\n emptyStateTitle: {\n marginBottom: theme.spacing(2),\n },\n emptyStateDescription: {\n marginBottom: theme.spacing(3),\n color: theme.palette.text.secondary,\n },\n emptyStateImage: {\n maxWidth: 400,\n height: \"auto\",\n },\n}));\n\nconst ResourceList = () => {\n const classes = useStyles();\n const kuadrantApi = useApi(kuadrantApiRef);\n const alertApi = useApi(alertApiRef);\n const identityApi = useApi(identityApiRef);\n const [userEntityRef, setUserEntityRef] = useState<string>(\"\");\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<{\n namespace: string;\n name: string;\n } | null>(null);\n const [apiProductToEdit, setApiProductToEdit] = useState<{\n namespace: string;\n name: string;\n } | null>(null);\n const [deleting, setDeleting] = useState(false);\n const [deleteStats, setDeleteStats] = useState<{\n requests: number;\n secrets: number;\n } | null>(null);\n const [filters, setFilters] = useState<FilterState>({\n status: [],\n lifecycle: [],\n policy: [],\n route: [],\n namespace: [],\n tags: [],\n authentication: [],\n });\n\n const {\n allowed: canCreateApiProduct,\n loading: createPermissionLoading,\n error: createPermissionError,\n } = useKuadrantPermission(kuadrantApiProductCreatePermission);\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 { allowed: canUpdateOwnApiProduct } = useKuadrantPermission(\n kuadrantApiProductUpdateOwnPermission,\n );\n\n const { allowed: canUpdateAllApiProducts } = useKuadrantPermission(\n kuadrantApiProductUpdateAllPermission,\n );\n\n const deletePermissionLoading =\n deleteOwnPermissionLoading || deleteAllPermissionLoading;\n\n const {\n allowed: canListPlanPolicies,\n loading: planPolicyPermissionLoading,\n error: planPolicyPermissionError,\n } = useKuadrantPermission(kuadrantPlanPolicyListPermission);\n\n useAsync(async () => {\n const identity = await identityApi.getBackstageIdentity();\n setUserEntityRef(identity.userEntityRef);\n }, [identityApi]);\n\n const {\n value: apiProducts,\n loading: apiProductsLoading,\n error: apiProductsError,\n } = useAsync(async (): Promise<KuadrantList<APIProduct>> => {\n return kuadrantApi.getApiProducts();\n }, [kuadrantApi, refreshTrigger]);\n\n const {\n value: planPolicies,\n loading: planPoliciesLoading,\n error: planPoliciesError,\n } = useAsync(async (): Promise<KuadrantList<PlanPolicy>> => {\n // skip fetch if user doesn't have permission\n if (!canListPlanPolicies) {\n return { items: [] };\n }\n return kuadrantApi.getPlanPolicies();\n }, [kuadrantApi, refreshTrigger, canListPlanPolicies]);\n\n // helper to find policy for a given route\n const getPolicyForProduct = useCallback((product: APIProduct): string | null => {\n if (!planPolicies?.items) return null;\n const targetRef = product.spec?.targetRef;\n if (!targetRef) return null;\n\n const policy = planPolicies.items.find((pp: PlanPolicy) => {\n const ref = (pp as any).targetRef;\n return (\n ref?.kind === \"HTTPRoute\" &&\n ref?.name === targetRef.name &&\n (!ref?.namespace || ref?.namespace === (targetRef.namespace || product.metadata.namespace))\n );\n });\n return policy?.metadata.name || null;\n }, [planPolicies]);\n\n // helper to get auth schemes for a product\n const getAuthSchemes = useCallback((product: APIProduct): string[] => {\n const authSchemes = product.status?.discoveredAuthScheme?.authentication || {};\n const schemeObjects = Object.values(authSchemes);\n const schemes: string[] = [];\n\n if (schemeObjects.some((scheme: any) => scheme.hasOwnProperty(\"apiKey\"))) {\n schemes.push(\"API Key\");\n }\n if (schemeObjects.some((scheme: any) => scheme.hasOwnProperty(\"jwt\"))) {\n schemes.push(\"OIDC\");\n }\n if (schemes.length === 0) {\n schemes.push(\"Unknown\");\n }\n return schemes;\n }, []);\n\n const loading =\n apiProductsLoading ||\n planPoliciesLoading ||\n createPermissionLoading ||\n deletePermissionLoading ||\n planPolicyPermissionLoading;\n const error = apiProductsError || planPoliciesError;\n const permissionError =\n createPermissionError || deletePermissionError || planPolicyPermissionError;\n\n const allProducts = useMemo(() => {\n const products = apiProducts?.items || [];\n\n // API consumers (users without create/update permissions) should only see Published products\n // API owners can see all products (Draft and Published)\n if (!canCreateApiProduct && !canUpdateOwnApiProduct && !canUpdateAllApiProducts) {\n return products.filter((p: APIProduct) => {\n const publishStatus = p.spec?.publishStatus || 'Draft';\n return publishStatus === 'Published';\n });\n }\n\n return products;\n }, [apiProducts, canCreateApiProduct, canUpdateOwnApiProduct, canUpdateAllApiProducts]);\n\n const filterSections: FilterSection[] = useMemo(() => {\n const statusCounts = { Draft: 0, Published: 0 };\n const lifecycleCounts = new Map<string, number>();\n const policyCounts = new Map<string, number>();\n const routeCounts = new Map<string, number>();\n const namespaceCounts = new Map<string, number>();\n const tagCounts = new Map<string, number>();\n const authCounts = new Map<string, number>();\n\n allProducts.forEach((p: APIProduct) => {\n const status = p.spec?.publishStatus || \"Draft\";\n statusCounts[status as keyof typeof statusCounts]++;\n\n const lifecycle = p.metadata.labels?.lifecycle || \"production\";\n lifecycleCounts.set(lifecycle, (lifecycleCounts.get(lifecycle) || 0) + 1);\n\n const policy = getPolicyForProduct(p) || \"N/A\";\n policyCounts.set(policy, (policyCounts.get(policy) || 0) + 1);\n\n const route = p.spec?.targetRef?.name || \"unknown\";\n routeCounts.set(route, (routeCounts.get(route) || 0) + 1);\n\n const ns = p.metadata.namespace;\n namespaceCounts.set(ns, (namespaceCounts.get(ns) || 0) + 1);\n\n const tags = p.spec?.tags || [];\n tags.forEach((tag: string) => {\n tagCounts.set(tag, (tagCounts.get(tag) || 0) + 1);\n });\n\n const authSchemes = getAuthSchemes(p);\n authSchemes.forEach((scheme: string) => {\n authCounts.set(scheme, (authCounts.get(scheme) || 0) + 1);\n });\n });\n\n const sections: FilterSection[] = [\n {\n id: \"status\",\n title: \"Publish Status\",\n options: [\n { value: \"Draft\", label: \"Draft\", count: statusCounts.Draft },\n { value: \"Published\", label: \"Published\", count: statusCounts.Published },\n ],\n },\n {\n id: \"lifecycle\",\n title: \"Lifecycle\",\n options: Array.from(lifecycleCounts.entries()).map(([state, count]) => ({\n value: state,\n label: state.charAt(0).toUpperCase() + state.slice(1),\n count,\n })),\n },\n {\n id: \"authentication\",\n title: \"Authentication\",\n options: Array.from(authCounts.entries()).map(([scheme, count]) => ({\n value: scheme,\n label: scheme,\n count,\n })),\n },\n {\n id: \"route\",\n title: \"Route\",\n options: Array.from(routeCounts.entries()).map(([name, count]) => ({\n value: name,\n label: name,\n count,\n })),\n collapsed: routeCounts.size > 5,\n },\n {\n id: \"namespace\",\n title: \"Namespace\",\n options: Array.from(namespaceCounts.entries()).map(([ns, count]) => ({\n value: ns,\n label: ns,\n count,\n })),\n collapsed: namespaceCounts.size > 5,\n },\n {\n id: \"tags\",\n title: \"Tags\",\n options: Array.from(tagCounts.entries()).map(([tag, count]) => ({\n value: tag,\n label: tag,\n count,\n })),\n collapsed: tagCounts.size > 5,\n },\n ];\n\n // only show policy filter if user can list planpolicies\n if (canListPlanPolicies) {\n sections.splice(2, 0, {\n id: \"policy\",\n title: \"Policy\",\n options: Array.from(policyCounts.entries()).map(([name, count]) => ({\n value: name,\n label: name,\n count,\n })),\n collapsed: policyCounts.size > 5,\n });\n }\n\n return sections;\n }, [allProducts, getPolicyForProduct, getAuthSchemes, canListPlanPolicies]);\n\n const filteredProducts = useMemo(() => {\n return allProducts.filter((p: APIProduct) => {\n if (filters.status.length > 0) {\n const status = p.spec?.publishStatus || \"Draft\";\n if (!filters.status.includes(status)) return false;\n }\n\n if (filters.lifecycle && filters.lifecycle.length > 0) {\n const lifecycle = p.metadata.labels?.lifecycle || \"production\";\n if (!filters.lifecycle.includes(lifecycle)) return false;\n }\n\n if (filters.authentication.length > 0) {\n const authSchemes = getAuthSchemes(p);\n if (!filters.authentication.some((a: string) => authSchemes.includes(a))) return false;\n }\n\n if (filters.policy.length > 0) {\n const policy = getPolicyForProduct(p) || \"N/A\";\n if (!filters.policy.includes(policy)) return false;\n }\n\n if (filters.route.length > 0) {\n const route = p.spec?.targetRef?.name || \"unknown\";\n if (!filters.route.includes(route)) return false;\n }\n\n if (filters.namespace.length > 0) {\n if (!filters.namespace.includes(p.metadata.namespace)) return false;\n }\n\n if (filters.tags.length > 0) {\n const tags = p.spec?.tags || [];\n if (!filters.tags.some((t: string) => tags.includes(t))) return false;\n }\n\n return true;\n });\n }, [allProducts, filters, getPolicyForProduct, getAuthSchemes]);\n\n const handleCreateSuccess = (productInfo: { namespace: string; name: string; displayName: string }) => {\n setRefreshTrigger((prev) => prev + 1);\n alertApi.post({\n message: `\"${productInfo.displayName}\" created successfully`,\n severity: \"success\",\n display: \"transient\",\n });\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 const productName = apiProductToEdit?.name || \"API Product\";\n alertApi.post({\n message: `\"${productName}\" updated successfully`,\n severity: \"success\",\n display: \"transient\",\n });\n };\n\n const handleDeleteClick = async (namespace: string, name: string) => {\n setApiProductToDelete({ namespace, name });\n setDeleteStats(null);\n\n try {\n const data = await kuadrantApi.getRequestsByNamespace(namespace);\n const related = (data.items || []).filter(\n (r: any) =>\n r.spec.apiName === name && r.spec.apiNamespace === namespace,\n );\n const approved = related.filter(\n (r: any) => r.status?.phase === \"Approved\",\n ).length;\n setDeleteStats({ requests: related.length, secrets: approved });\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to delete access request: ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\n } finally {\n setDeleteDialogOpen(true);\n }\n\n };\n\n const handleDeleteConfirm = async () => {\n if (!apiProductToDelete) return;\n\n setDeleting(true);\n try {\n await kuadrantApi.deleteApiProduct(\n apiProductToDelete.namespace,\n apiProductToDelete.name,\n );\n\n const deletedName = apiProductToDelete?.name || \"API Product\";\n setRefreshTrigger((prev) => prev + 1);\n alertApi.post({\n message: `\"${deletedName}\" deleted successfully`,\n severity: \"success\",\n display: \"transient\",\n });\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to delete API Product: ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\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 handlePublishToggle = async (row: any) => {\n const namespace = row.metadata.namespace;\n const name = row.metadata.name;\n const displayName = row.spec?.displayName || name;\n const currentStatus = row.spec?.publishStatus || \"Draft\";\n const newStatus = currentStatus === \"Published\" ? \"Draft\" : \"Published\";\n const lifecycle = row.metadata.labels?.lifecycle;\n\n // prevent publishing retired APIs\n if (newStatus === \"Published\" && lifecycle === \"retired\") {\n alertApi.post({\n message: `Cannot publish a retired API product. Please change the lifecycle status first.`,\n severity: \"error\",\n display: \"transient\",\n });\n return;\n }\n\n const productPatch: Partial<APIProduct> = {\n // @ts-ignore partial obj\n spec: {\n publishStatus: newStatus\n },\n }\n\n try {\n await kuadrantApi.updateApiProduct(namespace, name, productPatch);\n\n setRefreshTrigger((prev) => prev + 1);\n alertApi.post({\n message: `\"${displayName}\" ${newStatus === \"Published\" ? \"published\" : \"unpublished\"} successfully`,\n severity: \"success\",\n display: \"transient\",\n });\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to update publish status: ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\n }\n };\n\n const columns: TableColumn[] = [\n {\n title: \"Name\",\n field: \"spec.displayName\",\n render: (row: any) => {\n const displayName = row.spec?.displayName ?? row.metadata.name;\n return (\n <Link to={`/kuadrant/api-products/${row.metadata.namespace}/${row.metadata.name}`}>\n <strong>{displayName}</strong>\n </Link>\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: \"Version\",\n field: \"spec.version\",\n render: (row: any) => row.spec?.version || \"-\",\n },\n {\n title: \"Route\",\n field: \"spec.targetRef.name\",\n render: (row: any) => row.spec?.targetRef?.name || \"-\",\n },\n // only show policy column if user can list planpolicies\n ...(canListPlanPolicies\n ? [\n {\n title: \"Policy\",\n field: \"policy\",\n render: (row: any) => getPolicyForProduct(row) || \"N/A\",\n },\n ]\n : []),\n {\n title: \"Tags\",\n field: \"spec.tags\",\n render: (row: any) => {\n const tags = row.spec?.tags || [];\n if (tags.length === 0) return \"-\";\n return (\n <Box display=\"flex\" style={{ gap: 4, flexWrap: \"wrap\" }}>\n {tags.map((tag: string) => (\n <Chip key={tag} label={tag} size=\"small\" variant=\"outlined\" />\n ))}\n </Box>\n );\n },\n },\n {\n title: \"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: \"Lifecycle\",\n field: \"metadata.labels.lifecycle\",\n render: (row: any) => {\n const lifecycle = row.metadata.labels?.lifecycle;\n if (!lifecycle) return \"-\";\n return (\n <Chip\n label={lifecycle.charAt(0).toUpperCase() + lifecycle.slice(1)}\n size=\"small\"\n style={getLifecycleChipStyle(lifecycle)}\n />\n );\n },\n },\n {\n title: \"Authentication\",\n field: \"status.discoveredAuthScheme\",\n render: (row: any) => {\n const authSchemes =\n row.status?.discoveredAuthScheme?.authentication || {};\n const schemeObjects = Object.values(authSchemes);\n\n const hasApiKey = schemeObjects.some((scheme: any) =>\n scheme.hasOwnProperty(\"apiKey\"),\n );\n const hasJwt = schemeObjects.some((scheme: any) =>\n scheme.hasOwnProperty(\"jwt\"),\n );\n\n if (!hasApiKey && !hasJwt) {\n return (\n <Typography variant=\"body2\" style={{ fontStyle: \"italic\" }}>\n unknown\n </Typography>\n );\n }\n\n return (\n <Box display=\"flex\" style={{ gap: 4 }}>\n {hasApiKey && (\n <Chip\n icon={<VpnKeyIcon />}\n label=\"API Key\"\n size=\"small\"\n color=\"primary\"\n />\n )}\n {hasJwt && (\n <Chip\n icon={<LockIcon />}\n label=\"OIDC\"\n size=\"small\"\n color=\"secondary\"\n />\n )}\n </Box>\n );\n },\n },\n {\n title: \"Namespace\",\n field: \"metadata.namespace\",\n },\n {\n title: \"Actions\",\n field: \"actions\",\n filtering: false,\n render: (row: any) => {\n const owner = row.metadata?.annotations?.[\"backstage.io/owner\"];\n const isOwner = owner === userEntityRef;\n const canEdit =\n canUpdateAllApiProducts || (canUpdateOwnApiProduct && isOwner);\n const canDelete =\n canDeleteAllApiProducts || (canDeleteOwnApiProduct && isOwner);\n const isPublished = row.spec?.publishStatus === \"Published\";\n\n return (\n <Box display=\"flex\" alignItems=\"center\" style={{ gap: 4 }}>\n {canEdit && (\n <Button\n size=\"small\"\n color=\"primary\"\n onClick={() => handlePublishToggle(row)}\n style={{ marginRight: 4, textTransform: \"none\" }}\n >\n {isPublished ? \"Unpublish\" : \"Publish\"}\n </Button>\n )}\n {canEdit && (\n <IconButton\n size=\"small\"\n onClick={() =>\n handleEditClick(row.metadata.namespace, row.metadata.name)\n }\n title=\"Edit API Product\"\n >\n <EditIcon fontSize=\"small\" />\n </IconButton>\n )}\n {canDelete && (\n <IconButton\n size=\"small\"\n onClick={() =>\n handleDeleteClick(row.metadata.namespace, row.metadata.name)\n }\n title=\"Delete API Product\"\n >\n <DeleteIcon fontSize=\"small\" />\n </IconButton>\n )}\n </Box>\n );\n },\n },\n ];\n\n return (\n <Page themeId=\"tool\">\n <Header\n title=\"API Products\"\n subtitle=\"Manage API products for Kubernetes\"\n >\n <SupportButton>Manage API products and plan policies</SupportButton>\n </Header>\n <Content>\n {loading && (\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"center\"\n justifyContent=\"center\"\n minHeight={300}\n >\n <CircularProgress />\n <Typography variant=\"h6\" style={{ marginTop: 16 }}>\n Loading data...\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Preparing your data... This should only take a moment.\n </Typography>\n </Box>\n )}\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:{\" \"}\n {createPermissionError\n ? \"kuadrant.apiproduct.create\"\n : deletePermissionError\n ? \"kuadrant.apiproduct.delete\"\n : planPolicyPermissionError\n ? \"kuadrant.planpolicy.list\"\n : \"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 && allProducts.length === 0 && (\n <Box className={classes.emptyState}>\n <Box className={classes.emptyStateContent}>\n <Box className={classes.emptyStateText}>\n <Typography variant=\"h4\" className={classes.emptyStateTitle}>\n API Product\n </Typography>\n <Typography\n variant=\"body1\"\n className={classes.emptyStateDescription}\n >\n Create API product by registering existing API, associate\n route and policy\n </Typography>\n {canCreateApiProduct && (\n <Button\n variant=\"contained\"\n color=\"primary\"\n startIcon={<AddIcon />}\n onClick={() => setCreateDialogOpen(true)}\n >\n Create API Product\n </Button>\n )}\n </Box>\n <img\n src={emptyStateIllustration}\n alt=\"API Product illustration\"\n className={classes.emptyStateImage}\n />\n </Box>\n </Box>\n )}\n {!loading && !error && !permissionError && allProducts.length > 0 && (\n <Box className={classes.container}>\n <FilterPanel\n sections={filterSections}\n filters={filters}\n onChange={setFilters}\n />\n <Box className={classes.tableContainer}>\n <Box display=\"flex\" justifyContent=\"flex-end\" mb={2}>\n {canCreateApiProduct && (\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 )}\n </Box>\n {filteredProducts.length === 0 ? (\n <Box p={4} textAlign=\"center\">\n <Typography variant=\"body1\" color=\"textSecondary\">\n No API products match the selected filters.\n </Typography>\n </Box>\n ) : (\n <Table\n options={{\n paging: filteredProducts.length > 10,\n pageSize: 20,\n search: true,\n filtering: false,\n debounceInterval: 300,\n toolbar: true,\n emptyRowsWhenPaging: false,\n }}\n columns={columns}\n data={filteredProducts}\n />\n )}\n </Box>\n </Box>\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 <ConfirmDeleteDialog\n open={deleteDialogOpen}\n title=\"Delete API Product\"\n description={\n deleteStats\n ? `Deleting \"${apiProductToDelete?.name}\" will also remove:\n\n• ${deleteStats.requests} API Key(s)\n• ${deleteStats.secrets} API Key Secret(s)\n\nThis action cannot be undone.`\n : `Deleting \"${apiProductToDelete?.name}\" will also remove all associated API Keys and Secrets.\nThis action cannot be undone.`\n }\n confirmText={apiProductToDelete?.name}\n severity=\"high\"\n deleting={deleting}\n onConfirm={handleDeleteConfirm}\n onCancel={handleDeleteCancel}\n />\n </Content>\n </Page>\n );\n};\n\nexport const ApiProductsPage = () => {\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":"ApiProductsPage.esm.js","sources":["../../../src/components/KuadrantPage/ApiProductsPage.tsx"],"sourcesContent":["import React, { useState, useMemo, useCallback } from \"react\";\nimport {\n Typography,\n Box,\n Chip,\n Button,\n IconButton,\n CircularProgress,\n makeStyles,\n} 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 VpnKeyIcon from \"@material-ui/icons/VpnKey\";\nimport LockIcon from \"@material-ui/icons/Lock\";\nimport { FilterPanel, FilterSection, FilterState } from \"../FilterPanel\";\nimport {\n Header,\n Page,\n Content,\n SupportButton,\n ResponseErrorPanel,\n Link,\n Table,\n TableColumn,\n} from \"@backstage/core-components\";\nimport useAsync from \"react-use/lib/useAsync\";\nimport {\n useApi,\n alertApiRef,\n identityApiRef,\n} from \"@backstage/core-plugin-api\";\nimport {kuadrantApiRef, KuadrantList} from \"../../api\";\nimport { PermissionGate } from \"../PermissionGate\";\nimport { CreateAPIProductDialog } from \"../CreateAPIProductDialog\";\nimport {\n kuadrantApiProductCreatePermission,\n kuadrantApiProductDeleteOwnPermission,\n kuadrantApiProductDeleteAllPermission,\n kuadrantApiProductUpdateOwnPermission,\n kuadrantApiProductUpdateAllPermission,\n kuadrantApiProductListPermission,\n kuadrantPlanPolicyListPermission,\n} from \"../../permissions\";\nimport { useKuadrantPermission } from \"../../utils/permissions\";\nimport { EditAPIProductDialog } from \"../EditAPIProductDialog\";\nimport { ConfirmDeleteDialog } from \"../ConfirmDeleteDialog\";\nimport { getLifecycleChipStyle } from \"../../utils/styles\";\nimport emptyStateIllustration from \"../../assets/empty-state-illustration.png\";\nimport {APIProduct, PlanPolicy} from \"../../types/api-management.ts\";\n\nconst useStyles = makeStyles((theme) => ({\n container: {\n display: \"flex\",\n height: \"100%\",\n minHeight: 400,\n },\n tableContainer: {\n flex: 1,\n overflow: \"auto\",\n padding: 10,\n },\n emptyState: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: theme.spacing(6),\n minHeight: 400,\n },\n emptyStateContent: {\n display: \"flex\",\n alignItems: \"center\",\n gap: theme.spacing(6),\n maxWidth: 900,\n },\n emptyStateText: {\n flex: 1,\n },\n emptyStateTitle: {\n marginBottom: theme.spacing(2),\n },\n emptyStateDescription: {\n marginBottom: theme.spacing(3),\n color: theme.palette.text.secondary,\n },\n emptyStateImage: {\n maxWidth: 400,\n height: \"auto\",\n },\n}));\n\nconst ResourceList = () => {\n const classes = useStyles();\n const kuadrantApi = useApi(kuadrantApiRef);\n const alertApi = useApi(alertApiRef);\n const identityApi = useApi(identityApiRef);\n const [userEntityRef, setUserEntityRef] = useState<string>(\"\");\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<{\n namespace: string;\n name: string;\n } | null>(null);\n const [apiProductToEdit, setApiProductToEdit] = useState<{\n namespace: string;\n name: string;\n } | null>(null);\n const [deleting, setDeleting] = useState(false);\n const [deleteStats, setDeleteStats] = useState<{\n requests: number;\n secrets: number;\n } | null>(null);\n const [filters, setFilters] = useState<FilterState>({\n status: [],\n lifecycle: [],\n policy: [],\n route: [],\n namespace: [],\n tags: [],\n authentication: [],\n });\n\n const {\n allowed: canCreateApiProduct,\n loading: createPermissionLoading,\n error: createPermissionError,\n } = useKuadrantPermission(kuadrantApiProductCreatePermission);\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 { allowed: canUpdateOwnApiProduct } = useKuadrantPermission(\n kuadrantApiProductUpdateOwnPermission,\n );\n\n const { allowed: canUpdateAllApiProducts } = useKuadrantPermission(\n kuadrantApiProductUpdateAllPermission,\n );\n\n const deletePermissionLoading =\n deleteOwnPermissionLoading || deleteAllPermissionLoading;\n\n const {\n allowed: canListPlanPolicies,\n loading: planPolicyPermissionLoading,\n error: planPolicyPermissionError,\n } = useKuadrantPermission(kuadrantPlanPolicyListPermission);\n\n useAsync(async () => {\n const identity = await identityApi.getBackstageIdentity();\n setUserEntityRef(identity.userEntityRef);\n }, [identityApi]);\n\n const {\n value: apiProducts,\n loading: apiProductsLoading,\n error: apiProductsError,\n } = useAsync(async (): Promise<KuadrantList<APIProduct>> => {\n return kuadrantApi.getApiProducts();\n }, [kuadrantApi, refreshTrigger]);\n\n const {\n value: planPolicies,\n loading: planPoliciesLoading,\n error: planPoliciesError,\n } = useAsync(async (): Promise<KuadrantList<PlanPolicy>> => {\n // skip fetch if user doesn't have permission\n if (!canListPlanPolicies) {\n return { items: [] };\n }\n return kuadrantApi.getPlanPolicies();\n }, [kuadrantApi, refreshTrigger, canListPlanPolicies]);\n\n // helper to find policy for a given route\n const getPolicyForProduct = useCallback((product: APIProduct): string | null => {\n if (!planPolicies?.items) return null;\n const targetRef = product.spec?.targetRef;\n if (!targetRef) return null;\n\n const policy = planPolicies.items.find((pp: PlanPolicy) => {\n const ref = (pp as any).spec.targetRef;\n return (\n ref?.kind === \"HTTPRoute\" &&\n ref?.name === targetRef.name &&\n (!ref?.namespace || ref?.namespace === (targetRef.namespace || product.metadata.namespace))\n );\n });\n return policy?.metadata.name || null;\n }, [planPolicies]);\n\n // helper to get auth schemes for a product\n const getAuthSchemes = useCallback((product: APIProduct): string[] => {\n const authSchemes = product.status?.discoveredAuthScheme?.authentication || {};\n const schemeObjects = Object.values(authSchemes);\n const schemes: string[] = [];\n\n if (schemeObjects.some((scheme: any) => scheme.hasOwnProperty(\"apiKey\"))) {\n schemes.push(\"API Key\");\n }\n if (schemeObjects.some((scheme: any) => scheme.hasOwnProperty(\"jwt\"))) {\n schemes.push(\"OIDC\");\n }\n if (schemes.length === 0) {\n schemes.push(\"Unknown\");\n }\n return schemes;\n }, []);\n\n const loading =\n apiProductsLoading ||\n planPoliciesLoading ||\n createPermissionLoading ||\n deletePermissionLoading ||\n planPolicyPermissionLoading;\n const error = apiProductsError || planPoliciesError;\n const permissionError =\n createPermissionError || deletePermissionError || planPolicyPermissionError;\n\n const allProducts = useMemo(() => {\n const products = apiProducts?.items || [];\n\n // API consumers (users without create/update permissions) should only see Published products\n // API owners can see all products (Draft and Published)\n if (!canCreateApiProduct && !canUpdateOwnApiProduct && !canUpdateAllApiProducts) {\n return products.filter((p: APIProduct) => {\n const publishStatus = p.spec?.publishStatus || 'Draft';\n return publishStatus === 'Published';\n });\n }\n\n return products;\n }, [apiProducts, canCreateApiProduct, canUpdateOwnApiProduct, canUpdateAllApiProducts]);\n\n const filterSections: FilterSection[] = useMemo(() => {\n const statusCounts = { Draft: 0, Published: 0 };\n const lifecycleCounts = new Map<string, number>();\n const policyCounts = new Map<string, number>();\n const routeCounts = new Map<string, number>();\n const namespaceCounts = new Map<string, number>();\n const tagCounts = new Map<string, number>();\n const authCounts = new Map<string, number>();\n\n allProducts.forEach((p: APIProduct) => {\n const status = p.spec?.publishStatus || \"Draft\";\n statusCounts[status as keyof typeof statusCounts]++;\n\n const lifecycle = p.metadata.labels?.lifecycle || \"production\";\n lifecycleCounts.set(lifecycle, (lifecycleCounts.get(lifecycle) || 0) + 1);\n\n const policy = getPolicyForProduct(p) || \"N/A\";\n policyCounts.set(policy, (policyCounts.get(policy) || 0) + 1);\n\n const route = p.spec?.targetRef?.name || \"unknown\";\n routeCounts.set(route, (routeCounts.get(route) || 0) + 1);\n\n const ns = p.metadata.namespace;\n namespaceCounts.set(ns, (namespaceCounts.get(ns) || 0) + 1);\n\n const tags = p.spec?.tags || [];\n tags.forEach((tag: string) => {\n tagCounts.set(tag, (tagCounts.get(tag) || 0) + 1);\n });\n\n const authSchemes = getAuthSchemes(p);\n authSchemes.forEach((scheme: string) => {\n authCounts.set(scheme, (authCounts.get(scheme) || 0) + 1);\n });\n });\n\n const sections: FilterSection[] = [\n {\n id: \"status\",\n title: \"Publish Status\",\n options: [\n { value: \"Draft\", label: \"Draft\", count: statusCounts.Draft },\n { value: \"Published\", label: \"Published\", count: statusCounts.Published },\n ],\n },\n {\n id: \"lifecycle\",\n title: \"Lifecycle\",\n options: Array.from(lifecycleCounts.entries()).map(([state, count]) => ({\n value: state,\n label: state.charAt(0).toUpperCase() + state.slice(1),\n count,\n })),\n },\n {\n id: \"authentication\",\n title: \"Authentication\",\n options: Array.from(authCounts.entries()).map(([scheme, count]) => ({\n value: scheme,\n label: scheme,\n count,\n })),\n },\n {\n id: \"route\",\n title: \"Route\",\n options: Array.from(routeCounts.entries()).map(([name, count]) => ({\n value: name,\n label: name,\n count,\n })),\n collapsed: routeCounts.size > 5,\n },\n {\n id: \"namespace\",\n title: \"Namespace\",\n options: Array.from(namespaceCounts.entries()).map(([ns, count]) => ({\n value: ns,\n label: ns,\n count,\n })),\n collapsed: namespaceCounts.size > 5,\n },\n {\n id: \"tags\",\n title: \"Tags\",\n options: Array.from(tagCounts.entries()).map(([tag, count]) => ({\n value: tag,\n label: tag,\n count,\n })),\n collapsed: tagCounts.size > 5,\n },\n ];\n\n // only show policy filter if user can list planpolicies\n if (canListPlanPolicies) {\n sections.splice(2, 0, {\n id: \"policy\",\n title: \"Policy\",\n options: Array.from(policyCounts.entries()).map(([name, count]) => ({\n value: name,\n label: name,\n count,\n })),\n collapsed: policyCounts.size > 5,\n });\n }\n\n return sections;\n }, [allProducts, getPolicyForProduct, getAuthSchemes, canListPlanPolicies]);\n\n const filteredProducts = useMemo(() => {\n return allProducts.filter((p: APIProduct) => {\n if (filters.status.length > 0) {\n const status = p.spec?.publishStatus || \"Draft\";\n if (!filters.status.includes(status)) return false;\n }\n\n if (filters.lifecycle && filters.lifecycle.length > 0) {\n const lifecycle = p.metadata.labels?.lifecycle || \"production\";\n if (!filters.lifecycle.includes(lifecycle)) return false;\n }\n\n if (filters.authentication.length > 0) {\n const authSchemes = getAuthSchemes(p);\n if (!filters.authentication.some((a: string) => authSchemes.includes(a))) return false;\n }\n\n if (filters.policy.length > 0) {\n const policy = getPolicyForProduct(p) || \"N/A\";\n if (!filters.policy.includes(policy)) return false;\n }\n\n if (filters.route.length > 0) {\n const route = p.spec?.targetRef?.name || \"unknown\";\n if (!filters.route.includes(route)) return false;\n }\n\n if (filters.namespace.length > 0) {\n if (!filters.namespace.includes(p.metadata.namespace)) return false;\n }\n\n if (filters.tags.length > 0) {\n const tags = p.spec?.tags || [];\n if (!filters.tags.some((t: string) => tags.includes(t))) return false;\n }\n\n return true;\n });\n }, [allProducts, filters, getPolicyForProduct, getAuthSchemes]);\n\n const handleCreateSuccess = (productInfo: { namespace: string; name: string; displayName: string }) => {\n setRefreshTrigger((prev) => prev + 1);\n alertApi.post({\n message: `\"${productInfo.displayName}\" created successfully`,\n severity: \"success\",\n display: \"transient\",\n });\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 const productName = apiProductToEdit?.name || \"API Product\";\n alertApi.post({\n message: `\"${productName}\" updated successfully`,\n severity: \"success\",\n display: \"transient\",\n });\n };\n\n const handleDeleteClick = async (namespace: string, name: string) => {\n setApiProductToDelete({ namespace, name });\n setDeleteStats(null);\n\n try {\n const data = await kuadrantApi.getRequestsByNamespace(namespace);\n const related = (data.items || []).filter(\n (r: any) =>\n r.spec.apiName === name && r.spec.apiNamespace === namespace,\n );\n const approved = related.filter(\n (r: any) => r.status?.phase === \"Approved\",\n ).length;\n setDeleteStats({ requests: related.length, secrets: approved });\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to delete access request: ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\n } finally {\n setDeleteDialogOpen(true);\n }\n\n };\n\n const handleDeleteConfirm = async () => {\n if (!apiProductToDelete) return;\n\n setDeleting(true);\n try {\n await kuadrantApi.deleteApiProduct(\n apiProductToDelete.namespace,\n apiProductToDelete.name,\n );\n\n const deletedName = apiProductToDelete?.name || \"API Product\";\n setRefreshTrigger((prev) => prev + 1);\n alertApi.post({\n message: `\"${deletedName}\" deleted successfully`,\n severity: \"success\",\n display: \"transient\",\n });\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to delete API Product: ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\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 handlePublishToggle = async (row: any) => {\n const namespace = row.metadata.namespace;\n const name = row.metadata.name;\n const displayName = row.spec?.displayName || name;\n const currentStatus = row.spec?.publishStatus || \"Draft\";\n const newStatus = currentStatus === \"Published\" ? \"Draft\" : \"Published\";\n const lifecycle = row.metadata.labels?.lifecycle;\n\n // prevent publishing retired APIs\n if (newStatus === \"Published\" && lifecycle === \"retired\") {\n alertApi.post({\n message: `Cannot publish a retired API product. Please change the lifecycle status first.`,\n severity: \"error\",\n display: \"transient\",\n });\n return;\n }\n\n const productPatch: Partial<APIProduct> = {\n // @ts-ignore partial obj\n spec: {\n publishStatus: newStatus\n },\n }\n\n try {\n await kuadrantApi.updateApiProduct(namespace, name, productPatch);\n\n setRefreshTrigger((prev) => prev + 1);\n alertApi.post({\n message: `\"${displayName}\" ${newStatus === \"Published\" ? \"published\" : \"unpublished\"} successfully`,\n severity: \"success\",\n display: \"transient\",\n });\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to update publish status: ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\n }\n };\n\n const columns: TableColumn[] = [\n {\n title: \"Name\",\n field: \"spec.displayName\",\n render: (row: any) => {\n const displayName = row.spec?.displayName ?? row.metadata.name;\n return (\n <Link to={`/kuadrant/api-products/${row.metadata.namespace}/${row.metadata.name}`}>\n <strong>{displayName}</strong>\n </Link>\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: \"Version\",\n field: \"spec.version\",\n render: (row: any) => row.spec?.version || \"-\",\n },\n {\n title: \"Route\",\n field: \"spec.targetRef.name\",\n render: (row: any) => row.spec?.targetRef?.name || \"-\",\n },\n // only show policy column if user can list planpolicies\n ...(canListPlanPolicies\n ? [\n {\n title: \"Policy\",\n field: \"policy\",\n render: (row: any) => getPolicyForProduct(row) || \"N/A\",\n },\n ]\n : []),\n {\n title: \"Tags\",\n field: \"spec.tags\",\n render: (row: any) => {\n const tags = row.spec?.tags || [];\n if (tags.length === 0) return \"-\";\n return (\n <Box display=\"flex\" style={{ gap: 4, flexWrap: \"wrap\" }}>\n {tags.map((tag: string) => (\n <Chip key={tag} label={tag} size=\"small\" variant=\"outlined\" />\n ))}\n </Box>\n );\n },\n },\n {\n title: \"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: \"Lifecycle\",\n field: \"metadata.labels.lifecycle\",\n render: (row: any) => {\n const lifecycle = row.metadata.labels?.lifecycle;\n if (!lifecycle) return \"-\";\n return (\n <Chip\n label={lifecycle.charAt(0).toUpperCase() + lifecycle.slice(1)}\n size=\"small\"\n style={getLifecycleChipStyle(lifecycle)}\n />\n );\n },\n },\n {\n title: \"Authentication\",\n field: \"status.discoveredAuthScheme\",\n render: (row: any) => {\n const authSchemes =\n row.status?.discoveredAuthScheme?.authentication || {};\n const schemeObjects = Object.values(authSchemes);\n\n const hasApiKey = schemeObjects.some((scheme: any) =>\n scheme.hasOwnProperty(\"apiKey\"),\n );\n const hasJwt = schemeObjects.some((scheme: any) =>\n scheme.hasOwnProperty(\"jwt\"),\n );\n\n if (!hasApiKey && !hasJwt) {\n return (\n <Typography variant=\"body2\" style={{ fontStyle: \"italic\" }}>\n unknown\n </Typography>\n );\n }\n\n return (\n <Box display=\"flex\" style={{ gap: 4 }}>\n {hasApiKey && (\n <Chip\n icon={<VpnKeyIcon />}\n label=\"API Key\"\n size=\"small\"\n color=\"primary\"\n />\n )}\n {hasJwt && (\n <Chip\n icon={<LockIcon />}\n label=\"OIDC\"\n size=\"small\"\n color=\"secondary\"\n />\n )}\n </Box>\n );\n },\n },\n {\n title: \"Namespace\",\n field: \"metadata.namespace\",\n },\n {\n title: \"Actions\",\n field: \"actions\",\n filtering: false,\n render: (row: any) => {\n const owner = row.metadata?.annotations?.[\"backstage.io/owner\"];\n const isOwner = owner === userEntityRef;\n const canEdit =\n canUpdateAllApiProducts || (canUpdateOwnApiProduct && isOwner);\n const canDelete =\n canDeleteAllApiProducts || (canDeleteOwnApiProduct && isOwner);\n const isPublished = row.spec?.publishStatus === \"Published\";\n\n return (\n <Box display=\"flex\" alignItems=\"center\" style={{ gap: 4 }}>\n {canEdit && (\n <Button\n size=\"small\"\n color=\"primary\"\n onClick={() => handlePublishToggle(row)}\n style={{ marginRight: 4, textTransform: \"none\" }}\n >\n {isPublished ? \"Unpublish\" : \"Publish\"}\n </Button>\n )}\n {canEdit && (\n <IconButton\n size=\"small\"\n onClick={() =>\n handleEditClick(row.metadata.namespace, row.metadata.name)\n }\n title=\"Edit API Product\"\n >\n <EditIcon fontSize=\"small\" />\n </IconButton>\n )}\n {canDelete && (\n <IconButton\n size=\"small\"\n onClick={() =>\n handleDeleteClick(row.metadata.namespace, row.metadata.name)\n }\n title=\"Delete API Product\"\n >\n <DeleteIcon fontSize=\"small\" />\n </IconButton>\n )}\n </Box>\n );\n },\n },\n ];\n\n return (\n <Page themeId=\"tool\">\n <Header\n title=\"API Products\"\n subtitle=\"Manage API products for Kubernetes\"\n >\n <SupportButton>Manage API products and plan policies</SupportButton>\n </Header>\n <Content>\n {loading && (\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"center\"\n justifyContent=\"center\"\n minHeight={300}\n >\n <CircularProgress />\n <Typography variant=\"h6\" style={{ marginTop: 16 }}>\n Loading data...\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Preparing your data... This should only take a moment.\n </Typography>\n </Box>\n )}\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:{\" \"}\n {createPermissionError\n ? \"kuadrant.apiproduct.create\"\n : deletePermissionError\n ? \"kuadrant.apiproduct.delete\"\n : planPolicyPermissionError\n ? \"kuadrant.planpolicy.list\"\n : \"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 && allProducts.length === 0 && (\n <Box className={classes.emptyState}>\n <Box className={classes.emptyStateContent}>\n <Box className={classes.emptyStateText}>\n <Typography variant=\"h4\" className={classes.emptyStateTitle}>\n API Product\n </Typography>\n <Typography\n variant=\"body1\"\n className={classes.emptyStateDescription}\n >\n Create API product by registering existing API, associate\n route and policy\n </Typography>\n {canCreateApiProduct && (\n <Button\n variant=\"contained\"\n color=\"primary\"\n startIcon={<AddIcon />}\n onClick={() => setCreateDialogOpen(true)}\n >\n Create API Product\n </Button>\n )}\n </Box>\n <img\n src={emptyStateIllustration}\n alt=\"API Product illustration\"\n className={classes.emptyStateImage}\n />\n </Box>\n </Box>\n )}\n {!loading && !error && !permissionError && allProducts.length > 0 && (\n <Box className={classes.container}>\n <FilterPanel\n sections={filterSections}\n filters={filters}\n onChange={setFilters}\n />\n <Box className={classes.tableContainer}>\n <Box display=\"flex\" justifyContent=\"flex-end\" mb={2}>\n {canCreateApiProduct && (\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 )}\n </Box>\n {filteredProducts.length === 0 ? (\n <Box p={4} textAlign=\"center\">\n <Typography variant=\"body1\" color=\"textSecondary\">\n No API products match the selected filters.\n </Typography>\n </Box>\n ) : (\n <Table\n options={{\n paging: filteredProducts.length > 10,\n pageSize: 20,\n search: true,\n filtering: false,\n debounceInterval: 300,\n toolbar: true,\n emptyRowsWhenPaging: false,\n }}\n columns={columns}\n data={filteredProducts}\n />\n )}\n </Box>\n </Box>\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 <ConfirmDeleteDialog\n open={deleteDialogOpen}\n title=\"Delete API Product\"\n description={\n deleteStats\n ? `Deleting \"${apiProductToDelete?.name}\" will also remove:\n\n• ${deleteStats.requests} API Key(s)\n• ${deleteStats.secrets} API Key Secret(s)\n\nThis action cannot be undone.`\n : `Deleting \"${apiProductToDelete?.name}\" will also remove all associated API Keys and Secrets.\nThis action cannot be undone.`\n }\n confirmText={apiProductToDelete?.name}\n severity=\"high\"\n deleting={deleting}\n onConfirm={handleDeleteConfirm}\n onCancel={handleDeleteCancel}\n />\n </Content>\n </Page>\n );\n};\n\nexport const ApiProductsPage = () => {\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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RequestAccessDialog.esm.js","sources":["../../../src/components/RequestAccessDialog/RequestAccessDialog.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Button,\n TextField,\n Select,\n MenuItem,\n FormControl,\n InputLabel,\n Box,\n Typography,\n CircularProgress,\n} from '@material-ui/core';\nimport InfoIcon from '@material-ui/icons/Info';\nimport {\n useApi,\n alertApiRef,\n} from '@backstage/core-plugin-api';\nimport { kuadrantApiRef } from '../../api';\nimport {
|
|
1
|
+
{"version":3,"file":"RequestAccessDialog.esm.js","sources":["../../../src/components/RequestAccessDialog/RequestAccessDialog.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Button,\n TextField,\n Select,\n MenuItem,\n FormControl,\n InputLabel,\n Box,\n Typography,\n CircularProgress,\n} from '@material-ui/core';\nimport InfoIcon from '@material-ui/icons/Info';\nimport {\n useApi,\n alertApiRef,\n} from '@backstage/core-plugin-api';\nimport { kuadrantApiRef } from '../../api';\nimport { Plan } from \"../../types/api-management.ts\";\n\nexport interface RequestAccessDialogProps {\n open: boolean;\n onClose: () => void;\n onSuccess: () => void;\n apiProductName: string;\n namespace: string;\n userEmail: string;\n plans: Plan[];\n}\n\nexport const RequestAccessDialog = ({\n open,\n onClose,\n onSuccess,\n apiProductName,\n namespace,\n userEmail,\n plans,\n}: RequestAccessDialogProps) => {\n const kuadrantApi = useApi(kuadrantApiRef);\n const alertApi = useApi(alertApiRef);\n\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\n const handleClose = () => {\n setSelectedPlan('');\n setUseCase('');\n setCreateError(null);\n onClose();\n };\n\n const handleRequestAccess = async () => {\n if (!selectedPlan) return;\n\n setCreating(true);\n setCreateError(null);\n try {\n await kuadrantApi.createRequest({\n apiProductName,\n namespace,\n planTier: selectedPlan,\n useCase: useCase.trim() || '',\n userEmail,\n });\n\n alertApi.post({\n message: 'API key requested successfully',\n severity: 'success',\n display: 'transient',\n });\n\n setSelectedPlan('');\n setUseCase('');\n onSuccess();\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : 'unknown error occurred';\n alertApi.post({\n message: `Failed to request API key: ${errorMessage}`,\n severity: 'error',\n display: 'transient',\n });\n setCreateError(errorMessage);\n } finally {\n setCreating(false);\n }\n };\n\n return (\n <Dialog open={open} onClose={handleClose} maxWidth=\"sm\" fullWidth>\n <DialogTitle>Request API Access</DialogTitle>\n <DialogContent>\n <Box\n mb={2}\n p={1.5}\n bgcolor=\"info.light\"\n borderRadius={1}\n display=\"flex\"\n alignItems=\"flex-start\"\n style={{ gap: 8 }}\n >\n <InfoIcon\n color=\"primary\"\n fontSize=\"small\"\n style={{ marginTop: 2 }}\n />\n <Typography variant=\"body2\">\n Your request will be reviewed by an API owner before access is\n granted.\n </Typography>\n </Box>\n {createError && (\n <Box\n mb={2}\n p={2}\n bgcolor=\"error.main\"\n color=\"error.contrastText\"\n borderRadius={1}\n >\n <Typography variant=\"body2\">{createError}</Typography>\n </Box>\n )}\n <FormControl\n fullWidth\n margin=\"normal\"\n disabled={creating}\n data-testid=\"tier-select-form\"\n >\n <InputLabel id=\"tier-select-label\">Select Tier</InputLabel>\n <Select\n labelId=\"tier-select-label\"\n data-testid=\"tier-select\"\n value={selectedPlan}\n onChange={(e) => setSelectedPlan(e.target.value as string)}\n disabled={creating}\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\n key={plan.tier}\n value={plan.tier}\n data-testid={`tier-option-${plan.tier}`}\n >\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 disabled={creating}\n />\n </DialogContent>\n <DialogActions>\n <Button onClick={handleClose} disabled={creating}>\n Cancel\n </Button>\n <Button\n onClick={handleRequestAccess}\n color=\"primary\"\n variant=\"contained\"\n disabled={!selectedPlan || creating}\n startIcon={\n creating ? (\n <CircularProgress size={16} color=\"inherit\" />\n ) : undefined\n }\n >\n {creating ? 'Submitting...' : 'Submit Request'}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n"],"names":[],"mappings":"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"}
|