diff --git a/source/components/conversation/FormDecorator.js b/source/components/conversation/FormDecorator.js index 507e28b5c..49102f753 100644 --- a/source/components/conversation/FormDecorator.js +++ b/source/components/conversation/FormDecorator.js @@ -79,8 +79,8 @@ export var FormDecorator = formType => RenderField => return (
pointOutObjectives(objectives)} - onMouseOut={() => pointOutObjectives([])}> + onMouseEnter={() => pointOutObjectives(objectives)} + onMouseLeave={() => pointOutObjectives([])}> {this.state.helpVisible && this.renderHelpBox(helpText)}
{this.renderHeader(unfolded, valueType, human, helpText, wideQuestion, subquestion)} diff --git a/source/engine/generateQuestions.js b/source/engine/generateQuestions.js index 46fa82ffb..d2fdda7c6 100644 --- a/source/engine/generateQuestions.js +++ b/source/engine/generateQuestions.js @@ -50,16 +50,19 @@ let buildVariantTree = relevantPaths => path => { return rec(path) } -export let generateGridQuestions = R.pipe( +export let generateGridQuestions = missingVariables => R.pipe( R.toPairs, R.map( ([variantRoot, relevantVariants]) => ({ ...constructStepMeta(findRuleByDottedName(variantRoot)), component: Question, choices: buildVariantTree(relevantVariants)(variantRoot), - objectives: [] + objectives: R.pipe( + R.chain(v => missingVariables[v]), + R.uniq() + )(relevantVariants) }) - ), + ) //TODO reintroduce objectives // { @@ -69,7 +72,7 @@ export let generateGridQuestions = R.pipe( // )(variant['une possibilité']) // } ) -export let generateSimpleQuestions = R.pipe( +export let generateSimpleQuestions = missingVariables => R.pipe( R.values, //TODO exploiter ici les groupes de questions de type 'record' (R.keys): elles pourraient potentiellement êtres regroupées visuellement dans le formulaire R.unnest, R.map(dottedName => { @@ -95,7 +98,7 @@ export let generateSimpleQuestions = R.pipe( ], }, { - objectives: [] //missingVariables[dottedName], + objectives: missingVariables[dottedName], } ) }) diff --git a/source/engine/rules.js b/source/engine/rules.js index 9d3ccadf8..1f29a20be 100644 --- a/source/engine/rules.js +++ b/source/engine/rules.js @@ -140,7 +140,7 @@ export let collectMissingVariables = (groupMethod='groupByMissingVariable') => a let isVariant = R.path(['formule', 'une possibilité']) -export let recrecrecrec = +export let findVariantsAndRecords = ({variantGroups, recordGroups}, dottedName, childDottedName) => { let child = findRuleByDottedName(dottedName), parentDottedName = parentName(dottedName), @@ -149,7 +149,7 @@ export let recrecrecrec = let grandParentDottedName = parentName(parentDottedName), grandParent = findRuleByDottedName(grandParentDottedName) if (isVariant(grandParent)) - return recrecrecrec({variantGroups, recordGroups}, parentDottedName, childDottedName || dottedName) + return findVariantsAndRecords({variantGroups, recordGroups}, parentDottedName, childDottedName || dottedName) else return { variantGroups: R.mergeWith(R.concat, variantGroups, {[parentDottedName]: [childDottedName || dottedName]}), diff --git a/source/reducers.js b/source/reducers.js index d5349b8d1..6325b4812 100644 --- a/source/reducers.js +++ b/source/reducers.js @@ -8,7 +8,7 @@ import { euro, months } from './components/conversation/formValueTypes.js' import { STEP_ACTION, START_CONVERSATION, EXPLAIN_VARIABLE, POINT_OUT_OBJECTIVES} from './actions' import R from 'ramda' -import {findGroup, findRuleByDottedName, parentName, collectMissingVariables, recrecrecrec} from './engine/rules' +import {findGroup, findRuleByDottedName, parentName, collectMissingVariables, findVariantsAndRecords} from './engine/rules' import {generateGridQuestions, generateSimpleQuestions} from './engine/generateQuestions' @@ -88,29 +88,25 @@ let analyse = rootVariable => R.pipe( let missingVariables -let buildNextSteps = R.pipe( - /* - COLLECTE DES VARIABLES MANQUANTES - ********************************* - on collecte les variables manquantes : celles qui sont nécessaires pour - remplir les objectifs de la simulation (calculer des cotisations) mais qui n'ont pas - encore été renseignées +/* + COLLECTE DES VARIABLES MANQUANTES + ********************************* + on collecte les variables manquantes : celles qui sont nécessaires pour + remplir les objectifs de la simulation (calculer des cotisations) mais qui n'ont pas + encore été renseignées - TODO perf : peut-on le faire en même temps que l'on traverse l'AST ? - Oui sûrement, cette liste se complète en remontant l'arbre. En fait, on le fait déjà pour nodeValue, - et quand nodeValue vaut null, c'est qu'il y a des missingVariables ! Il suffit donc de remplacer les - null par un tableau, et d'ailleurs utiliser des fonction d'aide pour mutualiser ces tests. + TODO perf : peut-on le faire en même temps que l'on traverse l'AST ? + Oui sûrement, cette liste se complète en remontant l'arbre. En fait, on le fait déjà pour nodeValue, + et quand nodeValue vaut null, c'est qu'il y a des missingVariables ! Il suffit donc de remplacer les + null par un tableau, et d'ailleurs utiliser des fonction d'aide pour mutualiser ces tests. + + missingVariables: {variable: [objectives]} + */ +let buildNextSteps = analysedSituation => { + let missingVariables = collectMissingVariables('groupByMissingVariable')( + R.path(['formule', 'explanation', 'explanation'])(analysedSituation) + ) - missingVariables: {variable: [objectives]} - */ - R.path(['formule', 'explanation', 'explanation']), - analysedSituation => { - // console.log('analysedSituation', analysedSituation) - //TODO temporary fix - missingVariables = collectMissingVariables('groupByMissingVariable')(analysedSituation) - return missingVariables - }, - R.keys, /* Parmi les variables manquantes, certaines sont citées dans une règle de type 'une possibilité'. **On appelle ça des groupes de type 'variante'.** @@ -135,18 +131,21 @@ let buildNextSteps = R.pipe( D'autres variables pourront être regroupées aussi, car elles partagent un parent, mais sans fusionner leurs questions dans l'interface. Ce sont des **groupes de type _record_ ** */ - R.reduce( - recrecrecrec //TODO reorganize - , {variantGroups: {}, recordGroups: {}} - ), - // on va maintenant construire la liste des composants React qui afficheront les questions à l'utilisateur pour que l'on obtienne les variables manquantes - R.evolve({ - variantGroups: generateGridQuestions, - recordGroups: generateSimpleQuestions, - }), - R.values, - R.unnest, -) + return R.pipe( + R.keys, + R.reduce( + findVariantsAndRecords + , {variantGroups: {}, recordGroups: {}} + ), + // on va maintenant construire la liste des composants React qui afficheront les questions à l'utilisateur pour que l'on obtienne les variables manquantes + R.evolve({ + variantGroups: generateGridQuestions(missingVariables), + recordGroups: generateSimpleQuestions(missingVariables), + }), + R.values, + R.unnest, + )(missingVariables) +} export default reduceReducers( combineReducers({