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​
custom: 'HFFormDefinition.Namespace.validate'function(field: object, value: string) => booleanvalidator.errorHTML​
errorHTML: 'Only <strong>inputs from the dropdown</strong> are allowed.'stringvalidator.errorText​
errorText: 'Only inputs from the dropdown are allowed.'stringvalidator.maxlength​
maxlength: 10numbererrorText / 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​
custom: 'HFFormDefinition.Namespace.validate'function(field: object, value: string) => booleanvalidator.jsonSchema​
jsonSchema: {}jsonschemaDatePicker​
<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​
max: 'now'stringmin​
min: '1965-05-14'stringvalidator.custom​
custom: 'HFFormDefinition.Namespace.validate'function(field: object, value: string) => booleanvalidator.errorHTML​
errorHTML: 'Please enter a <strong>valid date</strong>.'stringvalidator.errorText​
errorText: 'Please enter a valid date.'stringerrorText / 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​
custom: 'HFFormDefinition.Namespace.validate'function(field: object, value: string) => booleanvalidator.errorHTML​
errorHTML: 'Only <strong>inputs from the dropdown</strong> are allowed.'stringvalidator.errorText​
errorText: 'Only inputs from the dropdown are allowed.'stringerrorText / 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​
custom: 'HFFormDefinition.Namespace.validate'function(field: object, value: string) => booleanvalidator.errorHTML​
errorHTML: 'Only <strong>inputs from the dropdown</strong> are allowed.'stringvalidator.errorText​
errorText: 'Only inputs from the dropdown are allowed.'stringerrorText / 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​
custom: 'HFFormDefinition.Namespace.validate'function(field: object, value: string) => booleanvalidator.errorHTML​
errorHTML: 'Only <strong>inputs from the dropdown</strong> are allowed.'stringvalidator.errorText​
errorText: 'Only inputs from the dropdown are allowed.'stringerrorText / 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​
validator: { min: 5, max: 10, step: 0.1 }validator objectvalidator.custom​
custom: 'HFFormDefinition.Namespace.validate'function(field: object, value: string) => booleanvalidator.errorHTML​
errorHTML: 'Only <strong>number</strong> inputs are allowed.'string/objectvalidator.errorText​
errorText: 'Only number inputs are allowed.'string/objectvalidator.maxlength​
maxlength: 10number, textvalidator.minlength​
minlength: 5number, textvalidator.pattern​
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}'regexvalidator.step​
step: 0.1numbervalidator.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​
custom: 'HFFormDefinition.Namespace.validate'function(field: object, value: string) => booleanvalidator.errorHTML​
errorHTML: 'Only <strong>inputs from the dropdown</strong> are allowed.'stringvalidator.errorText​
errorText: 'Only inputs from the dropdown are allowed.'stringerrorText / 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​
custom: 'HFFormDefinition.Namespace.validate'function(field: object, value: string) => booleanvalidator.errorHTML​
errorHTML: 'Only <strong>inputs from the dropdown</strong> are allowed.'stringvalidator.errorText​
errorText: 'Only inputs from the dropdown are allowed.'stringerrorText / 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.