UNPKG

@ant-design/pro-utils

Version:
199 lines (198 loc) 7.76 kB
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>;