feat: add test for requirement name
fix: add error message rendering on custom requirements form
This commit is contained in:
parent
c8f5e471be
commit
e26e8c69fd
3 changed files with 42 additions and 16 deletions
|
|
@ -276,6 +276,7 @@ const CustomInfoRequests = ({
|
||||||
}}
|
}}
|
||||||
toBeEdited={toBeEdited}
|
toBeEdited={toBeEdited}
|
||||||
onSave={(...args) => handleSave(...args)}
|
onSave={(...args) => handleSave(...args)}
|
||||||
|
existingRequirements={customRequests}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
import { Field } from 'formik'
|
import { Field } from 'formik'
|
||||||
|
import * as R from 'ramda'
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
import * as Yup from 'yup'
|
import * as Yup from 'yup'
|
||||||
|
|
||||||
|
|
@ -25,9 +26,20 @@ const NameOfRequirement = () => {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
const validationSchema = Yup.object().shape({
|
const validationSchema = existingRequirements =>
|
||||||
requirementName: Yup.string().required()
|
Yup.object().shape({
|
||||||
})
|
requirementName: Yup.string()
|
||||||
|
.required('A requirement name is required')
|
||||||
|
.test(
|
||||||
|
'unique-name',
|
||||||
|
'A custom information requirement with that name already exists',
|
||||||
|
(value, _context) =>
|
||||||
|
!R.includes(
|
||||||
|
value,
|
||||||
|
R.map(it => it.customRequest.name, existingRequirements)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
const defaultValues = {
|
const defaultValues = {
|
||||||
requirementName: ''
|
requirementName: ''
|
||||||
|
|
|
||||||
|
|
@ -53,11 +53,11 @@ const styles = {
|
||||||
|
|
||||||
const useStyles = makeStyles(styles)
|
const useStyles = makeStyles(styles)
|
||||||
|
|
||||||
const getStep = step => {
|
const getStep = (step, existingRequirements) => {
|
||||||
switch (step) {
|
switch (step) {
|
||||||
case 1:
|
case 1:
|
||||||
return {
|
return {
|
||||||
schema: nameOfReqSchema,
|
schema: nameOfReqSchema(existingRequirements),
|
||||||
Component: NameOfRequirement
|
Component: NameOfRequirement
|
||||||
}
|
}
|
||||||
case 2:
|
case 2:
|
||||||
|
|
@ -162,11 +162,18 @@ const chooseNotNull = (a, b) => {
|
||||||
return a
|
return a
|
||||||
}
|
}
|
||||||
|
|
||||||
const Wizard = ({ onClose, error = false, toBeEdited, onSave, hasError }) => {
|
const Wizard = ({
|
||||||
|
onClose,
|
||||||
|
error = false,
|
||||||
|
toBeEdited,
|
||||||
|
onSave,
|
||||||
|
hasError,
|
||||||
|
existingRequirements
|
||||||
|
}) => {
|
||||||
const classes = useStyles()
|
const classes = useStyles()
|
||||||
const isEditing = !R.isNil(toBeEdited)
|
const isEditing = !R.isNil(toBeEdited)
|
||||||
const [step, setStep] = useState(isEditing ? 1 : 0)
|
const [step, setStep] = useState(isEditing ? 1 : 0)
|
||||||
const stepOptions = getStep(step)
|
const stepOptions = getStep(step, existingRequirements)
|
||||||
const isLastStep = step === LAST_STEP
|
const isLastStep = step === LAST_STEP
|
||||||
|
|
||||||
const onContinue = (values, actions) => {
|
const onContinue = (values, actions) => {
|
||||||
|
|
@ -226,15 +233,21 @@ const Wizard = ({ onClose, error = false, toBeEdited, onSave, hasError }) => {
|
||||||
editingValues
|
editingValues
|
||||||
)}
|
)}
|
||||||
validationSchema={stepOptions.schema}>
|
validationSchema={stepOptions.schema}>
|
||||||
|
{({ errors }) => (
|
||||||
<Form className={classes.form} id={'custom-requirement-form'}>
|
<Form className={classes.form} id={'custom-requirement-form'}>
|
||||||
<stepOptions.Component />
|
<stepOptions.Component />
|
||||||
<div className={classes.submit}>
|
<div className={classes.submit}>
|
||||||
{hasError && <ErrorMessage>Failed to save</ErrorMessage>}
|
{(hasError || errors) && (
|
||||||
|
<ErrorMessage>
|
||||||
|
{R.head(R.values(errors)) ?? `Failed to save`}
|
||||||
|
</ErrorMessage>
|
||||||
|
)}
|
||||||
<Button className={classes.button} type="submit">
|
<Button className={classes.button} type="submit">
|
||||||
{isLastStep ? 'Save' : 'Next'}
|
{isLastStep ? 'Save' : 'Next'}
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</Form>
|
</Form>
|
||||||
|
)}
|
||||||
</Formik>
|
</Formik>
|
||||||
)}
|
)}
|
||||||
</Modal>
|
</Modal>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue