10 Validate and Convert Input
oj-combobox
, oj-input*
,
and oj-text-area
. You can use them as is or customize them for
validating and converting input in your Oracle JET app.Some editable elements such as oj-checkboxset
, oj-radioset
, and oj-select
have a simple attribute for required
values that implicitly creates a built-in validator.
Note:
Theoj-input*
mentioned above refers to the family of input components such as oj-input-date-time
, oj-input-text
, and oj-input-password
, among others.
About Oracle JET Validators and Converters
Oracle JET provides converter classes that convert user input strings into the data type expected by the app and validator classes that enforce a validation rule on those input strings.
For example, you can use Oracle JET's IntlDateTimeConverter
to
convert a user-entered date to a date-only ISO string and then use
DateTimeRangeValidator
to validate that input against a
specified date range. If the converters or validators included in Oracle JET are not
sufficient for your app, you can create custom converters or validators.
About Validators
All Oracle JET editable elements support a value
attribute and
provide UI elements that allow the user to enter or
choose a value. These elements also support other
attributes that you can set to instruct the element
how to validate its value.
An editable element may implicitly create a built-in converter and/or built-in
validators for its normal functioning when certain
attributes are set. For example, editable elements
that support a required
property
create the required validator implicitly when the
property is set to true
. Other
elements like oj-input-date
,
oj-input-date-time
, and
oj-input-time
create a datetime
converter to implement its basic functionality.
About the Oracle JET Validators
The following table describes the Oracle JET validators and provides links to the API documentation:
Validator | Description | Link to API | Module |
---|---|---|---|
|
Validates that the input date is between two dates, between two times, or within two date and time ranges |
|
|
|
Validates that the input date is not a restricted date |
|
|
|
Validates that an input string is within a specified length |
|
|
|
Validates that an input number is within a specified range |
|
|
|
Validates that the regular expression matches a specified pattern |
|
|
|
Validates that a required entry exists |
|
About Oracle JET Component Validation Attributes
The attributes that a component supports are part of its API, and the following validation specific attributes apply to most editable elements.
Element Attribute | Description |
---|---|
|
When specified, the |
|
When specified on |
|
When specified on an Oracle JET element like |
|
When specified on an Oracle JET element like |
|
When specified on an Oracle JET element, the element creates an implicit required validator. |
|
When specified, the element uses these validators along with the implicit validators to validate the UI value. Can be implemented with |
Some editable elements do not support specific validation attributes as they might be irrelevant to its intrinsic functioning. For example, oj-radioset
and oj-checkboxset
do not support a converter attribute since there is nothing for the converter to convert. For an exact list of attributes and how to use them, refer to the Attributes
section in the element’s API documentation. For Oracle JET API documentation, see API
Reference for Oracle® JavaScript Extension Toolkit (Oracle JET). Select the component you're interested in viewing from the API list.
About Oracle JET Component Validation Methods
Oracle JET editable elements support the following methods for validation purposes. For details on how to call this method, its parameters and return values, refer to the component’s API documentation.
Element Method | Description |
---|---|
|
Use this method to reset the element by clearing all messages and messages attributes - |
|
Use this method to validate the component using the current display value. |
For details on calling an element's method, parameters, and return values, see the
Methods
section of the element's API documentation in API
Reference for Oracle® JavaScript Extension Toolkit (Oracle JET). You can also find detail on how to register a callback for or bind to
the event and for information about what triggers the events. Select the component
you're interested in viewing from the API list.
About Oracle JET Converters
Oracle JET provides converters to convert date, date-time, number, color, and string.
These converters extend the Converter
object which defines a basic contract
for converter implementations. The converter API is based on the ECMAScript
Internationalization API specification (ECMA-402 Edition 1.0) and uses the Unicode Common
Locale Data Repository (CLDR) for its locale data. Both converters are initialized through
their constructors, which accept options defined by the API specification. For additional
information about the ECMA-402 API specification, see https://www.ecma-international.org/publications-and-standards/standards/ecma-402/.
For information about the Unicode CLDR, see http://cldr.unicode.org.
The Oracle JET implementation extends the ECMA-402 specification by introducing
additional options. You can use the converters with an Oracle JET component or instantiate and
use them directly on the page. Each converter has a ConverterOptions
type
definition that specifies the conversion options it supports. The following table describes
the available converters and provides a link to the API documentation for each converter,
including detailed descriptions of the properties supported by each converter’s
ConverterOptions
type definition.
Converter | Description | Link to API |
---|---|---|
|
Converts Color object formats |
|
|
Parses a string into an ISO string format (
|
|
|
Converts a string into a number and formats a number into a locale-specific string |
|
|
Converts a big-decimal string into a locale-specific string. Use for
very large numbers (greater than |
|
|
Converts a date-only ISO string to a formatted string or a string to a date-only ISO string |
In addition to the API documentation, see the following demos in the Oracle JET Cookbook that show converters in use:
The Oracle JET converters support lenient number and date parsing when the user
input does not exactly match the expected pattern. The parser does the lenient parsing based
on the leniency rules for the specific converter. For example, both
NumberConverter
and BigDecimalStringConverter
remove
unexpected characters. The ConverterOptions
type definition typically
includes a lenientParse
property that you can set to none
so
that user input matches the expected input or an exception is thrown. For specific details,
see the API documentation for the converter that you are using.
The resource bundles that hold the locale symbols and data used by the Oracle JET
converters are downloaded automatically based on the locale set on the page when using
RequireJS and the ojs/ojvalidation-datetime
or
ojs/ojvalidation-number
module. If your app does not use RequireJS, the
locale data will not be downloaded automatically.
You can use the converters with an Oracle JET component or instantiate and use them directly on the page.
Use Oracle JET Converters with Oracle JET Components
Oracle JET components that accept user input, such as
oj-c-input-date-text
, already include an implicit converter that parses
user input. However, you can also specify an explicit converter on the component that will be
used instead when converting data.
In the following example, taken from the Overview
demo for the oj-c-input-date-text
component in the Oracle JET Cookbook, an
error message displays if you enter "abc
" while the component accepts an
input of "12/25/24
" and renders it as "12/25/2024
" using its
implicit converter.
The error that the converter throws when there are errors during parsing or formatting
operations is represented by the ConverterError
object, and the error message
is represented by an object of type Message
. The messages that Oracle JET
converters use are resources that are defined in the translation bundle included with Oracle
JET.

You can also specify the converter directly on the component's converter
attribute
, if it exists. For example, the
oj-c-input-date-text
component uses the converter
attribute to change the date style that the component renders to one of the converter options
supported by LocalDateConverter
.

The Oracle JET Cookbook includes implementations of the options discussed here. See:
Understand Time Zone Support in Oracle JET
Oracle JET input components, such as oj-input-date-time
,
support local time zone input. You can enable time zone support by
using Oracle JET's IntlDateTimeConverter
, which
relies on JavaScript's Intl.DateTimeFormat
API.
In the following image, the Input Date Time component’s
converter
attribute references code that
renders the input time of 2013-12-02T04:00:00Z
appropriately depending on whether the time zone is
America/Los_Angeles
or
Asia/Hong_Kong
.
The Oracle JET Cookbook includes implementations of the options discussed here. See Input Date and Time - Time Zone.
For more information about Oracle JET's
IntlDateTimeConverter
, see IntlDateTimeConverter.
Use Custom Converters in Oracle JET
You can create custom converters in Oracle JET by extending
Converter
. Custom converters can be used with Oracle JET components, provided
they don't violate the integrity of the component. As with the built-in Oracle JET converters,
you can also use them directly on the page.
The following image shows an implementation of a custom converter that converts the
current date to a relative term. The Schedule For
column uses a
RelativeDateTimeConverter
to convert the date that the page is run in the
en-US
locale to display Today
,
Tomorrow
, and the date in two days.
To create and use a custom converter in Oracle JET:
Use Oracle JET Converters Without Oracle JET Components
If you want to use a converter without binding it to an Oracle JET component, create the converter using the constructor for the converter of your choice.
The Oracle JET Cookbook includes a demo that shows how to use the number and date time converters directly in your pages without binding them to an Oracle JET component. In the demo image, the salary is a number formatted as currency, and the start date is an ISO string formatted as a date.
The viewModel defines a salaryConverter
method to format a number as currency
and a dateConverter
that formats the start date using the date format style
and medium date format while the view HTML binds to the returned values, as shown in the
following snippet for Amy Flanagan’s salary and start date.
. . .
<p>Product Manager</p>
<span style="white-space:nowrap;"><b>Salary</b>:
<span>
<oj-bind-text value="[[amySalary]]"></oj-bind-text>
</span>
</span>
<br />
<span style="white-space:nowrap;"><b>Joined</b>:
<span>
<oj-bind-text value="[[amyStartDate]]"></oj-bind-text>
</span>
. . .
The Oracle JET Cookbook includes implementations of the options discussed here. See Create Converter.
About Oracle JET Validators
Oracle JET validators provide properties that allow callers to customize the validator instance. The properties are documented as part of the validators’ API. Unlike converters where only one instance of a converter can be set on an element, you can associate one or more validators with an element.
When a user interacts with the element to change its value, the validators
associated with the element run in order. When the value violates a validation rule, the
value
attribute is not populated, and the validator highlights the
element with an error.
You can use the validators with an Oracle JET element or instantiate and use them directly on the page.
Use Oracle JET Validators with Oracle JET Components
Oracle JET editable elements, such as oj-input-text
and
oj-input-date
, set up validators both implicitly, based on certain
attributes they support such as required
, min
,
max
, and so on, and explicitly by providing a means to set up one or more
validators using the component's validators
attribute.
For example, the following code shows an oj-input-date
element that uses the
default validator supplied by the component implicitly. When the
oj-input-date
component reads the min
and
max
attributes, it creates the implicit
DateTimeRangeValidator
.
<oj-form-layout id="validator-example">
<oj-input-date
id="dateTimeRange1"
value="{{dateValue1}}"
min="2000-01-01T08:00:00.000"
help.instruction="enter a date that falls in the current
millenium and not greater than today's date."
max="[[todayIsoDate]]"
label-hint="'min' attribute and 'max' option">
</oj-input-date>
</oj-form-layout>
The script to create the view model for this example is shown below.
import * as ko from "knockout";
import * as ConverterUtilsI18n from "ojs/ojconverterutils-i18n";
import "ojs/ojknockout";
import "ojs/ojformlayout";
import "ojs/ojdatetimepicker";
class DemoViewModel {
dateValue1: ko.Observable<string>;
dateValue2: ko.Observable<string>;
todayIsoDate: ko.Observable<string>;
milleniumStartIsoDate: ko.Observable<string>;
constructor() {
this.dateValue1 = ko.observable("");
this.dateValue2 = ko.observable("");
this.todayIsoDate = ko.observable(
ConverterUtilsI18n.IntlConverterUtils.dateToLocalIso(new Date())
);
this.milleniumStartIsoDate = ko.observable(
ConverterUtilsI18n.IntlConverterUtils.dateToLocalIso(new Date(2000, 0, 1))
);
}
}
export = DemoViewModel;
define([
"knockout",
"ojs/ojconverterutils-i18n",
"ojs/ojknockout",
"ojs/ojdatetimepicker",
"ojs/ojformlayout",
], function (
ko,
ConverterUtilsI18n
) {
function DemoViewModel() {
this.dateValue1 = ko.observable();
this.dateValue2 = ko.observable();
this.todayIsoDate = ko.observable(
ConverterUtilsI18n.IntlConverterUtils.dateToLocalIso(new Date())
);
this.milleniumStartIsoDate = ko.observable(
ConverterUtilsI18n.IntlConverterUtils.dateToLocalIso(new Date(2000, 0, 1))
);
}
return DemoViewModel;
});
When the user runs the page, the
oj-input-date
element displays an input field with a calendar icon. The help.instruction
attribute
set on the element displays below the input field when you click on the input field.
If you input data that is not within the expected range, the built-in validator
displays an error message with the expected range.
The error thrown by the Oracle JET validator when validation fails
is represented by the ValidatorError
object, and the error message is
represented by an object of type Message
. The messages and hints that
Oracle JET validators use when they throw an error are resources that are defined in the
translation bundle included with Oracle JET. For more information about
messaging in Oracle JET, see Work with User Assistance.
You can also specify the validator on the element's validators
attribute, if it exists. The code sample below shows another
oj-input-date
element that calls a function which specifies the
DateTimeRangeValidator
validator (dateTimeRange
) in
the validators
attribute.
<oj-form-layout id="validator-example">
<oj-input-date
id="dateTimeRange2"
value="{{dateValue2}}"
validators="[[validators]]"
help.instruction="enter a date that falls in the current millenium and
not greater than today's date."
label-hint="'dateTimeRange' type in 'validators' option">
</oj-input-date>
</oj-form-layout>
The code below shows the additions to the viewModel with options that set the valid minimum and maximum dates and a hint that displays when the user sets the focus in the field.
import * as ko from "knockout";
import * as ConverterUtilsI18n from "ojs/ojconverterutils-i18n";
import AsyncDateTimeRangeValidator
= require("ojs/ojasyncvalidator-datetimerange");
import * as DateTimeConverter from "ojs/ojconverter-datetime";
import "ojs/ojknockout";
import "ojs/ojformlayout";
import "ojs/ojdatetimepicker";
class DemoViewModel {
dateValue1: ko.Observable<string>;
dateValue2: ko.Observable<string>;
todayIsoDate: ko.Observable<string>;
milleniumStartIsoDate: ko.Observable<string>;
validators: ko.Computed<AsyncDateTimeRangeValidator<string>[]>;
constructor() {
this.dateValue1 = ko.observable("");
this.dateValue2 = ko.observable("");
this.todayIsoDate = ko.observable(
ConverterUtilsI18n.IntlConverterUtils.dateToLocalIso(new Date())
);
this.milleniumStartIsoDate = ko.observable(
ConverterUtilsI18n.IntlConverterUtils.
dateToLocalIso(new Date(2000, 0, 1))
);
this.validators = ko.computed(() => {
return [
new AsyncDateTimeRangeValidator({
max: this.todayIsoDate(),
min: this.milleniumStartIsoDate(),
hint: {
inRange: "Enter a date that falls in the
current millennium.",
},
converter: new DateTimeConverter.IntlDateTimeConverter({
day: "2-digit",
month: "2-digit",
year: "2-digit",
}),
}),
];
});
}
}
export = DemoViewModel;
define([
"knockout",
"ojs/ojconverterutils-i18n",
"ojs/ojasyncvalidator-datetimerange",
"ojs/ojconverter-datetime",
"ojs/ojknockout",
"ojs/ojdatetimepicker",
"ojs/ojformlayout",
], function (
ko,
ConverterUtilsI18n,
AsyncDateTimeRangeValidator,
DateTimeConverter
) {
function DemoViewModel() {
this.dateValue1 = ko.observable();
this.dateValue2 = ko.observable();
this.todayIsoDate = ko.observable(
ConverterUtilsI18n.IntlConverterUtils.
dateToLocalIso(new Date())
);
this.milleniumStartIsoDate = ko.observable(
ConverterUtilsI18n.IntlConverterUtils.
dateToLocalIso(new Date(2000, 0, 1))
);
this.validators = ko.computed(
function () {
return [
new AsyncDateTimeRangeValidator({
max: this.todayIsoDate(),
min: this.milleniumStartIsoDate(),
hint: {
inRange: "Enter a date that falls
in the current millennium.",
},
converter: new DateTimeConverter.
IntlDateTimeConverter({
day: "2-digit",
month: "2-digit",
year: "2-digit",
}),
}),
];
}.bind(this)
);
}
return DemoViewModel;
});
When the user runs the page for the en-US
locale, the
oj-input-date
element displays an input field that expects the user's
input date to be between 01/01/2000
and the current date. When entering a
date value into the field, the date converter accepts alternate input as long as it can
parse it unambiguously. This offers end users a great deal of leniency when entering date
values. For example, typing 1-2-3
converts to a Date
that falls on the 2nd day of January, 2003. If the Date
value also
happens to fall in the expected Date
range set in the validator, then the
value is accepted. If validation fails, the component displays an error.
Oracle JET elements can also use a regExp
validator. If the regular expression pattern requires a backslash, while specifying the
expression within an Oracle JET element, you need to use double backslashes. The options
that each validator accepts are specified in API
Reference for Oracle® JavaScript Extension Toolkit (Oracle JET).
The Oracle JET Cookbook contains the complete example discussed in this section as well as examples that show the built-in validators for date restrictions, length, number range, regular expression, and required fields. For details, see Validators.
For more information about Oracle JET component validation, see Understand How Validation and Messaging Works in Oracle JET Editable Components.
Use Custom Validators in Oracle JET
You can create custom validators in Oracle JET that you can reference like
built-in validators from the validators
attribute.
The following image shows a custom validator that displays an error message if the user’s password doesn’t match.
To create and use a custom validator:
About Asynchronous Validators
Oracle JET input components support asynchronous server-side validation via the validators
attribute. That means you can check input values against server data without the need to submit a form or refresh a page.
Two example scenarios illustrate where you can use asynchronous server-side validation:
- In a form that collects new user data, you validate input in an email field to check if the input value has been registered previously.
- Set number range validators that check against volatile data. For example, on an e-commerce website, you can check the user’s cart against the available inventory and inform the user if the goods are unavailable without them submitting the cart for checkout.
The Oracle JET Cookbook has a sample that uses the validators
attribute and dummy data to simulate server-side validation.
The following code shows an oj-input-text
element with the
validators
attribute set to validators
and
asyncValidator
observables in the viewModel code. The
validators
attribute must be of type AsyncValidator
to
fulfill the API contract required to create the asynchronous validator.
<oj-form-layout id="fl1">
<oj-c-input-text
id="input-text"
required
label-hint="Quantity Limit"
on-valid-changed="[[validChangedListener]]"
validators="[[[validators, asyncValidator]]]"
value="{{quantityLimit}}"
converter="[[currencyConverter]]">
</oj-c-input-text>
</oj-form-layout>
The viewModel code includes a number range validator created in the
asyncValidator object that returns a Promise. A Promise object represents a value that may
not be available yet, but will be resolved at some point in the future. In asynchronous
validation, the AsyncValidator.validate()
function returns a Promise that
evaluates to Boolean true
if validation passes and if validation fails, it
returns an Error. For more information, see the validators
attribute
section of Input Text or see Promise (MDN).
The Oracle JET Cookbook includes implementations of the options discussed here. See Async Validators.