/**
 * @author Hanz
 * @date 2021/10/18 下午4:20
 * @description tree interface
 */
import { ReactNode } from "react";
import { TreeProps as RcTreeProps } from 'rc-tree';
import { DataNode, EventDataNode, Key } from "rc-tree/lib/interface";
import { EmptyProps } from "../Empty";
import { ParaRequestConfig as RequestConfig } from "@iam-com/lib/http/interface";
type HasAction = (nodeData: DataNode) => boolean;
type ActionItem = boolean | {
    text: string;
    icon?: ReactNode;
    show?: HasAction;
} | HasAction;
export type CustomActionItem = {
    action: string;
    text: string;
    icon: ReactNode;
    show?: HasAction;
};
export type ActionType = 'add' | 'edit' | 'enable' | 'del' | string;
export type { DataNode };
export type IActions = boolean | {
    /** 新增 */
    add?: ActionItem;
    /** 编辑 */
    edit?: ActionItem;
    /** 启用 */
    enable?: ActionItem;
    /** 删除 */
    del?: ActionItem;
    /** 自定义actions */
    customizeActions?: CustomActionItem[];
};
export type ICheckedKeys = Key[] | {
    checked: Key[];
    halfChecked: Key[];
};
export interface TreeProps extends Omit<RcTreeProps, 'prefixCls' | 'showLine' | 'direction' | 'onCheck' | 'loadData' | 'onExpand'> {
    /** 是否展示连接线 */
    showLine?: boolean | {
        showLeafIcon: boolean;
    };
    /** className */
    className?: string;
    /** 是否支持多选 */
    multiple?: boolean;
    /** 是否自动展开父节点 */
    autoExpandParent?: boolean;
    /** Checkable状态下节点选择完全受控（父子节点选中状态不再关联）*/
    checkStrictly?: boolean;
    /** 节点前添加 Checkbox 复选框 */
    checkable?: boolean;
    /** 将树禁用 */
    disabled?: boolean;
    /** 默认展开所有树节点 */
    defaultExpandAll?: boolean;
    /** 默认展开父节点 */
    defaultExpandParent?: boolean;
    /** 默认展开指定的树节点 */
    defaultExpandedKeys?: Key[];
    /**（受控）展开指定的树节点 */
    expandedKeys?: Key[];
    /**（受控）选中复选框的树节点 */
    checkedKeys?: ICheckedKeys;
    /** 默认选中复选框的树节点 */
    defaultCheckedKeys?: Key[];
    /**（受控）设置选中的树节点 */
    selectedKeys?: Key[];
    /** 默认选中的树节点 */
    defaultSelectedKeys?: Key[];
    /** 是否可选中 */
    selectable?: boolean;
    /** 按需筛选树节点（高亮），返回 true */
    filterTreeNode?: (node: TreeNodeProps) => boolean;
    /**（受控）已经加载的节点，需要配合 loadData 使用*/
    loadedKeys?: Key[];
    /** 加载节点 loadedKey 回调 */
    onLoadedKey?: (key: Key, node?: DataNode) => void;
    /** 设置节点可拖拽（IE>8） */
    draggable?: ((node: DataNode) => boolean) | boolean;
    /** 自定义样式*/
    style?: React.CSSProperties;
    /** 是否展示 TreeNode title 前的图标，没有默认样式，如设置为 true，需要自行定义图标相关样式 */
    showIcon?: boolean;
    /** 自定义树节点图标 */
    icon?: ((nodeProps: TreeNodeProps) => ReactNode) | ReactNode;
    /** 自定义树节点的展开/折叠图标 */
    switcherIcon?: React.ReactElement<any>;
    /** 子元素 */
    children?: ReactNode;
    /** 是否节点占据一行 */
    blockNode?: boolean;
    /** 是否显示节点内置的操作按钮 */
    showActions?: IActions;
    /** 节点内置操作按钮的回调，showActions 开启时有效 */
    actionsCallback?: (nodeData: DataNode, type: ActionType, evt?: React.MouseEvent) => void;
    /** 请求url */
    url?: string;
    /** 请求上下文 */
    ctx?: string;
    /** 请求头 */
    headers?: RequestConfig['headers'];
    /** 请求参数 */
    params?: Object | null;
    /** 请求方法*/
    method?: 'GET' | 'POST' | 'Get' | 'Post' | 'get' | 'post';
    /** 请求成功后的回调 */
    requestCallback?: (treeData: any) => any;
    /** 刷新组件 */
    refresh?: number;
    /** 自定义节点 title、key、children、parentId、loadKey 的字段 */
    replaceFields?: {
        /** 标题 */
        title?: string;
        /**子节点 */
        children?: string;
        /** 节点key */
        key?: string;
        /** 父节点id */
        parentId?: string;
        /** 懒加载时key */
        loadKey?: string;
    };
    /** 节点前添加 Radio 单选框 */
    radioable?: boolean;
    /** 是否显示 radio 单选框，radioable 为 true 时有效 */
    showRadio?: boolean;
    /** 点击复选框触发 */
    onCheck?: (checkedKeys: Key[], info: any, halfCheckedKeys?: Key[]) => void;
    /** 展开/收起节点时触发 */
    onExpand?: (expandedKeys: Key[], info: {
        node: EventDataNode;
        expanded: boolean;
        nativeEvent: MouseEvent;
    }) => void;
    /** 是否异步加载数据，开启后不要传递 loadData 属性，需把数据请求放在组件内部执行 */
    asyncLoad?: boolean;
    /** 是否开启数据分页，asyncLoad 为 true 时，pagination 属性控制是否分页，分页数据格式 {list,page,size,total} */
    pagination?: boolean;
    /** 异步加载数据 */
    loadData?: (node: DataNode) => Promise<any>;
    /** 分页参数， pagination 为 true 时有效 */
    pageSize?: {
        page?: number;
        size?: number;
    };
    /** 是否开启本地数据过滤 */
    localFilter?: boolean;
    /** 本地数据过滤参数，localFilter 为 true 时有效 */
    localParams?: {
        /** 过滤字段名 */
        searchKey: string;
        /** 过滤字段值 */
        searchValue: string;
    };
    /** 本地数据过滤回调，localFilter 为 true 时有效 */
    onFilter?: (data: DataNode[]) => DataNode[];
    /** 自定义加载更多节点，asyncLoad 为 true 且 pagination 为 true 时有效 */
    loadMoreNode?: ReactNode;
    /** 请求之前参数的回调 */
    paramsCallback?: (params: {
        [name: string]: any;
    }) => any;
    /** 空状态属性 */
    emptyProps?: EmptyProps;
    /** 自定义空数据节点 */
    notFoundContent?: ReactNode;
    /** wrapperClassName */
    wrapperClassName?: string;
    /** wrapperStyle */
    wrapperStyle?: React.CSSProperties;
    /** 接口请求时显示loading */
    showLoading?: boolean;
    /** 提示最大宽度 */
    tipMaxWidth?: number | string;
    [key: string]: any;
}
export interface TreeNodeProps {
    className?: string;
    checkable?: boolean;
    disabled?: boolean;
    disableCheckbox?: boolean;
    title?: ReactNode;
    key?: Key;
    eventKey?: string;
    isLeaf?: boolean;
    checked?: boolean;
    expanded?: boolean;
    loading?: boolean;
    selected?: boolean;
    selectable?: boolean;
    icon?: ((treeNode: TreeNodeProps) => ReactNode) | ReactNode;
    children?: ReactNode;
    [key: string]: any;
}
export interface PageInfo {
    /***
     * 当前页数
     */
    page: number;
    /***
     * 每页条数
     */
    size: number;
    /***
     * 总条数
     */
    total: number;
}
