Home Reference Source

src/components/controls/DatePicker/DateInterval.jsx

import React from 'react';
import PropTypes from 'prop-types';
import moment from 'moment';
import { defaults } from 'lodash';
import DateTimeControl from './DateTimeControl';

/**
 * Компонент для выбора временного интервала. Состоит 2 {@link DatePicker}
 * @reactProps {object} defaultTime
 * @reactProps {array} value - массив, объекты которого задают дефолтные значения, имя ('beginDate' или 'endDate') и дефолтное время каждому пикеру.
 * @reactProps {string|moment|Date} min - самая ранняя доступная дата
 * @reactProps {string|moment|Date} max - самая поздняя дотсупная дата
 * @reactProps {function} onChange - вызывается при изменении
 * @reactProps {string} dateFormat - формат даты. Пример: "DD-MM_YYYY"
 * @reactProps {string} timeFormat - формат времени. Пример: "HH:mm"
 * @reactProps {string} outputFormat - формат даты при сохранение. Пример: "DD-MM_YYYY HH~mm"
 * @reactProps {boolean} disabled - задизейблен пикер / нет
 * @reactProps {string} placeholder - плэйсхолдер для поля
 * @reactProps {string} locale - Локаль. Варианты: 'en', 'ru'
 * @reactProps {boolean} openOnFocus - открывать при фокусе
 * @example
 * <DatePicker  defaultTime = '12:11'/>
 */
function DateInterval({ value, defaultTime, defaultValue, onChange, ...rest }) {
  const newValue = defaults(value, defaultValue);

  const handleChange = data => {
    onChange({
      [DateTimeControl.beginInputName]: data[0],
      [DateTimeControl.endInputName]: data[1],
    });
  };

  const mappedValue = [
    {
      name: DateTimeControl.beginInputName,
      value: newValue[DateTimeControl.beginInputName],
      defaultTime: defaultTime || '00:00:00',
    },
    {
      name: DateTimeControl.endInputName,
      value: newValue[DateTimeControl.endInputName],
      defaultTime: defaultTime || '23:59:59',
    },
  ];

  return (
    <DateTimeControl
      {...rest}
      value={mappedValue}
      onChange={handleChange}
      type="date-interval"
    />
  );
}

DateInterval.defaultProps = {
  defaultTime: undefined,
  defaultValue: {
    [DateTimeControl.beginInputName]: null,
    [DateTimeControl.endInputName]: null,
  },
  onChange: () => {},
  onFocus: () => {},
  onBlur: () => {},
  dateFormat: 'DD/MM/YYYY',
  placeholder: '',
  disabled: false,
  dateDivider: ' ',
  className: '',
  locale: 'ru',
  openOnFocus: false,
};

DateInterval.propTypes = {
  onFocus: PropTypes.func,
  onBlur: PropTypes.func,
  defaultTime: PropTypes.object,
  value: PropTypes.oneOfType([
    PropTypes.instanceOf(moment),
    PropTypes.instanceOf(Date),
    PropTypes.string,
  ]),
  min: PropTypes.oneOfType([
    PropTypes.instanceOf(moment),
    PropTypes.instanceOf(Date),
    PropTypes.string,
  ]),
  max: PropTypes.oneOfType([
    PropTypes.instanceOf(moment),
    PropTypes.instanceOf(Date),
    PropTypes.string,
  ]),
  onChange: PropTypes.func,
  dateFormat: PropTypes.string,
  timeFormat: PropTypes.string,
  outputFormat: PropTypes.string,
  disabled: PropTypes.bool,
  placeholder: PropTypes.string,
  locale: PropTypes.oneOf(['en', 'ru']),
  openOnFocus: PropTypes.bool,
};

export default DateInterval;