@@ -2,33 +2,105 @@ import { useState } from "react";
2
2
import { useNavigate } from "react-router-dom" ;
3
3
import { Button , Stack , Typography } from "@mui/material" ;
4
4
import { AddOutlined } from "@mui/icons-material" ;
5
- import { useRecoilValue } from "recoil" ;
6
- import { sheetsListState } from "../../data/atoms" ;
5
+ import { useRecoilValue , useSetRecoilState } from "recoil" ;
6
+ import { sheetsListSelector } from "../../data/atoms" ;
7
7
import { SheetFromTemplateDialog } from "./SheetFromTemplateDialog" ;
8
+ import {
9
+ Table ,
10
+ TableBody ,
11
+ TableCell ,
12
+ TableHead ,
13
+ TableRow ,
14
+ IconButton ,
15
+ } from "@mui/material" ;
16
+ import { enqueueSnackbar } from "notistack" ;
17
+ import { DeleteOutlineOutlined , EditOutlined } from "@mui/icons-material" ;
18
+ import { axios } from "../../data/axios" ;
19
+ import SheetDeleteDialog from "./SheetDeleteDialog" ;
20
+ import { useEffect } from "react" ;
8
21
9
- function SheetListItem ( props ) {
10
- const { sheet } = props ;
22
+ function SheetListItem ( { sheet, onDelete } ) {
11
23
const navigate = useNavigate ( ) ;
24
+ const [ deleteDialogOpen , setDeleteDialogOpen ] = useState ( false ) ;
25
+
26
+ const handleDelete = ( ) => {
27
+ setDeleteDialogOpen ( true ) ;
28
+ } ;
29
+
30
+ const confirmDelete = ( ) => {
31
+ onDelete ( sheet . uuid ) ;
32
+ setDeleteDialogOpen ( false ) ;
33
+ } ;
12
34
13
35
return (
14
- < Stack
15
- key = { sheet . id }
16
- onClick = { ( ) => {
17
- navigate ( `/sheets/${ sheet . uuid } ` ) ;
36
+ < TableRow
37
+ key = { sheet . uuid }
38
+ onClick = { ( ) => navigate ( `/sheets/${ sheet . uuid } ` ) }
39
+ sx = { {
40
+ cursor : "pointer" ,
41
+ "&:hover" : {
42
+ backgroundColor : "rgba(0, 0, 0, 0.04)" ,
43
+ } ,
18
44
} }
19
45
>
20
- < Typography variant = "h6" > { sheet . name } </ Typography >
21
- < Typography variant = "caption" sx = { { color : "#666" } } >
22
- { sheet . data ?. description }
23
- </ Typography >
24
- </ Stack >
46
+ < TableCell >
47
+ < Typography variant = "subtitle1" sx = { { fontWeight : "bold" } } >
48
+ { sheet . name }
49
+ </ Typography >
50
+ </ TableCell >
51
+ < TableCell >
52
+ < Typography variant = "body2" sx = { { color : "text.secondary" } } >
53
+ { sheet . data ?. description || "No description available" }
54
+ </ Typography >
55
+ </ TableCell >
56
+ < TableCell >
57
+ < IconButton aria-label = "edit" onClick = { ( e ) => e . stopPropagation ( ) } >
58
+ < EditOutlined />
59
+ </ IconButton >
60
+ < IconButton
61
+ aria-label = "delete"
62
+ onClick = { ( e ) => {
63
+ e . stopPropagation ( ) ;
64
+ handleDelete ( ) ;
65
+ } }
66
+ >
67
+ < DeleteOutlineOutlined />
68
+ </ IconButton >
69
+ </ TableCell >
70
+ < SheetDeleteDialog
71
+ open = { deleteDialogOpen }
72
+ onClose = { ( ) => setDeleteDialogOpen ( false ) }
73
+ onConfirm = { confirmDelete }
74
+ sheetName = { sheet . name }
75
+ />
76
+ </ TableRow >
25
77
) ;
26
78
}
27
79
28
- function SheetsList ( props ) {
29
- const { selectedSheet, selectSheet } = props ;
80
+ function SheetsList ( ) {
30
81
const [ newSheetDialogOpen , setNewSheetDialogOpen ] = useState ( false ) ;
31
- const sheets = useRecoilValue ( sheetsListState ) ;
82
+ const sheets = useRecoilValue ( sheetsListSelector ) ;
83
+ const setSheets = useSetRecoilState ( sheetsListSelector ) ;
84
+
85
+ useEffect ( ( ) => {
86
+ // This will trigger the selector to fetch sheets if they're not already loaded
87
+ setSheets ( [ ] ) ;
88
+ } , [ setSheets ] ) ;
89
+
90
+ const handleDeleteSheet = ( sheetId ) => {
91
+ axios ( )
92
+ . delete ( `/api/sheets/${ sheetId } ` )
93
+ . then ( ( ) => {
94
+ setSheets ( ( prevSheets ) =>
95
+ prevSheets . filter ( ( sheet ) => sheet . uuid !== sheetId ) ,
96
+ ) ;
97
+ enqueueSnackbar ( "Sheet deleted successfully" , { variant : "success" } ) ;
98
+ } )
99
+ . catch ( ( error ) => {
100
+ console . error ( "Error deleting sheet:" , error ) ;
101
+ enqueueSnackbar ( "Failed to delete sheet" , { variant : "error" } ) ;
102
+ } ) ;
103
+ } ;
32
104
33
105
return (
34
106
< Stack >
@@ -52,14 +124,32 @@ function SheetsList(props) {
52
124
</ Button >
53
125
</ Stack >
54
126
</ Typography >
55
- { Object . values ( sheets ) . map ( ( sheet ) => (
56
- < SheetListItem
57
- key = { sheet . uuid }
58
- sheet = { sheet }
59
- selected = { selectedSheet === sheet . uuid }
60
- selectSheet = { selectSheet }
61
- />
62
- ) ) }
127
+ < Table >
128
+ < TableHead >
129
+ < TableRow >
130
+ < TableCell > Name</ TableCell >
131
+ < TableCell > Description</ TableCell >
132
+ < TableCell > Actions</ TableCell >
133
+ </ TableRow >
134
+ </ TableHead >
135
+ < TableBody >
136
+ { sheets . length > 0 ? (
137
+ sheets . map ( ( sheet ) => (
138
+ < SheetListItem
139
+ key = { sheet . uuid }
140
+ sheet = { sheet }
141
+ onDelete = { handleDeleteSheet }
142
+ />
143
+ ) )
144
+ ) : (
145
+ < TableRow >
146
+ < TableCell colSpan = { 3 } >
147
+ < Typography align = "center" > No sheets available</ Typography >
148
+ </ TableCell >
149
+ </ TableRow >
150
+ ) }
151
+ </ TableBody >
152
+ </ Table >
63
153
< SheetFromTemplateDialog
64
154
open = { newSheetDialogOpen }
65
155
setOpen = { setNewSheetDialogOpen }
0 commit comments