199 lines
7.6 KiB
TypeScript
199 lines
7.6 KiB
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>;
|