214 lines
8.8 KiB
JavaScript
214 lines
8.8 KiB
JavaScript
![]() |
import { __assign, __awaiter, __generator, __spreadArray } from "tslib";
|
|||
|
import dayjs from 'dayjs';
|
|||
|
import equal from 'fast-deep-equal';
|
|||
|
import { Component, triggerEvent, getValueFromProps } from '../_util/simply';
|
|||
|
import { defaultLocaleText, CalendarDefaultProps, } from './props';
|
|||
|
import { getMonthListFromRange, getSelectionModeFromValue, renderCells, getScrollIntoViewId, } from './utils';
|
|||
|
import mixinValue from '../mixins/value';
|
|||
|
import { getInstanceBoundingClientRect } from '../_util/jsapi/get-instance-bounding-client-rect';
|
|||
|
Component(CalendarDefaultProps, {
|
|||
|
getInstance: function () {
|
|||
|
if (this.$id) {
|
|||
|
return my;
|
|||
|
}
|
|||
|
return this;
|
|||
|
},
|
|||
|
getBoundingClientRect: function (query) {
|
|||
|
return __awaiter(this, void 0, void 0, function () {
|
|||
|
return __generator(this, function (_a) {
|
|||
|
switch (_a.label) {
|
|||
|
case 0: return [4 /*yield*/, getInstanceBoundingClientRect(this.getInstance(), query)];
|
|||
|
case 1: return [2 /*return*/, _a.sent()];
|
|||
|
}
|
|||
|
});
|
|||
|
});
|
|||
|
},
|
|||
|
scrollIntoView: function (value) {
|
|||
|
this.updateScrollIntoViewId(getScrollIntoViewId(value));
|
|||
|
},
|
|||
|
clickCell: function (e) {
|
|||
|
var _a, _b;
|
|||
|
var time = e.currentTarget.dataset.time;
|
|||
|
var clickDate = dayjs(time.time);
|
|||
|
if (time.disabled) {
|
|||
|
return;
|
|||
|
}
|
|||
|
var value = this.getValue();
|
|||
|
var selectionModeFromValue = getSelectionModeFromValue(value);
|
|||
|
var selectionMode = (_b = (_a = getValueFromProps(this, 'selectionMode')) !== null && _a !== void 0 ? _a : selectionModeFromValue) !== null && _b !== void 0 ? _b : 'range';
|
|||
|
if (selectionMode === 'range') {
|
|||
|
if (Array.isArray(value)) {
|
|||
|
if (value.length === 1) {
|
|||
|
var current = value[0];
|
|||
|
if (dayjs(clickDate.toDate().getTime()).isBefore(dayjs(current))) {
|
|||
|
this.updateValue([clickDate.toDate().getTime()]);
|
|||
|
}
|
|||
|
else {
|
|||
|
this.updateValue([value[0], clickDate.toDate().getTime()]);
|
|||
|
}
|
|||
|
}
|
|||
|
else {
|
|||
|
this.updateValue([clickDate.toDate().getTime()]);
|
|||
|
}
|
|||
|
}
|
|||
|
else {
|
|||
|
this.updateValue([clickDate.toDate().getTime()]);
|
|||
|
}
|
|||
|
}
|
|||
|
else if (selectionMode === 'single') {
|
|||
|
this.updateValue(clickDate.toDate().getTime());
|
|||
|
}
|
|||
|
},
|
|||
|
setCurrentMonth: function (e) {
|
|||
|
this.setData({ headerState: e.month });
|
|||
|
},
|
|||
|
measurement: function () {
|
|||
|
var elementSize = this.data.elementSize;
|
|||
|
// 组件如果内嵌在 slot 里, 一定会被渲染出来, 但是此时 cellHight 为 0
|
|||
|
// 此时需要重新计算
|
|||
|
if (!elementSize || elementSize.cellHight === 0) {
|
|||
|
this.measurementFn();
|
|||
|
}
|
|||
|
},
|
|||
|
measurementFn: function () {
|
|||
|
var _this = this;
|
|||
|
Promise.all([
|
|||
|
this.getBoundingClientRect('.ant-calendar-body-container'),
|
|||
|
this.getBoundingClientRect('.ant-calendar-cells'),
|
|||
|
this.getBoundingClientRect('.ant-calendar-title-container'),
|
|||
|
])
|
|||
|
.then(function (_a) {
|
|||
|
var bodyContainer = _a[0], cellContainer = _a[1], Title = _a[2];
|
|||
|
// 滚动的时候 top 和 bottom 等尺寸会变
|
|||
|
// 所以只能依赖 height 来计算
|
|||
|
var paddingHeight = bodyContainer.height - cellContainer.height - Title.height;
|
|||
|
var monthTitleHeight = Title.height + paddingHeight;
|
|||
|
var cellHight = cellContainer.height / (_this.data.monthList[0].cells.length / 7);
|
|||
|
_this.setData({
|
|||
|
elementSize: {
|
|||
|
monthTitleHeight: monthTitleHeight,
|
|||
|
cellHight: cellHight,
|
|||
|
paddingHeight: paddingHeight,
|
|||
|
},
|
|||
|
});
|
|||
|
})
|
|||
|
.catch(function () {
|
|||
|
_this.setData({ elementSize: null });
|
|||
|
});
|
|||
|
},
|
|||
|
// scroll 触发滚动之后需要重置 scrollIntoViewId
|
|||
|
updateScrollIntoViewId: function (id) {
|
|||
|
var _this = this;
|
|||
|
this.setData({ scrollIntoViewId: id });
|
|||
|
var timer = setTimeout(function () {
|
|||
|
_this.setData({ scrollIntoViewId: '' });
|
|||
|
clearTimeout(timer);
|
|||
|
});
|
|||
|
},
|
|||
|
updateValue: function (newValue) {
|
|||
|
triggerEvent(this, 'change', newValue);
|
|||
|
if (!this.isControlled()) {
|
|||
|
this.update(newValue);
|
|||
|
}
|
|||
|
},
|
|||
|
updateData: function () {
|
|||
|
var _a = getValueFromProps(this, [
|
|||
|
'monthRange',
|
|||
|
'localeText',
|
|||
|
'weekStartsOn',
|
|||
|
'onFormatter',
|
|||
|
'onMonthFormatter',
|
|||
|
]), monthRange = _a[0], plocaleText = _a[1], pweekStartsOn = _a[2], onFormatter = _a[3], onMonthFormatter = _a[4];
|
|||
|
var localeText = Object.assign({}, defaultLocaleText, plocaleText);
|
|||
|
var markItems = __spreadArray([], localeText.weekdayNames, true);
|
|||
|
var weekStartsOn = pweekStartsOn;
|
|||
|
if (weekStartsOn === 'Sunday') {
|
|||
|
var item = markItems.pop();
|
|||
|
if (item)
|
|||
|
markItems.unshift(item);
|
|||
|
}
|
|||
|
var value = this.getValue();
|
|||
|
var start = dayjs(monthRange === null || monthRange === void 0 ? void 0 : monthRange[0]).startOf('d');
|
|||
|
var end = dayjs(monthRange === null || monthRange === void 0 ? void 0 : monthRange[1]).startOf('d');
|
|||
|
var monthRangeList = getMonthListFromRange(start, end);
|
|||
|
var monthList = monthRangeList.map(function (p) {
|
|||
|
var cells = renderCells(p, weekStartsOn, value, localeText,
|
|||
|
// 如果monthRange传入异常,用内置的时间范围
|
|||
|
start.isAfter(end) || start.isSame(end)
|
|||
|
? [monthRangeList[0], dayjs(monthRangeList[1]).endOf('month')]
|
|||
|
: [start, end]);
|
|||
|
if (onFormatter && typeof onFormatter === 'function') {
|
|||
|
cells = cells.map(function (o) {
|
|||
|
var _a;
|
|||
|
var time = o.time, top = o.top, bottom = o.bottom, disabled = o.disabled, isSelectedBegin = o.isSelectedBegin, isSelectedEnd = o.isSelectedEnd, isSelected = o.isSelected, className = o.className, isRange = o.isRange;
|
|||
|
var newState = (_a = onFormatter({
|
|||
|
time: time,
|
|||
|
top: top ? __assign({}, top) : undefined,
|
|||
|
bottom: bottom ? __assign({}, bottom) : undefined,
|
|||
|
disabled: disabled,
|
|||
|
isSelectedBegin: isSelectedBegin,
|
|||
|
isSelectedEnd: isSelectedEnd,
|
|||
|
isSelected: isSelected,
|
|||
|
className: className,
|
|||
|
isRange: isRange,
|
|||
|
}, value)) !== null && _a !== void 0 ? _a : {};
|
|||
|
var result = __assign({}, o);
|
|||
|
if (typeof newState === 'object') {
|
|||
|
// 只允许修改的字段字段
|
|||
|
['top', 'bottom', 'disabled', 'className'].forEach(function (key) {
|
|||
|
if (key in newState) {
|
|||
|
result[key] = newState[key];
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
return result;
|
|||
|
});
|
|||
|
}
|
|||
|
var month = {
|
|||
|
title: p.format(localeText.title),
|
|||
|
className: '',
|
|||
|
cells: cells,
|
|||
|
};
|
|||
|
if (onMonthFormatter && typeof onMonthFormatter === 'function') {
|
|||
|
month = __assign(__assign({}, month), onMonthFormatter(p));
|
|||
|
}
|
|||
|
return month;
|
|||
|
});
|
|||
|
this.setData({ markItems: markItems, monthList: monthList });
|
|||
|
},
|
|||
|
}, {
|
|||
|
elementSize: null,
|
|||
|
markItems: [],
|
|||
|
monthList: [],
|
|||
|
headerState: 0,
|
|||
|
scrollIntoViewId: '',
|
|||
|
}, [mixinValue()], {
|
|||
|
didMount: function () {
|
|||
|
this.updateData();
|
|||
|
this.measurementFn();
|
|||
|
// 初始化默认值时,滚动到选中位置
|
|||
|
var _a = getValueFromProps(this, [
|
|||
|
'value',
|
|||
|
'defaultValue',
|
|||
|
]), value = _a[0], defaultValue = _a[1];
|
|||
|
if (this.isControlled()) {
|
|||
|
this.updateScrollIntoViewId(getScrollIntoViewId(value));
|
|||
|
}
|
|||
|
else {
|
|||
|
defaultValue &&
|
|||
|
this.updateScrollIntoViewId(getScrollIntoViewId(defaultValue));
|
|||
|
}
|
|||
|
},
|
|||
|
didUpdate: function (prevProps, prevData) {
|
|||
|
if (!this.isEqualValue(prevData)) {
|
|||
|
// 滚动到已选的位置
|
|||
|
var changedScrollIntoView = getValueFromProps(this, 'changedScrollIntoView');
|
|||
|
changedScrollIntoView &&
|
|||
|
this.updateScrollIntoViewId(getScrollIntoViewId(this.getValue()));
|
|||
|
}
|
|||
|
if (!equal(prevProps, this.props) || !this.isEqualValue(prevData)) {
|
|||
|
this.updateData();
|
|||
|
}
|
|||
|
},
|
|||
|
});
|