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 { TableCellProps } from './TableCell'; import type { VueJsxNode } from "../interface"; import { CSSProperties, DefineSetupFnComponent, HTMLAttributes, TdHTMLAttributes, ThHTMLAttributes, VNode } from 'vue'; import type { ColumnFilterProps } from './ColumnFilter'; export interface TableProps = any> extends BaseProps { bordered?: boolean; bodyWrapperRef?: any; children?: VueJsxNode; childrenRecordName?: string; className?: string; clickGroupedRowToExpand?: boolean; columns?: ColumnProps[]; components?: TableComponents; dataSource?: RecordType[]; defaultExpandAllGroupRows?: boolean; defaultExpandAllRows?: boolean; defaultExpandedRowKeys?: (string | number)[]; empty?: VueJsxNode; expandAllGroupRows?: boolean; expandAllRows?: boolean; expandCellFixed?: Fixed; expandIcon?: ExpandIcon; expandedRowKeys?: (string | number)[]; expandedRowRender?: ExpandedRowRender; expandRowByClick?: boolean; footer?: Footer; getVirtualizedListRef?: GetVirtualizedListRef; groupBy?: GroupBy; hideExpandedColumn?: boolean; id?: string; indentSize?: number; keepDOM?: boolean; loading?: boolean; pagination?: TablePagination; prefixCls?: string; renderGroupSection?: RenderGroupSection; renderPagination?: RenderPagination; resizable?: Resizable; rowExpandable?: RowExpandable; rowKey?: RowKey; rowSelection?: RowSelection; scroll?: Scroll; showHeader?: boolean; size?: Size; style?: CSSProperties; title?: Title; virtualized?: Virtualized; onChange?: OnChange; onExpand?: OnExpand; onExpandedRowsChange?: OnExpandedRowsChange; onGroupedRow?: OnGroupedRow; onHeaderRow?: OnHeaderRow; onRow?: OnRow; sticky?: Sticky; direction?: Direction; } export interface ColumnProps = any> { clickToSort?: (e: any) => any; align?: Align; children?: Array>; 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 | symbol; render?: ColumnRender; renderFilterDropdownItem?: RenderFilterDropdownItem; sortChildrenRecord?: boolean; sortOrder?: SortOrder; /** enable sorting, `dataIndex` is required at the same time */ sorter?: Sorter; sortIcon?: SortIcon; title?: ColumnTitle; useFullRender?: boolean; width?: string | number; onCell?: OnCell; /** enable filtering, `dataIndex` is required at the same time */ onFilter?: OnFilter; onFilterDropdownVisibleChange?: OnFilterDropdownVisibleChange; onHeaderCell?: OnHeaderCell; 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; }) => VueJsxNode; export type FilterIcon = boolean | VueJsxNode | FilterIconRenderFunction; export interface Filter extends BaseFilter { value?: any; text?: VueJsxNode; children?: Filter[]; } export type Fixed = BaseFixed; export type OnCell = (record?: RecordType, rowIndex?: number) => OnCellReturnObject; export type OnFilter = (filteredValue?: any, record?: RecordType) => boolean; export type OnFilterDropdownVisibleChange = (visible?: boolean) => void; export type OnHeaderCell = (record?: RecordType, columnIndex?: number, index?: number) => OnHeaderCellReturnObject; export type ColumnRender = (text: any, record: RecordType, index: number, options?: RenderOptions) => ColumnRenderReturnType; export type RenderFilterDropdownItem = (itemInfo?: FilterDropdownItem) => VueJsxNode; export type Sorter = BaseSorter; export type ColumnTitle = VueJsxNode | ((ColumnTitleProps?: ColumnTitleProps) => VueJsxNode); export type FilterIconRenderFunction = (filtered: boolean) => VueJsxNode; export type ColumnTitleProps = { sorter?: VueJsxNode; filter?: VueJsxNode; selection?: VueJsxNode; }; export type ColumnRenderReturnType = VueJsxNode | RenderReturnObject; export interface RenderReturnObject { [x: string]: any; children: VueJsxNode; props: { [x: string]: any; colSpan?: number; rowSpan?: number; }; } export interface FilterDropdownItem { [x: string]: any; value?: any; text?: VueJsxNode; onChange?: any; level?: number; filterMultiple?: boolean; checked?: boolean; } export interface RenderOptions { expandIcon?: VueJsxNode; selection?: VueJsxNode; indentText?: VueJsxNode; } export interface OnCellReturnObject extends TdHTMLAttributes { [x: string]: any; style?: CSSProperties; className?: string; onClick?: (e: MouseEvent) => void; } export interface OnHeaderCellReturnObject extends ThHTMLAttributes { [x: string]: any; style?: CSSProperties; className?: string; onClick?: (e: MouseEvent) => void; } export interface OnRowReturnObject { [x: string]: any; className?: string; style?: CSSProperties; onClick?: (e: MouseEvent) => void; } export interface OnGroupedRowReturnObject extends HTMLAttributes { [x: string]: any; style?: CSSProperties; onClick?: (e: MouseEvent) => void; } export type OnHeaderRowReturnObject = Omit; export interface Scroll { x?: number | string; y?: number | string; scrollToFirstRowOnChange?: boolean; } export interface Data { [x: string]: any; key?: string | number; } export interface TableComponents { table?: DefineSetupFnComponent; header?: { outer?: DefineSetupFnComponent; wrapper?: DefineSetupFnComponent; row?: DefineSetupFnComponent; cell?: DefineSetupFnComponent; }; body?: { outer?: DefineSetupFnComponent; wrapper?: DefineSetupFnComponent; row?: DefineSetupFnComponent; cell?: DefineSetupFnComponent; colgroup?: { wrapper?: DefineSetupFnComponent; col?: DefineSetupFnComponent; }; }; footer?: { wrapper?: DefineSetupFnComponent; row?: DefineSetupFnComponent; cell?: DefineSetupFnComponent; outer?: DefineSetupFnComponent; }; } export interface RowSelectionProps { className?: string; disabled?: boolean; fixed?: Fixed; getCheckboxProps?: GetCheckboxProps; hidden?: boolean; selectedRowKeys?: (string | number)[]; title?: VueJsxNode; width?: string | number; onChange?: RowSelectionOnChange; onSelect?: RowSelectionOnSelect; onSelectAll?: RowSelectionOnSelectAll; onCell?: ColumnProps['onCell']; onHeaderCell?: ColumnProps['onHeaderCell']; renderCell?: RowSelectionRenderCell; /** * self control whether to update cell for performance reasons */ shouldCellUpdate?: (props: TableCellProps, prevProps: TableCellProps) => boolean; } export type RowSelectionRenderCell = (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; }) => VNode; export type GetCheckboxProps = (record: RecordType) => Omit; export type RowSelectionOnChange = (selectedRowKeys?: (string | number)[], selectedRows?: RecordType[]) => void; export type RowSelectionOnSelect = (record?: RecordType, selected?: boolean, selectedRows?: RecordType[], nativeEvent?: MouseEvent) => void; export type RowSelectionOnSelectAll = (selected?: boolean, selectedRows?: RecordType[], changedRows?: RecordType[]) => void; export type ExpandIcon = ((expanded?: boolean) => VueJsxNode) | VueJsxNode; export type ExpandedRowRender = (record?: RecordType, index?: number, expanded?: boolean) => VueJsxNode; export type Footer = VueJsxNode | ((pageData?: RecordType[]) => VueJsxNode); export type FormatPageText = ((pageInfo?: { currentStart?: number; currentEnd?: number; total?: number; }) => VueJsxNode) | 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: any) => void; export type GroupByFunction = BaseGroupByFn; export type GroupBy = BaseGroupBy; export type Size = ArrayElement; export type Title = VueJsxNode | ((pageData?: RecordType[]) => VueJsxNode); export type PaginationPosition = ArrayElement; export type Pagination = TablePaginationProps | boolean; export type TablePagination = Pagination; export interface ChangeInfoFilter extends BaseChangeInfoFilter { filters?: Filter[]; onFilter?: OnFilter; } export type ChangeInfoSorter = BaseChangeInfoSorter; export interface ChangeInfo { pagination?: TablePaginationProps; filters?: ChangeInfoFilter[]; sorter?: ChangeInfoSorter; extra?: OnChangeExtra; } export type OnChange = (changeInfo: ChangeInfo) => void; export type OnRow = (record?: RecordType, index?: number) => OnRowReturnObject; export type OnGroupedRow = (record?: RecordType, index?: number) => OnGroupedRowReturnObject; export type OnHeaderRow = (columns?: ColumnProps[], index?: number) => OnHeaderRowReturnObject; export type OnExpandedRowsChange = (expandedRows?: IncludeGroupRecord[]) => void; export type OnExpand = (expanded?: boolean, record?: IncludeGroupRecord, mouseEvent?: MouseEvent) => void; export type RenderGroupSection = (groupKey?: string | number, group?: (string | number)[]) => VueJsxNode | { [x: string]: any; children: VueJsxNode; }; export type RenderPagination = (paginationProps: TablePaginationProps) => VueJsxNode; export type RowExpandable = (record?: RecordType) => boolean; export type RowKey = BaseRowKeyType | ((record?: RecordType) => string); export type RowSelection = RowSelectionProps | 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 = ResizableProps | boolean; export interface ResizableProps { onResize?: ResizeFn; onResizeStart?: ResizeFn; onResizeStop?: ResizeFn; } export type ResizeFn = (column: RecordType) => RecordType; export interface BodyScrollEvent { [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 = BaseIncludeGroupRecord; export type Sticky = boolean | { top?: number; };