Home Reference Source

src/components/controls/InputNumber/InputNumberInterval.jsx

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

import InputNumber from './InputNumber';

/**
 * Компонент - инпут для ввода интевала чисел с возможностью увеличения/уменьшения значения на шаг; состоит из 2 {@link InputNumber}
 * @reactProps {array} value - массив начальных значений
 * @reactProps {boolean} visible - отображается или нет
 * @reactProps {boolean} disabled - задизейблен инпут или нет
 * @reactProps {string} step - шаг, на который увеличивается / уменьшается значение
 * @reactProps {number} min - минимальное возможное значение
 * @reactProps {number} max - максимальное возможное значение
 * @reactProps {string} name - имя поля
 * @reactProps {number} showButtons - отображать кнопки для увеличения/уменьшения значения / не отображать
 * @reactProps {number} onChange - выполняется при изменении значения поля
 * @example
 * <InputNumberInterval onChange={this.onChange}
 *             value={1}
 *             step='0.1'
 *             name='InputNumberIntervalExample' />
 */

class InputNumberInterval extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      value: props.value,
    };
  }

  onChange(index, value) {
    this.setState(
      { value: this.state.value.map((val, i) => (i === index ? value : val)) },
      () => this.props.onChange(this.state.value)
    );
  }

  /**
   * Базовый рендер
   */
  render() {
    const { description } = this.props;
    const { value } = this.state;
    const props = { ...this.props };
    delete props.value;
    delete props.description;
    delete props.onChange;
    const style = {
      display: 'flex',
      alignItems: 'baseline',
    };
    return (
      <div>
        <div style={style}>
          <InputNumber
            value={value[0]}
            onChange={this.onChange.bind(this, 0)}
            {...props}
          />
          {'-'}
          <InputNumber
            onChange={this.onChange.bind(this, 1)}
            value={value[1]}
            {...props}
          />
        </div>
        {description && (
          <p className="n2o-number-interval-description">{description}</p>
        )}
      </div>
    );
  }
}

InputNumberInterval.defaultProps = {
  value: [1, 1],
  disabled: false,
  visible: true,
  step: '0.1',
  showButtons: true,
  description: '',
  onChange: val => {},
};

InputNumberInterval.propTypes = {
  value: PropTypes.array,
  visible: PropTypes.bool,
  disabled: PropTypes.bool,
  step: PropTypes.string,
  min: PropTypes.number,
  max: PropTypes.number,
  name: PropTypes.string,
  showButtons: PropTypes.bool,
  onChange: PropTypes.func,
};

export default InputNumberInterval;