import React, { createRef, lazy, useEffect, useMemo, useRef, useState } from 'react'; import RcTable from 'rc-table'; import type { DefaultRecordType } from 'rc-table/lib/interface'; import { TableProps as TablerProps } from 'rc-table/lib/Table'; import { PaginationProps } from 'rc-pagination'; import { Button } from '../Button'; export type TableProps = TablerProps & { responsive?: boolean | 'sm' | 'md' | 'lg' | 'xl', nowrap?: boolean vcenter?: boolean, dataSource: any[] paginator?: PaginationProps; paginatorPosition?: 'bottomLeft' | 'bottomRight' | 'bottomCenter'; } const Pagination = lazy(() => import('rc-pagination')); const Table = ({ className, responsive = false, vcenter, nowrap, children, dataSource, paginator, paginatorPosition = 'bottomLeft', ...props }: TableProps) => { const ref = createRef(); const [page, setPage] = useState(0); useEffect(() => { const r = responsive && typeof responsive === 'boolean' ? 'table-responsive' : `table-responsive-${responsive}`; if (ref.current) { const tables = ref.current.querySelector('table'); if (tables) { tables.className = [ 'table', r, nowrap && 'table-nowrap', vcenter && 'table-vcenter', ].filter(Boolean).join(' '); } } }, [responsive, nowrap, vcenter]); const dataToDisplay = useMemo(() => { if (paginator) { const { pageSize = 10 } = paginator; return dataSource.slice(page * pageSize, (page + 1) * pageSize); } return dataSource; }, [dataSource, paginator, page]); const paginatorStyles = useMemo(() => { switch(paginatorPosition){ case 'bottomCenter': return { width: 'fit-content', marginInline: 'auto' }; case 'bottomLeft': return { width: 'fit-content', marginLeft: '0', marginRight: 'auto' }; case 'bottomRight': return { width: 'fit-content', marginLeft: 'auto', marginRight: '0' }; } }, [paginatorPosition]); return (
{children} {paginator &&
{ switch (type) { case 'page': return ; case 'next': return case 'prev': return case 'jump-next': case 'jump-prev': return } }} current={page + 1} onChange={(page, pageSize) => { const { onChange } = paginator; onChange && onChange(page, pageSize); setPage(page - 1); }} />
}
) } Table.Column = RcTable.Column; Table.ColumnGroup = RcTable.ColumnGroup; export default Table;