/** * @license * Copyright Akveo. All Rights Reserved. * Licensed under the MIT License. See License.txt in the project root for license information. */ import { Component, Input, HostBinding, forwardRef, ChangeDetectorRef, Output, EventEmitter, ChangeDetectionStrategy, Renderer2, ElementRef, AfterViewInit, NgZone, } from '@angular/core'; import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; import { NbStatusService } from '../../services/status.service'; import { NbComponentOrCustomStatus } from '../component-status'; import { convertToBoolProperty, NbBooleanInput } from '../helpers'; /** * Styled checkbox component * * @stacked-example(Showcase, checkbox/checkbox-showcase.component) * * ### Installation * * Import `NbCheckboxComponent` to your feature module. * ```ts * @NgModule({ * imports: [ * // ... * NbCheckboxModule, * ], * }) * export class PageModule { } * ``` * ### Usage * * Checkbox is available in multiple colors using `status` property: * @stacked-example(Colored Checkboxes, checkbox/checkbox-status.component) * * Indeterminate state is also supported: * @stacked-example(Indeterminate Checkbox, checkbox/checkbox-indeterminate.component) * * Checkbox can be disabled via `disabled` attribute. * @stacked-example(Disabled Checkbox, checkbox/checkbox-disabled.component) * * @styles * * checkbox-height: * checkbox-width: * checkbox-border-style: * checkbox-border-width: * checkbox-border-radius: * checkbox-outline-width: * checkbox-outline-color: * checkbox-text-font-family: * checkbox-text-font-size: * checkbox-text-font-weight: * checkbox-text-line-height: * checkbox-text-space: * checkbox-padding: * checkbox-focus-inset-shadow-length: * checkbox-basic-text-color: * checkbox-basic-background-color: * checkbox-basic-border-color: * checkbox-basic-checked-background-color: * checkbox-basic-checked-border-color: * checkbox-basic-checked-checkmark-color: * checkbox-basic-indeterminate-background-color: * checkbox-basic-indeterminate-border-color: * checkbox-basic-indeterminate-checkmark-color: * checkbox-basic-focus-background-color: * checkbox-basic-focus-border-color: * checkbox-basic-focus-checked-background-color: * checkbox-basic-focus-checked-border-color: * checkbox-basic-hover-background-color: * checkbox-basic-hover-border-color: * checkbox-basic-hover-checked-background-color: * checkbox-basic-hover-checked-border-color: * checkbox-basic-active-background-color: * checkbox-basic-active-border-color: * checkbox-basic-active-checked-background-color: * checkbox-basic-active-checked-border-color: * checkbox-basic-disabled-background-color: * checkbox-basic-disabled-border-color: * checkbox-basic-disabled-checkmark-color: * checkbox-basic-disabled-text-color: * checkbox-basic-disabled-checked-background-color: * checkbox-primary-text-color: * checkbox-primary-background-color: * checkbox-primary-border-color: * checkbox-primary-checked-background-color: * checkbox-primary-checked-border-color: * checkbox-primary-checked-checkmark-color: * checkbox-primary-indeterminate-background-color: * checkbox-primary-indeterminate-border-color: * checkbox-primary-indeterminate-checkmark-color: * checkbox-primary-focus-background-color: * checkbox-primary-focus-border-color: * checkbox-primary-focus-checked-background-color: * checkbox-primary-focus-checked-border-color: * checkbox-primary-hover-background-color: * checkbox-primary-hover-border-color: * checkbox-primary-hover-checked-background-color: * checkbox-primary-hover-checked-border-color: * checkbox-primary-active-background-color: * checkbox-primary-active-border-color: * checkbox-primary-active-checked-background-color: * checkbox-primary-active-checked-border-color: * checkbox-primary-disabled-background-color: * checkbox-primary-disabled-border-color: * checkbox-primary-disabled-checkmark-color: * checkbox-primary-disabled-text-color: * checkbox-primary-disabled-checked-background-color: * checkbox-success-text-color: * checkbox-success-background-color: * checkbox-success-border-color: * checkbox-success-checked-background-color: * checkbox-success-checked-border-color: * checkbox-success-checked-checkmark-color: * checkbox-success-indeterminate-background-color: * checkbox-success-indeterminate-border-color: * checkbox-success-indeterminate-checkmark-color: * checkbox-success-focus-background-color: * checkbox-success-focus-border-color: * checkbox-success-focus-checked-background-color: * checkbox-success-focus-checked-border-color: * checkbox-success-hover-background-color: * checkbox-success-hover-border-color: * checkbox-success-hover-checked-background-color: * checkbox-success-hover-checked-border-color: * checkbox-success-active-background-color: * checkbox-success-active-border-color: * checkbox-success-active-checked-background-color: * checkbox-success-active-checked-border-color: * checkbox-success-disabled-background-color: * checkbox-success-disabled-border-color: * checkbox-success-disabled-checkmark-color: * checkbox-success-disabled-text-color: * checkbox-success-disabled-checked-background-color: * checkbox-info-text-color: * checkbox-info-background-color: * checkbox-info-border-color: * checkbox-info-checked-background-color: * checkbox-info-checked-border-color: * checkbox-info-checked-checkmark-color: * checkbox-info-indeterminate-background-color: * checkbox-info-indeterminate-border-color: * checkbox-info-indeterminate-checkmark-color: * checkbox-info-focus-background-color: * checkbox-info-focus-border-color: * checkbox-info-focus-checked-background-color: * checkbox-info-focus-checked-border-color: * checkbox-info-hover-background-color: * checkbox-info-hover-border-color: * checkbox-info-hover-checked-background-color: * checkbox-info-hover-checked-border-color: * checkbox-info-active-background-color: * checkbox-info-active-border-color: * checkbox-info-active-checked-background-color: * checkbox-info-active-checked-border-color: * checkbox-info-disabled-background-color: * checkbox-info-disabled-border-color: * checkbox-info-disabled-checkmark-color: * checkbox-info-disabled-text-color: * checkbox-info-disabled-checked-background-color: * checkbox-warning-text-color: * checkbox-warning-background-color: * checkbox-warning-border-color: * checkbox-warning-checked-background-color: * checkbox-warning-checked-border-color: * checkbox-warning-checked-checkmark-color: * checkbox-warning-indeterminate-background-color: * checkbox-warning-indeterminate-border-color: * checkbox-warning-indeterminate-checkmark-color: * checkbox-warning-focus-background-color: * checkbox-warning-focus-border-color: * checkbox-warning-focus-checked-background-color: * checkbox-warning-focus-checked-border-color: * checkbox-warning-hover-background-color: * checkbox-warning-hover-border-color: * checkbox-warning-hover-checked-background-color: * checkbox-warning-hover-checked-border-color: * checkbox-warning-active-background-color: * checkbox-warning-active-border-color: * checkbox-warning-active-checked-background-color: * checkbox-warning-active-checked-border-color: * checkbox-warning-disabled-background-color: * checkbox-warning-disabled-border-color: * checkbox-warning-disabled-checkmark-color: * checkbox-warning-disabled-text-color: * checkbox-warning-disabled-checked-background-color: * checkbox-danger-text-color: * checkbox-danger-background-color: * checkbox-danger-border-color: * checkbox-danger-checked-background-color: * checkbox-danger-checked-border-color: * checkbox-danger-checked-checkmark-color: * checkbox-danger-indeterminate-background-color: * checkbox-danger-indeterminate-border-color: * checkbox-danger-indeterminate-checkmark-color: * checkbox-danger-focus-background-color: * checkbox-danger-focus-border-color: * checkbox-danger-focus-checked-background-color: * checkbox-danger-focus-checked-border-color: * checkbox-danger-hover-background-color: * checkbox-danger-hover-border-color: * checkbox-danger-hover-checked-background-color: * checkbox-danger-hover-checked-border-color: * checkbox-danger-active-background-color: * checkbox-danger-active-border-color: * checkbox-danger-active-checked-background-color: * checkbox-danger-active-checked-border-color: * checkbox-danger-disabled-background-color: * checkbox-danger-disabled-border-color: * checkbox-danger-disabled-checkmark-color: * checkbox-danger-disabled-text-color: * checkbox-danger-disabled-checked-background-color: * checkbox-control-text-color: * checkbox-control-background-color: * checkbox-control-border-color: * checkbox-control-checked-background-color: * checkbox-control-checked-border-color: * checkbox-control-checked-checkmark-color: * checkbox-control-indeterminate-background-color: * checkbox-control-indeterminate-border-color: * checkbox-control-indeterminate-checkmark-color: * checkbox-control-focus-background-color: * checkbox-control-focus-border-color: * checkbox-control-focus-checked-background-color: * checkbox-control-focus-checked-border-color: * checkbox-control-hover-background-color: * checkbox-control-hover-border-color: * checkbox-control-hover-checked-background-color: * checkbox-control-hover-checked-border-color: * checkbox-control-active-background-color: * checkbox-control-active-border-color: * checkbox-control-active-checked-background-color: * checkbox-control-active-checked-border-color: * checkbox-control-disabled-background-color: * checkbox-control-disabled-border-color: * checkbox-control-disabled-checkmark-color: * checkbox-control-disabled-text-color: * checkbox-control-disabled-checked-background-color: */ @Component({ selector: 'nb-checkbox', template: ` `, styleUrls: [ `./checkbox.component.scss` ], providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NbCheckboxComponent), multi: true, }], changeDetection: ChangeDetectionStrategy.OnPush, }) export class NbCheckboxComponent implements AfterViewInit, ControlValueAccessor { onChange: any = () => { }; onTouched: any = () => { }; @Input() get checked(): boolean { return this._checked; } set checked(value: boolean) { this._checked = convertToBoolProperty(value); } private _checked: boolean = false; static ngAcceptInputType_checked: NbBooleanInput; /** * Controls input disabled state */ @Input() get disabled(): boolean { return this._disabled; } set disabled(value: boolean) { this._disabled = convertToBoolProperty(value); } private _disabled: boolean = false; static ngAcceptInputType_disabled: NbBooleanInput; /** * Checkbox status. * Possible values are: `basic`, `primary`, `success`, `warning`, `danger`, `info`, `control`. */ @Input() status: NbComponentOrCustomStatus = 'basic'; /** * Controls checkbox indeterminate state */ @Input() get indeterminate(): boolean { return this._indeterminate; } set indeterminate(value: boolean) { this._indeterminate = convertToBoolProperty(value); } private _indeterminate: boolean = false; static ngAcceptInputType_indeterminate: NbBooleanInput; /** * Output when checked state is changed by a user * @type EventEmitter */ @Output() checkedChange = new EventEmitter(); @HostBinding('class.status-primary') get primary() { return this.status === 'primary'; } @HostBinding('class.status-success') get success() { return this.status === 'success'; } @HostBinding('class.status-warning') get warning() { return this.status === 'warning'; } @HostBinding('class.status-danger') get danger() { return this.status === 'danger'; } @HostBinding('class.status-info') get info() { return this.status === 'info'; } @HostBinding('class.status-basic') get basic() { return this.status === 'basic'; } @HostBinding('class.status-control') get control() { return this.status === 'control'; } @HostBinding('class') get additionalClasses(): string[] { if (this.statusService.isCustomStatus(this.status)) { return [this.statusService.getStatusClass(this.status)]; } return []; } constructor( private changeDetector: ChangeDetectorRef, private renderer: Renderer2, private hostElement: ElementRef, private zone: NgZone, private statusService: NbStatusService, ) {} ngAfterViewInit() { // TODO: #2254 this.zone.runOutsideAngular(() => setTimeout(() => { this.renderer.addClass(this.hostElement.nativeElement, 'nb-transition'); })); } registerOnChange(fn: any) { this.onChange = fn; } registerOnTouched(fn: any) { this.onTouched = fn; } writeValue(val: any) { this._checked = val; this.changeDetector.markForCheck(); } setDisabledState(val: boolean) { this.disabled = convertToBoolProperty(val); this.changeDetector.markForCheck(); } setTouched() { this.onTouched(); } updateValueAndIndeterminate(event: Event): void { const input = (event.target as HTMLInputElement); this.checked = input.checked; this.checkedChange.emit(this.checked); this.onChange(this.checked); this.indeterminate = input.indeterminate; } }