@ant-design/pro-utils
Version:
199 lines (198 loc) • 7.76 kB
TypeScript
import type { FormInstance, FormProps } from 'antd';
import { AnyObject } from 'antd/es/_util/type';
import type { NamePath } from 'antd/lib/form/interface';
import type { GetRowKey } from 'antd/lib/table/interface';
import React from 'react';
export type RowEditableType = 'single' | 'multiple';
export type RecordKey = React.Key | React.Key[];
export declare const recordKeyToString: (rowKey: RecordKey) => React.Key;
export type AddLineOptions = {
position?: 'top' | 'bottom';
recordKey?: RecordKey;
newRecordType?: 'dataSource' | 'cache';
/** 要增加到哪个节点下,一般用于多重嵌套表格 */
parentKey?: RecordKey;
};
export type NewLineConfig<T> = {
defaultValue?: T;
options: AddLineOptions;
};
export type ActionRenderFunction<T> = (row: T, config: ActionRenderConfig<T, NewLineConfig<T>>, defaultDoms: {
save: React.ReactNode;
delete: React.ReactNode;
cancel: React.ReactNode;
}) => React.ReactNode[];
export type RowEditableConfig<DataType> = {
/** @name 控制可编辑表格的 From的设置 */
formProps?: Omit<FormProps<DataType> & {
formRef?: React.Ref<FormInstance | undefined>;
onInit?: (values: DataType, form: FormInstance) => void;
}, 'onFinish'>;
/** @name 控制可编辑表格的 form */
form?: FormInstance;
/**
* @type single | multiple
* @name 编辑的类型,支持单选和多选
*/
type?: RowEditableType;
/** @name 正在编辑的列 */
editableKeys?: React.Key[];
/** 正在编辑的列修改的时候 */
onChange?: (editableKeys: React.Key[], editableRows: DataType[] | DataType) => void;
/** 正在编辑的列修改的时候 */
onValuesChange?: (record: DataType, dataSource: DataType[]) => void;
/** @name 自定义编辑的操作 */
actionRender?: ActionRenderFunction<DataType>;
/** 行保存的时候 */
onSave?: (
/** 行 id,一般是唯一id */
key: RecordKey,
/** 当前修改的行的值,只有 form 在内的会被设置 */
record: DataType & {
index?: number;
},
/** 原始值,可以用于判断是否修改 */
originRow: DataType & {
index?: number;
},
/** 新建一行的配置,一般无用 */
newLineConfig?: NewLineConfig<DataType>) => Promise<any | void>;
/** 行取消的时候 */
onCancel?: (
/** 行 id,一般是唯一id */
key: RecordKey,
/** 当前修改的行的值,只有 form 在内的会被设置 */
record: DataType & {
index?: number;
},
/** 原始值,可以用于判断是否修改 */
originRow: DataType & {
index?: number;
},
/** 新建一行的配置,一般无用 */
newLineConfig?: NewLineConfig<DataType>) => Promise<any | void>;
/** 行删除的时候 */
onDelete?: (key: RecordKey, row: DataType & {
index?: number;
}) => Promise<any | void>;
/** 删除行时的确认消息 */
deletePopconfirmMessage?: React.ReactNode;
/** 只能编辑一行的的提示 */
onlyOneLineEditorAlertMessage?: React.ReactNode;
/** 同时只能新增一行的提示 */
onlyAddOneLineAlertMessage?: React.ReactNode;
/** Table 上设置的name,用于拼接name来获取数据 */
tableName?: NamePath;
/** 保存一行的文字 */
saveText?: React.ReactNode;
/** 取消编辑一行的文字 */
cancelText?: React.ReactNode;
/** 删除一行的文字 */
deleteText?: React.ReactNode;
/**
* 解决分页带来的 FormItem namePath 使用错误的 index 作为路径
* @link https://github.com/ant-design/pro-components/issues/7790
*/
getRealIndex?: (record: DataType) => number;
};
export type ActionTypeText<T> = {
deleteText?: React.ReactNode;
cancelText?: React.ReactNode;
saveText?: React.ReactNode;
editorType?: 'Array' | 'Map';
addEditRecord?: (row: T, options?: AddLineOptions) => boolean;
};
export type ActionRenderConfig<T, LineConfig = NewLineConfig<T>> = {
editableKeys?: RowEditableConfig<T>['editableKeys'];
recordKey: RecordKey;
preEditRowRef: React.MutableRefObject<T | null>;
index?: number;
cancelEditable: (key: RecordKey) => void;
onSave: RowEditableConfig<T>['onSave'];
onCancel: RowEditableConfig<T>['onCancel'];
onDelete?: RowEditableConfig<T>['onDelete'];
deletePopconfirmMessage: RowEditableConfig<T>['deletePopconfirmMessage'];
setEditableRowKeys: (value: React.Key[]) => void;
newLineConfig?: LineConfig;
tableName?: NamePath;
children?: React.ReactNode;
} & ActionTypeText<T>;
/**
* 使用map 来删除数据,性能一般 但是准确率比较高
*
* @param keyProps
* @param action
*/
export declare function editableRowByKey<RecordType>(keyProps: {
data: RecordType[];
childrenColumnName: string;
getRowKey: GetRowKey<RecordType>;
key: RecordKey;
row: RecordType;
}, action: 'update' | 'top' | 'delete'): RecordType[];
/**
* 保存按钮的dom
*
* @param ActionRenderConfig
*/
export declare function SaveEditableAction<T>({ recordKey, onSave, row, children, newLineConfig, editorType, tableName, }: ActionRenderConfig<T> & {
row: any;
children: any;
}, ref: React.Ref<SaveEditableActionRef<T>>): import("react/jsx-runtime").JSX.Element;
export type SaveEditableActionRef<T = any> = {
/**
* 直接触发保存动作
*
* @throws 如果校验失败,会抛出异常
* */
save: () => ReturnType<NonNullable<RowEditableConfig<T>['onSave']>> | Promise<void>;
};
/**
* 删除按钮 dom
*
* @param ActionRenderConfig
*/
export declare const DeleteEditableAction: React.FC<ActionRenderConfig<any> & {
row: any;
}>;
export declare function defaultActionRender<T>(row: T, config: ActionRenderConfig<T, NewLineConfig<T>>): {
save: import("react/jsx-runtime").JSX.Element;
saveRef: React.RefObject<SaveEditableActionRef<T>>;
delete: import("react/jsx-runtime").JSX.Element | undefined;
cancel: import("react/jsx-runtime").JSX.Element;
};
/**
* 一个方便的hooks 用于维护编辑的状态
*
* @param props
*/
export declare function useEditableArray<RecordType extends AnyObject>(props: RowEditableConfig<RecordType> & {
getRowKey: GetRowKey<RecordType>;
dataSource: RecordType[];
onValuesChange?: (record: RecordType, dataSource: RecordType[]) => void;
childrenColumnName: string | undefined;
setDataSource: (dataSource: RecordType[]) => void;
}): {
editableKeys: React.Key[] | undefined;
setEditableRowKeys: (updater: React.Key[] | ((origin: React.Key[] | undefined) => React.Key[] | undefined) | undefined, ignoreDestroy?: boolean | undefined) => void;
isEditable: (row: RecordType & {
index: number;
}) => {
recordKey: string;
isEditable: any;
preIsEditable: any;
};
actionRender: (row: RecordType & {
index: number;
}) => React.ReactNode[] | (import("react/jsx-runtime").JSX.Element | undefined)[];
startEditable: (recordKey: React.Key, record?: RecordType | undefined) => boolean;
cancelEditable: (recordKey: RecordKey, needReTry?: boolean | undefined) => Promise<true | undefined>;
addEditRecord: (row: RecordType, options?: AddLineOptions | undefined) => boolean;
saveEditable: (recordKey: RecordKey, needReTry?: boolean | undefined) => Promise<boolean>;
newLineRecord: NewLineConfig<RecordType> | undefined;
preEditableKeys: React.Key[] | undefined;
onValuesChange: (value: RecordType, values: RecordType) => void;
getRealIndex: ((record: RecordType) => number) | undefined;
};
export type UseEditableType = typeof useEditableArray;
export type UseEditableUtilType = ReturnType<UseEditableType>;