mirror of
https://gitlab.com/mbugroup/lti-web-client.git
synced 2026-05-24 15:25:46 +00:00
chore: update Table component
This commit is contained in:
+68
-13
@@ -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>
|
||||||
)}
|
)}
|
||||||
|
|||||||
Reference in New Issue
Block a user