import {
ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, Input, Output,
Renderer2, ViewChild
} from '@angular/core';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
import { HomeworksManager } from '../../core/manager';
const COMPONENT: string = 'checkbox';
const ALIAS: string = 'input';
@Component({
selector: 'works-checkbox',
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => WorksCheckbox),
multi: true
}
],
template: `
`,
changeDetection: ChangeDetectionStrategy.Default
})
export class WorksCheckbox extends HomeworksManager implements ControlValueAccessor {
@ViewChild('worksCheckbox') checkboxChild: ElementRef;
@Input() type: string = 'checkbox';
@Input() id: string;
@Input() name: string;
@Input() title: string;
@Output('update')
onUpdate: EventEmitter =
new EventEmitter();
private $element: JQuery;
private $checkbox: JQuery;
private propagateChange: any = Function.prototype;
private propagateTouch: any = Function.prototype;
private _model: any;
private _color: string;
private _disabled: any;
private _checked: any;
private _readonly: any;
private _required: any;
private _value: string = '';
constructor(
protected renderer: Renderer2,
private changeDetectorRef: ChangeDetectorRef,
private elementRef: ElementRef
) {
super(
renderer,
COMPONENT,
ALIAS
);
}
get model(): any {
return this._model;
}
set model(value: any) {
this._model = value;
this.propagateChange(value);
if (value === true || value === false) {
this.checked = value;
}
this.render();
}
@Input()
set class(value: string) {
this.setPropagateChildClass(this.elementRef.nativeElement, this.checkboxChild.nativeElement, value);
}
@Input()
get color(): string {
return this._color;
}
set color(value: string) {
this._color = value;
this.setColor(this.checkboxChild.nativeElement, value);
}
@Input()
get disabled(): any {
return this._disabled;
}
set disabled(value: any) {
this._disabled = value;
this.render();
}
@Input()
get checked(): any {
return this._checked;
}
set checked(value: any) {
this._checked = value;
this.changeDetectorRef.detectChanges();
this.render();
}
@Input()
get readonly(): any {
return this._readonly;
}
set readonly(value: any) {
this._readonly = value;
this.render();
}
@Input()
get required(): any {
return this._required;
}
set required(value: any) {
this._required = value;
this.render();
}
@Input()
get value(): any {
return this._value;
}
set value(value: any) {
this._value = value;
this.render();
}
writeValue(value: any) {
this.model = value;
}
registerOnChange(fn: any) {
this.propagateChange = fn;
}
registerOnTouched(fn: any) {
this.propagateTouch = fn;
}
render() {
if (this.$checkbox) {
this.$checkbox.triggerHandler('update');
}
}
ngOnInit() {
this.$element = jQuery(this.elementRef.nativeElement);
this.$checkbox = jQuery(this.checkboxChild.nativeElement);
this.$checkbox
.checkbox()
.on('change', event => {
const value: homeworks.Event = {
checked: this.$checkbox.prop('checked'),
value: this.$checkbox.val(),
element: this.$checkbox
}
const formValue: any = this.$checkbox.val();
const formChecked: boolean = this.$checkbox.prop('checked');
const formValueExists: boolean = !!formValue;
if (formChecked) {
if (formValueExists) {
this.model = this.$checkbox.val();
} else {
this.model = formChecked;
}
} else {
if (formValueExists) {
this.model = '';
} else {
this.model = formChecked;
}
}
this.onUpdate.emit(value);
});
}
ngAfterViewInit() {
this.render();
}
}