UNPKG

2.18 kBJavaScriptView Raw
1import React from 'react';
2import PropTypes from 'prop-types';
3import classNames from 'classnames';
4import { mapToCssModules, tagPropType } from './utils';
5
6const propTypes = {
7 /** Adds border to all sides of table */
8 bordered: PropTypes.bool,
9 /** Removes all borders */
10 borderless: PropTypes.bool,
11 /** Adds custom class name to component */
12 className: PropTypes.string,
13 /** */
14 cssModule: PropTypes.object,
15 /** Makes the table dark */
16 dark: PropTypes.bool,
17 /** Enables a hover state on the rows within `<tbody>` */
18 hover: PropTypes.bool,
19 innerRef: PropTypes.oneOfType([
20 PropTypes.func,
21 PropTypes.string,
22 PropTypes.object,
23 ]),
24 /** Responsive tables allow tables to be scrolled horizontally with ease */
25 responsive: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]),
26 responsiveTag: tagPropType,
27 /** Make tables more compact by cutting cell padding in half when setting size as sm. */
28 size: PropTypes.string,
29 /** Adds zebra-striping to any table row within the `<tbody>` */
30 striped: PropTypes.bool,
31 /** Add custom tag to the component */
32 tag: tagPropType,
33};
34
35function Table(props) {
36 const {
37 className,
38 cssModule,
39 size,
40 bordered,
41 borderless,
42 striped,
43 dark,
44 hover,
45 responsive,
46 tag: Tag = 'table',
47 responsiveTag: ResponsiveTag = 'div',
48 innerRef,
49 ...attributes
50 } = props;
51
52 const classes = mapToCssModules(
53 classNames(
54 className,
55 'table',
56 size ? 'table-' + size : false,
57 bordered ? 'table-bordered' : false,
58 borderless ? 'table-borderless' : false,
59 striped ? 'table-striped' : false,
60 dark ? 'table-dark' : false,
61 hover ? 'table-hover' : false,
62 ),
63 cssModule,
64 );
65
66 const table = <Tag {...attributes} ref={innerRef} className={classes} />;
67
68 if (responsive) {
69 const responsiveClassName = mapToCssModules(
70 responsive === true
71 ? 'table-responsive'
72 : `table-responsive-${responsive}`,
73 cssModule,
74 );
75
76 return (
77 <ResponsiveTag className={responsiveClassName}>{table}</ResponsiveTag>
78 );
79 }
80
81 return table;
82}
83
84Table.propTypes = propTypes;
85
86export default Table;
87
\No newline at end of file