import { TableColumnCtx as ElTableColumns, TableProps as ElTableProps, RenderRowData } from 'element-plus'; import { VNode } from 'vue'; import { FlatResponseData } from 'zan-request'; import { PaginationProps } from './Pagination.type'; export type ApiFn = (args: FilterParams) => MaybePromise | QueryList>>; export type RowData = any; export interface TableProps extends Partial, 'defaultExpandAll' | 'tableLayout' | 'stripe' | 'showHeader' | 'height' | 'flexible' | 'lazy' | 'load' | 'treeProps' | 'spanMethod'>> { /** 表格数据, 优先级高于apiFn获取数据 */ data?: T[] | PaginatingQueryRecord; rowKey: ElTableProps['rowKey']; size?: '' | 'default' | 'large' | 'small'; /** 选择模式, 1. selection多选,对应tableColumn.selection; 2. radio单选 */ interactionMode?: '' | 'selection' | 'radio'; /** 分页器展示模式, 1. default默认 2. simple精简 */ paginationMode?: PaginationProps['mode']; paginator?: (params: Partial) => void; /** 开启懒加载tree数据 */ treeLazy?: ElTableProps['lazy']; /** 树数据拉取函数 */ treeLoad?: ElTableProps['load']; apiFn?: ConfigParams['apiFn']; apiParams?: ConfigParams['apiParams']; immediate?: ConfigParams['immediate']; columns: TableColumns[]; transformer?: ConfigParams['transformer']; loading?: boolean; showLoading?: boolean; selectValues?: ConfigParams['selectValues']; selectable?: ElTableColumns['selectable']; /** 转换接口排序条件, 如 `{order: {key: data.id, order: data.order}}` */ orderFormatter?: (data: { column: any; prop: string; order: any; }) => Record; errorMessage?: string; } export interface TableColumns extends Partial, 'align' | 'index' | 'fixed' | 'headerAlign' | 'selectable' | 'labelClassName' | 'type' | 'width' | 'minWidth' | 'sortable' | 'formatter' | 'showOverflowTooltip' | 'colSpan' | 'rowSpan' | 'renderHeader' | 'columnKey'>> { label?: string; prop?: string; headerSlot?: string | VNode; tooltip?: string; renderCell?: (rowData: RenderRowData & { index: number; size: TableProps['size']; }) => VNode | undefined; } export type TableSlots = { /** 分页器before slot */ 'pagination-before': () => void; /** 分页器after slot */ 'pagination-after': () => void; }; export interface TableEmits { /** 开始拉取数据 */ (e: 'ready'): void; /** 数据拉取成功 */ (e: 'success'): void; /** 单选、多选事件 */ (e: 'selection', value: TableDataWithCheck[]): void; } export type MaybePromise = T | Promise; export type TableDataWithCheck = T & { checked: boolean; disabled?: boolean; id?: string | number; index?: string | number; }; export type TableColumnCheck = { columnKey: string; label: string; checked: boolean; }; export type TransformedData = { data: TableDataWithCheck[]; page: number; pageSize: number; total: number; hasNextPage?: boolean; }; export type Transformer = (response: R, req: FilterParams) => TransformedData; export type TableConfig = { data?: TableDataWithCheck[] | PaginatingQueryRecord; apiFn?: A; apiParams?: Parameters[0]; transformer?: Transformer> | PaginatingQueryRecord | TableDataWithCheck[]>; columns: () => C[]; getColumnChecks: (columns: C[]) => TableColumnCheck[]; getColumns: (columns: C[], checks: TableColumnCheck[]) => C[]; onFetched?: (transformed?: TransformedData) => MaybePromise; onStarted?: () => void; immediate?: boolean; selectValues?: string[]; }; export type ConfigParams = Pick, 'apiFn' | 'columns' | 'immediate' | 'apiParams' | 'transformer' | 'selectValues' | 'data'> & { /** 数据获取后触发 */ ready?: () => void; success?: () => void; }; export type FilterParams = { pageNo?: number; pageSize?: number; } & T; export interface PaginatingCommonParams { current: number; size: number; total: number; } export interface PaginatingQueryRecord extends PaginatingCommonParams { records: T[]; } export type PaginatingQueryResult> = { code: number; body: S; [k: string]: any; }; export type QueryList = { code: number; body: T[]; [k: string]: any; };