Form Field Validation
There are several ways to control the user's input, restrict the type of characters or the maximal length or match the input values to acertain pattern to ensure only valid and correct values are stored.
HTML5 Field Validation
HTML5 already provides client side input validation based on the input type, this functions can be used by assigning the correct type to the form control HFWinJSCtrl.TextField.
TextField
-
TextField with no validation:
<input id="text1" data-win-control="HFWinJSCtrl.TextField" type="text" />
-
TextField with type number:
<input id="number1" data-win-control="HFWinJSCtrl.TextField" type="number" />
-
TextField with type telephone:
<input id="tel1" data-win-control="HFWinJSCtrl.TextField" type="tel" />
-
TextField with type e-mail:
<input id="email1" data-win-control="HFWinJSCtrl.TextField" type="email" />
-
TextField with type date:
<input id="date1" data-win-control="HFWinJSCtrl.TextField" type="date" />
-
TextField with type time:
<input id="time1" data-win-control="HFWinJSCtrl.TextField" type="time" />
These validations are very limited and restricted to single line input elements and often do not meet the necessities of the desired input validation. Therefore we provide extended options for a better client-side input validation.
Extra Validation
Besides the already implemented data-win-option "required: true"
, which checks if a field has been filled in, you can define more individual validation rules by adding the data-win-option "validator"
or by defining a custom validation function.
ComboBox
The HFWinJSCtrl.ComboBox
only allows to select values from the configured data source. The option anytext: true
allows to enter free text.
<div
id="combobox1"
data-win-control="HFWinJSCtrl.ComboBox"
data-win-options="{
required: true,
anytext: false,
dataSource: [
{ name: 'Bauer, F', code: 'Bauer, F' },
{ name: 'Gruber, P', code: 'Gruber, P' },
{ name: 'Lanner, G', code: 'Lanner, G' },
{ name: 'Simon, R', code: '3521' },
{ name: 'Herbert, W', code: '123456789012' }
],
dataTextField: 'name',
dataValueField: 'code',
validator: {
errorText: 'Only inputs from the dropdown are allowed.'
}
}"
></div>
validator.custom
Specifies a custom validate function as string. read more
custom: 'HFFormDefinition.Namespace.validate'
function
(field: object, value: string) => boolean
validator.errorHTML
Specifies the error message that is shown to the user. An object can be defined for several messages, depending on the error type. In this case, a default type must exist. Valid HTML is allowed.
errorHTML: 'Only <strong>inputs from the dropdown</strong> are allowed.'
string
validator.errorText
Specifies the error message that is shown to the user. An object can be defined for several messages, depending on the error type. In this case, a default type must exist. If errorHTML is also present, errorText is not used.
errorText: 'Only inputs from the dropdown are allowed.'
string
validator.maxlength
Specifies the maximum number of characters allowed. Default for control is 1000.
maxlength: 10
number
errorText / errorHTML interface
interface IErrorMessages {
anytext?: string;
maxlength?: string;
[custom: string]: string;
default: string;
}
DataControl
<div
id="test_data_control"
data-win-control="HFWinJSCtrl.DataControl"
data-win-options="{
validator: {
jsonSchema: {
type: 'array',
items: {
type: 'object',
properties: {
test_data_control: {
type: 'string',
minLength: 1,
maxLength: 10
}
}
}
}
}
}"
></div>
validator.custom
Specifies a custom validate function as string. read more
custom: 'HFFormDefinition.Namespace.validate'
function
(field: object, value: string) => boolean
validator.jsonSchema
Specify a JSON Schema to validate the given input. read more
jsonSchema: {}
jsonschema
DatePicker
<div
id="birthday"
data-win-control="HFWinJSCtrl.DatePicker"
data-win-options="{
required: true,
displayValueFormat: 'dd.MM.yyyy',
max: 'now',
min: '1965-05-14',
parseFormats: [ 'dd.MM.yyyy', 'ddMMyyyy', 'dd/MM/yyyy', 'dd-MM-yyyy' ],
validator: {
errorText: 'Please enter a valid date.'
}
}"
></div>
max
The option "now" restricts the input of the newest possible entry to the current day. Format for fixed dates is dd.MM.yyyy
max: 'now'
string
min
Set to allow entries from that date on. Format is dd.MM.yyyy and default value is 01.01.1900
min: '1965-05-14'
string
validator.custom
Specifies a custom validate function as string. read more
custom: 'HFFormDefinition.Namespace.validate'
function
(field: object, value: string) => boolean
validator.errorHTML
Specifies the error message that is shown to the user. An object can be defined for several messages, depending on the error type. In this case, a default type must exist. Valid HTML is allowed.
errorHTML: 'Please enter a <strong>valid date</strong>.'
string
validator.errorText
Specifies the error message that is shown to the user. An object can be defined for several messages, depending on the error type. In this case, a default type must exist. If errorHTML is also present, errorText is not used.
errorText: 'Please enter a valid date.'
string
errorText / errorHTML interface
interface IErrorMessages {
max?: string;
min?: string;
[custom: string]: string;
default: string;
}
DropDownList
The HFWinJSCtrl.DropDownList
only allows to select values from the configured data source.
<div
id="dropdownlist1"
data-win-control="HFWinJSCtrl.DropDownList"
data-win-options="{
required: true,
dataSource: [
{ name: 'Bauer, F', code: 'Bauer, F' },
{ name: 'Gruber, P', code: 'Gruber, P' },
{ name: 'Lanner, G', code: 'Lanner, G' },
{ name: 'Simon, R', code: '3521' },
{ name: 'Herbert, W', code: '123456789012' }
],
dataTextField: 'name',
dataValueField: 'code',
validator: {
errorText: 'Only inputs from the dropdown are allowed.'
}
}"
></div>
validator.custom
Specifies a custom validate function as string. read more
custom: 'HFFormDefinition.Namespace.validate'
function
(field: object, value: string) => boolean
validator.errorHTML
Specifies the error message that is shown to the user. An object can be defined for several messages, depending on the error type. In this case, a default type must exist. Valid HTML is allowed.
errorHTML: 'Only <strong>inputs from the dropdown</strong> are allowed.'
string
validator.errorText
Specifies the error message that is shown to the user. An object can be defined for several messages, depending on the error type. In this case, a default type must exist. If errorHTML is also present, errorText is not used.
errorText: 'Only inputs from the dropdown are allowed.'
string
errorText / errorHTML interface
interface IErrorMessages {
[custom: string]: string;
default: string;
}
NumericField
<div
id="temperatur"
data-win-control="HFWinJSCtrl.NumericField"
data-win-options="{
step: 0.1,
min: 20,
max: 45,
placeholder: '°C',
decimals: 1,
format: '0.0°',
startValue: 36
}"
></div>
validator.custom
Specifies a custom validate function as string. read more
custom: 'HFFormDefinition.Namespace.validate'
function
(field: object, value: string) => boolean
validator.errorHTML
Specifies the error message that is shown to the user. An object can be defined for several messages, depending on the error type. In this case, a default type must exist. Valid HTML is allowed.
errorHTML: 'Only <strong>inputs from the dropdown</strong> are allowed.'
string
validator.errorText
Specifies the error message that is shown to the user. An object can be defined for several messages, depending on the error type. In this case, a default type must exist. If errorHTML is also present, errorText is not used.
errorText: 'Only inputs from the dropdown are allowed.'
string
errorText / errorHTML interface
interface IErrorMessages {
min?: string;
max?: string;
[custom: string]: string;
default: string;
}
SelectBox
Field value must be one of the option values if selected
<select id="select1" data-win-control="HFWinJSCtrl.SelectBox">
<option value="value1">value 1</option>
<option value="value2">value 2</option>
...
</select>
validator.custom
Specifies a custom validate function as string. read more
custom: 'HFFormDefinition.Namespace.validate'
function
(field: object, value: string) => boolean
validator.errorHTML
Specifies the error message that is shown to the user. An object can be defined for several messages, depending on the error type. In this case, a default type must exist. Valid HTML is allowed.
errorHTML: 'Only <strong>inputs from the dropdown</strong> are allowed.'
string
validator.errorText
Specifies the error message that is shown to the user. An object can be defined for several messages, depending on the error type. In this case, a default type must exist. If errorHTML is also present, errorText is not used.
errorText: 'Only inputs from the dropdown are allowed.'
string
errorText / errorHTML interface
interface IErrorMessages {
[custom: string]: string;
default: string;
}
TextField
The HFWinJSCtrl.TextField
can be extended by the option validator
.
This overrules the HTML5 validation.
<input
id="textfield1"
type="(text|number|tel|email|date|time)"
data-win-control="HFWinJSCtrl.TextField"
data-win-options="{
...,
validator: {
type?: 'text' | 'number' | 'email' | 'tel' | 'date' | 'time',
min?: (number),
max?: (number),
step?: (number),
minlength?: (number, text),
maxlength?: (number, text),
custom?: (function),
pattern?: (RegExString),
errorText?: (string | Object)
errorHTML?: (string | Object)
}
}"
/>
validator
JavaScript RegExp algorithm (for more details see validator.pattern) or object of type validator.
validator: { min: 5, max: 10, step: 0.1 }
validator object
validator.custom
Specifies a custom validate function as string. read more
custom: 'HFFormDefinition.Namespace.validate'
function
(field: object, value: string) => boolean
validator.errorHTML
Specifies the error message that is shown to the user. An object can be defined for several messages, depending on the error type. In this case, a default type must exist. Valid HTML is allowed.
errorHTML: 'Only <strong>number</strong> inputs are allowed.'
string/object
validator.errorText
Specifies the error message that is shown to the user. An object can be defined for several messages, depending on the error type. In this case, a default type must exist. If errorHTML is also present, errorText is not used.
errorText: 'Only number inputs are allowed.'
string/object
validator.maxlength
Specifies the maximum number of characters allowed. Default for inputs is 1000 and textareas 5000.
maxlength: 10
number, text
validator.minlength
Specifies the minimum number of characters allowed.
minlength: 5
number, text
validator.pattern
JavaScript RegExp algorithm, with the 'u' parameter treats the pattern as a sequence of unicode code points. The pattern is not surrounded by forward slashes and the tokens "^" and "$" are obsolete, always the complete string is validated.
Pattern is case-sensitive and no multiline. Character escape or token starting with a backslash has to be escaped additionally.
For further details see (https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-pattern, https://docs.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-language-quick-reference). Sample patterns (http://html5pattern.com/).
Since Chrome 112 the "v" flag is used for pattern attribute with new standards for regular expressions. See https://github.com/tc39/proposal-regexp-v-flag
pattern: '[0-9]{4}'
regex
validator.step
Specifies the legal number intervals for an input field.
step: 0.1
number
validator.type
Type of input. Overrules html attribute type.
type: 'number'
'text' | 'number' | 'email' | 'tel' | 'date' | 'time'
errorText / errorHTML interface
interface IErrorMessages {
pattern?: string;
number?: string;
email?: string;
min?: string;
max?: string;
minlength?: string;
maxlength?: string;
[custom: string]: string;
default: string;
}
TimePicker
<div
id="repair_time_start"
data-win-control="HFWinJSCtrl.TimePicker"
data-win-options="{
defaultValue: 'now',
required: true,
min: '11:00',
max: '19:00',
label: 'Time start'
}"
></div>
validator.custom
Specifies a custom validate function as string. read more
custom: 'HFFormDefinition.Namespace.validate'
function
(field: object, value: string) => boolean
validator.errorHTML
Specifies the error message that is shown to the user. An object can be defined for several messages, depending on the error type. In this case, a default type must exist. Valid HTML is allowed.
errorHTML: 'Only <strong>inputs from the dropdown</strong> are allowed.'
string
validator.errorText
Specifies the error message that is shown to the user. An object can be defined for several messages, depending on the error type. In this case, a default type must exist. If errorHTML is also present, errorText is not used.
errorText: 'Only inputs from the dropdown are allowed.'
string
errorText / errorHTML interface
interface IErrorMessages {
[custom: string]: string;
default: string;
}
TreeView
<div
id="treeview_minimum"
data-win-control="HFWinJSCtrl.TreeView"
data-win-options="{
label: 'TreeView',
url: '/api/catalog/Hierarchietest/hierarchy',
treeviewCtrlOptions: {
dataTextField: 'Text',
dataValueField: 'ID',
},
selectCtrlOptions:{
placeholder: 'Open tree',
},
validator: {
errorText: 'Plaese selct from catalog'
}
}"
></div>
validator.custom
Specifies a custom validate function as string. read more
custom: 'HFFormDefinition.Namespace.validate'
function
(field: object, value: string) => boolean
validator.errorHTML
Specifies the error message that is shown to the user. An object can be defined for several messages, depending on the error type. In this case, a default type must exist. Valid HTML is allowed.
errorHTML: 'Only <strong>inputs from the dropdown</strong> are allowed.'
string
validator.errorText
Specifies the error message that is shown to the user. An object can be defined for several messages, depending on the error type. In this case, a default type must exist. If errorHTML is also present, errorText is not used.
errorText: 'Only inputs from the dropdown are allowed.'
string
errorText / errorHTML interface
interface IErrorMessages {
[custom: string]: string;
default: string;
}
Custom Validation (JS)
Some input controls can be validated by adding a custom validation function. Currently supported controls are the ComboBox, the DatePicker, the DropDownList, the NumericField, the SelectBox, the TextField, the TimePicker and the TreeView control.
These functions offer the possibility to compare two controls of the same type for example the fields "start time" and "end time" or to prevent the user to select identical values of ComboBoxes.
These functions can return true
, false
or { errorType: 'custom' }
.
A returned error type can be used to display an individual error message by defining it in an errorText/errorHTML object.
export function setCustomTimeValidator(field, val) {
const fieldTarget = HybridForms.API.Fields.getById('compare_time1');
let t1 = Date.parse(fieldTarget.value);
let t2 = Date.parse(val);
if (t1 >= t2) {
return false;
}
return true;
}
export function triggerTimeChange() {
const ctrl = HybridForms.API.FormControls.getCtrl('compare_time2');
if (ctrl && ctrl.ctrl) {
HybridForms.API.FormControls.getCtrl('compare_time2').ctrl.trigger('change');
}
}
Just add your custom validation function to your JavaScript file and in your HTML template call the function inside the control(s) by adding the data-win-option validator
.
<div
id="compare_time1"
data-win-control="HFWinJSCtrl.TimePicker"
data-win-options="{
label: 'Begin time',
defaultValue: 'now',
emptyContent: 'hh:mm',
format: 'HH:mm',
onChanged: HFFormdefinition.DemoHelpers.triggerTimeChange
}"
></div>
<div
id="compare_time2"
data-win-control="HFWinJSCtrl.TimePicker"
data-win-options="{
label: 'End time',
emptyContent: 'hh:mm',
format: 'HH:mm',
validator:{
custom: 'HFFormdefinition.DemoHelpers.setCustomTimeValidator',
errorHTML: 'End time can not be equal or before begin time!!!'
}
}"
></div>
In case of comparing two values keep in mind to trigger any changes of the control to be compared with, so validation is working vice-versa.