/**
 * @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: any, head?: any, val?: any, index?: number, rowIndex?: number) => ReactNode;
    /** 渲染操作列按钮 */
    operateBtnRender?: (row: any, 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;
    /** 枚举 */
    enums?: FilterEnumsProps[];
    /** 是否显示字段 */
    selected?: 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[];
    /** 分页总数渲染 */
    paginationTotalRender?: {
        /** 真实总数 */
        realTotal: number;
        /** 总数渲染 */
        render: React.ReactNode | null;
    };
    /** 方向键layout，默认全有 */
    flippingArrow?: PaginationFlippingArrow[];
    /** 自适应分页,根据外容器大小,改变分页模式 */
    autoPagination?: boolean;
    /** 渲染表格一行数据 (跟表格头部head里面的render参数互斥) */
    tableCell?: (row: any, params: any) => ReactNode;
    /** 请求回调参数 requestCallback(data, cb) cb(data) 需要回调数据回来 */
    requestCallback?: (data: any, cb: (data: any) => void) => void;
    /** 默认复选框选中值 */
    checkDefaultValue?: any[];
    /** 显示已选条数 */
    checkCount?: boolean;
    /** 设置复选框选中值 */
    setCheck?: (arr: any, data: any) => void;
    /** 默认单选选中值 */
    radioDefaultValue?: string | number;
    /** 设置单选框选中值 */
    setRadio?: (val: any, data: any) => void;
    /** 多选记住分页数据 */
    checkRememberPage?: boolean;
    /** 选择框禁用 */
    disabledArr?: Array<string | number>;
    /** 选择框禁用时的状态 true 选中, false不选中, null 不显示 */
    disabledArrStatus?: {
        [name: string]: true | false | null;
    };
    /** 超出内容显示文字还是dom */
    beyondText?: boolean;
    /** 是否显示序号 true显示 HeadDataProps配置详情,跟配置列一样 */
    serialNumber?: boolean | HeadDataProps;
    /** 是否拖动列 */
    dragColumn?: 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: any, item: any, val: any, index: number, rowIndex: number) => ReactNode;
    /** 行class mapping */
    rowClassMapping?: {
        [name: string]: string;
    };
    /** 展开事件 */
    onExpand?: (row: any, status: ExpandableStatus) => void;
    /** 点击加载更多 */
    onClickMore?: () => void;
    /** 点击行 */
    onClickRow?: (row: any, e: any) => void;
    /** 勾选列事件 a当前显示列 b当前点击项数据 */
    onClickColumns?: (a: any[], b?: any) => void;
    /**
     * 本地搜索过滤事件回调 true符合条件,false过滤数据
     * item当前行数据
     * condition条件
     *  search: 查询条件
     *  filter: 过滤条件
     */
    filterSearchCallback?: (item: any, 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> | (boolean | 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;
}
