-
Notifications
You must be signed in to change notification settings - Fork 36
Expand file tree
/
Copy pathTable.tsx
More file actions
81 lines (71 loc) · 1.81 KB
/
Table.tsx
File metadata and controls
81 lines (71 loc) · 1.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
'use client';
import classNames from 'classnames';
import {
type ComponentPropsWithoutRef,
type ReactNode,
forwardRef,
useMemo,
useState,
} from 'react';
import { type Card as _Card } from '#components/navigation/card/index.js';
import { type ITableContext, TableContext } from './TableContext.js';
import {
TableBody,
TableCaption,
type TableCaptionProps,
TableCell,
TableContainer,
TableHead,
TableRow,
} from './components/index.js';
export interface TableProps extends ComponentPropsWithoutRef<'table'> {
firstCellIsHeader?: boolean;
responsive?: boolean;
caption?: ReactNode;
captionProps?: TableCaptionProps;
}
const TableComponent = forwardRef<HTMLTableElement, TableProps>((props, forwardedRef) => {
const {
caption,
captionProps,
children,
className,
firstCellIsHeader = false,
responsive = false,
...rest
} = props;
const [headings, setHeadings] = useState<ReactNode[]>([]);
const contextValue: ITableContext = useMemo(() => {
return {
firstCellIsHeader,
headings,
responsive,
setHeadings,
};
}, [firstCellIsHeader, headings, responsive, setHeadings]);
return (
<TableContext.Provider value={contextValue}>
<table
className={classNames(
{ 'nhsuk-table': !responsive },
{ 'nhsuk-table-responsive': responsive },
className,
)}
role={responsive ? 'table' : undefined}
ref={forwardedRef}
{...rest}
>
{caption && <TableCaption {...captionProps}>{caption}</TableCaption>}
{children}
</table>
</TableContext.Provider>
);
});
TableComponent.displayName = 'Table';
export const Table = Object.assign(TableComponent, {
Container: TableContainer,
Head: TableHead,
Body: TableBody,
Row: TableRow,
Cell: TableCell,
});