diff --git a/package.json b/package.json index 1095c6bd2..3167448f8 100644 --- a/package.json +++ b/package.json @@ -20,11 +20,11 @@ "nearley": "^2.7.14", "npm": "^4.4.1", "ramda": "^0.23.0", - "react": "^15.5.3", - "react-dom": "^15.5.3", + "react": "^15.5.4", + "react-dom": "^15.5.4", "react-json-tree": "^0.10.0", "react-redux": "^5.0.3", - "react-router": "^3.0.2", + "react-router-dom": "^4.1.1", "reduce-reducers": "^0.1.2", "redux": "^3.6.0", "redux-form": "^6.4.3", diff --git a/règles/entités/salariat/Salariat.CDD.yaml b/règles/entités/salariat/Salariat.CDD.yaml index 15089f2d5..f87a85dd8 100644 --- a/règles/entités/salariat/Salariat.CDD.yaml +++ b/règles/entités/salariat/Salariat.CDD.yaml @@ -3,9 +3,19 @@ - Variable: CDD attache: Salariat nom complet: CDD - description: Contrat de travail pour lequel un employeur (société, entreprise) peut recruter directement 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. + 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 + # implique: + # - emploi temporaire + # - motif de recours + +# - Variable: emploi temporaire +# attache: Salariat . CDD +# description: Le contrat n'a ni pour objet ni pour effet de pourvoir durablement un emploi lié à l'activité normale et permanente de l'entreprise. +# références: +# Code du travail - Article L1242-1 : https://www.legifrance.gouv.fr/affichCodeArticle.do;jsessionid=BF6DDD5AADF2010EFD3ED78B7CC00691.tpdila20v_1?idArticle=LEGIARTI000006901194&cidTexte=LEGITEXT000006072050&dateTexte=20100508 + - Variable: durée contrat attache: Salariat . CDD @@ -22,6 +32,7 @@ 6 mois: 6 3 mois: 3 + - Variable: motif # alias utilisé dans l'article L. 1242-1 nom complet: motif de recours attache: Salariat . CDD @@ -94,6 +105,10 @@ références: service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F33693 # concerne: emploi temporaire par nature + notes: | + - exprimer la justification du CDD d'usage au delà des secteurs. + " l'usage exclut le recours au CDI en raison de la nature de l'activité et du caractère temporaire de ces emplois." + + interdictions explicites (grève et travaux dangereux) formule-futur: #TODO intégrer ça dans le formulaire. Comment ? contrainte: @@ -125,8 +140,8 @@ 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 objectifs de la simulation. - Par exemple, si le CDD est poursuivi en CDI, aucune majoration ou indemnité ne sera à verser ! + 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 ! # au lieu de lister tous les cas, l'alternative est de simplement indiquer qu'ils sont exclusifs, # et les identifier dynamiquement par leur attribut "attache" : langue au chat possible: oui diff --git a/règles/simulateurs.yaml b/règles/simulateurs.yaml new file mode 100644 index 000000000..26d32cdea --- /dev/null +++ b/règles/simulateurs.yaml @@ -0,0 +1,30 @@ +# Les simulateurs sont définis ici. Ils ont une variable comme objectif de calcul. Le moteur va analyser cette variable et son arbre pour produire un formulaire. Il sera exposé sur /simulateurs/:id + +- titre: Simulateur CDD + sous-titre: Découvrir le surcoût employeur du CDD par rapport au CDI + id: cdd + introduction: + - icône: fa-handshake-o + texte: Vous avez embauché ou vous réfléchissez à l'embauche d'un salarié en CDD. + titre: Votre situation + - icône: fa-balance-scale + texte: Votre contrat ne peut donc avoir ni pour objet ni pour effet de pourvoir durablement un emploi lié à l'activité normale et permanente de l'entreprise. + titre: Votre obligation + + action: + texte: Répondez à quelques questions pour estimer le montant des 4 obligations du CDD. + bouton: C'est parti ! + objectif: surcoût CDD + conclusion: | + Nous n'avons plus de questions : votre simulation est terminée. + + Cliquez sur les obligations en bas pour comprendre vos résultats. + + Une remarque ? [Écrivez-nous](mailto:contact@embauche.beta.gouv.fr) ! +# + + +# - titre: Du brut au net diff --git a/source/components/CDD.css b/source/components/CDD.css index de8484eb2..c08fc5cd5 100644 --- a/source/components/CDD.css +++ b/source/components/CDD.css @@ -16,7 +16,7 @@ p { #conversation { - margin: 1em auto; + margin: 3em auto; font-size: 110%; line-height: normal; display: flex; @@ -24,6 +24,7 @@ p { align-items: flex-start; min-height: 10em; max-width: 90%; + max-height: 85%; } @@ -34,25 +35,11 @@ p { text-align: center; font-style: italic; } - +#fin p:first-of-type { + font-weight: bold +} #questions-answers { - min-width: 60%; + min-width: 55%; transition: width 1s; } - - - -#sim #results { - padding: .1em; - background: #333350; - box-shadow: 1px -7px 20px 2px #ccc; - position: fixed; - bottom: 0; - left: 0; - width: 100%; - font-size: 80%; - color: white; - height: 12em; - text-align: center; -} diff --git a/source/components/CDDIntro.css b/source/components/CDDIntro.css index 77bb0ce36..30f779db3 100644 --- a/source/components/CDDIntro.css +++ b/source/components/CDDIntro.css @@ -1,4 +1,4 @@ -#CDDIntro { +#simulateurIntro { background: radial-gradient(ellipse at center, #4A89DC -160%,#333350 100%); color: white; position: fixed; @@ -8,24 +8,24 @@ height: 100%; } -#CDDIntro h1 { +#simulateurIntro h1 { margin-top: 3%; text-align: center; font-size: 350%; font-weight: 800; } -#CDDIntro .subtitle { +#simulateurIntro .subtitle { text-align: center; font-size: 110%; font-weight: 300; } -#CDDIntro #introduction { +#simulateurIntro { margin-top: 4%; } -#CDDIntro p { +#simulateurIntro p { font-size: 120%; color: white; opacity: .9; @@ -33,19 +33,19 @@ margin: 2em auto; } -#CDDIntro #introduction .insist { +#simulateurIntro #introduction .insist { font-weight: 600; /*font-style: italic;*/ } -#CDDIntro #action { +#simulateurIntro #action { color: white; margin-top: 3%; display: block; text-align: center; } -#CDDIntro #action button { +#simulateurIntro #action button { color: inherit; background: #4A89DC; padding: .6em 1.2em; @@ -55,7 +55,7 @@ border: none; box-shadow: 0px 9px 14px 0px rgba(0, 0, 0, 0.1) } -#CDDIntro #action button:hover { +#simulateurIntro #action button:hover { box-shadow: none; opacity: .95; } diff --git a/source/components/CDDIntro.js b/source/components/CDDIntro.js index 168b9b9e4..84df432b5 100644 --- a/source/components/CDDIntro.js +++ b/source/components/CDDIntro.js @@ -2,14 +2,14 @@ import React from 'react' import colours from './themeColours' import PageTypeIcon from './PageTypeIcon' import './CDDIntro.css' -import {Link} from 'react-router' +import {Link} from 'react-router-dom' export default () => (

Simulateur CDD

- Découvrir le surcoût pour l'employeur du CDD par rapport au CDI + Découvrir le surcoût employeur du CDD par rapport au CDI

diff --git a/source/components/Contact.js b/source/components/Contact.js new file mode 100644 index 000000000..bf587d5b6 --- /dev/null +++ b/source/components/Contact.js @@ -0,0 +1,10 @@ +import React from 'react' + +export default () => +

+

+ Pour nous écrire : contact@embauche.beta.gouv.fr +

+ {/* TODO: credits for the image to add: https://thenounproject.com/search/?q=post+card&i=715677 */} + +
diff --git a/source/components/Results.css b/source/components/Results.css index f9a3cb55c..a0a3845f6 100644 --- a/source/components/Results.css +++ b/source/components/Results.css @@ -1,4 +1,23 @@ +#results { + padding: .1em; + background: #333350; + font-size: 80%; + color: white; + padding-top: 2em; + text-align: center; + width: 100%; + position: fixed; + bottom: 0; + left: 0; + border-top: 3px solid white; +} +#results.started { + border: none; + box-shadow: 1px -7px 20px 2px #ccc; +} + + #results #results-titles { color: white; width: 18%; @@ -42,6 +61,7 @@ border-radius: 3px; white-space: nowrap; color: #333350; + min-width: 15em; } #results li.irrelevant .rule-box { background: rgba(255, 255, 255, 0.65); diff --git a/source/components/Results.js b/source/components/Results.js index df648e4b0..347cc2a8d 100644 --- a/source/components/Results.js +++ b/source/components/Results.js @@ -1,6 +1,6 @@ import React, { Component } from 'react' import classNames from 'classnames' -import {Link} from 'react-router' +import {Link} from 'react-router-dom' import {connect} from 'react-redux' import R from 'ramda' import './Results.css' @@ -10,21 +10,24 @@ let humanFigure = decimalDigits => value => fmt(value.toFixed(decimalDigits)) @connect( state => ({ - pointedOutObjectives: state.pointedOutObjectives + pointedOutObjectives: state.pointedOutObjectives, + analysedSituation: state.analysedSituation, + conversationStarted: !R.isEmpty(state.form) }) ) export default class Results extends Component { render() { - let {analysedSituation, pointedOutObjectives} = this.props + let {analysedSituation, pointedOutObjectives, conversationStarted} = this.props // On travaille pour l'instant sur un objectif qui est une somme de plusieurs variables, et c'est ces variables que nous affichons comme résultats. D'où ce chemin : let explanation = R.path(['formule', 'explanation', 'explanation'])(analysedSituation) if (!explanation) return null return ( -
+

Vos obligations

-
Cliquez pour comprendre chaque calcul  
+ {conversationStarted && +
Cliquez pour comprendre chaque calcul  
}
    {explanation.map( @@ -47,12 +50,13 @@ export default class Results extends Component { {name}

- {irrelevant ? - "Vous n'êtes pas concerné" - : unsatisfied ? - 'En attente de vos réponses...' - : {humanFigure(2)(computedValue) + '€'} - } + {conversationStarted && ( + irrelevant ? + "Vous n'êtes pas concerné" + : unsatisfied ? + 'En attente de vos réponses...' + : {humanFigure(2)(computedValue) + '€'} + )}

diff --git a/source/components/Route404.js b/source/components/Route404.js new file mode 100644 index 000000000..266728b76 --- /dev/null +++ b/source/components/Route404.js @@ -0,0 +1,14 @@ +import React from 'react' +import {Link} from 'react-router-dom' + +export default () => +
+

+ On peut facilement se perdre dans la législation... +

+ + {/* TODO: credits for the image to add: https://thenounproject.com/term/treasure-map/96666/ */} + + Revenir en lieu sûr + +
diff --git a/source/components/Rule.css b/source/components/Rule.css index c560a2090..009f48c62 100644 --- a/source/components/Rule.css +++ b/source/components/Rule.css @@ -1,5 +1,7 @@ #rule { font-size: 110%; + height: 100%; + padding-bottom: 10%; } #rule pre { @@ -125,16 +127,23 @@ margin-top: 3em; width: 100%; } - -.dictionaryWrapper { - display: flex; - flex-wrap: wrap; - justify-content: space-between; - align-items: center; +.dictionaryPanelWrapper { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(255, 255, 255, 0.86); + z-index: 1; } .dictionaryPanel { + background: white; + position: fixed; + top: 50%; + left: 50%; + transform: translateX(-50%) translateY(-50%); width: 33%; - border: 1px dashed #aaa; + border: 2px solid #333350; margin: 1em; padding: 0em 1.5em; min-height: 6em; diff --git a/source/components/Rule.js b/source/components/Rule.js index 51dd5c9ee..7e69861b2 100644 --- a/source/components/Rule.js +++ b/source/components/Rule.js @@ -36,7 +36,7 @@ export default class Rule extends Component { } render() { let { - params: {name}, + match: {params: {name}}, analysedSituation, form } = this.props, @@ -131,8 +131,13 @@ let AttachDictionary = dictionary => Decorated =>
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/Simulateur.css b/source/components/Simulateur.css new file mode 100644 index 000000000..ce792d98d --- /dev/null +++ b/source/components/Simulateur.css @@ -0,0 +1,97 @@ +#sim { + padding: 3em 0; /* For the warning message */ + background-color: #333350; + /*background-image: radial-gradient(ellipse at center, white -160%, rgba(255,255,255,0) 100%);*/ + background-image: radial-gradient(ellipse at center, #4A89DC -160%,#333350 70%); + color: white; + transition: background-color .5s; + height: 100%; + padding-bottom: 10%; + +} + +#sim p { + color: inherit; +} + +#sim.started { + background: none; + background-color: white; + color: #333350; +} + + +#sim > h1 { + color: inherit; + margin-top: 0; + text-align: center; + font-size: 350%; + font-weight: 800; +} + + +#simSubtitle { + margin-top: -.5em; + text-align: center; + font-size: 110%; + font-weight: 300; + margin-bottom: 2%; +} + +#sim .centered { + width: 40%; + margin: 0 auto; +} + +#sim .intro { + font-style: italic; + font-size: 100%; + margin-bottom: 4%; +} +#sim .intro > div { + margin: 1em 0; + display: flex; + align-items: center; +} +#sim .intro i { + opacity: .9; + font-size: 250%; + margin-right: .6em; +} +#sim .intro span { + display: inline-block; + width: 80%; +} + +#sim .remarks p { + opacity: .9; + padding-left: 1em; + border-left: 10px solid rgba(255, 255, 255, 0.2); + font-style: italic; +} + +#sim .action { + margin-top: 5%; + margin-bottom: 3%; +} +#sim .action p { + text-align: center; +} + +#sim .action button { + color: white; + display: block; + text-align: center; + color: inherit; + background: #4A89DC; + padding: .6em 1.2em; + font-size: 140%; + margin: 1em auto; + width: 12em; + border: none; + box-shadow: 0px 9px 14px 0px rgba(0, 0, 0, 0.1) +} +#sim .action:hover { + box-shadow: none; + opacity: .95; +} diff --git a/source/components/Simulateur.js b/source/components/Simulateur.js new file mode 100644 index 000000000..55a1e3d74 --- /dev/null +++ b/source/components/Simulateur.js @@ -0,0 +1,136 @@ +import React, {Component} from 'react' +import './CDD.css' +import {reduxForm, formValueSelector} from 'redux-form' +import {connect} from 'react-redux' +import './conversation/conversation.css' +import {START_CONVERSATION} from '../actions' +import Aide from './Aide' +import PageTypeIcon from './PageTypeIcon' +import simulateurs from '../../règles/simulateurs.yaml' +import R from 'ramda' +import {Redirect, Link} from 'react-router-dom' +import {createMarkdownDiv} from '../engine/marked' +import './Simulateur.css' +import classNames from 'classnames' +let situationSelector = formValueSelector('conversation') + +@reduxForm({form: 'conversation', destroyOnUnmount: false}) +@connect( + state => ({ + situation: variableName => situationSelector(state, variableName), + foldedSteps: state.foldedSteps, + unfoldedSteps: state.unfoldedSteps, + themeColours: state.themeColours, + analysedSituation: state.analysedSituation, + }), + dispatch => ({ + startConversation: rootVariable => dispatch({type: START_CONVERSATION, rootVariable}), + }) +) +export default class extends React.Component { + componentWillMount() { + let { + match: { + params: { + simulateurId + } + } + } = this.props + + this.simulateur = R.find(R.propEq('id', simulateurId))(simulateurs) + + // C'est ici que la génération du formulaire, et donc la traversée des variables commence + if (this.simulateur) + this.props.startConversation(this.simulateur.objectif) + } + state = { + started: null + } + render(){ + if (!this.simulateur) return + + let + {foldedSteps, unfoldedSteps, situation} = this.props, + sim = path => + R.path(R.unless(R.is(Array), R.of)(path))(this.simulateur) + , + {started} = this.state + + return ( +
+ +

{sim('titre')}

+
{sim('sous-titre')}
+
+ {sim('introduction').map( ({icône, texte, titre}) => +
+ + + {texte} + +
+ )} +
+ { + // Tant que le bouton 'C'est parti' n'est pas cliqué, on affiche l'intro + !this.state.started ? +
+
+

{sim(['action', 'texte'])}

+ +
+
+

+ 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. +

+
+
+ : ( +
+
+
+ { !R.isEmpty(foldedSteps) && +
+ {foldedSteps + .map(step => ( + + ))} +
+ } +
+ { !R.isEmpty(unfoldedSteps) && do { + let step = R.head(unfoldedSteps) + ; + }} +
+ {unfoldedSteps.length == 0 && +
+ + {createMarkdownDiv(sim('conclusion'))} +
} +
+ +
+
+ )} + +
+ ) + } +} diff --git a/source/components/SimulationCDD.js b/source/components/SimulationCDD.js index d15d7ea55..135aa81d6 100644 --- a/source/components/SimulationCDD.js +++ b/source/components/SimulationCDD.js @@ -8,8 +8,6 @@ import {START_CONVERSATION} from '../actions' import Aide from './Aide' import PageTypeIcon from './PageTypeIcon' -//TODO fusionner SimulationCDD & SimulationNet - let situationSelector = formValueSelector('conversation') @reduxForm({form: 'conversation', destroyOnUnmount: false}) @@ -66,7 +64,11 @@ export default class CDD extends Component {

Nous n'avons plus de questions : votre simulation est terminée. -

+

+

+ Cliquez sur les obligations en bas pour comprendre vos résultats. +

+

Une remarque ?   Écrivez-nous diff --git a/source/components/conversation/Explicable.css b/source/components/conversation/Explicable.css index 7f8df6087..0a4281ca4 100644 --- a/source/components/conversation/Explicable.css +++ b/source/components/conversation/Explicable.css @@ -5,9 +5,11 @@ border-radius: .2em; display: inline-block; margin-left: .8em; - opacity: .4; + opacity: .35; border: 1px solid transparent; cursor: pointer; + vertical-align: baseline; + font-size: 85%; } .explicable:hover .icon { @@ -15,7 +17,7 @@ border-color: white; } .explicable.dark:hover .icon { - border-color: #222; + border-color: #333350; } .explicable .icon:hover { @@ -24,7 +26,7 @@ color: #4A89DC; } .explicable.dark .icon:hover { - background: #222; + background: #333350; color: white; } @@ -34,6 +36,6 @@ color: white; } .explicable.dark.explained .icon { - background: #222; + background: #333350; color: white; } diff --git a/source/components/conversation/Explicable.js b/source/components/conversation/Explicable.js index d7e65446c..5d8dc4268 100644 --- a/source/components/conversation/Explicable.js +++ b/source/components/conversation/Explicable.js @@ -35,7 +35,8 @@ export default class Explicable extends React.Component { {e.preventDefault(); e.stopPropagation(); explain(name)}}> - { hover ? 'ℹ' : '•' } + + ) } diff --git a/source/components/conversation/conversation.css b/source/components/conversation/conversation.css index 01340667c..932987032 100644 --- a/source/components/conversation/conversation.css +++ b/source/components/conversation/conversation.css @@ -81,7 +81,7 @@ } .step-question { - margin-bottom: 1em; + margin-bottom: 2em; } .step h1 { diff --git a/source/containers/App.dev.js b/source/containers/App.dev.js index 9466c7366..89c6bbbe3 100644 --- a/source/containers/App.dev.js +++ b/source/containers/App.dev.js @@ -2,9 +2,7 @@ import React, {Component} from 'react' import { Provider } from 'react-redux' import DevTools from '../DevTools' -import routes from '../routes' -import {Router, browserHistory} from 'react-router' - +import Layout from './Layout' export default class App extends Component { render() { @@ -12,7 +10,7 @@ export default class App extends Component { return (

- +
diff --git a/source/containers/App.prod.js b/source/containers/App.prod.js index 9fbf9c174..28ddd0f71 100644 --- a/source/containers/App.prod.js +++ b/source/containers/App.prod.js @@ -1,15 +1,18 @@ +// App.dev without the redux DevTools import React, {Component} from 'react' import { Provider } from 'react-redux' -import routes from '../routes' -import {Router} from 'react-router' +import DevTools from '../DevTools' +import Layout from './Layout' export default class App extends Component { render() { const { store } = this.props return ( - +
+ +
) } diff --git a/source/containers/Home.js b/source/containers/Home.js index 23d875a0d..30f96bfde 100644 --- a/source/containers/Home.js +++ b/source/containers/Home.js @@ -1,7 +1,7 @@ import React, {Component} from 'react' import './Home.css' import {searchRules} from '../engine/rules.js' -import {Link} from 'react-router' +import {Link} from 'react-router-dom' import '../components/Rule.css' import R from 'ramda' @@ -60,11 +60,11 @@ export default class Home extends Component {
diff --git a/source/containers/Layout.css b/source/containers/Layout.css index cbe250abe..cf6232ef0 100644 --- a/source/containers/Layout.css +++ b/source/containers/Layout.css @@ -1,5 +1,7 @@ body { font-family: 'Open Sans'; + margin: 0; + height: 100%; } #content { @@ -13,6 +15,10 @@ body { top: 4.5%; } +a { + color: inherit; +} + h1 { margin: 6% 3% 0; font-size: 250%; @@ -31,6 +37,18 @@ h1 { text-align: center; z-index: 1000000; } +#main { + min-height: 100vh; + width: 100%; + display: flex; + flex-direction: column; +} + +#ninetyPercent { + width: 100%; + flex-grow: 1; + overflow: auto; +} #page-type { display: inline-block; diff --git a/source/containers/Layout.js b/source/containers/Layout.js index e958f9daa..1a48a1cc7 100644 --- a/source/containers/Layout.js +++ b/source/containers/Layout.js @@ -1,27 +1,42 @@ import React, { Component } from 'react' import './Layout.css' import './reset.css' -import {Link} from 'react-router' +import {Link, Route, BrowserRouter as Router, Switch} from 'react-router-dom' +import Home from './Home' +import Rule from '../components/Rule' +import Route404 from '../components/Route404' +import Contact from '../components/Contact' +import Simulateur from '../components/Simulateur' +import Results from '../components/Results' export default class Layout extends Component { render() { - return (
- + ) } } diff --git a/source/engine/known-mecanisms.yaml b/source/engine/known-mecanisms.yaml index 05db80b3a..06aee286f 100644 --- a/source/engine/known-mecanisms.yaml +++ b/source/engine/known-mecanisms.yaml @@ -32,7 +32,7 @@ taux: multiplication: description: | - C'est une multiplication un peu améliorée, très utile pour exprimer les cotisations, souvent linéaires. + C'est une multiplication un peu améliorée, très utile pour exprimer les cotisations. Sa propriété `assiette` est multipliée par un pourcentage, `taux`, ou par un `facteur` quand ce nom est plus approprié. diff --git a/source/engine/marked.js b/source/engine/marked.js index 972e7aa5f..8f45f110c 100644 --- a/source/engine/marked.js +++ b/source/engine/marked.js @@ -1,4 +1,5 @@ import marked from 'marked' +import React from 'react' let customMarked = new marked.Renderer() customMarked.link = ( href, title, text ) => @@ -7,4 +8,8 @@ marked.setOptions({ renderer: customMarked }) +export let createMarkdownDiv = markdown => +
+ + export default marked diff --git a/source/engine/traverse-common-jsx.js b/source/engine/traverse-common-jsx.js index 3a38f5553..b4cdcdda5 100644 --- a/source/engine/traverse-common-jsx.js +++ b/source/engine/traverse-common-jsx.js @@ -2,7 +2,7 @@ import React from 'react' import R from 'ramda' import classNames from 'classnames' -let treatValue = data => console.log('data', data) || +let treatValue = data => data == null ? '?' : !isNaN(data) ? Math.round(+data) : data ? 'oui' : 'non' diff --git a/source/images/contact.png b/source/images/contact.png new file mode 100644 index 000000000..14f436963 Binary files /dev/null and b/source/images/contact.png differ diff --git a/source/images/contact.svg b/source/images/contact.svg new file mode 100644 index 000000000..debf61526 --- /dev/null +++ b/source/images/contact.svg @@ -0,0 +1,56 @@ + +image/svg+xml \ No newline at end of file diff --git a/source/routes.js b/source/routes.js deleted file mode 100644 index 28e238a90..000000000 --- a/source/routes.js +++ /dev/null @@ -1,33 +0,0 @@ -import React from 'react' -import { Route, IndexRoute, Link } from 'react-router' -import Layout from './containers/Layout' -import Home from './containers/Home' -import Rule from './components/Rule' -import SimulationCDD from './components/SimulationCDD' -import SimulationNet from './components/SimulationNet' -import CDDIntro from './components/CDDIntro' - - -let RouteNotFound = () => -
-

- On peut facilement se perdre dans la législation... -

- - {/* TODO: credits for the image to add: https://thenounproject.com/term/treasure-map/96666/ */} - - Revenir en lieu sûr - -
- - -export default ( - - - - - - - - -)