import { Table as AntdTable, ConfigProvider, TableProps } from 'antd'; import React, { useContext, useMemo } from 'react'; import { ColumnGroupType, ColumnType } from 'antd/lib/table'; import './index.less'; import classNames from 'classnames'; import { Space } from '../Space'; import { Icon } from '../Icon'; import { translate } from '../utils'; export type ColumnsType = ( | (ColumnGroupType & { actions?: ( value: any, record: RecordType, index: number, ) => React.ReactNode; }) | (ColumnType & { actions?: ( value: any, record: RecordType, index: number, ) => React.ReactNode; }) )[]; interface TableExtraProps { columns?: ColumnsType; emptyType?: 'simple' | 'slogan'; } export declare type TriggerEventHandler = ( record: RecordType, event: React.MouseEvent, ) => void; export interface RenderExpandIconProps { prefixCls: string; expanded: boolean; record: RecordType; expandable: boolean; onExpand: TriggerEventHandler; } const Table = (props: TableExtraProps & TableProps) => { // 为了与 antd 的生态保持兼容性,我们要求必须要使用 `.@{ant-prefix}` 变量来生成类名 const { getPrefixCls } = useContext(ConfigProvider.ConfigContext); const prefixCls = getPrefixCls('btri-table'); const { emptyType = 'simple', expandable } = props; const _filterIcon = (filtered: boolean) => { return ; }; const _columns: ColumnsType & ColumnsType = useMemo(() => { return props.columns?.map((column) => { return { render: column.actions && ((value, record, index) => ( {column.actions(value, record, index)} )), filterIcon: _filterIcon, ...column, }; }); }, props.columns); const _isEmpty = useMemo(() => !props.dataSource?.length, [props.dataSource]); const emptyNode: React.ReactNode = useMemo(() => { const text = props.locale?.emptyText; if (typeof text === 'function') { return text(); } return text; }, [props.locale?.emptyText]); const { locale } = useContext(ConfigProvider.ConfigContext); const _emptyNode = useMemo(() => { const nodes = { simple: emptyNode || translate('packages.base.src.Table.index.暂无数据', locale?.locale), slogan: (
{emptyNode || translate( 'packages.base.src.Table.index.暂无数据', locale?.locale, )}
), }; return nodes[emptyType]; }, [_isEmpty, emptyType, emptyNode]); const _expandIcon = (expandIconProps: RenderExpandIconProps) => { return ( expandIconProps.expandable && ( expandIconProps.onExpand(expandIconProps.record, e)} /> ) ); }; const _expandable = useMemo( () => ({ indentSize: 20, ...expandable }), [expandable], ); return (
{props.children} {_isEmpty && (
{_emptyNode}
)}
); }; Table.Summary = AntdTable.Summary; Table.Column = AntdTable.Column; Table.EXPAND_COLUMN = AntdTable.EXPAND_COLUMN; Table.SELECTION_COLUMN = AntdTable.SELECTION_COLUMN; export { Table };