Files
tanami-admin-panel/src/Components/DataTable/DataTable.jsx

155 lines
5.6 KiB
React
Raw Normal View History

2024-07-08 12:22:27 +05:30
import React, { useContext, useState } from "react";
2024-06-21 20:32:14 +05:30
import {
Table,
TableContainer,
Tbody,
Td,
Th,
Thead,
Tr,
Skeleton,
TableCaption,
2024-07-22 14:50:31 +05:30
Box,
2024-06-21 20:32:14 +05:30
} from "@chakra-ui/react";
2024-07-08 12:22:27 +05:30
import { DragDropContext, Droppable, Draggable } from "react-beautiful-dnd";
2024-06-20 12:09:48 +05:30
import EmptySearchList from "../EmptySearchList";
2024-06-25 19:16:55 +05:30
import { useNavigate } from "react-router-dom";
2024-06-20 12:09:48 +05:30
2024-06-25 18:41:41 +05:30
import GlobalStateContext from "../../Contexts/GlobalStateContext";
2024-06-20 12:09:48 +05:30
const DataTable = ({
2024-07-17 11:52:28 +05:30
data,
2024-07-08 12:22:27 +05:30
setData,
isLoading,
tableHeadRow,
2024-07-25 21:02:05 +05:30
tableHeadRowTwo,
emptyMessage,
2024-07-08 12:22:27 +05:30
centered,
2024-06-25 19:16:55 +05:30
setMouseEntered,
setMouseEnteredId,
2024-07-08 12:22:27 +05:30
caption,
2024-07-22 14:50:31 +05:30
isDraggable
}) => {
const navigate = useNavigate();
2024-06-25 18:41:41 +05:30
const { slideFromRight } = useContext(GlobalStateContext);
2024-07-22 14:50:31 +05:30
if (isLoading) {
return (
<Box>
{Array.from({ length: 10 }).map((_, index) => (
<Skeleton height="32px" my="10px" key={index} />
))}
</Box>
);
}
2024-06-25 18:41:41 +05:30
2024-07-08 12:22:27 +05:30
const handleDragEnd = (result) => {
if (!result.destination) return;
const reorderedItems = Array.from(data);
const [removed] = reorderedItems.splice(result.source.index, 1);
reorderedItems.splice(result.destination.index, 0, removed);
setData(reorderedItems)
2024-07-22 14:50:31 +05:30
console.log("New Order:", reorderedItems.map((item, index) => ({ index, item })));
2024-07-08 12:22:27 +05:30
};
2024-06-20 12:09:48 +05:30
return (
2024-07-08 12:22:27 +05:30
<TableContainer pb={8} overflowX={"scroll"} className="h-auto w-100 table-scroll">
2024-06-20 12:09:48 +05:30
{data?.length === 0 ? (
<EmptySearchList message={emptyMessage} />
) : (
2024-07-08 12:22:27 +05:30
<DragDropContext onDragEnd={handleDragEnd}>
<Droppable droppableId="table">
{(provided) => (
<Table size="sm" {...provided.droppableProps} ref={provided.innerRef}>
<TableCaption p={0}>{caption}</TableCaption>
<Thead backgroundColor="gray.50">
<Tr>
{tableHeadRow.map((heading, index) => (
<Th
textAlign={tableHeadRow.length - 1 === index || centered ? "center" : "left"}
key={index}
p={3}
width="100px" // Adjust width as needed
color={"#004118"}
whiteSpace="normal" // Allow text to wrap
wordBreak="normal" // Ensure long words break properly
overflowWrap="normal" // Break long words if necessary
>
{heading}
</Th>
))}
</Tr>
</Thead>
<Tbody className="web-text-small">
{data?.map((item, index) => (
2024-07-22 14:50:31 +05:30
item.id && isDraggable ? (
2024-07-08 12:22:27 +05:30
<Draggable key={item.id.toString()} draggableId={item.id.toString()} index={index}>
{(provided, snapshot) => (
<Tr
ref={provided.innerRef}
{...provided.draggableProps}
{...provided.dragHandleProps}
transition={"0s all"}
_hover={{
bg: "blue.50",
cursor: "grab",
}}
bg={snapshot.isDragging ? "blue.100" : "white"}
boxShadow={snapshot.isDragging ? "0 0 1em rgba(0, 0, 0, 0.2)" : "none"}
>
{tableHeadRow.map((heading, i) => (
<Td
textAlign={tableHeadRow.length - 1 === i || centered ? "center" : "left"}
color={"gray.600"}
key={i}
style={{
whiteSpace: "nowrap",
textOverflow: "ellipsis",
}}
className="web-text-small"
>
<Skeleton fadeDuration={index / 12} isLoaded={!isLoading}>
{item[heading]}
</Skeleton>
</Td>
))}
</Tr>
)}
</Draggable>
) : (
<Tr key={index}>
{tableHeadRow.map((heading, i) => (
<Td
textAlign={tableHeadRow.length - 1 === i || centered ? "center" : "left"}
color={"gray.600"}
key={i}
style={{
whiteSpace: "nowrap",
textOverflow: "ellipsis",
}}
className="web-text-small"
2024-07-25 12:26:18 +05:30
w={400}
2024-07-08 12:22:27 +05:30
>
2024-07-10 12:02:35 +05:30
<Skeleton display={'flex'} alignItems={'center'} justifyContent={tableHeadRow.length - 1 === i || centered ? "center" : "start"} h={5} fadeDuration={index / 12} isLoaded={!isLoading}>
2024-07-08 12:22:27 +05:30
{item[heading]}
</Skeleton>
</Td>
))}
</Tr>
)
))}
{provided.placeholder}
</Tbody>
</Table>
)}
</Droppable>
</DragDropContext>
2024-06-20 12:09:48 +05:30
)}
</TableContainer>
);
};
export default DataTable;