From e997c6e576bc7b0d5c1f19cb5029c9ce5b5593e6 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Thu, 21 May 2020 02:22:32 +0300 Subject: [PATCH] feat: add custom required and email validators --- .../core/src/lib/tests/validators.spec.ts | 37 +++++++++++++++++++ .../packages/core/src/lib/validators/index.ts | 8 ++++ .../src/lib/validators/required.validator.ts | 25 +++++++++++++ npm/ng-packs/packages/core/src/public-api.ts | 1 + 4 files changed, 71 insertions(+) create mode 100644 npm/ng-packs/packages/core/src/lib/tests/validators.spec.ts create mode 100644 npm/ng-packs/packages/core/src/lib/validators/index.ts create mode 100644 npm/ng-packs/packages/core/src/lib/validators/required.validator.ts diff --git a/npm/ng-packs/packages/core/src/lib/tests/validators.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/validators.spec.ts new file mode 100644 index 0000000000..efe668005f --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/tests/validators.spec.ts @@ -0,0 +1,37 @@ +import { FormControl } from '@angular/forms'; +import { validateRequired } from '../validators/required.validator'; + +describe('Validators', () => { + describe('Required Validator', () => { + const error = { required: true }; + + test.each` + input | options | expected + ${0} | ${undefined} | ${null} + ${false} | ${undefined} | ${null} + ${null} | ${undefined} | ${error} + ${undefined} | ${undefined} | ${error} + ${''} | ${undefined} | ${error} + ${''} | ${{}} | ${error} + ${''} | ${{ allowEmptyStrings: false }} | ${error} + ${''} | ${{ allowEmptyStrings: true }} | ${null} + `( + 'should return $expected when input is $input and options are $options', + ({ input, options, expected }) => { + const control = new FormControl(input, [validateRequired(options)]); + control.markAsDirty({ onlySelf: true }); + control.updateValueAndValidity({ onlySelf: true, emitEvent: false }); + + expect(control.errors).toEqual(expected); + }, + ); + + it('should return null when control is pristine', () => { + const invalidUrl = ''; + const control = new FormControl(invalidUrl, [validateRequired()]); + // control is not dirty + + expect(control.valid).toBe(true); + }); + }); +}); diff --git a/npm/ng-packs/packages/core/src/lib/validators/index.ts b/npm/ng-packs/packages/core/src/lib/validators/index.ts new file mode 100644 index 0000000000..0d0a6fb2e9 --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/validators/index.ts @@ -0,0 +1,8 @@ +import { Validators } from '@angular/forms'; +import { validateRequired } from './required.validator'; +export * from './required.validator'; + +export const AbpValidators = { + email: () => Validators.email, + required: validateRequired, +}; diff --git a/npm/ng-packs/packages/core/src/lib/validators/required.validator.ts b/npm/ng-packs/packages/core/src/lib/validators/required.validator.ts new file mode 100644 index 0000000000..f8d27a3ffd --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/validators/required.validator.ts @@ -0,0 +1,25 @@ +import { AbstractControl, ValidatorFn } from '@angular/forms'; + +export interface RequiredError { + required: true; +} + +export interface RequiredOptions { + allowEmptyStrings?: boolean; +} + +export function validateRequired({ allowEmptyStrings }: RequiredOptions = {}): ValidatorFn { + return (control: AbstractControl): RequiredError | null => { + return control.pristine || isValidRequired(control.value, allowEmptyStrings) + ? null + : { required: true }; + }; +} + +function isValidRequired(value: any, allowEmptyStrings: boolean): boolean { + if (value || value === 0 || value === false) return true; + + if (allowEmptyStrings && value === '') return true; + + return false; +} diff --git a/npm/ng-packs/packages/core/src/public-api.ts b/npm/ng-packs/packages/core/src/public-api.ts index 51ac130da2..56d4098d85 100644 --- a/npm/ng-packs/packages/core/src/public-api.ts +++ b/npm/ng-packs/packages/core/src/public-api.ts @@ -20,3 +20,4 @@ export * from './lib/states'; export * from './lib/strategies'; export * from './lib/tokens'; export * from './lib/utils'; +export * from './lib/validators';