import React, { ReactNode } from 'react';
import { Moment } from "moment";
export interface IBasicFormColumnsProps {
    title: string | ReactNode;
    subTitle: string;
    dataIndex: string;
    width: number;
    align: string;
    renderText?: (text: string | number) => React.ReactNode | React.ReactNode[];
    render?: (text: string | number, record: any) => React.ReactNode;
    /** form 表单数据 dataSource 表体数据 updateDataSource 改变表体数据方法  */
    renderSelfForm?: (form: any, dataSource?: any[], updateDataSource?: (updateDataSource: any[]) => void) => React.ReactNode;
}
declare type PageType = {
    limit: number;
    offset: number;
};
/**
 * 表单的配置列 (Parameters 具体看下面的代码吧，代码里有提示类型）<br/>
 * 搭配 SingTable, SingleMultiHeaderTable， HeaderAndBodyTable 体系的表单，搭配 BasicTaskForm, BasicFormOperatorTable 使用<br/>
 * 使用时 创建一个对象 BasicFormColumns 即可
 */
export default class BasicFormColumns {
    private needColumns;
    private formColumns;
    constructor(initColumns: object[]);
    /**
     * 配置业务模块 需要的所有列
     * @param needColumns
     */
    setNeedColumns: (needColumns: object[]) => void;
    /**
     * 获得业务模块需要的列, 此方法作为配置的最后使用
     *  cols.配置一系列方法后 必须调用 getNeedColumns() 才能获得最终的数据
     * @public
     */
    getNeedColumns: () => object[];
    /**
     * 初始化 表格数据
     * @param columns 必须是 new BasicFormColumns(cols) cols里存在的列
     * @public
     */
    initFormColumns: (columns: Array<string | IBasicFormColumnsProps>) => this;
    /**
     * 对表单的数据进行 分组展示 带标题
     * 一般是按照业务的需求将需要填报的列放到一起展示 并给出标题 默认是 基础数据
     * @param columns
     * @public
     */
    setSplitGroupFormColumns: (columns: {
        title: string;
        columns: string[] | any[][];
        order?: number;
    }[]) => this;
    /**
     * 配置 form columns中 哪些列是日期选择模式
     * 使用到dateTs时 format统一为时间戳格式
     * @param columns
     * @public
     */
    setFormColumnToDatePicker: (columns: Array<{
        value: string;
        valueType: 'date' | 'dateRange' | 'dateTime' | 'time' | 'dateTs';
        needValueType: 'timestamp' | 'date';
        picker?: 'time' | 'date' | 'week' | 'month' | 'quarter' | 'year';
        splitKey?: '';
        defaultValue?: number;
        format?: 'Timestamp' | 'YYYY-MM-DD' | 'YYYY-MM-DD HH:mm' | 'HH:mm' | 'YYYY' | 'YYYY-MM' | 'MM-DD' | 'MM' | 'DD';
    }>) => this;
    /**
     * 配置哪些列是 获取远程数据加载的 下拉框
     * @param columns
     */
    setFormColumnToSelectRemoteApi: (columns: {
        value: string;
        valueAlias?: string;
        valueType: 'select';
        name: string;
        fetchData: (page: PageType, filters: [{
            Key: string;
            Val: string;
        }]) => Promise<any>;
        defaultValue?: string | number;
        onChange?: (value: string | [], selectedOption?: object, form?: any) => void;
    }[]) => this;
    /**
     * 配置 form columns中 哪些列是选择框Select
     * @param columns
     * @public
     */
    setFormColumnToSelect: (columns: {
        value: string;
        valueAlias?: string;
        valueType: 'radio' | 'select' | 'filterSelect' | 'radioButton' | 'multiple';
        name: string;
        data: [];
        defaultValue?: string | number;
        onChange?: (value: string | [], selectedOption?: object, form?: any) => void;
        labelInValue?: boolean;
    }[]) => this;
    /**
     * 配置 form columns中 哪些列是InputNumber的列
     * @param columns
     * @public
     */
    setFormColumnToInputNumber: (columns: Array<{
        min?: number;
        max?: number;
        /** valueType为 digit 时才生效 */
        precision?: number;
        value: string;
        valueType: 'money' | 'digit' | 'second' | 'percent' | 'longNumber';
        defaultValue?: number;
    }>) => this;
    /**
     * 行元素是自动填充加选择的模式
     * @param columns
     * @public
     */
    setFormColumnToAutoComplete: (columns: Array<{
        value: string;
        data: Array<{
            value: string;
        }>;
        defaultValue?: Moment;
    }>) => this;
    /**
     * 配置 form columns中 哪些列是TextArea 文本域的
     * 文本会独自占一行，放到所有属性的最后展示
     * @param columns
     * @public
     */
    setFormColumnToInputTextArea: (columns: Array<{
        value: string;
    }>) => this;
    /**
     * 配置 form columns中 哪些列是自定义的可以输入特殊字符的input的列
     * @param columns
     * @public
     */
    setFormColumnToSpecialInput: (columns: {
        value: string;
        valueType: string;
        valueEnum?: {
            prefix?: (updateValue: (inputVal: number | string) => void) => JSX.Element;
            suffix?: (updateValue: (inputVal: number | string) => void) => JSX.Element;
        };
    }[]) => this;
    /**
     * 配置 form columns中 哪些列是可以自定义宽度的列
     * @param columns
     * @public
     */
    setFormColumnToSelfColSpan: (columns: Array<{
        value: string;
        colSpan: number;
        labelCol?: object;
        wrapperCol?: object;
        showLabel?: boolean;
    }>) => this;
    /**
     * columns里的列是要去校验的列，也就是必填的列
     * @param columns
     * @public
     */
    needToRules: (columns: Array<string | {
        value: string;
        rules: Array<{
            required: boolean;
            validator: any;
        }>;
    }>) => this;
    /**
     * columns里的列是要需要隐藏的，即使隐藏了，但是组件仍然在，只是看不到，仍然可以赋值
     * 常用在 比如编辑页面，需要给后台传id，但是组件上不显示该 id
     * @param columns
     * @public
     */
    needToHide: (columns: string[]) => this;
    /**
     * columns里的列是需要设置成disable的列
     * @param columns
     * @public
     */
    needToDisabled: (columns: (string | {
        value: string;
        disabled: boolean;
    })[]) => this;
}
export {};
