public class UserFormula extends DataClass
Note that the current implementation of formulas simply executes the
text
as a JavaScript string after making special variables and
methods available to the formula. It is safe to allow users to define formulas for themselves (since an end user can
always execute whatever JavaScript they want via the browser's built-in developer tools), and is safe to allow formulas
to be shared between trusted users. However it would not be safe to allow an untrusted user to create formulas that are
shared to other users.
Also, while the current implementation would allow creation of a formula that calls JavaScript functions which are not part of the standard or custom MathFunctions, this behavior should not be relied upon, as future versions of the formula engine may prohibit such calls.
ListGrid
s additionally allow the formula to be user-modifiable, with the formula
created and edited with a FormulaBuilder, either directly or via the ListGrid.canAddFormulaFields
behavior.
factoryCreated, factoryProperties
Constructor and Description |
---|
UserFormula() |
UserFormula(com.google.gwt.core.client.JavaScriptObject jsObj) |
UserFormula(java.lang.String text) |
UserFormula(java.lang.String text,
java.util.Map formulaVars) |
Modifier and Type | Method and Description |
---|---|
java.util.Map |
getFormulaVars()
Object mapping from variable names to field names.
|
static UserFormula |
getOrCreateRef(com.google.gwt.core.client.JavaScriptObject jsObj) |
java.lang.String |
getText()
Formula to be evaluated.
|
UserFormula |
setFormulaVars(java.util.Map formulaVars)
Object mapping from variable names to field names.
|
UserFormula |
setText(java.lang.String text)
Formula to be evaluated.
|
applyFactoryProperties, doAddHandler, fireEvent, getAttribute, getAttributeAsBoolean, getAttributeAsBoolean, getAttributeAsDate, getAttributeAsDouble, getAttributeAsDoubleArray, getAttributeAsElement, getAttributeAsFloat, getAttributeAsInt, getAttributeAsIntArray, getAttributeAsJavaScriptObject, getAttributeAsLong, getAttributeAsMap, getAttributeAsObject, getAttributeAsRecord, getAttributeAsString, getAttributeAsStringArray, getAttributes, getHandlerCount, isFactoryCreated, setAttribute, setAttribute, setAttribute, setAttribute, setAttribute, setAttribute, setAttribute, setAttribute, setAttribute, setAttribute, setAttribute, setAttribute, setAttribute, setAttribute, setAttribute, setAttribute, setAttribute, setAttribute, setAttribute, setAttribute, setAttribute, setAttribute, setAttribute, setAttribute, setAttributeAsJavaObject, setFactoryCreated
public UserFormula()
public UserFormula(com.google.gwt.core.client.JavaScriptObject jsObj)
public UserFormula(java.lang.String text)
public UserFormula(java.lang.String text, java.util.Map formulaVars)
public static UserFormula getOrCreateRef(com.google.gwt.core.client.JavaScriptObject jsObj)
public UserFormula setFormulaVars(java.util.Map formulaVars)
Map vars = new HashMap(); vars.put("E", "population"); vars.put("L", "area");
When used in the context of grid or detail viewer fields, field names are evaluated against the record.
When used in the context of forms and editing, this property is not used for formula mapping.
Instead, field names are evaluated directly against the current rule context
.
Formulas built by a FormulaBuilder for a ListGrid
will normally not define this
property and the field names will be used directly, unless
useSingleLetterKey is true
. However,
the Builder may add mapping keys to avoid collisions with registered
math functions. When directly using field names in
a formula, any mapping keys you add to avoid collisions should contain the string "Field"
so that the Smart GWT Framework can detect when single-letter keys are not in use.
So, for example, if your grid contains a field "max" and you want to use it in a formula, your userFormula might look something like:
{ text: "max(maxField, 1000)", formulaVars: { maxField: "max" } }.. where the formula also uses the built-in math function max().
formulaVars
- New formulaVars value. Default value is nullUserFormula
instance, for chaining setter callspublic java.util.Map getFormulaVars()
Map vars = new HashMap(); vars.put("E", "population"); vars.put("L", "area");
When used in the context of grid or detail viewer fields, field names are evaluated against the record.
When used in the context of forms and editing, this property is not used for formula mapping.
Instead, field names are evaluated directly against the current rule context
.
Formulas built by a FormulaBuilder for a ListGrid
will normally not define this
property and the field names will be used directly, unless
useSingleLetterKey is true
. However,
the Builder may add mapping keys to avoid collisions with registered
math functions. When directly using field names in
a formula, any mapping keys you add to avoid collisions should contain the string "Field"
so that the Smart GWT Framework can detect when single-letter keys are not in use.
So, for example, if your grid contains a field "max" and you want to use it in a formula, your userFormula might look something like:
{ text: "max(maxField, 1000)", formulaVars: { maxField: "max" } }.. where the formula also uses the built-in math function max().
public UserFormula setText(java.lang.String text)
There are two contexts where a UserFormula
is used: ListGridField.userFormula
/ DetailViewerField.userFormula
and FormItem.formula
or ListGridField.editorFormula
. For the grid/detail viewer
field formula, all variables used by the formula must be single capital letters (e.g. A). These are derived from field
values for the record in question - see formulaVars
.
In addition to these variables, the keyword record
may be used to refer directly to the record for which
the formula is being evaluated.
In the context of forms and editing, variables are dot-separated (.) names
representing the nested hierarchy path to the desired value within the rule context
. No mapping with formulaVars
is needed.
The formula text must be valid JavaScript code and may only call either the built-in math functions or custom functions.
This attribute is
writable only in ListGrid
s. Applications must call either ListGrid.setUserFormula()
or ListGrid.setUserFormulaText()
to re-evaluate the formula.
text
- New text value. Default value is nullUserFormula
instance, for chaining setter callspublic java.lang.String getText()
There are two contexts where a UserFormula
is used: ListGridField.userFormula
/ DetailViewerField.userFormula
and FormItem.formula
or ListGridField.editorFormula
. For the grid/detail viewer
field formula, all variables used by the formula must be single capital letters (e.g. A). These are derived from field
values for the record in question - see formulaVars
.
In addition to these variables, the keyword record
may be used to refer directly to the record for which
the formula is being evaluated.
In the context of forms and editing, variables are dot-separated (.) names
representing the nested hierarchy path to the desired value within the rule context
. No mapping with formulaVars
is needed.
The formula text must be valid JavaScript code and may only call either the built-in math functions or custom functions.
This attribute is
writable only in ListGrid
s. Applications must call either ListGrid.setUserFormula()
or ListGrid.setUserFormulaText()
to re-evaluate the formula.