Skip to content

Commit c9d767a

Browse files
committed
feat: 🎸 add <ListTable> component
1 parent 61dbe24 commit c9d767a

File tree

2 files changed

+141
-0
lines changed

2 files changed

+141
-0
lines changed

‎src/ListTable/__story__/story.tsx

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import {createElement as h} from 'react';
2+
import {storiesOf} from '@storybook/react';
3+
import {ListTable} from '..';
4+
import ShowDocs from '../../ShowDocs'
5+
6+
storiesOf('UI/ListTable', module)
7+
// .add('Documentation', () => h(ShowDocs, {md: require('../../../docs/en/ListTable.md')}))
8+
.add('Default', () =>
9+
<ListTable>
10+
<div>1</div>
11+
<div>2</div>
12+
<div>3</div>
13+
<div>4</div>
14+
</ListTable>
15+
)
16+
.add('Empty list', () =>
17+
<ListTable>
18+
</ListTable>
19+
)
20+
.add('Full two rows', () =>
21+
<ListTable>
22+
<div>1</div>
23+
<div>2</div>
24+
<div>3</div>
25+
<div>4</div>
26+
<div>5</div>
27+
<div>6</div>
28+
</ListTable>
29+
)
30+
.add('1 column', () =>
31+
<ListTable cols={1}>
32+
<div>1</div>
33+
<div>2</div>
34+
<div>3</div>
35+
<div>4</div>
36+
<div>5</div>
37+
<div>6</div>
38+
</ListTable>
39+
)
40+
.add('2 columns', () =>
41+
<ListTable cols={2}>
42+
<div>1</div>
43+
<div>2</div>
44+
<div>3</div>
45+
<div>4</div>
46+
<div>5</div>
47+
<div>6</div>
48+
</ListTable>
49+
)
50+
.add('3 columns', () =>
51+
<ListTable cols={3}>
52+
<div>1</div>
53+
<div>2</div>
54+
<div>3</div>
55+
<div>4</div>
56+
<div>5</div>
57+
<div>6</div>
58+
</ListTable>
59+
)
60+
.add('5 columns', () =>
61+
<ListTable cols={5}>
62+
<div>1</div>
63+
<div>2</div>
64+
<div>3</div>
65+
<div>4</div>
66+
<div>5</div>
67+
<div>6</div>
68+
</ListTable>
69+
)
70+
.add('6 columns', () =>
71+
<ListTable cols={6}>
72+
<div>1</div>
73+
<div>2</div>
74+
<div>3</div>
75+
<div>4</div>
76+
<div>5</div>
77+
<div>6</div>
78+
</ListTable>
79+
)
80+
.add('7 columns', () =>
81+
<ListTable cols={7}>
82+
<div>1</div>
83+
<div>2</div>
84+
<div>3</div>
85+
<div>4</div>
86+
<div>5</div>
87+
<div>6</div>
88+
</ListTable>
89+
)
90+
.add('User renderRow', () =>
91+
<ListTable cols={3} renderRow={(cells) => {
92+
return (
93+
<tr style={{outline: '1px solid tomato'}}>
94+
{cells}
95+
</tr>
96+
);
97+
}}>
98+
<div>1</div>
99+
<div>2</div>
100+
<div>3</div>
101+
<div>4</div>
102+
<div>5</div>
103+
<div>6</div>
104+
</ListTable>
105+
)

‎src/ListTable/index.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import * as React from 'react';
2+
3+
const h = React.createElement;
4+
5+
const defaultRenderRow = cells => h('tr', null, cells);
6+
7+
export interface Props {
8+
cols?: number;
9+
renderRow?: (cells: React.ReactElement<any>[]) => React.ReactElement<any>;
10+
}
11+
12+
export const ListTable: React.SFC<Props> = ({cols, renderRow, children}) => {
13+
const list = React.Children.toArray(children);
14+
const rows: React.ReactElement<any>[] = [];
15+
const length = list.length;
16+
const rowLength = Math.ceil(length / cols);
17+
18+
let i = 0;
19+
for (let m = 0; m < rowLength; m++) {
20+
const cells: React.ReactElement<any>[] = [];
21+
for (let n = 0; n < cols; n++) {
22+
cells.push(h('td', null, i < length ? list[i] : null));
23+
i++;
24+
}
25+
rows.push(renderRow(cells));
26+
}
27+
28+
return h('table', null, h('tbody', null,
29+
rows,
30+
));
31+
};
32+
33+
ListTable.defaultProps = {
34+
cols: 3,
35+
renderRow: defaultRenderRow,
36+
};

0 commit comments

Comments
 (0)