UNPKG

@arco-design/web-react

Version:

Arco Design React UI Library.

705 lines (704 loc) 24.3 kB
import React, { ReactNode, CSSProperties } from 'react'; import { PaginationProps } from '../Pagination/pagination'; import { SpinProps } from '../Spin'; import { TriggerProps } from '../Trigger'; import { TooltipProps } from '../Tooltip'; import { AvailableVirtualListProps, VirtualListHandle } from '../_class/VirtualList'; export declare type RowCallbackProps = { onClick?: (event: any) => void; onDoubleClick?: (event: any) => void; onContextMenu?: (event: any) => void; onMouseEnter?: (event: any) => void; onMouseLeave?: (event: any) => void; onHandleSave?: (row: any) => void; [name: string]: any; }; export declare type SorterFn = (a: any, b: any) => number; /** * @title Table */ export interface TableProps<T = any> { style?: CSSProperties; className?: string | string[]; /** * @zh 表格的 `table-layout` 属性设置为 `fixed`,设置为 `fixed` 后,表格的宽度不会被内容撑开超出 100%。 * @en The table's `table-layout` property is set to `fixed`. After set to `fixed`, the width of the table will not be stretched by the content beyond 100%. */ tableLayoutFixed?: boolean; /** * @zh 表格行 key 的取值字段 * @en Table row key * @defaultValue key */ rowKey?: React.Key | ((record: T) => React.Key); /** * @zh 列描述数据对象的数组 * @en An array of column objects */ columns?: ColumnProps<T>[]; /** * @zh 覆盖原生表格标签 * @en Override native table tag */ components?: ComponentsProps; /** * @zh 表格数据 * @en Data record array to be displayed */ data?: T[]; /** * @zh 边框设置 * @en Configure border * @defaultValue true */ border?: boolean | { wrapper?: boolean; headerCell?: boolean; bodyCell?: boolean; cell?: boolean; }; /** * @zh 是否显示单元格边框,作用等同于 `border={{ cell: true }}` * @en Whether to display the table cell border, equivalent to `border={{ cell: true }}` */ borderCell?: boolean; /** * @zh 是否开启鼠标悬浮效果 * @en Whether to enable the hover style * @defaultValue true */ hover?: boolean; /** * @zh 默认展开所有可展开的行 * @en Expand all expandable rows by default */ defaultExpandAllRows?: boolean; /** * @zh 展开的行(受控) * @en To set expanded rows. */ expandedRowKeys?: (string | number)[]; /** * @zh 默认展开的行 * @en To set default expanded rows */ defaultExpandedRowKeys?: (string | number)[]; /** * @zh 点击展开额外的行,渲染函数。返回值为 `null` 时,不会渲染展开按钮 * @en Click to expand additional rows, rendering functions. When the return value is `null`, the expand button will not be rendered */ expandedRowRender?: (record: T, index: number) => ReactNode; /** * @zh 自定义展开/关闭列的图标,宽度,标题,具体用法看[这个例子](/react/components/table#定制展开参数) * @en Customize the icon, width, and title of the expandable column, see [this example](/react/components/table#custom expand parameters) for usage */ expandProps?: ExpandProps<T>; /** * @zh 点击展开的回调 * @en Callback when click to expand */ onExpand?: (record: T, expanded: boolean) => void; /** * @zh 点击展开时触发,参数为展开行数组 * @en Callback when expanded button is clicked, the parameter is an array of expanded rows */ onExpandedRowsChange?: (expandedRows: (string | number)[]) => void; /** * @zh 表格是否在加载中 * @en Whether the table is in loading */ loading?: boolean | SpinProps; /** * @zh 没有数据的时候显示的元素 * @en Element to be displayed when there is no data */ noDataElement?: string | ReactNode; /** * @zh 是否显示表头 * @en Whether to show the header * @defaultValue true */ showHeader?: boolean; /** * @zh * 表头是否显示下一次排序的 tooltip 提示。可以设置对象,可以传 `Tooltip` 组件的所有参数。 * @en * Whether the header shows the tooltip for the next sorting. The object can be set, * and all the parameters of the `Tooltip` component can be passed. * @version 2.19.0 * @defaultValue true */ showSorterTooltip?: boolean | TooltipProps; /** * @zh 是否开启斑马纹 * @en Whether to show stripe style */ stripe?: boolean; /** * @zh 表格尺寸,分为 默认,`默认` `中` `小` `迷你` 四个尺寸 * @en The table size is divided into four sizes, `default` `medium` `small` `mini` */ size?: 'default' | 'middle' | 'small' | 'mini'; /** * @zh 分页、排序、筛选时的回调 * @en Callback when pagination, sorting, and filtering changes * @version extra in `2.19.0`, currentAllData in 2.53.0 */ onChange?: (pagination: PaginationProps, sorter: SorterInfo | SorterInfo[], filters: Partial<Record<keyof T, string[]>>, extra: { currentData: T[]; currentAllData: T[]; action: 'paginate' | 'sort' | 'filter'; }) => void; /** * @zh 分页器设置,参考[Pagination组件](/react/components/pagination),设置 `false` 不展示分页 * @en Pagination settings, refer to [Pagination components](/react/components/pagination), set `false` to hide pagination */ pagination?: PaginationProps | boolean; /** * @zh 自定义分页渲染。 * @en Customized pagination render * @version 2.11.0 */ renderPagination?: (paginationNode?: ReactNode) => ReactNode; /** * @zh * 设置x轴或y轴的滚动。`x` 设置为 `true`,会给 table 添加 `table-layout: fixed` 以及给父元素添加 `overflow: auto`。 * `y` 设置为 `true`,表头和表身会分离,放在两个 table 中 * @en * Set the scroll of x-axis or y-axis. Setting `x` to `true` will add `table-layout: fixed` to the table and `overflow: auto` to the parent element. * If `y` is set to `true`, the header and body will be separated and placed in two tables */ scroll?: { x?: number | string | boolean; y?: number | string | boolean; }; /** * @zh 表格行的类名 * @en ClassName of table row */ rowClassName?: (record: T, index: number) => string; /** * @zh 设置表格行是否可选,选中事件等。[配置项](#rowselection) * @en Set whether the table row is selectable, select event, etc. [Configuration item](#rowselection) */ rowSelection?: RowSelectionProps<T>; /** * @zh 设置表头行单元格的各项事件回调 * @en Set the event callback of the header row */ onHeaderRow?: (columns: ColumnProps<T>[], index: number) => RowCallbackProps; /** * @zh 设置表格行的各项事件回调 * @en Set the event callback of the table row */ onRow?: (record: T, index: number) => RowCallbackProps; prefixCls?: string; /** * @zh 当单元格内容为空时,显示占位符,优先级低于 `column.placeholder`。 * @en When the cell content is empty, a placeholder is displayed, and the priority is lower than `column.placeholder`. * @version 2.23.0 */ placeholder?: ReactNode; /** * @zh 设置分页器的位置,有六个方位 `右下` `左下` `右上` `左上` `上中` `下中` * @en Set the position of the pagination, there are six positions `bottom right` `bottom left` `top right` `top left` `top center` `bottom center` * @defaultValue br */ pagePosition?: 'br' | 'bl' | 'tr' | 'tl' | 'topCenter' | 'bottomCenter'; /** * @zh 树形数据在 `data` 中的字段名,默认是 `children` * @en The field name of the tree data in `data`, default is `children` * @defaultValue children */ childrenColumnName?: string; /** * @zh 树形数据每个层级向左偏移的像素 * @en The pixel offset to the left of each level of the tree data * @defaultValue 15 */ indentSize?: number; /** * @zh 表格尾部 * @en The footer of the table */ footer?: (currentPageDate: any) => ReactNode; /** * @zh * 表格开启虚拟滚动,用于处理大数据场景。( 注意:虚拟滚动会自动关闭对树形数据的支持 ) * @en * The table enables virtual scrolling for processing big data scenarios. * (Note: Virtual scrolling will automatically turn off support for tree data) */ virtualized?: boolean; /** * @zh * 用于配置虚拟滚动。 * @en * Used to configure `VirtualList`. * @version 2.46.0 */ virtualListProps?: AvailableVirtualListProps; /** * @zh 总结栏 * @en Table Summary * @version 2.17.0 */ summary?: (currentData?: T[]) => ReactNode; } /** * @title RowSelection * * @zh `<Table>` 参数 `rowSelection` 的详细参数。 * @en The detailed parameters of `rowSelection`. */ export interface RowSelectionProps<T = any> { /** * @zh 多选模式下是否开启全选功能 * @en Whether to show check all button */ checkAll?: boolean; /** * @zh 设置为 `false` 的时候父子选择会自动关联。 * @en When set to `false`, parent-child selections are automatically associated. * @version 2.33.0 * @defaultValue true */ checkStrictly?: boolean; /** * @zh 多选模式下的复选框是否跨分页,只在非受控模式下生效。配合 preserveSelectedRowKeys: true 使用,可在受控模式下生效。 * @en Whether the checkboxes in multi-select mode cross pages, only works in uncontrolled mode, but also works in controlled mode with preserveSelectedRowKeys: true. */ checkCrossPage?: boolean; /** * @zh 自定义列表选择的标题 * @en Customize the title of the selection column */ columnTitle?: string | ReactNode; /** * @zh 选择框列的宽度 * @en The width of the selection column */ columnWidth?: number; /** * @zh 选择框的属性配置 * @en Configure the selection checkbox */ checkboxProps?: (record: T) => { [key: string]: any; }; /** * @zh 是否固定选择列到左边 * @en Whether to fix column to the left */ fixed?: boolean; /** * @zh 单选或多选的选中项发生改变时的回调 * @en Callback when the checkbox/radio changes */ onChange?: (selectedRowKeys: (string | number)[], selectedRows: T[]) => void; /** * @zh 用户手动选择/取消选择的回调 * @en Callback for user manual selection/deselection * @version 2.22.0 */ onSelect?: (selected: boolean, record: T, selectedRows: T[]) => void; /** * @zh 用户手动选择/取消选择所有行的回调 * @en Callback when the user to manually select/deselect all rows * @version 2.6.0 */ onSelectAll?: (selected: boolean, selectedRows: any) => void; /** * @zh 在数据项被删除时仍然保留选项的 `key` * @en The `key` is still retained in `selectedRowKeys` when the data item is deleted * @version 2.19.0 */ preserveSelectedRowKeys?: boolean; /** * @zh 定制复选框,用法与 `column.render` 相同。 * @en Customize checkbox, the usage is same as `column.render`. * @version 2.19.0 */ renderCell?: (originNode: any, checked: boolean, record: T) => ReactNode; /** * @zh Table选中的项,(受控模式,需要跟 `onChange` 配合使用) * @en Table selected row, (controlled mode, need to be used with `onChange`) */ selectedRowKeys?: (string | number)[]; /** * @zh 多选或者单选 * @en Multi-select or single-select */ type?: 'checkbox' | 'radio'; pureKeys?: boolean; } /** * @title ExpandProps * * @zh `<Table>` 参数 `expandProps` 的详细参数。 * @en The detailed parameters of `expandProps`. */ export interface ExpandProps<T = any> { /** * @zh 定制展开按钮的图标 * @en Customize the icon of the expand button */ icon?: (props: { expanded: boolean; record: Record<string, any>; }) => ReactNode; /** * @zh 展开按钮列的宽度 * @en The width of expand icon column */ width?: number; /** * @zh 展开按钮列的表头标题 * @en The table header title of expand icon column */ columnTitle?: ReactNode; /** * @zh * 是否允许行展开。如果不指定该参数,会以 expandedRowRender 是否有返回值决定。当出现性能问题时,建议使用 rowExpandable。 * @en * Whether to allow row expansion. If this parameter is not specified, * it will be determined by whether expandedRowRender has a return value. When performance problems occur, rowExpandable is recommended. * @version 2.16.0 */ rowExpandable?: (record: T) => boolean; /** * @zh 支持通过点击行来展开 * @en Clicking on the row to expand * @version 2.19.0 */ expandRowByClick?: boolean; /** * @zh 树形数据时,只有 `children` 是数组且长度大于 1 才显示展开图标。 * @en For tree data, only when `children` is an array and the length is greater than 1, the expand icon will be displayed. * @defaultValue true * @version 2.27.0 */ strictTreeData?: boolean; } /** * @title Column * * @zh 列描述数据对象,是 `columns` 中的一项。 * @en The column describes the data object and is an item in `columns`. */ export interface ColumnProps<T = any> { /** * @zh 列的类名 * @en ClassName of the column */ className?: string | string[]; /** * @zh 设置列的对齐方式 * @en Set the alignment of the column * @defaultValue left */ align?: 'left' | 'center' | 'right'; /** * @zh * 单元格内容超出长度后,是否自动省略,显示 `...`。设置这个属性后,table 的 `table-layout` 将自动变成 `fixed`。 * @en * If the cell content exceeds the length, whether it is automatically omitted and displays `...`. * After setting this property, the `table-layout` of the table will automatically become `fixed`. */ ellipsis?: boolean; /** * @zh 表头单元格自定义样式 * @en Table header cell style */ headerCellStyle?: CSSProperties; /** * @zh 表身单元格自定义样式 * @en Table body cell style */ bodyCellStyle?: CSSProperties; cellStyle?: CSSProperties; /** * @zh 列标题 * @en Column title */ title: React.ReactNode; /** * @zh 列宽度 * @en Column width */ width?: number | string; /** * @zh * 列数据在数据项中对应的 `key`,用于取值显示,支持 `a[0].b.c[1]` 的嵌套写法, * 详情看 [lodash.get](https://www.npmjs.com/package/lodash.get)。 * @en * The `key` corresponding to the column data in the data item is used to display the value. * It supports the nested writing of `a[0].bc[1]`, see [lodash.get](https:// www.npmjs.com/package/lodash.get). */ dataIndex?: string; /** * @zh React的 key值,如果不指定,默认取 `dataIndex` 的值 * @en React key value, if not specified, the default value of `dataIndex` is taken */ key?: string | number; /** * @zh 自定义单元格显示的内容 * @en Customize the content displayed in the cell */ render?: (col: any, item: T, index: number) => any; /** * @zh 当单元格内容为空时,显示占位符,优先级低于 `render`。 * @en When the cell content is empty, a placeholder is displayed, and the priority is lower than `render`. * @version 2.22.0 */ placeholder?: ReactNode; /** * @zh 排序函数,如果想要服务端排序或者添加更多自定义操作,设置为true,利用`onChange`函数进行自定义排序 * @en Sorting function, if you want server-side sorting or adding more custom operations, set to true and use the `onChange` function for custom sorting */ sorter?: SorterFn | boolean | { compare?: SorterFn; multiple?: number; }; /** * @zh 筛选项,需要配合 `onFilter` 或者 `onChange` 使用 * @en Filter items, need to be used with `onFilter` or `onChange` * @defaultValue [] */ filters?: { text?: ReactNode; value?: any; [key: string]: any; }[]; /** * @zh 默认筛选条件 * @en To set default filters */ defaultFilters?: string[]; /** * @zh 默认排序方式 * @en To set default sort order */ defaultSortOrder?: 'ascend' | 'descend'; /** * @zh 筛选的受控属性,值为筛选的 value 数组 * @en To set filtered value, the value is the filtered value array */ filteredValue?: string[]; /** * @zh 排序的受控属性,可以控制列的排序,可设置为 `ascend` `descend` * @en To set sort order, which can control the sorting of columns, can be set to `ascend` `descend` */ sortOrder?: 'ascend' | 'descend'; /** * @zh 支持的排序方式。 * @en Supported sorting methods. * @defaultValue ['ascend','descend'] */ sortDirections?: Array<'ascend' | 'descend'>; /** * @zh 是否可以筛选多项 * @en Is it possible to filter multiple items * @defaultValue true */ filterMultiple?: boolean; /** * @zh 自定义筛选图标。 * @en Custom filter icon. */ filterIcon?: ReactNode; /** * @zh 自定义筛选框。 * @en Custom filter popup box. */ filterDropdown?: (props: { filterKeys?: string[]; setFilterKeys?: (filterKeys: string[], callback?: Function) => void; confirm?: Function; }) => ReactNode; /** * @zh 配置筛选弹出框的一些属性。 * @en Configure properties of the filter popup box. */ filterDropdownProps?: { triggerProps?: TriggerProps; }; /** * @zh 筛选框打开关闭的回调 * @en Callback when the visible of filter popup changes */ onFilterDropdownVisibleChange?: (visible: boolean) => void; /** * @zh 筛选函数,配合`filters` * @en Callback when filter changes */ onFilter?: (value: any, row: any) => any; /** * @zh 固定头和列到左边或者右边 * @en Fixed header and column to the left or right */ fixed?: 'left' | 'right'; /** * @zh 设置头部单元格的各项事件回调 * @en Set the event callback of the table head cell */ onHeaderCell?: (column: any, index: any) => RowCallbackProps; /** * @zh 设置表身单元格的各项事件回调 * @en Set the event callback of the table body cell */ onCell?: (record: any, index: any) => RowCallbackProps; children?: ColumnProps<T>[]; rowSpan?: number; colSpan?: number; headerCellProps?: RowCallbackProps; editable?: boolean; prefixCls?: string; currentFilters?: { [key: string]: any; }; components?: ComponentsProps; columnFixedStyle?: CSSProperties; column?: any; [key: string]: any; } export declare type InternalColumnProps<T = any> = ColumnProps<T> & { $$isOperation?: boolean; $$isFirstColumn?: boolean; $$columnIndex?: number | number[]; node?: ReactNode; }; export interface ColumnComponentProps<T = any> extends ColumnProps<T> { onSort: (direction: string | undefined, field: string | number) => void; onHandleFilter: (column: Record<string, any>, filter: Record<string, any>) => void; onHandleFilterReset: (column: { [key: string]: any; }) => void; currentSorter?: SorterInfo; currentFilter?: { [key: string]: any; }; _key?: string | number; showSorterTooltip?: boolean | TooltipProps; index?: number; } export declare type ComponentsProps = { table?: any; header?: { operations?: (nodes: { selectionNode?: ReactNode; expandNode?: ReactNode; }) => { name?: string; node?: ReactNode; width?: number; }[]; wrapper?: any; thead?: any; row?: any; th?: any; cell?: any; }; body?: { operations?: (nodes: { selectionNode?: ReactNode; expandNode?: ReactNode; }) => { name?: string; node?: ReactNode | ((record: any) => ReactNode); width?: number; }[]; wrapper?: any; tbody?: any; row?: any; td?: any; cell?: any; }; }; export interface TheadProps<T = any> { expandedRowRender?: (record: { [key: string]: any; }, index: number) => ReactNode; onCheckAll: (_: any, e: any) => void; onSort: (direction: any, field: any) => void; data: T[]; onHandleFilter: (column: any, filter: any) => void; onHandleFilterReset: (filter: any) => void; currentSorter: SorterInfo; activeSorters: SorterInfo[]; selectedRowKeys: (string | number)[]; onHeaderRow?: (columns: any, index: number) => RowCallbackProps; prefixCls?: string; rowSelection?: RowSelectionProps; columnTitle?: string | ReactNode; currentFilters?: Partial<Record<keyof T, string[]>>; rowKey?: TableProps['rowKey']; components?: ComponentsProps; expandProps?: ExpandProps<T>; allSelectedRowKeys?: (string | number)[]; groupColumns?: InternalColumnProps<T>[][]; stickyOffsets?: number[]; groupStickyClassNames?: string[][]; showSorterTooltip?: boolean | TooltipProps; } export declare type GetRowKeyType<T> = (record: T) => string; export interface TbodyProps<T = any> { data: T[]; selectedRowKeys: React.Key[]; indeterminateKeys: React.Key[]; components?: ComponentsProps; expandedRowKeys: React.Key[]; columns: InternalColumnProps<T>[]; noDataElement?: string | ReactNode; onCheck: (checked: boolean, record: any) => void; onCheckRadio: (key: any, record: any) => void; onClickExpandBtn: (key: React.Key) => void; pagination?: PaginationProps | boolean; scroll?: { x?: number | string | boolean; y?: number | string | boolean; }; expandedRowRender?: (record: T, index: number) => ReactNode; rowClassName?: (record: T, index: number) => string; onRow?: (record: T, index: number) => RowCallbackProps; prefixCls?: string; rowSelection?: RowSelectionProps<T>; expandProps?: ExpandProps<T>; childrenColumnName?: string; indentSize?: number; hasFixedColumn?: boolean; tableViewWidth?: number; currentSorter?: SorterInfo; activeSorters?: SorterInfo[]; virtualized?: boolean; virtualListProps?: AvailableVirtualListProps; stickyOffsets?: number[]; stickyClassNames?: string[]; getRowKey?: GetRowKeyType<T>; placeholder?: ReactNode; saveVirtualListRef?: (ref: VirtualListHandle) => void; saveRef?: (ref: HTMLElement | HTMLDivElement) => void; } export interface TfootProps<T = any> { prefixCls?: string; summary?: (currentData?: T[]) => ReactNode; data?: T[]; columns?: InternalColumnProps<T>[]; stickyOffsets?: number[]; stickyClassNames?: string[]; } export declare type SortDirection = 'descend' | 'ascend'; export interface SorterResult { direction?: SortDirection; field?: string; } export interface SorterInfo { direction?: SortDirection; field?: string | number; sorterFn?: SorterFn; priority?: number; } export interface SummaryProps { fixed?: 'top' | 'bottom'; children?: ReactNode; }