UNPKG

mini-check

Version:

211 lines 11.5 kB
import Nerv from "nervjs"; import Taro, { showToast as _showToast } from "@tarojs/taro-h5"; import { View } from '@tarojs/components'; import { CustomInput, CustomDatePicker, Digit, CustomCheckboxGroup, Picture, RadioButtonGroup, UserCitySelection, CustomMap, CustomTextArea, MultilineText } from '../index'; import { AtButton } from 'taro-ui'; import { isEmpty } from "../../util/index"; import { phoneReg, linkReg } from '../../util/constants'; import { getArea, getUserCitySelection, loadData, getDicService } from '../../service/global'; import ListItem from './ListItem'; import './index.scss'; import '../index.scss'; class Index extends Taro.Component { constructor() { super(...arguments); this.state = { values: {}, metaData: {} }; } componentWillReceiveProps(nextProps) { const { defaultValue } = nextProps; this.setState({ values: defaultValue }); } render() { const { metaData, onView } = this.props; // const platformStyle: any = Taro.getEnv() === 'WEAPP' ? {} : { overflowY: 'auto', height: '100%' } return <View className="renderer-container"> {this.renderFormItems(metaData ? metaData.children : [])} <View> {onView ? <AtButton onClick={this.onEdit} type="secondary" className="submit-btn">返回编辑</AtButton> : <AtButton onClick={this.onSubmit} type="primary" className="submit-btn">提交</AtButton>} </View> </View>; } formDataOnChange = (value, item, parentTerm) => { const { name } = item.props; const { values } = this.state; let newValues = []; if (parentTerm) { newValues = { [parentTerm]: { ...values[parentTerm], [item.props.name]: value } }; } else { newValues = { [name]: value }; } this.setState({ values: { ...values, ...newValues } }); }; getInitialValue = (init = '', values, parentTerm, name) => { let initValue = init; if (values) { if (parentTerm && values[parentTerm] && values[parentTerm][name]) { initValue = values[parentTerm][name]; } else { initValue = values[name]; } } return initValue; }; renderFormItems = (formItems, listItemChildren, parentTerm) => { const { values } = this.state; const { onView } = this.props; return formItems && formItems.map(item => { if (item.comp === 'Text') { return <CustomInput onView={onView} name={item.props.name} term={item.props.term} onChange={value => this.formDataOnChange(value, item, parentTerm)} key={item.name} value={this.getInitialValue('', values, parentTerm, item.props.name)} listItemChildren={listItemChildren} />; } if (item.comp === 'DateTime') { return <CustomDatePicker onView={onView} {...item.props} key={item.name} onChange={value => this.formDataOnChange(value, item, parentTerm)} value={this.getInitialValue('', values, parentTerm, item.props.name)} listItemChildren={listItemChildren} />; } if (item.comp === 'Digit') { return <Digit onView={onView} {...item.props} key={item.name} onChange={value => this.formDataOnChange(value, item, parentTerm)} value={this.getInitialValue('', values, parentTerm, item.props.name)} listItemChildren={listItemChildren} />; } if (item.comp === 'MultilineText') { if (Taro.getEnv() !== 'WEAPP') { return <MultilineText onView={onView} {...item.props} key={item.name} onChange={value => this.formDataOnChange(value, item, parentTerm)} value={this.getInitialValue('', values, parentTerm, item.props.name)} listItemChildren={listItemChildren} />; } return <CustomTextArea onView={onView} {...item.props} key={item.name} onChange={value => this.formDataOnChange(value, item, parentTerm)} value={this.getInitialValue('', values, parentTerm, item.props.name)} listItemChildren={listItemChildren} />; } if (item.comp === 'SingleSelection') { return <RadioButtonGroup onView={onView} {...item.props} key={item.name} onChange={value => this.formDataOnChange(value, item, parentTerm)} value={this.getInitialValue('', values, parentTerm, item.props.name)} loadDicData={getDicService} listItemChildren={listItemChildren} />; } if (item.comp === 'MultipleSelection') { return <CustomCheckboxGroup onView={onView} {...item.props} key={item.name} onChange={value => this.formDataOnChange(value, item, parentTerm)} value={this.getInitialValue([], values, parentTerm, item.props.name)} loadDicData={getDicService} listItemChildren={listItemChildren} />; } if (item.comp === 'MobilePhone') { return <CustomInput onView={onView} {...item.props} onChange={value => this.formDataOnChange(value, item, parentTerm)} type="phone" key={item.name} value={this.getInitialValue([], values, parentTerm, item.props.name)} listItemChildren={listItemChildren} />; } if (item.comp === 'Link') { return <CustomInput onView={onView} {...item.props} onChange={value => this.formDataOnChange(value, item, parentTerm)} type="link" key={item.name} value={this.getInitialValue('', values, parentTerm, item.props.name)} listItemChildren={listItemChildren} />; } if (item.comp === 'Picture') { return <Picture onView={onView} {...item.props} key={item.name} onChange={value => this.formDataOnChange(value, item, parentTerm)} value={this.getInitialValue([], values, parentTerm, item.props.name)} listItemChildren={listItemChildren} />; } if (item.comp === 'UserCitySelection') { return <UserCitySelection onView={onView} {...item.props} key={item.name} onChange={value => this.formDataOnChange(value, item, parentTerm)} value={this.getInitialValue('', values, parentTerm, item.props.name)} loadData={loadData} getArea={getArea} getUserCitySelection={getUserCitySelection} listItemChildren={listItemChildren} />; } if (item.comp === 'PositionMap') { return <CustomMap onView={onView} {...item.props} key={item.name} onChange={value => this.formDataOnChange(value, item, parentTerm)} value={this.getInitialValue('', values, parentTerm, item.props.name)} listItemChildren={listItemChildren} />; } if (item.comp === 'ItemListPlus') { return <ListItem formItems={item.children} listItemChildren={true} parentTerm={item.props.name} onView={onView} values={values} formDataOnChange={this.formDataOnChange} getInitialValue={this.getInitialValue} term={item.props.term} help={item.props.help} />; } }); }; onSubmit = () => { const { getFieldsValues, metaData } = this.props; const { values } = this.state; const { children } = metaData; if (children && children.length) { const validatorArray = children.filter(item => item.props.required && item.props.name && !item.props.hidden); const formatValidatorArray = children.filter(item => item.props.name && !item.props.hidden); const validateChildrenArray = children.filter(item => item.children && item.children.length); const formatValidatorChildrenArray = children.filter(item => item.children && item.children.length && item.children.find(i => i.props.name && !i.props.hidden)); const result = validatorArray.find(i => isEmpty(values[i.props.name])); if (result) { console.error('result', `${result.props.term}为必填项`); _showToast({ title: `${result.props.term} 为必填项`, icon: 'none' }); return; } const childrenResult = validateChildrenArray.map(item => item.children.find(i => { return i.props.required && !i.props.hidden && values[item.props.name] && isEmpty(values[item.props.name][i.props.name]); })).filter(v => v); if (childrenResult && childrenResult.length) { console.error('result', `${childrenResult[0].props.term}为必填项`); _showToast({ title: `${childrenResult[0].props.term} 为必填项`, icon: 'none' }); return; } const phoneRegError = formatValidatorArray.filter(item => item.comp === 'MobilePhone').find(i => values[i.props.name] && !phoneReg.test(values[i.props.name])); const phoneChildrenRegError = formatValidatorChildrenArray.map(item => item.children.filter(i => i.comp === 'MobilePhone').find(it => { return values[item.props.name] && values[item.props.name][it.props.name] && !phoneReg.test(values[item.props.name][it.props.name]); })).filter(v => v); if (phoneRegError) { console.error('regError', `${phoneRegError.props.term}格式错误`); _showToast({ title: `${phoneRegError.props.term} 格式错误`, icon: 'none' }); return; } if (phoneChildrenRegError && phoneChildrenRegError.length) { console.error('regError', `${phoneChildrenRegError[0].props.term}格式错误`); _showToast({ title: `${phoneChildrenRegError[0].props.term} 格式错误`, icon: 'none' }); return; } const linkRegError = formatValidatorArray.filter(item => item.comp === 'Link').find(i => values[i.props.name] && !linkReg.test(values[i.props.name])); if (linkRegError) { console.error('regError', `${linkRegError.props.term}格式错误`); _showToast({ title: `${linkRegError.props.term} 格式错误`, icon: 'none' }); return; } const linkChildrenRegError = formatValidatorChildrenArray.map(item => item.children.filter(i => i.comp === 'Link').find(it => { return values[item.props.name] && !linkReg.test(values[item.props.name][it.props.name]); })).filter(v => v); if (linkChildrenRegError && linkChildrenRegError.length) { console.error('regError', `${linkChildrenRegError[0].props.term}格式错误`); _showToast({ title: `${linkChildrenRegError[0].props.term} 格式错误`, icon: 'none' }); return; } const digitError = formatValidatorArray.filter(item => item.comp === 'Digit').find(i => values[i.props.name] && (String(values[i.props.name]).startsWith('.') || String(values[i.props.name]).endsWith('.') || String(values[i.props.name]) === '-0' || String(values[i.props.name]) === '-')); const digitChildrenError = formatValidatorChildrenArray.map(item => item.children.filter(i => i.comp === 'Digit').find(it => values[item.props.name] && (String(values[item.props.name][it.props.name]).startsWith('.') || String(values[item.props.name][it.props.name]).endsWith('.') || String(values[item.props.name][it.props.name]) === '-0' || String(values[item.props.name][it.props.name]) === '-'))).filter(v => v); if (digitError) { console.error('digitError', `${digitError.props.term}格式错误`); _showToast({ title: `${digitError.props.term} 格式错误`, icon: 'none' }); return; } if (digitChildrenError && digitChildrenError.length) { console.error('digitError', `${digitChildrenError[0].props.term}格式错误`); _showToast({ title: `${digitChildrenError[0].props.term} 格式错误`, icon: 'none' }); return; } } if (getFieldsValues) { getFieldsValues(values); } }; onEdit = () => { Taro.redirectTo({ url: '/pages/index/index' }); }; } export default Index;