From e0d291dbf9cab4a314c8411f86b98257d34b418e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Rialland?= Date: Wed, 9 Mar 2022 11:56:05 +0100 Subject: [PATCH] Ajout du select et du radio inline --- .../règles/exonération-covid.yaml | 2 + .../components/conversation/ChoicesInput.tsx | 31 ++++- .../components/conversation/RuleInput.tsx | 25 ++++- .../Simulateurs/ExonerationCovid/index.tsx | 106 +++++++++++++++--- 4 files changed, 146 insertions(+), 18 deletions(-) diff --git a/exoneration-covid/règles/exonération-covid.yaml b/exoneration-covid/règles/exonération-covid.yaml index ea7688ba3..d0710eff4 100644 --- a/exoneration-covid/règles/exonération-covid.yaml +++ b/exoneration-covid/règles/exonération-covid.yaml @@ -33,6 +33,7 @@ lieu d'exercice: possibilités: - métropole - outre-mer + type: radio inline lieu d'exercice . métropole: titre: En métropole @@ -60,6 +61,7 @@ début d'activité: - octobre 2021 - novembre 2021 - décembre 2021 + type: select début d'activité . avant 2021: début d'activité . janvier 2021: diff --git a/site/source/components/conversation/ChoicesInput.tsx b/site/source/components/conversation/ChoicesInput.tsx index 23c8636d9..a7eebcc62 100644 --- a/site/source/components/conversation/ChoicesInput.tsx +++ b/site/source/components/conversation/ChoicesInput.tsx @@ -4,6 +4,7 @@ import { Markdown } from '@/components/utils/markdown' import ButtonHelp from '@/design-system/buttons/ButtonHelp' import { Radio, RadioGroup, ToggleGroup } from '@/design-system/field' import { RadioBlock } from '@/design-system/field/Radio/Radio' +import { Item, Select } from '@/design-system/field/Select' import { Spacing } from '@/design-system/layout' import { H4 } from '@/design-system/typography/heading' import { DottedName } from 'modele-social' @@ -188,7 +189,35 @@ export function OuiNonInput( ) } -function useSelection({ +const relativeDottedName = (childDottedName: string, rootDottedName: string) => + childDottedName.replace(rootDottedName + ' . ', '') + +export const SelectAnswerInput = ({ + choice, + ...props +}: { choice: Choice } & InputProps) => { + const { handleChange, defaultValue, currentSelection } = useSelection(props) + + return ( + + ) +} + +export function useSelection({ value, onChange, missing, diff --git a/site/source/components/conversation/RuleInput.tsx b/site/source/components/conversation/RuleInput.tsx index 6c291fa1a..8fd3785f5 100644 --- a/site/source/components/conversation/RuleInput.tsx +++ b/site/source/components/conversation/RuleInput.tsx @@ -13,7 +13,12 @@ import Engine, { RuleNode, } from 'publicodes' import React, { useContext } from 'react' -import { Choice, MultipleAnswerInput, OuiNonInput } from './ChoicesInput' +import { + Choice, + MultipleAnswerInput, + OuiNonInput, + SelectAnswerInput, +} from './ChoicesInput' import DateInput from './DateInput' import ParagrapheInput from './ParagrapheInput' import SelectPaysDétachement from './select/SelectPaysDétachement' @@ -103,6 +108,14 @@ export default function RuleInput< ...props, } + if (rule.rawNode.type === 'select') { + return ( + + ) + } if ( isMetadata>(rule.rawNode) && rule.rawNode.metadata.component === 'ToggleRadioBlock' @@ -115,6 +128,16 @@ export default function RuleInput< /> ) } + if (rule.rawNode.type === 'radio inline') { + return ( + + ) + } if (getVariant(engine.getRule(dottedName))) { return ( > - >({}) + >(() => { + const defaultSituation = { ...params } + covidEngine.setSituation(defaultSituation) + + return defaultSituation + }) + const updateSituation = useCallback( (name: DottedNames, value: PublicodesExpression | undefined) => { const newSituation = { ...situation, [name]: value } @@ -21,26 +44,77 @@ export default function ExonérationCovid() { [situation] ) + const step2 = rootDottedNames.every((names) => params[names]) + return ( <> -

{covidEngine.getRule('secteur').rawNode.question}

- updateSituation('secteur', value)} - /> + {step2 ? ( + <>Page 2 + ) : ( + <> +

{covidEngine.getRule('secteur').rawNode.question}

+ updateSituation('secteur', value)} + /> -

{covidEngine.getRule("début d'activité").rawNode.question}

- updateSituation("début d'activité", value)} - /> +

{covidEngine.getRule("début d'activité").rawNode.question}

+ -

{covidEngine.getRule("lieu d'exercice").rawNode.question}

- updateSituation("début d'activité", value)} - /> + + updateSituation("début d'activité", value)} + /> + + +

{covidEngine.getRule("lieu d'exercice").rawNode.question}

+ updateSituation("lieu d'exercice", value)} + /> + + )} + + + + + + {step2 ? ( + + ) : ( + + )} + + + +