carherco / fonk-angular

Integración de validadores fonk en Angular
0 stars 0 forks source link

Integración validadores Fonk #1

Open brauliodiez opened 4 years ago

brauliodiez commented 4 years ago

Evaluando como son los adaptadores:

function required(customArgs: RequiredArgs): ValidatorFn {
  return (control: AbstractControl): {[key: string]: any} | null => {

    const fieldValidatorArgs = {value: control.value, customArgs }; // TODO: customArgs es opcional
    const validationResult = Validators.required.validator(fieldValidatorArgs) as ValidationResult;

    let validationErrorObject = null;
    if (!validationResult.succeeded) {
      validationErrorObject = {
        fonkRequired: validationResult
      };
    }

    return validationErrorObject;
  };
}

interface PatternArgs {
  pattern: string | RegExp;
}

function pattern(customArgs: PatternArgs): ValidatorFn {
  return (control: AbstractControl): {[key: string]: any} | null => {

    const fieldValidatorArgs = {value: control.value, customArgs };
    const validationResult = Validators.pattern.validator(fieldValidatorArgs) as ValidationResult;

    let validationErrorObject = null;
    if (!validationResult.succeeded) {
      validationErrorObject = {
        fonkPattern: validationResult
      };
    }

    return validationErrorObject;
  };
}

Igual podríamos hacer un adaptador genérico:

Aún así habría que escribir algo de código para cada validador, de momento veo algo así como (esto es pseudocodigo :)):

import { Validators, ValidationResult, validationType } from '@lemoncode/fonk';

function patternValidation = (customArgs : patternArgs) => {
  return fonkToAngularValidation(validationType, customArgs) 
}

function fonkToAngularValidation<T>(validationType, validator, customArgs: T): ValidatorFn {
  return (control: AbstractControl): {[key: string]: any} | null => {

    const fieldValidatorArgs = {value: control.value, customArgs };
    const validationResult = validator(fieldValidatorArgs) as ValidationResult;

    let validationErrorObject = null;
    if (!validationResult.succeeded) {
      validationErrorObject = {
        [validationType]: validationResult
      };
    }

    return validationErrorObject;
  };
}
carherco commented 4 years ago

¿Y simplemente una única función con esta huella?

fonkToAngular(validator, customArgs);

Por ejemplo:

fonkToAngular(Validator.required, {trim: true});

Quedando el uso en formularios de Angular de la siguiente manera:

const userForm = new FormGroup({
  user: new FormControl('default_value', [fonkToAngular(Validators.required, {trim: false}), fonkToAngular(Validators.email)]),
  password: new FormControl('default_value', [fonkToAngular(Validators.required), fonkToAngular(Validators.maxLength, {length: 20})])
});

Total, en fonk tampoco hay tipado cuando pones los customArgs en el Validation Schema...