Browse Source

feat: add custom required and email validators

pull/4025/head
Arman Ozak 6 years ago
parent
commit
e997c6e576
  1. 37
      npm/ng-packs/packages/core/src/lib/tests/validators.spec.ts
  2. 8
      npm/ng-packs/packages/core/src/lib/validators/index.ts
  3. 25
      npm/ng-packs/packages/core/src/lib/validators/required.validator.ts
  4. 1
      npm/ng-packs/packages/core/src/public-api.ts

37
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);
});
});
});

8
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,
};

25
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;
}

1
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';

Loading…
Cancel
Save