Yup validation in react for all with when conditional
HousingValidationSchema = () =>
Yup.object().shape({
isCurrent: Yup.boolean(),
country: Yup.number(), // Country is a dropdown
state: Yup.string().when('country', {
is: (value) => Enum.Countries.eUSA === value,
then: Yup.string().required('Enter a state'),
}),
occupancyStatus: this.props.showOccupancyStatusAndDuration
? !this.props.hideOccupancyStatus && this.props.isCurrent
? Yup.number().required('Select an occupancy status')
: Yup.number()
: Yup.number(),
address: Yup.string().required('Enter an address'),
zipCode: Yup.string().when('country', {
is: (value) => Enum.Countries.eUSA === value,
then: Yup.string()
.required('Enter a ZIP code')
.matches(/^\d{5}(?:[-\s]\d{4})?$|^\d{9}$/, { message: 'ZIP code format is incorrect' }),
}),
city: Yup.string().when('country', {
is: (value) => Enum.Countries.eUSA === value,
then: Yup.string().required('Enter a city'),
}),
county: Yup.string().max(50, 'County must not exceed 50 characters'),
occupancyYear: Yup.number().integer('Year must be a whole number').min(0, 'Year must be a positive number'),
occupancyMonth: Yup.number()
.integer('Month must be a whole number')
.max(11, 'Month must be between 0-11')
.min(0, 'Month must be a positive number'),
numberInHouseHold: Yup.number().when('isCurrent', {
is: true && this.props.isNumberInHouseholdRequired,
then: this.props.showNumberInHouseHold
? Yup.number().required('Select a number in household').min(0, 'Select a number in household')
: Yup.number().integer('Invalid value detected'),
}),
numberOfDependents: Yup.number().when('isCurrent', {
is: true,
then: this.props.showNumberOfDependents ? Yup.number().integer('Invalid value detected') : Yup.number(),
}),
monthlyPayment: Yup.object().when(['isCurrent', 'occupancyStatus'], {
is: (isCurrent, occupancyStatus) =>
isCurrent &&
this.isMonthlyPaymentRequired(
this.props.requiredPaymentOccupancyStatuses,
this.props.requiredPaymentBorrowerTypes,
occupancyStatus,
this.props.borrowerType
),
then: getMaskFieldValidation(Yup.number().required('Enter a monthly payment')),
}),
occupancyDescription: Yup.string().when(['isCurrent', 'occupancyStatus'], {
is: (isCurrent, occupancyStatus) =>
isCurrent && isOccupancyDescriptionVisible(occupancyStatus, !!this.props.isOccupancyDescriptionEnabled),
then: Yup.string().required('Enter an occupancy description'),
}),
});
<ConnectedEditBlurForm
page={ApplicationPages.APPLICATION}
displayName={this.getFormDisplayName()}
formId={this.getFormId()}
ref={(component: any) => {
if (component) {
this.setEditBlurFormRef(component);
}
}}
validationSchema={this.HousingValidationSchema}
currentValues={this.props.currentValues}
onSubmit={this.handleOnSubmit}
render={(formikprops: FormikProps<HousingModelExtended>) => (
<>
<SectionHeading
text={(formikprops.values.isCurrent ? 'Current' : 'Previous') + ' Housing'}
id={`${this.props.id}-Housing-SectionHeading-${
formikprops.values.isCurrent ? 'Current' : 'Previous'
}Housing`}
rank={3}
isShowAccentBar={true}
isHighlighted={true}
additionalHeaderComponent={this.getAdditionaHeaderComponents(formikprops)}
/>
{this.props.isXAAdressVisible && (
<>
{this.isCountryVisible(formikprops) && (
<EditBlurFormRow>
<div className={'col-3'}>
<Label text="Country *" id={`${this.props.id}-Housing-Label-Country`} />
<Dropdown
options={this.getEnumAsOptions<Enum.Countries>(
Enum.Countries,
EnumHelper.mapCountriesToLongStr,
EnumHelper.mapCountriesToStr
)}
id={`${this.props.id}-Housing-Dropdown-${
formikprops.values.isCurrent ? 'Current' : 'Previous'
}Country`}
onSelectChange={(text: string, value: string) => {
this.handleNonTextControlUpdate(
formikprops,
'country',
EnumHelper.mapCountriesToEnum(value)
);
// Clear all fields since the country has changed.
this.handleNonTextControlUpdate(formikprops, 'address', '');
this.handleNonTextControlUpdate(formikprops, 'address2', '');
this.handleNonTextControlUpdate(formikprops, 'zipCode', '');
this.handleNonTextControlUpdate(formikprops, 'city', '');
this.handleNonTextControlUpdate(formikprops, 'state', '');
this.handleNonTextControlUpdate(formikprops, 'county', '');
if (!formikprops.values.monthlyPayment.isMasked) {
this.handleNonTextControlUpdate(formikprops, 'monthlyPayment', {
isMasked: false,
value: 0,
});
}
this.handleNonTextControlUpdate(formikprops, 'occupancyStatus', '');
this.handleNonTextControlUpdate(formikprops, 'occupancyDuration', '');
this.handleNonTextControlUpdate(formikprops, 'occupancyMonth', '');
this.handleNonTextControlUpdate(formikprops, 'occupancyYear', '');
this.handleNonTextControlUpdate(formikprops, numberInHouseOrDependents, '');
}}
onBlur={FormikHelper.handleDropdownBlur(this.editBlurForm, formikprops, 'country')}
selectedValues={[
formikprops.values.country !== undefined
? EnumHelper.mapCountriesToStr(formikprops.values.country)
: EnumHelper.mapCountriesToStr(Enum.Countries.eUSA),
]}
isDisabled={this.props.isReadOnly}
{...FormikHelper.simpleIsError(formikprops, 'country')}
/>
</div>
</EditBlurFormRow>
)}
{isDomesticAddress(formikprops.values.country) && (
<EditBlurFormRow>
<div className={'col-3'}>
<TextField
name="address"
label={formikprops.values.isCurrent ? 'Address *' : 'Previous Address *'}
id={`${this.props.id}-Housing-TextField-${
formikprops.values.isCurrent ? 'Current' : 'Previous'
}Address`}
value={formikprops.values.address}
onChange={formikprops.handleChange}
maxLength={100}
onBlur={formikprops.handleBlur}
isReadOnly={this.props.isReadOnly}
autoComplete={DISABLE_AUTOCOMPLETE}
{...FormikHelper.simpleIsError(formikprops, 'address')}
/>
</div>
<div className={'col-1'}>
<TextField
name="zipCode"
label="ZIP Code *"
id={`${this.props.id}-Housing-TextField-${
formikprops.values.isCurrent ? 'Current' : 'Previous'
}ZipCode`}
value={formikprops.values.zipCode}
onBlur={(e: React.FocusEvent<HTMLInputElement>) => {
this.handleZipBlur(formikprops, e);
}}
onChange={formikprops.handleChange}
isReadOnly={this.props.isReadOnly}
autoComplete={DISABLE_AUTOCOMPLETE}
{...FormikHelper.simpleIsError(formikprops, 'zipCode')}
/>
</div>
<div className={'col-3'}>
<TextField
name="city"
label="City *"
id={`${this.props.id}-Housing-TextField-${
formikprops.values.isCurrent ? 'Current' : 'Previous'
}City`}
value={formikprops.values.city}
onBlur={formikprops.handleBlur}
onChange={formikprops.handleChange}
isReadOnly={this.props.isReadOnly}
autoComplete={DISABLE_AUTOCOMPLETE}
{...FormikHelper.simpleIsError(formikprops, 'city')}
/>
</div>
<div className={'col-1'}>
<Label
text="State *"
id={`${this.props.id}-Housing-Label-${
formikprops.values.isCurrent ? 'Current' : 'Previous'
}State`}
/>
<Dropdown
options={withOptionalDropdownOption(
this.getEnumAsOptions<Enum.State>(
Enum.State,
EnumHelper.mapStateToLongStr,
EnumHelper.mapStateToStr
),
''
)}
id={`${this.props.id}-Housing-Dropdown-${
formikprops.values.isCurrent ? 'Current' : 'Previous'
}State`}
onSelectChange={(text: string, value: string) => {
this.handleNonTextControlUpdate(formikprops, 'state', EnumHelper.mapStateToEnum(value));
}}
onBlur={FormikHelper.handleDropdownBlur(this.editBlurForm, formikprops, 'state')}
selectedValues={[
formikprops.values.state !== undefined
? EnumHelper.mapStateToStr(formikprops.values.state)
: '',
]}
isDisabled={this.props.isReadOnly}
{...FormikHelper.simpleIsError(formikprops, 'state')}
/>
</div>
{!this.props.isHideCounty && (
<div className={'col-2'}>
<TextField
name="county"
label="County"
id={`${this.props.id}-Housing-TextField-${
formikprops.values.isCurrent ? 'Current' : 'Previous'
}Country`}
value={formikprops.values.county}
maxLength={50}
onBlur={formikprops.handleBlur}
onChange={formikprops.handleChange}
isReadOnly={this.props.isReadOnly}
autoComplete={DISABLE_AUTOCOMPLETE}
{...FormikHelper.simpleIsError(formikprops, 'county')}
/>
</div>
)}
</EditBlurFormRow>
)}
{!isDomesticAddress(formikprops.values.country) && (
<>
<EditBlurFormRow>
<div className={'col-4'}>
<TextField
name="address"
label={'Address Line 1 *'}
id={`${this.props.id}-Housing-TextField-AddressLine1`}
value={formikprops.values.address}
onChange={formikprops.handleChange}
maxLength={100}
onBlur={formikprops.handleBlur}
isReadOnly={this.props.isReadOnly}
autoComplete={DISABLE_AUTOCOMPLETE}
{...FormikHelper.simpleIsError(formikprops, 'address')}
/>
</div>
</EditBlurFormRow>
<EditBlurFormRow>
<div className={'col-4'}>
<TextField
name="address2"
label={'Address Line 2'}
id={`${this.props.id}-Housing-TextField-AddressLine2`}
value={formikprops.values.address2}
onChange={formikprops.handleChange}
maxLength={100}
onBlur={formikprops.handleBlur}
isReadOnly={this.props.isReadOnly}
autoComplete={DISABLE_AUTOCOMPLETE}
{...FormikHelper.simpleIsError(formikprops, 'address2')}
/>
</div>
</EditBlurFormRow>
<EditBlurFormRow>
<div className={'col-1'}>
<TextField
name="zipCode"
label="Postal Code"
id={`${this.props.id}-Housing-TextField-PostalCode`}
value={formikprops.values.zipCode}
onBlur={formikprops.handleBlur}
onChange={formikprops.handleChange}
autoComplete={DISABLE_AUTOCOMPLETE}
isReadOnly={this.props.isReadOnly}
{...FormikHelper.simpleIsError(formikprops, 'zipCode')}
/>
</div>
<div className={'col-3'}>
<TextField
name="city"
label="City/Province"
id={`${this.props.id}-Housing-TextField-CityProvince`}
value={formikprops.values.city}
onBlur={formikprops.handleBlur}
onChange={formikprops.handleChange}
isReadOnly={this.props.isReadOnly}
autoComplete={DISABLE_AUTOCOMPLETE}
{...FormikHelper.simpleIsError(formikprops, 'city')}
/>
</div>
</EditBlurFormRow>
</>
)}
</>
)}
<EditBlurFormRow>
{this.props.showOccupancyStatusAndDuration && (
<div className={'col-3'}>
<Label
text={`Occupancy Status kkk${
this.props.hideOccupancyStatus && formikprops.values.isCurrent ? '' : ' *'
}`}
id={`${this.props.id}-Housing-Label-${
formikprops.values.isCurrent ? 'Current' : 'Previous'
}OccupancyStatus`}
/>
<Dropdown
options={withOptionalDropdownOption(
this.getEnumAsOptions<Enum.OccupancyStatuses>(
Enum.OccupancyStatuses,
EnumHelper.mapOccupancyStatusesToLongStr,
EnumHelper.mapOccupancyStatusesToStr
),
''
)}
id={`${this.props.id}-Housing-Dropdown-${
formikprops.values.isCurrent ? 'Current' : 'Previous'
}OccupancyStatus`}
onSelectChange={(text: string, value: string) => {
this.handleNonTextControlUpdate(
formikprops,
'occupancyStatus',
EnumHelper.mapOccupancyStatusesToEnum(value)
);
}}
onBlur={FormikHelper.handleDropdownBlur(this.editBlurForm, formikprops, 'occupancyStatus')}
selectedValues={[
formikprops.values.occupancyStatus !== undefined
? EnumHelper.mapOccupancyStatusesToStr(formikprops.values.occupancyStatus)
: '',
]}
isDisabled={this.props.isReadOnly}
{...FormikHelper.simpleIsError(formikprops, 'occupancyStatus')}
/>
</div>
)}
{formikprops.values.isCurrent && formikprops.values.monthlyPayment !== undefined && (
<div className={'col-2'}>
{formikprops.values.monthlyPayment.isMasked ? (
<TextField
name="monthlyPayment"
id={`${this.props.id}-Housing-TextField-MonthlyPayment`}
value={MaskString}
onChange={formikprops.handleChange}
onBlur={formikprops.handleBlur}
prefixUnit="$"
label={this.getMonthlyPaymentLabel(formikprops)}
isReadOnly={true}
{...FormikHelper.simpleIsError(formikprops, 'monthlyPayment')}
/>
) : (
<CurrencyField
name="monthlyPayment"
id={`${this.props.id}-Housing-CurrencyField-MonthlyPayment`}
isReadOnly={this.props.isReadOnly}
value={formikprops.values.monthlyPayment.value ?? 0}
label={this.getMonthlyPaymentLabel(formikprops)}
onChange={(val) => {
formikprops.setFieldValue('monthlyPayment', { isMasked: false, value: val });
}}
onBlur={formikprops.handleBlur}
{...FormikHelper.simpleIsError(formikprops, 'monthlyPayment.value')}
/>
)}
</div>
)}
{this.props.showOccupancyStatusAndDuration && (
<div className="col-2">
<Label
text="Occupancy Duration"
id={`${this.props.id}-Housing-Label-${
formikprops.values.isCurrent ? 'Current' : 'Previous'
}OccupancyDuration`}
/>
<div className="row">
<div className="col-6">
<IntegerField
name="occupancyYear"
id={`${this.props.id}-Housing-IntegerField-${
formikprops.values.isCurrent ? 'Current' : 'Previous'
}OccupancyYear`}
value={formikprops.values.occupancyYear}
onChange={(year) => {
formikprops.setFieldValue('occupancyYear', year);
}}
onBlur={formikprops.handleBlur}
postfixUnit="yr"
{...FormikHelper.simpleIsError(formikprops, 'occupancyYear')}
isReadOnly={this.props.isReadOnly}
autoComplete={DISABLE_AUTOCOMPLETE}
/>
</div>
<div className="col-6">
<IntegerField
name="occupancyMonth"
id={`${this.props.id}-Housing-IntegerField-${
formikprops.values.isCurrent ? 'Current' : 'Previous'
}OccupancyMonth`}
value={formikprops.values.occupancyMonth}
onChange={(month) => {
formikprops.setFieldValue('occupancyMonth', month);
}}
onBlur={formikprops.handleBlur}
postfixUnit="mo"
{...FormikHelper.simpleIsError(formikprops, 'occupancyMonth')}
isReadOnly={this.props.isReadOnly}
autoComplete={DISABLE_AUTOCOMPLETE}
/>
</div>
</div>
</div>
)}
{this.props.isCurrent && numberInHouseOrDependents && (
<div className={'col-2'}>
<Label
text={numberInHouseOrDependentsLabel}
id={`${this.props.id}-Housing-Label-NumberinHousehold`}
/>
<Dropdown
options={[
{ text: '', value: '-1' },
{ text: '0', value: '0' },
{ text: '1', value: '1' },
{ text: '2', value: '2' },
{ text: '3', value: '3' },
{ text: '4', value: '4' },
{ text: '5+', value: '5' },
]}
id={`${this.props.id}-Housing-Dropdown-NumberInHousehold`}
selectedValues={[
formikprops.values[numberInHouseOrDependents] !== undefined
? formikprops.values[numberInHouseOrDependents].toString()
: '',
]}
isDisabled={this.props.isReadOnly}
onSelectChange={(text: string, value: string) => {
this.handleNonTextControlUpdate(formikprops, numberInHouseOrDependents, value);
}}
onBlur={FormikHelper.handleDropdownBlur(
this.editBlurForm,
formikprops,
numberInHouseOrDependents
)}
{...FormikHelper.simpleIsError(formikprops, numberInHouseOrDependents)}
/>
</div>
)}
</EditBlurFormRow>
{isOccupancyDescriptionVisible(
formikprops.values.occupancyStatus,
!!this.props.isOccupancyDescriptionEnabled
) && (
<EditBlurFormRow>
<div className="col-3">
<TextField
name="occupancyDescription"
label="Occupancy Description *"
id={`${this.props.id}-Hosuing-TextField-OccupancyDescription`}
value={formikprops.values.occupancyDescription}
onChange={formikprops.handleChange}
onBlur={formikprops.handleBlur}
isReadOnly={this.props.isReadOnly}
autoComplete={DISABLE_AUTOCOMPLETE}
{...FormikHelper.simpleIsError(formikprops, 'occupancyDescription')}
/>
</div>
</EditBlurFormRow>
)}
</>
)}
/>
Comments
Post a Comment