182 lines
5.8 KiB
JavaScript
182 lines
5.8 KiB
JavaScript
import React from 'react'
|
|
import PropTypes from 'prop-types'
|
|
|
|
import InputField from '../../../atoms/InputField'
|
|
import SelectOption from '../../../atoms/SelectOption'
|
|
|
|
/**
|
|
* INSERT_DESCRIPTION_HERE
|
|
*/
|
|
|
|
class FormFieldContainer extends React.Component {
|
|
constructor(props) {
|
|
super(props)
|
|
const componentKey = this.props.propsData && this.props.propsData.id
|
|
const passedValue = this.props.value || (this.props.propsData && this.props.propsData.value)
|
|
this.state = {
|
|
error: false,
|
|
errorMessage: null
|
|
}
|
|
this.props.updateFormValues({
|
|
formValues: {
|
|
// ...this.props.formValues,
|
|
[componentKey]: passedValue ? passedValue : ''
|
|
}
|
|
})
|
|
this.props.updateFormErrors({
|
|
formErrors: {
|
|
// ...this.props.formErrors,
|
|
[componentKey]: ''
|
|
}
|
|
})
|
|
this.onChangeHandler = this.onChangeHandler.bind(this)
|
|
this.onBlurHandler = this.onBlurHandler.bind(this)
|
|
this.onFocusHandler = this.onFocusHandler.bind(this)
|
|
}
|
|
|
|
/**
|
|
* validateFormField - validates the input field values
|
|
* @param {object} event js event object
|
|
* @param {object} validationObj fieldinput data as props
|
|
*/
|
|
validateFormField(e, validationObj) {
|
|
const {propsData, formErrors, formValues, updateFormErrors, updateFormValues} = this.props
|
|
const inputValue = e.target.value && e.target.value
|
|
let error = false
|
|
let errorMessage = ''
|
|
const componentKey = propsData.id
|
|
const validRegex =
|
|
validationObj.dataRuleRegex &&
|
|
new RegExp(validationObj.dataRuleRegex.regex).test(inputValue)
|
|
const poValidRegex =
|
|
e.target.id === 'address1' &&
|
|
validationObj.dataRuleRegex.po_regex &&
|
|
new RegExp(validationObj.dataRuleRegex.po_regex, 'i').test(inputValue)
|
|
|
|
if (e.target.tagName && e.target.tagName === 'SELECT') {
|
|
if (
|
|
validationObj.required.isRequired &&
|
|
e.target.selectedIndex === 0 &&
|
|
!validationObj.required.preSelected
|
|
) {
|
|
error = true
|
|
errorMessage = validationObj.required.error_message
|
|
}
|
|
} else if (e.target.tagName && e.target.tagName === 'INPUT') {
|
|
if (validationObj.required.isRequired) {
|
|
if (inputValue.trim('') === '') {
|
|
error = true
|
|
errorMessage = validationObj.required.error_message
|
|
} else if (validationObj.dataRuleRegex && !validRegex) {
|
|
error = true
|
|
errorMessage = validationObj.dataRuleRegex.error_message
|
|
} else if (validationObj.dataRuleRegex && poValidRegex) {
|
|
error = true
|
|
errorMessage = validationObj.dataRuleRegex.po_error_message
|
|
}
|
|
}
|
|
} else {
|
|
error = false
|
|
errorMessage = null
|
|
}
|
|
|
|
this.setState({
|
|
error
|
|
})
|
|
|
|
updateFormErrors({
|
|
formErrors: {
|
|
...formErrors,
|
|
[componentKey]: errorMessage
|
|
}
|
|
})
|
|
|
|
updateFormValues({
|
|
formValues: {
|
|
...formValues,
|
|
[componentKey]: inputValue
|
|
}
|
|
})
|
|
|
|
return error
|
|
}
|
|
|
|
onChangeHandler(event) {
|
|
const value = event.target.value
|
|
this.setState({
|
|
value
|
|
})
|
|
}
|
|
|
|
onFocusHandler(event) {
|
|
this.setState({
|
|
oldValue: event.target.value
|
|
})
|
|
}
|
|
|
|
onBlurHandler(validation, customBlurHandler, e) {
|
|
e.oldValue = this.state.oldValue
|
|
const {customBlurFormatter} = this.props
|
|
const isError = this.validateFormField(e, validation)
|
|
if (!isError) {
|
|
if (customBlurHandler && typeof customBlurHandler === 'function') {
|
|
customBlurHandler(e)
|
|
}
|
|
if (customBlurFormatter && typeof customBlurFormatter === 'function') {
|
|
this.setState({value: customBlurFormatter(e)})
|
|
}
|
|
}
|
|
}
|
|
|
|
render() {
|
|
const {customBlurHandler, formErrors, propsData} = this.props
|
|
const {elementType} = propsData
|
|
const errorMessage = formErrors && formErrors[propsData.id]
|
|
const meta = {
|
|
...this.props.propsData,
|
|
className: this.state.error ? 'error' : '',
|
|
error: this.state.error || errorMessage,
|
|
errorMessage,
|
|
handlers: {
|
|
onBlurHandler: this.onBlurHandler,
|
|
customBlurHandler,
|
|
onChangeHandler: this.onChangeHandler,
|
|
onFocusHandler: this.onFocusHandler
|
|
},
|
|
fieldValues: {
|
|
propsValue: this.props.value,
|
|
stateValue: this.state.value
|
|
}
|
|
}
|
|
|
|
/**
|
|
* switch function - returns HTML Tag depending upon the requirement
|
|
* @param {string} elementType - element type e.g. input,select
|
|
*/
|
|
switch (elementType) {
|
|
case 'input':
|
|
return <InputField meta={meta} />
|
|
case 'select':
|
|
return <SelectOption meta={meta} />
|
|
default:
|
|
return <input />
|
|
}
|
|
}
|
|
}
|
|
|
|
FormFieldContainer.propTypes = {
|
|
propsData: PropTypes.object.isRequired,
|
|
className: PropTypes.string,
|
|
customBlurHandler: PropTypes.func,
|
|
customBlurFormatter: PropTypes.func,
|
|
onFocus: PropTypes.func,
|
|
value: PropTypes.string,
|
|
formValues: PropTypes.object,
|
|
formErrors: PropTypes.object,
|
|
selectedCreditCard: PropTypes.object,
|
|
updateFormValues: PropTypes.func,
|
|
updateFormErrors: PropTypes.func
|
|
}
|
|
|
|
export default FormFieldContainer
|