Skip to content

Commit 13a631a

Browse files
committed
feat: init
1 parent 17fa387 commit 13a631a

File tree

9 files changed

+117
-4
lines changed

9 files changed

+117
-4
lines changed

docs/demo/expandedSticky.md

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

docs/examples/expandedSticky.tsx

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import React, { useState } from 'react';
2+
import type { ColumnType } from 'rc-table';
3+
import Table from 'rc-table';
4+
import '../../assets/index.less';
5+
6+
// 合并单元格
7+
export const getRowSpan = (source: (string | number | undefined)[] = []) => {
8+
const list: { rowSpan?: number }[] = [];
9+
let span = 0;
10+
source.reverse().forEach((key, index) => {
11+
span = span + 1;
12+
if (key !== source[index + 1]) {
13+
list.push({ rowSpan: span });
14+
span = 0;
15+
} else {
16+
list.push({ rowSpan: 0 });
17+
}
18+
});
19+
return list.reverse();
20+
};
21+
22+
const Demo = () => {
23+
const [expandedRowKeys, setExpandedRowKeys] = useState<readonly React.Key[]>([]);
24+
25+
const data = [
26+
{ key: 'a', a: '小二', d: '文零西路' },
27+
{ key: 'b', a: '张三', d: '文一西路' },
28+
{ key: 'c', a: '张三', d: '文二西路' },
29+
];
30+
const rowKeys = data.map(item => item.key);
31+
32+
const rowSpanList = getRowSpan(data.map(item => item.a));
33+
34+
const columns: ColumnType<Record<string, any>>[] = [
35+
{
36+
title: '手机号',
37+
dataIndex: 'a',
38+
width: 100,
39+
fixed: 'left',
40+
onCell: (_, index) => {
41+
const { rowSpan = 1 } = rowSpanList[index];
42+
const props: React.TdHTMLAttributes<HTMLTableCellElement> = {};
43+
props.rowSpan = rowSpan;
44+
if (rowSpan >= 1) {
45+
let currentRowSpan = rowSpan;
46+
for (let i = index; i < index + rowSpan; i += 1) {
47+
const rowKey = rowKeys[i];
48+
if (expandedRowKeys.includes(rowKey)) {
49+
currentRowSpan += 1;
50+
}
51+
}
52+
props.rowSpan = currentRowSpan;
53+
}
54+
return props;
55+
},
56+
},
57+
Table.EXPAND_COLUMN,
58+
{ title: 'Address', fixed: 'right', dataIndex: 'd', width: 200 },
59+
];
60+
61+
return (
62+
<div style={{ height: 10000 }}>
63+
<h2>expanded & sticky</h2>
64+
<Table<Record<string, any>>
65+
rowKey="key"
66+
sticky
67+
scroll={{ x: 800 }}
68+
columns={columns}
69+
data={data}
70+
expandable={{
71+
expandedRowOffset: 1,
72+
expandedRowKeys,
73+
onExpandedRowsChange: keys => setExpandedRowKeys(keys),
74+
expandedRowRender: record => <p style={{ margin: 0 }}>{record.key}</p>,
75+
}}
76+
className="table"
77+
/>
78+
</div>
79+
);
80+
};
81+
82+
export default Demo;

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,5 +111,6 @@
111111
"**/*.{js,jsx,tsx,ts,md,json}": [
112112
"prettier --write"
113113
]
114-
}
114+
},
115+
"packageManager": "[email protected]+sha1.4ba7fc5c6e704fce2066ecbfb0b0d8976fe62447"
115116
}

src/Body/BodyRow.tsx

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import Cell from '../Cell';
44
import { responseImmutable } from '../context/TableContext';
55
import devRenderTimes from '../hooks/useRenderTimes';
66
import useRowInfo from '../hooks/useRowInfo';
7-
import type { ColumnType, CustomizeComponent } from '../interface';
7+
import type { ColumnType, CustomizeComponent, ExpandableConfig } from '../interface';
88
import ExpandedRow from './ExpandedRow';
99
import { computedExpandedClassName } from '../utils/expandUtil';
1010

@@ -19,6 +19,7 @@ export interface BodyRowProps<RecordType> {
1919
scopeCellComponent: CustomizeComponent;
2020
indent?: number;
2121
rowKey: React.Key;
22+
expandedRowOffset?: ExpandableConfig<RecordType>['expandedRowOffset'];
2223
}
2324

2425
// ==================================================================================
@@ -102,6 +103,7 @@ function BodyRow<RecordType extends { children?: readonly RecordType[] }>(
102103
rowComponent: RowComponent,
103104
cellComponent,
104105
scopeCellComponent,
106+
expandedRowOffset = 0,
105107
} = props;
106108
const rowInfo = useRowInfo(record, rowKey, index, indent);
107109
const {
@@ -184,6 +186,14 @@ function BodyRow<RecordType extends { children?: readonly RecordType[] }>(
184186
if (rowSupportExpand && (expandedRef.current || expanded)) {
185187
const expandContent = expandedRowRender(record, index, indent + 1, expanded);
186188

189+
const offsetColumns = flattenColumns.filter((_, idx) => idx < expandedRowOffset);
190+
let offsetWidth = 0;
191+
offsetColumns.forEach(item => {
192+
if (typeof item.width === 'number') {
193+
offsetWidth = offsetWidth + (item.width ?? 0);
194+
}
195+
});
196+
187197
expandRowNode = (
188198
<ExpandedRow
189199
expanded={expanded}
@@ -195,7 +205,8 @@ function BodyRow<RecordType extends { children?: readonly RecordType[] }>(
195205
prefixCls={prefixCls}
196206
component={RowComponent}
197207
cellComponent={cellComponent}
198-
colSpan={flattenColumns.length}
208+
offsetWidth={offsetWidth}
209+
colSpan={flattenColumns.length - expandedRowOffset}
199210
isEmpty={false}
200211
>
201212
{expandContent}

src/Body/ExpandedRow.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export interface ExpandedRowProps {
1414
children: React.ReactNode;
1515
colSpan: number;
1616
isEmpty: boolean;
17+
offsetWidth?: number;
1718
}
1819

1920
function ExpandedRow(props: ExpandedRowProps) {
@@ -30,6 +31,7 @@ function ExpandedRow(props: ExpandedRowProps) {
3031
expanded,
3132
colSpan,
3233
isEmpty,
34+
offsetWidth = 0,
3335
} = props;
3436

3537
const { scrollbarSize, fixHeader, fixColumn, componentWidth, horizonScroll } = useContext(
@@ -44,7 +46,7 @@ function ExpandedRow(props: ExpandedRowProps) {
4446
contentNode = (
4547
<div
4648
style={{
47-
width: componentWidth - (fixHeader && !isEmpty ? scrollbarSize : 0),
49+
width: componentWidth - offsetWidth - (fixHeader && !isEmpty ? scrollbarSize : 0),
4850
position: 'sticky',
4951
left: 0,
5052
overflow: 'hidden',

src/Body/index.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ function Body<RecordType>(props: BodyProps<RecordType>) {
3131
expandedKeys,
3232
childrenColumnName,
3333
emptyNode,
34+
expandedRowOffset,
3435
} = useContext(TableContext, [
3536
'prefixCls',
3637
'getComponent',
@@ -40,6 +41,7 @@ function Body<RecordType>(props: BodyProps<RecordType>) {
4041
'expandedKeys',
4142
'childrenColumnName',
4243
'emptyNode',
44+
'expandedRowOffset',
4345
]);
4446

4547
const flattenData: { record: RecordType; indent: number; index: number }[] =
@@ -74,6 +76,7 @@ function Body<RecordType>(props: BodyProps<RecordType>) {
7476
cellComponent={tdComponent}
7577
scopeCellComponent={thComponent}
7678
indent={indent}
79+
expandedRowOffset={expandedRowOffset}
7780
/>
7881
);
7982
});

src/Table.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -822,6 +822,7 @@ function Table<RecordType extends DefaultRecordType>(
822822
expandableType,
823823
expandRowByClick: expandableConfig.expandRowByClick,
824824
expandedRowRender: expandableConfig.expandedRowRender,
825+
expandedRowOffset: expandableConfig.expandedRowOffset,
825826
onTriggerExpand,
826827
expandIconColumnIndex: expandableConfig.expandIconColumnIndex,
827828
indentSize: expandableConfig.indentSize,
@@ -872,6 +873,7 @@ function Table<RecordType extends DefaultRecordType>(
872873
expandableType,
873874
expandableConfig.expandRowByClick,
874875
expandableConfig.expandedRowRender,
876+
expandableConfig.expandedRowOffset,
875877
onTriggerExpand,
876878
expandableConfig.expandIconColumnIndex,
877879
expandableConfig.indentSize,

src/context/TableContext.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type {
33
ColumnsType,
44
ColumnType,
55
Direction,
6+
ExpandableConfig,
67
ExpandableType,
78
ExpandedRowRender,
89
GetComponent,
@@ -68,6 +69,8 @@ export interface TableContextProps<RecordType = any> {
6869
childrenColumnName: string;
6970

7071
rowHoverable?: boolean;
72+
73+
expandedRowOffset: ExpandableConfig<RecordType>['expandedRowOffset'];
7174
}
7275

7376
const TableContext = createContext<TableContextProps>();

src/interface.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,7 @@ export interface ExpandableConfig<RecordType> {
252252
rowExpandable?: (record: RecordType) => boolean;
253253
columnWidth?: number | string;
254254
fixed?: FixedType;
255+
expandedRowOffset?: number;
255256
}
256257

257258
// =================== Render ===================

0 commit comments

Comments
 (0)