import { ChangeDetectionStrategy, 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 = 'spinner'; @Component({ selector: 'works-spinner', providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => WorksSpinner), multi: true } ], template: ` `, styles: [` :host { display: inline-block; vertical-align: middle; } :host.block { display: block; vertical-align: initial; } `], changeDetection: ChangeDetectionStrategy.Default }) export class WorksSpinner extends HomeworksManager implements ControlValueAccessor { @ViewChild('worksSelect') selectChild: ElementRef; @Input() id: string; @Input() name: string; @Input() title: string; @Output('update') onUpdate: EventEmitter = new EventEmitter(); private $element: JQuery; private $select: JQuery; private propagateChange: any = Function.prototype; private propagateTouch: any = Function.prototype; private _model: any; private _disabled: any; private _readonly: any; private _required: any; private _placeholder: string; private _block: boolean; private _size: string; constructor( protected renderer: Renderer2, private elementRef: ElementRef ) { super( renderer, COMPONENT ); } @Input() set class(value: string) { this.setPropagateChildClass(this.elementRef.nativeElement, this.selectChild.nativeElement, value); } @Input() get placeholder(): string { return this._placeholder; } set placeholder(value: string) { this._placeholder = value; this.render(); } @Input() get block(): any { return this._block; } set block(value: any) { this._block = !!value; } @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(); } @Input() get size(): string { return this._size; } set size(value: string) { this._size = value; if (this.$select && this.$select.find('.spinner').length) { this.setSize(this.$select.find('.spinner')[0], value); } } get model(): any { return this._model; } set model(value: any) { this._model = value; this.propagateChange(value); this.render(); } writeValue(value: any) { this.model = value; } registerOnChange(fn: any) { this.propagateChange = fn; } registerOnTouched(fn: any) { this.propagateTouch = fn; } render() { if (this.$select) { this.$select.triggerHandler('update', this.model); } } setBlock(block: boolean) { if (block) { if (this.$element) { this.$element.find('.spinner').addClass('spinner-block'); this.renderer.addClass(this.elementRef.nativeElement, 'block'); } } } ngOnInit() { this.$element = jQuery(this.elementRef.nativeElement); this.$select = jQuery(this.selectChild.nativeElement); this.$select .spinner({}) .on('change', event => { const value: homeworks.Event = { value: this.$select.val(), element: this.$select }; this.model = this.$select.val(); this.onUpdate.emit(value); }); this.setBlock(this.block); } ngAfterViewInit() { this.render(); } }