@douyinfe/semi-ui
Version:
A modern, comprehensive, flexible design system and UI library. Connect DesignOps & DevOps. Quickly build beautiful React apps. Maintained by Douyin-fe team.
368 lines (367 loc) • 15.9 kB
TypeScript
import React, { ReactNode, MutableRefObject } from 'react';
import type { BaseProps } from '../_base/baseComponent';
import type { PaginationProps } from '../pagination';
import type { CheckboxProps } from '../checkbox';
import type { Locale } from '../locale/interface';
import type { ArrayElement } from '../_base/base';
import { strings } from '@douyinfe/semi-foundation/lib/es/table/constants';
import type { BaseRowKeyType, BaseSortOrder, BaseGroupBy, BaseGroupByFn, BaseFixed, BaseAlign, BaseChangeInfoSorter, BaseSorter, BaseFilter, BaseChangeInfoFilter, BaseIncludeGroupRecord, BaseEllipsis, OnChangeExtra } from '@douyinfe/semi-foundation/lib/es/table/foundation';
import type { ColumnFilterProps } from './ColumnFilter';
import { TableCellProps } from './TableCell';
export interface TableProps<RecordType extends Record<string, any> = any> extends BaseProps {
bordered?: boolean;
children?: ReactNode;
childrenRecordName?: string;
className?: string;
clickGroupedRowToExpand?: boolean;
columns?: ColumnProps<RecordType>[];
components?: TableComponents;
dataSource?: RecordType[];
defaultExpandAllGroupRows?: boolean;
defaultExpandAllRows?: boolean;
defaultExpandedRowKeys?: (string | number)[];
empty?: ReactNode;
expandAllGroupRows?: boolean;
expandAllRows?: boolean;
expandCellFixed?: Fixed;
expandIcon?: ExpandIcon;
expandedRowKeys?: (string | number)[];
expandedRowRender?: ExpandedRowRender<RecordType>;
expandRowByClick?: boolean;
footer?: Footer<RecordType>;
getVirtualizedListRef?: GetVirtualizedListRef;
groupBy?: GroupBy<RecordType>;
hideExpandedColumn?: boolean;
id?: string;
indentSize?: number;
keepDOM?: boolean;
loading?: boolean;
pagination?: TablePagination;
prefixCls?: string;
renderGroupSection?: RenderGroupSection;
renderPagination?: RenderPagination;
resizable?: Resizable<RecordType>;
rowExpandable?: RowExpandable<RecordType>;
rowKey?: RowKey<RecordType>;
rowSelection?: RowSelection<RecordType>;
scroll?: Scroll;
showHeader?: boolean;
size?: Size;
style?: React.CSSProperties;
title?: Title<RecordType>;
virtualized?: Virtualized;
onChange?: OnChange<RecordType>;
onExpand?: OnExpand<RecordType>;
onExpandedRowsChange?: OnExpandedRowsChange<RecordType>;
onGroupedRow?: OnGroupedRow<RecordType>;
onHeaderRow?: OnHeaderRow<RecordType>;
onRow?: OnRow<RecordType>;
sticky?: Sticky;
direction?: Direction;
}
export interface ColumnProps<RecordType extends Record<string, any> = any> {
[x: string]: any;
align?: Align;
children?: Array<ColumnProps<RecordType>>;
className?: string;
colSpan?: number;
/** use `dataIndex` to get current column data item from record. If you use `sorter` or `onFilter`, a unique `dataIndex` is required */
dataIndex?: string;
defaultFilteredValue?: any[];
defaultSortOrder?: SortOrder;
filterChildrenRecord?: boolean;
filterDropdown?: ColumnFilterProps['filterDropdown'];
/** render filter Dropdown panel content */
renderFilterDropdown?: ColumnFilterProps['renderFilterDropdown'];
/** filter Dropdown props */
filterDropdownProps?: ColumnFilterProps['filterDropdownProps'];
filterDropdownVisible?: boolean;
filterIcon?: FilterIcon;
filterMultiple?: boolean;
filteredValue?: any[];
/** `filters` is not required if you use `renderFilterDropdown` */
filters?: Filter[];
fixed?: Fixed;
/** the key required by React. If you have already set the `dataIndex`, the key does not need to be set again. */
key?: string | number;
render?: ColumnRender<RecordType>;
renderFilterDropdownItem?: RenderFilterDropdownItem;
sortChildrenRecord?: boolean;
sortOrder?: SortOrder;
/** enable sorting, `dataIndex` is required at the same time */
sorter?: Sorter<RecordType>;
sortIcon?: SortIcon;
title?: ColumnTitle;
useFullRender?: boolean;
width?: string | number;
onCell?: OnCell<RecordType>;
/** enable filtering, `dataIndex` is required at the same time */
onFilter?: OnFilter<RecordType>;
onFilterDropdownVisibleChange?: OnFilterDropdownVisibleChange;
onHeaderCell?: OnHeaderCell<RecordType>;
ellipsis?: BaseEllipsis;
resize?: boolean;
showSortTip?: boolean;
/**
* self control whether to update cell for performance reasons
*/
shouldCellUpdate?: (props: TableCellProps, prevProps: TableCellProps) => boolean;
}
export type Align = BaseAlign;
export type SortOrder = BaseSortOrder;
export type SortIcon = (props: {
sortOrder: SortOrder;
}) => ReactNode;
export type FilterIcon = boolean | React.ReactNode | FilterIconRenderFunction;
export interface Filter extends BaseFilter {
value?: any;
text?: React.ReactNode;
children?: Filter[];
}
export type Fixed = BaseFixed;
export type OnCell<RecordType> = (record?: RecordType, rowIndex?: number) => OnCellReturnObject;
export type OnFilter<RecordType> = (filteredValue?: any, record?: RecordType) => boolean;
export type OnFilterDropdownVisibleChange = (visible?: boolean) => void;
export type OnHeaderCell<RecordType> = (record?: RecordType, columnIndex?: number, index?: number) => OnHeaderCellReturnObject;
export type ColumnRender<RecordType> = (text: any, record: RecordType, index: number, options?: RenderOptions) => ColumnRenderReturnType;
export type RenderFilterDropdownItem = (itemInfo?: FilterDropdownItem) => ReactNode;
export type Sorter<RecordType> = BaseSorter<RecordType>;
export type ColumnTitle = React.ReactNode | ((ColumnTitleProps?: ColumnTitleProps) => React.ReactNode);
export type FilterIconRenderFunction = (filtered: boolean) => React.ReactNode;
export type ColumnTitleProps = {
sorter?: React.ReactNode;
filter?: React.ReactNode;
selection?: React.ReactNode;
};
export type ColumnRenderReturnType = React.ReactNode | RenderReturnObject;
export interface RenderReturnObject {
[x: string]: any;
children: React.ReactNode;
props: {
[x: string]: any;
colSpan?: number;
rowSpan?: number;
};
}
export interface FilterDropdownItem {
[x: string]: any;
value?: any;
text?: React.ReactNode;
onChange?: React.MouseEventHandler<HTMLLIElement>;
level?: number;
filterMultiple?: boolean;
checked?: boolean;
}
export interface RenderOptions {
expandIcon?: React.ReactNode;
selection?: React.ReactNode;
indentText?: React.ReactNode;
}
export interface OnCellReturnObject extends React.TdHTMLAttributes<HTMLElement> {
[x: string]: any;
style?: React.CSSProperties;
className?: string;
onClick?: (e: React.MouseEvent) => void;
}
export interface OnHeaderCellReturnObject extends React.ThHTMLAttributes<HTMLElement> {
[x: string]: any;
style?: React.CSSProperties;
className?: string;
onClick?: (e: React.MouseEvent) => void;
}
interface OnRowReturnOmit {
ref?: React.RefObject<any>;
}
export interface OnRowReturnObject extends Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLTableRowElement>, HTMLTableRowElement>, keyof OnRowReturnOmit> {
[x: string]: any;
className?: string;
style?: React.CSSProperties;
onClick?: (e: React.MouseEvent) => void;
}
export interface OnGroupedRowReturnObject extends React.HTMLAttributes<HTMLTableRowElement> {
[x: string]: any;
style?: React.CSSProperties;
onClick?: (e: React.MouseEvent) => void;
}
export type OnHeaderRowReturnObject = Omit<React.HTMLAttributes<HTMLTableRowElement>, 'ref' | 'style'>;
export interface Scroll {
x?: number | string;
y?: number | string;
scrollToFirstRowOnChange?: boolean;
}
export interface Data {
[x: string]: any;
key?: string | number;
}
export type TableComponent<P> = React.ComponentType<P> | React.ForwardRefExoticComponent<P> | keyof React.ReactHTML;
export interface TableComponents {
table?: TableComponent<any>;
header?: {
outer?: TableComponent<any>;
wrapper?: TableComponent<any>;
row?: TableComponent<any>;
cell?: TableComponent<any>;
};
body?: {
outer?: TableComponent<any>;
wrapper?: TableComponent<any>;
row?: TableComponent<any>;
cell?: TableComponent<any>;
colgroup?: {
wrapper?: TableComponent<any>;
col?: TableComponent<any>;
};
};
footer?: {
wrapper?: TableComponent<any>;
row?: TableComponent<any>;
cell?: TableComponent<any>;
outer?: TableComponent<any>;
};
}
export interface RowSelectionProps<RecordType> {
className?: string;
disabled?: boolean;
fixed?: Fixed;
getCheckboxProps?: GetCheckboxProps<RecordType>;
hidden?: boolean;
selectedRowKeys?: (string | number)[];
title?: ReactNode;
width?: string | number;
onChange?: RowSelectionOnChange<RecordType>;
onSelect?: RowSelectionOnSelect<RecordType>;
onSelectAll?: RowSelectionOnSelectAll<RecordType>;
onCell?: ColumnProps['onCell'];
onHeaderCell?: ColumnProps['onHeaderCell'];
renderCell?: RowSelectionRenderCell<RecordType>;
/**
* self control whether to update cell for performance reasons
*/
shouldCellUpdate?: (props: TableCellProps, prevProps: TableCellProps) => boolean;
}
export type RowSelectionRenderCell<RecordType> = (renderCellArgs: {
selected: boolean;
record: RecordType;
originNode: JSX.Element;
inHeader: boolean;
disabled: boolean;
indeterminate: boolean;
index?: number;
selectRow?: (selected: boolean, e: Event) => void;
selectAll?: (selected: boolean, e: Event) => void;
}) => ReactNode;
export type GetCheckboxProps<RecordType> = (record: RecordType) => Omit<CheckboxProps, 'defaultChecked' | 'checked' | 'indeterminate' | 'onChange'>;
export type RowSelectionOnChange<RecordType> = (selectedRowKeys?: (string | number)[], selectedRows?: RecordType[]) => void;
export type RowSelectionOnSelect<RecordType> = (record?: RecordType, selected?: boolean, selectedRows?: RecordType[], nativeEvent?: React.MouseEvent) => void;
export type RowSelectionOnSelectAll<RecordType> = (selected?: boolean, selectedRows?: RecordType[], changedRows?: RecordType[]) => void;
export type ExpandIcon = ((expanded?: boolean) => React.ReactNode) | React.ReactNode;
export type ExpandedRowRender<RecordType> = (record?: RecordType, index?: number, expanded?: boolean) => React.ReactNode;
export type Footer<RecordType> = ReactNode | ((pageData?: RecordType[]) => React.ReactNode);
export type FormatPageText = ((pageInfo?: {
currentStart?: number;
currentEnd?: number;
total?: number;
}) => React.ReactNode) | boolean;
/**
* ref to react-window `VariableSizeList` instance
*
* only work when `virtualized` is truthy
*
* @see https://github.com/DefinitelyTyped/DefinitelyTyped/blob/58aabc0cfd2baf08f5f71a2712ae7baa6cb2a3ce/types/react-window/index.d.ts#L378
*/
export type GetVirtualizedListRef = (ref: MutableRefObject<{
/**
* Scroll to the specified offset (scrollTop or scrollLeft, depending on the direction prop).
*/
scrollTo(scrollOffset: number): void;
/**
* Scroll to the specified item.
*
* By default, the List will scroll as little as possible to ensure the item is visible.
* You can control the alignment of the item though by specifying a second alignment parameter. Acceptable values are:
*
* - auto (default) - Scroll as little as possible to ensure the item is visible. (If the item is already visible, it won't scroll at all.)
* - smart
* - If the item is already visible, don't scroll at all.
* - If it is less than one viewport away, scroll as little as possible so that it becomes visible.
* - If it is more than one viewport away, scroll so that it is centered within the list.
* - center - Center align the item within the list.
* - end - Align the item to the end of the list (the bottom for vertical lists or the right for horizontal lists).
* - start - Align the item to the beginning of the list (the top for vertical lists or the left for horizontal lists).
*/
scrollToItem(index: number, align?: "auto" | "smart" | "center" | "end" | "start"): void;
}>) => void;
export type GroupByFunction<RecordType> = BaseGroupByFn<RecordType>;
export type GroupBy<RecordType> = BaseGroupBy<RecordType>;
export type Size = ArrayElement<typeof strings.SIZES>;
export type Title<RecordType> = React.ReactNode | ((pageData?: RecordType[]) => React.ReactNode);
export type PaginationPosition = ArrayElement<typeof strings.PAGINATION_POSITIONS>;
export type Pagination = TablePaginationProps | boolean;
export type TablePagination = Pagination;
export interface ChangeInfoFilter<RecordType> extends BaseChangeInfoFilter<RecordType> {
filters?: Filter[];
onFilter?: OnFilter<RecordType>;
}
export type ChangeInfoSorter<RecordType> = BaseChangeInfoSorter<RecordType>;
export interface ChangeInfo<RecordType> {
pagination?: TablePaginationProps;
filters?: ChangeInfoFilter<RecordType>[];
sorter?: ChangeInfoSorter<RecordType>;
extra?: OnChangeExtra;
}
export type OnChange<RecordType> = (changeInfo: ChangeInfo<RecordType>) => void;
export type OnRow<RecordType> = (record?: RecordType, index?: number) => OnRowReturnObject;
export type OnGroupedRow<RecordType> = (record?: RecordType, index?: number) => OnGroupedRowReturnObject;
export type OnHeaderRow<RecordType> = (columns?: ColumnProps<RecordType>[], index?: number) => OnHeaderRowReturnObject;
export type OnExpandedRowsChange<RecordType> = (expandedRows?: IncludeGroupRecord<RecordType>[]) => void;
export type OnExpand<RecordType> = (expanded?: boolean, record?: IncludeGroupRecord<RecordType>, mouseEvent?: React.MouseEvent) => void;
export type RenderGroupSection = (groupKey?: string | number, group?: (string | number)[]) => ReactNode | {
[x: string]: any;
children: ReactNode;
};
export type RenderPagination = (paginationProps: TablePaginationProps) => ReactNode;
export type RowExpandable<RecordType> = (record?: RecordType) => boolean;
export type RowKey<RecordType> = BaseRowKeyType | ((record?: RecordType) => string);
export type RowSelection<RecordType> = RowSelectionProps<RecordType> | boolean;
export type VirtualizedOnScrollArgs = {
scrollDirection?: "forward" | "backward";
scrollOffset?: number;
scrollUpdateWasRequested?: boolean;
};
export type VirtualizeItemSizeRow = {
sectionRow?: boolean;
expandedRow?: boolean;
};
export type VirtualizedItemSizeFn = (index?: number, row?: VirtualizeItemSizeRow) => number;
export type VirtualizedItemSize = number | VirtualizedItemSizeFn;
export type VirtualizedOnScroll = (object: VirtualizedOnScrollArgs) => void;
export interface VirtualizedProps {
[x: string]: any;
itemSize?: VirtualizedItemSize;
onScroll?: VirtualizedOnScroll;
}
export type Virtualized = boolean | VirtualizedProps;
export interface TablePaginationProps extends BaseProps, PaginationProps {
position?: PaginationPosition;
formatPageText?: FormatPageText;
}
export type Resizable<RecordType> = ResizableProps<RecordType> | boolean;
export interface ResizableProps<RecordType> {
onResize?: ResizeFn<RecordType>;
onResizeStart?: ResizeFn<RecordType>;
onResizeStop?: ResizeFn<RecordType>;
}
export type ResizeFn<RecordType> = (column: RecordType) => RecordType;
export interface BodyScrollEvent extends React.UIEvent {
[x: string]: any;
currentTarget: any;
target: any;
}
export type BodyScrollPosition = 'both' | 'middle' | 'left' | 'right';
export type TableLocale = Locale['Table'];
export type Direction = "ltr" | "rtl";
export type IncludeGroupRecord<RecordType> = BaseIncludeGroupRecord<RecordType>;
export type Sticky = boolean | {
top?: number;
};
export {};