fastlion-amis
Version:
一种MIS页面生成工具
434 lines (433 loc) • 25.5 kB
JavaScript
var _this = this;
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var react_1 = tslib_1.__importStar(require("react"));
var dayjs_1 = (0, tslib_1.__importDefault)(require("dayjs"));
var moment_1 = (0, tslib_1.__importDefault)(require("moment"));
var localeData_1 = (0, tslib_1.__importDefault)(require("dayjs/plugin/localeData"));
require("dayjs/locale/zh-cn");
var zh_CN_1 = (0, tslib_1.__importDefault)(require("./zh_CN"));
require("moment/locale/zh-cn");
var calendar_min_js_1 = (0, tslib_1.__importDefault)(require("./calendar.min.js"));
var antd_1 = require("antd");
var weekOfYear_1 = (0, tslib_1.__importDefault)(require("dayjs/plugin/weekOfYear"));
var icons_1 = require("@ant-design/icons");
require("./datePicker.scss");
// 国际化,设置周一为第一天
dayjs_1.default.extend(localeData_1.default);
dayjs_1.default.extend(weekOfYear_1.default);
dayjs_1.default.locale("zh-cn");
var throttle = function (fun, time) {
var delay = 0;
return function () {
var params = [];
for (var _i = 0; _i < arguments.length; _i++) {
params[_i] = arguments[_i];
}
var now = +new Date();
if (now - delay > time) {
fun.apply(_this, params);
delay = now;
}
};
};
var ScheduleList = function (props, ref) {
var onDateSelected = props.onDateSelected, _a = props.events, events = _a === void 0 ? [] : _a, initDate = props.initDate, _b = props.showCalendar, showCalendar = _b === void 0 ? true : _b, onToggleCalendar = props.onToggleCalendar, onSelectMonth = props.onSelectMonth, onPanelToggle = props.onPanelToggle, viewType = props.viewType, _c = props.isWeekView, defaultWeek = _c === void 0 ? true : _c, isMobile = props.isMobile, render = props.render, alertText = props.alertText;
// const CalendarComp = () => {
var current = (0, react_1.useRef)({
currentDate: initDate !== null && initDate !== void 0 ? initDate : (0, dayjs_1.default)().format("YYYY-MM-DD"),
// currentDate: initDate,
isTouch: false,
touchStartX: 0,
touchStartY: 0,
calendarRef: { offsetWidth: 0 },
}).current;
var dayjsDate = (0, dayjs_1.default)(current.currentDate);
var generateMonthData = function (dayjsDate) {
//返回当前月份的第一天
var currentMonthFirstDay = dayjsDate.startOf("month");
// 返回当月的第一周第一天
var currentMonthStartDay = currentMonthFirstDay.startOf("week");
//上一个月
var prevMonthFirstDay = currentMonthFirstDay.subtract(1, "month");
var prevMonthStartDay = prevMonthFirstDay.startOf("week");
//下一个月
var nextMonthFirstDay = currentMonthFirstDay.add(1, "month");
var nextMonthStartDay = nextMonthFirstDay.startOf("week");
return {
currentMonthFirstDay: currentMonthFirstDay,
generateMonthDateList: [
new Array(42)
.fill("")
.map(function (_, index) { return prevMonthStartDay.add(index, "day"); }),
new Array(42)
.fill("")
.map(function (_, index) { return currentMonthStartDay.add(index, "day"); }),
new Array(42)
.fill("")
.map(function (_, index) { return nextMonthStartDay.add(index, "day"); }),
],
};
};
/**
*
* @param {*} dayjsDate dayjs对象
*/
var generateWeekData = function (dayjsDate) {
var currenWeekStartDay = dayjsDate.startOf("week");
var prevWeekStartDay = currenWeekStartDay.subtract(1, "week");
var nextWeekStartDay = currenWeekStartDay.add(1, "week");
return {
currenWeekFirstDay: currenWeekStartDay,
generateWeekDateList: [
new Array(7).fill("").map(function (_, index) { return prevWeekStartDay.add(index, "day"); }),
new Array(7).fill("").map(function (_, index) { return currenWeekStartDay.add(index, "day"); }),
new Array(7).fill("").map(function (_, index) { return nextWeekStartDay.add(index, "day"); }),
],
};
};
var _d = generateMonthData(dayjsDate), currentMonthFirstDay = _d.currentMonthFirstDay, _e = _d.generateMonthDateList, generateMonthDateList = _e === void 0 ? [] : _e;
var _f = generateWeekData(dayjsDate), currenWeekFirstDay = _f.currenWeekFirstDay, _g = _f.generateWeekDateList, generateWeekDateList = _g === void 0 ? [] : _g;
var _h = (0, react_1.useState)(currentMonthFirstDay), monthFirstDay = _h[0], setMonthFirstDay = _h[1];
var _j = (0, react_1.useState)(generateMonthDateList), mountDateList = _j[0], setMonthDateList = _j[1]; // 月日历需要展示的日期 包括前一月 当月 下一月
var _k = (0, react_1.useState)(currenWeekFirstDay), weekFirstDay = _k[0], setWeekFirstDay = _k[1]; // 周日历需要展示的日期 包括前一周 当周 下一周
var _l = (0, react_1.useState)(generateWeekDateList), weekDateList = _l[0], setWeekDateList = _l[1];
var _m = (0, react_1.useState)(current.currentDate), selectDate = _m[0], setSelectDate = _m[1];
var _o = (0, react_1.useState)(0), moveIndex = _o[0], setMoveIndex = _o[1];
var _p = (0, react_1.useState)({ x: 0, y: 0 }), touch = _p[0], setTouch = _p[1]; //Y轴
var _q = (0, react_1.useState)((defaultWeek)), isWeekView = _q[0], setIsWeekView = _q[1]; //true/周日历 false/月日历
var _r = (0, react_1.useState)(0), weekInd = _r[0], selectWeekInd = _r[1]; //记录周日历选中的index
var weekList = [{ id: 1, name: "一", }, { id: 2, name: "二", }, { id: 3, name: "三", }, { id: 4, name: "四", }, { id: 5, name: "五", }, { id: 6, name: "六", }, { id: 7, name: "日", },];
var handleTouchStart = function (e) {
current.isTouch = true;
e.stopPropagation();
var touches = e.touches[0];
current.touchStartX = touches.clientX;
current.touchStartY = touches.clientY;
};
var handleTouchMove = throttle(function (e) {
e.stopPropagation();
var touches = e.touches[0];
var moveX = touches.clientX - current.touchStartX;
var moveY = touches.clientY - current.touchStartY;
var calendarWidth = current.calendarRef.offsetWidth;
if (Math.abs(moveX) > Math.abs(moveY)) {
// 左右滑动
setTouch({ x: moveX / calendarWidth, y: 0 });
}
}, 25);
var handleTouchEnd = function (e, touchInfo, type) {
current.isTouch = false;
e === null || e === void 0 ? void 0 : e.stopPropagation();
var touchSource = touchInfo !== null && touchInfo !== void 0 ? touchInfo : touch;
var touchX = Math.abs(touchSource.x);
var touchY = Math.abs(touchSource.y);
var newTranslateIndex = touchSource.x > 0 ? moveIndex + 1 : moveIndex - 1;
var toggleType = type !== null && type !== void 0 ? type : (isWeekView ? "week" : "month");
var toggleDate = selectDate;
if (touchX > touchY && touchX > 0.15) {
// 如果是周视图
if (isWeekView) {
var firstDayMap = {
week: weekFirstDay,
month: monthFirstDay,
};
var nextWeekFirstDay = firstDayMap[toggleType !== null && toggleType !== void 0 ? toggleType : "week"][touchSource.x > 0 ? "subtract" : "add"](1, toggleType);
var _a = generateWeekData(nextWeekFirstDay), _b = _a.currenWeekFirstDay, currenWeekFirstDay_1 = _b === void 0 ? null : _b, _c = _a.generateWeekDateList, generateWeekDateList_1 = _c === void 0 ? [] : _c;
updateWeekView(newTranslateIndex, currenWeekFirstDay_1, generateWeekDateList_1);
if (toggleType === "week") {
//周日历滚动默认选中
var currentWeekDays = generateWeekDateList_1[1];
var selectWeekDay = currentWeekDays[weekInd];
var formSelectWeekDay = handleFormDate(selectWeekDay, "YYYY-MM-DD");
// 周模式,获取当月第一天
var selectedDateFirstDay = (0, dayjs_1.default)(selectWeekDay).date(1);
toggleDate = (0, dayjs_1.default)(formSelectWeekDay).format("YYYY-MM-DD");
setMonthFirstDay(selectedDateFirstDay);
setSelectDate(formSelectWeekDay);
}
else if (toggleType === "month") {
//周日历滚动默认选中
var formSelectWeekDay = handleFormDate(nextWeekFirstDay, "YYYY-MM-DD");
toggleDate = (0, dayjs_1.default)(formSelectWeekDay).format("YYYY-MM-DD");
// 周模式,获取当月第一天
setMonthFirstDay(nextWeekFirstDay);
setSelectDate(formSelectWeekDay);
}
}
else {
// 如果是月视图
if (toggleType === "month") {
//月日历
var nextMonthFirstDay = monthFirstDay[touchSource.x > 0 ? "subtract" : "add"](1, "month");
var _d = generateMonthData(nextMonthFirstDay), _e = _d.currentMonthFirstDay, currentMonthFirstDay_1 = _e === void 0 ? null : _e, _f = _d.generateMonthDateList, generateMonthDateList_1 = _f === void 0 ? [] : _f;
toggleDate = (0, dayjs_1.default)(currentMonthFirstDay_1).format("YYYY-MM-DD");
updateMonthView(newTranslateIndex, currentMonthFirstDay_1, generateMonthDateList_1);
}
}
}
setTouch({ x: 0, y: 0 });
onDateSelected(toggleDate, true);
};
/** 下一页 */
var handleNext = function (e, type) {
if (showCalendar) {
handleTouchEnd(e, { x: -0.5, y: 0 }, type);
}
else {
setSelectDate(function (date) {
var newDate = (0, dayjs_1.default)(date);
if (type === 'month') {
var currentMonth_1 = (0, dayjs_1.default)(date).month();
newDate = (0, dayjs_1.default)(date).month(currentMonth_1 + 1).date(1);
}
else if (type === 'week') {
var currentWeek = (0, dayjs_1.default)(date).week();
newDate = (0, dayjs_1.default)(date).week(currentWeek + 1);
}
onToggleCalendar === null || onToggleCalendar === void 0 ? void 0 : onToggleCalendar(type, "next", newDate);
return newDate;
});
}
};
/** 上一页 */
var handlePrev = function (e, type) {
if (showCalendar) {
handleTouchEnd(e, { x: 0.5, y: 0 }, type);
}
else {
setSelectDate(function (date) {
var newDate = (0, dayjs_1.default)(date);
if (type === 'month') {
var currentMonth_2 = (0, dayjs_1.default)(date).month();
newDate = (0, dayjs_1.default)(date).month(currentMonth_2 - 1).date(1);
}
else if (type === 'week') {
var currentWeek = (0, dayjs_1.default)(date).week();
newDate = (0, dayjs_1.default)(date).week(currentWeek - 1);
}
onToggleCalendar === null || onToggleCalendar === void 0 ? void 0 : onToggleCalendar(type, "prev", newDate);
return newDate;
});
}
};
//更新月日历视图
var updateMonthView = function (index, currentFirstDay, dateList) {
setMoveIndex(index);
setMonthFirstDay(currentFirstDay);
setMonthDateList(dateList);
};
//更新周日历视图
var updateWeekView = function (index, currentFirstDay, dateList) {
setMoveIndex(index);
setWeekFirstDay(currentFirstDay);
setWeekDateList(dateList);
};
var handleFormDate = function (date, exp) {
return (0, dayjs_1.default)(date).format(exp);
};
//日历选中逻辑
var handleSelectDate = function (formDate, isOtherMonthDay, index) {
var selectM = handleFormDate(formDate, "YYYYMM");
var currentM = handleFormDate(monthFirstDay, "YYYYMM");
if (!isOtherMonthDay) {
//在当月点击上一个月或者下一个月
var _a = generateMonthData((0, dayjs_1.default)(formDate)).generateMonthDateList, generateMonthDateList_2 = _a === void 0 ? [] : _a;
var newTranslateIndex = selectM < currentM ? moveIndex + 1 : moveIndex - 1;
updateMonthView(newTranslateIndex, (0, dayjs_1.default)(formDate), generateMonthDateList_2);
}
if (isWeekView) {
//周日历 记录选中的位置
// selectWeekInd(index);
}
setSelectDate(formDate);
//更新日历选中样式
onDateSelected(formDate, true);
};
var today = (0, dayjs_1.default)().format('YYYY-MM-DD');
//渲染选中样式
var renderClassName = function (formDate) {
if (selectDate === formDate)
return "selectDay";
if (formDate === today)
return "currentDay";
var matchEvent = events.find(function (item) { return (0, dayjs_1.default)(item.start).format('YYYY-MM-DD') === formDate; });
if (matchEvent) {
if (matchEvent.bgColor)
return matchEvent.bgColor;
}
return "";
};
//月日历/周日历切换
var handleIsMonthView = function () {
var dayjsDate = (0, dayjs_1.default)(selectDate);
var _a = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, generateMonthData(dayjsDate)), generateWeekData(dayjsDate)), _b = _a.generateWeekDateList, generateWeekDateList = _b === void 0 ? [] : _b, _c = _a.generateMonthDateList, generateMonthDateList = _c === void 0 ? [] : _c;
var flag = !isWeekView;
if (flag) {
//更新周日历
setWeekFirstDay(dayjsDate);
setWeekDateList(generateWeekDateList);
handleSetWeekIndex(selectDate, generateWeekDateList);
}
else {
//更新月日历
setMonthFirstDay(dayjsDate);
setMonthDateList(generateMonthDateList);
}
setIsWeekView(flag);
};
//设置周日历选中的位置
var handleSetWeekIndex = function (selectDate, generateWeekDateList) {
var currentWeekDateList = generateWeekDateList[1];
var weekIndex = 0;
currentWeekDateList.forEach(function (v, index) {
if (handleFormDate(v, "YYYY-MM-DD") === selectDate)
weekIndex = index;
});
selectWeekInd(weekIndex);
};
// 当从面板切换年月
var handleYearMonthChange = function (val, valStr, stopPropagation) {
// const nextFirstDay = valStr + "-01";
// 如果是手动重置,则按指定的日期来初始化
var nextFirstDay = stopPropagation ? (0, dayjs_1.default)(valStr).startOf('week').format('YYYY-MM-DD') : (0, dayjs_1.default)(valStr).startOf('M').format('YYYY-MM-DD');
var parsedDay = (0, dayjs_1.default)(nextFirstDay);
if (showCalendar && isWeekView) {
setMonthFirstDay(parsedDay);
if (isWeekView) {
setSelectDate(nextFirstDay);
var _a = generateWeekData(parsedDay), _b = _a.currenWeekFirstDay, currenWeekFirstDay_2 = _b === void 0 ? null : _b, _c = _a.generateWeekDateList, generateWeekDateList_2 = _c === void 0 ? [] : _c;
updateWeekView(0, currenWeekFirstDay_2, generateWeekDateList_2);
}
// 更新日期
!stopPropagation && onDateSelected(nextFirstDay);
}
else if (!isWeekView && !showCalendar) {
onSelectMonth === null || onSelectMonth === void 0 ? void 0 : onSelectMonth(nextFirstDay);
}
else if (!isWeekView && showCalendar) {
// 更新某月视图
var _d = generateMonthData((0, dayjs_1.default)(nextFirstDay)), _e = _d.currentMonthFirstDay, currentMonthFirstDay_2 = _e === void 0 ? null : _e, _f = _d.generateMonthDateList, generateMonthDateList_3 = _f === void 0 ? [] : _f;
setMonthFirstDay((0, dayjs_1.default)(nextFirstDay));
// toggleDate = dayjs(currentMonthFirstDay).format("YYYY-MM-DD");
updateMonthView(0, currentMonthFirstDay_2, generateMonthDateList_3);
}
};
var handleGetTerm = function (date) {
var _a;
var Y = Number((0, dayjs_1.default)(date).get('y'));
var M = Number((0, dayjs_1.default)(date).get('M')) + 1;
var D = Number((0, dayjs_1.default)(date).get('D'));
var _b = (_a = calendar_min_js_1.default.getDateBySolar(Y, M, D)) !== null && _a !== void 0 ? _a : {}, term = _b.term, festival = _b.festival, lDayZH = _b.lDayZH;
return term || festival || lDayZH;
};
var renderDotClassName = function (date) {
var _a, _b;
var parsedDay = (0, dayjs_1.default)(date).format('YYYY-MM-DD').valueOf();
var dotColor = (_b = (_a = events.find(function (item) {
var isMatch = false;
var startDay = (0, dayjs_1.default)(item.startTime).startOf('d').format('YYYY-MM-DD').valueOf();
var endDay = (0, dayjs_1.default)(item.endTime).endOf('d').format('YYYY-MM-DD').valueOf();
isMatch = parsedDay >= startDay && parsedDay <= endDay;
return isMatch;
})) === null || _a === void 0 ? void 0 : _a['color']) !== null && _b !== void 0 ? _b : '';
return dotColor;
};
(0, react_1.useEffect)(function () {
if (!isWeekView) {
//月日历, 如果是当月则默认选中当天
// const mOfToday = dayjs().get('M');
// const currentMNum = dayjs(monthFirstDay).get('M');
// const isSame = mOfToday === currentMNum;
var currentM = (0, dayjs_1.default)(monthFirstDay).format("YYYY-MM-DD");
setSelectDate(currentM);
onDateSelected(currentM);
}
}, [monthFirstDay, isWeekView]);
(0, react_1.useEffect)(function () {
if (showCalendar) {
var formatDate = (0, dayjs_1.default)(initDate).format('YYYY-MM-DD');
handleSetWeekIndex(current.currentDate, weekDateList);
setSelectDate(formatDate);
}
}, []);
// useEffect(() => {
// console.log('debug-initDate??', initDate);
// if (initDate) {
// handleYearMonthChange('', dayjs(initDate).format('YYYY-MM'), true);
// }
// }, [initDate]);
var handleViewTypeChange = function (val, mode) {
if (mode === 'month') {
var newDate = (0, dayjs_1.default)(val).date(1).format('YYYY-MM-DD');
setSelectDate(newDate);
onPanelToggle === null || onPanelToggle === void 0 ? void 0 : onPanelToggle(newDate, mode);
}
};
var currentMonth = (0, react_1.useMemo)(function () {
return (0, dayjs_1.default)(selectDate).format("YYYY年MM月");
}, [selectDate]);
var showWeekToggler = (0, react_1.useCallback)(function () {
return ['timeGridDay', 'timeGridWeek'].includes(viewType) && isWeekView;
}, [viewType, isWeekView]);
(0, react_1.useImperativeHandle)(ref, function () { return ({
handleYearMonthChange: handleYearMonthChange
}); });
return (react_1.default.createElement("div", { className: "schedule-view-wrap " + (isMobile ? 'mobile' : '') + " showFold" },
react_1.default.createElement("div", { className: "schedule-list-section" },
react_1.default.createElement("div", { className: "calendar-comp" },
react_1.default.createElement("div", { className: "calendar-header" },
react_1.default.createElement("div", { className: "icon", onClick: function (e) { return handlePrev(e, "month"); } },
react_1.default.createElement(icons_1.DoubleLeftOutlined, { style: { fontSize: 18 } })),
showWeekToggler() ? (react_1.default.createElement("div", { className: "icon", onClick: function (e) { return handlePrev(e, "week"); } },
react_1.default.createElement(icons_1.LeftOutlined, { style: { fontSize: 18 } }))) : null,
react_1.default.createElement("div", { className: "date-time" },
react_1.default.createElement("div", { className: "picker-box" },
react_1.default.createElement("div", { className: "picker" },
react_1.default.createElement(antd_1.DatePicker, { style: { width: 240, cursor: 'pointer' }, picker: "month", onChange: handleYearMonthChange, onPanelChange: handleViewTypeChange, value: (0, moment_1.default)(selectDate), inputReadOnly: true, locale: zh_CN_1.default, allowClear: false, getPopupContainer: function () { return document.querySelector('.week-toggler-box.calendar'); }, popupClassName: "schedule-date-picker" }))),
react_1.default.createElement("div", { className: "date-text" }, currentMonth)),
showWeekToggler() ? (react_1.default.createElement("div", { className: "icon", onClick: function (e) { return handleNext(e, "week"); } },
react_1.default.createElement(icons_1.RightOutlined, { style: { fontSize: 18 } }))) : null,
react_1.default.createElement("div", { className: "icon", onClick: function (e) { return handleNext(e, "month"); } },
react_1.default.createElement(icons_1.DoubleRightOutlined, { style: { fontSize: 18 } }))),
showCalendar ? (react_1.default.createElement(react_1.default.Fragment, null,
react_1.default.createElement("div", { className: "week-list" }, weekList.map(function (item) {
return (react_1.default.createElement("span", { className: "week-item", key: item.id }, item.name));
})),
react_1.default.createElement("div", { className: "calendar-comp-wrap pullHeight " + (isWeekView ? 'weekView' : 'monthView'), ref: function (e) { return (current.calendarRef = e); }, onTouchStart: handleTouchStart, onTouchMove: handleTouchMove, onTouchEnd: handleTouchEnd },
react_1.default.createElement("div", { className: "calendar-comp-section", style: {
transform: "translateX(" + -moveIndex * 100 + "%)",
} }, (isWeekView ? weekDateList : mountDateList).map(function (item, index) {
return (react_1.default.createElement("div", { key: index, className: "calendar-list-day", style: {
transform: "translateX(" + (index - 1 + moveIndex + (current.isTouch ? touch.x : 0)) * 100 + "%)",
transitionDuration: (current.isTouch ? 0.1 : 0.3) + "s",
} }, item.map(function (date, ind) {
var isOtherMonthDay = date.isSame(monthFirstDay, "month");
var formDate = handleFormDate(date, "YYYY-MM-DD");
return (react_1.default.createElement("div", { key: ind, onClick: function () {
handleSelectDate(formDate, isOtherMonthDay, ind);
}, className: "item " + (isOtherMonthDay ? "current" : "other") },
react_1.default.createElement("div", { className: "dayItem " + renderClassName(formDate) },
date.format("DD"),
react_1.default.createElement("div", { className: "lunar-date" }, handleGetTerm(formDate)),
react_1.default.createElement("div", { className: "event-dot " + renderDotClassName(date) }))));
})));
})),
react_1.default.createElement("div", { className: "calendar-fold", onClick: function () { handleIsMonthView(); } },
react_1.default.createElement("div", null, alertText ? render === null || render === void 0 ? void 0 : render('tpl', { type: 'tpl', tpl: alertText }) : null),
isWeekView ? react_1.default.createElement(icons_1.DownOutlined, null) : react_1.default.createElement(icons_1.UpOutlined, null))))) : null))));
// };
// return (
// <>
// <div className="schedule-view-wrap">
// <div className="schedule-list-section">
// {/* 日历组件 */}
// <CalendarComp />
// </div>
// </div>
// </>
// );
};
exports.default = (0, react_1.forwardRef)(ScheduleList);
//# sourceMappingURL=./components/Schedule/datePicker.js.map
;