UNPKG

@wordpress/components

Version:
183 lines (158 loc) 5.02 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.SelectControl = void 0; var _element = require("@wordpress/element"); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classnames = _interopRequireDefault(require("classnames")); var _compose = require("@wordpress/compose"); var _baseControl = _interopRequireDefault(require("../base-control")); var _inputBase = _interopRequireDefault(require("../input-control/input-base")); var _selectControlStyles = require("./styles/select-control-styles"); var _chevronDown = _interopRequireDefault(require("./chevron-down")); /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ const noop = () => {}; function useUniqueId(idProp) { const instanceId = (0, _compose.useInstanceId)(SelectControl); const id = `inspector-select-control-${instanceId}`; return idProp || id; } function UnforwardedSelectControl(props, ref) { const { className, disabled = false, help, hideLabelFromVision, id: idProp, label, multiple = false, onBlur = noop, onChange, onFocus = noop, options = [], size = 'default', value: valueProp, labelPosition = 'top', children, prefix, suffix, __next36pxDefaultSize = false, __nextHasNoMarginBottom = false, ...restProps } = props; const [isFocused, setIsFocused] = (0, _element.useState)(false); const id = useUniqueId(idProp); const helpId = help ? `${id}__help` : undefined; // Disable reason: A select with an onchange throws a warning. if (!(options !== null && options !== void 0 && options.length) && !children) return null; const handleOnBlur = event => { onBlur(event); setIsFocused(false); }; const handleOnFocus = event => { onFocus(event); setIsFocused(true); }; const handleOnChange = event => { var _props$onChange2; if (props.multiple) { var _props$onChange; const selectedOptions = Array.from(event.target.options).filter(_ref => { let { selected } = _ref; return selected; }); const newValues = selectedOptions.map(_ref2 => { let { value } = _ref2; return value; }); (_props$onChange = props.onChange) === null || _props$onChange === void 0 ? void 0 : _props$onChange.call(props, newValues, { event }); return; } (_props$onChange2 = props.onChange) === null || _props$onChange2 === void 0 ? void 0 : _props$onChange2.call(props, event.target.value, { event }); }; const classes = (0, _classnames.default)('components-select-control', className); return (0, _element.createElement)(_baseControl.default, { help: help, id: id, __nextHasNoMarginBottom: __nextHasNoMarginBottom }, (0, _element.createElement)(_inputBase.default, { className: classes, disabled: disabled, hideLabelFromVision: hideLabelFromVision, id: id, isFocused: isFocused, label: label, size: size, suffix: suffix || !multiple && (0, _element.createElement)(_chevronDown.default, null), prefix: prefix, labelPosition: labelPosition, __next36pxDefaultSize: __next36pxDefaultSize }, (0, _element.createElement)(_selectControlStyles.Select, (0, _extends2.default)({}, restProps, { __next36pxDefaultSize: __next36pxDefaultSize, "aria-describedby": helpId, className: "components-select-control__input", disabled: disabled, id: id, multiple: multiple, onBlur: handleOnBlur, onChange: handleOnChange, onFocus: handleOnFocus, ref: ref, selectSize: size, value: valueProp }), children || options.map((option, index) => { const key = option.id || `${option.label}-${option.value}-${index}`; return (0, _element.createElement)("option", { key: key, value: option.value, disabled: option.disabled }, option.label); })))); } /** * `SelectControl` allows users to select from a single or multiple option menu. * It functions as a wrapper around the browser's native `<select>` element. * * @example * import { SelectControl } from '@wordpress/components'; * import { useState } from '@wordpress/element'; * * const MySelectControl = () => { * const [ size, setSize ] = useState( '50%' ); * * return ( * <SelectControl * label="Size" * value={ size } * options={ [ * { label: 'Big', value: '100%' }, * { label: 'Medium', value: '50%' }, * { label: 'Small', value: '25%' }, * ] } * onChange={ setSize } * /> * ); * }; */ const SelectControl = (0, _element.forwardRef)(UnforwardedSelectControl); exports.SelectControl = SelectControl; var _default = SelectControl; exports.default = _default; //# sourceMappingURL=index.js.map