rmc-date-picker
Version:
React Mobile DatePicker Component for web and react-native
315 lines (303 loc) • 10.2 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
var _moment = require('moment');
var _moment2 = _interopRequireDefault(_moment);
var _en_US = require('./locale/en_US');
var _en_US2 = _interopRequireDefault(_en_US);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function getDaysInMonth(now, selYear, selMonth) {
return now.clone().year(selYear).month(selMonth).endOf('month').date();
}
function pad(n) {
return n < 10 ? '0' + n : n;
}
var DATETIME = 'datetime';
var DATE = 'date';
var TIME = 'time';
exports["default"] = {
getDefaultProps: function getDefaultProps() {
return {
locale: _en_US2["default"],
mode: DATE,
onDateChange: function onDateChange() {}
};
},
getInitialState: function getInitialState() {
return {
date: this.props.date || this.props.defaultDate
};
},
componentWillReceiveProps: function componentWillReceiveProps(nextProps) {
if ('date' in nextProps) {
this.setState({
date: nextProps.date || nextProps.defaultDate
});
}
},
onValueChange: function onValueChange(index, value) {
var props = this.props;
var newValue = this.getDate().clone();
if (props.mode === DATETIME || props.mode === DATE) {
switch (index) {
case 0:
newValue.year(value);
break;
case 1:
newValue.month(value);
break;
case 2:
newValue.date(value);
break;
case 3:
newValue.hour(value);
break;
case 4:
newValue.minute(value);
break;
default:
break;
}
} else {
switch (index) {
case 0:
newValue.hour(value);
break;
case 1:
newValue.minute(value);
break;
default:
break;
}
}
newValue = this.clipDate(newValue);
if (!('date' in this.props)) {
this.setState({
date: newValue
});
}
props.onDateChange(newValue);
},
getDefaultMinDate: function getDefaultMinDate() {
if (!this.defaultMinDate) {
this.defaultMinDate = this.getGregorianCalendar([2000, 1, 1, 0, 0, 0]);
}
return this.defaultMinDate;
},
getDefaultMaxDate: function getDefaultMaxDate() {
if (!this.defaultMaxDate) {
this.defaultMaxDate = this.getGregorianCalendar([2030, 1, 1, 23, 59, 59]);
}
return this.defaultMaxDate;
},
getDate: function getDate() {
return this.state.date || this.getDefaultMinDate();
},
getMinYear: function getMinYear() {
return this.getMinDate().year();
},
getMaxYear: function getMaxYear() {
return this.getMaxDate().year();
},
getMinMonth: function getMinMonth() {
return this.getMinDate().month();
},
getMaxMonth: function getMaxMonth() {
return this.getMaxDate().month();
},
getMinDay: function getMinDay() {
return this.getMinDate().date();
},
getMaxDay: function getMaxDay() {
return this.getMaxDate().date();
},
getMinHour: function getMinHour() {
return this.getMinDate().hour();
},
getMaxHour: function getMaxHour() {
return this.getMaxDate().hour();
},
getMinMinute: function getMinMinute() {
return this.getMinDate().minute();
},
getMaxMinute: function getMaxMinute() {
return this.getMaxDate().minute();
},
getMinDate: function getMinDate() {
return this.props.minDate || this.getDefaultMinDate();
},
getMaxDate: function getMaxDate() {
return this.props.maxDate || this.getDefaultMaxDate();
},
getDateData: function getDateData() {
var locale = this.props.locale;
var date = this.getDate();
var selYear = date.year();
var selMonth = date.month();
var minDateYear = this.getMinYear();
var maxDateYear = this.getMaxYear();
var minDateMonth = this.getMinMonth();
var maxDateMonth = this.getMaxMonth();
var minDateDay = this.getMinDay();
var maxDateDay = this.getMaxDay();
var years = [];
for (var i = minDateYear; i <= maxDateYear; i++) {
years.push({
value: i,
label: i + locale.year
});
}
var months = [];
var minMonth = 0;
var maxMonth = 11;
if (minDateYear === selYear) {
minMonth = minDateMonth;
}
if (maxDateYear === selYear) {
maxMonth = maxDateMonth;
}
for (var _i = minMonth; _i <= maxMonth; _i++) {
months.push({
value: _i,
label: _i + 1 + locale.month
});
}
var days = [];
var minDay = 1;
var maxDay = getDaysInMonth(date, selYear, selMonth);
if (minDateYear === selYear && minDateMonth === selMonth) {
minDay = minDateDay;
}
if (maxDateYear === selYear && maxDateMonth === selMonth) {
maxDay = maxDateDay;
}
for (var _i2 = minDay; _i2 <= maxDay; _i2++) {
days.push({
value: _i2,
label: _i2 + locale.day
});
}
return [years, months, days];
},
getTimeData: function getTimeData() {
var minHour = 0;
var maxHour = 23;
var minMinute = 0;
var maxMinute = 59;
var _props = this.props,
mode = _props.mode,
locale = _props.locale;
var date = this.getDate();
var minDateMinute = this.getMinMinute();
var maxDateMinute = this.getMaxMinute();
var minDateHour = this.getMinHour();
var maxDateHour = this.getMaxHour();
var hour = date.hour();
if (mode === DATETIME) {
var year = date.year();
var month = date.month();
var day = date.date();
var minDateYear = this.getMinYear();
var maxDateYear = this.getMaxYear();
var minDateMonth = this.getMinMonth();
var maxDateMonth = this.getMaxMonth();
var minDateDay = this.getMinDay();
var maxDateDay = this.getMaxDay();
if (minDateYear === year && minDateMonth === month && minDateDay === day) {
minHour = minDateHour;
if (minDateHour === hour) {
minMinute = minDateMinute;
}
}
if (maxDateYear === year && maxDateMonth === month && maxDateDay === day) {
maxHour = maxDateHour;
if (maxDateHour === hour) {
maxMinute = maxDateMinute;
}
}
} else {
minHour = minDateHour;
if (minDateHour === hour) {
minMinute = minDateMinute;
}
maxHour = maxDateHour;
if (maxDateHour === hour) {
maxMinute = maxDateMinute;
}
}
var hours = [];
for (var i = minHour; i <= maxHour; i++) {
hours.push({
value: i,
label: locale.hour ? i + locale.hour : pad(i)
});
}
var minutes = [];
for (var _i3 = minMinute; _i3 <= maxMinute; _i3++) {
minutes.push({
value: _i3,
label: locale.minute ? _i3 + locale.minute : pad(_i3)
});
}
return [hours, minutes];
},
getGregorianCalendar: function getGregorianCalendar(arg) {
return (0, _moment2["default"])(arg);
},
clipDate: function clipDate(date) {
var mode = this.props.mode;
var minDate = this.getMinDate();
var maxDate = this.getMaxDate();
if (mode === DATETIME) {
if (date.isBefore(minDate)) {
return minDate.clone();
}
if (date.isAfter(maxDate)) {
return maxDate.clone();
}
} else if (mode === DATE) {
if (date.isBefore(minDate, 'day')) {
return minDate.clone();
}
if (date.isAfter(maxDate, 'day')) {
return maxDate.clone();
}
} else {
var maxHour = maxDate.hour();
var maxMinutes = maxDate.minute();
var minHour = minDate.hour();
var minMinutes = minDate.minute();
var hour = date.hour();
var minutes = date.minute();
if (hour < minHour || hour === minHour && minutes < minMinutes) {
return minDate.clone();
}
if (hour > maxHour || hour === maxHour && minutes > maxMinutes) {
return maxDate.clone();
}
}
return date;
},
getValueDataSource: function getValueDataSource() {
var mode = this.props.mode;
var date = this.getDate();
var dataSource = [];
var value = [];
if (mode === DATETIME || mode === DATE) {
dataSource = [].concat((0, _toConsumableArray3["default"])(this.getDateData()));
value = [date.year(), date.month(), date.date()];
}
if (mode === DATETIME || mode === TIME) {
dataSource = dataSource.concat(this.getTimeData());
value = value.concat([date.hour(), date.minute()]);
}
return {
value: value,
dataSource: dataSource
};
}
};
module.exports = exports['default'];