import { CSSProperties, ReactNode } from 'react';
import { YSelectProps } from '../select/select.interface';
import { Moment } from 'moment';
import { FormInstance } from 'antd/lib/form';
/**
 * 时间格式
 */
declare type DateFormatType = 'YYYY' | 'YYYY-MM' | 'YYYY-MM-DD' | 'YYYY-MM-DD HH' | 'YYYY-MM-DD HH:mm' | 'YYYY-MM-DD HH:mm:ss' | 'HH' | 'HH:mm' | 'HH:mm:ss';
/**
 * 内置组件枚举列表, 配置列表必须从中选择
 */
export declare type FilterComponentType = 'Range' | 'RangeNumber' | 'Input' | 'Select' | 'Checkbox' | 'DatePicker' | 'DatePickerRangePicker' | 'InputNumber' | 'Radio' | 'TimePicker' | 'TimePickerRangePicker' | 'DatePickerLine' | 'TimePickerLine';
/**
 * action 派发动作 dispatch 的 type 类型 string
 */
declare type FilterActionType = 'fetch_api_data' | 'others';
/**
 * 内部自定义组件专用接口
 */
export interface RangeProps extends Record<string, unknown> {
    readonly placeholder?: [string, string];
    readonly onChange?: (value: any) => void | undefined;
    readonly value?: [string | undefined, string | undefined];
    readonly format?: string;
    readonly originalProps?: {
        [propName: string]: any;
    };
}
export interface OptionsItem extends Record<string, unknown> {
    value?: string | number | undefined;
    label?: string;
    disabled?: boolean;
}
/**
 * antd 原生属性
 */
export interface OriginalProps extends Record<string, unknown> {
    readonly format?: DateFormatType;
    readonly placeholder?: string | [string, string];
    readonly value?: string | number | [string | number | Moment, string | number | Moment] | DateFormatType | Moment;
    readonly min?: number;
    readonly max?: number;
    readonly checked?: boolean;
    readonly addonAfter?: string | ReactNode;
    readonly addonBefore?: string | ReactNode;
    readonly prefix?: string | ReactNode;
    readonly suffix?: string | ReactNode;
    readonly allowClear?: boolean;
    readonly maxLength?: number;
}
export interface ReturnValues {
    [propName: string]: string | number | (string | number)[] | undefined;
}
interface LabelStyle {
    textAlign?: 'left' | 'center' | 'right';
    width?: number;
}
export interface ConfigItem {
    /**
     * 内部私有属性
     * 把 type 转对应的组件
     */
    readonly _type?: ReactNode & any;
    /**
     * 是否自定义组件
     */
    readonly _custom?: boolean;
    /**
     * 是否 date,time类型组件，需要处理moment
     */
    readonly _moment?: boolean;
    /**
     * 是否来自外部开发者自己定义的render函数，true 是， false 是用内部组件
     */
    readonly _externalRender?: boolean;
    /**
     * 组件字符串映射值
     */
    readonly type?: FilterComponentType;
    /**
     * 对应的key值
     */
    readonly apiParam: string;
    /**
     * 远程请求 yselectProps 配置
     */
    readonly yselectProps?: YSelectProps<any>;
    readonly label?: string | null | (() => ReactNode);
    /**
     * 当label是字符串时，会设置自定义样式
     */
    readonly labelStyle?: LabelStyle;
    /**
     * 扩展 antd 原生属性
     */
    originalProps?: OriginalProps;
    options?: OptionsItem[];
    /**
     * configItem 配置自身
     * index 在 configItems 第几个位置
     * limitKeyChangeValue 外界必须调用该函数，change值作为第二个参数
     * unLimitKeyChangeValue 外界必须调用该函数，apiParam第一个参数，change值作为第二个参数
     */
    readonly render?: (limitKeyChangeValue: (value: any) => void, unLimitKeyChangeValue?: (apiParam: any, value?: any) => void, index?: number, configItem?: ConfigItem) => ReactNode;
}
export interface FilterTabs {
    /**
     * tab 切换时的函数
     */
    readonly okTabs?: (index: number) => void;
    /**
     * 搜索对应的后台字段
     */
    readonly apiParam: string;
    /**
     *  第几个激活
     */
    readonly activeIndex?: number;
    /**
     * 渲染列表
     */
    readonly options: OptionsItem[];
    /**
     * pararms 是搜索返回参数
     * callback 是个回调函数，调用重新发起请求数据
     */
    readonly tabBarExtraContent?: (params?: RequestParams, callback?: (isFirstPage?: boolean) => void) => ReactNode;
    readonly className?: string;
    readonly style?: CSSProperties;
}
export interface RequestParams extends Record<string, any> {
    readonly pageIndex?: number;
    readonly pageSize?: number;
}
export interface DefalutTableParams {
    /**
     * 如果 YTable 配合，初始化请求页数，默认第一页
     */
    pageIndex?: number | string;
    /**
     * 如果 YTable 配合，初始化请求每页的个数，默认每页 10 个
     */
    pageSize?: number | string;
    /**
     * 翻页时每页的key值如果不是pageSize，则传入对应的 key 值
     */
    apiPageIndex?: string;
    /**
     * 翻页时每页的key值如果不是pageSize，则传入对应的 key 值
     */
    apiPageSize?: string;
}
/**
 * beforeRequest 每次请求之前专用接口
 */
export interface BeforeRequestParams {
    readonly apiParam?: string;
    readonly index?: number;
    readonly configItem?: ConfigItem;
}
export interface YFilterProps {
    /**
     * 如果传不同 filterKey 值，内部会触发 config 列表重新渲染
     */
    filterKey?: string | number;
    /**
     * filter 内部ref属性，对外暴露所有实例方法
     */
    ref?: any;
    /**
     * form 实例上挂载所有方法
     */
    filterFormRef?: React.MutableRefObject<FormInstance>;
    /**
     * 自定义antd中form所有属性，透传
     */
    readonly formProps?: {
        className?: string;
        style?: CSSProperties;
        [propName: string]: any;
    };
    /**
     * 当超过5个时，是展开还是收起状态，默认收起状态
     * true 收起状态
     * false 展开状态
     */
    readonly defaultIsOpen?: boolean;
    /**
     * 是否去除搜索 Input 框前后空格，默认true 去除前后空格
     */
    readonly isTrim?: boolean;
    /**
     * 组件数组
     */
    readonly config?: ConfigItem[];
    /**
     * 重置后面等render
     * pararms 是搜索返回参数
     * callback 是个回调函数，调用重新发起请求数据
     */
    readonly operationExtraContent?: (params?: RequestParams, callback?: (isFirstPage?: boolean) => void) => ReactNode;
    /**
     * form表单底部render, 有场景在form和table中间有可能会添加Vdom
     * pararms 是搜索返回参数
     * callback 是个回调函数，调用重新发起请求数据
     */
    readonly formBottomExtraContent?: (params?: RequestParams, callback?: (isFirstPage?: boolean) => void) => ReactNode;
    /**
     * isFirstRequest true 是首次请求
     * isFirstRequest false 是非首次请求
     * 每次请求request之前
     *
     * BeforeRequestParams 此参数是必须项没有选集合
     */
    readonly beforeRequest?: (isFirstRequest?: boolean, params?: BeforeRequestParams[]) => void;
    /**
     * 每次请求request之前
     */
    onBeforeRequest?: () => void;
    /**
     * 发送请求体
     */
    readonly request?: any;
    /**
     * 在请求之前，必填的key值
     */
    readonly requiredRequestParams?: string[];
    /**
     * 每次请求request之后,
     * data 是每次请求的数据
     */
    readonly onAfterRequest?: (data?: any) => void;
    /**
     * 复写所有子组件 onChange 事件，对外开放
     * 接受外界传进来的数据
     */
    readonly onChange?: (apiParam: string, values: any) => void;
    /**
     * 请查看 FilterTabs
     */
    readonly tabs?: FilterTabs;
    /**
     * 如果存在tab切换时，tabs 默认是在 form 底部，
     * isTabsUnderForm = true 在底部 is
     * isTabsUnderForm = false 在上面
     */
    readonly isTabsUnderForm?: boolean;
    /**
     * tab切换时，是否重置，默认true，不重置
     */
    readonly isTabsClearParams?: boolean;
    /**
     * 在重置时，是否恢复默认value值, 默认 true
     * true 恢复自定义输入的
     * false 全部清空
     */
    readonly restoreDefaultValues?: boolean;
    /**
     * 查询按钮文字
     */
    readonly okSumbitText?: string;
    /**
     * 重置按钮文字
     */
    readonly okResetText?: string;
    /**
     * 查询按钮，扩展属性
     */
    readonly sumbitProps?: {
        [propName: string]: any;
    };
    /**
     * 重置按钮，扩展属性
     */
    readonly resetProps?: {
        [propName: string]: any;
    };
    /**
     * 查询事件
     */
    readonly okSumbit?: (params?: ReturnValues) => void;
    /**
     * 重置事件
     */
    readonly okReset?: () => void;
    /**
     * 重置时是否发出请求，默认时true发出
     */
    readonly isResetRequest?: boolean;
    /**
     * 是否显示重置按钮，默认显示
     */
    readonly visibleReset?: boolean;
    /**
     * 和组件 YTable 联动时，用户从YFilter传入的默认请求参数，存储到store
     */
    readonly defaultTableParams?: DefalutTableParams;
    /**
     * 对外提供一个函数，可以重新加载列表
     * reloadStatus true 是重第一页开始加载，false 从当前页加载
     */
    readonly onReload?: (req?: (reload?: boolean) => void) => void;
    /**
     * 全局是否要配置 label 样式
     */
    readonly isLabelStyle?: boolean;
    /**
     * isLabelStyle 为true起作用，如果 ConfigItem 配置了 labelStyle
     * 以config为准
     */
    readonly labelStyle?: LabelStyle;
    /**
     * 是否展示全屏展示按钮，默认 false 不展示
     */
    readonly isShowFullScreen?: boolean;
}
/**
 * 对外暴露filter要操作内部属性的方法接口
 */
export interface YFilterInstance {
    /**
     * apiParam 如果是 number 类型，则表示下标
     * apiParam 如果是 string 类型，则取对应key值
     */
    setFilterConfigItemOptions?: (apiParam: number | string, options: OptionsItem[]) => void;
}
export interface YFilterState {
    /**
     * 请求的状态切换
     */
    isLoading?: boolean;
    /**
     * 1. 初始化请求，是否从第一页开始请求，默认是，true; 2. 重新查询或者重置的标示动作
     */
    isReset?: boolean;
    error?: {
        /**
         * true 表示接口请求有错位
         */
        isError?: boolean;
        message?: Error | null;
    };
    /**
     * 后台返回数据对收集器
     */
    data?: any;
    /**
     * 和组件 YTable 联动时，存储两者共同参数
     */
    _data?: {
        _pageIndex?: number | string;
        _pageSize?: number | string;
    };
}
export interface FilterAction {
    /**
     * action 对应的 type 字段
     */
    type: FilterActionType;
    /**
     * 组件的state值集合
     */
    payload: {
        data: YFilterState;
    };
}
export interface FilterProviderState {
    store: any;
}
export interface FilterContextProps extends YFilterProps, FilterProviderState {
    readonly filters: {
        [propName: string]: any;
    };
    readonly tableParams: DefalutTableParams;
}
export {};
//# sourceMappingURL=filter.interface.d.ts.map