import React, { CSSProperties, KeyboardEventHandler, ReactNode } from 'react';
import PropTypes from 'prop-types';
import moment, { Moment, MomentInput } from 'moment';
import { TimeStep } from 'choerodon-ui/dataset/interface';
import TriggerField, { TriggerFieldProps } from '../trigger-field/TriggerField';
import { ValidationMessages } from '../validator/Validator';
import { ViewMode } from './enum';
import { FieldType } from '../data-set/enum';
import Field from '../data-set/Field';
import { RenderProps } from '../field/FormField';
export declare type RenderFunction = (props: object, text: string, currentDate: Moment, selected: Moment) => ReactNode;
export { TimeStep };
export declare type TimeZone = string | ((moment: Moment) => string);
export interface DatePickerProps extends TriggerFieldProps {
    /**
     * 显示模式date|dateTime|time|year|month|week
     */
    mode?: ViewMode;
    /**
     * 单元格渲染
     */
    cellRenderer?: (mode: ViewMode) => RenderFunction | undefined;
    filter?: (currentDate: Moment, selected: Moment, mode?: ViewMode) => boolean;
    min?: MomentInput | null;
    max?: MomentInput | null;
    step?: TimeStep;
    renderExtraFooter?: () => ReactNode;
    extraFooterPlacement?: 'top' | 'bottom';
    /**
     * 时区显示
     */
    timeZone?: TimeZone;
    /**
     * 编辑器在下拉框中显示
     */
    editorInPopup?: boolean;
    /**
     * 默认显示
     */
    defaultTime?: Moment | [Moment, Moment];
}
export interface DatePickerKeyboardEvent {
    handleKeyDownRight: KeyboardEventHandler<any>;
    handleKeyDownLeft: KeyboardEventHandler<any>;
    handleKeyDownDown: KeyboardEventHandler<any>;
    handleKeyDownUp: KeyboardEventHandler<any>;
    handleKeyDownEnd: KeyboardEventHandler<any>;
    handleKeyDownHome: KeyboardEventHandler<any>;
    handleKeyDownPageUp: KeyboardEventHandler<any>;
    handleKeyDownPageDown: KeyboardEventHandler<any>;
    handleKeyDownEnter: KeyboardEventHandler<any>;
}
export default class DatePicker extends TriggerField<DatePickerProps> implements DatePickerKeyboardEvent {
    static displayName: string;
    static propTypes: {
        id: PropTypes.Requireable<string>;
        size: PropTypes.Requireable<import("../core/enum").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>;
        _inTable: PropTypes.Requireable<boolean>;
        type: PropTypes.Requireable<string>;
        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>;
        wait: PropTypes.Requireable<number>;
        waitType: PropTypes.Requireable<import("../core/enum").WaitType>;
        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>;
        /**
         * 日期格式，如 `YYYY-MM-DD HH:mm:ss`
         */
        format: PropTypes.Requireable<string>;
        /**
         * 显示模式date|dateTime|time|year|month|week
         */
        mode: PropTypes.Requireable<string>;
        /**
         * 单元格渲染
         */
        cellRenderer: PropTypes.Requireable<(...args: any[]) => any>;
        /**
         * 日期过滤
         */
        filter: PropTypes.Requireable<(...args: any[]) => any>;
        /**
         * 最小日期
         */
        min: PropTypes.Requireable<any>;
        /**
         * 最大日期
         */
        max: PropTypes.Requireable<any>;
        /**
         * 时间步距
         */
        step: PropTypes.Requireable<PropTypes.InferProps<{
            hour: PropTypes.Requireable<number>;
            minute: PropTypes.Requireable<number>;
            second: PropTypes.Requireable<number>;
        }>>;
        /**
         * 时区显示
         */
        timeZone: PropTypes.Requireable<string | ((...args: any[]) => any)>;
        /**
         * 编辑器在下拉框中显示
         */
        editorInPopup: PropTypes.Requireable<boolean>;
    };
    static defaultProps: {
        suffixCls: string;
        mode: ViewMode;
        clearButton: boolean;
        popupPlacement: string;
        triggerShowDelay: number;
        triggerHiddenDelay: number;
        viewMode: string;
        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;
    };
    get value(): any | undefined;
    set value(value: any | undefined);
    get defaultValidationMessages(): ValidationMessages;
    get min(): Moment | undefined | null;
    get max(): Moment | undefined | null;
    view: DatePickerKeyboardEvent | null;
    selectedDate?: Moment;
    mode?: ViewMode;
    popupRangeEditor?: HTMLInputElement | null;
    savePopupRangeEditor(node: HTMLInputElement | null): void;
    isEditable(): boolean;
    isEditableLike(): boolean;
    getOmitPropsKeys(): string[];
    getOtherProps(): any;
    getObservableProps(props: any, context: any): any;
    defaultRenderer(props: RenderProps): ReactNode;
    getDefaultTime(): [Moment, Moment];
    getDefaultViewMode(): ViewMode.time | ViewMode.dateTime | ViewMode.week | ViewMode.date | ViewMode.date | ViewMode.month | ViewMode.year;
    getPopupClassName(defaultClassName: string | undefined): string | undefined;
    getPopupEditor(): JSX.Element | undefined;
    getPopupContent(): JSX.Element;
    getCellRenderer(mode: ViewMode): RenderFunction | undefined;
    getTriggerIconFont(): string;
    getFieldType(): FieldType;
    getViewMode(): ViewMode;
    toMoment(item: Moment | Date | string | undefined, field?: Field | undefined, noCheck?: boolean): Moment | undefined;
    checkMoment(item: any): moment.Moment | undefined;
    compare(oldValue: any, newValue: any): boolean;
    setText(text?: string): void;
    afterSetValue(): void;
    momentToTimestamp(value: any): any;
    getSelectedDate(): Moment;
    getLimit(minOrMax: 'min' | 'max'): Moment | undefined;
    getLimitWithType(limit: Moment, minOrMax: 'min' | 'max'): Moment;
    getPopupStyleFromAlign(): CSSProperties | undefined;
    handleSelectedDateChange(selectedDate: Moment, mode?: ViewMode): void;
    handelViewModeChange(mode: ViewMode): void;
    handlePopupAnimateAppear(): void;
    handlePopupAnimateEnd(key: any, exists: any): void;
    handleSelect(date: Moment, expand?: boolean): void;
    handleKeyDown(e: any): void;
    handleKeyDownHome(e: any): void;
    handleKeyDownEnd(e: any): void;
    handleKeyDownLeft(e: any): void;
    handleKeyDownRight(e: any): void;
    handleKeyDownUp(e: any): void;
    handleKeyDownDown(e: any): void;
    handleKeyDownPageUp(e: any): void;
    handleKeyDownPageDown(e: any): void;
    handleKeyDownEnter(_e: any): void;
    handleKeyDownEsc(e: any): void;
    handleKeyDownTab(): void;
    handleKeyDownSpace(e: any): void;
    handleEnterDown(e: any): void;
    prepareSetValue(...value: any[]): void;
    syncValueOnBlur(value: any): void;
    getValueKey(v: any): any;
    exchangeRangeValue(start: Moment, end: Moment): void;
    changeSelectedDate(selectedDate: Moment): void;
    isSelected(date: Moment): boolean;
    unChoose(date: Moment): void;
    /**
     *
     * @param date 返回的时间
     * @param expand 是否保持时间选择器的展开
     */
    choose(date: Moment, expand?: boolean): void;
    setRangeTarget(target: any): void;
    getValidDate(date: Moment): Moment;
    isLowerRange(m1: any, m2: any): boolean;
    isUnderRange(date: Moment, mode?: ViewMode): boolean;
    isValidDate(currentDate: Moment, selected: Moment): boolean;
    isValidNowDate(selected: Moment): boolean;
    getValidatorProp(key: string): any;
    renderLengthInfo(): ReactNode;
}
