118 lines
2.7 KiB
JavaScript
118 lines
2.7 KiB
JavaScript
import { findRuleByDottedName, nestedSituationToPathMap } from 'Engine/rules'
|
|
import { compose, filter, map, toPairs } from 'ramda'
|
|
import React, { useEffect } from 'react'
|
|
import { Trans, withTranslation } from 'react-i18next'
|
|
import { connect } from 'react-redux'
|
|
import { batchActions } from 'redux-batched-actions'
|
|
import { change, Field, reduxForm } from 'redux-form'
|
|
import {
|
|
flatRulesSelector,
|
|
situationSelector,
|
|
situationsWithDefaultsSelector
|
|
} from 'Selectors/analyseSelectors'
|
|
import './PeriodSwitch.css'
|
|
|
|
export default compose(
|
|
reduxForm({
|
|
form: 'conversation',
|
|
destroyOnUnmount: false
|
|
}),
|
|
withTranslation(),
|
|
connect(
|
|
state => {
|
|
let situation = situationsWithDefaultsSelector(state)
|
|
if (Array.isArray(situation)) {
|
|
situation = situation[0]
|
|
}
|
|
|
|
return {
|
|
rules: flatRulesSelector(state),
|
|
situation: nestedSituationToPathMap(situationSelector(state)),
|
|
initialPériode: situation.période
|
|
}
|
|
},
|
|
dispatch => ({
|
|
batchPeriodChange: actions => dispatch(batchActions(actions))
|
|
})
|
|
)
|
|
)(function PeriodSwitch({
|
|
situation,
|
|
rules,
|
|
batchPeriodChange,
|
|
initialPériode
|
|
}) {
|
|
useEffect(() => {
|
|
!situation.période &&
|
|
updateSituation(
|
|
initialPériode || 'année',
|
|
batchPeriodChange,
|
|
situation,
|
|
rules
|
|
)
|
|
return
|
|
})
|
|
return (
|
|
<div id="PeriodSwitch">
|
|
<div className="base ui__ small toggle">
|
|
<label>
|
|
<Field
|
|
name="période"
|
|
component="input"
|
|
type="radio"
|
|
value="année"
|
|
onChange={() =>
|
|
updateSituation('année', batchPeriodChange, situation, rules)
|
|
}
|
|
/>
|
|
<span>
|
|
<Trans>année</Trans>
|
|
</span>
|
|
</label>
|
|
<label>
|
|
<Field
|
|
name="période"
|
|
component="input"
|
|
type="radio"
|
|
value="mois"
|
|
onChange={() =>
|
|
updateSituation('mois', batchPeriodChange, situation, rules)
|
|
}
|
|
/>
|
|
<span>
|
|
<Trans>mois</Trans>
|
|
</span>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
)
|
|
})
|
|
|
|
let updateSituation = (toPeriod, batchPeriodChange, situation, rules) => {
|
|
let needConvertion = filter(([dottedName, value]) => {
|
|
let rule = findRuleByDottedName(rules, dottedName)
|
|
return value != null && rule?.période === 'flexible'
|
|
})(toPairs(situation))
|
|
let actions = [
|
|
...map(
|
|
([dottedName, value]) =>
|
|
change(
|
|
'conversation',
|
|
dottedName,
|
|
Math.round(
|
|
situation.période === 'mois' && toPeriod === 'année'
|
|
? value * 12
|
|
: situation.période === 'année' && toPeriod === 'mois'
|
|
? value / 12
|
|
: do {
|
|
throw new Error('Oups, changement de période invalide')
|
|
}
|
|
) + ''
|
|
),
|
|
needConvertion
|
|
),
|
|
change('conversation', 'période', toPeriod)
|
|
]
|
|
|
|
batchPeriodChange(actions)
|
|
}
|