Olá Edgard, tudo bem?
O meio que encontrei foi o de criar uma função que cria um validador.
Vamos criar um arquivo dentro da pasta de novo-usuario chamado validador-personalizado.validator.ts
. Criaremos uma função que cria um validador tipando ele como ValidatorFn
.
export function validadorSenha(): ValidatorFn {
}
Essa função deve retornar ou objeto de erro do tipo ValidationErrors
caso tenha alguma das validações não aplicada, caso todas as regras forem cumpridas essa função retorna null
.
import {AbstractControl, ValidationErrors, ValidatorFn} from '@angular/forms';
export function validadorSenha(): ValidatorFn {
return (control:AbstractControl) : ValidationErrors | null => {
}
}
Vamos pegar o valor do campo do formControl
por meio da instância da sua classe base, AbstractControl
. Com ele conseguimos usar a propriedade value
e fazer as validações.
import {AbstractControl, ValidationErrors, ValidatorFn} from '@angular/forms';
export function validadorSenha(): ValidatorFn {
return (control:AbstractControl) : ValidationErrors | null => {
const senha = control.value;
if(!senha) {
return null;
}
}
}
Podemos primeiro verificar se senha
é falso, caso seja já vamos retornar como null
e não fazer nada pois precisamos que tenha alguma string na senha, certo?
Caso tenha algo podemos fazer com que a senha seja testado em expressões regulares. No caso farei de letra minúscula, maiúscula e de numeral. Em seguida vou adicionar todas esses testes em uma propriedade
import {AbstractControl, ValidationErrors, ValidatorFn} from '@angular/forms';
export function validadorSenha(): ValidatorFn {
return (control:AbstractControl) : ValidationErrors | null => {
const senha = control.value;
if(!senha) {
return null;
}
const temMaiusculo = /[A-Z]+/.test(senha);
const temMinusculo = /[a-z]+/.test(senha);
const temNumeral = /[0-9]+/.test(senha);
const senhaValida = temMaiusculo && temMinusculo && temNumeral;
}
}
Executando o teste para saber se a expressão regular é aplicada na senha a sua propriedade vai receber um valor booleano, com isso podemos fazer com que a função retorne null
caso o retorno de senhaValida
for true
ou retornar o objeto de erros.
export function validadorSenha(): ValidatorFn {
return (control:AbstractControl) : ValidationErrors | null => {
const senha = control.value;
if(!senha) {
return null;
}
const temMaiusculo = /[A-Z]+/.test(senha);
const temMinusculo = /[a-z]+/.test(senha);
const temNumeral = /[0-9]+/.test(senha);
const senhaValida = temMaiusculo && temMinusculo && temNumeral;
return !senhaValida ? { senhaForte: true } : null;
}
}
Caso a senha por exemplo, não tivesse letra maiúscula, o retorno do objeto seria assim:
{
senhaForte: {
temMaiusculo: false,
temMinusculo: true,
temNumeral: true
}
}
Com o validador pronto, vamos chamar ele na lista de validadores do formBuilder
lá no NovoUsuarioComponent
. Primeiro importamos o validador:
import { validadorSenha } from './`validador-personalizado.validator.ts';
Depois chamar esse validador na lista de validadores.
],
password: [
'',
[Validators.required, Validators.minLength(6), validadorSenha()],
],
},
E por fim vamos mostrar uma mensagem caso as validações não forem aplicadas.
<div class="form-group ">
<input type="password" class="form-control" name="" placeholder="Senha" formControlName="password" />
<app-mensagem *ngIf="novoUsuarioForm.get('password')?.errors && novoUsuarioForm.get('userName')?.touched"
mensagem="Senha deve conter no mínimo 6 caracteres"></app-mensagem>
<app-mensagem *ngIf="novoUsuarioForm.get('password')?.errors?.senhaForte"
mensagem="Sua senha deve ter caracteres minúsculos, maiúsculos e numéricos">
</app-mensagem>
<app-mensagem *ngIf="novoUsuarioForm.errors?.senhaIgualUsuario" mensagem="Senha deve ser diferente do usuário">
</app-mensagem>
</div>
E pronto, agora temos um campo de senha com algumas validações.
Espero ter ajudado, Edgard.
Bons estudos.