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-toggle', providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => WorksToggle), multi: true } ], template: ` `, changeDetection: ChangeDetectionStrategy.Default }) export class WorksToggle extends HomeworksManager implements ControlValueAccessor { @ViewChild('worksToggle') toggleChild: ElementRef; @Input() type: string = 'radio'; @Input() id: string; @Input() name: string; @Input() title: string; @Input() value: any; @Output('update') onUpdate: EventEmitter = new EventEmitter(); private $element: JQuery; private $toggle: JQuery; private propagateChange: any = Function.prototype; private propagateTouch: any = Function.prototype; private _model: any; private _disabled: any; private _checked: any; private _readonly: any; private _required: any; private _placeholder: any; private _color: string; constructor( protected renderer: Renderer2, private changeDetectorRef: ChangeDetectorRef, private elementRef: ElementRef ) { super( renderer, COMPONENT, ALIAS ); } @Input('ngModel') get model() { return this._model; } set model(value: any) { this._model = value; this.propagateChange(value); if (value === true || value === false) { this.checked = value; } this.render(); } @Input() get placeholder(): any { return this._placeholder; } set placeholder(value: any) { let parseValue: any = value; if (value) { try { if (typeof value === 'string') { const targetString: string = value.replace(/\'/gi, '\"'); parseValue = JSON.parse(targetString); } } catch (e) { ; } this._placeholder = parseValue; if (this.$toggle) this.$toggle.triggerHandler('update', { placeholder: value }); } } @Input() get color(): string { return this._color; } set color(value: string) { this._color = value; this.setColor(this.toggleChild.nativeElement, value); } @Input() set class(value: string) { this.setPropagateChildClass(this.elementRef.nativeElement, this.toggleChild.nativeElement, value); } @Input() get checked(): any { return this._checked; } set checked(value: any) { this._checked = value; this.changeDetectorRef.detectChanges(); this.render(); } @Input() get disabled(): any { return this._disabled; } set disabled(value: any) { this._disabled = value; 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(); } writeValue(value: any) { this.model = value; } registerOnChange(fn: any) { this.propagateChange = fn; } registerOnTouched(fn: any) { this.propagateTouch = fn; } render() { if (this.$toggle) { this.$toggle.triggerHandler('update'); } } ngOnInit() { this.$element = jQuery(this.elementRef.nativeElement); this.$toggle = jQuery(this.toggleChild.nativeElement); this.$toggle .toggle({ placeholder: this.placeholder }) .on('change', (event: JQuery.Event) => { const value: homeworks.Event = { checked: this.$toggle.prop('checked'), value: this.$toggle.val(), element: this.$toggle }; this.onUpdate.emit(value); }); } ngAfterViewInit() { this.render(); } }