import type { DyFormNodeType } from './form'
// 创建自定义响应对象
// 目的：实现部分组件的需要参数的代码提示及实现响应式数据的重置
declare interface columnsType {
    /**
     * 字段属性名
     */
    prop: string
    /**
     * 表头名称
     */
    label: string
    /**
     * 是否可以勾选筛选列
     * true 禁止勾选
     * false 可以勾选
     * @default false
     */
    disableCheck: boolean
    /**
     * 内容对齐方式
     */
    align?: 'left' | 'center' | 'right'
    /**
     * 是否固定列
     */
    fixed?: boolean
    /**
     * 表头对齐方式
     */
    headAlign?: 'left' | 'center' | 'right'
    /**
     * 最小列宽
     */
    minWidth?: number
    /**
     * 是否可以拖动修改列宽
     */
    resizable?: boolean
    /**
     * 列宽
     */
    width?: number
    /**
     * 列表头注解
     */
    tip?: string
    defaultShow?: boolean
    checked?: boolean
}
/**
 * @description ctm-filter组件类型标注
 * @description tableFilterConfig.module 相关配置参数
 */
declare interface filtersModule {
    clearable?: boolean
    disabled?: boolean
    endPlaceholder?: string
    startPlaceholder?: string
    placeholder?: string
    /**
     * @description 当type=date时支持的日期类型
     */
    type?: 'year' | 'month' | 'date' | 'datetime' | 'week' | 'datetimerange' | 'daterange'
    /**
     * @description 日期类型组件输出格式和显示格式配置
     */
    format?: string
    /**
     * 设置快捷选项，需要传入数组对象
     * 日历组件快捷选项使用
     */
    shortcuts?: any
    /**
     * @description 日历区间选择时中间连接符
     */
    rangeSeparator?: string
    /**
     * @description 用于下拉组件是否开启多选
     */
    multiple?: boolean
    /**
     * 下拉组件选项
     */
    options?: any[]
    /**
     * 是否为范围选择
     * @description 适用组件 time
     */
    isRange?: boolean
    /**
     * date组件 禁用日期函数
     *
     * @param   {Date}  date  [date description]
     *
     * @return  {[type]}      [return description]
     */
    disabledDate?: (date: Date) => boolean
    /**
     * time组件禁止选中小时
     *
     * @param   {string}   role           [role description]
     * @param   {any[]}  comparingDate  [comparingDate description]
     *
     * @return  {[]}                      [return description]
     */
    disabledHours?: (role: string, comparingDate?: any) => number[]
    /**
     * time组件禁止选中分钟
     *
     * @param   {number}   hour           [hour description]
     * @param   {string}   role           [role description]
     * @param   {any[]}  comparingDate  [comparingDate description]
     *
     * @return  {[]}                      [return description]
     */
    disabledMinutes?: (hour: number, role: string, comparingDate?: any) => number[]
    /**
     * 时间组件禁止选中秒钟
     *
     * @param   {number}   hour           [hour description]
     * @param   {number}   minute         [minute description]
     * @param   {string}   role           [role description]
     * @param   {any[]}  comparingDate  [comparingDate description]
     *
     * @return  {[]}                      [return description]
     */
    disabledSeconds?: (hour: number, minute: number, role: string, comparingDate?: any) => number[]
    /**
     * 当使用select组件时对应组件change方法
     *
     * @param   {object}  form  筛选条件表单结果数据
     *
     * @return  {[type]}        [return description]
     */
    onSelect?: (form: object | undefined) => void
    /**
     * 当使用date组件时对应组件change方法
     *
     * @param   {object}  form  筛选条件表单结果数据
     *
     * @return  {[type]}        [return description]
     */
    onChange?: (form: object) => void
    /**
     * 字段默认值
     * 重置表单时会使用该值
     */
    defaultValue?: any
    clearKey?: string[]
}
/**
 * ctm-filter组件类型标注
 * @description 筛选项配置参数
 */
declare interface tableFilterConfig {
    label: string
    type: 'input' | 'select' | 'custom' | 'date' | 'time' | 'MultiInput'
    module?: filtersModule
    /**
     * 配合select或date组件使用
     *
     *
     * @description 数组第一个值对应选项值的字段名 第二个值对应选项显示的字段名
     * @default type=select [id, name]
     * @description 当type为date时并且module.type中包含range时 为开始时间字段名 结束时间字段名
     * @default type=date example:[start, end] tip:当表单中存在对应key时 会覆盖  field不存在时不进行该操作
     */
    field?: string[]
    /**
     * type=select时的选项信息
     */
    options?: any[],
    isFold?: boolean
    disabled?: boolean
    placeholder?: string
    span?: number
    isShow?: boolean | ((obj: any) => boolean)
}
/**
 * ctm-filter组件类型标注
 * @description 使用键值对方式 key为筛选项参数字段名 值为筛选项配置
 */
declare interface tableFilter {
    [key: string]: tableFilterConfig
}
/**
 * 操作列按钮组
 */
declare interface tableOperate {
    /**
     * 按钮文字
     */
    label: string
    /**
     * 按钮类型
     */
    type: 'primary' | 'success' | 'warning' | 'danger' | 'info'
    /**
     * 按钮事件
     * @return  {[type]}  [return description]
     */
    event: (row: any) => void
    /**
     * 按钮权限
     */
    auth: string[]
}
declare type settingType = 'refresh' | 'filter' | 'stripe' | 'border' | 'fullScreen' | 'lineHeight'
declare interface tableNodeType {
    /**
     * 表格列数据
     */
    columns: columnsType[]
    setting?: settingType[]
    list: any[]
    /**
     * 数据总条数
     */
    total: number
    form: object
    filter?: tableFilter
    /**
     * 操作列按钮组
     */
    operate?: tableOperate[]
    /**
     * 表格数据加载状态
     */
    loading?: boolean
}

declare interface editNodeType {
    form: object
    show: boolean
    config: DyFormNodeType[]
    title?: string
}
declare type tableSize = '' | 'large' | 'default' | 'small'
/**
 * 安装组局库的全局配置
 */
declare type DyInstallConfig = {
    /**
     * 全局配置网络请求时的头部信息
     * @description 全局配置，默认值为{}
     */
    header?: any;
    /**
     * 附件上传使用的接口路径
     */
    uploadPath?: string;
};
export * from './form'
export {
    columnsType,
    filtersModule,
    tableFilterConfig,
    tableFilter,
    tableOperate,
    settingType,
    tableNodeType,
    editNodeType,
    tableSize,
    DyInstallConfig
}