UNPKG

@alifd/meet-react

Version:

Fusion Mobile React UI System Component

432 lines 18.7 kB
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } import { __rest } from "tslib"; import React, { createElement, forwardRef, useState, createRef, useEffect, useImperativeHandle, useRef } from "react"; import classNames from 'classnames'; import dayjs from 'dayjs'; import { Slider as ReactSlider } from "@alifd/meet-react-component-one"; import View from '../view'; import CalendarContent from './content'; import CalendarHeader from './header'; import CalendarTimePicker from './time-picker'; import { useLocale } from '../locale'; import { isValidDate, toDate } from '../utils/date'; import { HeaderType } from './types'; import { cloneDate, genContentHeight, getMaxMinDate, getTargetDate, NOW, genTotalPageDates, getSelectedIndex } from './utils'; import { isValidArray } from '../utils'; var defaultLocale = { weekdays: ['日', '一', '二', '三', '四', '五', '六'], months: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], year: '年', month: '月', day: '日', timePickerLabel: '选择时间' }; function formatValue(value) { if (!value) { return undefined; } if (Array.isArray(value)) { return value.map(function (it) { return toDate(it); }); } return toDate(value); } var Calendar = function Calendar(props, ref) { var _props$prefix = props.prefix, prefix = _props$prefix === void 0 ? 'mt-' : _props$prefix, defaultValue = props.defaultValue, value = props.value, _props$shape = props.shape, shape = _props$shape === void 0 ? 'panel' : _props$shape, _props$mode = props.mode, mode = _props$mode === void 0 ? 'month' : _props$mode, validRange = props.validRange, _props$onSelect = props.onSelect, onSelect = _props$onSelect === void 0 ? function () {} : _props$onSelect, dateCellRender = props.dateCellRender, monthCellRender = props.monthCellRender, disabledDate = props.disabledDate, _onModeChange = props.onModeChange, _props$needSlider = props.needSlider, needSlider = _props$needSlider === void 0 ? false : _props$needSlider, _props$enableYearPick = props.enableYearPicker, enableYearPicker = _props$enableYearPick === void 0 ? false : _props$enableYearPick, _props$enableTimePick = props.enableTimePicker, enableTimePicker = _props$enableTimePick === void 0 ? false : _props$enableTimePick, _props$onYearPickerVi = props.onYearPickerVisibleChange, onYearPickerVisibleChange = _props$onYearPickerVi === void 0 ? function () {} : _props$onYearPickerVi, _props$timeFormat = props.timeFormat, timeFormat = _props$timeFormat === void 0 ? 'HH:mm:ss' : _props$timeFormat, _props$sliderHeight = props.sliderHeight, sliderHeight = _props$sliderHeight === void 0 ? genContentHeight(mode) : _props$sliderHeight, _props$sliderWidth = props.sliderWidth, sliderWidth = _props$sliderWidth === void 0 ? '750' : _props$sliderWidth, renderCellBottom = props.renderCellBottom, renderCellRight = props.renderCellRight, renderHeadLeft = props.renderHeadLeft, renderHeadRight = props.renderHeadRight, firstDay = props.firstDay, fixSliderNumber = props.fixSliderNumber, others = __rest(props, ["prefix", "defaultValue", "value", "shape", "mode", "validRange", "onSelect", "dateCellRender", "monthCellRender", "disabledDate", "onModeChange", "needSlider", "enableYearPicker", "enableTimePicker", "onYearPickerVisibleChange", "timeFormat", "sliderHeight", "sliderWidth", "renderCellBottom", "renderCellRight", "renderHeadLeft", "renderHeadRight", "firstDay", "fixSliderNumber"]); var getValueString = function getValueString(v) { if (Array.isArray(v)) { return v.map(getValueString).join(','); } if (v instanceof Date) { return v.getTime(); } if (dayjs.isDayjs(v)) { return v.valueOf(); } return v; }; var genInitVisibleDate = function genInitVisibleDate(sValue) { var date = NOW; if (sValue) { if (Array.isArray(sValue)) { if (sValue.length > 0 && sValue[0]) { date = sValue[0]; } } else { date = sValue; } } if (firstDay && mode === 'week') { var tempDay = dayjs(date).day(firstDay); date = new Date(tempDay.valueOf()); } return cloneDate(date); }; var genInitSelectedDate = function genInitSelectedDate(sValue, dValue, vShape) { var tempSDate = sValue || dValue; if (tempSDate) { return tempSDate; } if (vShape === 'range') { return []; } if (vShape === 'multi') { return []; } return null; }; var locale = useLocale('Calendar', others, defaultLocale); var selectedDate = genInitSelectedDate(formatValue(value), formatValue(defaultValue), shape); var _getMaxMinDate = getMaxMinDate(validRange), _getMaxMinDate2 = _slicedToArray(_getMaxMinDate, 2), minDate = _getMaxMinDate2[0], maxDate = _getMaxMinDate2[1]; var _useState = useState(mode), _useState2 = _slicedToArray(_useState, 2), currentMode = _useState2[0], changeCurrentMode = _useState2[1]; var _useState3 = useState(genInitVisibleDate(Array.isArray(selectedDate) && selectedDate.length === 0 && ['range', 'multi'].indexOf(shape) > -1 ? minDate : selectedDate)), _useState4 = _slicedToArray(_useState3, 2), visibleDate = _useState4[0], changeVisibleDate = _useState4[1]; var _useState5 = useState(getTargetDate(mode, visibleDate, 'pre', maxDate, minDate)), _useState6 = _slicedToArray(_useState5, 2), preVisibleDate = _useState6[0], changePreVisibleDate = _useState6[1]; var _useState7 = useState(visibleDate), _useState8 = _slicedToArray(_useState7, 2), currentVisibleDate = _useState8[0], changeCurrentVisibleDate = _useState8[1]; var _useState9 = useState(getTargetDate(mode, visibleDate, 'next', maxDate, minDate)), _useState10 = _slicedToArray(_useState9, 2), nextVisibleDate = _useState10[0], changeNextVisibleDate = _useState10[1]; var totalPageDates = fixSliderNumber ? genTotalPageDates(minDate, maxDate, mode, visibleDate, firstDay) : []; var defaultIndex = getSelectedIndex(totalPageDates, visibleDate); var _useState11 = useState(defaultIndex), _useState12 = _slicedToArray(_useState11, 2), currentPage = _useState12[0], changeCurrentPage = _useState12[1]; var _useState13 = useState(false), _useState14 = _slicedToArray(_useState13, 2), showYearPicker = _useState14[0], setYearPickerShow = _useState14[1]; var _useState15 = useState(false), _useState16 = _slicedToArray(_useState15, 2), showTimePicker = _useState16[0], setTimePickerShow = _useState16[1]; var mounted = useRef(false); var sliderRef = /*#__PURE__*/createRef(); var headerRef = /*#__PURE__*/createRef(); var showTimePickerNode = enableTimePicker && mode === 'month' && shape === 'panel' && !needSlider; useImperativeHandle(ref, function () { return { toggleYearPicker: function toggleYearPicker(show) { var _a; (_a = headerRef.current) === null || _a === void 0 ? void 0 : _a.togglePicker(show); } }; }); useEffect(function () { if (!mounted.current) { mounted.current = true; return; } else { changeVisibleDate(genInitVisibleDate(Array.isArray(selectedDate) && selectedDate.length === 0 && ['range', 'multi'].indexOf(shape) > -1 ? minDate : selectedDate)); } }, [getValueString(value), shape]); if (showTimePickerNode && !selectedDate) { selectedDate = new Date(); } var renderContent = function renderContent() { return renderContentWithVisibleDate(visibleDate); }; var renderContentWithVisibleDate = function renderContentWithVisibleDate(visibleD) { var shapeContentMap = { fullscreen: 'fullscreen', range: 'range', multi: 'multi' }; var contentType = shapeContentMap[shape] || 'normal'; return /*#__PURE__*/React.createElement(CalendarContent, { prefix: prefix, selectedDate: selectedDate, visibleDate: visibleD, type: contentType, firstDay: firstDay, mode: _onModeChange ? mode : currentMode, enableTimePicker: showTimePickerNode, onDateChange: function onDateChange(newValue, clickedItem) { if (!onSelect) { return; } if (showTimePickerNode) { var _d = selectedDate ? dayjs(selectedDate) : dayjs(new Date()); var h = _d.hour(); var m = _d.minute(); var s = _d.second(); var newDate = dayjs(newValue).hour(h).minute(m).second(s); onSelect(newDate.toDate()); } else { onSelect(newValue); } }, maxDate: maxDate, minDate: minDate, disabledDate: disabledDate, locale: locale, renderCellBottom: renderCellBottom, renderCellRight: renderCellRight, dateCellRender: dateCellRender, monthCellRender: monthCellRender }); }; var getShapeType = function getShapeType() { var headerType = HeaderType.normal; if (shape === 'fullscreen' || shape === 'card' && mode !== 'week') { headerType = HeaderType.select; } return headerType; }; var renderHeader = function renderHeader() { return /*#__PURE__*/React.createElement(CalendarHeader, { ref: headerRef, prefix: prefix, date: visibleDate, maxDate: maxDate, minDate: minDate, enableYearPicker: enableYearPicker && !needSlider, enableTimePicker: showTimePickerNode, mode: _onModeChange ? mode : currentMode, type: getShapeType(), locale: locale, renderHeadLeft: renderHeadLeft, renderHeadRight: renderHeadRight, onPickerShow: function onPickerShow(show) { setYearPickerShow(show); onYearPickerVisibleChange === null || onYearPickerVisibleChange === void 0 ? void 0 : onYearPickerVisibleChange(show); }, disabledDate: disabledDate, onModeChange: function onModeChange(v) { if (_onModeChange) { _onModeChange(v); return; } changeCurrentMode(v); }, onDateChange: function onDateChange(date, isAdd, changeMode) { if (changeMode === 'picker') { var d = dayjs(date); var y = d.year(); var m = d.month(); var firstDayOfMonth = dayjs("".concat(y, "-").concat(m + 1, "-01")); var day = isValidDate(selectedDate) ? dayjs(selectedDate).date() : 1; if (firstDayOfMonth.daysInMonth() < day) { day = firstDayOfMonth.daysInMonth(); } if (shape !== 'range' && shape !== 'multi') { var sd = dayjs("".concat(y, "-").concat(m + 1, "-").concat(day)); if (isValidArray(validRange)) { if (sd.isAfter(validRange[1])) { sd = dayjs(validRange[1]); } else if (sd.isBefore(validRange[0])) { sd = dayjs(validRange[0]); } } onSelect(sd.toDate()); } changeVisibleDate(date); return; } if (fixSliderNumber) { var sliderIndex = currentPage; if (isAdd) { sliderIndex = sliderIndex + 1; } else { sliderIndex = sliderIndex - 1; } if (sliderIndex >= 0 && sliderIndex <= totalPageDates.length - 1) { sliderRef.current.slideTo(sliderIndex); } return; } changeVisibleDate(date); var newPre; var newCurrent; var newNext; if (isAdd) { newPre = getTargetDate(changeMode, preVisibleDate, 'next', maxDate, minDate); newCurrent = getTargetDate(changeMode, currentVisibleDate, 'next', maxDate, minDate); newNext = getTargetDate(changeMode, nextVisibleDate, 'next', maxDate, minDate); } else { newPre = getTargetDate(changeMode, preVisibleDate, 'pre', maxDate, minDate); newCurrent = getTargetDate(changeMode, currentVisibleDate, 'pre', maxDate, minDate); newNext = getTargetDate(changeMode, nextVisibleDate, 'pre', maxDate, minDate); } changeCurrentVisibleDate(newCurrent); changePreVisibleDate(newPre); changeNextVisibleDate(newNext); } }); }; var genSliderItems = function genSliderItems() { var preItem = /*#__PURE__*/React.createElement(ReactSlider.Item, { key: "Slider.Item.0" }, renderContentWithVisibleDate(preVisibleDate)); var currentItem = /*#__PURE__*/React.createElement(ReactSlider.Item, { key: "Slider.Item.1" }, renderContentWithVisibleDate(currentVisibleDate)); var nextItem = /*#__PURE__*/React.createElement(ReactSlider.Item, { key: "Slider.Item.2" }, renderContentWithVisibleDate(nextVisibleDate)); return [preItem, currentItem, nextItem]; }; var dealSliderChange = function dealSliderChange(oldIndex, newIndex) { if (oldIndex === newIndex) { return; } var newVisible; var newPre = preVisibleDate; var newCurrent = currentVisibleDate; var newNext = nextVisibleDate; if (oldIndex === 2 && newIndex === 0) { newVisible = getTargetDate(mode, visibleDate, 'next', maxDate, minDate); newCurrent = getTargetDate(mode, newVisible, 'next', maxDate, minDate); } else { if (oldIndex === 0 && newIndex === 2) { newVisible = getTargetDate(mode, visibleDate, 'pre', maxDate, minDate); newCurrent = getTargetDate(mode, newVisible, 'pre', maxDate, minDate); } else { if (newIndex > oldIndex) { newVisible = getTargetDate(mode, visibleDate, 'next', maxDate, minDate); if (newIndex === 1) { newNext = getTargetDate(mode, newVisible, 'next', maxDate, minDate); } if (newIndex === 2) { newPre = getTargetDate(mode, newVisible, 'next', maxDate, minDate); } } if (newIndex < oldIndex) { newVisible = getTargetDate(mode, visibleDate, 'pre', maxDate, minDate); if (newIndex === 0) { newNext = getTargetDate(mode, newVisible, 'pre', maxDate, minDate); } if (newIndex === 1) { newPre = getTargetDate(mode, newVisible, 'pre', maxDate, minDate); } } } } changeVisibleDate(newVisible); changeCurrentVisibleDate(newCurrent); changeNextVisibleDate(newNext); changePreVisibleDate(newPre); }; var renderFixSliderContent = function renderFixSliderContent() { var items = []; for (var i = 0; i < totalPageDates.length; i++) { items.push( /*#__PURE__*/React.createElement(ReactSlider.Item, { key: 'Slider.Item.' + 'i' }, renderContentWithVisibleDate(totalPageDates[i]))); } return /*#__PURE__*/React.createElement(ReactSlider, { ref: sliderRef, autoPlay: false, showsPagination: false, index: defaultIndex, loop: false, width: sliderWidth, height: sliderHeight, direction: "horizontal", onChange: function onChange(index) { return changeCurrentPage(index.index); } }, items); }; var renderSliderContent = function renderSliderContent() { if (fixSliderNumber) { return renderFixSliderContent(); } return /*#__PURE__*/React.createElement(ReactSlider, { autoPlay: false, showsPagination: false, index: 1, width: sliderWidth, height: sliderHeight, direction: "horizontal", onChange: function onChange(index) { dealSliderChange(currentPage, index.index); changeCurrentPage(index.index); } }, genSliderItems()); }; var renderCalendar = function renderCalendar() { var s = getShapeType(); if (needSlider && s === 'normal') { return renderSliderContent(); } return renderContent(); }; var handleTimePickerToggle = function handleTimePickerToggle(show) { return setTimePickerShow(show); }; return /*#__PURE__*/React.createElement(View, _extends({ ref: ref }, others, { className: classNames("".concat(prefix, "calendar"), "".concat(prefix, "calendar-").concat(shape), "".concat(prefix, "calendar-").concat(shape, "-").concat(currentMode)) }), !showTimePicker ? renderHeader() : null, !showYearPicker && !showTimePicker ? renderCalendar() : null, showTimePickerNode && !showYearPicker && /*#__PURE__*/React.createElement(CalendarTimePicker, { value: selectedDate, format: timeFormat, label: locale.timePickerLabel, onPickerToggle: handleTimePickerToggle, onChange: function onChange(date) { if (onSelect) { onSelect(date); } } })); }; Calendar.displayName = 'Calendar'; export default /*#__PURE__*/forwardRef(Calendar);