UNPKG

netlify-cms-widget-select

Version:

Selectable values widget for Netlify CMS.

178 lines (147 loc) 4.97 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _find2 = _interopRequireDefault(require("lodash/find")); var _react = _interopRequireDefault(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _reactImmutableProptypes = _interopRequireDefault(require("react-immutable-proptypes")); var _immutable = require("immutable"); var _reactSelect = _interopRequireDefault(require("react-select")); var _netlifyCmsUiDefault = require("netlify-cms-ui-default"); var _netlifyCmsLibWidgets = require("netlify-cms-lib-widgets"); var _core = require("@emotion/core"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function optionToString(option) { return option && option.value ? option.value : null; } function convertToOption(raw) { if (typeof raw === 'string') { return { label: raw, value: raw }; } return _immutable.Map.isMap(raw) ? raw.toJS() : raw; } function getSelectedValue({ value, options, isMultiple }) { if (isMultiple) { const selectedOptions = _immutable.List.isList(value) ? value.toJS() : value; if (!selectedOptions || !Array.isArray(selectedOptions)) { return null; } return selectedOptions.map(i => options.find(o => o.value === (i.value || i))).filter(Boolean).map(convertToOption); } else { return (0, _find2.default)(options, ['value', value]) || null; } } class SelectControl extends _react.default.Component { constructor(...args) { super(...args); _defineProperty(this, "isValid", () => { const { field, value, t } = this.props; const min = field.get('min'); const max = field.get('max'); if (!field.get('multiple')) { return { error: false }; } const error = _netlifyCmsLibWidgets.validations.validateMinMax(t, field.get('label', field.get('name')), value, min, max); return error ? { error } : { error: false }; }); _defineProperty(this, "handleChange", selectedOption => { const { onChange, field } = this.props; const isMultiple = field.get('multiple', false); const isEmpty = isMultiple ? !(selectedOption !== null && selectedOption !== void 0 && selectedOption.length) : !selectedOption; if (field.get('required') && isEmpty && isMultiple) { onChange((0, _immutable.List)()); } else if (isEmpty) { onChange(null); } else if (isMultiple) { const options = selectedOption.map(optionToString); onChange((0, _immutable.fromJS)(options)); } else { onChange(optionToString(selectedOption)); } }); } componentDidMount() { const { field, onChange, value } = this.props; if (field.get('required') && field.get('multiple')) { if (value && !_immutable.List.isList(value)) { onChange((0, _immutable.fromJS)([value])); } else if (!value) { onChange((0, _immutable.fromJS)([])); } } } render() { const { field, value, forID, classNameWrapper, setActiveStyle, setInactiveStyle } = this.props; const fieldOptions = field.get('options'); const isMultiple = field.get('multiple', false); const isClearable = !field.get('required', true) || isMultiple; const options = [...fieldOptions.map(convertToOption)]; const selectedValue = getSelectedValue({ options, value, isMultiple }); return (0, _core.jsx)(_reactSelect.default, { inputId: forID, value: selectedValue, onChange: this.handleChange, className: classNameWrapper, onFocus: setActiveStyle, onBlur: setInactiveStyle, options: options, styles: _netlifyCmsUiDefault.reactSelectStyles, isMulti: isMultiple, isClearable: isClearable, placeholder: "" }); } } exports.default = SelectControl; _defineProperty(SelectControl, "propTypes", { onChange: _propTypes.default.func.isRequired, value: _propTypes.default.node, forID: _propTypes.default.string.isRequired, classNameWrapper: _propTypes.default.string.isRequired, setActiveStyle: _propTypes.default.func.isRequired, setInactiveStyle: _propTypes.default.func.isRequired, field: _reactImmutableProptypes.default.contains({ options: _reactImmutableProptypes.default.listOf(_propTypes.default.oneOfType([_propTypes.default.string, _reactImmutableProptypes.default.contains({ label: _propTypes.default.string.isRequired, value: _propTypes.default.string.isRequired })])).isRequired }) });