266 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			266 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
| /* eslint react/no-multi-comp:0, no-console:0 */
 | |
| 
 | |
| import createDOMForm from '../src/createDOMForm'
 | |
| import { DatePicker, Select } from 'ant-design-vue'
 | |
| import { regionStyle, errorStyle } from './styles'
 | |
| const { Option } = Select
 | |
| 
 | |
| const Email = {
 | |
|   props: {
 | |
|     form: Object,
 | |
|   },
 | |
|   render () {
 | |
|     const { getFieldProps, getFieldError, isFieldValidating } = this.form
 | |
|     const errors = getFieldError('email')
 | |
|     return (
 | |
|       <div style={regionStyle}>
 | |
|         <div>email sync validate</div>
 | |
|         <div>
 | |
|           <input
 | |
|             {...getFieldProps('email', { initialValue: '', rules: [{ type: 'email', message: <b key='err'>้่ฏฏ็ email ๆ ผๅผ</b> }] })}/></div>
 | |
|         <div style={errorStyle}>
 | |
|           {errors}
 | |
|         </div>
 | |
|         <div style={errorStyle}>
 | |
|           {isFieldValidating('email')
 | |
|             ? 'validating'
 | |
|             : null}
 | |
|         </div>
 | |
|       </div>
 | |
|     )
 | |
|   },
 | |
| }
 | |
| 
 | |
| const User = {
 | |
|   props: {
 | |
|     form: Object,
 | |
|   },
 | |
|   methods: {
 | |
|     userExists (rule, value, callback) {
 | |
|       setTimeout(() => {
 | |
|         if (value === '1') {
 | |
|           callback([new Error('are you kidding?')])
 | |
|         } else if (value === 'yiminghe') {
 | |
|           callback([new Error('forbid yiminghe')])
 | |
|         } else {
 | |
|           callback()
 | |
|         }
 | |
|       }, 300)
 | |
|     },
 | |
|   },
 | |
| 
 | |
|   render () {
 | |
|     const { getFieldProps, getFieldError, isFieldValidating } = this.form
 | |
|     const errors = getFieldError('user')
 | |
|     return (
 | |
|       <div style={regionStyle}>
 | |
|         <div>
 | |
|           <span style={{
 | |
|             color: 'red',
 | |
|           }}>*</span>
 | |
|           user async validate</div>
 | |
|         <div>
 | |
|           <input
 | |
|             {...getFieldProps('user', { initialValue: '', validateFirst: true, rules: [{ required: true }, { validator: this.userExists }] })}/></div>
 | |
|         <div style={errorStyle}>
 | |
|           {(errors)
 | |
|             ? errors.join(',')
 | |
|             : null}
 | |
|         </div>
 | |
|         <div style={errorStyle}>
 | |
|           {isFieldValidating('user')
 | |
|             ? 'validating'
 | |
|             : null}
 | |
|         </div>
 | |
|       </div>
 | |
|     )
 | |
|   },
 | |
| }
 | |
| 
 | |
| const CustomInput = {
 | |
|   props: {
 | |
|     form: Object,
 | |
|   },
 | |
|   render () {
 | |
|     const { getFieldProps, getFieldError, isFieldValidating } = this.form
 | |
|     const errors = getFieldError('select')
 | |
|     return (
 | |
|       <div style={regionStyle}>
 | |
|         <div>
 | |
|           <span style={{
 | |
|             color: 'red',
 | |
|           }}>*</span>
 | |
|           custom select sync validate</div>
 | |
|         <div>
 | |
|           <Select
 | |
|             placeholder='please select'
 | |
|             style={{
 | |
|               width: '200px',
 | |
|             }}
 | |
|             {...getFieldProps('select', { rules: [{ required: true }] })}>
 | |
|             <Option value='1'>1</Option>
 | |
|             <Option value='2'>2</Option>
 | |
|           </Select>
 | |
|         </div>
 | |
|         <div style={errorStyle}>
 | |
|           {(errors)
 | |
|             ? errors.join(',')
 | |
|             : null}
 | |
|         </div>
 | |
|         <div style={errorStyle}>
 | |
|           {isFieldValidating('select')
 | |
|             ? 'validating'
 | |
|             : null}
 | |
|         </div>
 | |
|       </div>
 | |
|     )
 | |
|   },
 | |
| }
 | |
| 
 | |
| const DateInput = {
 | |
|   props: {
 | |
|     form: Object,
 | |
|   },
 | |
|   render () {
 | |
|     const { getFieldProps, getFieldError } = this.form
 | |
|     const errors = getFieldError('date')
 | |
|     return (
 | |
|       <div style={regionStyle}>
 | |
|         <div>
 | |
|           <span style={{
 | |
|             color: 'red',
 | |
|           }}>*</span>
 | |
|           DateInput sync validate</div>
 | |
|         <div style={{
 | |
|           width: '200px',
 | |
|         }}>
 | |
|           <DatePicker
 | |
|             placeholder='please select'
 | |
|             {...getFieldProps('date', { rules: [{ required: true, type: 'object' }] })}/>
 | |
|         </div>
 | |
|         <div style={errorStyle}>
 | |
|           {(errors)
 | |
|             ? errors.join(',')
 | |
|             : null}
 | |
|         </div>
 | |
|       </div>
 | |
|     )
 | |
|   },
 | |
| }
 | |
| 
 | |
| function toNumber (v) {
 | |
|   if (v === undefined) {
 | |
|     return v
 | |
|   }
 | |
|   if (v === '') {
 | |
|     return undefined
 | |
|   }
 | |
|   if (v && v.trim() === '') {
 | |
|     return NaN
 | |
|   }
 | |
|   return Number(v)
 | |
| }
 | |
| 
 | |
| const NumberInput = {
 | |
|   props: {
 | |
|     form: Object,
 | |
|   },
 | |
|   render () {
 | |
|     const { getFieldProps, getFieldError } = this.form
 | |
|     const errors = getFieldError('number')
 | |
|     return (
 | |
|       <div style={regionStyle}>
 | |
|         <div>number input</div>
 | |
|         <div>
 | |
|           <input
 | |
|             {...getFieldProps('number', { initialValue: '1', rules: [{ transform: toNumber, type: 'number' }] })}/>
 | |
|         </div>
 | |
|         <div style={errorStyle}>
 | |
|           {(errors)
 | |
|             ? errors.join(',')
 | |
|             : null}
 | |
|         </div>
 | |
|       </div>
 | |
|     )
 | |
|   },
 | |
| }
 | |
| 
 | |
| const Form = {
 | |
|   methods: {
 | |
|     onSubmit (e) {
 | |
|       console.log('submit')
 | |
|       e.preventDefault()
 | |
|       this
 | |
|         .form
 | |
|         .validateFieldsAndScroll({
 | |
|           scroll: {
 | |
|             offsetTop: 20,
 | |
|           },
 | |
|         }, (error, values) => {
 | |
|           if (!error) {
 | |
|             console.log('ok', values)
 | |
|           } else {
 | |
|             console.log('error', error, values)
 | |
|           }
 | |
|         })
 | |
|     },
 | |
| 
 | |
|     reset (e) {
 | |
|       e.preventDefault()
 | |
|       this
 | |
|         .form
 | |
|         .resetFields()
 | |
|     },
 | |
|   },
 | |
| 
 | |
|   render () {
 | |
|     const { form } = this
 | |
|     const { getFieldProps, getFieldError } = form
 | |
|     return (
 | |
|       <div style={{
 | |
|         margin: '20px',
 | |
|       }}>
 | |
|         <h2>overview</h2>
 | |
|         <form onSubmit={this.onSubmit}>
 | |
|           <User form={form} saveRef={this.saveRef}/>
 | |
| 
 | |
|           <NumberInput form={form}/>
 | |
| 
 | |
|           <Email form={form}/>
 | |
| 
 | |
|           <CustomInput form={form}/>
 | |
| 
 | |
|           <DateInput form={form}/>
 | |
| 
 | |
|           <div style={regionStyle}>
 | |
|             <div>normal required input</div>
 | |
|             <div>
 | |
|               <input
 | |
|                 {...getFieldProps('normal', { initialValue: '', rules: [{ required: true }] })}/>
 | |
|             </div>
 | |
|             <div style={errorStyle}>
 | |
|               {(getFieldError('normal'))
 | |
|                 ? getFieldError('normal').join(',')
 | |
|                 : null}
 | |
|             </div>
 | |
|           </div>
 | |
| 
 | |
|           <div style={regionStyle}>
 | |
|             <button onClick={this.reset}>reset</button>
 | |
|              
 | |
|             <input type='submit' value='submit'/>
 | |
|           </div>
 | |
|         </form>
 | |
|       </div>
 | |
|     )
 | |
|   },
 | |
| }
 | |
| 
 | |
| export default createDOMForm({
 | |
|   validateMessages: {
 | |
|     required (field) {
 | |
|       return `${field} ๅฟ
ๅกซ`
 | |
|     },
 | |
|   },
 | |
| })(Form)
 |