import { Component, Input, Output, EventEmitter, ElementRef, forwardRef, ExistingProvider, OnInit, OnChanges } from '@angular/core'; import { InputBase } from './inputBase'; const provider: ExistingProvider = { provide: InputBase, useExisting: forwardRef(() => RadioButton) } export type RadioTypes = "horizontal" | "vertical"; export interface IRadioItem { id: any; text: any } @Component({ selector: "rd-radio-button", template: `
`, providers: [provider] }) export class RadioButton extends InputBase implements OnInit, OnChanges { constructor(private element: ElementRef) { super(); } @Input("rd-model") model: string; @Output("rd-modelChange") modelChange: EventEmitter = new EventEmitter(); @Output("rd-change") changeEvent: EventEmitter = new EventEmitter(); @Output("rd-itemSelect") itemSelectEvent: EventEmitter = new EventEmitter(); @Input("rd-disabled") disabled: boolean = false; @Input("rd-type") type: RadioTypes = "horizontal"; @Input("rd-default-index") defaultIndex: number = 0; @Input("rd-readOnly") readOnly: boolean = false; @Input("rd-height") height: number | string; @Input("rd-items") items: Array = []; @Input("rd-display") displayExpr: string = "text"; @Input("rd-value") valueExpr: string = "id"; container; dxElement; ngOnInit() { let value; if ((this.model == null || this.model == undefined) && this.items.length) { this.onChanges(this.items[this.defaultIndex][this.valueExpr]); value = this.items[this.defaultIndex][this.valueExpr]; } else value = this.model; this.container = this.jQuery(this.element.nativeElement).find("#dxElementRadio"); this.container.dxRadioGroup({ items: this.items, disabled: this.disabled, readOnly: this.readOnly, displayExpr: this.displayExpr, valueExpr: this.valueExpr, value: value, layout: this.type, onValueChanged: function (event) { this.onChanges(event.value); }.bind(this) }); this.dxElement = this.container.dxRadioGroup('instance'); } ngOnChanges(changes) { if (!this.dxElement) return; if (changes.model) this.dxElement.option('value', this.model); if (changes.defaultIndex) this.dxElement.option('value', this.items[this.defaultIndex]); if (changes.items) this.dxElement.option('items', this.items); if (changes.disabled) this.dxElement.option('disabled', this.disabled); if (changes.type) this.dxElement.option('layout', this.type); if (changes.readOnly) this.dxElement.option('readOnly', this.readOnly); } private onChanges(value) { this.modelChange.emit(value); let item = this.items.filter((e) => { return e[this.valueExpr] == value })[0]; this.itemSelectEvent.emit(item); } }