@alifd/meet-react
Version:
Fusion Mobile React UI System Component
418 lines (417 loc) • 18 kB
JavaScript
;
exports.__esModule = true;
exports.default = void 0;
var _tslib = require("tslib");
var _react = _interopRequireWildcard(require("react"));
var _classnames = _interopRequireDefault(require("classnames"));
var _dayjs = _interopRequireDefault(require("dayjs"));
var _meetReactComponentOne = require("@alifd/meet-react-component-one");
var _view = _interopRequireDefault(require("../view"));
var _content = _interopRequireDefault(require("./content"));
var _header = _interopRequireDefault(require("./header"));
var _timePicker = _interopRequireDefault(require("./time-picker"));
var _locale = require("../locale");
var _date = require("../utils/date");
var _types = require("./types");
var _utils = require("./utils");
var _utils2 = require("../utils");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
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); }
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 (0, _date.toDate)(it);
});
}
return (0, _date.toDate)(value);
}
var Calendar = function (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 ? (0, _utils.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 = (0, _tslib.__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 (v) {
if (Array.isArray(v)) {
return v.map(getValueString).join(',');
}
if (v instanceof Date) {
return v.getTime();
}
if (_dayjs.default.isDayjs(v)) {
return v.valueOf();
}
return v;
};
var genInitVisibleDate = function (sValue) {
var date = _utils.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 = (0, _dayjs.default)(date).day(firstDay);
date = new Date(tempDay.valueOf());
}
return (0, _utils.cloneDate)(date);
};
var locale = (0, _locale.useLocale)('Calendar', others, defaultLocale);
var selectedDate = function genInitSelectedDate(sValue, dValue, vShape) {
var tempSDate = sValue || dValue;
if (tempSDate) {
return tempSDate;
}
if (vShape === 'range') {
return [];
}
if (vShape === 'multi') {
return [];
}
return null;
}(formatValue(value), formatValue(defaultValue), shape);
var _getMaxMinDate = (0, _utils.getMaxMinDate)(validRange),
minDate = _getMaxMinDate[0],
maxDate = _getMaxMinDate[1];
var _useState = (0, _react.useState)(mode),
currentMode = _useState[0],
changeCurrentMode = _useState[1];
var _useState2 = (0, _react.useState)(genInitVisibleDate(Array.isArray(selectedDate) && selectedDate.length === 0 && ['range', 'multi'].indexOf(shape) > -1 ? minDate : selectedDate)),
visibleDate = _useState2[0],
changeVisibleDate = _useState2[1];
var _useState3 = (0, _react.useState)((0, _utils.getTargetDate)(mode, visibleDate, 'pre', maxDate, minDate)),
preVisibleDate = _useState3[0],
changePreVisibleDate = _useState3[1];
var _useState4 = (0, _react.useState)(visibleDate),
currentVisibleDate = _useState4[0],
changeCurrentVisibleDate = _useState4[1];
var _useState5 = (0, _react.useState)((0, _utils.getTargetDate)(mode, visibleDate, 'next', maxDate, minDate)),
nextVisibleDate = _useState5[0],
changeNextVisibleDate = _useState5[1];
var totalPageDates = fixSliderNumber ? (0, _utils.genTotalPageDates)(minDate, maxDate, mode, visibleDate, firstDay) : [];
var defaultIndex = (0, _utils.getSelectedIndex)(totalPageDates, visibleDate);
var _useState6 = (0, _react.useState)(defaultIndex),
currentPage = _useState6[0],
changeCurrentPage = _useState6[1];
var _useState7 = (0, _react.useState)(false),
showYearPicker = _useState7[0],
setYearPickerShow = _useState7[1];
var _useState8 = (0, _react.useState)(false),
showTimePicker = _useState8[0],
setTimePickerShow = _useState8[1];
var mounted = (0, _react.useRef)(false);
var sliderRef = /*#__PURE__*/(0, _react.createRef)();
var headerRef = /*#__PURE__*/(0, _react.createRef)();
var showTimePickerNode = enableTimePicker && mode === 'month' && shape === 'panel' && !needSlider;
(0, _react.useImperativeHandle)(ref, function () {
return {
toggleYearPicker: function toggleYearPicker(show) {
var _a;
(_a = headerRef.current) === null || _a === void 0 ? void 0 : _a.togglePicker(show);
}
};
});
(0, _react.useEffect)(function () {
if (!mounted.current) {
mounted.current = true;
} 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 () {
return renderContentWithVisibleDate(visibleDate);
};
var renderContentWithVisibleDate = function (visibleD) {
var contentType = {
fullscreen: 'fullscreen',
range: 'range',
multi: 'multi'
}[shape] || 'normal';
return /*#__PURE__*/(0, _react.createElement)(_content.default, {
prefix: prefix,
selectedDate: selectedDate,
visibleDate: visibleD,
type: contentType,
firstDay: firstDay,
mode: _onModeChange ? mode : currentMode,
enableTimePicker: showTimePickerNode,
onDateChange: function onDateChange(newValue) {
if (!onSelect) {
return;
}
if (showTimePickerNode) {
var _d = selectedDate ? (0, _dayjs.default)(selectedDate) : (0, _dayjs.default)(new Date());
var h = _d.hour();
var m = _d.minute();
var s = _d.second();
var newDate = (0, _dayjs.default)(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 () {
var headerType = _types.HeaderType.normal;
if (shape === 'fullscreen' || shape === 'card' && mode !== 'week') {
headerType = _types.HeaderType.select;
}
return headerType;
};
var genSliderItems = function () {
var preItem = /*#__PURE__*/(0, _react.createElement)(_meetReactComponentOne.Slider.Item, {
key: "Slider.Item.0"
}, renderContentWithVisibleDate(preVisibleDate));
var currentItem = /*#__PURE__*/(0, _react.createElement)(_meetReactComponentOne.Slider.Item, {
key: "Slider.Item.1"
}, renderContentWithVisibleDate(currentVisibleDate));
var nextItem = /*#__PURE__*/(0, _react.createElement)(_meetReactComponentOne.Slider.Item, {
key: "Slider.Item.2"
}, renderContentWithVisibleDate(nextVisibleDate));
return [preItem, currentItem, nextItem];
};
var dealSliderChange = function (oldIndex, newIndex) {
if (oldIndex === newIndex) {
return;
}
var newVisible;
var newPre = preVisibleDate;
var newCurrent = currentVisibleDate;
var newNext = nextVisibleDate;
if (oldIndex === 2 && newIndex === 0) {
newVisible = (0, _utils.getTargetDate)(mode, visibleDate, 'next', maxDate, minDate);
newCurrent = (0, _utils.getTargetDate)(mode, newVisible, 'next', maxDate, minDate);
} else {
if (oldIndex === 0 && newIndex === 2) {
newVisible = (0, _utils.getTargetDate)(mode, visibleDate, 'pre', maxDate, minDate);
newCurrent = (0, _utils.getTargetDate)(mode, newVisible, 'pre', maxDate, minDate);
} else {
if (newIndex > oldIndex) {
newVisible = (0, _utils.getTargetDate)(mode, visibleDate, 'next', maxDate, minDate);
if (newIndex === 1) {
newNext = (0, _utils.getTargetDate)(mode, newVisible, 'next', maxDate, minDate);
}
if (newIndex === 2) {
newPre = (0, _utils.getTargetDate)(mode, newVisible, 'next', maxDate, minDate);
}
}
if (newIndex < oldIndex) {
newVisible = (0, _utils.getTargetDate)(mode, visibleDate, 'pre', maxDate, minDate);
if (newIndex === 0) {
newNext = (0, _utils.getTargetDate)(mode, newVisible, 'pre', maxDate, minDate);
}
if (newIndex === 1) {
newPre = (0, _utils.getTargetDate)(mode, newVisible, 'pre', maxDate, minDate);
}
}
}
}
changeVisibleDate(newVisible);
changeCurrentVisibleDate(newCurrent);
changeNextVisibleDate(newNext);
changePreVisibleDate(newPre);
};
var renderFixSliderContent = function () {
var items = [];
for (var i = 0; i < totalPageDates.length; i++) {
items.push( /*#__PURE__*/(0, _react.createElement)(_meetReactComponentOne.Slider.Item, {
key: 'Slider.Item.' + 'i'
}, renderContentWithVisibleDate(totalPageDates[i])));
}
return /*#__PURE__*/(0, _react.createElement)(_meetReactComponentOne.Slider, {
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 () {
if (fixSliderNumber) {
return renderFixSliderContent();
}
return /*#__PURE__*/(0, _react.createElement)(_meetReactComponentOne.Slider, {
autoPlay: false,
showsPagination: false,
index: 1,
width: sliderWidth,
height: sliderHeight,
direction: "horizontal",
onChange: function onChange(index) {
dealSliderChange(currentPage, index.index);
changeCurrentPage(index.index);
}
}, genSliderItems());
};
return /*#__PURE__*/(0, _react.createElement)(_view.default, _extends({
ref: ref
}, others, {
className: (0, _classnames.default)(prefix + "calendar", prefix + "calendar-" + shape, prefix + "calendar-" + shape + "-" + currentMode)
}), !showTimePicker ? function renderHeader() {
return /*#__PURE__*/(0, _react.createElement)(_header.default, {
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 = (0, _dayjs.default)(date);
var y = d.year();
var m = d.month();
var firstDayOfMonth = (0, _dayjs.default)(y + "-" + (m + 1) + "-01");
var day = (0, _date.isValidDate)(selectedDate) ? (0, _dayjs.default)(selectedDate).date() : 1;
if (firstDayOfMonth.daysInMonth() < day) {
day = firstDayOfMonth.daysInMonth();
}
if (shape !== 'range' && shape !== 'multi') {
var sd = (0, _dayjs.default)(y + "-" + (m + 1) + "-" + day);
if ((0, _utils2.isValidArray)(validRange)) {
if (sd.isAfter(validRange[1])) {
sd = (0, _dayjs.default)(validRange[1]);
} else if (sd.isBefore(validRange[0])) {
sd = (0, _dayjs.default)(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 = (0, _utils.getTargetDate)(changeMode, preVisibleDate, 'next', maxDate, minDate);
newCurrent = (0, _utils.getTargetDate)(changeMode, currentVisibleDate, 'next', maxDate, minDate);
newNext = (0, _utils.getTargetDate)(changeMode, nextVisibleDate, 'next', maxDate, minDate);
} else {
newPre = (0, _utils.getTargetDate)(changeMode, preVisibleDate, 'pre', maxDate, minDate);
newCurrent = (0, _utils.getTargetDate)(changeMode, currentVisibleDate, 'pre', maxDate, minDate);
newNext = (0, _utils.getTargetDate)(changeMode, nextVisibleDate, 'pre', maxDate, minDate);
}
changeCurrentVisibleDate(newCurrent);
changePreVisibleDate(newPre);
changeNextVisibleDate(newNext);
}
});
}() : null, !showYearPicker && !showTimePicker ? function renderCalendar() {
var s = getShapeType();
if (needSlider && s === 'normal') {
return renderSliderContent();
}
return renderContent();
}() : null, showTimePickerNode && !showYearPicker && /*#__PURE__*/(0, _react.createElement)(_timePicker.default, {
value: selectedDate,
format: timeFormat,
label: locale.timePickerLabel,
onPickerToggle: function handleTimePickerToggle(show) {
return setTimePickerShow(show);
},
onChange: function onChange(date) {
if (onSelect) {
onSelect(date);
}
}
}));
};
Calendar.displayName = 'Calendar';
var _default = exports.default = /*#__PURE__*/(0, _react.forwardRef)(Calendar);