@seafile/seafile-calendar
Version:
React Calendar
309 lines (261 loc) • 10.4 kB
JavaScript
'use strict';
exports.__esModule = true;
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _classnames = require('classnames');
var _classnames2 = _interopRequireDefault(_classnames);
var _DateConstants = require('./DateConstants');
var _DateConstants2 = _interopRequireDefault(_DateConstants);
var _util = require('../util/');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var DATE_ROW_COLUMN_COUNT = _DateConstants2['default'].DATE_ROW_COLUMN_COUNT,
DAY_NAME_TO_INDEX = _DateConstants2['default'].DAY_NAME_TO_INDEX;
function isSameDay(one, two) {
return one && two && one.isSame(two, 'day');
}
function beforeCurrentMonthYear(current, today) {
if (current.year() < today.year()) {
return 1;
}
return current.year() === today.year() && current.month() < today.month();
}
function afterCurrentMonthYear(current, today) {
if (current.year() > today.year()) {
return 1;
}
return current.year() === today.year() && current.month() > today.month();
}
function getIdFromDate(date) {
return 'rc-calendar-' + date.year() + '-' + date.month() + '-' + date.date();
}
var DateTBody = function (_React$Component) {
(0, _inherits3['default'])(DateTBody, _React$Component);
function DateTBody() {
(0, _classCallCheck3['default'])(this, DateTBody);
return (0, _possibleConstructorReturn3['default'])(this, _React$Component.apply(this, arguments));
}
DateTBody.prototype.render = function render() {
var props = this.props;
var contentRender = props.contentRender,
prefixCls = props.prefixCls,
selectedValue = props.selectedValue,
value = props.value,
showWeekNumber = props.showWeekNumber,
dateRender = props.dateRender,
disabledDate = props.disabledDate,
hoverValue = props.hoverValue,
firstDayOfWeek = props.firstDayOfWeek,
currentStatus = props.currentStatus;
var iIndex = void 0;
var jIndex = void 0;
var current = void 0;
var dateTable = [];
var today = (0, _util.getTodayTime)(value);
var cellClass = prefixCls + '-cell';
var weekNumberCellClass = prefixCls + '-week-number-cell';
var dateClass = prefixCls + '-date';
var todayClass = prefixCls + '-today';
var selectedClass = prefixCls + '-selected-day';
var selectedDateClass = prefixCls + '-selected-date'; // do not move with mouse operation
var selectedStartDateClass = prefixCls + '-selected-start-date';
var selectedEndDateClass = prefixCls + '-selected-end-date';
var inRangeClass = prefixCls + '-in-range-cell';
var lastMonthDayClass = prefixCls + '-last-month-cell';
var nextMonthDayClass = prefixCls + '-next-month-btn-day';
var disabledClass = prefixCls + '-disabled-cell';
var firstDisableClass = prefixCls + '-disabled-cell-first-of-row';
var lastDisableClass = prefixCls + '-disabled-cell-last-of-row';
var lastDayOfMonthClass = prefixCls + '-last-day-of-month';
var month1 = value.clone();
month1 = month1.date(1);
var day = month1.day();
var firstDayName = typeof firstDayOfWeek === 'string' ? firstDayOfWeek[0].toUpperCase() + firstDayOfWeek.slice(1) : 'Sunday';
var firstDayIndex = DAY_NAME_TO_INDEX[firstDayName] ? DAY_NAME_TO_INDEX[firstDayName] : 0;
var lastMonthDiffDay = (day + 7 - firstDayIndex) % 7;
// calculate last month
var lastMonth1 = month1.clone();
lastMonth1 = lastMonth1.add(0 - lastMonthDiffDay, 'days');
var passed = 0;
for (iIndex = 0; iIndex < DATE_ROW_COLUMN_COUNT.DATE_ROW_COUNT; iIndex++) {
for (jIndex = 0; jIndex < DATE_ROW_COLUMN_COUNT.DATE_COL_COUNT; jIndex++) {
current = lastMonth1;
if (passed) {
current = current.clone();
current = current.add(passed, 'days');
}
dateTable.push(current);
passed++;
}
}
var tableHtml = [];
passed = 0;
for (iIndex = 0; iIndex < DATE_ROW_COLUMN_COUNT.DATE_ROW_COUNT; iIndex++) {
var _cx;
var isCurrentWeek = void 0;
var weekNumberCell = void 0;
var isActiveWeek = false;
var dateCells = [];
if (showWeekNumber) {
weekNumberCell = _react2['default'].createElement(
'td',
{
key: dateTable[passed].week(),
role: 'gridcell',
className: weekNumberCellClass
},
dateTable[passed].week()
);
}
for (jIndex = 0; jIndex < DATE_ROW_COLUMN_COUNT.DATE_COL_COUNT; jIndex++) {
var next = null;
var last = null;
current = (0, _util.syncCurrentTime)(dateTable[passed], currentStatus);
if (jIndex < DATE_ROW_COLUMN_COUNT.DATE_COL_COUNT - 1) {
next = dateTable[passed + 1];
}
if (jIndex > 0) {
last = dateTable[passed - 1];
}
var cls = cellClass;
var disabled = false;
var selected = false;
if (isSameDay(current, today)) {
cls += ' ' + todayClass;
isCurrentWeek = true;
}
var isBeforeCurrentMonthYear = beforeCurrentMonthYear(current, value);
var isAfterCurrentMonthYear = afterCurrentMonthYear(current, value);
if (selectedValue && Array.isArray(selectedValue)) {
var rangeValue = hoverValue.length ? hoverValue : selectedValue;
if (!isBeforeCurrentMonthYear && !isAfterCurrentMonthYear) {
var startValue = rangeValue[0];
var endValue = rangeValue[1];
if (startValue) {
if (isSameDay(current, startValue)) {
selected = true;
isActiveWeek = true;
cls += ' ' + selectedStartDateClass;
}
}
if (startValue || endValue) {
if (isSameDay(current, endValue)) {
selected = true;
isActiveWeek = true;
cls += ' ' + selectedEndDateClass;
} else if ((startValue === null || startValue === undefined) && current.isBefore(endValue, 'day')) {
cls += ' ' + inRangeClass;
} else if ((endValue === null || endValue === undefined) && current.isAfter(startValue, 'day')) {
cls += ' ' + inRangeClass;
} else if (current.isAfter(startValue, 'day') && current.isBefore(endValue, 'day')) {
cls += ' ' + inRangeClass;
}
}
}
} else if (isSameDay(current, value)) {
// keyboard change value, highlight works
selected = true;
isActiveWeek = true;
}
if (isSameDay(current, selectedValue)) {
cls += ' ' + selectedDateClass;
}
if (isBeforeCurrentMonthYear) {
cls += ' ' + lastMonthDayClass;
}
if (isAfterCurrentMonthYear) {
cls += ' ' + nextMonthDayClass;
}
if (current.clone().endOf('month').date() === current.date()) {
cls += ' ' + lastDayOfMonthClass;
}
if (disabledDate) {
if (disabledDate(current, value)) {
disabled = true;
if (!last || !disabledDate(last, value)) {
cls += ' ' + firstDisableClass;
}
if (!next || !disabledDate(next, value)) {
cls += ' ' + lastDisableClass;
}
}
}
if (selected) {
cls += ' ' + selectedClass;
}
if (disabled) {
cls += ' ' + disabledClass;
}
var dateHtml = void 0;
if (dateRender) {
dateHtml = dateRender(current, value);
} else {
var content = contentRender ? contentRender(current, value) : current.date();
dateHtml = _react2['default'].createElement(
'div',
{
key: getIdFromDate(current),
className: dateClass,
'aria-selected': selected,
'aria-disabled': disabled
},
content
);
}
dateCells.push(_react2['default'].createElement(
'td',
{
key: passed,
onClick: disabled ? undefined : props.onSelect.bind(null, current),
onMouseEnter: disabled ? undefined : props.onDayHover && props.onDayHover.bind(null, current) || undefined,
role: 'gridcell',
title: (0, _util.getTitleString)(current),
className: cls
},
dateHtml
));
passed++;
}
tableHtml.push(_react2['default'].createElement(
'tr',
{
key: iIndex,
role: 'row',
className: (0, _classnames2['default'])((_cx = {}, _cx[prefixCls + '-current-week'] = isCurrentWeek, _cx[prefixCls + '-active-week'] = isActiveWeek, _cx))
},
weekNumberCell,
dateCells
));
}
return _react2['default'].createElement(
'tbody',
{ className: prefixCls + '-tbody' },
tableHtml
);
};
return DateTBody;
}(_react2['default'].Component);
DateTBody.propTypes = {
contentRender: _propTypes2['default'].func,
dateRender: _propTypes2['default'].func,
disabledDate: _propTypes2['default'].func,
prefixCls: _propTypes2['default'].string,
selectedValue: _propTypes2['default'].oneOfType([_propTypes2['default'].object, _propTypes2['default'].arrayOf(_propTypes2['default'].object)]),
value: _propTypes2['default'].object,
hoverValue: _propTypes2['default'].any,
showWeekNumber: _propTypes2['default'].bool,
firstDayOfWeek: _propTypes2['default'].string,
currentStatus: _propTypes2['default'].string
};
DateTBody.defaultProps = {
hoverValue: []
};
exports['default'] = DateTBody;
module.exports = exports['default'];