1
0
Fork 0
mirror of https://github.com/betagouv/mon-entreprise synced 2025-02-09 23:55:01 +00:00
mon-entreprise/source/components/Value.js
Mael 6154419250 Changement de programme : tentative d'implé de l'unité dans l'eval
Car quand on parse et qu'on tombe sur une variable, on ne rentre pas
dans cette variable. Elle sera traitée par la suite dans le parseAll.
Ainsi on ne peut pas connaître son unité si elle a une formule

A = B * C
B = D / E

C unité km
D unité €
E unité km

Quand on tombe sur B dans A, B n'est pas encore parsée, et donc on ne
peut pas savoir que B est en € / km.

Il faudrait parser B, ce qui serait trop couteux. On pourrait
implémenter un cache au parsing, implémenter les unités comme des fonctions, ou encore gérer les unités lors de l'éval (ce qui est bête, car on n'a pas besoin des valeurs pour inférer les unités)
2019-07-12 10:33:02 +02:00

41 lines
1 KiB
JavaScript

import React from 'react'
import { memoizeWith } from 'ramda'
import { serialiseUnit } from 'Engine/units'
const NumberFormat = memoizeWith(JSON.stringify, Intl.NumberFormat)
let numberFormatter = style => (value, language) =>
NumberFormat(language, {
style,
currency: 'EUR',
maximumFractionDigits: 2,
minimumFractionDigits: 2
}).format(value)
let booleanTranslations = {
fr: { true: 'Oui', false: 'Non' },
en: { true: 'Yes', false: 'No' }
}
let formats = {
'€': numberFormatter('currency'),
boolean: (value, language = 'fr') => booleanTranslations[language][value],
object: value => JSON.stringify(value)
}
export default ({ nodeValue, unit }) => {
let valueType = typeof nodeValue,
unitText = unit && serialiseUnit(unit)
return nodeValue == undefined ? null : (
<div
css={`
border: 2px dashed chartreuse
font-family: 'Courier New', Courier, monospace;
`}>
{(formats[valueType !== 'number' ? valueType : unitText] ||
numberFormatter('decimal'))(nodeValue)}
&nbsp;
{unit && unitText}
</div>
)
}