interface.ts 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. /* eslint-disable max-len */
  2. import React, { ReactNode, MutableRefObject } from 'react';
  3. import { BaseProps } from '../_base/baseComponent';
  4. import { PaginationProps } from '../pagination';
  5. import { CheckboxProps } from '../checkbox';
  6. import { DropdownProps } from '../dropdown';
  7. import { Locale } from '../locale/interface';
  8. import { ArrayElement } from '../_base/base';
  9. import { strings } from '@douyinfe/semi-foundation/table/constants';
  10. import {
  11. BaseRowKeyType,
  12. BaseSortOrder,
  13. BaseGroupBy,
  14. BaseGroupByFn,
  15. BaseFixed,
  16. BaseAlign,
  17. BaseChangeInfoSorter,
  18. BaseSorter,
  19. BaseFilter,
  20. BaseChangeInfoFilter,
  21. BaseIncludeGroupRecord
  22. } from '@douyinfe/semi-foundation/table/foundation';
  23. import { ScrollDirection, CSSDirection } from 'react-window';
  24. export interface TableProps<RecordType extends Record<string, any> = any> extends BaseProps {
  25. bordered?: boolean;
  26. children?: ReactNode;
  27. childrenRecordName?: string;
  28. className?: string;
  29. clickGroupedRowToExpand?: boolean;
  30. columns?: ColumnProps<RecordType>[];
  31. components?: TableComponents;
  32. dataSource?: RecordType[];
  33. defaultExpandAllGroupRows?: boolean;
  34. defaultExpandAllRows?: boolean;
  35. defaultExpandedRowKeys?: (string | number)[];
  36. empty?: ReactNode;
  37. expandAllGroupRows?: boolean;
  38. expandAllRows?: boolean;
  39. expandCellFixed?: Fixed;
  40. expandIcon?: ExpandIcon;
  41. expandedRowKeys?: (string | number)[];
  42. expandedRowRender?: ExpandedRowRender<RecordType>;
  43. expandRowByClick?: boolean;
  44. footer?: Footer<RecordType>;
  45. getVirtualizedListRef?: GetVirtualizedListRef;
  46. groupBy?: GroupBy<RecordType>;
  47. hideExpandedColumn?: boolean;
  48. id?: string;
  49. indentSize?: number;
  50. loading?: boolean;
  51. pagination?: Pagination;
  52. prefixCls?: string;
  53. renderGroupSection?: RenderGroupSection;
  54. renderPagination?: RenderPagination;
  55. resizable?: Resizable<RecordType>;
  56. rowExpandable?: RowExpandable<RecordType>;
  57. rowKey?: RowKey<RecordType>;
  58. rowSelection?: RowSelection<RecordType>;
  59. scroll?: Scroll;
  60. showHeader?: boolean;
  61. size?: Size;
  62. style?: React.CSSProperties;
  63. title?: Title<RecordType>;
  64. virtualized?: Virtualized;
  65. onChange?: OnChange<RecordType>;
  66. onExpand?: OnExpand<RecordType>;
  67. onExpandedRowsChange?: OnExpandedRowsChange<RecordType>;
  68. onGroupedRow?: OnGroupedRow<RecordType>;
  69. onHeaderRow?: OnHeaderRow<RecordType>;
  70. onRow?: OnRow<RecordType>;
  71. }
  72. export interface ColumnProps<RecordType extends Record<string, any> = any> {
  73. [x: string]: any;
  74. align?: Align;
  75. children?: Array<ColumnProps<RecordType>>;
  76. className?: string;
  77. colSpan?: number;
  78. dataIndex?: string;
  79. defaultSortOrder?: SortOrder;
  80. filterChildrenRecord?: boolean;
  81. filterDropdown?: React.ReactNode;
  82. filterDropdownProps?: DropdownProps;
  83. filterDropdownVisible?: boolean;
  84. filterIcon?: FilterIcon;
  85. filterMultiple?: boolean;
  86. filteredValue?: any[];
  87. filters?: Filter[];
  88. fixed?: Fixed;
  89. key?: string | number;
  90. render?: ColumnRender<RecordType>;
  91. renderFilterDropdownItem?: RenderFilterDropdownItem;
  92. sortChildrenRecord?: boolean;
  93. sortOrder?: SortOrder;
  94. sorter?: Sorter<RecordType>;
  95. title?: ColumnTitle;
  96. useFullRender?: boolean;
  97. width?: string | number;
  98. onCell?: OnCell<RecordType>;
  99. onFilter?: OnFilter<RecordType>;
  100. onFilterDropdownVisibleChange?: OnFilterDropdownVisibleChange;
  101. onHeaderCell?: OnHeaderCell<RecordType>;
  102. }
  103. export type Align = BaseAlign;
  104. export type SortOrder = BaseSortOrder;
  105. export type FilterIcon = boolean | React.ReactNode | FilterIconRenderFunction;
  106. export interface Filter extends BaseFilter {
  107. value?: any;
  108. text?: React.ReactNode;
  109. children?: Filter[];
  110. }
  111. export type Fixed = BaseFixed;
  112. export type OnCell<RecordType> = (record?: RecordType, rowIndex?: number) => OnCellReturnObject;
  113. export type OnFilter<RecordType> = (filteredValue?: any, record?: RecordType) => boolean;
  114. export type OnFilterDropdownVisibleChange = (visible?: boolean) => void;
  115. export type OnHeaderCell<RecordType> = (record?: RecordType, columnIndex?: number) => OnHeaderCellReturnObject;
  116. export type ColumnRender<RecordType> = (text: any, record: RecordType, index: number, options?: RenderOptions) => ColumnRenderReturnType;
  117. export type RenderFilterDropdownItem = (itemInfo?: FilterDropdownItem) => ReactNode;
  118. export type Sorter<RecordType> = BaseSorter<RecordType>;
  119. export type ColumnTitle = React.ReactNode | ((ColumnTitleProps?: ColumnTitleProps) => React.ReactNode);
  120. export type FilterIconRenderFunction = (filtered: boolean) => React.ReactNode;
  121. export type ColumnTitleProps = {
  122. sorter?: React.ReactNode;
  123. filter?: React.ReactNode;
  124. selection?: React.ReactNode;
  125. };
  126. export type ColumnRenderReturnType = React.ReactNode | RenderReturnObject;
  127. export interface RenderReturnObject {
  128. [x: string]: any;
  129. children: React.ReactNode;
  130. props: {
  131. [x: string]: any;
  132. colSpan?: number;
  133. rowSpan?: number;
  134. };
  135. }
  136. export interface FilterDropdownItem {
  137. [x: string]: any;
  138. value?: any;
  139. text?: React.ReactNode;
  140. onChange?: React.MouseEventHandler<HTMLLIElement>;
  141. level?: number;
  142. filterMultiple?: boolean;
  143. checked?: boolean;
  144. }
  145. export interface RenderOptions {
  146. expandIcon?: React.ReactNode;
  147. }
  148. export interface OnCellReturnObject extends React.TdHTMLAttributes<HTMLElement> {
  149. [x: string]: any;
  150. style?: React.CSSProperties;
  151. className?: string;
  152. onClick?: (e: React.MouseEvent) => void;
  153. }
  154. export interface OnHeaderCellReturnObject extends React.ThHTMLAttributes<HTMLElement> {
  155. [x: string]: any;
  156. style?: React.CSSProperties;
  157. className?: string;
  158. onClick?: (e: React.MouseEvent) => void;
  159. }
  160. interface OnRowReturnOmit {
  161. ref?: React.RefObject<any>;
  162. }
  163. export interface OnRowReturnObject extends Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLTableRowElement>, HTMLTableRowElement>, keyof OnRowReturnOmit> {
  164. [x: string]: any;
  165. className?: string;
  166. style?: React.CSSProperties;
  167. onClick?: (e: React.MouseEvent) => void;
  168. }
  169. export interface OnGroupedRowReturnObject extends Omit<React.HTMLAttributes<HTMLTableRowElement>, 'className'> {
  170. [x: string]: any;
  171. style?: React.CSSProperties;
  172. onClick?: (e: React.MouseEvent) => void;
  173. }
  174. export type OnHeaderRowReturnObject = Omit<React.HTMLAttributes<HTMLTableRowElement>, 'ref' | 'style'>;
  175. export interface Scroll {
  176. x?: number | string;
  177. y?: number | string;
  178. scrollToFirstRowOnChange?: boolean;
  179. }
  180. export interface Data {
  181. [x: string]: any;
  182. key?: string | number;
  183. }
  184. export interface TableComponents {
  185. table?: ReactNode;
  186. header?: {
  187. outer?: ReactNode;
  188. wrapper?: ReactNode;
  189. row?: ReactNode;
  190. cell?: ReactNode;
  191. };
  192. body?: {
  193. outer?: ReactNode;
  194. wrapper?: ReactNode;
  195. row?: ReactNode;
  196. cell?: ReactNode;
  197. colgroup?: {
  198. wrapper?: ReactNode;
  199. col?: ReactNode;
  200. };
  201. };
  202. footer?: {
  203. wrapper?: ReactNode;
  204. row?: ReactNode;
  205. cell?: ReactNode;
  206. outer?: ReactNode;
  207. };
  208. }
  209. export interface RowSelectionProps<RecordType> {
  210. className?: string;
  211. disabled?: boolean;
  212. fixed?: Fixed;
  213. getCheckboxProps?: GetCheckboxProps<RecordType>;
  214. hidden?: boolean;
  215. selectedRowKeys?: (string | number)[];
  216. title?: ReactNode;
  217. width?: string | number;
  218. onChange?: RowSelectionOnChange<RecordType>;
  219. onSelect?: RowSelectionOnSelect<RecordType>;
  220. onSelectAll?: RowSelectionOnSelectAll<RecordType>;
  221. }
  222. export type GetCheckboxProps<RecordType> = (record: RecordType) => CheckboxProps;
  223. export type RowSelectionOnChange<RecordType> = (selectedRowKeys?: (string | number)[], selectedRows?: RecordType[]) => void;
  224. export type RowSelectionOnSelect<RecordType> = (
  225. record?: RecordType,
  226. selected?: boolean,
  227. selectedRows?: RecordType[],
  228. nativeEvent?: React.MouseEvent
  229. ) => void;
  230. export type RowSelectionOnSelectAll<RecordType> = (selected?: boolean, selectedRows?: RecordType[], changedRows?: RecordType[]) => void;
  231. export type ExpandIcon = ((expanded?: boolean) => React.ReactNode) | React.ReactNode | boolean;
  232. export type ExpandedRowRender<RecordType> = (record?: RecordType, index?: number, expanded?: boolean) => React.ReactNode;
  233. export type Footer<RecordType> = ReactNode | ((pageData?: RecordType[]) => React.ReactNode);
  234. export type FormatPageText = ((pageInfo?: { currentStart?: number; currentEnd?: number; total?: number }) => React.ReactNode) | boolean;
  235. export type GetVirtualizedListRef = (ref: MutableRefObject<any>) => void;
  236. export type GroupByFunction<RecordType> = BaseGroupByFn<RecordType>;
  237. export type GroupBy<RecordType> = BaseGroupBy<RecordType>;
  238. export type Size = ArrayElement<typeof strings.SIZES>;
  239. export type Title<RecordType> = React.ReactNode | ((pageData?: RecordType[]) => React.ReactNode);
  240. export type PaginationPosition = ArrayElement<typeof strings.PAGINATION_POSITIONS>;
  241. export type Pagination = TablePaginationProps | boolean;
  242. export interface ChangeInfoFilter<RecordType> extends BaseChangeInfoFilter<RecordType> {
  243. filters?: Filter[];
  244. onFilter?: OnFilter<RecordType>;
  245. }
  246. export type ChangeInfoSorter<RecordType> = BaseChangeInfoSorter<RecordType>;
  247. export interface ChangeInfo<RecordType> {
  248. pagination?: TablePaginationProps;
  249. filters?: ChangeInfoFilter<RecordType>[];
  250. sorter?: ChangeInfoSorter<RecordType>;
  251. extra?: Record<string, any>;
  252. }
  253. export type OnChange<RecordType> = (changeInfo: ChangeInfo<RecordType>) => void;
  254. export type OnRow<RecordType> = (record?: RecordType, index?: number) => OnRowReturnObject;
  255. export type OnGroupedRow<RecordType> = (record?: RecordType, index?: number) => OnGroupedRowReturnObject;
  256. export type OnHeaderRow<RecordType> = (columns?: ColumnProps<RecordType>[], index?: number) => OnHeaderRowReturnObject;
  257. export type OnExpandedRowsChange<RecordType> = (expandedRows?: IncludeGroupRecord<RecordType>[]) => void;
  258. export type OnExpand<RecordType> = (expanded?: boolean, record?: IncludeGroupRecord<RecordType>, mouseEvent?: React.MouseEvent) => void;
  259. export type RenderGroupSection = (groupKey?: string | number, group?: (string | number)[]) => ReactNode | {
  260. [x: string]: any;
  261. children: ReactNode;
  262. };
  263. export type RenderPagination = (paginationProps: TablePaginationProps) => ReactNode;
  264. export type RowExpandable<RecordType> = (record?: RecordType) => boolean;
  265. export type RowKey<RecordType> = BaseRowKeyType | ((record?: RecordType) => string);
  266. export type RowSelection<RecordType> = RowSelectionProps<RecordType> | boolean;
  267. export type VirtualizedOnScrollArgs = {
  268. scrollDirection?: ScrollDirection;
  269. scrollOffset?: number;
  270. scrollUpdateWasRequested?: boolean;
  271. };
  272. export type VirtualizedMode = 'list' | 'grid';
  273. export type VirtualizedItemSizeFn = (index?: number) => number;
  274. export type VirtualizedItemSize = number | VirtualizedItemSizeFn;
  275. export type VirtualizedOnScroll = (object: VirtualizedOnScrollArgs) => void;
  276. export interface VirtualizedProps {
  277. [x: string]: any;
  278. mode?: VirtualizedMode;
  279. itemSize?: VirtualizedItemSize;
  280. onScroll?: VirtualizedOnScroll;
  281. }
  282. export type Virtualized = boolean | VirtualizedProps;
  283. export interface TablePaginationProps extends BaseProps, PaginationProps {
  284. position?: PaginationPosition;
  285. formatPageText?: FormatPageText;
  286. }
  287. export type Resizable<RecordType> = ResizableProps<RecordType> | boolean;
  288. export interface ResizableProps<RecordType> {
  289. onResize?: ResizeFn<RecordType>;
  290. onResizeStart?: ResizeFn<RecordType>;
  291. onResizeStop?: ResizeFn<RecordType>;
  292. }
  293. export type ResizeFn<RecordType> = (column: RecordType) => RecordType;
  294. export interface BodyScrollEvent extends React.UIEvent {
  295. [x: string]: any;
  296. currentTarget: any;
  297. target: any;
  298. }
  299. export type BodyScrollPosition = 'both' | 'middle' | 'left' | 'right';
  300. export type TableLocale = Locale['Table'];
  301. export type Direction = CSSDirection;
  302. export type IncludeGroupRecord<RecordType> = BaseIncludeGroupRecord<RecordType>;