Home Reference Source

src/components/controls/RadioGroup/RadioGroupControl.jsx

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

import RadioGroup from './RadioGroup';
import withFetchData from '../withFetchData.js';
import Radio from '../Radio/Radio';
import RadioN2O from '../Radio/RadioN2O';
import RadioButton from '../Radio/RadioButton';
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} inline - флаг вывода в ряд
 * @reactProps {object} style - стили группы
 * @reactProps {string} className - класс группы
 * @reactProps {function} fetchData - функция для получения данных
 * @reactProps {string} queryId - queryId
 * @reactProps {number} size - размер
 * @reactProps {string} type - тип чекбокса
 */

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

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

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

    const radioTypes = {
      default: Radio,
      n2o: RadioN2O,
      btn: RadioButton,
    };

    const RadioElement = radioTypes[type];

    return (
      <React.Fragment>
        {!isLoading && (
          <RadioGroup {...this.props}>
            {data &&
              data.map(radio => (
                <RadioElement
                  key={radio.id}
                  value={radio}
                  label={radio[labelFieldId]}
                  disabled={radio.disabled}
                  checked={radio.checked}
                />
              ))}
          </RadioGroup>
        )}
        {isLoading && <Spinner />}
      </React.Fragment>
    );
  }
}

RadioGroupControl.propTypes = {
  data: PropTypes.array,
  valueFieldId: PropTypes.string,
  labelFieldId: PropTypes.string,
  value: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),
  inline: PropTypes.bool,
  onChange: PropTypes.func,
  disabled: PropTypes.bool,
  visible: PropTypes.bool,
  style: PropTypes.object,
  className: PropTypes.string,
  fetchData: PropTypes.func,
  size: PropTypes.number.isRequired,
  type: PropTypes.oneOf(['default', 'n2o', 'btn']),
  isLoading: PropTypes.bool,
};

RadioGroupControl.defaultProps = {
  valueFieldId: 'id',
  labelFieldId: 'name',
  value: {},
  visible: true,
  type: 'default',
  onChange: () => {},
  isLoading: false,
};

export default withFetchData(RadioGroupControl);