Skip to content

Commit 97b137f

Browse files
committed
feat: frontend editing queues as forms
Signed-off-by: Shrutim1505 <shrutimurthy2103@gmail.com>
1 parent 5e715a5 commit 97b137f

File tree

3 files changed

+481
-386
lines changed

3 files changed

+481
-386
lines changed

frontend/src/components/jobs/JobTable/JobTable.jsx

Lines changed: 50 additions & 167 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,14 @@
1-
import React, { useState } from "react";
1+
import React from "react";
22
import {
33
TableContainer,
44
Table,
55
TableBody,
66
Paper,
7-
TableRow,
8-
TableCell,
97
useTheme,
108
alpha,
119
} from "@mui/material";
1210
import JobTableHeader from "./JobTableHeader";
1311
import JobTableRow from "./JobTableRow";
14-
import JobTableDeleteDialog from "./JobTableDeleteDialog"; // Be sure to have this component
1512

1613
const JobTable = ({
1714
jobs,
@@ -25,174 +22,60 @@ const JobTable = ({
2522
handleFilterClose,
2623
sortDirection,
2724
toggleSortDirection,
28-
onJobUpdate,
29-
reloadJobs, // (optional) for refetching after delete
3025
}) => {
3126
const theme = useTheme();
3227

33-
// State for delete dialog
34-
const [openDeleteDialog, setOpenDeleteDialog] = useState(false);
35-
const [jobToDelete, setJobToDelete] = useState(null);
36-
const [deleteError, setDeleteError] = useState(null);
37-
const [isDeleting, setIsDeleting] = useState(false);
38-
39-
// Open dialog with the selected job object
40-
const handleOpenDeleteDialog = (job) => {
41-
setJobToDelete(job);
42-
setOpenDeleteDialog(true);
43-
setDeleteError(null);
44-
};
45-
46-
// Close dialog
47-
const handleCloseDeleteDialog = () => {
48-
setOpenDeleteDialog(false);
49-
setJobToDelete(null);
50-
setDeleteError(null);
51-
setIsDeleting(false);
52-
};
53-
54-
const handleDelete = async () => {
55-
if (!jobToDelete) return;
56-
setIsDeleting(true);
57-
try {
58-
const { namespace, name } = jobToDelete.metadata;
59-
const response = await fetch(
60-
`/api/jobs/${encodeURIComponent(namespace)}/${encodeURIComponent(name)}`,
61-
{
62-
method: "DELETE",
63-
headers: {
64-
"Content-Type": "application/json",
65-
Accept: "application/json",
66-
},
67-
},
68-
);
69-
70-
// Try to parse the JSON error or success body
71-
let data = {};
72-
const contentType = response.headers.get("content-type");
73-
const text = await response.text();
74-
try {
75-
if (
76-
contentType &&
77-
contentType.includes("application/json") &&
78-
text
79-
) {
80-
data = JSON.parse(text);
81-
} else {
82-
data = { message: text };
83-
}
84-
} catch {
85-
data = { message: text };
86-
}
87-
88-
// If DELETE failed, show the message from K8s API (data.message or data.details)
89-
if (!response.ok) {
90-
// Prefer Kubernetes' error message or fallback to the raw response
91-
const k8sMessage =
92-
data.message ||
93-
data.details ||
94-
text ||
95-
`Job "${namespace}/${name}" could not be deleted.`;
96-
97-
setDeleteError(k8sMessage);
98-
return;
99-
}
100-
101-
// On success, optionally reload jobs
102-
if (reloadJobs) reloadJobs();
103-
104-
handleCloseDeleteDialog();
105-
} catch (error) {
106-
setDeleteError(error.message || "An unexpected error occurred.");
107-
} finally {
108-
setIsDeleting(false);
109-
}
110-
};
111-
11228
return (
113-
<React.Fragment>
114-
<TableContainer
115-
component={Paper}
116-
sx={{
117-
maxHeight: "calc(100vh - 200px)",
118-
overflow: "auto",
119-
borderRadius: "16px",
120-
boxShadow: "0 10px 30px rgba(0, 0, 0, 0.08)",
121-
background: `linear-gradient(to bottom, ${alpha(theme.palette.background.paper, 0.9)}, ${theme.palette.background.paper})`,
122-
backdropFilter: "blur(10px)",
123-
border: `1px solid ${alpha(theme.palette.divider, 0.1)}`,
124-
"&::-webkit-scrollbar": {
125-
width: "10px",
126-
height: "10px",
127-
},
128-
"&::-webkit-scrollbar-thumb": {
129-
backgroundColor: alpha(theme.palette.primary.main, 0.2),
130-
borderRadius: "5px",
131-
"&:hover": {
132-
backgroundColor: alpha(
133-
theme.palette.primary.main,
134-
0.3,
135-
),
136-
},
137-
},
138-
"&::-webkit-scrollbar-track": {
139-
backgroundColor: alpha(
140-
theme.palette.primary.main,
141-
0.05,
142-
),
143-
borderRadius: "5px",
29+
<TableContainer
30+
component={Paper}
31+
sx={{
32+
maxHeight: "calc(100vh - 200px)",
33+
overflow: "auto",
34+
borderRadius: "16px",
35+
boxShadow: "0 10px 30px rgba(0, 0, 0, 0.08)",
36+
background: `linear-gradient(to bottom, ${alpha(theme.palette.background.paper, 0.9)}, ${theme.palette.background.paper})`,
37+
backdropFilter: "blur(10px)",
38+
border: `1px solid ${alpha(theme.palette.divider, 0.1)}`,
39+
"&::-webkit-scrollbar": {
40+
width: "10px",
41+
height: "10px",
42+
},
43+
"&::-webkit-scrollbar-thumb": {
44+
backgroundColor: alpha(theme.palette.primary.main, 0.2),
45+
borderRadius: "5px",
46+
"&:hover": {
47+
backgroundColor: alpha(theme.palette.primary.main, 0.3),
14448
},
145-
}}
146-
>
147-
<Table stickyHeader>
148-
<JobTableHeader
149-
filters={filters}
150-
uniqueStatuses={uniqueStatuses}
151-
allNamespaces={allNamespaces}
152-
allQueues={allQueues}
153-
anchorEl={anchorEl}
154-
handleFilterClick={handleFilterClick}
155-
handleFilterClose={handleFilterClose}
156-
sortDirection={sortDirection}
157-
toggleSortDirection={toggleSortDirection}
158-
/>
159-
<TableBody>
160-
{jobs.length === 0 ? (
161-
<TableRow>
162-
<TableCell colSpan={8} align="center">
163-
No jobs found.
164-
</TableCell>
165-
</TableRow>
166-
) : (
167-
jobs.map((job) => (
168-
<JobTableRow
169-
key={`${job.metadata.namespace}-${job.metadata.name}`}
170-
job={job}
171-
handleJobClick={handleJobClick}
172-
handleOpenDeleteDialog={
173-
handleOpenDeleteDialog
174-
}
175-
onJobUpdate={onJobUpdate}
176-
/>
177-
))
178-
)}
179-
</TableBody>
180-
</Table>
181-
</TableContainer>
182-
183-
<JobTableDeleteDialog
184-
open={openDeleteDialog}
185-
onClose={handleCloseDeleteDialog}
186-
onConfirm={handleDelete}
187-
jobToDelete={
188-
jobToDelete
189-
? `${jobToDelete.metadata.namespace}/${jobToDelete.metadata.name}`
190-
: ""
191-
}
192-
error={deleteError}
193-
isDeleting={isDeleting}
194-
/>
195-
</React.Fragment>
49+
},
50+
"&::-webkit-scrollbar-track": {
51+
backgroundColor: alpha(theme.palette.primary.main, 0.05),
52+
borderRadius: "5px",
53+
},
54+
}}
55+
>
56+
<Table stickyHeader>
57+
<JobTableHeader
58+
filters={filters}
59+
uniqueStatuses={uniqueStatuses}
60+
allNamespaces={allNamespaces}
61+
allQueues={allQueues}
62+
anchorEl={anchorEl}
63+
handleFilterClick={handleFilterClick}
64+
handleFilterClose={handleFilterClose}
65+
sortDirection={sortDirection}
66+
toggleSortDirection={toggleSortDirection}
67+
/>
68+
<TableBody>
69+
{jobs.map((job) => (
70+
<JobTableRow
71+
key={`${job.metadata.namespace}-${job.metadata.name}`}
72+
job={job}
73+
handleJobClick={handleJobClick}
74+
/>
75+
))}
76+
</TableBody>
77+
</Table>
78+
</TableContainer>
19679
);
19780
};
19881

frontend/src/components/jobs/JobTable/JobTableRow.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ const JobTableRow = ({
150150
<IconButton
151151
onClick={(e) => {
152152
e.stopPropagation();
153-
handleOpenDeleteDialog(job);
153+
handleOpenDeleteDialog(job.metadata.name);
154154
}}
155155
size="small"
156156
sx={{

0 commit comments

Comments
 (0)