219 lines
4.7 KiB
JavaScript
219 lines
4.7 KiB
JavaScript
import {
|
||
WeaFormItem,
|
||
WeaSearchGroup,
|
||
} from 'ecCom';
|
||
import {
|
||
WeaSwitch
|
||
} from 'comsMobx';
|
||
import {
|
||
isObject
|
||
} from 'lodash';
|
||
import {
|
||
observer,
|
||
} from 'mobx-react';
|
||
|
||
@observer
|
||
export default class Form extends React.Component {
|
||
/**
|
||
* @DateTime 2019-05-21
|
||
* 概述:是否渲染当前condition
|
||
* @param {Number} index condition的索引值
|
||
* @return {Boolean}
|
||
*/
|
||
isRenderCondition = (index) => {
|
||
const {
|
||
groupConfig,
|
||
form
|
||
} = this.props;
|
||
//groupConfig不存在
|
||
if (!groupConfig) {
|
||
return true;
|
||
}
|
||
//groupConfig类型不正确
|
||
if (!isObject(groupConfig)) {
|
||
console && console.error && console.error('check groupConfig type!');
|
||
return false;
|
||
}
|
||
|
||
//获取动态表单组的索引值
|
||
const activeIndexs = Object.keys(groupConfig).map(key => parseInt(key));
|
||
|
||
|
||
if (activeIndexs.includes(index)) {
|
||
const key = index.toString();
|
||
const config = groupConfig[key];
|
||
const {
|
||
activeKey,
|
||
activeValue
|
||
} = config;
|
||
//所有表单元素的值
|
||
const formFieldsParams = form.getFormParams();
|
||
//activeKey对应表单元素的值
|
||
const currentValue = formFieldsParams[activeKey];
|
||
return activeValue.includes(currentValue);
|
||
} else {
|
||
return true;
|
||
}
|
||
}
|
||
|
||
isRenderItem = (key) => {
|
||
const {
|
||
itemConfig
|
||
} = this.props;
|
||
|
||
//itemConfig不存在
|
||
if (!itemConfig) {
|
||
return true;
|
||
}
|
||
//itemConfig类型错误
|
||
if (!isObject(itemConfig)) {
|
||
console && console.error && console.error('check itemConfig type!');
|
||
}
|
||
|
||
//动态表单元素的domkey集合
|
||
const activeKeys = Object.keys(itemConfig);
|
||
|
||
if (activeKeys.includes(key)) {
|
||
const config = itemConfig[key];
|
||
const {
|
||
activeKey,
|
||
activeValue
|
||
} = config;
|
||
//所有表单元素的值
|
||
const formFieldsParams = form.getFormParams();
|
||
//activeKey对应表单元素的值
|
||
const currentValue = formFieldsParams[activeKey];
|
||
return activeValue.includes(currentValue);
|
||
} else {
|
||
return true;
|
||
}
|
||
|
||
}
|
||
|
||
/**
|
||
* @DateTime 2019-05-21
|
||
* 概述:一行是否显示多个表单元素
|
||
* @return {Boolean}
|
||
*/
|
||
isRenderMultiItems = () => {
|
||
const {
|
||
multiConfig
|
||
} = this.props;
|
||
|
||
if (!multiConfig) {
|
||
return false;
|
||
}
|
||
if (!isObject(multiConfig)) {
|
||
console && console.error && console.error('check multiConfig type');
|
||
return false;
|
||
}
|
||
|
||
return true;
|
||
|
||
}
|
||
|
||
//渲染一个表单元素
|
||
renderItem = (item) => {
|
||
this.renderRow(item);
|
||
}
|
||
|
||
//渲染多个表单元素
|
||
renderMultiItems = (item) => {
|
||
this.renderRow(item, true);
|
||
}
|
||
|
||
//渲染一行中包含的表单元素
|
||
renderRow = (item, isMulti) => {
|
||
const {
|
||
form,
|
||
multiConfig
|
||
} = this.props;
|
||
|
||
return (
|
||
<WeaFormItem
|
||
{...item}
|
||
labelCol={{span: 6}}
|
||
wrapperCol={{span: 18}}
|
||
error={form.getError(item)}
|
||
>
|
||
<WeaSwitch
|
||
fieldConfig={item}
|
||
form={form}
|
||
formParams={form.getFormParams()}
|
||
onChange={(res,obj) => handleFormChange && handleFormChange(res,obj)}
|
||
onBlur={(value, res, obj)=>handleFormBlur && handleFormBlur(value, res, obj)}
|
||
/>
|
||
{
|
||
isMulti && multiConfig.map(item=>
|
||
const {
|
||
domkey
|
||
} = item;
|
||
const isRender = this.isRenderItem(domkey[0]);
|
||
if (!isRender) {
|
||
return null;
|
||
}
|
||
return (<WeaFormItem
|
||
{...item}
|
||
hideLabel={true}
|
||
wrapperCol={{span: 24}}
|
||
error={form.getError(item)}
|
||
>
|
||
<WeaSwitch
|
||
fieldConfig={item}
|
||
form={form}
|
||
formParams={form.getFormParams()}
|
||
onChange={(res,obj) => handleFormChange && handleFormChange(res,obj)}
|
||
onBlur={(value, res, obj)=>handleFormBlur && handleFormBlur(value, res, obj)}
|
||
/>
|
||
</WeaFormItem>)
|
||
)
|
||
}
|
||
</WeaFormItem>
|
||
)
|
||
}
|
||
|
||
render() {
|
||
const {
|
||
conditions,
|
||
form
|
||
} = this.props, {
|
||
isFormInit
|
||
} = form;
|
||
|
||
//表单未初始化完成
|
||
if (!isFormInit) {
|
||
return null;
|
||
}
|
||
|
||
conditions && conditions.map((condition, index) => {
|
||
//是否渲染当前condition
|
||
const isRender = this.isRenderCondition(index);
|
||
|
||
if (isRender) {
|
||
condition.map(c => {
|
||
return c.items.map(item => {
|
||
const {
|
||
domkey
|
||
} = item;
|
||
//是否渲染当前item
|
||
const isRender = this.isRenderItem(domkey[0]);
|
||
|
||
if (isRender) {
|
||
//是否渲染多个item
|
||
const isRenderMulti = this.isRenderMultiItems();
|
||
if (isRenderMulti) {
|
||
this.renderMultiItems(item);
|
||
} else {
|
||
this.renderItem(item);
|
||
}
|
||
} else {
|
||
return null;
|
||
}
|
||
});
|
||
});
|
||
} else {
|
||
return null;
|
||
}
|
||
});
|
||
}
|
||
} |