axiom-react-calendar
Version:
A component for picking dates or date periods for your React application.
108 lines (90 loc) • 2.5 kB
JSX
import React, { PureComponent } from 'react';
import PropTypes from 'prop-types';
import Days from './MonthView/Days';
import Weekdays from './MonthView/Weekdays';
import WeekNumbers from './MonthView/WeekNumbers';
import { getLocale } from './shared/locales';
import { isCalendarType, isMaxDate, isMinDate, isValue } from './shared/propTypes';
export default class MonthView extends PureComponent {
get calendarType() {
const { calendarType } = this.props;
if (calendarType) {
return calendarType;
}
switch (getLocale()) {
case 'en-US':
return 'US';
default:
return 'ISO 8601';
}
}
renderWeekdays() {
const { calendarType } = this;
const { activeStartDate, formatShortWeekday } = this.props;
return (
<Weekdays
calendarType={calendarType}
month={activeStartDate}
formatShortWeekday={formatShortWeekday}
/>
);
}
renderWeekNumbers() {
const { showWeekNumbers } = this.props;
if (!showWeekNumbers) {
return null;
}
const { calendarType } = this;
const { activeStartDate, onClickWeekNumber } = this.props;
return (
<WeekNumbers
activeStartDate={activeStartDate}
calendarType={calendarType}
onClickWeekNumber={onClickWeekNumber}
/>
);
}
renderDays() {
const { calendarType, showWeekNumbers, ...childProps } = this.props;
return (
<Days
calendarType={this.calendarType}
{...childProps}
/>
);
}
render() {
const { showWeekNumbers } = this.props;
const className = 'react-calendar__month-view';
return (
<div
className={[
className,
showWeekNumbers ? `${className}--weekNumbers` : '',
].join(' ')}
>
<div style={{ display: 'flex', alignItems: 'flex-end' }}>
{this.renderWeekNumbers()}
<div style={{ flexGrow: 1 }}>
{this.renderWeekdays()}
{this.renderDays()}
</div>
</div>
</div>
);
}
}
MonthView.propTypes = {
activeStartDate: PropTypes.instanceOf(Date).isRequired,
calendarType: isCalendarType,
formatShortWeekday: PropTypes.func,
maxDate: isMaxDate,
minDate: isMinDate,
onChange: PropTypes.func,
onClickWeekNumber: PropTypes.func,
setActiveRange: PropTypes.func,
showNeighboringMonth: PropTypes.bool,
showWeekNumbers: PropTypes.bool,
value: isValue,
valueType: PropTypes.string,
};