import { NamePath } from '@aplus-frontend/antdv/es/form/interface';
import { DataIndex } from '@aplus-frontend/antdv/es/vc-table/interface';
import { VNode } from 'vue';
import { ApFormItemProps } from '../../ap-form';
import { ApTableValueFields, ApTableValueTypes, CommonFieldReturnType, FieldPropsType } from '../../ap-table/interface';
import { EditableTableExpose } from '../../editable-table';
import { Recordable } from '../../type';
import { AgGridColumnType, AgGridExpose, AgGridProps } from '../interface';
type DeprecatedInitialValue<FieldProps> = Omit<FieldProps, 'initialValue'> & {
    /**
     * @deprecated 此属性在可编辑表格中不生效，请勿传递
     */
    initialValue?: any;
};
export type EditableAgGridColumnType<RecordType = any, ExtraValueType = 'text', ValueType extends ApTableValueTypes = ApTableValueTypes, MergedValueType extends ExtraValueType | ValueType = ExtraValueType | ValueType> = MergedValueType extends ExtraValueType | ValueType ? Omit<AgGridColumnType<RecordType, ExtraValueType, ValueType>, 'children' | 'customRender' | 'hideInSearch' | 'customRenderFormItem' | 'fieldProps'> & {
    children?: EditableAgGridColumnType<RecordType, ExtraValueType, ValueType>[];
    /**
     * 是否可编辑
     */
    editable?: boolean | ((text: any, record: RecordType, index: number) => boolean);
    /**
     * 自定义表单，适用于内置`valueType`不满足的情况下使用
     */
    customRenderFormItem?: (config: EditableAgGridColumnType<RecordType>, fieldProps: Recordable, editable: boolean, record: RecordType) => any;
    /**
     * 指定值类型（将会用于普通列和可编辑表格的渲染）
     */
    valueType?: MergedValueType;
    /**
     * 值类型额外配置的参数（支持函数）
     */
    fieldProps?: FieldPropsType<Extract<MergedValueType, ValueType> extends never ? CommonFieldReturnType : DeprecatedInitialValue<ApTableValueFields[Extract<MergedValueType, ValueType>]>, RecordType, ExtraValueType, ValueType, MergedValueType>;
    /**
     * 自定义渲染，添加了`editable`以及`originalNode`
     * @param opt
     * @returns
     */
    customRender?: (opt: {
        value: any;
        text: any;
        record: RecordType;
        index: number;
        renderIndex: number;
        column: AgGridColumnType<RecordType>;
        editable?: boolean;
        originalNode?: VNode;
        path: (string | number)[];
    }) => any;
    /**
     * 是否渲染必填标记（只渲染标记不生成校验规则）
     */
    markRequired?: boolean;
} : never;
export type EditableAgGridProps<RecordType = any> = Omit<AgGridProps<RecordType>, 'columns' | 'dataSource' | 'onChange' | 'card' | 'request' | 'params' | 'defaultData' | 'searchForm' | 'beforeSearchSubmit' | 'manual' | 'size'> & {
    /**
     * 列配置
     */
    columns?: EditableAgGridColumnType<RecordType, any>[];
    /**
     * 表格数据v-model
     */
    value?: RecordType[];
    /**
     * 表格数据默认值（只生效一次，如果是异步数据，请使用`v-model`）
     */
    defaultValue?: RecordType[];
    'onUpdate:value'?: (value: RecordType[]) => void;
    /**
     * 数据修改时触发onChange（也包含数据的删除）
     * @param value
     * @returns
     */
    onChange?: (value: RecordType[]) => void;
    /**
     * 表格最大行数，超过行后将无法调用相关API新增
     */
    maxLength?: number;
    /**
     * 设置可编辑表格的名字，如果不传，将会使用默认值
     */
    name?: any;
    /**
     * 当字段值变更的时候触发（注意，向表单设置值并不会触发）
     * @returns
     */
    onFieldChange?: (rowIndex: number, fieldName: DataIndex, newValue: any, record: RecordType) => void;
    /**
     * 是否禁止在行操作后（添加/删除行等）避免强制更新
     * 默认情况下，表格行会在行操作后强制更新哪些受到影响的行来保证渲染始终是正确的，但这样会导致表单校验被清空、频繁更新导致渲染性能下降等问题
     * 设置为`true`后，在行操作后不会主动强制更新受影响的行，由于不再更新行，配置中如果`editable`/`fieldProps`/`customRender`等函数使用
     * 到了`rowIndex`等字段可能会出现渲染异常的问题
     * @default false
     * @since 7.19.5
     */
    supressForceRowUpdate?: boolean;
};
export type EditableAgGridExpose<RecordType = any, ModelType = RecordType[]> = Omit<EditableTableExpose<ModelType, RecordType>, 'scrollTo' | 'remove'> & {
    scrollTo: (index: number | 'end', position?: 'top' | 'bottom' | 'middle') => void;
    scrollToRow: (index: number | 'end', position?: 'top' | 'bottom' | 'middle') => void;
    scrollToColumn: (key: string, position?: 'auto' | 'start' | 'middle' | 'end') => void;
    remove: (data: RecordType | RecordType[]) => void;
    validateFieldsReturnTransformed: EditableTableExpose<ModelType, RecordType>['validateFields'];
    table: AgGridExpose;
    getRowDataByKey: (key: string | number) => RecordType | undefined;
    /**
     * 设置表格行数据(通过行key)
     * @param key
     * @param data
     * @param merge 是否进行数据的浅层合并（默认为true）
     * @returns
     */
    setRowDataByKey: (key: any, data: Partial<RecordType>, merge?: boolean) => void;
    /**
     * 刷新列单元格
     * @param columnKey
     * @param force 是否强制刷新，默认为 `true`
     * @returns
     */
    refreshColumns: (columnKey: string | string[], force?: boolean) => void;
    /**
     * 添加一条数据（通过行key）
     * @param defaultValue
     * @param key
     * @returns
     */
    addByKey: (defaultValue?: Partial<RecordType> | undefined, key?: number) => void;
};
export type EditableAgGridFormItemExpose<RecordType = any, ModelType = RecordType[]> = Omit<EditableAgGridExpose<RecordType, ModelType>, 'resetFields' | 'validateFields' | 'validateFieldsReturnTransformed'> & {
    /**
     * 校验单元格
     * @param rowId 行唯一标识
     * @param field 字段
     * @returns
     */
    validateCell: (rowId: any, field: NamePath) => any;
    /**
     * 校验列
     * @param colKey 列唯一标识
     * @returns
     */
    validateColumn: (colKey: string | number) => any;
};
export type EditableAgGridFormItemProps<RecordType = any> = Omit<EditableAgGridProps<RecordType>, 'name' | 'value' | 'onUpdate:value'> & {
    label?: string;
    /**
     * FormItem的name
     */
    name: NamePath;
    /**
     * 额外的表单项配置属性
     */
    formItem?: Partial<Omit<ApFormItemProps, 'name' | 'label'>>;
};
export {};
