/**
* @description: 公共EntityForm组件生成器
* @param {type}
* @return:
*/
import React from 'react'
import { FormProps } from '@ant-design/compatible/es/form';
import FromCreator, { IFormCreator } from './FormCreator'
import { IFormItem, IFormItemLayout } from './declare'
import { formLayoutEnums, FORM_TITEMS } from './enums'
import { FormLifecycle } from './FormLifecycle'
import { observable } from 'mobx';
import { Form } from '@ant-design/compatible';
export interface IFormProps extends FormProps {
// self props
}
export interface EntityFormLifecycle {
/** 表单被创建 */
onFormCreated?: (form: IFormProps['form']) => void
/** 表单组件被加载 */
onFormMount?: () => void
/** 表单组件被销毁 */
onFormDestroy?: () => void
}
declare type FormCreateOptionMessagesCallback = (...args: any[]) => string
interface FormCreateOptionMessages {
[messageId: string]: string | FormCreateOptionMessagesCallback | FormCreateOptionMessages
}
export interface IFormPresenterProps extends EntityFormLifecycle, IFormCreator {
onFieldsChange?: (props: FormProps, fields: any, allFields: any) => void
onValuesChange?: (props: FormProps, changedValues: any, allValues: any) => void
mapPropsToFields?: (props: FormProps) => void
validateMessages?: FormCreateOptionMessages
withRef?: boolean
name?: string
}
export interface IformLayout extends IFormItemLayout {
type: string
col?: number
}
export default class FormPresenter extends FormLifecycle {
@observable
protected HOCFormComponent: any
protected form: IFormProps['form']
private formItems: IFormItem[]
private initFormValues: any
private rest
private formLayout: IformLayout = {
type: formLayoutEnums.FLOW, // 默认流式布局
}
constructor(options: IFormPresenterProps) {
super()
const {
formItems,
initFormValues,
onFormCreated,
onFormDestroy,
onFormMount,
formLayout,
...rest
} = options
this.formItems = formItems?.slice(0) // 复制一份避免formItems被修改后产生bug
this.initFormValues = initFormValues
this.rest = rest
if (formLayout) {
this.formLayout = formLayout
}
/* onFormCreated */
if (onFormCreated) {
this.listener.formCreatedListener.push(onFormCreated)
}
/* onFormMount */
if (onFormMount) {
this.listener.formMountListener.push(onFormMount)
}
/* onFormDestroy */
if (onFormDestroy) {
this.listener.formDestroyListener.push(onFormDestroy)
}
if (initFormValues) {
this.initForm(this.formItems, initFormValues, rest)
}
}
protected initForm = (formItems: IFormItem[], initFormValues: any, rest?: any): void => {
const { onFieldsChange, onValuesChange } = rest
let formCreated = false
this.HOCFormComponent = Form.create({ onFieldsChange, onValuesChange })(
({ form, ...props }: any) => {
this.form = form
// rewrite validateFields method
this.__validateFieldsAndScroll(form)
this.__validateFields(form)
this.__getFieldsValue(form)
form.getFieldDecorator(FORM_TITEMS, {
initialValue: formItems,
getValueFromEvent: () => undefined,
})
if (!formCreated) {
formCreated = true
// trigger lifeCycle listener
this.triggerListener('formCreatedListener', form)
}
return (