Skip to content

Commit 337c5c9

Browse files
committed
feat: add sticky
1 parent 227581c commit 337c5c9

6 files changed

Lines changed: 28 additions & 5 deletions

File tree

src/Body/BodyRow.tsx

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ 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';
10-
import { TableProps } from '..';
10+
import type { TableProps } from '..';
1111

1212
export interface BodyRowProps<RecordType> {
1313
record: RecordType;
@@ -23,6 +23,7 @@ export interface BodyRowProps<RecordType> {
2323
indent?: number;
2424
rowKey: React.Key;
2525
rowKeys: React.Key[];
26+
expandedRowOffset?: ExpandableConfig<RecordType>['expandedRowOffset'];
2627
}
2728

2829
// ==================================================================================
@@ -126,6 +127,7 @@ function BodyRow<RecordType extends { children?: readonly RecordType[] }>(
126127
rowComponent: RowComponent,
127128
cellComponent,
128129
scopeCellComponent,
130+
expandedRowOffset = 0,
129131
rowKeys,
130132
} = props;
131133

@@ -218,6 +220,14 @@ function BodyRow<RecordType extends { children?: readonly RecordType[] }>(
218220
if (rowSupportExpand && (expandedRef.current || expanded)) {
219221
const expandContent = expandedRowRender(record, index, indent + 1, expanded);
220222

223+
const offsetColumns = flattenColumns.filter((_, idx) => idx < expandedRowOffset);
224+
let offsetWidth = 0;
225+
offsetColumns.forEach(item => {
226+
if (typeof item.width === 'number') {
227+
offsetWidth = offsetWidth + (item.width ?? 0);
228+
}
229+
});
230+
221231
expandRowNode = (
222232
<ExpandedRow
223233
expanded={expanded}
@@ -229,7 +239,8 @@ function BodyRow<RecordType extends { children?: readonly RecordType[] }>(
229239
prefixCls={prefixCls}
230240
component={RowComponent}
231241
cellComponent={cellComponent}
232-
colSpan={flattenColumns.length}
242+
offsetWidth={offsetWidth}
243+
colSpan={flattenColumns.length - expandedRowOffset}
233244
isEmpty={false}
234245
>
235246
{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
@@ -32,6 +32,7 @@ function Body<RecordType>(props: BodyProps<RecordType>) {
3232
expandedKeys,
3333
childrenColumnName,
3434
emptyNode,
35+
expandedRowOffset,
3536
classNames,
3637
styles,
3738
} = useContext(TableContext, [
@@ -43,6 +44,7 @@ function Body<RecordType>(props: BodyProps<RecordType>) {
4344
'expandedKeys',
4445
'childrenColumnName',
4546
'emptyNode',
47+
'expandedRowOffset',
4648
'classNames',
4749
'styles',
4850
]);
@@ -88,6 +90,7 @@ function Body<RecordType>(props: BodyProps<RecordType>) {
8890
cellComponent={tdComponent}
8991
scopeCellComponent={thComponent}
9092
indent={indent}
93+
expandedRowOffset={expandedRowOffset}
9194
/>
9295
);
9396
});

src/Table.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -872,6 +872,7 @@ function Table<RecordType extends DefaultRecordType>(
872872
expandedRowRender: expandableConfig.expandedRowRender,
873873
onTriggerExpand,
874874
expandIconColumnIndex: expandableConfig.expandIconColumnIndex,
875+
expandedRowOffset: expandableConfig.expandedRowOffset,
875876
indentSize: expandableConfig.indentSize,
876877
allColumnsFixedLeft: flattenColumns.every(col => col.fixed === 'start'),
877878
emptyNode,
@@ -920,6 +921,7 @@ function Table<RecordType extends DefaultRecordType>(
920921
expandableType,
921922
expandableConfig.expandRowByClick,
922923
expandableConfig.expandedRowRender,
924+
expandableConfig.expandedRowOffset,
923925
onTriggerExpand,
924926
expandableConfig.expandIconColumnIndex,
925927
expandableConfig.indentSize,
@@ -942,6 +944,8 @@ function Table<RecordType extends DefaultRecordType>(
942944
mergedChildrenColumnName,
943945

944946
rowHoverable,
947+
classNames,
948+
styles,
945949
],
946950
);
947951

src/context/TableContext.tsx

Lines changed: 3 additions & 1 deletion
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,
@@ -14,7 +15,7 @@ import type {
1415
TriggerEventHandler,
1516
} from '../interface';
1617
import type { FixedInfo } from '../utils/fixUtil';
17-
import { TableProps } from '../Table';
18+
import type { TableProps } from '../Table';
1819

1920
const { makeImmutable, responseImmutable, useImmutableMark } = createImmutable();
2021
export { makeImmutable, responseImmutable, useImmutableMark };
@@ -55,6 +56,7 @@ export interface TableContextProps<RecordType = any> {
5556
expandIcon: RenderExpandIcon<RecordType>;
5657
onTriggerExpand: TriggerEventHandler<RecordType>;
5758
expandIconColumnIndex: number;
59+
expandedRowOffset: ExpandableConfig<RecordType>['expandedRowOffset'];
5860
allColumnsFixedLeft: boolean;
5961

6062
// Column

src/interface.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,7 @@ export interface ExpandableConfig<RecordType> {
256256
rowExpandable?: (record: RecordType) => boolean;
257257
columnWidth?: number | string;
258258
fixed?: FixedType;
259+
expandedRowOffset?: number;
259260
}
260261

261262
// =================== Render ===================

0 commit comments

Comments
 (0)