|
1 | 1 | import React from "react";
|
2 | 2 | import styled from "styled-components";
|
3 |
| -import PropTypes from "prop-types"; |
4 |
| -import { space } from "styled-system"; |
5 |
| -import propTypes from "@styled-system/prop-types"; |
| 3 | +import { addStyledProps } from "../StyledProps"; |
6 | 4 | import TableHead from "./TableHead";
|
7 | 5 | import TableBody from "./TableBody";
|
8 | 6 | import TableFoot from "./TableFoot";
|
9 |
| -import { rowsPropType, RowType, Columns } from "./Table.types"; |
| 7 | +import { ColumnType } from "./Table.types"; |
10 | 8 |
|
11 |
| -export type BaseTableProps = { |
12 |
| - columns: Columns; |
13 |
| - rows: RowType[]; |
| 9 | +export type BaseTableProps<Row extends unknown> = { |
| 10 | + columns: ColumnType<Row>[]; |
| 11 | + rows: Row[]; |
14 | 12 | noRowsContent?: string;
|
15 | 13 | keyField?: string;
|
16 | 14 | id?: string;
|
17 | 15 | loading?: boolean;
|
18 |
| - footerRows?: any; |
| 16 | + footerRows?: Row[]; |
19 | 17 | rowHovers?: boolean;
|
20 | 18 | compact?: boolean;
|
21 | 19 | className?: string;
|
22 | 20 | stickyHeader?: boolean;
|
23 |
| - onRowMouseEnter?: (...args: any[]) => any; |
24 |
| - onRowMouseLeave?: (...args: any[]) => any; |
25 |
| - onMouseEnter?: any; |
26 |
| - onMouseLeave?: any; |
| 21 | + onRowMouseEnter?: React.DOMAttributes<HTMLTableRowElement>["onMouseEnter"]; |
| 22 | + onRowMouseLeave?: React.DOMAttributes<HTMLTableRowElement>["onMouseLeave"]; |
| 23 | + onMouseEnter?: React.DOMAttributes<HTMLTableElement>["onMouseEnter"]; |
| 24 | + onMouseLeave?: React.DOMAttributes<HTMLTableElement>["onMouseLeave"]; |
27 | 25 | };
|
28 | 26 |
|
29 |
| -const StyledTable = styled.table<any>(space, { |
30 |
| - borderCollapse: "collapse", |
31 |
| - width: "100%", |
32 |
| - background: "white", |
33 |
| - position: "relative", |
34 |
| -}); |
| 27 | +const StyledTable = styled.table( |
| 28 | + { |
| 29 | + borderCollapse: "collapse", |
| 30 | + width: "100%", |
| 31 | + background: "white", |
| 32 | + position: "relative", |
| 33 | + }, |
| 34 | + addStyledProps |
| 35 | +); |
35 | 36 |
|
36 |
| -const BaseTable: React.FC<BaseTableProps> = ({ |
| 37 | +export default function BaseTable<Row>({ |
37 | 38 | columns,
|
38 | 39 | rows,
|
39 | 40 | noRowsContent = "No records have been created for this table.",
|
40 |
| - keyField = "id", |
| 41 | + keyField, |
41 | 42 | id,
|
42 | 43 | loading,
|
43 |
| - footerRows = [], |
44 |
| - rowHovers = true, |
| 44 | + footerRows, |
| 45 | + rowHovers, |
45 | 46 | compact,
|
46 | 47 | className,
|
47 | 48 | stickyHeader,
|
48 |
| - onRowMouseEnter = () => {}, |
49 |
| - onRowMouseLeave = () => {}, |
| 49 | + onRowMouseEnter, |
| 50 | + onRowMouseLeave, |
50 | 51 | ...props
|
51 |
| -}) => ( |
52 |
| - <StyledTable id={id} className={className} {...props}> |
53 |
| - <TableHead columns={columns} compact={compact} sticky={stickyHeader} /> |
54 |
| - <TableBody |
55 |
| - columns={columns} |
56 |
| - rows={rows} |
57 |
| - keyField={keyField} |
58 |
| - noRowsContent={noRowsContent} |
59 |
| - loading={loading} |
60 |
| - rowHovers={rowHovers} |
61 |
| - compact={compact} |
62 |
| - onRowMouseLeave={onRowMouseLeave} |
63 |
| - onRowMouseEnter={onRowMouseEnter} |
64 |
| - /> |
65 |
| - {footerRows && ( |
66 |
| - <TableFoot columns={columns} rows={footerRows} keyField={keyField} loading={loading} compact={compact} /> |
67 |
| - )} |
68 |
| - </StyledTable> |
69 |
| -); |
| 52 | +}: BaseTableProps<Row>) { |
| 53 | + return ( |
| 54 | + <StyledTable id={id} className={className} {...props}> |
| 55 | + <TableHead columns={columns} compact={compact} sticky={stickyHeader} /> |
| 56 | + <TableBody |
| 57 | + columns={columns} |
| 58 | + rows={rows} |
| 59 | + keyField={keyField} |
| 60 | + noRowsContent={noRowsContent} |
| 61 | + loading={loading} |
| 62 | + rowHovers={rowHovers} |
| 63 | + compact={compact} |
| 64 | + onRowMouseLeave={onRowMouseLeave} |
| 65 | + onRowMouseEnter={onRowMouseEnter} |
| 66 | + /> |
| 67 | + {footerRows && ( |
| 68 | + <TableFoot columns={columns} rows={footerRows} keyField={keyField} loading={loading} compact={compact} /> |
| 69 | + )} |
| 70 | + </StyledTable> |
| 71 | + ); |
| 72 | +} |
70 | 73 |
|
71 |
| -BaseTable.propTypes = { |
72 |
| - ...propTypes.space, |
73 |
| - columns: PropTypes.any, |
74 |
| - rows: PropTypes.any, |
75 |
| - noRowsContent: PropTypes.string, |
76 |
| - keyField: PropTypes.string, |
77 |
| - id: PropTypes.string, |
78 |
| - loading: PropTypes.bool, |
79 |
| - footerRows: rowsPropType, |
80 |
| - rowHovers: PropTypes.bool, |
81 |
| - compact: PropTypes.bool, |
82 |
| - className: PropTypes.string, |
83 |
| - stickyHeader: PropTypes.bool, |
84 |
| - onRowMouseEnter: PropTypes.func, |
85 |
| - onRowMouseLeave: PropTypes.func, |
86 |
| -}; |
| 74 | +const noop = () => {}; |
87 | 75 |
|
88 | 76 | BaseTable.defaultProps = {
|
89 | 77 | noRowsContent: "No records have been created for this table.",
|
90 | 78 | keyField: "id",
|
91 |
| - id: undefined, |
92 | 79 | loading: false,
|
93 | 80 | footerRows: [],
|
94 | 81 | rowHovers: true,
|
95 | 82 | compact: false,
|
96 |
| - className: undefined, |
97 | 83 | stickyHeader: false,
|
98 |
| - onRowMouseEnter: () => {}, |
99 |
| - onRowMouseLeave: () => {}, |
| 84 | + onRowMouseEnter: noop, |
| 85 | + onRowMouseLeave: noop, |
100 | 86 | };
|
101 |
| - |
102 |
| -export default BaseTable; |
0 commit comments