import m from 'mithril';
import classnames from 'classnames';
import { Classes, IAttrs, ISizeAttrs, IOption, Option } from '../../_shared';
import { Radio } from './Radio';
export interface IRadioGroupAttrs extends IAttrs, ISizeAttrs {
/** Disables selection */
disabled?: boolean;
/**
* Name of the radio group.
* If no name is specified, a unique name will be generated for each instance.
*/
name?: string;
/**
* Callback invoked when selection changes.
* The selected value can be accessed through e.currentTarget.value
*/
onchange?: (e: Event) => void;
/** Array of radio group options */
options?: Option[];
/** Value of the selected radio element */
value?: string;
[htmlAttrs: string]: any;
}
let instanceCounter = 0;
export class RadioGroup implements m.Component {
private uniqueId = `${Classes.RADIO_GROUP}-${instanceCounter++}`;
public view({ attrs }: m.Vnode) {
const {
class: className,
disabled,
intent,
name,
options,
onchange,
size,
value,
...htmlAttrs
} = attrs;
const classes = classnames(
Classes.RADIO_GROUP,
size && `cui-${size}`,
className
);
const radioButtons = (attrs.options as IOption[])
.map(option => this.renderRadioButton(option, attrs));
return m('', { class: classes, ...htmlAttrs }, radioButtons);
}
private renderRadioButton(option: Option, attrs: IRadioGroupAttrs) {
const label = typeof (option) === 'object' ? option.label : option;
const value = typeof (option) === 'object' ? option.value : option;
return m(Radio, {
checked: value === attrs.value,
disabled: attrs.disabled,
label,
name: attrs.name || this.uniqueId,
onchange: attrs.onchange,
value
});
}
}