/*
* @license
* Copyright Akveo. All Rights Reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*/
import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
EventEmitter,
HostBinding,
Input,
Output,
ViewChild,
ElementRef,
Renderer2,
} from '@angular/core';
import { NbStatusService } from '../../services/status.service';
import { convertToBoolProperty, NbBooleanInput } from '../helpers';
import { NbComponentOrCustomStatus } from '../component-status';
/**
* The `NbRadioComponent` provides the same functionality as native ``
* with Nebular styles and animations.
*
* @stacked-example(Showcase, radio/radio-showcase.component)
*
* ### Installation
*
* Import `NbRadioModule` to your feature module.
*
* ```ts
* @NgModule({
* imports: [
* // ...
* NbRadioModule,
* ],
* })
* export class PageModule { }
* ```
*
* ### Usage
*
* Radio buttons should be wrapped in `nb-radio-group` to provide form bindings.
*
* ```html
*
* Option 1
* Option 2
* Option 3
*
* ```
*
* You can disable some radios in the group using a `disabled` attribute.
*
* @stacked-example(Disabled, radio/radio-disabled.component)
*
*
* @styles
*
* radio-width:
* radio-height:
* radio-border-style:
* radio-border-width:
* radio-text-font-family:
* radio-text-font-size:
* radio-text-font-weight:
* radio-text-line-height:
* radio-outline-color:
* radio-outline-width:
* radio-basic-text-color:
* radio-basic-border-color:
* radio-basic-background-color:
* radio-basic-checked-background-color:
* radio-basic-checked-border-color:
* radio-basic-inner-circle-color:
* radio-basic-focus-border-color:
* radio-basic-focus-inner-circle-color:
* radio-basic-hover-background-color:
* radio-basic-hover-border-color:
* radio-basic-hover-inner-circle-color:
* radio-basic-hover-checked-background-color:
* radio-basic-active-border-color:
* radio-basic-active-inner-circle-color:
* radio-basic-disabled-background-color:
* radio-basic-disabled-border-color:
* radio-basic-disabled-text-color:
* radio-basic-disabled-checked-background-color:
* radio-basic-disabled-checked-border-color:
* radio-basic-disabled-checked-inner-circle-color:
* radio-primary-text-color:
* radio-primary-border-color:
* radio-primary-background-color:
* radio-primary-checked-background-color:
* radio-primary-checked-border-color:
* radio-primary-inner-circle-color:
* radio-primary-focus-border-color:
* radio-primary-focus-inner-circle-color:
* radio-primary-hover-background-color:
* radio-primary-hover-border-color:
* radio-primary-hover-inner-circle-color:
* radio-primary-hover-checked-background-color:
* radio-primary-active-border-color:
* radio-primary-active-inner-circle-color:
* radio-primary-disabled-background-color:
* radio-primary-disabled-border-color:
* radio-primary-disabled-text-color:
* radio-primary-disabled-checked-background-color:
* radio-primary-disabled-checked-border-color:
* radio-primary-disabled-checked-inner-circle-color:
* radio-success-text-color:
* radio-success-border-color:
* radio-success-background-color:
* radio-success-checked-background-color:
* radio-success-checked-border-color:
* radio-success-inner-circle-color:
* radio-success-focus-border-color:
* radio-success-focus-inner-circle-color:
* radio-success-hover-background-color:
* radio-success-hover-border-color:
* radio-success-hover-inner-circle-color:
* radio-success-hover-checked-background-color:
* radio-success-active-border-color:
* radio-success-active-inner-circle-color:
* radio-success-disabled-background-color:
* radio-success-disabled-border-color:
* radio-success-disabled-text-color:
* radio-success-disabled-checked-background-color:
* radio-success-disabled-checked-border-color:
* radio-success-disabled-checked-inner-circle-color:
* radio-info-text-color:
* radio-info-border-color:
* radio-info-background-color:
* radio-info-checked-background-color:
* radio-info-checked-border-color:
* radio-info-inner-circle-color:
* radio-info-focus-border-color:
* radio-info-focus-inner-circle-color:
* radio-info-hover-background-color:
* radio-info-hover-border-color:
* radio-info-hover-inner-circle-color:
* radio-info-hover-checked-background-color:
* radio-info-active-border-color:
* radio-info-active-inner-circle-color:
* radio-info-disabled-background-color:
* radio-info-disabled-border-color:
* radio-info-disabled-text-color:
* radio-info-disabled-checked-background-color:
* radio-info-disabled-checked-border-color:
* radio-info-disabled-checked-inner-circle-color:
* radio-warning-text-color:
* radio-warning-border-color:
* radio-warning-background-color:
* radio-warning-checked-background-color:
* radio-warning-checked-border-color:
* radio-warning-inner-circle-color:
* radio-warning-focus-border-color:
* radio-warning-focus-inner-circle-color:
* radio-warning-hover-background-color:
* radio-warning-hover-border-color:
* radio-warning-hover-inner-circle-color:
* radio-warning-hover-checked-background-color:
* radio-warning-active-border-color:
* radio-warning-active-inner-circle-color:
* radio-warning-disabled-background-color:
* radio-warning-disabled-border-color:
* radio-warning-disabled-text-color:
* radio-warning-disabled-checked-background-color:
* radio-warning-disabled-checked-border-color:
* radio-warning-disabled-checked-inner-circle-color:
* radio-danger-text-color:
* radio-danger-border-color:
* radio-danger-background-color:
* radio-danger-checked-background-color:
* radio-danger-checked-border-color:
* radio-danger-inner-circle-color:
* radio-danger-focus-border-color:
* radio-danger-focus-inner-circle-color:
* radio-danger-hover-background-color:
* radio-danger-hover-border-color:
* radio-danger-hover-inner-circle-color:
* radio-danger-hover-checked-background-color:
* radio-danger-active-border-color:
* radio-danger-active-inner-circle-color:
* radio-danger-disabled-background-color:
* radio-danger-disabled-border-color:
* radio-danger-disabled-text-color:
* radio-danger-disabled-checked-background-color:
* radio-danger-disabled-checked-border-color:
* radio-danger-disabled-checked-inner-circle-color:
* radio-control-text-color:
* radio-control-background-color:
* radio-control-border-color:
* radio-control-checked-background-color:
* radio-control-checked-border-color:
* radio-control-inner-circle-color:
* radio-control-focus-border-color:
* radio-control-focus-inner-circle-color:
* radio-control-hover-background-color:
* radio-control-hover-border-color:
* radio-control-hover-inner-circle-color:
* radio-control-hover-checked-background-color:
* radio-control-active-border-color:
* radio-control-active-inner-circle-color:
* radio-control-disabled-background-color:
* radio-control-disabled-border-color:
* radio-control-disabled-text-color:
* radio-control-disabled-checked-background-color:
* radio-control-disabled-checked-border-color:
* radio-control-disabled-checked-inner-circle-color:
* */
@Component({
selector: 'nb-radio',
template: `
`,
changeDetection: ChangeDetectionStrategy.OnPush,
styleUrls: ['./radio.component.scss'],
})
export class NbRadioComponent {
@Input()
get name(): string {
return this._name;
}
set name(value: string) {
if (this._name !== value) {
this._name = value;
}
}
private _name: string;
@Input()
get checked(): boolean {
return this._checked;
}
set checked(value: boolean) {
const boolValue = convertToBoolProperty(value);
if (this._checked !== boolValue) {
this._checked = boolValue;
}
}
private _checked: boolean = false;
static ngAcceptInputType_checked: NbBooleanInput;
@Input()
get value(): any {
return this._value;
}
set value(value: any) {
if (this._value !== value) {
this._value = value;
}
}
private _value: any;
@Input()
get disabled(): boolean {
return this._disabled;
}
set disabled(disabled: boolean) {
const boolValue = convertToBoolProperty(disabled);
if (this._disabled !== boolValue) {
this._disabled = boolValue;
}
}
private _disabled: boolean = false;
static ngAcceptInputType_disabled: NbBooleanInput;
@Input() status: NbComponentOrCustomStatus = 'basic';
@Output() valueChange: EventEmitter = new EventEmitter();
@Output() blur: EventEmitter = new EventEmitter();
@ViewChild('input', { read: ElementRef }) input: ElementRef;
constructor(
protected cd: ChangeDetectorRef,
protected renderer: Renderer2,
protected statusService: NbStatusService,
) {}
@HostBinding('class.status-primary')
get isPrimary(): boolean {
return this.status === 'primary';
}
@HostBinding('class.status-success')
get isSuccess(): boolean {
return this.status === 'success';
}
@HostBinding('class.status-warning')
get isWarning(): boolean {
return this.status === 'warning';
}
@HostBinding('class.status-danger')
get isDanger(): boolean {
return this.status === 'danger';
}
@HostBinding('class.status-info')
get isInfo(): boolean {
return this.status === 'info';
}
@HostBinding('class.status-basic')
get isBasic(): boolean {
return this.status === 'basic';
}
@HostBinding('class.status-control')
get isControl(): boolean {
return this.status === 'control';
}
@HostBinding('class')
get additionalClasses(): string[] {
if (this.statusService.isCustomStatus(this.status)) {
return [this.statusService.getStatusClass(this.status)];
}
return [];
}
onChange(event: Event) {
event.stopPropagation();
this.checked = true;
this.valueChange.emit(this.value);
}
onClick(event: Event) {
event.stopPropagation();
}
/*
* @docs-private
* We use this method when setting radio inputs from radio group component.
* Otherwise Angular won't detect changes in radio template as cached last rendered
* value didn't updated.
**/
_markForCheck() {
this.cd.markForCheck();
}
/*
* @docs-private
* Use this method when setting radio name from radio group component.
* In case option 'name' isn't set on nb-radio component we need to set name
* right away, so it won't overlap with options without names from other radio
* groups. Otherwise they all would have same name and will be considered as
* options from one group so only the last option will stay selected.
**/
_setName(name: string) {
this.name = name;
if (this.input) {
this.renderer.setProperty(this.input.nativeElement, 'name', name);
}
}
}