virtual-selector
Version:
Virtual selector component for react.js
107 lines (92 loc) • 2.33 kB
JSX
/**
* Virutal option for selector.
*
* @author artisan
* @Date(2015-11-27)
*/
import _ from 'underscore';
import React from 'react';
import classnames from 'classnames';
class SelectorOption extends React.Component {
/**
* Component display name in react develop tool.
*
* @type {String}
*/
displayName = 'SelectorOption';
/**
* Click handler.
*
* @param {object} option active option.
* @param {object} event Event object.
* @return {undefined}
*/
handleClick(option, event) {
let {onClick} = this.props;
if (_.isFunction(onClick)) {
onClick(option, event);
}
}
/**
* Generate group component.
*
* @param {String} options.group group name.
* @param {Array} options.options group options.
* @return {Object} group component.
*/
group({group, options}) {
return (
<div className="selector-group">
<span className="group-title">{group}</span>
<ul className="group-option">
{
options.map(this.option.bind(this))
}
</ul>
</div>
);
}
/**
* Gengerate option item.
*
* @param {Object} option option.
* @return {Object} virtual option component.
*/
option(option = {}) {
let templates, {
selected, template,
prepare, onPrepare
} = this.props,
isPrepare = prepare === option.unique;
if (_.isString(template)) { // Custom option template.
templates = _.template(template)(option);
} else {
templates = option.label;
}
if (isPrepare) {
onPrepare(option);
}
return (
<li key={option.unique} className={classnames('selector-option', {
'option-prepare' : isPrepare && !option.disabled,
'option-disabled': option.disabled,
'option-selected': _.find(selected, option)
})} onClick={this.handleClick.bind(this, option)}>
<span dangerouslySetInnerHTML={{__html: templates}}></span>
</li>
);
}
render() {
let options = null,
{option, group} = this.props;
// Group.
if (group) {
options = this.group(option); // Render group.
} else {
// Single.
options = this.option(option);
}
return options;
}
}
export default SelectorOption;