From 5348044c849a97dfc6c253a5b5ab6f3c449e0884 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=8C=E8=B4=A7=E6=9C=BA=E5=99=A8=E4=BA=BA?= Date: Thu, 17 Aug 2023 14:24:48 +0800 Subject: [PATCH] chore: support fixed --- src/Body/BodyRow.tsx | 2 +- src/StaticTable/BodyGrid.tsx | 26 +++++++++++++------- src/StaticTable/BodyLine.tsx | 43 ++++++++++++++++++++++------------ src/StaticTable/index.tsx | 3 +++ src/hooks/useFlattenRecords.ts | 10 ++++++-- 5 files changed, 57 insertions(+), 27 deletions(-) diff --git a/src/Body/BodyRow.tsx b/src/Body/BodyRow.tsx index e9e936c85..ff08dd3cc 100644 --- a/src/Body/BodyRow.tsx +++ b/src/Body/BodyRow.tsx @@ -137,7 +137,7 @@ export function getCellProps( ); } - let additionalCellProps: React.HTMLAttributes; + let additionalCellProps: React.HTMLAttributes = {}; if (column.onCell) { additionalCellProps = column.onCell(record, index); } diff --git a/src/StaticTable/BodyGrid.tsx b/src/StaticTable/BodyGrid.tsx index 8b8b8cc0c..dbd99eef8 100644 --- a/src/StaticTable/BodyGrid.tsx +++ b/src/StaticTable/BodyGrid.tsx @@ -3,6 +3,7 @@ import classNames from 'classnames'; import VirtualList from 'rc-virtual-list'; import * as React from 'react'; import TableContext from '../context/TableContext'; +import useFlattenRecords, { FlattenData } from '../hooks/useFlattenRecords'; import BodyLine from './BodyLine'; import StaticContext from './StaticContext'; @@ -13,17 +14,23 @@ export interface GridProps { const Grid = React.forwardRef((props: GridProps, ref: any) => { const { data } = props; - const { flattenColumns, onColumnResize, getRowKey, prefixCls } = useContext(TableContext, [ - 'flattenColumns', - 'onColumnResize', - 'getRowKey', - 'prefixCls', - ]); + const { flattenColumns, onColumnResize, getRowKey, expandedKeys, prefixCls, childrenColumnName } = + useContext(TableContext, [ + 'flattenColumns', + 'onColumnResize', + 'getRowKey', + 'prefixCls', + 'expandedKeys', + 'childrenColumnName', + ]); const { scrollY, scrollX } = useContext(StaticContext); // const context = useContext(TableContext); // console.log('=>', context, scrollX, scrollY); + // =========================== Data =========================== + const flattenData = useFlattenRecords(data, childrenColumnName, expandedKeys, getRowKey); + // ========================== Column ========================== const columnsWidth = React.useMemo<[key: React.Key, width: number][]>( () => flattenColumns.map(({ width, key }) => [key, width as number]), @@ -41,16 +48,17 @@ const Grid = React.forwardRef((props: GridProps, ref: any) => { return (
- > className={classNames(tblPrefixCls, `${tblPrefixCls}-virtual`)} height={scrollY} itemHeight={24} - data={data} + data={flattenData} itemKey={getRowKey} scrollWidth={scrollX} > {(item, index, itemProps) => { - return ; + const rowKey = getRowKey(item, index); + return ; }}
diff --git a/src/StaticTable/BodyLine.tsx b/src/StaticTable/BodyLine.tsx index d13f50976..dfd896f36 100644 --- a/src/StaticTable/BodyLine.tsx +++ b/src/StaticTable/BodyLine.tsx @@ -1,24 +1,28 @@ import { useContext } from '@rc-component/context'; import classNames from 'classnames'; import * as React from 'react'; +import { getCellProps, useRowInfo } from '../Body/BodyRow'; import Cell from '../Cell'; import TableContext from '../context/TableContext'; -import { getColumnsKey } from '../utils/valueUtil'; +import type { FlattenData } from '../hooks/useFlattenRecords'; import StaticContext from './StaticContext'; export interface BodyLineProps { - record: RecordType; + data: FlattenData; index: number; className?: string; + style?: React.CSSProperties; + rowKey: React.Key; } const BodyLine = React.forwardRef((props, ref) => { - const { record, index, className, style, ...restProps } = props; + const { data, index, className, rowKey, style, ...restProps } = props; + const { record, indent } = data; - const { flattenColumns, prefixCls, fixedInfoList } = useContext(TableContext); + const { flattenColumns, prefixCls } = useContext(TableContext); const { scrollX } = useContext(StaticContext, ['scrollX']); - const columnsKey = getColumnsKey(flattenColumns); + const rowInfo = useRowInfo(record, rowKey); // ========================== Render ========================== return ( @@ -32,16 +36,21 @@ const BodyLine = React.forwardRef((props, ref) => }} > {flattenColumns.map((column, colIndex) => { - const { render, dataIndex, className: columnClassName } = column; + const { render, dataIndex, className: columnClassName, width: colWidth } = column; - const key = columnsKey[colIndex]; - const fixedInfo = fixedInfoList[colIndex]; + const { key, fixedInfo, appendCellNode, additionalCellProps } = getCellProps( + rowInfo, + column, + colIndex, + indent, + index, + ); - // return ( - //
- // {value} - //
- // ); + const { style: cellStyle } = additionalCellProps; + const mergedStyle = { + ...cellStyle, + width: colWidth, + }; return ( ((props, ref) => ellipsis={column.ellipsis} align={column.align} scope={column.rowScope} + // component={column.rowScope ? scopeCellComponent : cellComponent} component="div" prefixCls={prefixCls} key={key} @@ -60,8 +70,11 @@ const BodyLine = React.forwardRef((props, ref) => render={render} shouldCellUpdate={column.shouldCellUpdate} {...fixedInfo} - // appendNode={appendCellNode} - // additionalProps={additionalCellProps} + appendNode={appendCellNode} + additionalProps={{ + ...additionalCellProps, + style: mergedStyle, + }} /> ); })} diff --git a/src/StaticTable/index.tsx b/src/StaticTable/index.tsx index cefd3ccf0..0d9fb273a 100644 --- a/src/StaticTable/index.tsx +++ b/src/StaticTable/index.tsx @@ -1,4 +1,5 @@ import * as React from 'react'; +import { INTERNAL_HOOKS } from '..'; import type { CustomizeScrollBody } from '../interface'; import Table, { type TableProps } from '../Table'; import Grid from './BodyGrid'; @@ -35,6 +36,8 @@ export default function StaticTable(props: StaticTableProps ); diff --git a/src/hooks/useFlattenRecords.ts b/src/hooks/useFlattenRecords.ts index 3ec8bab36..fc6ae8a61 100644 --- a/src/hooks/useFlattenRecords.ts +++ b/src/hooks/useFlattenRecords.ts @@ -41,6 +41,12 @@ function flatRecord( return arr; } +export interface FlattenData { + record: RecordType; + indent: number; + index: number; +} + /** * flat tree data on expanded state * @@ -53,11 +59,11 @@ function flatRecord( * @returns flattened data */ export default function useFlattenRecords( - data, + data: T[], childrenColumnName: string, expandedKeys: Set, getRowKey: GetRowKey, -) { +): FlattenData[] { const arr: { record: T; indent: number; index: number }[] = React.useMemo(() => { if (expandedKeys?.size) { let temp: { record: T; indent: number; index: number }[] = [];