Home Reference Source

src/components/controls/Select/SelectWrapper.jsx

import React from 'react';
import PropTypes from 'prop-types';

import withFetchData from '../withFetchData.js';
import Select from './Select';
import Option from './Option';
import Spinner from '../../snippets/Spinner/InlineSpinner';

/**
 * Wrapper для селекта
 * @reactProps {array} data - данные для чекбоксов
 * @reactProps {string} valueFieldId - ключ для value в data
 * @reactProps {string} labelFieldId - ключ для label в дата
 * @reactProps {string|number} value - выбранное значение
 * @reactProps {function} onChange - вызывается при изменении значения
 * @reactProps {boolean} disabled - флаг неактивности
 * @reactProps {boolean} visible - флаг видимости
 * @reactProps {boolean} autoFocus - автофокус элемента
 * @reactProps {boolean} required - обязательность поля
 * @reactProps {string} heightSize - размер элемента
 * @reactProps {function} fetchData - функция для получения данных
 * @reactProps {string} queryId - queryId
 * @reactProps {number} size - размер
 * @reactProps {string} type - тип чекбокса
 */

class SelectWrapper extends React.Component {
  // componentDidMount() {
  //   this.props.fetchData({
  //     queryId: this.props.queryId,
  //     size: this.props.size,
  //     [`sorting.${this.props.labelFieldId}`]: 'ASC'
  //   });
  // }

  /**
   * Рендер
   */

  render() {
    const { data, valueFieldId, labelFieldId, isLoading } = this.props;

    return (
      <React.Fragment>
        {!isLoading && (
          <Select {...this.props}>
            {data.map(option => (
              <Option
                key={option.id}
                value={option[valueFieldId]}
                label={option[labelFieldId]}
              />
            ))}
          </Select>
        )}
        {isLoading && <Spinner />}
      </React.Fragment>
    );
  }
}

SelectWrapper.propTypes = {
  data: PropTypes.array,
  valueFieldId: PropTypes.string,
  labelFieldId: PropTypes.string,
  onChange: PropTypes.func,
  required: PropTypes.bool,
  autoFocus: PropTypes.bool,
  disabled: PropTypes.bool,
  visible: PropTypes.bool,
  heightSize: PropTypes.oneOf(['input-sm', 'input-lg', '']),
  value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
  fetchData: PropTypes.func,
  queryId: PropTypes.string.isRequired,
  size: PropTypes.number.isRequired,
  isLoading: PropTypes.bool,
};

SelectWrapper.defaultProps = {
  value: '',
  visible: true,
  isLoading: false,
};

export default withFetchData(SelectWrapper);