From 70f8c4a2abe919e31ab963485d0db5082f5f19d6 Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 14 Nov 2019 08:56:55 -0500 Subject: [PATCH] Added required input in checkbox component (#77) * Added support for required attribute in checkbox component * reverted some accidental commits * test coverage for reactive forms * test coverage for required validity * added comment * label tweak * required input property * reverted some accidental commits * added more coverage * leveraging angulars checkboxvalidator to do the heavy-lifting * removed fit from test * reordered imports * enforcing required css class --- .../checkbox-required-validator.directive.ts | 32 ++ .../modules/checkbox/checkbox.component.html | 8 +- .../checkbox/checkbox.component.spec.ts | 316 +++++++++++++++++- .../modules/checkbox/checkbox.component.ts | 104 +++--- .../modules/checkbox/checkbox.module.ts | 25 +- .../checkbox/checkbox-visual.component.html | 69 ++++ .../checkbox/checkbox-visual.component.ts | 34 +- 7 files changed, 534 insertions(+), 54 deletions(-) create mode 100644 src/app/public/modules/checkbox/checkbox-required-validator.directive.ts diff --git a/src/app/public/modules/checkbox/checkbox-required-validator.directive.ts b/src/app/public/modules/checkbox/checkbox-required-validator.directive.ts new file mode 100644 index 00000000..edcaa23e --- /dev/null +++ b/src/app/public/modules/checkbox/checkbox-required-validator.directive.ts @@ -0,0 +1,32 @@ +import { + Directive, + forwardRef, + Provider +} from '@angular/core'; + +import { + CheckboxRequiredValidator, + NG_VALIDATORS +} from '@angular/forms'; + +// tslint:disable:no-forward-ref +export const SKY_CHECKBOX_REQUIRED_VALIDATOR: Provider = { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => SkyCheckboxRequiredValidatorDirective), + multi: true +}; +// tslint:enable + +/** + * Validator support for the `required` input on `sky-checkbox`. + * Angular's `CheckboxRequiredValidator` only works with `input type=checkbox`. This directive + * extends the angular validator to work with `sky-checkbox` tags. + * This is based on Angular Material's similar implementation: + * https://github.com/angular/components/blob/a415b52ead2ec202ba37edb7d7866b29dd790394/src/material/checkbox/checkbox-required-validator.ts + */ +@Directive({ + selector: `sky-checkbox[required][formControlName], + sky-checkbox[required][formControl], sky-checkbox[required][ngModel]`, + providers: [SKY_CHECKBOX_REQUIRED_VALIDATOR] +}) +export class SkyCheckboxRequiredValidatorDirective extends CheckboxRequiredValidator {} diff --git a/src/app/public/modules/checkbox/checkbox.component.html b/src/app/public/modules/checkbox/checkbox.component.html index e1eccb9f..c7082724 100644 --- a/src/app/public/modules/checkbox/checkbox.component.html +++ b/src/app/public/modules/checkbox/checkbox.component.html @@ -1,6 +1,10 @@