import {Spin, Pagination} from 'antd'; import { createTablePageContext, createTableSearchContext, createTableSettingContext, useTablePageContext, useTableSearchContext, } from '@hooks'; import {PAGE_SIZE_LIST, TABLE_CELL_WIDTH} from '@utils'; import { Dispatch, ReactElement, ReactNode, SetStateAction, useEffect, useState, } from 'react'; import {useTable, useTableShadow} from './hooks'; import {ColumnSort, Row, RowSelectionState} from '@tanstack/react-table'; import './index.css'; import {ModifyData} from '@models'; import TableHead from './Header'; import TableBody from './Body'; import {klona} from 'klona/json'; type GroupKey> = keyof T extends string ? `${keyof T}Group` : never; export type LDColumnsType> = { dataIndex: keyof T | GroupKey, title: string, width: number, render?: (info: T, index: number, row: Row>) => ReactNode, align?: 'left' | 'right' | 'center', fixed?: 'left' | 'right', sort?: boolean, children?: LDColumnsType[], }; type Props> = { columns: LDColumnsType[]; data: T[]; pageContext: ReturnType; searchContext: ReturnType; settingContext: ReturnType; count: number; 'data-testid'?: string; pageSizeList?: string[]; isSecondLevel?: boolean; rowSelection?: RowSelectionState; setRowSelection?: Dispatch>; disabledHeadSort?: boolean; disabledSizeChange?: boolean; highlightValue?: unknown; hightlightKey?: keyof T; enableRowDnd?: boolean; rawKey?: keyof T; onSortingChange?: (state: ColumnSort | null) => void; subRowKey?: keyof T; renderSubComponent?: (row: Row>) => ReactNode; }; function LDTable>(props: Props): ReactElement { const { columns, data, pageContext, searchContext, count, pageSizeList = PAGE_SIZE_LIST, isSecondLevel, rowSelection, setRowSelection, settingContext, disabledHeadSort, disabledSizeChange, highlightValue, hightlightKey, rawKey, enableRowDnd, onSortingChange, subRowKey, renderSubComponent, } = props; const [klonaData, setKlonaData] = useState(klona(data)); const [{page, pageSize}, {setPageContext}] = useTablePageContext(pageContext); const [{isSearching}] = useTableSearchContext(searchContext); useEffect(function() { enableRowDnd && setKlonaData(klona(data)); }, [data, enableRowDnd]); const [ { getHeaderGroups, getRowModel, getCenterTotalSize, active, hasSort, hasGroup, }, {onDragEnd, onDragStart}, ] = useTable( columns, enableRowDnd ? klonaData : data, { settingContext, rowSelection, setRowSelection, rawKey, onSortingChange, subRowKey, hasRenderSubComponent: Boolean(renderSubComponent), }, ); const { scrollProgess, scrollTableRef, headerTableRef, } = useTableShadow(getCenterTotalSize()); return (
setPageContext({page, pageSize})} current={page} showTotal={total => `共${total}条数据`} />
); } export default LDTable; export const modifyDataColumns: LDColumnsType[] = [ { title: '最后修改人', dataIndex: 'modifyUser', width: TABLE_CELL_WIDTH.normal, }, { title: '最后修改时间', dataIndex: 'modifyTime', width: TABLE_CELL_WIDTH.date, }, ];