'use strict';
|
|
var React = require('react'),
|
createClass = require('create-react-class'),
|
moment = require('moment'),
|
onClickOutside = require('react-onclickoutside').default
|
;
|
|
var DateTimePickerDays = onClickOutside( createClass({
|
render: function() {
|
var footer = this.renderFooter(),
|
date = this.props.viewDate,
|
locale = date.localeData(),
|
tableChildren
|
;
|
|
tableChildren = [
|
React.createElement('thead', { key: 'th' }, [
|
React.createElement('tr', { key: 'h' }, [
|
React.createElement('th', { key: 'p', className: 'rdtPrev', onClick: this.props.subtractTime( 1, 'months' )}, React.createElement('span', {}, '‹' )),
|
React.createElement('th', { key: 's', className: 'rdtSwitch', onClick: this.props.showView( 'months' ), colspan: 5, 'data-value': this.props.viewDate.month() }, locale.months( date ) + ' ' + date.year() ),
|
React.createElement('th', { key: 'n', className: 'rdtNext', onClick: this.props.addTime( 1, 'months' )}, React.createElement('span', {}, '›' ))
|
]),
|
React.createElement('tr', { key: 'd'}, this.getDaysOfWeek( locale ).map( function( day, index ) { return React.createElement('th', { key: day + index, className: 'dow'}, day ); }) )
|
]),
|
React.createElement('tbody', { key: 'tb' }, this.renderDays())
|
];
|
|
if ( footer )
|
tableChildren.push( footer );
|
|
return React.createElement('div', { className: 'rdtDays' },
|
React.createElement('table', {}, tableChildren )
|
);
|
},
|
|
/**
|
* Get a list of the days of the week
|
* depending on the current locale
|
* @return {array} A list with the shortname of the days
|
*/
|
getDaysOfWeek: function( locale ) {
|
var days = locale._weekdaysMin,
|
first = locale.firstDayOfWeek(),
|
dow = [],
|
i = 0
|
;
|
|
days.forEach( function( day ) {
|
dow[ (7 + ( i++ ) - first) % 7 ] = day;
|
});
|
|
return dow;
|
},
|
|
renderDays: function() {
|
var date = this.props.viewDate,
|
selected = this.props.selectedDate && this.props.selectedDate.clone(),
|
prevMonth = date.clone().subtract( 1, 'months' ),
|
currentYear = date.year(),
|
currentMonth = date.month(),
|
weeks = [],
|
days = [],
|
renderer = this.props.renderDay || this.renderDay,
|
isValid = this.props.isValidDate || this.alwaysValidDate,
|
classes, isDisabled, dayProps, currentDate
|
;
|
|
// Go to the last week of the previous month
|
prevMonth.date( prevMonth.daysInMonth() ).startOf( 'week' );
|
var lastDay = prevMonth.clone().add( 42, 'd' );
|
|
while ( prevMonth.isBefore( lastDay ) ) {
|
classes = 'rdtDay';
|
currentDate = prevMonth.clone();
|
|
if ( ( prevMonth.year() === currentYear && prevMonth.month() < currentMonth ) || ( prevMonth.year() < currentYear ) )
|
classes += ' rdtOld';
|
else if ( ( prevMonth.year() === currentYear && prevMonth.month() > currentMonth ) || ( prevMonth.year() > currentYear ) )
|
classes += ' rdtNew';
|
|
if ( selected && prevMonth.isSame( selected, 'day' ) )
|
classes += ' rdtActive';
|
|
if ( prevMonth.isSame( moment(), 'day' ) )
|
classes += ' rdtToday';
|
|
isDisabled = !isValid( currentDate, selected );
|
if ( isDisabled )
|
classes += ' rdtDisabled';
|
|
dayProps = {
|
key: prevMonth.format( 'M_D' ),
|
'data-value': prevMonth.date(),
|
className: classes
|
};
|
|
if ( !isDisabled )
|
dayProps.onClick = this.updateSelectedDate;
|
|
days.push( renderer( dayProps, currentDate, selected ) );
|
|
if ( days.length === 7 ) {
|
weeks.push( React.createElement('tr', { key: prevMonth.format( 'M_D' )}, days ) );
|
days = [];
|
}
|
|
prevMonth.add( 1, 'd' );
|
}
|
|
return weeks;
|
},
|
|
updateSelectedDate: function( event ) {
|
this.props.updateSelectedDate( event, true );
|
},
|
|
renderDay: function( props, currentDate ) {
|
return React.createElement('td', props, currentDate.date() );
|
},
|
|
renderFooter: function() {
|
if ( !this.props.timeFormat )
|
return '';
|
|
var date = this.props.selectedDate || this.props.viewDate;
|
|
return React.createElement('tfoot', { key: 'tf'},
|
React.createElement('tr', {},
|
React.createElement('td', { onClick: this.props.showView( 'time' ), colspan: 7, className: 'rdtTimeToggle' }, date.format( this.props.timeFormat ))
|
)
|
);
|
},
|
|
alwaysValidDate: function() {
|
return 1;
|
},
|
|
handleClickOutside: function() {
|
this.props.handleClickOutside();
|
}
|
}));
|
|
module.exports = DateTimePickerDays;
|