Home Reference Source

src/components/controls/CheckboxGroup/CheckboxGroupControl.jsx

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

import CheckboxGroup from './CheckboxGroup';
import Checkbox from '../Checkbox/Checkbox';
import withFetchData from '../withFetchData.js';
import CheckboxN2O from '../Checkbox/CheckboxN2O';
import CheckboxButton from '../Checkbox/CheckboxButton';
import Spinner from '../../snippets/Spinner/InlineSpinner';

/**
 * Wrapper для группы чекбоксов
 * @reactProps {array} data - данные для чекбоксов
 * @reactProps {string} valueFieldId - ключ для value в data
 * @reactProps {string} labelFieldId - ключ для label в дата
 * @reactProps {array} 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 - тип чекбокса
 * @reactProps {boolean} isLoading - флаг готовности
 */

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

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

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

    const checkboxTypes = {
      default: Checkbox,
      n2o: CheckboxN2O,
      btn: CheckboxButton,
    };

    const CheckboxElement = checkboxTypes[type];

    return (
      <React.Fragment>
        {!isLoading && (
          <CheckboxGroup {...this.props}>
            {data &&
              data.map(checkbox => (
                <CheckboxElement
                  key={checkbox[valueFieldId]}
                  value={checkbox}
                  label={checkbox[labelFieldId]}
                  disabled={checkbox.disabled}
                  checked={checkbox.checked}
                />
              ))}
          </CheckboxGroup>
        )}
        {isLoading && <Spinner />}
      </React.Fragment>
    );
  }
}

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

CheckboxGroupControl.defaultProps = {
  data: [],
  value: [],
  visible: true,
  type: 'default',
  onChange: () => {},
  onFocus: () => {},
  onBlur: () => {},
  isLoading: false,
  valueFieldId: 'id',
  labelFieldId: 'label',
  _fetchData: () => {},
};

export default withFetchData(CheckboxGroupControl);