chore: update Table component

This commit is contained in:
ValdiANS
2025-09-30 15:33:57 +07:00
parent 02c44ced92
commit 33f5ca2a57
+68 -13
View File
@@ -1,6 +1,6 @@
'use client'; 'use client';
import { useState } from 'react'; import { ReactNode, useState } from 'react';
import { import {
flexRender, flexRender,
getCoreRowModel, getCoreRowModel,
@@ -30,15 +30,18 @@ interface TableClassNames {
paginationClassName?: string; paginationClassName?: string;
} }
// Type for the Table component props export interface TableProps<TData extends object> {
interface TableProps<TData extends object> {
data: TData[]; data: TData[];
columns: ColumnDef<TData, any>[]; columns: ColumnDef<TData, any>[];
pageSize?: number; pageSize?: number;
totalItems?: number;
page?: number;
onPageChange?: (page: number) => void;
isLoading?: boolean; isLoading?: boolean;
fuzzySearchValue?: string | null; fuzzySearchValue?: string | null;
onFuzzySearchValueChange?: (value: string) => void; onFuzzySearchValueChange?: (value: string) => void;
className?: TableClassNames; className?: TableClassNames;
emptyContent?: ReactNode;
} }
const DUMMY_SKELETON_DATA = [{}, {}, {}, {}, {}]; const DUMMY_SKELETON_DATA = [{}, {}, {}, {}, {}];
@@ -54,13 +57,24 @@ const fuzzyFilter = (
return itemRank.passed; return itemRank.passed;
}; };
const emptyContentDefaultValue = (
<div className='w-full p-5 text-center'>
<span className='text-lg opacity-50'>
Tidak ada data yang dapat ditampilkan...
</span>
</div>
);
const Table = <TData extends object>({ const Table = <TData extends object>({
data = [], data = [],
columns = [], columns = [],
pageSize = 10, pageSize = 10,
totalItems,
page,
onPageChange,
isLoading = false, isLoading = false,
fuzzySearchValue = null, fuzzySearchValue,
onFuzzySearchValueChange = () => {}, onFuzzySearchValueChange,
className = { className = {
containerClassName: '', containerClassName: '',
tableWrapperClassName: '', tableWrapperClassName: '',
@@ -73,7 +87,13 @@ const Table = <TData extends object>({
bodyColumnClassName: '', bodyColumnClassName: '',
paginationClassName: '', paginationClassName: '',
}, },
emptyContent = emptyContentDefaultValue,
}: TableProps<TData>) => { }: TableProps<TData>) => {
const isServerSideTable =
totalItems !== undefined &&
page !== undefined &&
onPageChange !== undefined;
const [pagination, setPagination] = useState({ const [pagination, setPagination] = useState({
pageIndex: 0, pageIndex: 0,
pageSize: pageSize, pageSize: pageSize,
@@ -103,6 +123,32 @@ const Table = <TData extends object>({
const table = useReactTable(tableOptions); const table = useReactTable(tableOptions);
const prevPageClickHandler = () => {
table.previousPage();
if (isServerSideTable) {
onPageChange(page - 1);
}
};
const nextPageClickHandler = () => {
table.nextPage();
if (isServerSideTable) {
onPageChange(page + 1);
}
};
const pageChangeHandler = (pageNumber: number) => {
const currentPage = pageNumber - 1;
table.setPageIndex(pageNumber ? currentPage : 0);
if (isServerSideTable) {
onPageChange(pageNumber);
}
};
return ( return (
<div className={className.containerClassName}> <div className={className.containerClassName}>
<div className={className.tableWrapperClassName}> <div className={className.tableWrapperClassName}>
@@ -178,17 +224,26 @@ const Table = <TData extends object>({
</table> </table>
</div> </div>
{data.length > 0 && !isLoading && ( {(data.length === 0 || table.getRowModel().rows.length === 0) &&
emptyContent}
{data.length > 0 && table.getRowModel().rows.length > 0 && !isLoading && (
<div className={cn('mt-5', className.paginationClassName)}> <div className={cn('mt-5', className.paginationClassName)}>
<Pagination <Pagination
totalItems={table.getRowCount()} totalItems={isServerSideTable ? totalItems : table.getRowCount()}
itemsPerPage={table.getState().pagination.pageSize} itemsPerPage={
currentPage={table.getState().pagination.pageIndex + 1} isServerSideTable
onPrevPage={() => table.previousPage()} ? undefined
onNextPage={() => table.nextPage()} : table.getState().pagination.pageSize
onPageChange={(pageNumber) =>
table.setPageIndex(pageNumber ? pageNumber - 1 : 0)
} }
currentPage={
isServerSideTable
? page
: table.getState().pagination.pageIndex + 1
}
onPrevPage={prevPageClickHandler}
onNextPage={nextPageClickHandler}
onPageChange={pageChangeHandler}
/> />
</div> </div>
)} )}