-
Notifications
You must be signed in to change notification settings - Fork 38
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
(PC-19516)[PRO] feat: add price categories form
- Loading branch information
1 parent
1c9ffc5
commit a0740f6
Showing
13 changed files
with
227 additions
and
23 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
9 changes: 9 additions & 0 deletions
9
pro/src/screens/OfferIndividual/PriceCategories/PriceCategoriesForm.module.scss
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
@use "styles/mixins/_rem.scss" as rem; | ||
|
||
.label-input { | ||
width: rem.torem(320px); | ||
} | ||
|
||
.price-input { | ||
width: rem.torem(180px); | ||
} |
53 changes: 53 additions & 0 deletions
53
pro/src/screens/OfferIndividual/PriceCategories/PriceCategoriesForm.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
import { FieldArray } from 'formik' | ||
import React from 'react' | ||
|
||
import FormLayout from 'components/FormLayout' | ||
import { IcoEuro } from 'icons' | ||
import { TextInput } from 'ui-kit' | ||
|
||
import { | ||
PRICE_CATEGORY_LABEL_MAX_LENGTH, | ||
PRICE_CATEGORY_PRICE_MAX, | ||
} from './form/constants' | ||
import { PriceCategoriesFormValues } from './form/types' | ||
import styles from './PriceCategoriesForm.module.scss' | ||
|
||
type PriceCategoriesFormProps = { | ||
values: PriceCategoriesFormValues | ||
} | ||
|
||
export const PriceCategoriesForm = ({ | ||
values, | ||
}: PriceCategoriesFormProps): JSX.Element => { | ||
return ( | ||
<FieldArray | ||
name="priceCategories" | ||
render={() => ( | ||
<FormLayout.Section title="Tarifs"> | ||
{values.priceCategories.map((priceCategory, index) => ( | ||
<FormLayout.Row key={index} inline> | ||
<TextInput | ||
name={`priceCategories[${index}].label`} | ||
label="Intitulé du tarif" | ||
placeholder="Ex : catégorie 1, orchestre..." | ||
maxLength={PRICE_CATEGORY_LABEL_MAX_LENGTH} | ||
countCharacters | ||
className={styles['label-input']} | ||
/> | ||
<TextInput | ||
name={`priceCategories[${index}].price`} | ||
label="Tarif par personne" | ||
placeholder="Ex : 25€" | ||
type="number" | ||
step="0.01" | ||
max={PRICE_CATEGORY_PRICE_MAX} | ||
rightIcon={() => <IcoEuro />} | ||
className={styles['price-input']} | ||
/> | ||
</FormLayout.Row> | ||
))} | ||
</FormLayout.Section> | ||
)} | ||
/> | ||
) | ||
} |
29 changes: 29 additions & 0 deletions
29
pro/src/screens/OfferIndividual/PriceCategories/__specs__/PriceCategories.spec.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
import { render, screen } from '@testing-library/react' | ||
import React from 'react' | ||
import { Provider } from 'react-redux' | ||
import { MemoryRouter } from 'react-router' | ||
|
||
import { configureTestStore } from 'store/testUtils' | ||
import { individualOfferFactory } from 'utils/individualApiFactories' | ||
|
||
import PriceCategories, { IPriceCategories } from '../PriceCategories' | ||
|
||
const renderPriceCategories = (props: IPriceCategories) => { | ||
const store = configureTestStore() | ||
|
||
return render( | ||
<Provider store={store}> | ||
<MemoryRouter> | ||
<PriceCategories {...props} /> | ||
</MemoryRouter> | ||
</Provider> | ||
) | ||
} | ||
|
||
describe('PriceCategories', () => { | ||
it('should render without error', () => { | ||
renderPriceCategories({ offer: individualOfferFactory() }) | ||
|
||
screen.getByText('Tarifs') | ||
}) | ||
}) |
28 changes: 28 additions & 0 deletions
28
pro/src/screens/OfferIndividual/PriceCategories/__specs__/PriceCategoriesForm.spec.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
import { render, screen } from '@testing-library/react' | ||
import { Formik } from 'formik' | ||
import React from 'react' | ||
|
||
import { priceCategoryFormFactory } from '../form/factories' | ||
import { PriceCategoriesFormValues } from '../form/types' | ||
import { PriceCategoriesForm } from '../PriceCategoriesForm' | ||
|
||
describe('PriceCategories', () => { | ||
it('should render without error', () => { | ||
const values: PriceCategoriesFormValues = { | ||
priceCategories: [ | ||
priceCategoryFormFactory(), | ||
priceCategoryFormFactory(), | ||
priceCategoryFormFactory(), | ||
], | ||
isDuo: false, | ||
} | ||
|
||
render( | ||
<Formik initialValues={values} onSubmit={jest.fn()}> | ||
<PriceCategoriesForm values={values} /> | ||
</Formik> | ||
) | ||
|
||
expect(screen.getAllByText('Intitulé du tarif')).toHaveLength(3) | ||
}) | ||
}) |
13 changes: 13 additions & 0 deletions
13
pro/src/screens/OfferIndividual/PriceCategories/form/computeInitialValues.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
import { PriceCategoriesFormValues } from './types' | ||
|
||
export const computeInitialValues = (): PriceCategoriesFormValues => { | ||
return { | ||
priceCategories: [ | ||
{ | ||
label: '', | ||
price: '', | ||
}, | ||
], | ||
isDuo: true, | ||
} | ||
} |
3 changes: 3 additions & 0 deletions
3
pro/src/screens/OfferIndividual/PriceCategories/form/constants.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
export const PRICE_CATEGORY_LABEL_MAX_LENGTH = 20 | ||
|
||
export const PRICE_CATEGORY_PRICE_MAX = 300 |
7 changes: 7 additions & 0 deletions
7
pro/src/screens/OfferIndividual/PriceCategories/form/factories.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
import { PriceCategoryForm } from './types' | ||
|
||
let priceCategoryFormId = 1 | ||
export const priceCategoryFormFactory = (): PriceCategoryForm => ({ | ||
label: `Tarif ${priceCategoryFormId++}`, | ||
price: 20, | ||
}) |
6 changes: 6 additions & 0 deletions
6
pro/src/screens/OfferIndividual/PriceCategories/form/onSubmit.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
import { PriceCategoriesFormValues } from './types' | ||
|
||
export const onSubmit = (values: PriceCategoriesFormValues) => { | ||
// eslint-disable-next-line no-console | ||
console.log('submit !', values) | ||
} |
15 changes: 15 additions & 0 deletions
15
pro/src/screens/OfferIndividual/PriceCategories/form/types.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
// Don't know why but eslint doesn't like the import of FormikProps but it exists trust me | ||
// eslint-disable-next-line import/named | ||
import { FormikProps } from 'formik' | ||
|
||
export type PriceCategoryForm = { | ||
label: string | ||
price: number | '' | ||
} | ||
|
||
export type PriceCategoriesFormValues = { | ||
priceCategories: PriceCategoryForm[] | ||
isDuo: boolean | ||
} | ||
|
||
export type PriceCategoriesFormType = FormikProps<PriceCategoriesFormValues> |
18 changes: 18 additions & 0 deletions
18
pro/src/screens/OfferIndividual/PriceCategories/form/useForm.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
import { useFormik } from 'formik' | ||
|
||
import { computeInitialValues } from './computeInitialValues' | ||
import { onSubmit } from './onSubmit' | ||
import { PriceCategoriesFormValues } from './types' | ||
import { validationSchema } from './validationSchema' | ||
|
||
export const usePriceCategoriesForm = () => { | ||
const initialValues = computeInitialValues() | ||
|
||
const form = useFormik<PriceCategoriesFormValues>({ | ||
initialValues, | ||
validationSchema, | ||
onSubmit, | ||
}) | ||
|
||
return form | ||
} |
30 changes: 30 additions & 0 deletions
30
pro/src/screens/OfferIndividual/PriceCategories/form/validationSchema.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
import * as yup from 'yup' | ||
|
||
import { | ||
PRICE_CATEGORY_LABEL_MAX_LENGTH, | ||
PRICE_CATEGORY_PRICE_MAX, | ||
} from './constants' | ||
|
||
export const priceCategoryValidationSchema = yup.object().shape({ | ||
label: yup | ||
.string() | ||
.required('Veuillez renseigner un intitulé de tarif') | ||
.max(PRICE_CATEGORY_LABEL_MAX_LENGTH, 'Le nom du tarif est trop long'), | ||
price: yup | ||
.number() | ||
.required('Veuillez renseigner un tarif') | ||
.positive() | ||
.max( | ||
PRICE_CATEGORY_PRICE_MAX, | ||
`Veuillez renseigner un tarif inférieur à ${PRICE_CATEGORY_PRICE_MAX}€` | ||
), | ||
}) | ||
|
||
export const validationSchema = yup.object().shape({ | ||
priceCategories: yup | ||
.array() | ||
.of(priceCategoryValidationSchema) | ||
.required() | ||
.min(1), | ||
isDuo: yup.boolean(), | ||
}) |