From 268d721364fe7c11b93f8eeefedf57551ba56756 Mon Sep 17 00:00:00 2001 From: mama Date: Fri, 28 Apr 2017 17:47:01 +0200 Subject: [PATCH] Travail sur la documentation dans la simulation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ajout de titres :bug: certaines documentation de variables ne s'affichaient pas etc. + Résolution bug evaluateVariable --- maison2.svg | 1152 +++++++++++++++-- .../indemnité_compensatrice_congés_payés.yaml | 2 +- .../entités/ok/CDD.motifs.contrats-aidés.yaml | 1 + .../entités/ok/CDD.motifs.yaml | 23 +- .../rémunération-travail/entités/ok/CDD.yaml | 3 +- .../entités/ok/CDD.événements.yaml | 7 +- .../entités/ok/contrat-salarié.yaml | 8 +- règles/simulateurs.yaml | 4 +- source/components/Aide.css | 28 +- source/components/Aide.js | 18 +- source/components/AttachDictionary.js | 41 + source/components/CDD.css | 2 +- source/components/CDDIntro.css | 65 - source/components/CDDIntro.js | 38 - source/components/References.css | 1 + source/components/References.js | 2 +- source/components/Results.css | 2 +- source/components/Rule.css | 2 +- source/components/Rule.js | 40 +- source/components/Simulateur.js | 2 +- source/components/conversation/Explicable.js | 18 +- source/components/conversation/Question.js | 8 +- .../components/conversation/conversation.css | 9 +- source/containers/Home.js | 2 +- source/engine/generateQuestions.js | 2 +- source/engine/known-mecanisms.yaml | 2 +- source/engine/traverse.js | 1 - source/engine/variables.js | 3 +- 28 files changed, 1179 insertions(+), 307 deletions(-) create mode 100644 source/components/AttachDictionary.js delete mode 100644 source/components/CDDIntro.css delete mode 100644 source/components/CDDIntro.js diff --git a/maison2.svg b/maison2.svg index 9d20fb0a2..d214bd2e6 100644 --- a/maison2.svg +++ b/maison2.svg @@ -15,7 +15,7 @@ viewBox="0 0 1052.3622 744.09448" id="svg36777" version="1.1" - inkscape:version="0.91 r13725" + inkscape:version="0.92.1 r15371" sodipodi:docname="maison2.svg"> @@ -115,6 +115,12 @@ offset="1" id="stop9936" /> + image/svg+xml - + @@ -171,23 +177,22 @@ inkscape:export-ydpi="90" /> SystèmeSocial - - - - - - - - - + id="g5143"> + inkscape:connector-curvature="0" + id="path4321" + d="m 458.22051,654.42584 39.75016,0" + style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.84318548px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + inkscape:connector-curvature="0" + id="path4321-9" + d="m 458.24847,652.25764 39.75016,0" + style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.84318548px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + inkscape:connector-curvature="0" + id="path4321-2" + d="m 458.1463,650.11956 39.75017,0" + style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.84318548px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + inkscape:connector-curvature="0" + id="path4321-9-7" + d="m 458.17426,647.95137 39.75017,0" + style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.84318548px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + inkscape:connector-curvature="0" + id="path4321-9-9" + d="m 458.63295,642.36528 39.75017,0" + style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.84318548px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + inkscape:connector-curvature="0" + id="path4321-2-3" + d="m 458.53078,640.2272 39.75017,0" + style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.84318548px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + inkscape:connector-curvature="0" + id="path4321-9-7-6" + d="m 458.55874,638.05901 39.75017,0" + style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.84318548px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + + + + + + + + + + + OMBRES ! + y="687.09436" + style="font-size:12.5px;line-height:1.25">OMBRES ! > + style="font-size:12.5px;line-height:1.25;fill:#ffffff;fill-opacity:1;stroke:#fff1f1;stroke-width:0.60000002;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + > diff --git a/règles/rémunération-travail/cdd/indemnité_compensatrice_congés_payés.yaml b/règles/rémunération-travail/cdd/indemnité_compensatrice_congés_payés.yaml index 7ac70aa3d..02f87b261 100644 --- a/règles/rémunération-travail/cdd/indemnité_compensatrice_congés_payés.yaml +++ b/règles/rémunération-travail/cdd/indemnité_compensatrice_congés_payés.yaml @@ -52,7 +52,7 @@ - maintenant : Les congés peuvent être pris dès l’embauche [...] - references: + références: Fiche service-public.gouv.fr: https://www.service-public.fr/particuliers/vosdroits/F2931 Code du travail - Article L3141-24: https://www.legifrance.gouv.fr/affichCodeArticle.do?cidTexte=LEGITEXT000006072050&idArticle=LEGIARTI000006902661&dateTexte=&categorieLien=cid Congés payés et contrat CDD: https://www.easycdd.com/LEGISLATION-CDD/L-embauche-le-suivi-du-contrat-CDD-les-incidents-frequents/Conges-payes-et-contrat-CDD diff --git a/règles/rémunération-travail/entités/ok/CDD.motifs.contrats-aidés.yaml b/règles/rémunération-travail/entités/ok/CDD.motifs.contrats-aidés.yaml index d01b15bad..24a8a01a8 100644 --- a/règles/rémunération-travail/entités/ok/CDD.motifs.contrats-aidés.yaml +++ b/règles/rémunération-travail/entités/ok/CDD.motifs.contrats-aidés.yaml @@ -3,6 +3,7 @@ - espace: contrat salarié . CDD . motif nom: contrat aidé + titre: Contrat aidé # Voir le TODO de contrat salarié . CDD . événement . CDD poursuivi en CDI # formule: # une possibilité: diff --git a/règles/rémunération-travail/entités/ok/CDD.motifs.yaml b/règles/rémunération-travail/entités/ok/CDD.motifs.yaml index aa78e86ab..e5ac9d0d6 100644 --- a/règles/rémunération-travail/entités/ok/CDD.motifs.yaml +++ b/règles/rémunération-travail/entités/ok/CDD.motifs.yaml @@ -1,6 +1,6 @@ - espace: contrat salarié . CDD nom: motif - nom complet: motif de recours + titre: Motif de recours question: Quel est le motif de recours au CDD ? description: | Le CDD est un contrat d'exception: son recours doit être autorisé par l'un des motifs spécifiés dans la loi. @@ -49,11 +49,11 @@ Nous regroupons dans cette catégorie les cas suivants. - Remplacement d'un salarié en cas : - a) D'absence ; - b) De passage provisoire à temps partiel, conclu par avenant à son contrat de travail ou par échange écrit entre ce salarié et son employeur ; - c) De suspension de son contrat de travail ; - d) De départ définitif précédant la suppression de son poste de travail après consultation du comité d'entreprise ou, à défaut, des délégués du personnel, s'il en existe ; - e) D'attente de l'entrée en service effective du salarié recruté par contrat à durée indéterminée appelé à le remplacer ; + - D'absence ; + - De passage provisoire à temps partiel, conclu par avenant à son contrat de travail ou par échange écrit entre ce salarié et son employeur ; + - De suspension de son contrat de travail ; + - De départ définitif précédant la suppression de son poste de travail après consultation du comité d'entreprise ou, à défaut, des délégués du personnel, s'il en existe ; + - D'attente de l'entrée en service effective du salarié recruté par contrat à durée indéterminée appelé à le remplacer ; - Remplacement d'un chef d'entreprise artisanale, industrielle ou commerciale, d'une personne exerçant une profession libérale, de son conjoint participant effectivement à l'activité de l'entreprise à titre professionnel et habituel ou d'un associé non salarié d'une société civile professionnelle, d'une société civile de moyens d'une société d'exercice libéral ou de toute autre personne morale exerçant une profession libérale ; @@ -67,9 +67,9 @@ Recrutement d'ingénieurs et de cadres, au sens des conventions collectives, en vue de la réalisation d'un objet défini lorsqu'un accord de branche étendu ou, à défaut, un accord d'entreprise le prévoit et qu'il définit : - a) Les nécessités économiques auxquelles ces contrats sont susceptibles d'apporter une réponse adaptée ; - b) Les conditions dans lesquelles les salariés sous contrat à durée déterminée à objet défini bénéficient de garanties relatives à l'aide au reclassement, à la validation des acquis de l'expérience, à la priorité de réembauche et à l'accès à la formation professionnelle continue et peuvent, au cours du délai de prévenance, mobiliser les moyens disponibles pour organiser la suite de leur parcours professionnel ; - c) Les conditions dans lesquelles les salariés sous contrat à durée déterminée à objet défini ont priorité d'accès aux emplois en contrat à durée indéterminée dans l'entreprise. + - Les nécessités économiques auxquelles ces contrats sont susceptibles d'apporter une réponse adaptée ; + - Les conditions dans lesquelles les salariés sous contrat à durée déterminée à objet défini bénéficient de garanties relatives à l'aide au reclassement, à la validation des acquis de l'expérience, à la priorité de réembauche et à l'accès à la formation professionnelle continue et peuvent, au cours du délai de prévenance, mobiliser les moyens disponibles pour organiser la suite de leur parcours professionnel ; + - Les conditions dans lesquelles les salariés sous contrat à durée déterminée à objet défini ont priorité d'accès aux emplois en contrat à durée indéterminée dans l'entreprise. - espace: contrat salarié . CDD . motif . classique nom: usage @@ -77,7 +77,7 @@ alias: motif extra description: Emplois pour lesquels, dans certains secteurs d'activité définis par décret ou par convention ou accord collectif de travail étendu, il est d'usage constant de ne pas recourir au contrat de travail à durée indéterminée en raison de la nature de l'activité exercée et du caractère par nature temporaire de ces emplois ; références: - service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F33693 + Embauche en contrat d'extra : https://www.service-public.fr/professionnels-entreprises/vosdroits/F33693 formule-futur: #TODO intégrer ça dans le formulaire. Comment ? contrainte: @@ -107,9 +107,10 @@ - espace: contrat salarié . CDD . motif nom: complément formation titre: Complément de formation professionnelle assuré par l'employeur - description: l'employeur s'engage, pour une durée et dans des conditions déterminées par décret, à assurer un complément de formation professionnelle au salarié. + description: L'employeur s'engage, pour une durée et dans des conditions déterminées par décret, à assurer un complément de formation professionnelle au salarié. références: Code du travail - Article L1242-3 : https://www.legifrance.gouv.fr/affichCodeArticle.do;jsessionid=714D2E2B814371F4F1D5AA88472CD621.tpdila20v_1?idArticle=LEGIARTI000006901196&cidTexte=LEGITEXT000006072050&dateTexte=20170420 + Code du travail - Décret D1242-3 : https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000018537448&cidTexte=LEGITEXT000006072050 - espace: contrat salarié . CDD . motif diff --git a/règles/rémunération-travail/entités/ok/CDD.yaml b/règles/rémunération-travail/entités/ok/CDD.yaml index 9b2fff3c7..4d81458e4 100644 --- a/règles/rémunération-travail/entités/ok/CDD.yaml +++ b/règles/rémunération-travail/entités/ok/CDD.yaml @@ -3,7 +3,7 @@ - espace: contrat salarié nom: CDD - nom complet: CDD + titre: Contrat à durée déterminée description: Contrat de travail pour lequel un employeur peut recruter un salarié pour une durée déterminée, car la cause de cette détermination, de la date ou échéance de fin de contrat est prévue explicitement par le Code du travail. référence: https://fr.wikipedia.org/wiki/Contrat_de_travail_%C3%A0_dur%C3%A9e_d%C3%A9termin%C3%A9e_en_France # # TODO: règle de type : il faut q'un motif et une durée soient sélectionnés pour qu'un contrat soit un CDD. Cela revient à dire que les variables CDD et motif sont obligatoires *dans le contexte* de leur attache @@ -35,6 +35,7 @@ - espace: contrat salarié . CDD nom: congés non pris + titre: Congés non pris question: Combien de jours de congés ne seront pas pris ? description: Combien de jours de congés ne pourront être pris par l'employé, du fait de la durée de son CDD. En jours ouvrés, par rapport aux 25 jours de congés légaux annuels. format: nombre positif diff --git a/règles/rémunération-travail/entités/ok/CDD.événements.yaml b/règles/rémunération-travail/entités/ok/CDD.événements.yaml index 826eb6342..f8dfcbc58 100644 --- a/règles/rémunération-travail/entités/ok/CDD.événements.yaml +++ b/règles/rémunération-travail/entités/ok/CDD.événements.yaml @@ -3,8 +3,9 @@ titre: Événement de contrat question: Pensez-vous être confronté à l'un de ces événements au cours du contrat ? description: | - Certains de ces événements impactent fortement les résultats de la simulation, et peuvent donc la racourcir. - Par exemple, dans l'hypothèse d'un CDD poursuivi en CDI, aucune majoration ou indemnité ne sera à verser ! + Certains événements impactent fortement les résultats de la simulation, et peuvent donc la racourcir. + + > Par exemple, dans l'hypothèse d'un CDD poursuivi en CDI, aucune majoration ou indemnité ne sera à verser ! formule: une possibilité: - CDD poursuivi en CDI @@ -17,6 +18,7 @@ - espace: contrat salarié . CDD . événement nom: CDD poursuivi en CDI titre: Le CDD est poursuivi en CDI + description: En fin de contrat, le CDD est reconduit en CDI sans interruption. # TODO quand cette variable est appelée par une autre variable, # on devrait pouvoir poser la question, puis proposer un bouton qui permette d'aider l'utilisateur à # y répondre, en lui expliquant la formule suivante : @@ -26,7 +28,6 @@ # - embauche en CDI suivant le CDD # - CDD requalifié en CDI # quand ça arrive ? - - espace: contrat salarié . CDD . événement nom: refus CDI avantageux titre: Refus d'un CDI avantageux diff --git a/règles/rémunération-travail/entités/ok/contrat-salarié.yaml b/règles/rémunération-travail/entités/ok/contrat-salarié.yaml index da1e5dc3c..7b65c99dc 100644 --- a/règles/rémunération-travail/entités/ok/contrat-salarié.yaml +++ b/règles/rémunération-travail/entités/ok/contrat-salarié.yaml @@ -32,8 +32,14 @@ - espace: contrat salarié nom: salaire brut + titre: Salaire brut question: Quel est le salaire brut ? - description: Le salaire brut peut être vu comme la somme du salaire net et des cotisations sociales salariales retenues sur le bulletin de paie d'un salarié, ou comme les sommes perçues par le salarié au titre de son contrat de travail, avant retenues sociales et fiscales. + description: | + C'est le salaire de négociation du contrat de travail en France. + + Il peut être vu comme : + - la somme du salaire net et des cotisations sociales salariales retenues sur le bulletin de paie d'un salarié + - ou comme les sommes perçues par le salarié au titre de son contrat de travail, avant retenues sociales et fiscales. format: nombre positif # TODO En attendant que l'UI devienne plus intelligente, c'est confondu avec le salaire de base. # intelligente : il faudrait demander : `salaire brut`, puis un bouton `qu'est-ce que c'est` pour nous guider et décortiquer la formule diff --git a/règles/simulateurs.yaml b/règles/simulateurs.yaml index 8751446b7..37efd6d37 100644 --- a/règles/simulateurs.yaml +++ b/règles/simulateurs.yaml @@ -13,7 +13,7 @@ titre: Votre obligation action: - texte: Répondez à quelques questions pour estimer le montant des 4 obligations du CDD. + texte: Découvrez en quelques clics le montant des 4 obligations du CDD. bouton: C'est parti ! objectif: surcoût CDD conclusion: | @@ -21,7 +21,7 @@ Cliquez sur les obligations en bas pour comprendre vos résultats. - Une remarque ? [Écrivez-nous](mailto:contact@embauche.beta.gouv.fr) ! + Une remarque ? [Écrivez-nous](/contact) ! # @@ -14,13 +15,16 @@ import References from './References' }) ) export default class Aide extends Component { + renderExplanationMarkdown(explanation, term) { + return marked(`### ${term} \n\n${explanation}`) + } render() { let {explained, stopExplaining} = this.props if (!explained) return
- let rule = findRuleByName(explained), - text = rule.description || rule.titre, + let rule = findRuleByDottedName(explained), + text = rule.description, refs = rule.références let possibilities = rule['choix exclusifs'] @@ -31,10 +35,10 @@ export default class Aide extends Component { -

- {text} +

- { possibilities && + {/* { possibilities &&

{possibilities.length} possibilités :

    @@ -43,7 +47,7 @@ export default class Aide extends Component { )}

- } + } */} {refs &&

Pour en savoir plus:

diff --git a/source/components/AttachDictionary.js b/source/components/AttachDictionary.js new file mode 100644 index 000000000..dab428e59 --- /dev/null +++ b/source/components/AttachDictionary.js @@ -0,0 +1,41 @@ +import React, { Component } from 'react' +import ReactDOM from 'react-dom' +import R from 'ramda' +import marked from '../engine/marked' + +// On ajoute à la section la possibilité d'ouvrir un panneau d'explication des termes. +// Il suffit à la section d'appeler une fonction fournie en lui donnant du JSX +export let AttachDictionary = dictionary => Decorated => + class extends React.Component { + state = { + term: null, + explanation: null + } + componentDidMount() { + let decoratedNode = ReactDOM.findDOMNode(this.decorated) + decoratedNode.addEventListener('click', e => { + let term = e.target.dataset['termDefinition'], + explanation = R.path([term, 'description'], dictionary) + this.setState({explanation, term}) + }) + } + renderExplanationMarkdown(explanation, term) { + return marked(`### Mécanisme: ${term}\n\n${explanation}`) + } + render(){ + let {explanation, term} = this.state + return ( +
+ this.decorated = decorated} {...this.props} explain={this.explain}/> + {explanation && +
this.setState({term: null, explanation: null})}> +
{e.preventDefault(); e.stopPropagation()}} + dangerouslySetInnerHTML={{__html: this.renderExplanationMarkdown(explanation, term)}}> +
+
+ } +
+ ) + } + } diff --git a/source/components/CDD.css b/source/components/CDD.css index c08fc5cd5..bc4442815 100644 --- a/source/components/CDD.css +++ b/source/components/CDD.css @@ -40,6 +40,6 @@ p { } #questions-answers { - min-width: 55%; + min-width: 50%; transition: width 1s; } diff --git a/source/components/CDDIntro.css b/source/components/CDDIntro.css deleted file mode 100644 index 30f779db3..000000000 --- a/source/components/CDDIntro.css +++ /dev/null @@ -1,65 +0,0 @@ -#simulateurIntro { - background: radial-gradient(ellipse at center, #4A89DC -160%,#333350 100%); - color: white; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; -} - -#simulateurIntro h1 { - margin-top: 3%; - text-align: center; - font-size: 350%; - font-weight: 800; -} - -#simulateurIntro .subtitle { - text-align: center; - font-size: 110%; - font-weight: 300; -} - -#simulateurIntro { - margin-top: 4%; -} - -#simulateurIntro p { - font-size: 120%; - color: white; - opacity: .9; - width: 45%; - margin: 2em auto; -} - -#simulateurIntro #introduction .insist { - font-weight: 600; - /*font-style: italic;*/ -} - - -#simulateurIntro #action { - color: white; - margin-top: 3%; - display: block; - text-align: center; -} -#simulateurIntro #action button { - color: inherit; - background: #4A89DC; - padding: .6em 1.2em; - font-size: 140%; - margin: 0 1em; - width: 12em; - border: none; - box-shadow: 0px 9px 14px 0px rgba(0, 0, 0, 0.1) -} -#simulateurIntro #action button:hover { - box-shadow: none; - opacity: .95; -} - -.italic { - font-style: italic; -} diff --git a/source/components/CDDIntro.js b/source/components/CDDIntro.js deleted file mode 100644 index 84df432b5..000000000 --- a/source/components/CDDIntro.js +++ /dev/null @@ -1,38 +0,0 @@ -import React from 'react' -import colours from './themeColours' -import PageTypeIcon from './PageTypeIcon' -import './CDDIntro.css' -import {Link} from 'react-router-dom' - -export default () => ( -
- -

Simulateur CDD

-
- Découvrir le surcoût employeur du CDD par rapport au CDI -
-
-

- En France, le contrat à durée déterminée est un contrat d'exception au CDI - qui apporte à l'employeur plus de souplesse dans un cadre législatif précis, comportant en particulier des contreparties financières. -

-

- Ce simulateur calcule pour vous les 4 éléments de ce surcoût : -

    -
  • l'indemnité de fin de contrat
  • -
  • le CIF
  • -
  • la majoration chômage
  • -
  • l'indemnité compensatrice de congés payés
  • -
-

-

Par simplification, ces éléments sont tous calculés par mois de contrat.

-

- Tout au long de la simulation, cliquez sur les chaque résultat pour obtenir une explication du calcul. Aussi, vous avez le droit de ne pas savoir: certains termes utilisés dans la simulation ne sont pas évidents : cliquez simplement sur le symbôle • qui les suit pour ouvrir une aide contextuelle. -

- -

- Et n'hésitez pas à nous écrire   ! La loi française est complexe, car très ciblée. Nous ne la changerons pas, mais pouvons la rendre plus transparente. -

-
-
-) diff --git a/source/components/References.css b/source/components/References.css index 060d36168..e7dff70c6 100644 --- a/source/components/References.css +++ b/source/components/References.css @@ -8,6 +8,7 @@ color: inherit; /*text-decoration: none;*/ } + .references li { margin-bottom: .15em; } diff --git a/source/components/References.js b/source/components/References.js index 0795f828e..108b9d81a 100644 --- a/source/components/References.js +++ b/source/components/References.js @@ -22,7 +22,7 @@ export default ({refs}) => ( - {name} + {R.head(name).toUpperCase() + R.tail(name)} })} diff --git a/source/components/Results.css b/source/components/Results.css index a0a3845f6..5d3e20a92 100644 --- a/source/components/Results.css +++ b/source/components/Results.css @@ -64,7 +64,7 @@ min-width: 15em; } #results li.irrelevant .rule-box { - background: rgba(255, 255, 255, 0.65); + background: rgba(255, 255, 255, 0.5); } #results li .pointer { font-size: 300%; diff --git a/source/components/Rule.css b/source/components/Rule.css index 009f48c62..af4ce13b8 100644 --- a/source/components/Rule.css +++ b/source/components/Rule.css @@ -106,7 +106,7 @@ display: none; padding-left: 1em; font-weight: 600; - color: #333350; + color: #4A89DC; } #rule-rules.showValues .situationValue { diff --git a/source/components/Rule.js b/source/components/Rule.js index fab2d1d1a..9017d4696 100644 --- a/source/components/Rule.js +++ b/source/components/Rule.js @@ -14,6 +14,7 @@ import {capitalise0} from '../utils' import knownMecanisms from '../engine/known-mecanisms.yaml' import marked from '../engine/marked' import References from './References' +import {AttachDictionary} from './AttachDictionary' // situationGate function useful for testing : let testingSituationGate = v => // eslint-disable-line no-unused-vars @@ -105,45 +106,6 @@ export default class Rule extends Component { } } -// On ajoute à la section la possibilité d'ouvrir à droite un panneau d'explication des termes. -// Il suffit à la section d'appeler une fonction fournie en lui donnant du JSX -// Ne pas oublier de réduire la largeur de la section pour laisser de la place au dictionnaire. -let AttachDictionary = dictionary => Decorated => - class extends React.Component { - state = { - term: null, - explanation: null - } - componentDidMount() { - let decoratedNode = ReactDOM.findDOMNode(this.decorated) - decoratedNode.addEventListener('click', e => { - let term = e.target.dataset['termDefinition'], - explanation = R.path([term, 'description'], dictionary) - this.setState({explanation, term}) - }) - } - renderExplanationMarkdown(explanation, term) { - return marked(`### Mécanisme: ${term}\n\n${explanation}`) - } - render(){ - let {explanation, term} = this.state - return ( -
- this.decorated = decorated} {...this.props} explain={this.explain}/> - {explanation && -
this.setState({term: null, explanation: null})}> -
{e.preventDefault(); e.stopPropagation()}} - dangerouslySetInnerHTML={{__html: this.renderExplanationMarkdown(explanation, term)}}> -
-
- - } -
- ) - } - } - @AttachDictionary(knownMecanisms) class Algorithm extends React.Component { state = { diff --git a/source/components/Simulateur.js b/source/components/Simulateur.js index 9801a1097..d311e5aa1 100644 --- a/source/components/Simulateur.js +++ b/source/components/Simulateur.js @@ -84,7 +84,7 @@ export default class extends React.Component { Pour simplifier, les résultats sont calculés par mois de contrat.

- N'hésitez pas à nous écrire ! La loi française est complexe, car très ciblée. Nous pouvons la rendre plus transparente. + N'hésitez pas à nous écrire ! La loi française est très ciblée, et donc complexe. Nous pouvons la rendre plus transparente.

diff --git a/source/components/conversation/Explicable.js b/source/components/conversation/Explicable.js index 5d8dc4268..dc6ba00b3 100644 --- a/source/components/conversation/Explicable.js +++ b/source/components/conversation/Explicable.js @@ -4,7 +4,7 @@ import './Explicable.css' import HoverDecorator from '../HoverDecorator' import {connect} from 'react-redux' import {EXPLAIN_VARIABLE} from '../../actions' -import {findRuleByName} from '../../engine/rules' +import {findRuleByDottedName} from '../../engine/rules' @connect(state => ({explained: state.explainedVariable}), dispatch => ({ @@ -14,27 +14,31 @@ import {findRuleByName} from '../../engine/rules' export default class Explicable extends React.Component { render(){ let { - name, hover, label, + dottedName, hover, label, explain, explained, lightBackground } = this.props, - rule = findRuleByName(name) + rule = findRuleByDottedName(dottedName) // Rien à expliquer ici, ce n'est pas une règle if (!rule) return {label} let ruleLabel = label || rule.titre || rule.name + // Rien à expliquer ici, il n'y a pas de champ description dans la règle - if (!rule.description && !rule['une possibilité']) return {ruleLabel} + if (!rule.description) + return {ruleLabel} + + //TODO montrer les variables de type 'une possibilité' return ( - {ruleLabel} + className={classNames('explicable', {explained: dottedName === explained, dark: lightBackground})} > + {ruleLabel} {e.preventDefault(); e.stopPropagation(); explain(name)}}> + onClick={e => {e.preventDefault(); e.stopPropagation(); explain(dottedName)}}> diff --git a/source/components/conversation/Question.js b/source/components/conversation/Question.js index 6b7b2ebeb..3af1ce573 100644 --- a/source/components/conversation/Question.js +++ b/source/components/conversation/Question.js @@ -80,11 +80,11 @@ export default class Question extends Component { {this.renderChildren({children})} :
  • - +
  • )} {choices.canGiveUp && -
  • +
  • } @@ -96,7 +96,7 @@ export default class Question extends Component { class RadioLabel extends Component { render() { - let {value, label, input, submit, hover, themeColours} = this.props, + let {value, label, input, submit, hover, themeColours, dottedName} = this.props, // value = R.when(R.is(Object), R.prop('value'))(choice), labelStyle = Object.assign( @@ -111,7 +111,7 @@ class RadioLabel extends Component { - + ) } diff --git a/source/components/conversation/conversation.css b/source/components/conversation/conversation.css index fb6e3698b..820588aed 100644 --- a/source/components/conversation/conversation.css +++ b/source/components/conversation/conversation.css @@ -88,7 +88,7 @@ border: 2px solid #333350; color: #333350; display: inline-block; - max-width: 60%; + max-width: 75%; font-size: 110%; font-weight: 600; padding: .6em 1em; @@ -157,6 +157,7 @@ border-left: 1px dashed #ccc; margin-top: .6em; padding-left: .6em; + padding-top: .6em; margin-left: 1em; } .step.question .variant > div { @@ -180,7 +181,9 @@ .step.question .variant .variantLeaf { display: inline-block; } - +.step.question .variantLeaf.aucun label { + font-weight: bold; +} .step label.radio, /* A resume of what's been answered */ .resume { @@ -308,7 +311,7 @@ fieldset > .ignore { .step .input-suggestions a:hover { background: #4A89DC; color: white; - text-decoration: none; + text-decoration: none; } .help-box { diff --git a/source/containers/Home.js b/source/containers/Home.js index 30f96bfde..35e0d1e0f 100644 --- a/source/containers/Home.js +++ b/source/containers/Home.js @@ -60,7 +60,7 @@ export default class Home extends Component {
    • Surcoût du CDD - +
    • Prix global de l'embauche diff --git a/source/engine/generateQuestions.js b/source/engine/generateQuestions.js index e051b2414..72ef1149d 100644 --- a/source/engine/generateQuestions.js +++ b/source/engine/generateQuestions.js @@ -134,7 +134,7 @@ export let constructStepMeta = ({ name: dottedName, // question: question || name, question: ( - + ), title: titre || name, subquestion, diff --git a/source/engine/known-mecanisms.yaml b/source/engine/known-mecanisms.yaml index c7e723a8a..617f3acc4 100644 --- a/source/engine/known-mecanisms.yaml +++ b/source/engine/known-mecanisms.yaml @@ -68,7 +68,7 @@ non applicable si: > Pour une cotisation sociale, cela signifie qu'elle ne me concerne pas, que je n'ai pas à la verser. - La formule est donc à ignorer. + La formule de calcul peut donc être ignorée, quel que soit son montant. barème: description: | diff --git a/source/engine/traverse.js b/source/engine/traverse.js index 235f09dda..3d0ab7c32 100644 --- a/source/engine/traverse.js +++ b/source/engine/traverse.js @@ -456,7 +456,6 @@ let treat = (situationGate, rule) => rawNode => { : anyNull([taux, assiette, facteur, plafond]) ? null : mult(val(assiette), val(taux), val(facteur), val(plafond)) - return { nodeValue, category: 'mecanism', diff --git a/source/engine/variables.js b/source/engine/variables.js index ba7690eee..999acaf69 100644 --- a/source/engine/variables.js +++ b/source/engine/variables.js @@ -23,8 +23,7 @@ let evaluateBottomUp = situationGate => startingFragments => { export let evaluateVariable = (situationGate, variableName, format) => { // test rec let value = situationGate(variableName) - return R.contains(format)(['nombre positif', 'période']) - ? value + ? (value == undefined ? null : value) : evaluateBottomUp(situationGate)(splitName(variableName)) }