Files
SSA-Admin-Panel/src/components/DataTable.tsx

153 lines
4.7 KiB
TypeScript
Raw Normal View History

import { useState } from "react";
2025-02-04 13:56:43 +05:30
import { HStack, Stack, Table } from "@chakra-ui/react";
import { PaginationItems, PaginationNextTrigger, PaginationPrevTrigger, PaginationRoot } from "./ui/pagination";
// import {
// PaginationItems,
// PaginationNextTrigger,
// PaginationPrevTrigger,
// PaginationRoot,
// } from "./ui/pagination";
interface TableProps {
tableHeadRow: string[];
data: Record<string, any>[];
sortableColumns?: string[]; // Specify which columns are sortable
paginationData?: {
current_page: number;
last_page: number;
per_page: number;
total: number;
},
onPageChange?: (page: number) => void;
2025-02-04 13:56:43 +05:30
}
const DataTable: React.FC<TableProps> = ({
tableHeadRow,
data,
sortableColumns = [],
paginationData,
onPageChange
}: TableProps) => {
const { current_page = 1, last_page = 1 } = paginationData || {};
2025-02-04 13:56:43 +05:30
const [sortConfig, setSortConfig] = useState<{
key: string;
direction: "asc" | "desc";
} | null>(null);
const handlePageChange = (details: { page: number }) => {
const newPage = details.page;
if (newPage >= 1 && newPage <= last_page) {
onPageChange?.(newPage);
}
};
2025-02-04 13:56:43 +05:30
const handleSort = (column: string) => {
if (!sortableColumns.includes(column)) return;
let direction: "asc" | "desc" = "asc";
if (
sortConfig &&
sortConfig.key === column &&
sortConfig.direction === "asc"
) {
direction = "desc";
}
const newSortConfig = { key: column, direction };
setSortConfig(newSortConfig);
onPageChange?.(1);
2025-02-04 13:56:43 +05:30
};
return (
<Stack mt={0} color={"#000000CC"}>
<Table.ScrollArea mb={3}>
<Table.Root size="sm" variant={"line"} stickyHeader>
<Table.Header>
<Table.Row bg={"#02A0A0"}>
{tableHeadRow.map((item, index) => (
<Table.ColumnHeader
color="white"
fontSize={"xs"}
fontWeight={600}
px={4}
p={3}
textAlign={
index === tableHeadRow.length - 1 ? "center" : "left"
}
key={index}
border={"none"}
onClick={() => handleSort(item)}
cursor={
sortableColumns.includes(item) ? "pointer" : "default"
}
_hover={
sortableColumns.includes(item)
? { textDecoration: "underline" }
: {}
}
>
{item}
{sortableColumns.includes(item) &&
sortConfig?.key === item && (
<span style={{ marginLeft: "4px" }}>
{sortConfig.direction === "asc" ? "\u25B2" : "\u25BC"}
</span>
)}
</Table.ColumnHeader>
))}
</Table.Row>
</Table.Header>
<Table.Body>
{data.map((item: any, index) => (
2025-02-04 13:56:43 +05:30
<Table.Row
key={index}
bg={index % 2 === 0 ? "#fff" : "#007F3310"}
>
{tableHeadRow.map((heading, colIndex) => (
<Table.Cell
2025-02-10 12:01:04 +05:30
// className="oxygen"
2025-02-04 13:56:43 +05:30
px={4}
p={2}
key={`${index}-${colIndex}`}
fontSize={"xs"}
fontWeight={500}
border={"none"}
>
{/* {item[heading]} */}
{(() => {
const words = item[heading]?.toString().split(" ") || [];
return words.length > 5
? `${words.slice(0, 5).join(" ")}...`
: item[heading];
})()}
2025-02-04 13:56:43 +05:30
</Table.Cell>
))}
</Table.Row>
))}
</Table.Body>
</Table.Root>
</Table.ScrollArea>
{last_page > 1 && (<PaginationRoot
count={paginationData?.total ?? 0}
pageSize={paginationData?.per_page ?? 0}
page={current_page}
onPageChange={handlePageChange}
2025-02-04 13:56:43 +05:30
size={"xs"}
siblingCount={1}
// count={20}
// pageSize={2}
// defaultPage={1}
2025-02-04 13:56:43 +05:30
mb={4}
>
<HStack justifyContent="flex-end">
<PaginationPrevTrigger onClick={() => handlePageChange({ page: current_page - 1 })} disabled={current_page === 1} />
2025-02-04 13:56:43 +05:30
<PaginationItems />
<PaginationNextTrigger onClick={() => handlePageChange({ page: current_page + 1 })} disabled={current_page === last_page} />
2025-02-04 13:56:43 +05:30
</HStack>
</PaginationRoot>)}
2025-02-04 13:56:43 +05:30
</Stack>
);
};
export default DataTable;