@@ -24,17 +24,25 @@ import {
2424 GridItem ,
2525 Tag ,
2626 Select ,
27+ AlertDialog ,
28+ AlertDialogBody ,
29+ AlertDialogFooter ,
30+ AlertDialogHeader ,
31+ AlertDialogContent ,
32+ AlertDialogOverlay ,
33+ useDisclosure ,
2734} from "@chakra-ui/react" ;
2835import * as XLSX from "xlsx" ;
2936import { CenterStyle } from "@/styles/AllStyle" ;
3037import "./treetable.css" ;
31- import { useState , useEffect } from "react" ;
38+ import { useState , useEffect , useRef } from "react" ;
3239import { ITree } from "@/database/treeSchema" ;
33- import { FileDown , Menu , SearchIcon , ChevronLeft , ChevronRight , TreePine , Edit } from "lucide-react" ;
40+ import { FileDown , Menu , SearchIcon , ChevronLeft , ChevronRight , TreePine , Edit , Trash2 } from "lucide-react" ;
3441import { useSearchParams } from "next/navigation" ;
3542import { BrowserView , MobileView , isMobile } from "react-device-detect" ;
3643import { useUser } from "@clerk/nextjs" ;
3744import Link from "next/link" ;
45+ import DeletePopUp from "@/components/DeletePopUp" ;
3846
3947export default function TreeTable ( ) {
4048 const [ loading , setLoading ] = useState ( true ) ;
@@ -221,6 +229,36 @@ export default function TreeTable() {
221229 } ;
222230
223231 const [ selectedTree , setSelectedTree ] = useState < ITree | null > ( null ) ;
232+ const [ deleteDialogOpen , setDeleteDialogOpen ] = useState ( false ) ;
233+ const [ treeToDelete , setTreeToDelete ] = useState < ITree | null > ( null ) ;
234+ const cancelRef = useRef < HTMLButtonElement > ( null ) ;
235+
236+ const openDeleteDialog = ( tree : ITree ) => {
237+ setTreeToDelete ( tree ) ;
238+ setDeleteDialogOpen ( true ) ;
239+ } ;
240+
241+ const closeDeleteDialog = ( ) => {
242+ setDeleteDialogOpen ( false ) ;
243+ setTreeToDelete ( null ) ;
244+ } ;
245+
246+ const handleDeleteTree = async ( ) => {
247+ if ( ! treeToDelete ) return ;
248+ try {
249+ const res = await fetch ( `/api/tree/${ treeToDelete . _id } ` , { method : "DELETE" } ) ;
250+ if ( res . ok ) {
251+ setTrees ( ( prev ) => prev . filter ( ( t ) => t . _id !== treeToDelete . _id ) ) ;
252+ setFilteredTrees ( ( prev ) => prev . filter ( ( t ) => t . _id !== treeToDelete . _id ) ) ;
253+ closeDeleteDialog ( ) ;
254+ setSelectedTree ( null ) ;
255+ } else {
256+ closeDeleteDialog ( ) ;
257+ }
258+ } catch ( err ) {
259+ closeDeleteDialog ( ) ;
260+ }
261+ } ;
224262
225263 const handleArrowClick = ( treeData : ITree ) => {
226264 setSelectedTree ( treeData ) ;
@@ -458,9 +496,15 @@ export default function TreeTable() {
458496 </ Tag >
459497 </ Td >
460498 < Td >
461- < Button bg = "" _hover = { { bg : "gray.100" } } onClick = { ( ) => handleArrowClick ( tree ) } >
462- < ChevronRight />
463- </ Button >
499+ < HStack >
500+ < Button
501+ bg = ""
502+ _hover = { { bg : "gray.100" } }
503+ onClick = { ( ) => handleArrowClick ( tree ) }
504+ >
505+ < ChevronRight />
506+ </ Button >
507+ </ HStack >
464508 </ Td >
465509 </ Tr >
466510 ) )
@@ -541,15 +585,21 @@ export default function TreeTable() {
541585 transition = "all 0.3s ease-in-out"
542586 overflowX = { "auto" }
543587 height = "100%"
588+ position = "relative"
589+ zIndex = { 2 }
544590 >
545591 < Box bg = "#596334" color = "white" p = { 5 } borderTopLeftRadius = { 20 } borderTopRightRadius = { 20 } >
546592 < VStack gap = { 3 } align = "stretch" >
547593 { /* Top row */ }
548- < Flex justifyContent = "flex-end" >
549- { /* Notes icon on the right */ }
594+ < Flex justifyContent = "flex-end" alignItems = "center" gap = { 2 } >
550595 < Link href = { `/editTreeForm/${ selectedTree . _id } ` } >
551596 < Edit size = { 20 } cursor = "pointer" />
552597 </ Link >
598+ < Trash2
599+ size = { 20 }
600+ style = { { cursor : "pointer" , marginLeft : 4 , color : "white" } }
601+ onClick = { ( ) => openDeleteDialog ( selectedTree ) }
602+ />
553603 </ Flex >
554604 < Flex justifyContent = "space-between" alignItems = "center" >
555605 < Flex alignItems = "center" gap = { 3 } >
@@ -788,6 +838,25 @@ export default function TreeTable() {
788838 ) : (
789839 < div > </ div >
790840 ) }
841+ { deleteDialogOpen && (
842+ < Flex
843+ zIndex = "1000"
844+ w = { "100vw" }
845+ h = { "100vh" }
846+ left = { 0 }
847+ top = { 0 }
848+ justifyContent = { "center" }
849+ alignItems = { "center" }
850+ position = "fixed"
851+ style = { { backdropFilter : "blur(3px)" } }
852+ >
853+ < DeletePopUp
854+ closePopup = { closeDeleteDialog }
855+ deleteFunction = { handleDeleteTree }
856+ bodyText = "Do you really want to delete this tree? This process can not be undone."
857+ />
858+ </ Flex >
859+ ) }
791860 </ div >
792861 ) ;
793862}
0 commit comments