import {NgModule,Component,Input,Output,EventEmitter,forwardRef,ChangeDetectorRef} from '@angular/core';
import {CommonModule} from '@angular/common';
import {NG_VALUE_ACCESSOR, ControlValueAccessor, FormControl} from '@angular/forms';
export const CHECKBOX_VALUE_ACCESSOR: any = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => Checkbox),
multi: true
};
@Component({
selector: 'p-checkbox',
template: `
`,
providers: [CHECKBOX_VALUE_ACCESSOR]
})
export class Checkbox implements ControlValueAccessor {
@Input() value: any;
@Input() name: string;
@Input() disabled: boolean;
@Input() binary: string;
@Input() label: string;
@Input() tabindex: number;
@Input() inputId: string;
@Input() style: any;
@Input() styleClass: string;
@Input() labelStyleClass: string;
@Input() formControl: FormControl;
@Output() onChange: EventEmitter = new EventEmitter();
model: any;
onModelChange: Function = () => {};
onModelTouched: Function = () => {};
focused: boolean = false;
checked: boolean = false;
constructor(private cd: ChangeDetectorRef) {}
onClick(event,checkbox,focus:boolean) {
event.preventDefault();
if(this.disabled) {
return;
}
this.checked = !this.checked;
this.updateModel();
if(focus) {
checkbox.focus();
}
}
updateModel() {
if(!this.binary) {
if(this.checked)
this.addValue();
else
this.removeValue();
this.onModelChange(this.model);
if(this.formControl) {
this.formControl.setValue(this.model);
}
}
else {
this.onModelChange(this.checked);
}
this.onChange.emit(this.checked);
}
handleChange(event) {
this.checked = event.target.checked;
this.updateModel();
}
isChecked(): boolean {
if(this.binary)
return this.model;
else
return this.model && this.model.indexOf(this.value) > -1;
}
removeValue() {
this.model = this.model.filter(val => val !== this.value);
}
addValue() {
if(this.model)
this.model = [...this.model, this.value];
else
this.model = [this.value];
}
onFocus(event) {
this.focused = true;
}
onBlur(event) {
this.focused = false;
this.onModelTouched();
}
writeValue(model: any) : void {
this.model = model;
this.checked = this.isChecked();
this.cd.markForCheck();
}
registerOnChange(fn: Function): void {
this.onModelChange = fn;
}
registerOnTouched(fn: Function): void {
this.onModelTouched = fn;
}
setDisabledState(val: boolean): void {
this.disabled = val;
}
}
@NgModule({
imports: [CommonModule],
exports: [Checkbox],
declarations: [Checkbox]
})
export class CheckboxModule { }