🏁 Final Form Calculate
Decorator for 🏁 Final Form that
allows you to define calculations that happen between fields, i.e. "When field X
changes, update field Y."
Installation
npm install --save final-form-calculate
or
yarn add final-form-calculate
Usage
import { createForm, getIn } from 'final-form'
import createDecorator from 'final-form-calculate'
const form = createForm({ onSubmit })
const decorator = createDecorator(
{
field: 'foo',
updates: {
doubleFoo: (fooValue, allValues) => fooValue * 2
}
},
{
field: /items\[\d+\]/,
updates: {
total: (itemValue, allValues) =>
(allValues.items || []).reduce((sum, value) => sum + value, 0)
}
},
{
field: 'foo',
updates: {
doubleFoo: (fooValue, allValues) =>
new Promise(resolve => {
setTimeout(() => resolve(fooValue * 2), 100)
})
}
},
{
field: /\.timeFrom/,
updates: (value, name, allValues) => {
const toField = name.replace('timeFrom', 'timeTo')
const toValue = getIn(allValues, toField)
if (toValue && value > toValue) {
return {
[toField]: value
}
}
return {}
}
}
)
const undecorate = decorator(form)
Table of Contents
Example
Example using
🏁 React Final Form.
API
createDecorator: (...calculations: Calculation[]) => Decorator
A function that takes a set of calculations and returns a 🏁 Final Form
Decorator
.
Types
Calculation: { field: FieldPattern, isEqual?: (any, any) => boolean, updates: Updates }
A calculation to perform, with an optional isEqual
predicate to determine if a value has really changed (defaults to ===
).
FieldName: string
FieldPattern: FieldName | RegExp | FieldName[]
A pattern to match a field with.
Updates: UpdatesByName | UpdatesForAll
Either an object of updater functions or a function that generates updates for multiple fields.
UpdatesByName: { [FieldName]: (value: any, allValues: Object) => Promise | any }
Updater functions for each calculated field.
UpdatesForAll: (value: any, field: string, allValues: Object) => Promise | { [FieldName]: any }
Takes the value and name of the field that just changed, as well as all the values, and returns an object of fields and new values.