UNPKG

react-simpler-select

Version:

React component that renders a select. Supports optgroups, multiple selections.

106 lines (87 loc) 2.62 kB
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; }; import React from 'react'; import PropTypes from 'prop-types'; // 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 React.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 = React.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: PropTypes.func.isRequired, options: PropTypes.array.isRequired, placeholder: PropTypes.string, value: PropTypes.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 React.createElement( 'select', _extends({}, filterProps(props), { onChange: handleChange.bind(null, multiple, onChange), multiple: multiple }), renderOptions(options, placeholder) ); }; Select.propTypes = propTypes; Select.defaultProps = defaultProps; export default Select;