1- import React , { useState } from "react" ;
1+ import React from "react" ;
22import {
33 TableContainer ,
44 Table ,
55 TableBody ,
66 Paper ,
7- TableRow ,
8- TableCell ,
97 useTheme ,
108 alpha ,
119} from "@mui/material" ;
1210import JobTableHeader from "./JobTableHeader" ;
1311import JobTableRow from "./JobTableRow" ;
14- import JobTableDeleteDialog from "./JobTableDeleteDialog" ; // Be sure to have this component
1512
1613const 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
0 commit comments