rsuite
Version:
A suite of react components
91 lines (76 loc) • 2.47 kB
JavaScript
// @flow
import * as React from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames';
import _ from 'lodash';
import { getUnhandledProps, prefix, defaultProps } from '../utils';
import { isSameDay, addDays, getDate, format } from 'date-fns';
type Props = {
weekendDate?: Date,
selected?: Date,
onSelect?: (date: Date) => void,
disabledDate?: (date: Date) => boolean,
inSameMonth?: (date: Date) => boolean,
className?: string,
classPrefix?: string
};
class TableRow extends React.PureComponent<Props> {
static contextTypes = {
locale: PropTypes.object
};
static defaultProps = {
selected: new Date(),
weekendDate: new Date()
};
addPrefix = (name: string) => prefix(this.props.classPrefix)(name);
handleSelect = (date: Date, disabled: boolean | void) => {
const { onSelect } = this.props;
if (disabled) {
return;
}
onSelect && onSelect(date);
};
renderDays() {
const { weekendDate, disabledDate, inSameMonth, selected } = this.props;
let days = [];
for (let i = 0; i < 7; i += 1) {
let thisDate = addDays(weekendDate, i);
let disabled = disabledDate && disabledDate(thisDate);
let isToday = isSameDay(thisDate, new Date());
let classes = classNames(this.addPrefix('cell'), {
[this.addPrefix('cell-un-same-month')]: !(inSameMonth && inSameMonth(thisDate)),
[this.addPrefix('cell-is-today')]: isToday,
[this.addPrefix('cell-selected')]: isSameDay(thisDate, selected),
[this.addPrefix('cell-disabled')]: disabled
});
let title = format(thisDate, 'YYYY-MM-DD');
days.push(
<div
className={classes}
role="menu"
tabIndex="-1"
title={isToday ? `${title} (${_.get(this.context, 'locale.today')})` : title}
onClick={this.handleSelect.bind(this, thisDate, disabled)}
key={i}
>
<span className={this.addPrefix('cell-content')}>{getDate(thisDate)}</span>
</div>
);
}
return days;
}
render() {
const { className, ...rest } = this.props;
const classes = classNames(this.addPrefix('row'), className);
const unhandled = getUnhandledProps(TableRow, rest);
return (
<div {...unhandled} className={classes}>
{this.renderDays()}
</div>
);
}
}
const enhance = defaultProps({
classPrefix: 'calendar-table'
});
export default enhance(TableRow);