The Validator component for Angular represents a jQWidgets plugin used for validating html forms using JavaScript.
npm install -g @angular/cli ng new jqwidgets-project cd jqwidgets-project
ng add jqwidgets-ngAlternatively, you can use the standard installation (Manual Setup)
jQWidgets UI for Angular is distributed as jqwidgets-ng NPM package
npm install jqwidgets-ng
@import 'jqwidgets-ng/jqwidgets/styles/jqx.base.css';
"styles": [ "node_modules/jqwidgets-ng/jqwidgets/styles/jqx.base.css" ]
<jqxExpander [theme]="'fluent'" [width]="350" [showArrow]="false" [toggleMode]="'none'">
<div><h3 style="padding: 0; margin: 0;">Register</h3></div>
<div style="padding: 5px;">
<jqxValidator #myValidator [rules]="rules">
<form id='form' action="./">
<table class="register-table">
<tbody>
<tr>
<td>Username:</td>
<td><jqxInput [theme]="'fluent'" class="userInput text-input" [width]="195" [height]="22"></jqxInput></td>
</tr>
<tr>
<td>Password:</td>
<td><jqxPasswordInput [theme]="'fluent'" #passwordInput class="passwordInput text-input" [width]="195" [height]="22"></jqxPasswordInput></td>
</tr>
<tr>
<td>Confirm password:</td>
<td><jqxPasswordInput [theme]="'fluent'" #confirmPasswordInput class="passwordConfirmInput text-input" [width]="195" [height]="22"></jqxPasswordInput></td>
</tr>
<tr>
<td>Real name:</td>
<td><jqxInput [theme]="'fluent'" [width]="195" [height]="22" class="realNameInput text-input"></jqxInput></td>
</tr>
<tr>
<td>Birth date:</td>
<td><jqxDateTimeInput [theme]="'fluent'" #dateTimeInput [width]="195" [height]="22" [value]="initialDate" class="birthInput"></jqxDateTimeInput></td>
</tr>
<tr>
<td>E-mail:</td>
<td><jqxInput [theme]="'fluent'" class="emailInput text-input" [width]="195" [height]="22"></jqxInput></td>
</tr>
<tr>
<td>SSN:</td>
<td><jqxMaskedInput [theme]="'fluent'" [width]="195" [height]="22" [mask]="'###-##-####'" class="ssnInput"></jqxMaskedInput></td>
</tr>
<tr>
<td>Phone:</td>
<td><jqxMaskedInput [theme]="'fluent'" [width]="195" [height]="22" [mask]="'(###)###-####'" class="phoneInput"></jqxMaskedInput></td>
</tr>
<tr>
<td>Zip code:</td>
<td><jqxMaskedInput [theme]="'fluent'" [width]="195" [height]="22" [mask]="'###-##-####'" class="zipInput"></jqxMaskedInput></td>
</tr>
<tr>
<td colspan="2" style="padding-left: 100px; padding-top: 10px; padding-bottom: 10px;">
<jqxCheckBox [theme]="'fluent'" [width]="130" id="acceptCheckBox">I accept terms</jqxCheckBox>
</td>
</tr>
<tr>
<td colspan="2" style="padding-left: 20px;">
<jqxButton [theme]="'fluent'" #SendButton
(onClick)="sendButton()"
style="text-align: center; margin-left: 8em;"
[width]="60" [height]="25">
Send
</jqxButton>
</td>
</tr>
</tbody>
</table>
</form>
</jqxValidator>
</div>
</jqxExpander>
import { Component, ViewChild, ViewEncapsulation } from '@angular/core';
import { jqxPasswordInputComponent, jqxPasswordInputModule } from 'jqwidgets-ng/jqxpasswordinput';
import { jqxDateTimeInputComponent, jqxDateTimeInputModule } from 'jqwidgets-ng/jqxdatetimeinput';
import { jqxCheckBoxComponent, jqxCheckBoxModule } from 'jqwidgets-ng/jqxcheckbox';
import { jqxValidatorModule, jqxValidatorComponent } from 'jqwidgets-ng/jqxvalidator';
import { jqxButtonModule } from 'jqwidgets-ng/jqxbuttons';
import { jqxMaskedInputModule, jqxMaskedInputComponent } from 'jqwidgets-ng/jqxmaskedinput';
import { jqxInputModule } from 'jqwidgets-ng/jqxinput';
@Component({
selector: 'app-root',
imports: [jqxValidatorModule, jqxInputModule, jqxMaskedInputModule, jqxButtonModule, jqxDateTimeInputModule, jqxPasswordInputModule, jqxCheckBoxModule],
standalone: true,
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
encapsulation: ViewEncapsulation.None
})
export class AppComponent {
@ViewChild('myValidator') myValidator: jqxValidatorComponent;
@ViewChild('dateTimeInput') dateTimeInput: jqxDateTimeInputComponent;
@ViewChild('passwordInput') passwordInput: jqxPasswordInputComponent;
@ViewChild('confirmPasswordInput') confirmPasswordInput: jqxPasswordInputComponent;
initialDate: Date = new Date(2017, 8, 1);
sendButton(): void {
this.myValidator.validate(document.getElementById('form'));
}
rules =
[
{ input: '.userInput', message: 'Username is required!', action: 'keyup, blur', rule: 'required' },
{ input: '.userInput', message: 'Your username must be between 3 and 12 characters!', action: 'keyup, blur', rule: 'length=3,12' },
{ input: '.realNameInput', message: 'Real Name is required!', action: 'keyup, blur', rule: 'required' },
{ input: '.realNameInput', message: 'Your real name must contain only letters!', action: 'keyup', rule: 'notNumber' },
{ input: '.realNameInput', message: 'Your real name must be between 3 and 12 characters!', action: 'keyup', rule: 'length=2,12' },
{
input: '.birthInput', message: 'Your birth date must be between 1/1/1900 and 1/1/2020.', action: 'valueChanged',
rule: (input: any, commit: any): any => {
let date = this.dateTimeInput.value();
let result = date.getFullYear() >= 1900 && date.getFullYear() <= 2020;
return result;
}
},
{ input: '.passwordInput', message: 'Password is required!', action: 'keyup, blur', rule: 'required' },
{ input: '.passwordInput', message: 'Your password must be between 4 and 12 characters!', action: 'keyup, blur', rule: 'length=4,12' },
{ input: '.passwordConfirmInput', message: 'Password is required!', action: 'keyup, blur', rule: 'required' },
{
input: '.passwordConfirmInput', message: 'Passwords doesn\'t match!', action: 'keyup, focus',
rule: (input: any, commit: any): boolean => {
if (this.passwordInput.val() === this.confirmPasswordInput.val()) {
return true;
}
return false;
}
},
{ input: '.emailInput', message: 'E-mail is required!', action: 'keyup, blur', rule: 'required' },
{ input: '.emailInput', message: 'Invalid e-mail!', action: 'keyup', rule: 'email' },
{ input: '.ssnInput', message: 'Invalid SSN!', action: 'valuechanged, blur', rule: 'ssn' },
{ input: '.phoneInput', message: 'Invalid phone number!', action: 'valuechanged, blur', rule: 'phone' },
{ input: '.zipInput', message: 'Invalid zip code!', action: 'valuechanged, blur', rule: 'zipCode' },
{ input: '#acceptCheckBox', message: 'You have to accept the terms', action: 'change', rule: 'required', position: 'right:217,0' }
];
}