Skip to main content

Frontend Scripting with JEXL

JEXL (JavaScript Expression Language) enables dynamic behavior in tSM forms — such as showing/hiding fields, calculating default values, or enforcing validation rules — all without backend code.

It runs in the browser at runtime, and is used throughout forms and pages via the Form Designer.

What is JEXL Used For?

Use CaseExample
Conditional visibilityHide a field if the user selects "B2C"
Default valuesSet date field to "today + 1"
Custom validationEnsure value falls within limits based on another field
Data transformationJoin two strings or check if an item exists in a list
Context-based filteringShow only orders for the current customer

Where JEXL Can Be Used

You’ll see JEXL-enabled fields in the Form Designer with a toggle icon:

  • hidden, readonly, disabled
  • default value
  • validationMessages
  • config fields
  • Listing filters

Once toggled, you can insert single-line expressions in JEXL.

JEXL Syntax Basics

  • Only single-expression scripts (no multiline code)
  • Uses JS-style operators (+, ==, &&, ||, !)
  • Works with context variables and built-in functions
  • Evaluates to a value or true/false for boolean logic

Context Variables

Context variables are predefined objects injected into the expression evaluation runtime. These give access to the form state, entity metadata, current user, and more.

$context – Core Context Object

The $context is the root object for accessing all contextual metadata. It includes:

  • The current form (form)
  • The related entity (entity)
  • Indexed data (elastic)
  • User and environment information ($runtimeInfo, $configUi)
  • Associated accounts (accounts)
  • View or form mode
  • Specification of the underlying entity

Structure of $context (Example: Customer Detail Form)

$context = {
  "entity": { ... },
  "form": { ... },
  "elastic": { ... },
  "viewMode": "baseView"
}

Variable Summary

VariableDescription
$context.formObject representing the current form being edited/created
$context.entityObject representing the persisted business entity (if any, on detail pages)
$context.elasticFlattened, denormalized form of the entity for search/index purposes
$context.viewModeCurrent view context — e.g. "baseView", "tabView", etc.

$value – Characteristic Field Values

This contains raw values of characteristics, which are being set or displayed in the form.

$value = {
  "customerPriority": "High",
  "isBillable": true
}

Use $value.<fieldCode> to access individual fields, for example:

$value.customerPriority == 'High'

$configUi – Runtime Frontend Configuration

Carries configuration values used in the frontend UI layer.

Example:

$configUi = {
  "env": "prod",
  "custom": {
    "percentImageCompress": 50
  }
}

Usage:

$configUi.custom.percentImageCompress > 20

$runtimeInfo – Logged-In User Info

This variable contains data about the currently logged-in user (identity, roles, privileges, etc.).

Example structure:

$runtimeInfo = {
  "id": "f05bd47a-...",
  "name": "Michal Šimovič",
  "code": "michal.simovic@datalite.cz",
  "status": "ENABLE",
  "urList": [
    {
      "roleId": "...",
      "roleName": "Admin",
      "roleCode": "Admin"
    },
    {
      "roleId": "...",
      "roleName": "QuickLinks - All",
      "roleCode": "User.Role_QuickLinks_All"
    }
  ],
  ...
}

Usage example:

$runtimeInfo.urList.filter(x => x.roleCode == 'Admin').length() > 0

Practical Examples of Usage

$context.form.legalForm.code == 'LLC'

2. Conditional Field Visibility for Customer Type

$context.entity.customerType.code == 'CustomerType_B2B'

** 3. Hide a Field When Segment is B2C**

$context.form.customerSegment == 'B2C'

Used in config.hidden.

** 4. Set Default Date to Tomorrow**

addTime($context.form.orderDate, 1, 'days')

Used in default for a date field.

** 5. Validate VIP Discount Range**

($context.form.chars.clientStatus == 'VIP') && 
($context.form.chars.discountRate < 10 || $context.form.chars.discountRate > 50)

Used in validationMessage → custom rule.

** 6. Check if List Contains a Value**

includes($context.form.chars.selectedItems, 'apple')

or

$context.form.chars.selectedItems.includes('apple')

Developer Tip

Always validate JEXL expressions using the preview tool in Form Designer with real context payloads. Some values (e.g., accounts, elastic, or nested characteristics) may be absent in new forms.

Built-In Functions

FunctionDescription
addTime(date, 1, 'days')Adds days/months/hours to a date
includes(array, value)Checks if value exists in list
sum(a, b, c)Adds numbers
isNullOrEmpty(value)Validates if value is missing or empty
dateFormat(date, 'yyyy-MM-dd')Formats date string output

A full list of functions is documented in the JEXL Function Reference

JEXL Debug Console

To test expressions in live forms:

  1. Enable the debug console in your user settings
  2. Open a form and click the JEXL debug icon
  3. Use $context to explore live values
  4. Test expressions with real-time feedback

Best Practices

  • Expressions must be single-line: no if/else blocks

  • Use descriptive field names (priorityLevel > prLvl1)

  • Combine logic with &&, ||, ternary (? :) when needed

  • Always test conditionals in runtime

  • Handle null or empty cases explicitly (isNullOrEmpty)