Allow extra attrs provided to <Select> to be passed through to the DOM element (#2959)

* Allow extra attrs provided to `<Select>` to be passed through to the DOM element

* Allow direct passing attrs to the Select wrapper

* Format
This commit is contained in:
David Wheatley 2021-07-13 13:42:46 +01:00 committed by GitHub
parent 7283254b4a
commit a0fe969262

View File

@ -1,6 +1,7 @@
import Component from '../Component'; import Component from '../Component';
import icon from '../helpers/icon'; import icon from '../helpers/icon';
import withAttr from '../utils/withAttr'; import withAttr from '../utils/withAttr';
import classList from '../utils/classList';
/** /**
* The `Select` component displays a <select> input, surrounded with some extra * The `Select` component displays a <select> input, surrounded with some extra
@ -10,18 +11,33 @@ import withAttr from '../utils/withAttr';
* - `onchange` A callback to run when the selected value is changed. * - `onchange` A callback to run when the selected value is changed.
* - `value` The value of the selected option. * - `value` The value of the selected option.
* - `disabled` Disabled state for the input. * - `disabled` Disabled state for the input.
* - `wrapperAttrs` A map of attrs to be passed to the DOM element wrapping the `<select>`
*
* Other attributes are passed directly to the `<select>` element rendered to the DOM.
*/ */
export default class Select extends Component { export default class Select extends Component {
view() { view() {
const { options, onchange, value, disabled } = this.attrs; const {
options,
onchange,
value,
disabled,
// Destructure the `wrapperAttrs` object to extract the `className` for passing to `classList()`
// `= {}` prevents errors when `wrapperAttrs` is undefined
wrapperAttrs: { className: wrapperClassName, ...wrapperAttrs } = {},
...domAttrs
} = this.attrs;
return ( return (
<span className="Select"> <span className={classList('Select', wrapperClassName)} {...wrapperAttrs}>
<select <select
className="Select-input FormControl" className="Select-input FormControl"
onchange={onchange ? withAttr('value', onchange.bind(this)) : undefined} onchange={onchange ? withAttr('value', onchange.bind(this)) : undefined}
value={value} value={value}
disabled={disabled} disabled={disabled}
{...domAttrs}
> >
{Object.keys(options).map((key) => ( {Object.keys(options).map((key) => (
<option value={key}>{options[key]}</option> <option value={key}>{options[key]}</option>