Skip to content

Commit

Permalink
fix: il faut différencier les réponses multiples de la expression sou…
Browse files Browse the repository at this point in the history
…s forme d’objet Publicodes
  • Loading branch information
JalilArfaoui committed Aug 28, 2024
1 parent 9a1074e commit 0e5f103
Show file tree
Hide file tree
Showing 6 changed files with 75 additions and 17 deletions.
19 changes: 16 additions & 3 deletions site/source/components/conversation/QuestionEnCours.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { isObject } from 'effect/Predicate'
import { DottedName } from 'modele-social'
import Engine, { PublicodesExpression } from 'publicodes'
import { PublicodesExpression } from 'publicodes'
import React, { useCallback } from 'react'
import { Trans, useTranslation } from 'react-i18next'
import { useDispatch, useSelector } from 'react-redux'
Expand All @@ -16,7 +17,10 @@ import { useEngine } from '@/components/utils/EngineContext'
import { Button } from '@/design-system/buttons'
import { Grid } from '@/design-system/layout'
import { H3 } from '@/design-system/typography/heading'
import { enregistreLaRéponse } from '@/store/actions/actions'
import {
enregistreLaRéponse,
enregistreLesRéponses,
} from '@/store/actions/actions'
import { estSurLaPremièreQuestionRépondueSelector } from '@/store/selectors/estSurLaPremièreQuestionRépondue.selector'
import { situationSelector } from '@/store/selectors/simulationSelectors'
import { evaluateQuestion } from '@/utils'
Expand Down Expand Up @@ -72,7 +76,16 @@ export function QuestionEnCours({
value: PublicodesExpression | undefined,
dottedName: DottedName
) => {
dispatch(enregistreLaRéponse(dottedName, value))
if (value && isObject(value) && 'batchUpdate' in value) {
dispatch(
enregistreLesRéponses(
dottedName,
value.batchUpdate as Record<string, PublicodesExpression>
)
)
} else {
dispatch(enregistreLaRéponse(dottedName, value))
}
}

const isDateQuestion =
Expand Down
2 changes: 1 addition & 1 deletion site/source/components/conversation/RuleInput.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ export default function RuleInput<Names extends string = DottedName>({
<>
<SelectCommune
{...commonProps}
onChange={(c) => commonProps.onChange(c)}
onChange={(c) => commonProps.onChange({ batchUpdate: c })} // 😭
value={value as Evaluation<string>}
/>
<Spacing md />
Expand Down
14 changes: 1 addition & 13 deletions site/source/domaine/updateSituation.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
import { pipe } from 'effect'
import { isNumber, isString } from 'effect/Predicate'
import * as R from 'effect/Record'
import { DottedName } from 'modele-social'
import { PublicodesExpression } from 'publicodes'

Expand All @@ -22,17 +19,8 @@ export function updateSituation(

const objectifsExclusifs = config['objectifs exclusifs'] ?? []

const nouvellesValeurs =
isString(value) || isNumber(value)
? { [dottedName]: value }
: pipe(
value,
R.mapKeys((suffixe) => `${dottedName} . ${suffixe}`),
R.map((valeur) => (isString(valeur) ? `'${valeur}'` : valeur)) // 😭
)

if (!objectifsExclusifs.includes(dottedName)) {
return { ...currentSituation, ...nouvellesValeurs }
return { ...currentSituation, [dottedName]: value }
}

const objectifsToReset = objectifsExclusifs.filter(
Expand Down
24 changes: 24 additions & 0 deletions site/source/domaine/updateSituationMultiple.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { pipe } from 'effect'
import { isString } from 'effect/Predicate'
import * as R from 'effect/Record'
import { DottedName } from 'modele-social'
import { PublicodesExpression } from 'publicodes'

import { SimulationConfig } from '@/domaine/SimulationConfig'
import { Situation } from '@/domaine/Situation'
import { ImmutableType } from '@/types/utils'

export function updateSituationMultiple(
config: ImmutableType<SimulationConfig>,
currentSituation: Situation,
préfixe: DottedName,
valeurs: Record<string, PublicodesExpression>
): Situation {
const nouvellesValeurs = pipe(
valeurs,
R.mapKeys((suffixe) => `${préfixe} . ${suffixe}`),
R.map((valeur) => (isString(valeur) ? `'${valeur}'` : valeur)) // 😭
)

return { ...currentSituation, ...nouvellesValeurs }
}
11 changes: 11 additions & 0 deletions site/source/store/actions/actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ export type Action =
| typeof vaÀLaQuestionSuivante
| typeof ajusteLaSituation
| typeof enregistreLaRéponse
| typeof enregistreLesRéponses
| typeof deleteFromSituation
| typeof updateUnit
| typeof batchUpdateSituation
Expand Down Expand Up @@ -79,6 +80,16 @@ export const enregistreLaRéponse = (
value,
} as const)

export const enregistreLesRéponses = (
règle: DottedName,
valeurs: Record<string, PublicodesExpression>
) =>
({
type: 'ENREGISTRE_LES_RÉPONSES',
règle,
valeurs,
}) as const

export const deleteFromSituation = (fieldName: DottedName) =>
({
type: 'DELETE_FROM_SITUATION',
Expand Down
22 changes: 22 additions & 0 deletions site/source/store/reducers/simulation.reducer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { SimulationConfig } from '@/domaine/SimulationConfig'
import { Situation } from '@/domaine/Situation'
import { updateSituation } from '@/domaine/updateSituation'
import { updateSituationMulti } from '@/domaine/updateSituationMulti'
import { updateSituationMultiple } from '@/domaine/updateSituationMultiple'
import { Action } from '@/store/actions/actions'
import { omit, reject } from '@/utils'

Expand Down Expand Up @@ -87,6 +88,27 @@ export function simulationReducer(
}
}

case 'ENREGISTRE_LES_RÉPONSES': {
const déjàDansLesQuestionsRépondues = state.answeredQuestions.includes(
action.règle
)

const answeredQuestions = déjàDansLesQuestionsRépondues
? state.answeredQuestions
: [...state.answeredQuestions, action.règle]

return {
...state,
answeredQuestions,
situation: updateSituationMultiple(
state.config,
state.situation,
action.règle,
action.valeurs
),
}
}

case 'DELETE_FROM_SITUATION': {
const newState = {
...state,
Expand Down

0 comments on commit 0e5f103

Please sign in to comment.