/** * @author linhd * @date 2021/8/6 11:05 * @description 表格 */ import React, { ReactNode } from 'react'; import { EmptyProps } from '../Empty'; import { OperateBtnProps } from '../OperateBtn'; import { PaginationFlippingArrow, PaginationLayout } from '../Pagination'; /** 任意类型 */ export interface Anyjson { [name: string]: any; } /** 请求方式枚举 */ export type MethodType = 'Post' | 'Get'; /** 排序方式枚举 asc 升序 desc 降序 not 没有 */ export type OrderType = 'asc' | 'desc' | undefined; /** 表格头部复选框选中状态 全选 / 半选 / 不选 */ export type SelectStatus = 'all' | 'half' | 'not'; /** 嵌套表格状态 */ export type ExpandableStatus = 'develop' | 'retract' | undefined; /** 对齐方式 */ export type AlignType = 'left' | 'center' | 'right'; export interface FilterEnumsProps { /** 显示名 */ displayName?: ReactNode; /** 值 */ value?: any; [name: string]: any; } /** 渲染数据参数 */ export interface HeadDataProps { /** 样式class */ className?: string; /** 数据属性 */ name?: string; /** 显示名 */ label?: ReactNode; /** 是否拖拽列 */ drag?: boolean; /** 是否排序 */ sort?: boolean; /** 渲染函数 (跟表格tableCell参数互斥) */ render?: (row: T, head?: any, val?: any, index?: number, rowIndex?: number) => ReactNode; /** 渲染操作列按钮 */ operateBtnRender?: (row: T, rowIndex: number) => OperateBtnProps; /** 对齐方式 */ align?: any; /** 是否过滤 */ filter?: boolean; /** 过滤单选,还是多选 */ filterRadio?: boolean; /** 过滤自定义渲染 * filterValue: 当前过滤值 * selectFilter: 所有项过滤值 * headData: 当前头部配置 * setFilter: 设置过滤值 * */ filterRender?: (item: { filterValue: any[]; selectFilter: { [name: string]: any[]; }; headData: HeadDataProps; /** 组装 selectFilter 值 */ setFilter: (selectFilter: { [name: string]: any[]; }) => void; }) => ReactNode; /** 过滤浮层最大宽度 */ filterMaxWidth?: string | number; /** 枚举 */ enums?: FilterEnumsProps[]; /** 是否显示字段 */ selected?: boolean; /** 禁用选择 */ disabledSelection?: boolean; /** 滚动定位方向, 必须配合width使用 */ fixed?: 'left' | 'right'; /** 宽度 */ width?: string | number; /** 超出内容显示文字还是dom */ beyondText?: boolean; /** 超出不显示... */ autoTips?: boolean; /** 提示最大宽度 */ tipMaxWidth?: number | string; /** 排序,请求才有 */ orderNum?: number; [name: string]: any; } /** 远程数据的表头显示列 */ export interface HeadDataReqProps { /** 宽度 */ width?: string | number; /** 显示名 */ displayName?: string; /** 是否显示过滤 */ filterFlag?: boolean; /** 过滤是否单选 */ filterRadioFlag?: boolean; /** 是否排序 */ orderFlag?: boolean; /** 表头是否显示该字段 */ selectedFlag?: boolean; [name: string]: any; } /** 固定列/拖拽 位置信息 */ export interface PosFixedProps { /** 是否存在左边定位 */ leftBol?: boolean; /** 是否存在右边定位 */ rightBol?: boolean; } /** 表格头部跟表格主题 文件公用参数 */ export interface TableHeadBodyPublicProps { /** 指定每行key */ rowKey?: string; /** 表头数据 */ headData?: HeadDataProps[]; /** 是否嵌套 */ expandable?: Function; /** 是否开启复选宽 */ check?: boolean; /** 是否开启单选 */ radio?: boolean; /** 对齐方式 */ align?: AlignType; /** 操作栏 */ operate?: HeadDataProps; /** 是否显示列 里面 不显示 */ showColumns?: 'inside' | false; /** 是否等分表格,出滚动条 */ fixedTable?: boolean; /** 是否具有固定列,必须要有宽度 */ fixedColumn?: boolean; /** 排序字段 */ orderFieldArr?: string[]; /** 排序方式 */ orderTypeArr?: OrderType[]; /** 是否排序 */ sortTable?: boolean; /** 定位位置 */ posFixed?: PosFixedProps; /** 超出内容显示文字还是dom */ beyondText?: boolean; /** 提示最大宽度 */ tipMaxWidth?: number | string; } /** 表格参数 */ export interface TableProps extends TableHeadBodyPublicProps { /** 样式class */ className?: string; /** style */ style?: React.CSSProperties; /** 表格唯一id,用来存储数据做索引 */ tableKey?: string; /** 过期时间/ 单位天 默认7天 0表示永久 */ expirationTime?: number; /** 记住列,默认记住 */ rememberColumns?: boolean; /** 空状态属性 */ emptyProps?: EmptyProps; /** 刷新表格 */ refresh?: any; /** 内置刷新 */ refreshInside?: boolean; /** 请求地址 */ url?: string; /** 请求上下文 */ ctx?: string; /** 请求方式 */ method?: MethodType; /** 本地数据源 */ data?: Anyjson | []; /** 页数 */ page?: number; /** 一页条数 */ size?: number; /** 搜索条件 */ search?: Anyjson | string; /** searchKey匹配字段,用来本地搜索 */ searchKeyName?: string[]; /** 每页显示的条数选择 */ sizeArr?: number[]; /** 是否分页 */ pagination?: boolean; /** 分页模式 */ paginationType?: 'simple' | 'complex' | PaginationLayout[]; /** 方向键layout,默认全有 */ flippingArrow?: PaginationFlippingArrow[]; /** 自适应分页,根据外容器大小,改变分页模式 */ autoPagination?: boolean; /** 渲染表格一行数据 (跟表格头部head里面的render参数互斥) */ tableCell?: (row: T, params: any) => ReactNode; /** 请求回调参数 requestCallback(data, cb) cb(data) 需要回调数据回来 */ requestCallback?: (data: any, cb: (data: any) => void) => void; /** 默认复选框选中值 */ checkDefaultValue?: T[]; /** 显示已选条数 */ checkCount?: boolean; /** 设置复选框选中值 */ setCheck?: (arr: T[], data: T) => void; /** 默认单选选中值 */ radioDefaultValue?: string | number; /** 设置单选框选中值 */ setRadio?: (val: string | number, data: T) => void; /** 多选记住分页数据 */ checkRememberPage?: boolean; /** 选择框禁用 */ disabledArr?: Array; /** 选择框禁用时的状态 true 选中, false不选中, null 不显示 */ disabledArrStatus?: { [name: string]: true | false | null; }; /** 超出内容显示文字还是dom */ beyondText?: boolean; /** 是否显示序号 true显示 HeadDataProps配置详情,跟配置列一样 */ serialNumber?: boolean | HeadDataProps; /** 是否拖动列 */ dragColumn?: boolean; /** 拖动行 */ dragRow?: boolean; /** 虚拟滚动 嵌套表格不适用 */ virtual?: boolean; /** 是否过滤 */ filter?: boolean; /** 排序 多个/单个 */ sortTableRadio?: boolean; /** 默认排序值 */ defaultSortValue?: { [name: string]: OrderType; }; /** 默认过滤值 */ defaultFilterValue?: { [name: string]: any[]; }; /** 用来计算表格行数 */ lineHeight?: number; /** 表格每列没设置宽度的默认宽度, 默认80 */ lineWidth?: number; /** 是否自动计算表格函数 */ autoSize?: boolean; /** 是否loading */ loading?: boolean; /** 加载更多 */ loadMore?: boolean; /** 加载更多自定义 */ loadMoreRender?: ReactNode; /** 默认展开项 */ expandValue?: string[]; /** 展开多个 */ expandMultiple?: boolean; /** 禁用展开项 */ disabledExpand?: string[]; /** 是否展开所有行 */ defaultExpandAllRows?: boolean; /** 处理请求参数 */ paramsCallback?: (data: any, cb: (handObj: ReqProps) => void) => void; /** 用来格式化内容 */ formatter?: (row: T, item: any, val: any, index: number, rowIndex: number) => ReactNode; /** 行class mapping */ rowClassMapping?: { [name: string]: string; }; /** 展开事件 */ onExpand?: (row: T, status: ExpandableStatus) => void; /** 点击加载更多 */ onClickMore?: () => void; /** 点击行 */ onClickRow?: (row: T, e: any) => void; /** 勾选列事件 a当前显示列 b当前点击项数据 */ onClickColumns?: (a: HeadDataProps[], b?: any) => void; /** * 本地搜索过滤事件回调 true符合条件,false过滤数据 * item当前行数据 * condition条件 * search: 查询条件 * filter: 过滤条件 */ filterSearchCallback?: (item: T, condition: { search?: any; filter?: any; }) => boolean; /** 下拉框弹窗内容 */ getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement; /** 排序(注:只试用与本地数据) * orderField: 排序字段 * orderType: 排序类型 * */ onSort?: (data: { orderField?: string[]; orderType: OrderType[]; }) => void; /** 接口错误回调 * 返回true,走组件内部错误处理 * 不返回或者返回false,走外部逻辑 * */ onError?: (err: any) => Promise | (boolean | void); /** 拖动行事件 * list: 排序后的数据 * evt: 拖拽信息,可拿到拖拽前后的数据对比 * 返回true,组件内部不设置 * */ onDragRow?: (list: T[], evt: any) => Promise | (boolean | void); /** * 表格列信息事件 * */ columnsInfoEvent?: (columnsInfo: HeadDataProps[]) => void; /** * 内部刷新事件回调 * */ onRefreshCallback?: (type: 'empty' | 'refresh') => void; [key: string]: any; } export interface ExpandableRowItem { /** 当前嵌套行id */ id?: string; /** develop | retract 当前嵌套行状态 (develop 展开) */ status?: ExpandableStatus; } /** 存放展开嵌套表格数据 */ export interface ExpandableRow { [name: string]: ExpandableRowItem; } /** 请求接口 */ export interface ReqProps { /** 请求方式 */ method: MethodType; /** 请求地址 */ url: string; /** 请求上下文 */ ctx?: string; /** 请求参数 */ data?: any; [name: string]: any; } /** 显示列LocalStorage item */ export interface HeadLocalStorageItem { /** 记住的列 */ headName: { /** true显示,false在下拉里面 */ [name: string]: boolean; }; /** 拖拽记住的列信息 */ headDataConfig: HeadDataConfigProps; /** 存储时间 */ storageTime: number; /** 过期时间 */ validity: number; } /** 显示列LocalStorage */ export interface HeadLocalStorage { [name: string]: HeadLocalStorageItem; } /** 表格头部配置 */ export interface HeadDataConfigProps { [name: string]: { width?: number; }; } /** 设置本地数据 */ export interface SetLocalStorageProps { /** 显示列 */ headArr?: HeadDataProps[]; /** 列配置 */ headDataConfig?: HeadDataConfigProps; /** 设置固定列 */ setFixed?: boolean; /** 设置拖动列 */ setDrag?: boolean; }