Skip to content

Commit 941fd0a

Browse files
authored
feat: Column add hidden (#1065)
* feat: Column add hidden * test: add test * docs: add demo * docs: add hidden * docs: update demo
1 parent b72776c commit 941fd0a

File tree

9 files changed

+238
-4
lines changed

9 files changed

+238
-4
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ React.render(<Table columns={columns} data={data} />, mountNode);
109109
| onRow | Function(record, index) | | Set custom props per each row. |
110110
| onHeaderRow | Function(record, index) | | Set custom props per each header row. |
111111
| showHeader | Boolean | true | whether table head is shown |
112+
| hidden | Boolean | `false` | Hidden column. |
112113
| title | Function(currentData) | | table title render function |
113114
| footer | Function(currentData) | | table footer render function |
114115
| emptyText | React.Node or Function | `No Data` | Display text when data is empty |

docs/demo/column-hidden.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
title: column-hidden
3+
nav:
4+
title: Demo
5+
path: /demo
6+
---
7+
8+
<code src="../examples/column-hidden.tsx"></code>

docs/demo/grouping-columns-hidden.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
title: grouping-columns-hidden
3+
nav:
4+
title: Demo
5+
path: /demo
6+
---
7+
8+
<code src="../examples/grouping-columns-hidden.tsx"></code>

docs/examples/column-hidden.tsx

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import type { TableProps } from 'rc-table';
2+
import Table from 'rc-table';
3+
import React from 'react';
4+
import '../../assets/index.less';
5+
6+
interface RecordType {
7+
a?: string;
8+
b?: string;
9+
c?: string;
10+
}
11+
12+
const data = [
13+
{ a: '123', key: '1' },
14+
{ a: 'cdd', b: '2', key: '2' },
15+
{ a: '1333', c: 'eee', d: 2, key: '3' },
16+
];
17+
18+
const Demo = () => {
19+
const columns: TableProps<any>['columns'] = [
20+
{
21+
title: 'title1',
22+
dataIndex: 'a',
23+
},
24+
{
25+
title: 'title12',
26+
dataIndex: 'b',
27+
hidden: true,
28+
},
29+
{
30+
title: 'title13',
31+
dataIndex: 'c',
32+
},
33+
];
34+
35+
return <Table<RecordType> columns={columns} data={data} />;
36+
};
37+
38+
export default Demo;
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
import React from 'react';
2+
import Table from 'rc-table';
3+
import '../../assets/index.less';
4+
5+
const columns = [
6+
{
7+
title: '姓名',
8+
dataIndex: 'name',
9+
key: 'name',
10+
},
11+
{
12+
title: '其它',
13+
children: [
14+
{
15+
title: '年龄',
16+
dataIndex: 'age',
17+
key: 'age',
18+
},
19+
{
20+
title: '住址',
21+
children: [
22+
{
23+
title: '街道',
24+
dataIndex: 'street',
25+
key: 'street',
26+
hidden: true,
27+
},
28+
{
29+
title: '小区',
30+
children: [
31+
{
32+
title: '单元',
33+
dataIndex: 'building',
34+
key: 'building',
35+
},
36+
{
37+
title: '门牌',
38+
dataIndex: 'number',
39+
key: 'number',
40+
hidden: true,
41+
},
42+
],
43+
},
44+
],
45+
},
46+
],
47+
},
48+
{
49+
title: '公司',
50+
children: [
51+
{
52+
title: '地址',
53+
dataIndex: 'companyAddress',
54+
key: 'companyAddress',
55+
hidden: true,
56+
},
57+
{
58+
title: '名称',
59+
dataIndex: 'companyName',
60+
key: 'companyName',
61+
},
62+
],
63+
},
64+
{
65+
title: '性别',
66+
dataIndex: 'gender',
67+
key: 'gender',
68+
},
69+
];
70+
71+
const data = [
72+
{
73+
key: '1',
74+
name: '胡彦斌',
75+
age: 32,
76+
street: '拱墅区和睦街道',
77+
building: 1,
78+
number: 2033,
79+
companyAddress: '西湖区湖底公园',
80+
companyName: '湖底有限公司',
81+
gender: '男',
82+
},
83+
{
84+
key: '2',
85+
name: '胡彦祖',
86+
age: 42,
87+
street: '拱墅区和睦街道',
88+
building: 3,
89+
number: 2035,
90+
companyAddress: '西湖区湖底公园',
91+
companyName: '湖底有限公司',
92+
gender: '男',
93+
},
94+
];
95+
96+
const Demo = () => (
97+
<div>
98+
<h2>grouping columns hidden</h2>
99+
<Table columns={columns} data={data} className="bordered" />
100+
</div>
101+
);
102+
103+
export default Demo;

src/hooks/useColumns/index.tsx

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,25 @@ export function convertChildrenToColumns<RecordType>(
3636
});
3737
}
3838

39+
function filterHiddenColumns<RecordType>(
40+
columns: ColumnsType<RecordType>,
41+
): ColumnsType<RecordType> {
42+
return columns
43+
.filter(column => column && typeof column === 'object' && !column.hidden)
44+
.map(column => {
45+
const subColumns = (column as ColumnGroupType<RecordType>).children;
46+
47+
if (subColumns && subColumns.length > 0) {
48+
return {
49+
...column,
50+
children: filterHiddenColumns(subColumns),
51+
};
52+
}
53+
54+
return column;
55+
});
56+
}
57+
3958
function flatColumns<RecordType>(
4059
columns: ColumnsType<RecordType>,
4160
parentKey = 'key',
@@ -158,10 +177,11 @@ function useColumns<RecordType>(
158177
flattenColumns: readonly ColumnType<RecordType>[],
159178
realScrollWidth: undefined | number,
160179
] {
161-
const baseColumns = React.useMemo<ColumnsType<RecordType>>(
162-
() => columns || convertChildrenToColumns(children),
163-
[columns, children],
164-
);
180+
const baseColumns = React.useMemo<ColumnsType<RecordType>>(() => {
181+
const newColumns = columns || convertChildrenToColumns(children) || [];
182+
183+
return filterHiddenColumns(newColumns.slice());
184+
}, [columns, children]);
165185

166186
// ========================== Expand ==========================
167187
const withExpandColumns = React.useMemo<ColumnsType<RecordType>>(() => {

src/interface.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ interface ColumnSharedType<RecordType> {
8080
title?: React.ReactNode;
8181
key?: Key;
8282
className?: string;
83+
hidden?: boolean;
8384
fixed?: FixedType;
8485
onHeaderCell?: GetComponentProps<ColumnsType<RecordType>[number]>;
8586
ellipsis?: CellEllipsisType;

tests/GroupingColumns.spec.jsx

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,4 +154,37 @@ describe('Table with grouping columns', () => {
154154
const titleA = wrapper.find('th.title-a');
155155
expect(titleA.prop('rowSpan')).toBe(3);
156156
});
157+
158+
it('hidden column', () => {
159+
const columns = [
160+
{
161+
title: 'A',
162+
},
163+
{
164+
title: 'B',
165+
hidden: true,
166+
children: [
167+
{
168+
title: 'C',
169+
},
170+
],
171+
},
172+
{
173+
title: 'D',
174+
children: [
175+
{
176+
title: 'E',
177+
hidden: true,
178+
},
179+
{
180+
title: 'F',
181+
},
182+
],
183+
},
184+
];
185+
const wrapper = mount(<Table columns={columns} data={[]} />);
186+
187+
expect(wrapper.find('thead tr').at(0).find('th').at(1).text()).toEqual('D');
188+
expect(wrapper.find('thead tr').at(1).find('th').at(0).text()).toEqual('F');
189+
});
157190
});

tests/Table.spec.jsx

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -756,6 +756,28 @@ describe('Table.Basic', () => {
756756
});
757757
});
758758

759+
it('hidden columns', () => {
760+
const wrapper = mount(
761+
createTable({
762+
columns: [
763+
{
764+
title: '姓名',
765+
dataIndex: 'name',
766+
key: 'name',
767+
},
768+
{
769+
title: '年龄',
770+
dataIndex: 'age',
771+
key: 'age',
772+
hidden: true,
773+
},
774+
],
775+
}),
776+
);
777+
expect(wrapper.find('th').at(0).text()).toEqual('姓名');
778+
expect(wrapper.find('th').at(1)).toHaveLength(0);
779+
});
780+
759781
describe('row events', () => {
760782
let spy;
761783

0 commit comments

Comments
 (0)