UNPKG

axiom-react-calendar

Version:

A component for picking dates or date periods for your React application.

98 lines (85 loc) 2.65 kB
import React, { PureComponent } from 'react'; import PropTypes from 'prop-types'; import TileGroup from '../TileGroup'; import Day from './Day'; import { getDayOfWeek, getDaysInMonth, getMonthIndex, getYear, } from '../shared/dates'; import { isCalendarType, tileGroupProps } from '../shared/propTypes'; export default class Days extends PureComponent { get offset() { if (this.props.showNeighboringMonth) { return 0; } const { activeStartDate, calendarType } = this.props; return getDayOfWeek(activeStartDate, calendarType); } /** * Defines on which day of the month the grid shall start. If we simply show current * month, we obviously start on day one, but if showNeighboringMonth is set to * true, we need to find the beginning of the week the first day of the month is in. */ get start() { if (this.props.showNeighboringMonth) { const { activeStartDate, calendarType } = this.props; return -getDayOfWeek(activeStartDate, calendarType) + 1; } return 1; } /** * Defines on which day of the month the grid shall end. If we simply show current * month, we need to stop on the last day of the month, but if showNeighboringMonth * is set to true, we need to find the end of the week the last day of the month is in. */ get end() { const { activeStartDate } = this.props; const daysInMonth = getDaysInMonth(activeStartDate); if (this.props.showNeighboringMonth) { const { year, monthIndex } = this; const { calendarType } = this.props; const activeEndDate = new Date(year, monthIndex, daysInMonth); return daysInMonth + (7 - getDayOfWeek(activeEndDate, calendarType) - 1); } return daysInMonth; } get year() { const { activeStartDate } = this.props; return getYear(activeStartDate); } get monthIndex() { const { activeStartDate } = this.props; return getMonthIndex(activeStartDate); } render() { const { monthIndex } = this; const { activeStartDate, calendarType, showNeighboringMonth, ...otherProps } = this.props; return ( <TileGroup {...otherProps} className="react-calendar__month-view__days" count={7} dateTransform={day => new Date(this.year, monthIndex, day)} dateType="day" end={this.end} offset={this.offset} start={this.start} tile={Day} // Tile props currentMonthIndex={monthIndex} /> ); } } Days.propTypes = { calendarType: isCalendarType.isRequired, showNeighboringMonth: PropTypes.bool, ...tileGroupProps, };