You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

334 lines
8.5 KiB

"use strict";
exports.__esModule = true;
exports.default = void 0;
var _utils = require("../../utils");
var _scroll = require("../../utils/dom/scroll");
var _utils2 = require("../utils");
var _utils3 = require("../../datetime-picker/utils");
var _createNamespace = (0, _utils.createNamespace)('calendar-month'),
createComponent = _createNamespace[0];
var _default = createComponent({
props: {
date: Date,
type: String,
color: String,
minDate: Date,
maxDate: Date,
showMark: Boolean,
rowHeight: [Number, String],
formatter: Function,
lazyRender: Boolean,
currentDate: [Date, Array],
allowSameDay: Boolean,
showSubtitle: Boolean,
showMonthTitle: Boolean,
firstDayOfWeek: Number
},
data: function data() {
return {
visible: false
};
},
computed: {
title: function title() {
return (0, _utils2.formatMonthTitle)(this.date);
},
rowHeightWithUnit: function rowHeightWithUnit() {
return (0, _utils.addUnit)(this.rowHeight);
},
offset: function offset() {
var firstDayOfWeek = this.firstDayOfWeek;
var realDay = this.date.getDay();
if (!firstDayOfWeek) {
return realDay;
}
return (realDay + 7 - this.firstDayOfWeek) % 7;
},
totalDay: function totalDay() {
return (0, _utils3.getMonthEndDay)(this.date.getFullYear(), this.date.getMonth() + 1);
},
shouldRender: function shouldRender() {
return this.visible || !this.lazyRender;
},
placeholders: function placeholders() {
var rows = [];
var count = Math.ceil((this.totalDay + this.offset) / 7);
for (var day = 1; day <= count; day++) {
rows.push({
type: 'placeholder'
});
}
return rows;
},
days: function days() {
var days = [];
var year = this.date.getFullYear();
var month = this.date.getMonth();
for (var day = 1; day <= this.totalDay; day++) {
var date = new Date(year, month, day);
var type = this.getDayType(date);
var config = {
date: date,
type: type,
text: day,
bottomInfo: this.getBottomInfo(type)
};
if (this.formatter) {
config = this.formatter(config);
}
days.push(config);
}
return days;
}
},
methods: {
getHeight: function getHeight() {
if (!this.height) {
this.height = this.$el.getBoundingClientRect().height;
}
return this.height;
},
scrollIntoView: function scrollIntoView(body) {
var _this$$refs = this.$refs,
days = _this$$refs.days,
month = _this$$refs.month;
var el = this.showSubtitle ? days : month;
var scrollTop = el.getBoundingClientRect().top - body.getBoundingClientRect().top + body.scrollTop;
(0, _scroll.setScrollTop)(body, scrollTop);
},
getMultipleDayType: function getMultipleDayType(day) {
var _this = this;
var isSelected = function isSelected(date) {
return _this.currentDate.some(function (item) {
return (0, _utils2.compareDay)(item, date) === 0;
});
};
if (isSelected(day)) {
var prevDay = (0, _utils2.getPrevDay)(day);
var nextDay = (0, _utils2.getNextDay)(day);
var prevSelected = isSelected(prevDay);
var nextSelected = isSelected(nextDay);
if (prevSelected && nextSelected) {
return 'multiple-middle';
}
if (prevSelected) {
return 'end';
}
return nextSelected ? 'start' : 'multiple-selected';
}
return '';
},
getRangeDayType: function getRangeDayType(day) {
var _this$currentDate = this.currentDate,
startDay = _this$currentDate[0],
endDay = _this$currentDate[1];
if (!startDay) {
return '';
}
var compareToStart = (0, _utils2.compareDay)(day, startDay);
if (!endDay) {
return compareToStart === 0 ? 'start' : '';
}
var compareToEnd = (0, _utils2.compareDay)(day, endDay);
if (compareToStart === 0 && compareToEnd === 0 && this.allowSameDay) {
return 'start-end';
}
if (compareToStart === 0) {
return 'start';
}
if (compareToEnd === 0) {
return 'end';
}
if (compareToStart > 0 && compareToEnd < 0) {
return 'middle';
}
},
getDayType: function getDayType(day) {
var type = this.type,
minDate = this.minDate,
maxDate = this.maxDate,
currentDate = this.currentDate;
if ((0, _utils2.compareDay)(day, minDate) < 0 || (0, _utils2.compareDay)(day, maxDate) > 0) {
return 'disabled';
}
if (currentDate === null) {
return;
}
if (type === 'single') {
return (0, _utils2.compareDay)(day, currentDate) === 0 ? 'selected' : '';
}
if (type === 'multiple') {
return this.getMultipleDayType(day);
}
/* istanbul ignore else */
if (type === 'range') {
return this.getRangeDayType(day);
}
},
getBottomInfo: function getBottomInfo(type) {
if (this.type === 'range') {
if (type === 'start' || type === 'end') {
return (0, _utils2.t)(type);
}
if (type === 'start-end') {
return (0, _utils2.t)('startEnd');
}
}
},
getDayStyle: function getDayStyle(type, index) {
var style = {
height: this.rowHeightWithUnit
};
if (type === 'placeholder') {
style.width = '100%';
return style;
}
if (index === 0) {
style.marginLeft = 100 * this.offset / 7 + "%";
}
if (this.color) {
if (type === 'start' || type === 'end' || type === 'start-end' || type === 'multiple-selected' || type === 'multiple-middle') {
style.background = this.color;
} else if (type === 'middle') {
style.color = this.color;
}
}
return style;
},
genTitle: function genTitle() {
var h = this.$createElement;
if (this.showMonthTitle) {
return h("div", {
"class": (0, _utils2.bem)('month-title')
}, [this.title]);
}
},
genMark: function genMark() {
var h = this.$createElement;
if (this.showMark && this.shouldRender) {
return h("div", {
"class": (0, _utils2.bem)('month-mark')
}, [this.date.getMonth() + 1]);
}
},
genDays: function genDays() {
var h = this.$createElement;
var days = this.shouldRender ? this.days : this.placeholders;
return h("div", {
"ref": "days",
"attrs": {
"role": "grid"
},
"class": (0, _utils2.bem)('days')
}, [this.genMark(), days.map(this.genDay)]);
},
genDay: function genDay(item, index) {
var _this2 = this;
var h = this.$createElement;
var type = item.type,
topInfo = item.topInfo,
bottomInfo = item.bottomInfo;
var style = this.getDayStyle(type, index);
var disabled = type === 'disabled';
var onClick = function onClick() {
if (!disabled) {
_this2.$emit('click', item);
}
};
var TopInfo = topInfo && h("div", {
"class": (0, _utils2.bem)('top-info')
}, [topInfo]);
var BottomInfo = bottomInfo && h("div", {
"class": (0, _utils2.bem)('bottom-info')
}, [bottomInfo]);
if (type === 'selected') {
return h("div", {
"attrs": {
"role": "gridcell",
"tabindex": -1
},
"style": style,
"class": [(0, _utils2.bem)('day'), item.className],
"on": {
"click": onClick
}
}, [h("div", {
"class": (0, _utils2.bem)('selected-day'),
"style": {
width: this.rowHeightWithUnit,
height: this.rowHeightWithUnit,
background: this.color
}
}, [TopInfo, item.text, BottomInfo])]);
}
return h("div", {
"attrs": {
"role": "gridcell",
"tabindex": disabled ? null : -1
},
"style": style,
"class": [(0, _utils2.bem)('day', type), item.className],
"on": {
"click": onClick
}
}, [TopInfo, item.text, BottomInfo]);
}
},
render: function render() {
var h = arguments[0];
return h("div", {
"class": (0, _utils2.bem)('month'),
"ref": "month"
}, [this.genTitle(), this.genDays()]);
}
});
exports.default = _default;