import classNames from 'classnames' import Controls from 'Components/Controls' import InputSuggestions from 'Components/conversation/InputSuggestions' import PercentageField from 'Components/PercentageField' import PeriodSwitch from 'Components/PeriodSwitch' import withColours from 'Components/utils/withColours' import withLanguage from 'Components/utils/withLanguage' import withSitePaths from 'Components/utils/withSitePaths' import { encodeRuleName } from 'Engine/rules' import { compose, isEmpty, isNil, propEq, toPairs } from 'ramda' import React, { Component, PureComponent } from 'react' import emoji from 'react-easy-emoji' import { withTranslation } from 'react-i18next' import { connect } from 'react-redux' import { Link } from 'react-router-dom' import { change, Field, formValueSelector, reduxForm } from 'redux-form' import { analysisWithDefaultsSelector, flatRulesSelector } from 'Selectors/analyseSelectors' import Animate from 'Ui/animate' import AnimatedTargetValue from 'Ui/AnimatedTargetValue' import CurrencyInput from './CurrencyInput/CurrencyInput' import QuickLinks from './QuickLinks' import './TargetSelection.css' import { firstStepCompletedSelector } from './targetSelectionSelectors' export default compose( withTranslation(), withColours, reduxForm({ form: 'conversation', destroyOnUnmount: false }), connect( state => ({ getTargetValue: dottedName => formValueSelector('conversation')(state, dottedName), analysis: analysisWithDefaultsSelector(state), flatRules: flatRulesSelector(state), firstStepCompleted: firstStepCompletedSelector(state), conversationStarted: state.conversationStarted, activeInput: state.activeTargetInput, objectifs: state.simulation?.config.objectifs || [] }), dispatch => ({ setFormValue: (field, name) => dispatch(change('conversation', field, name)), setActiveInput: name => dispatch({ type: 'SET_ACTIVE_TARGET_INPUT', name }) }) ) )( class TargetSelection extends PureComponent { state = { initialRender: true } componentDidMount() { const props = this.props const targets = props.analysis ? props.analysis.targets : [] // Initialize defaultValue for target that can't be computed targets .filter( target => (!target.formule || isEmpty(target.formule)) && (!isNil(target.defaultValue) || !isNil(target.explanation?.defaultValue)) && !props.getTargetValue(target.dottedName) ) .forEach(target => { props.setFormValue( target.dottedName, !isNil(target.defaultValue) ? target.defaultValue : target.explanation?.defaultValue ) }) if (this.state.initialRender) { this.setState({ initialRender: false }) } } render() { let { colours, firstStepCompleted, conversationStarted, analysis, explanation, activeInput, setActiveInput, setFormValue, objectifs } = this.props, inversionFail = analysis.cache.inversionFail, targets = analysis?.targets || [] return (
{firstStepCompleted && ( )} {(Array.isArray(objectifs) ? [[null, objectifs]] : toPairs(objectifs) ).map(([groupName, groupTargets], index) => ( <>
{groupName &&

{emoji(groupName)}

} {index === 0 && }
groupTargets.includes(dottedName) ), initialRender: this.state.initialRender }} />
))} {firstStepCompleted && explanation}
) } } ) let Targets = ({ conversationStarted, activeInput, setActiveInput, setFormValue, inversionFail, targets, initialRender }) => (
) const Target = ({ target, activeInput, conversationStarted, targets, setActiveInput, setFormValue, initialRender, inversionFail }) => { const isSmallTarget = !target.question || !target.formule || isEmpty(target.formule) return (
  • {isSmallTarget && ( )}
    {activeInput === target.dottedName && !conversationStarted && ( { setFormValue(target.dottedName, '' + value) }} rulePeriod={target.période} colouredBackground={true} /> )}
  • ) } let Header = withSitePaths(({ target, conversationStarted, sitePaths }) => { const ruleLink = sitePaths.documentation.index + '/' + encodeRuleName(target.dottedName) return ( {target.title || target.name} {!conversationStarted &&

    {target['résumé']}

    }
    ) }) let CurrencyField = withColours(props => { return ( ) }) let DebouncedPercentageField = props => ( ) let TargetInputOrValue = withLanguage( ({ target, targets, activeInput, setActiveInput, language, firstStepCompleted, inversionFail }) => { let inputIsActive = activeInput === target.dottedName return ( {inputIsActive || !target.formule || isEmpty(target.formule) ? ( event.preventDefault()} component={ { euros: CurrencyField, pourcentage: DebouncedPercentageField }[ target.format ] } {...(inputIsActive ? { autoFocus: true } : {})} language={language} /> ) : ( )} ) } ) const TargetValue = connect( null, dispatch => ({ setFormValue: (field, name) => dispatch(change('conversation', field, name)) }) )( class TargetValue extends Component { render() { let { targets, target, inversionFail } = this.props let targetWithValue = targets && targets.find(propEq('dottedName', target.dottedName)), value = targetWithValue && targetWithValue.nodeValue return (
    ) } showField(value) { let { target, setFormValue, activeInput, setActiveInput } = this.props return () => { if (!target.question) return if (value != null && !Number.isNaN(value)) setFormValue(target.dottedName, Math.round(value) + '') if (activeInput) setFormValue(activeInput, '') setActiveInput(target.dottedName) } } } )