481 lines
13 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* eslint-disable complexity, no-param-reassign */
/* eslint max-depth: [2, 7] */
var leapYear = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
var commonYear = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
var FIRST_MONTH = 0;
var LAST_MONTH = 11;
var DAYS_PER_ROW = 7;
var COLOR_MAP = {
1: '#f5a911',
2: '#e8541e',
3: '#07a89b',
4: '#108ee9',
5: 'rgba(51, 51, 51, 0.4)'
}; // 获取某月第某天是星期几
function getDay(month, year, index) {
return new Date(year, month, index).getDay();
} // 获取某月有几天
function getMonthLength(month, year) {
if (year % 400 === 0 || year % 100 !== 0 && year % 4 === 0) {
return leapYear[month];
} else {
return commonYear[month];
}
} // 数字补位 1 -> 01
function prefixNum(num) {
if (num < 10) {
return "0" + num;
} else {
return "" + num;
}
}
Component({
data: {
selectedYear: 0,
selectedMonth: 0,
currentDate: null,
dates: [],
blockType: 1 // 1.没有待办纯数字 2.有待办 用于区分不同类型日期块的样式。
},
props: {
className: '',
tagData: [],
type: 'single',
haveYear: false
},
didMount: function didMount() {
this.tapTimes = 1;
var date = new Date();
date.setHours(0);
date.setMinutes(0);
date.setSeconds(0);
date.setMilliseconds(0);
var year = date.getFullYear();
var month = date.getMonth();
this.setData({
selectedYear: year,
selectedMonth: month,
currentDate: date
});
this.refreshdates(month, year);
},
didUpdate: function didUpdate() {
var dates = this.data.dates;
var blockType = 1;
for (var i = 0; i < dates.length; i++) {
for (var j = 0; j < dates[i].length; j++) {
if (this.hasTag(dates[i][j])) {
blockType = 2;
}
}
}
this.setData({
dates: dates,
blockType: blockType
});
},
methods: {
onPrevYearTap: function onPrevYearTap() {
var _this$data = this.data,
selectedMonth = _this$data.selectedMonth,
selectedYear = _this$data.selectedYear;
var year = selectedYear;
var month = selectedMonth;
year = selectedYear - 1;
if (this.props.onYearChange) {
this.props.onYearChange(year, selectedYear);
}
this.setData({
selectedYear: year
});
this.refreshdates(month, year);
},
onNextYearTap: function onNextYearTap() {
var _this$data2 = this.data,
selectedMonth = _this$data2.selectedMonth,
selectedYear = _this$data2.selectedYear;
var year = selectedYear;
var month = selectedMonth;
year = selectedYear + 1;
if (this.props.onYearChange) {
this.props.onYearChange(year, selectedYear);
}
this.setData({
selectedYear: year
});
this.refreshdates(month, year);
},
onPrevMonthTap: function onPrevMonthTap() {
var _this$data3 = this.data,
selectedMonth = _this$data3.selectedMonth,
selectedYear = _this$data3.selectedYear;
var year = selectedYear;
var month = selectedMonth; // 如果当前选中是一月份前一月是去年的12月
if (selectedMonth === FIRST_MONTH) {
year = selectedYear - 1;
month = LAST_MONTH;
} else {
month = selectedMonth - 1;
}
if (this.props.onMonthChange) {
this.props.onMonthChange(month, selectedMonth);
}
this.setData({
selectedYear: year,
selectedMonth: month
});
this.refreshdates(month, year);
},
onNextMonthTap: function onNextMonthTap() {
var _this$data4 = this.data,
selectedMonth = _this$data4.selectedMonth,
selectedYear = _this$data4.selectedYear;
var year = selectedYear;
var month = selectedMonth; // 如果当前选中是十二月份下一月是去年的12月
if (selectedMonth === LAST_MONTH) {
year = selectedYear + 1;
month = FIRST_MONTH;
} else {
month = selectedMonth + 1;
}
if (this.props.onMonthChange) {
this.props.onMonthChange(month, selectedMonth);
}
this.setData({
selectedYear: year,
selectedMonth: month
});
this.refreshdates(month, year);
},
refreshdates: function refreshdates(month, year) {
this.tapTimes = 1;
var _this$data5 = this.data,
selectedYear = _this$data5.selectedYear,
selectedMonth = _this$data5.selectedMonth,
currentDate = _this$data5.currentDate;
var firstDay = getDay(month, year, 1);
var days = getMonthLength(month, year);
var datesArray = [];
var currentDateTimeStamp = +currentDate;
var num = 0;
for (var i = 0; i < firstDay; i++) {
num += 1; // 如果当前选中的是一月份前一个月是去年的12月
var _year = selectedYear;
var _month = selectedMonth;
if (selectedMonth === 0) {
_year = selectedYear - 1;
_month = LAST_MONTH;
} else {
_year = selectedYear;
_month = selectedMonth - 1;
}
var date = getMonthLength(_month, _year) - i;
datesArray.unshift({
year: _year,
month: _month,
date: date,
isToday: false,
isGray: true,
isSelected: false,
tag: ''
});
}
for (var _i = 0; _i < days; _i++) {
num += 1;
var _date = _i + 1;
var dateTimeStamp = +new Date(selectedYear, selectedMonth, _date);
datesArray.push({
year: selectedYear,
month: selectedMonth,
date: _date,
isToday: dateTimeStamp === currentDateTimeStamp,
isGray: false,
isSelected: dateTimeStamp === currentDateTimeStamp,
tag: ''
});
}
var nextDate = 0;
var daysPerPage = 35;
if (num > 35) {
daysPerPage = 42;
}
for (var _i2 = 0; _i2 < daysPerPage - days - firstDay; _i2++) {
// 如果是12月下月是第二年的1月份
nextDate += 1;
var _year2 = selectedYear;
var _month2 = selectedMonth;
if (selectedMonth === LAST_MONTH) {
_year2 = selectedYear + 1;
_month2 = FIRST_MONTH;
} else {
_year2 = selectedYear;
_month2 = selectedMonth + 1;
}
datesArray.push({
year: _year2,
month: _month2,
date: nextDate,
isToday: false,
isGray: true,
isSelected: false,
tag: ''
});
}
var blockType = 1;
for (var _i3 = 0; _i3 < datesArray.length; _i3++) {
if (this.hasTag(datesArray[_i3])) {
blockType = 2;
}
}
var dates = [];
var weekDates = [];
for (var _i4 = 0; _i4 < datesArray.length; _i4++) {
weekDates.push(datesArray[_i4]);
if ((_i4 + 1) % DAYS_PER_ROW === 0) {
dates.push([].concat(weekDates));
weekDates = [];
}
}
this.setData({
dates: dates,
blockType: blockType
});
},
hasTag: function hasTag(dateObj) {
var tagData = this.props.tagData; // 去重由调用者处理
if (tagData.length === 0) {
dateObj.tag = '';
return false;
}
return tagData.some(function (item) {
var dateArr = item.date.split('-');
var dateStr = []; // 兼容ios下new Date('2018-1-1')格式返回invalid Date的问题
for (var i = 0; i < dateArr.length; i++) {
dateStr.push(dateArr[i].length > 1 ? dateArr[i] : "0" + dateArr[i]);
}
var date = new Date(dateStr.join('-'));
if (dateObj.year === date.getFullYear() && dateObj.month === date.getMonth() && dateObj.date === date.getDate()) {
dateObj.tag = item.tag;
dateObj.color = COLOR_MAP[item.tagColor];
dateObj.disable = item.disable;
return true;
} else {
dateObj.tag = '';
return false;
}
});
},
getDateGap: function getDateGap(day1, day2) {
var date1 = +new Date(day1.year, prefixNum(day1.month), prefixNum(day1.date));
var date2 = +new Date(day2.year, prefixNum(day2.month), prefixNum(day2.date));
return (date1 - date2) / (24 * 3600 * 1000);
},
makeDate: function makeDate(dateObj) {
return new Date(dateObj.year + "-" + prefixNum(dateObj.month + 1) + "-" + prefixNum(dateObj.date));
},
onDateTap: function onDateTap(event) {
var dates = this.data.dates;
var _event$currentTarget$ = event.currentTarget.dataset,
year = _event$currentTarget$.year,
month = _event$currentTarget$.month,
date = _event$currentTarget$.date;
var type = this.props.type;
if (type === 'range') {
if (this.tapTimes % 2 === 0) {
this.tapTimes += 1;
this.endDate = {
year: year,
month: month,
date: date
};
var dateGap = this.getDateGap(this.startDate, this.endDate);
if (dateGap > 0) {
var _ref = [this.endDate, this.startDate];
this.startDate = _ref[0];
this.endDate = _ref[1];
}
var hasDisable = false;
for (var i = 0; i < dates.length; i++) {
for (var j = 0; j < dates[i].length; j++) {
var dateObj = dates[i][j];
dateObj.isStart = false;
dateObj.isMiddle = false;
dateObj.isEnd = false;
var startDateGap = this.getDateGap(dateObj, this.startDate);
var endDateGap = this.getDateGap(dateObj, this.endDate);
if (dateObj.year === year && dateObj.month === month && dateObj.date === date && dateObj.disable) {
hasDisable = true;
}
if (startDateGap > 0 && endDateGap < 0) {
if (dateObj.disable) {
hasDisable = true;
}
if (dateGap !== 0) {
if (j === 0) {
dateObj.isStart = true;
} else if (j === 6) {
dateObj.isEnd = true;
} else {
dateObj.isMiddle = true;
}
} else {
dateObj.isSelected = true;
}
}
if (this.startDate.year === dateObj.year && this.startDate.month === dateObj.month && this.startDate.date === dateObj.date && dateGap !== 0) {
if (j === 6) {
dateObj.isSelected = true;
} else {
dateObj.isStart = true;
}
}
if (this.endDate.year === dateObj.year && this.endDate.month === dateObj.month && this.endDate.date === dateObj.date && dateGap !== 0) {
if (j === 0) {
dateObj.isSelected = true;
} else {
dateObj.isEnd = true;
}
}
}
}
if (hasDisable) {
this.props.onSelectHasDisableDate([this.makeDate(this.startDate), this.makeDate(this.endDate)]);
return;
}
if (this.props.onSelect) {
this.props.onSelect([this.makeDate(this.startDate), this.makeDate(this.endDate)]);
}
} else {
var isDisable = false;
for (var _i5 = 0; _i5 < dates.length; _i5++) {
for (var _j = 0; _j < dates[_i5].length; _j++) {
var _dateObj = dates[_i5][_j];
if (_dateObj.year === year && _dateObj.month === month && _dateObj.date === date) {
if (_dateObj.disable) {
// console.log(1111);
isDisable = true;
_dateObj.isSelected = false;
} else {
_dateObj.isSelected = true;
}
_dateObj.isStart = false;
_dateObj.isMiddle = false;
_dateObj.isEnd = false;
} else {
_dateObj.isSelected = false;
_dateObj.isStart = false;
_dateObj.isMiddle = false;
_dateObj.isEnd = false;
}
}
}
if (!isDisable) {
this.tapTimes += 1;
}
this.startDate = {
year: year,
month: month,
date: date
};
}
this.setData({
dates: dates
});
} else {
var _isDisable = false;
for (var _i6 = 0; _i6 < dates.length; _i6++) {
for (var _j2 = 0; _j2 < dates[_i6].length; _j2++) {
var _dateObj2 = dates[_i6][_j2];
if (_dateObj2.year === year && _dateObj2.month === month && _dateObj2.date === date) {
_dateObj2.isSelected = true;
if (_dateObj2.disable) {
_isDisable = true;
}
} else {
_dateObj2.isSelected = false;
}
}
}
if (_isDisable) {
return;
}
this.setData({
dates: dates
});
if (this.props.onSelect) {
this.props.onSelect([this.makeDate({
year: year,
month: month,
date: date
}), undefined]);
}
}
}
}
});