apps/newsletters-ui/src/app/components/Table.tsx (64 lines of code) (raw):
import { Grid } from '@mui/material';
import type { Cell, Column } from 'react-table';
import { useGlobalFilter, useSortBy, useTable } from 'react-table';
import { ContentWrapper } from '../ContentWrapper';
import { tableStyle } from '../styles';
import { ColumnData } from './ColumnData';
import { ColumnHeader } from './ColumnHeader';
import { ColumnVisibility } from './ColumnVisibility';
import { GlobalFilter } from './GlobalFilter';
interface TableProps {
data: object[];
columns: Column[];
defaultSortId?: string;
}
export const Table = ({ data, columns, defaultSortId }: TableProps) => {
const initialState = defaultSortId
? { sortBy: [{ id: defaultSortId, desc: false }] }
: {};
const {
getTableProps,
getTableBodyProps,
headerGroups,
rows,
prepareRow,
allColumns,
setGlobalFilter,
} = useTable({ columns, data, initialState }, useGlobalFilter, useSortBy);
return (
<ContentWrapper>
<div>Hide/Show Columns</div>
<Grid container spacing={2} rowSpacing={2} paddingY={2}>
<Grid item xs={12} display={'flex'}>
{allColumns.map((column) => (
<ColumnVisibility column={column} key={`visibility ${column.id}`} />
))}
</Grid>
<Grid item xs={12} display={'flex'}>
<GlobalFilter setGlobalFilter={setGlobalFilter} />
</Grid>
</Grid>
<table {...getTableProps()} css={tableStyle}>
<thead>
{headerGroups.map((headerGroup) => (
<tr {...headerGroup.getHeaderGroupProps()}>
{headerGroup.headers.map((column) => (
<ColumnHeader column={column} key={`header ${column.id}`} />
))}
</tr>
))}
</thead>
<tbody {...getTableBodyProps()}>
{rows.map((row) => {
prepareRow(row);
return (
<tr {...row.getRowProps()}>
{row.cells.map((cell: Cell, index) => (
<ColumnData cell={cell} key={`data ${cell.column.id}`} />
))}
</tr>
);
})}
</tbody>
</table>
</ContentWrapper>
);
};