Skip to main content

Action system overview

The action system runs on event hooks (onChanged, onCreated, onBeforeSave, onAfterSave) and provides template automation without writing scripts.

Action input formats

Actions can be specified as:
  • A single action string
  • A pipe-delimited chain: action1 | action2
  • A JSON array string
  • A programmatic string array

Conditional actions

Actions can be guarded with a when clause:
action:params when condition
The condition language includes:
CategoryOperators
Equality==, !=
Textcontains, startsWith, endsWith
Numericgt, lt, gte, lte
EmptyisEmpty, isNotEmpty
BooleanisTrue, isFalse
Logicand, or, not
See Templates and syntax for the full conditional expression reference.

Runtime variables

Common runtime variables available in action expressions:
VariableAvailable in
${newValue}onChanged
${previousValue}onChanged
${createdObjectId}onCreated
${objectKey}onCreated
${selectedObject}, ${selectedObject.Attribute}RelationPicker onChanged
${selectedObject.Relation.Attribute}Nested relation traversal
${changedFields}, ${oldValues.X}, ${newValues.X}Save hooks
${scriptResult}, ${scriptResult.X}, ${scriptError}Script actions
${today}, ${now}All contexts
Nullish fallback is supported: ${selectedObject.DefaultStatus ?? "New"}

Built-in actions

ActionDescription
closeClose the current view
closeWindowClose the browser window or tab
refresh:<queryKey>Refresh an object search component
refreshDocuments:<queryKey>Refresh a document search component
refreshDataset:<queryKey>Refresh a field dataset
setValue:{"attributeName":"...","value":"..."}Set a field value on the current object
createObject:{"className":"...","attributes":{...}}Create a new object
throwError:{"message":"..."}Halt execution with a user-facing error
callScript:{"script":"...","inputs":{...}}Execute a script and chain results

Practical action patterns

Refresh dependent lists

onChanged="refresh:tasks-list"

Capture previous state

onChanged='setValue:{"attributeName":"_previous","value":"${previousValue}"}'

Conditional workflow update

onChanged='setValue:{"attributeName":"CompletedDate","value":"${today}"} when ${newValue} == "Completed"'

Validation gate on save

onBeforeSave='throwError:{"message":"Notes required"} when ${newValues.Status} == "Closed" and ${newValues.Notes} == ""'

Scripting

Integration paths

There are three ways to integrate scripts:
  1. autofillScript on EditableField — field-triggered autofill
  2. ScriptButton — explicit user-triggered execution
  3. callScript action — part of an action chain

Script types

Caseflow uses two script types:
Triggered by field changes. The request context includes:
  • Application name
  • Class name
  • Object ID
  • Trigger attribute and value
  • Target attribute list
The expected result is a values map ({"values": {...}}) which is applied to the target attributes.

ScriptButton vs callScript

  • Use ScriptButton for explicit user-triggered operations — “run this script now”
  • Use callScript action when the script should be part of an action chain, typically as a side effect after a change or save

Error handling

  • Script failures can trigger toast feedback
  • onError hooks can execute fallback actions
  • throwError can intentionally halt save/action chains with user-facing messages
See ScriptButton and SaveButton for component-specific details.