react-simpler-select
Version:
React component that renders a select. Supports optgroups, multiple selections.
119 lines (94 loc) • 2.98 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// Filters props to remove before transmission to the select element.
var filterProps = function filterProps(props) {
return Object.keys(props).filter(function (k) {
return ['onChange', 'options', 'placeholder'].indexOf(k) === -1;
}).reduce(function (filtered, k) {
// eslint-disable-next-line no-param-reassign
filtered[k] = props[k];
return filtered;
}, {});
};
var renderOption = function renderOption(option) {
return _react2.default.createElement(
'option',
{
key: option.value,
value: option.value,
disabled: option.disabled
},
option.label
);
};
var renderOptions = function renderOptions(options, placeholder) {
var children = options.map(function (item) {
var child = void 0;
if (item.options) {
child = _react2.default.createElement(
'optgroup',
{ label: item.title, key: item.id },
item.options.map(renderOption)
);
} else {
child = renderOption(item);
}
return child;
});
if (placeholder) {
children.unshift(renderOption({ label: placeholder, value: '', disabled: true }));
}
return children;
};
var handleChange = function handleChange(multiple, onChange, e) {
var value = void 0;
if (multiple) {
value = Array.prototype.slice.call(e.target.options).filter(function (option) {
return option.selected;
}).map(function (option) {
return option.value;
});
} else {
value = e.target.value;
}
onChange(value);
};
/**
* The Select component. Renders to a plain HTML <select>.
*/
var propTypes = {
onChange: _propTypes2.default.func.isRequired,
options: _propTypes2.default.array.isRequired,
placeholder: _propTypes2.default.string,
value: _propTypes2.default.any
};
var defaultProps = {
placeholder: null,
value: null
};
var Select = function Select(props) {
var value = props.value,
options = props.options,
placeholder = props.placeholder,
onChange = props.onChange;
var multiple = Array.isArray(value);
return _react2.default.createElement(
'select',
_extends({}, filterProps(props), {
onChange: handleChange.bind(null, multiple, onChange),
multiple: multiple
}),
renderOptions(options, placeholder)
);
};
Select.propTypes = propTypes;
Select.defaultProps = defaultProps;
exports.default = Select;