import React, { ReactNode } from 'react';
import PropTypes from 'prop-types';
import { Size } from '../../../lib/_util/enum';
import { LovConfig as DataSetLovConfig, LovConfigItem } from 'choerodon-ui/dataset/interface';
import { LovViewProps } from './LovView';
import { ModalProps } from '../modal/Modal';
import DataSet from '../data-set/DataSet';
import Record from '../data-set/Record';
import { SearchMatcher, Select, SelectProps } from '../select/Select';
import { TableQueryBarType } from '../table/enum';
import { CheckedStrategy } from '../data-set/enum';
import { SearchAction, ViewMode } from './enum';
import { ButtonProps } from '../button/Button';
import { ButtonColor, FuncType } from '../button/enum';
import { TableProps, TableQueryBarHook, TableQueryBarHookProps } from '../table/Table';
import { TextFieldProps } from '../text-field/TextField';
import { modalChildrenProps } from '../modal/interface';
export declare type Events = {
    [key: string]: Function;
};
export declare type ViewRenderer = ({ dataSet, lovConfig, textField, valueField, multiple, modal, }: {
    dataSet: DataSet;
    lovConfig: LovConfig | undefined;
    textField: string | undefined;
    valueField: string | undefined;
    multiple: boolean;
    modal?: modalChildrenProps;
}) => ReactNode;
export declare type NodeRenderer = (record: Record) => ReactNode;
export { LovConfigItem };
export interface SelectionProps {
    nodeRenderer?: NodeRenderer;
    placeholder?: string | ReactNode;
}
export interface LovConfig extends DataSetLovConfig {
    queryBar?: TableQueryBarType | TableQueryBarHook;
    tableProps?: Partial<TableProps>;
}
export interface LovProps extends SelectProps, ButtonProps {
    modalProps?: ModalProps;
    tableProps?: Partial<TableProps>;
    noCache?: boolean;
    mode?: ViewMode;
    lovEvents?: Events;
    /**
     * 触发查询变更的动作， default: input
     */
    searchAction?: SearchAction;
    /**
     * 触发查询获取记录有重复时弹出选择窗口
     * SearchAction blur 生效
     * default: false
     */
    fetchSingle?: boolean;
    /**
     * 点击查询仅存在一条数据时自动选中
     */
    autoSelectSingle?: boolean;
    showCheckedStrategy?: CheckedStrategy;
    onBeforeSelect?: (records: Record | Record[]) => boolean | undefined;
    onSearchMatcherChange?: (searchMatcher?: string) => void;
    viewRenderer?: ViewRenderer;
    nodeRenderer?: NodeRenderer;
    showSelectedInView?: boolean;
    selectionProps?: SelectionProps;
}
export default class Lov extends Select<LovProps> {
    static displayName: string;
    static propTypes: {
        modalProps: PropTypes.Requireable<object>;
        tableProps: PropTypes.Requireable<object>;
        noCache: PropTypes.Requireable<boolean>;
        fetchSingle: PropTypes.Requireable<boolean>;
        autoSelectSingle: PropTypes.Requireable<boolean>;
        /**
         * 触发查询变更的动作， default: input
         */
        searchAction: PropTypes.Requireable<SearchAction>;
        showCheckedStrategy: PropTypes.Requireable<string>;
        viewRenderer: PropTypes.Requireable<(...args: any[]) => any>;
        nodeRenderer: PropTypes.Requireable<(...args: any[]) => any>;
        showSelectedInView: PropTypes.Requireable<boolean>;
        selectionProps: PropTypes.Requireable<object>;
        id: PropTypes.Requireable<string>;
        size: PropTypes.Requireable<Size>;
        suffixCls: PropTypes.Requireable<string>;
        prefixCls: PropTypes.Requireable<string>;
        title: PropTypes.Requireable<PropTypes.ReactNodeLike>;
        disabled: PropTypes.Requireable<boolean>;
        hidden: PropTypes.Requireable<boolean>;
        autoFocus: PropTypes.Requireable<boolean>;
        accessKey: PropTypes.Requireable<string | boolean>;
        dir: PropTypes.Requireable<string>;
        contentEditable: PropTypes.Requireable<string | boolean>;
        draggable: PropTypes.Requireable<string | boolean>;
        style: PropTypes.Requireable<object>;
        className: PropTypes.Requireable<string>;
        tabIndex: PropTypes.Requireable<number>;
        lang: PropTypes.Requireable<string>;
        spellCheck: PropTypes.Requireable<boolean>;
        onFocus: PropTypes.Requireable<(...args: any[]) => any>;
        onBlur: PropTypes.Requireable<(...args: any[]) => any>;
        onClick: PropTypes.Requireable<(...args: any[]) => any>;
        onDoubleClick: PropTypes.Requireable<(...args: any[]) => any>;
        onMouseUp: PropTypes.Requireable<(...args: any[]) => any>;
        onMouseDown: PropTypes.Requireable<(...args: any[]) => any>;
        onMouseMove: PropTypes.Requireable<(...args: any[]) => any>;
        onMouseEnter: PropTypes.Requireable<(...args: any[]) => any>;
        onMouseLeave: PropTypes.Requireable<(...args: any[]) => any>;
        onMouseOver: PropTypes.Requireable<(...args: any[]) => any>;
        onMouseOut: PropTypes.Requireable<(...args: any[]) => any>;
        onContextMenu: PropTypes.Requireable<(...args: any[]) => any>;
        onKeyDown: PropTypes.Requireable<(...args: any[]) => any>;
        onKeyUp: PropTypes.Requireable<(...args: any[]) => any>;
        onKeyPress: PropTypes.Requireable<(...args: any[]) => any>;
        dataSet: PropTypes.Requireable<object>;
        funcType: PropTypes.Requireable<FuncType>;
        color: PropTypes.Requireable<ButtonColor>;
        type: PropTypes.Requireable<import("../button/enum").ButtonType>;
        loading: PropTypes.Requireable<boolean>;
        href: PropTypes.Requireable<string>;
        target: PropTypes.Requireable<string>;
        wait: PropTypes.Requireable<number>;
        waitType: PropTypes.Requireable<import("../core/enum").WaitType>;
        tooltip: PropTypes.Requireable<string>;
        block: PropTypes.Requireable<boolean>;
        _inTable: PropTypes.Requireable<boolean>;
        name: PropTypes.Requireable<string>;
        value: PropTypes.Requireable<any>;
        defaultValue: PropTypes.Requireable<any>;
        required: PropTypes.Requireable<boolean>;
        readOnly: PropTypes.Requireable<boolean>;
        form: PropTypes.Requireable<string>;
        dataIndex: PropTypes.Requireable<number>;
        multiple: PropTypes.Requireable<boolean>;
        range: PropTypes.Requireable<boolean | (string | null | undefined)[]>;
        rowSpan: PropTypes.Requireable<number>;
        newLine: PropTypes.Requireable<boolean>;
        colSpan: PropTypes.Requireable<number>;
        validator: PropTypes.Requireable<(...args: any[]) => any>;
        onInvalid: PropTypes.Requireable<(...args: any[]) => any>;
        help: PropTypes.Requireable<string>;
        showHelp: PropTypes.Requireable<import("../field/enum").ShowHelp>;
        renderer: PropTypes.Requireable<(...args: any[]) => any>;
        validationRenderer: PropTypes.Requireable<(...args: any[]) => any>;
        maxTagPlaceholder: PropTypes.Requireable<string | number | boolean | {} | PropTypes.ReactElementLike | PropTypes.ReactNodeArray>;
        maxTagCount: PropTypes.Requireable<number>;
        maxTagTextLength: PropTypes.Requireable<number>;
        pristine: PropTypes.Requireable<boolean>;
        trim: PropTypes.Requireable<import("../data-set/enum").FieldTrim>;
        onBeforeChange: PropTypes.Requireable<(...args: any[]) => any>;
        onChange: PropTypes.Requireable<(...args: any[]) => any>;
        onInput: PropTypes.Requireable<(...args: any[]) => any>;
        onEnterDown: PropTypes.Requireable<(...args: any[]) => any>;
        fieldClassName: PropTypes.Requireable<string>;
        highlight: PropTypes.Requireable<string | number | boolean | {} | PropTypes.ReactElementLike | PropTypes.ReactNodeArray>;
        highlightRenderer: PropTypes.Requireable<(...args: any[]) => any>;
        useColon: PropTypes.Requireable<boolean>;
        showValidation: PropTypes.Requireable<string>;
        placeholder: PropTypes.Requireable<string | (string | null | undefined)[]>;
        minLength: PropTypes.Requireable<number>;
        maxLength: PropTypes.Requireable<number>;
        pattern: PropTypes.Requireable<string | object>;
        autoComplete: PropTypes.Requireable<string>;
        prefix: PropTypes.Requireable<PropTypes.ReactNodeLike>;
        suffix: PropTypes.Requireable<PropTypes.ReactNodeLike>;
        clearButton: PropTypes.Requireable<boolean>;
        addonBefore: PropTypes.Requireable<PropTypes.ReactNodeLike>;
        addonBeforeStyle: PropTypes.Requireable<object>;
        addonAfter: PropTypes.Requireable<PropTypes.ReactNodeLike>;
        addonAfterStyle: PropTypes.Requireable<object>;
        restrict: PropTypes.Requireable<string | object>;
        isFlat: PropTypes.Requireable<boolean>;
        valueChangeAction: PropTypes.Requireable<import("../text-field/enum").ValueChangeAction>;
        groupClassName: PropTypes.Requireable<string>;
        showLengthInfo: PropTypes.Requireable<boolean>;
        border: PropTypes.Requireable<boolean>;
        popupContent: PropTypes.Requireable<string | number | boolean | {} | PropTypes.ReactElementLike | PropTypes.ReactNodeArray>;
        popupCls: PropTypes.Requireable<string>;
        popupStyle: PropTypes.Requireable<object>;
        popupPlacement: PropTypes.Requireable<string>;
        trigger: React.Requireable<any>;
        triggerShowDelay: PropTypes.Requireable<number>;
        triggerHiddenDelay: PropTypes.Requireable<number>;
        onPopupHiddenChange: PropTypes.Requireable<(...args: any[]) => any>;
        getPopupContainer: PropTypes.Requireable<(...args: any[]) => any>;
        getPopupAlignTarget: PropTypes.Requireable<(...args: any[]) => any>;
        tabIntoPopupContent: PropTypes.Requireable<boolean>;
        viewMode: PropTypes.Requireable<string>;
        combo: PropTypes.Requireable<boolean>;
        commonItem: PropTypes.Requireable<any[]>;
        maxCommonTagPlaceholder: PropTypes.Requireable<string | number | boolean | {} | PropTypes.ReactElementLike | PropTypes.ReactNodeArray>;
        maxCommonTagCount: PropTypes.Requireable<number>;
        maxCommonTagTextLength: PropTypes.Requireable<number>;
        searchable: PropTypes.Requireable<boolean>;
        searchMatcher: PropTypes.Requireable<string | ((...args: any[]) => any)>;
        paramMatcher: PropTypes.Requireable<string | ((...args: any[]) => any)>;
        primitiveValue: PropTypes.Requireable<boolean>;
        optionRenderer: PropTypes.Requireable<(...args: any[]) => any>;
        notFoundContent: PropTypes.Requireable<PropTypes.ReactNodeLike>;
        pagingOptionContent: PropTypes.Requireable<PropTypes.ReactNodeLike>;
        onOption: PropTypes.Requireable<(...args: any[]) => any>;
        dropdownMatchSelectWidth: PropTypes.Requireable<boolean>;
        selectAllButton: PropTypes.Requireable<boolean | ((...args: any[]) => any)>;
        reverse: PropTypes.Requireable<boolean>;
        optionTooltip: PropTypes.Requireable<string>;
        defaultActiveFirstOption: PropTypes.Requireable<boolean>;
    };
    static defaultProps: {
        clearButton: boolean;
        checkValueOnOptionsChange: boolean;
        dropdownMatchSelectWidth: boolean;
        searchAction: SearchAction;
        fetchSingle: boolean;
        viewMode: string;
        suffixCls: string;
        combo: boolean;
        onOption: ({ record }: {
            record: any;
        }) => {
            disabled: any;
        };
        selectAllButton: boolean;
        popupPlacement: string;
        triggerShowDelay: number;
        triggerHiddenDelay: number;
        multiple: boolean;
        border: boolean;
        valueChangeAction: import("../text-field/enum").ValueChangeAction;
        waitType: import("../core/enum").WaitType;
        readOnly: boolean;
        disabled: boolean;
        noValidate: boolean;
        trim: import("../data-set/enum").FieldTrim;
    };
    modal: any;
    fetched?: boolean;
    searching?: boolean;
    get searchMatcher(): SearchMatcher;
    get searchable(): boolean;
    get lovCode(): string | undefined;
    get popup(): boolean;
    /**
     * 点击查询仅存在一条数据时自动选中
     */
    get autoSelectSingle(): boolean | undefined;
    get options(): DataSet;
    get showSelectedInView(): boolean;
    getSearchFieldProps(): TextFieldProps;
    isSearchFieldInPopup(): boolean | undefined;
    isEditable(): boolean;
    handleSearchMatcherChange(searchMatcher: any): void;
    renderSearchFieldPrefix(props?: TableQueryBarHookProps): ReactNode;
    getPopupLovView(): JSX.Element | undefined;
    getPopupContent(): ReactNode;
    beforeOpen(options: DataSet): Partial<LovViewProps> | undefined;
    afterOpen(options: DataSet, fetchSingle?: boolean): void;
    private openModal;
    getModalClassName(modalProps: Partial<ModalProps>): string;
    setText(text?: string): void;
    /**
     * 处理 Lov input 查询参数
     * @param text
     */
    searchRemote(text?: string | string[] | undefined): void;
    handlePopupHiddenChange(hidden: boolean): void;
    handleLovViewClose(): void;
    /**
     * 关闭弹窗移除时间监听 后续废弃
     */
    handleLovViewAfterClose(): void;
    handleLovViewSelect(records: Record | Record[]): void;
    resetOptions(noCache?: boolean): boolean;
    handleKeyDown(e: any): void;
    handleBlur(e: any): void;
    getWrapperProps(): any;
    getPopupClassName(defaultClassName: string | undefined): string | undefined;
    syncValueOnBlur(value: any): void;
    getConfig(): DataSetLovConfig | undefined;
    getPlaceholders(): string[];
    getModalProps(): Partial<ModalProps>;
    getTableProps(): Partial<TableProps>;
    selectSingle(): Promise<void>;
    handleOpenModal(): void | Promise<void>;
    getOmitPropsKeys(): string[];
    getButtonProps(): ButtonProps;
    get loading(): boolean;
    getSuffix(): ReactNode;
    componentWillUnmount(): void;
    select(): void;
    handleButtonClick(e: any): void | Promise<void>;
    renderWrapper(): ReactNode;
}
