UNPKG

crud-hook

Version:

Make CRUD operation easier.

185 lines (184 loc) 6.7 kB
import { DrawerFormProps, FormInstance, FormProps, LightFilterProps, ModalFormProps, ProCoreActionType, ProFieldValueType, ProFormColumnsType, ProFormInstance, ProFormItemProps, ProFormProps, ProRequestData, QueryFilterProps, StepFormProps, StepsFormProps, SubmitterProps } from '@ant-design/pro-components'; import { ColProps, RowProps } from 'antd'; import { default as dayjs } from 'dayjs'; /** * @beta */ export type FormSchema<T = Record<string, any>, ValueType = 'text'> = { title?: React.ReactNode | ((schema: ProFormColumnsType<T, ValueType>, type: 'form', dom: React.ReactNode) => React.ReactNode); description?: React.ReactNode; steps?: StepFormProps[]; type?: any; action?: React.MutableRefObject<ProCoreActionType | undefined>; /** * @default true * Fine-grained control over when to update */ shouldUpdate?: boolean | ((newValues: T, oldValues?: T) => boolean); } & Omit<FormProps<T>, 'onFinish'> & ProFormPropsType<T, ValueType> & CommonFormProps<T> & { open?: boolean; }; export type ProFormPropsType<T, ValueType = 'text'> = ((({ layoutType?: 'Form'; } & ProFormProps<T>) | ({ layoutType: 'DrawerForm'; } & DrawerFormProps<T>) | ({ layoutType: 'ModalForm'; } & ModalFormProps<T>) | ({ layoutType: 'QueryFilter'; } & QueryFilterProps<T>) | ({ layoutType: 'LightFilter'; } & LightFilterProps<T>) | ({ layoutType: 'StepForm'; } & StepFormProps<T>) | { layoutType: 'Embed'; }) & { columns: ProFormColumnsType<T, ValueType>[]; }) | ({ layoutType: 'StepsForm'; columns: ProFormColumnsType<T, ValueType>[][]; } & StepsFormProps<T>); export type CommonFormProps<T = Record<string, any>, U = Record<string, any>> = { /** * @name 自定义提交的配置 * * @example 不展示提交按钮和重置按钮 * submitter={false} * @example 修改重置按钮的样式,并且隐藏提交按钮 * submitter={{resetButtonProps: { type: 'dashed'},submitButtonProps: { style: { display: 'none', }}}} * * @example 修改提交按钮和重置按钮的顺序 * submitter={{ render:(props,dom)=> [...dom.reverse()]}} * * @example 修改提交和重置按钮文字 * submitter={{ searchConfig: { submitText: '提交2',resetText: '重置2'}}} */ submitter?: SubmitterProps<{ form?: FormInstance<any>; }> | false; /** * @name 表单结束后调用 * @description 支持异步操作,更加方便 * * @example onFinish={async (values) => { await save(values); return true }} */ onFinish?: (formData: T) => Promise<boolean | void>; /** * @name 表单按钮的 loading 状态 */ loading?: boolean; /** * @name 这是一个可选的属性(onLoadingChange),它接受一个名为loading的参数,类型为boolean,表示加载状态是否改变。 * 当loading状态发生变化时,将会调用一个函数,这个函数接受这个loading状态作为参数,并且没有返回值(void)。 */ onLoadingChange?: (loading: boolean) => void; /** * @name 获取 ProFormInstance * * ProFormInstance 可以用来获取当前表单的一些信息 * * @example 获取 name 的值 formRef.current.getFieldValue("name"); * @example 获取所有的表单值 formRef.current.getFieldsValue(true); */ formRef?: React.MutableRefObject<ProFormInstance<T> | undefined> | React.RefObject<ProFormInstance<T> | undefined>; /** * @name 同步结果到 url 中 * */ syncToUrl?: boolean | ((values: T, type: 'get' | 'set') => T); /** * @name 当 syncToUrl 为 true,在页面回显示时,以url上的参数为主,默认为false */ syncToUrlAsImportant?: boolean; /** * @name 额外的 url 参数 中 * */ extraUrlParams?: Record<string, any>; /** * 同步结果到 initialValues,默认为true如果为false,reset的时将会忽略从url上获取的数据 * * @name 是否将 url 参数写入 initialValues */ syncToInitialValues?: boolean; /** * 如果为 false,会原样保存。 * * @default true * @param 要不要值中的 Null 和 undefined */ omitNil?: boolean; /** * 格式化 Date 的方式,默认转化为 string * * @example dateFormatter="string" : Moment -> YYYY-MM-DD * @example dateFormatter="YYYY-MM-DD HH:mm:SS" Moment -> YYYY-MM-DD HH:mm:SS * @example dateFormatter="HH:mm:SS" Moment -> HH:mm:SS * @example dateFormatter="number" Moment -> timestamp * @example dateFormatter=false Moment -> Moment * @example dateFormatter={(value)=>value.format("YYYY-MM-DD")} */ dateFormatter?: 'string' | 'number' | ((value: dayjs.Dayjs, valueType: string) => string | number) | false; /** * @name 表单初始化成功,比如布局,label等计算完成 * @example (values)=>{ console.log(values) } */ onInit?: (values: T, form: ProFormInstance<any>) => void; /** * @name 发起网络请求的参数 * * @example params={{productId: 1}} * */ params?: U; /** * @name 发起网络请求的参数,返回值会覆盖给 initialValues * * @example async (params)=>{ return initialValues } */ request?: ProRequestData<T, U>; /** 是否回车提交 */ isKeyPressSubmit?: boolean; /** 用于控制form 是否相同的key,高阶用法 */ formKey?: string; /** * @name自动选中第一项 * @description 只对有input的类型有效 */ autoFocusFirstInput?: boolean; /** * @name 是否只读模式,对所有表单项生效 * @description 优先低于表单项的 readonly */ readonly?: boolean; } & ProFormGridConfig; export interface ProFormGridConfig { /** * open grid layout * @default false */ grid?: boolean; /** * only works when grid is enabled * * When passing the `span` attribute, the default value is empty * @default * { xs: 24 } */ colProps?: ColProps; /** * only works when grid is enabled * @default * { gutter: 8 } */ rowProps?: RowProps; } export type ProFormItemCreateConfig = { /** 自定义类型 */ valueType?: ProFieldValueType; /** 自定义 lightMode */ customLightMode?: boolean; /** Light mode 自定义的 label 模式 */ lightFilterLabelFormatter?: (value: any) => string; /** 默认的props,如果用户设置会被覆盖 */ defaultProps?: Record<string, any>; /** @name 不使用默认的宽度 */ ignoreWidth?: boolean; } & ProFormItemProps;