import React, { Component } from 'react';
import { Input, Select, Radio, DatePicker,Form } from 'antd';
import { PageComponent } from "../../types/index";
import * as Tools from 'jad-tool'
import classname from 'classnames'
import { checkValidateRule,getFormData } from 'jad-tool'
const createFormFieldComponent = (FormFieldContext,config) => class FormField extends React.Component< PageComponent<{
onValidateChange: (boolean)=>any
}>>{
fields = {};
validate = false;
name = config.name
public updateFieldItem(item){
const { name = null } = item;
if(!name) return
this.fields[name] = item
this.checkValidate()
}
public removeFiledItem(item){
const { name = null } = item;
if(!name) return
delete this.fields[name]
this.checkValidate()
}
public checkValidate(){
const { onValidateChange } = this.props
let error = false;
Tools.map(this.fields,(fields)=>{
if(error) return
const { rule ,value } = fields
error = checkValidateRule(rule,value)
})
if(this.validate !== !error && !Tools.isEmptyObject(this.fields)){
this.validate = !error
onValidateChange(this.validate)
}
return this.validate
}
public getFormData(){
return getFormData(this.fields)
}
componentWillUnmount(){
console.log('表单组件卸载')
}
render(){
const { children } = this.props;
return
{children}
}
}
const createFormField_middle= (FormFieldContext,config)=> ({ config, componentInstance, interrupt })=>{
class FormFieldItem extends React.Component{
removeField = null
componentWillUnmount(){
if(Tools.isFunction(this.removeField)){
this.removeField(componentInstance.props)
}else{
console.error('componentWillUnmount removeFiledItem is not function')
}
}
render(){
const { children } = this.props;
return
{({updateFieldItem,removeFiledItem}) => {
updateFieldItem(componentInstance.props)
if(!Tools.isFunction(this.removeField)){
this.removeField = removeFiledItem
}
return children
}}
}
}
return(next) => (params) => {
next({params})
}}
export const createFormField = (config={}) => {
config = Tools.extend({
name:`form_${Tools.getUniqueID()}`,
},config)
const FormFieldContext = React.createContext(null)
// class
const FormFieldComponent = createFormFieldComponent(FormFieldContext,config)
// middle
const formFieldItem_middle = createFormField_middle(FormFieldContext,config)
return {
FormFieldComponent,
formFieldItem_middle
}
}