import type { TableProps, TableColumnType, CardProps, FormInstance, PaginationProps, } from 'antd'; import type {ReactNode, RefObject, Dispatch, SetStateAction} from 'react'; import type { FormColumn } from '@/components/XinFormField/FieldRender/typings'; import type { SearchFormProps } from './SearchForm'; import type {XinFormProps, XinFormRef} from '@/components/XinForm/typings'; /** * 表单模式 */ export type FormMode = 'create' | 'update'; /** * 表格列配置 */ export type XinTableColumn = Omit, 'dataIndex'> & { hideInSearch?: boolean; hideInForm?: boolean; hideInTable?: boolean; hideInUpdate?: boolean; hideInCreate?: boolean; search?: FormColumn; } & FormColumn; /** * 表格操作栏按钮 */ export type OperateNode = { /** 删除按钮 */ del: ReactNode; /** 编辑按钮 */ edit: ReactNode; } /** * 顶部操作按钮渲染 */ export type ActionNode = { /** 新增按钮 */ add: ReactNode; /** 搜索按钮 */ search: ReactNode; /** 关键字搜索框 */ keywordSearch: ReactNode; } /** * 顶部右侧工具栏渲染 */ export type ToolBarNode = { /** 刷新按钮 */ reload: ReactNode; /** 密度设置按钮 */ columnHeight: ReactNode; /** 边框设置按钮 */ hideBorder: ReactNode; /** 列设置按钮 */ columnSetting: ReactNode; } /** * XinTable 实例 */ export interface XinTableInstance { /** 刷新表格(保持当前页) */ reload: (resetPage?: boolean) => Promise; /** 重置表格到第一页并刷新 */ reset: () => Promise; /** 获取当前数据源 */ getDataSource: () => T[]; /** 设置数据源 */ setDataSource: Dispatch>; /** 获取数据总数 */ getTotal: () => number; /** 获取加载状态 */ getLoading: () => boolean; /** 设置加载状态 */ setLoading: Dispatch>; /** 设置分页参数 */ setPageInfo: (page?: number, pageSize?: number) => void; /** 获取表单实例 */ getForm: () => XinFormRef | null | undefined; /** 获取搜索表单实例 */ getSearchForm: () => FormInstance | undefined; } export interface SorterParams { field: string; order: 'asc' | 'desc'; } /** 请求参数类型 */ export interface RequestParams extends Record { page?: number; pageSize?: number; filter?: Record; sorter?: SorterParams; keywordSearch?: string; } /** * XinTable 组件属性 */ export interface XinTableProps extends Omit, 'columns' | 'rowKey' | 'onChange' | 'pagination'> { /** API 地址 */ api: string; /** 权限名称前缀 */ accessName: string; /** 主键 */ rowKey: string; /** 列配置 */ columns: XinTableColumn[]; /** 表格 ref */ tableRef?: RefObject | null>; /** 新增按钮显示 */ addShow?: boolean; /** 编辑按钮显示 */ editShow?: boolean | ((record: T) => boolean); /** 删除按钮显示 */ deleteShow?: boolean | ((record: T) => boolean); /** 搜索栏显示 */ searchShow?: boolean; /** 表格操作列显示 */ operateShow?: boolean; /** 分页显示 */ paginationShow?: boolean; /** 快速搜索显示 */ keywordSearchShow?: boolean; /** 表单属性 */ formProps?: Omit, 'onFinish' | 'modalProps' | 'columns' | 'formRef' | 'layoutType'> | false; /** 表单属性 */ modalProps?: XinFormProps['modalProps']; /** 搜索栏属性 */ searchProps?: Omit, 'form'> | false; /** 操作栏属性 */ operateProps?: TableColumnType; /** 卡片属性 */ cardProps?: Pick; /** 分页配置 */ pagination?: Omit; /** 顶部操作栏渲染 */ actionBarRender?: ((dom: ActionNode) => ReactNode[]); /** 工具栏渲染 */ toolBarRender?: ((dom: ToolBarNode) => ReactNode[]); /** 表格操作栏渲染 */ operateRender?: ((record: T, dom: OperateNode) => ReactNode[]); /** 自定义请求 */ handleRequest?: (params: RequestParams) => Promise<{ data: T[]; total: number }>; /** 请求参数处理 */ requestParams?: (params: RequestParams) => RequestParams; /** 自定义表单请求 */ handleFinish?: (values: T, mode: FormMode, formRef: RefObject | null>, defaultValue?: T) => Promise; }