import React, { Component } from 'react' import ReactDOM from 'react-dom' // import {findRuleByName} from '../engine/rules.js' import './Rule.css' import JSONTree from 'react-json-tree' import R from 'ramda' import PageTypeIcon from './PageTypeIcon' import {connect} from 'react-redux' import mockSituation from '../engine/mockSituation.yaml' import {START_CONVERSATION} from '../actions' import classNames from 'classnames' import destinataires from '../../règles/destinataires/destinataires.yaml' import references from '../../règles/références/références.yaml' import {capitalise0} from '../utils' import knownMecanisms from '../engine/known-mecanisms.yaml' import marked from '../engine/marked' // situationGate function useful for testing : let testingSituationGate = v => // eslint-disable-line no-unused-vars R.path(v.split('.'))(mockSituation) @connect( state => ({ // situationGate: name => formValueSelector('conversation')(state, name), analysedSituation: state.analysedSituation, form: state.form }), dispatch => ({ startConversation: () => dispatch({type: START_CONVERSATION}), }) ) export default class Rule extends Component { componentDidMount() { // C'est ici que la génération du formulaire, et donc la traversée des variables commence this.props.startConversation() } render() { let { params: {name}, analysedSituation, form } = this.props, objectives = R.path(['formule', 'explanation', 'explanation'])(analysedSituation) if (!objectives) return null let rule = objectives.find(R.pathEq(['explanation', 'name'], name)).explanation if (!rule) { this.props.router.push('/404') return null } let situationExists = !R.isEmpty(form) let destinataire = R.path(['attributs', 'destinataire'])(rule), destinataireData = destinataires[destinataire] return (

{rule.type} {capitalise0(name)}

{rule.description}

Destinataire

{destinataireData.image && } {!destinataireData.image &&
{destinataire}
}
{destinataireData.nom &&
{destinataireData.nom}
}

Références

{this.renderReferences(rule)}
) } renderReferences({'références': refs}) { if (!refs) return

Cette règle manque de références.

return ( ) } } // 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 &&
}
) } } @AttachDictionary(knownMecanisms) class Algorithm extends React.Component { state = { showValues: false } render(){ let {rule, situationExists, explain} = this.props, showValues = situationExists && this.state.showValues return (
{ do { let [,cond] = R.toPairs(rule).find(([,v]) => v.rulePropType == 'cond') || [] cond != null &&

Conditions de déclenchement

{cond.jsx}
}}

Calcul

{rule['formule'].jsx}
{situationExists &&
}
) } } let JSONView = ({o, rootKey}) => (
''} theme={theme} hideRoot={true} shouldExpandNode={() => true} data={rootKey ? {[rootKey]: o} : o} />
) var theme = { scheme: 'atelier forest', author: 'bram de haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/forest)', base00: '#1b1918', base01: '#2c2421', base02: '#68615e', base03: '#766e6b', base04: '#9c9491', base05: '#a8a19f', base06: '#e6e2e0', base07: '#f1efee', base08: '#f22c40', base09: '#df5320', base0A: '#d5911a', base0B: '#5ab738', base0C: '#00ad9c', base0D: '#407ee7', base0E: '#6666ea', base0F: '#c33ff3' }