interface.ts 13 KB

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