Home Reference Source

src/components/controls/DatePicker/PopUp.jsx

import React from 'react';
import PropTypes from 'prop-types';
import moment from 'moment';
import onClickOutside from 'react-onclickoutside';
import Calendar from './Calendar';
import { parseDate } from './utils';
import DateTimeControl from './DateTimeControl';

/**
 * Компонент PopUp
 * @reactProps {moment} value
 * @reactProps {string} dateFormat
 * @reactProps {string} timeFormat
 * @reactProps {function} markTimeAtSet
 * @reactProps {function} inTimeSet
 * @reactProps {boolean} auto
 * @reactProps {function} select
 * @reactProps {function} setPlacement
 * @reactProps {function} setVisibility
 * @reactProps {string} placement
 * @reactProps {moment} max
 * @reactProps {moment} min
 * @reactProps {string} locale
 * @reactProps {object} time
 */
class PopUp extends React.PureComponent {
  handleClickOutside(e) {
    console.log(e);
  }

  render() {
    const {
      dateFormat,
      markTimeAsSet,
      timeFormat,
      value,
      max,
      min,
      locale,
      time,
      isTimeSet,
    } = this.props;

    let minDate = inputName => {
      if (
        value[DateTimeControl.beginInputName] &&
        inputName === DateTimeControl.endInputName
      ) {
        return parseDate(value[DateTimeControl.beginInputName], dateFormat);
      }
      return parseDate(min, dateFormat);
    };

    return (
      <div className="d-inline-flex justify-content-end">
        {Object.keys(value).map((input, i) => {
          const { hasDefaultTime, ...timeObj } = time[input];
          return (
            <Calendar
              key={i}
              time={timeObj}
              markTimeAsSet={markTimeAsSet}
              hasDefaultTime={hasDefaultTime || isTimeSet[input]}
              inputName={input}
              value={value[input]}
              timeFormat={timeFormat}
              select={this.props.select}
              setVisibility={this.setVisibility}
              max={parseDate(max, dateFormat)}
              min={minDate(input)}
              locale={locale}
            />
          );
        })}
      </div>
    );
  }
}

PopUp.propTypes = {
  value: PropTypes.instanceOf(moment),
  dateFormat: PropTypes.string,
  timeFormat: PropTypes.string,
  markTimeAsSet: PropTypes.func,
  inTimeSet: PropTypes.func,
  auto: PropTypes.bool,
  select: PropTypes.func,
  setPlacement: PropTypes.func,
  setVisibility: PropTypes.func,
  placement: PropTypes.string,
  max: PropTypes.instanceOf(moment),
  min: PropTypes.instanceOf(moment),
  locale: PropTypes.oneOf(['en', 'ru']),
  time: PropTypes.shape({
    mins: PropTypes.number,
    hours: PropTypes.number,
  }),
};

export default onClickOutside(PopUp);