UNPKG

fastlion-amis

Version:

一种MIS页面生成工具

366 lines (365 loc) 21.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CustomDaysView = void 0; var tslib_1 = require("tslib"); var moment_1 = (0, tslib_1.__importDefault)(require("moment")); // @ts-ignore var DaysView_1 = (0, tslib_1.__importDefault)(require("react-datetime/src/DaysView")); var react_1 = (0, tslib_1.__importDefault)(require("react")); var downshift_1 = (0, tslib_1.__importDefault)(require("downshift")); var find_1 = (0, tslib_1.__importDefault)(require("lodash/find")); var locale_1 = require("../../locale"); var helper_1 = require("../../utils/helper"); var Picker_1 = (0, tslib_1.__importDefault)(require("../Picker")); var lodash_1 = require("lodash"); var CustomDaysView = /** @class */ (function (_super) { (0, tslib_1.__extends)(CustomDaysView, _super); function CustomDaysView(props) { var _this = _super.call(this, props) || this; _this.timeConstraints = { hours: { min: 0, max: 23, step: 1 }, minutes: { min: 0, max: 59, step: 1 }, seconds: { min: 0, max: 59, step: 1 }, milliseconds: { min: 0, max: 999, step: 1 } }; _this.updateSelectedDate = function (event) { // need confirm if (_this.props.requiredConfirm) { var viewDate = _this.props.viewDate.clone(); var currentDate = _this.props.selectedDate || viewDate; var target = event.target; var modifier = 0; if (~target.className.indexOf('rdtNew')) { modifier = 1; } if (~target.className.indexOf('rdtOld')) { modifier = -1; } viewDate .month(viewDate.month() + modifier) .date(parseInt(target.getAttribute('data-value'), 10)) .hours(currentDate.hours()) .minutes(currentDate.minutes()) .seconds(currentDate.seconds()) .milliseconds(currentDate.milliseconds()); _this.props.setDateTimeState({ viewDate: viewDate, selectedDate: viewDate.clone() }); return; } _this.props.updateSelectedDate(event, true); }; _this.setupTime = function (date, timeFormat, mode) { var formatMap = { hours: 'HH', minutes: 'mm', seconds: 'ss' }; timeFormat.split(':').forEach(function (format, i) { var type = /h/i.test(format) ? 'hours' : /m/.test(format) ? 'minutes' : /s/.test(format) ? 'seconds' : ''; if (type) { _this.scrollToTop(type, parseInt(date.format(formatMap[type]), 10), i, mode); } }); }; _this.setTime = function (type, value) { var date = (_this.props.selectedDate || _this.props.viewDate).clone(); date[type](value); _this.props.setDateTimeState({ viewDate: date.clone(), selectedDate: date.clone() }); if (!_this.props.requiredConfirm) { _this.props.onChange(date); } }; _this.showTime = function () { var _a = _this.props, selectedDate = _a.selectedDate, viewDate = _a.viewDate, timeFormat = _a.timeFormat; return (react_1.default.createElement("div", { key: "stb", className: "rdtShowTime" }, (selectedDate || viewDate || (0, moment_1.default)()).format(timeFormat))); }; _this.scrollToTop = function (type, value, i, label) { var _a, _b; var elf = document.getElementById(_this.state.uniqueTag + "-" + i + "-input"); var _c = _this.timeConstraints[type], min = _c.min, step = _c.step; var offset = (value - min) / step; var height = 28; /** 单个选项的高度 */ (_b = (_a = elf === null || elf === void 0 ? void 0 : elf.parentNode) === null || _a === void 0 ? void 0 : _a.scrollTo) === null || _b === void 0 ? void 0 : _b.call(_a, { top: offset * height, behavior: label === 'init' ? 'auto' : 'smooth' }); }; _this.confirm = function () { var _a, _b, _c; var date = (_this.props.selectedDate || _this.props.viewDate).clone(); // 如果 minDate 是可用的,且比当前日期晚,则用 minDate if (((_a = _this.props.minDate) === null || _a === void 0 ? void 0 : _a.isValid()) && ((_b = _this.props.minDate) === null || _b === void 0 ? void 0 : _b.isAfter(date))) { date = _this.props.minDate.clone(); } _this.props.setDateTimeState({ selectedDate: date }); _this.props.numerical && ((_c = _this.props) === null || _c === void 0 ? void 0 : _c.numerical()); _this.props.onChange(date); _this.props.onClose && _this.props.onClose(); }; _this.cancel = function () { _this.props.onClose && _this.props.onClose(); }; _this.renderDay = function (props, currentDate) { if (_this.props.schedules) { var schedule_1 = []; _this.props.schedules.forEach(function (item) { if (currentDate.isSameOrAfter((0, moment_1.default)(item.startTime).subtract(1, 'days')) && currentDate.isSameOrBefore(item.endTime)) { schedule_1.push(item); } }); if (schedule_1.length > 0) { var cx_1 = _this.props.classnames; var __ = _this.props.translate; // 日程数据 var scheduleData_1 = { scheduleData: schedule_1.map(function (item) { return (0, tslib_1.__assign)((0, tslib_1.__assign)({}, item), { time: (0, moment_1.default)(item.startTime).format('YYYY-MM-DD HH:mm:ss') + ' - ' + (0, moment_1.default)(item.endTime).format('YYYY-MM-DD HH:mm:ss') }); }), currentDate: currentDate }; // 放大模式 if (_this.props.largeMode) { var showSchedule_1 = []; for (var i = 0; i < schedule_1.length; i++) { if (showSchedule_1.length > 3) { break; } if ((0, moment_1.default)(schedule_1[i].startTime).isSame(currentDate, 'day')) { showSchedule_1.push(schedule_1[i]); } else if (currentDate.weekday() === 0) { // 周一重新设置日程 showSchedule_1.push((0, tslib_1.__assign)((0, tslib_1.__assign)({}, schedule_1[i]), { width: (0, moment_1.default)(schedule_1[i].endTime).date() - currentDate.date() })); } } [0, 1, 2].forEach(function (i) { var findSchedule = (0, find_1.default)(schedule_1, function (item) { return item.height === i; }); if (findSchedule && findSchedule !== showSchedule_1[i] && currentDate.weekday() !== 0) { // 生成一个空白格占位 showSchedule_1.splice(i, 0, { width: 1, className: 'bg-transparent', content: '' }); } else { showSchedule_1[i] && (showSchedule_1[i].height = i); } }); // 最多展示3个 showSchedule_1 = showSchedule_1.slice(0, 3); var scheduleDiv = showSchedule_1.map(function (item, index) { var width = item.width || Math.min((0, moment_1.default)(item.endTime).diff((0, moment_1.default)(item.startTime), 'days') + 1, 7 - (0, moment_1.default)(item.startTime).weekday()); return (react_1.default.createElement("div", { key: props.key + 'content' + index, className: cx_1('ScheduleCalendar-large-schedule-content', item.className), style: { width: width + '00%' }, onClick: function () { return _this.props.onScheduleClick && _this.props.onScheduleClick(scheduleData_1); } }, react_1.default.createElement("div", { className: cx_1('ScheduleCalendar-text-overflow') }, item.content))); }); return (react_1.default.createElement("td", (0, tslib_1.__assign)({}, props), react_1.default.createElement("div", { className: cx_1('ScheduleCalendar-large-day-wrap') }, react_1.default.createElement("div", { className: cx_1('ScheduleCalendar-large-schedule-header') }, currentDate.date()), scheduleDiv, schedule_1.length > 3 && (react_1.default.createElement("div", { className: cx_1('ScheduleCalendar-large-schedule-footer') }, schedule_1.length - 3, " ", __('More')))))); } // 正常模式 var ScheduleIcon = (react_1.default.createElement("span", { className: cx_1('ScheduleCalendar-icon', schedule_1[0].className), onClick: function () { return _this.props.onScheduleClick && _this.props.onScheduleClick(scheduleData_1); } })); return (react_1.default.createElement("td", (0, tslib_1.__assign)({}, props), currentDate.date(), ScheduleIcon)); } } return react_1.default.createElement("td", (0, tslib_1.__assign)({}, props), currentDate.date()); }; _this.renderTimes = function () { var _a = _this.props, timeFormat = _a.timeFormat, selectedDate = _a.selectedDate, viewDate = _a.viewDate, isEndDate = _a.isEndDate, cx = _a.classnames, initial = _a.initial, isInitial = _a.isInitial; var date = selectedDate || (isEndDate ? viewDate.endOf('day') : viewDate); var inputs = []; timeFormat.split(':').forEach(function (format, i) { var type = /h/i.test(format) ? 'hours' : /m/.test(format) ? 'minutes' : /s/.test(format) ? 'seconds' : ''; if (type) { var options_1 = _this.computedTimeOptions(type); var formatMap_1 = { hours: 'HH', minutes: 'mm', seconds: 'ss' }; inputs.push(react_1.default.createElement(downshift_1.default, { key: i + 'input', inputValue: date.format(formatMap_1[type]) }, function (_a) { var closeMenu = _a.closeMenu; return (react_1.default.createElement("div", { className: cx('CalendarInputWrapper', 'CalendarInputWrapperMT') }, react_1.default.createElement("div", { className: cx('CalendarInput-sugs', type === 'hours' ? 'CalendarInput-sugsHours' : 'CalendarInput-sugsTimes'), id: _this.state.uniqueTag + "-" + i + "-input" }, options_1.map(function (option) { return (react_1.default.createElement("div", { key: option.value, className: cx('CalendarInput-sugsItem', { 'is-highlight': option.value === date.format(formatMap_1[type]) }), onClick: function () { _this.setTime(type, parseInt(option.value, 10)); _this.scrollToTop(type, parseInt(option.value, 10), i); closeMenu(); } }, option.value)); })))); })); inputs.push(react_1.default.createElement("span", { key: i + 'divider' })); } }); inputs.length && inputs.pop(); return (react_1.default.createElement("div", { className: cx('CalendarTimesWrapper') }, _this.showTime(), react_1.default.createElement("div", { className: cx('CalendarInputsWrapper') }, inputs))); }; _this.renderFooter = function () { var _a = _this.props, __ = _a.translate, cx = _a.classnames; return (react_1.default.createElement("tfoot", { key: "tf" }, react_1.default.createElement("tr", null, react_1.default.createElement("td", { colSpan: 7 }, _this.props.requiredConfirm ? (react_1.default.createElement("div", { key: "button", className: "rdtActions" }, react_1.default.createElement("a", { className: cx('Button', 'Button--default'), onClick: _this.cancel }, __('cancel')), react_1.default.createElement("a", { className: cx('Button', 'Button--primary', 'm-l-sm'), onClick: _this.confirm }, __('confirm')))) : null)))); }; _this.onPickerConfirm = function (value, isHandleChange) { _this.props.onConfirm && _this.props.onConfirm(value, _this.state.types, isHandleChange); }; _this.onPickerChange = function (value, index) { var _a = _this.props, selectedDate = _a.selectedDate, viewDate = _a.viewDate; // 变更年份、月份的时候,需要更新columns if (index === 1 || index === 0) { var currentDate = (selectedDate || viewDate || (0, moment_1.default)()).clone(); // 只需计算year 、month var selectDate = (0, helper_1.convertArrayValueToMoment)(value, ['year', 'month'], currentDate); var dateBoundary = _this.props.getDateBoundary(selectDate); _this.setState({ columns: _this.props.getColumns(_this.state.types, dateBoundary), pickerValue: value }); } }; _this.renderPicker = function () { var _a = _this.props, __ = _a.translate, type = _a.type; var title = _this.state.types.length > 3 ? __('Date.titleTime') : __('Date.titleDate'); return (react_1.default.createElement(Picker_1.default, { translate: _this.props.translate, locale: _this.props.locale, title: title, columns: _this.state.columns, value: _this.state.pickerValue, onChange: _this.onPickerChange, onConfirm: _this.onPickerConfirm, onClose: _this.cancel, footer: true, type: type })); }; var selectedDate = props.selectedDate, viewDate = props.viewDate, timeFormat = props.timeFormat; var currentDate = (selectedDate || viewDate || (0, moment_1.default)()); var types = ['year', 'month', 'date']; timeFormat.split(':').forEach(function (format) { var type = /h/i.test(format) ? 'hours' : /m/.test(format) ? 'minutes' : /s/.test(format) ? 'seconds' : ''; type && types.push(type); }); var dateBoundary = _this.props.getDateBoundary(currentDate); var columns = _this.props.getColumns(types, dateBoundary); _this.state = { columns: columns, types: types, pickerValue: currentDate.toArray(), initial: 0, uniqueTag: new Date().valueOf() }; if (_this.props.timeConstraints) { _this.timeConstraints = (0, lodash_1.merge)(_this.timeConstraints, props.timeConstraints); } return _this; } CustomDaysView.prototype.componentDidMount = function () { var _a = this.props, timeFormat = _a.timeFormat, selectedDate = _a.selectedDate, viewDate = _a.viewDate, isEndDate = _a.isEndDate; var date = selectedDate || (isEndDate ? viewDate.endOf('day') : viewDate); this.setupTime(date, timeFormat, 'init'); }; /** 时间选择器数据源 */ CustomDaysView.prototype.computedTimeOptions = function (timeScale) { var _a; var _b = (_a = this.timeConstraints) === null || _a === void 0 ? void 0 : _a[timeScale], min = _b.min, max = _b.max, step = _b.step; return Array.from({ length: max - min + 1 }, function (item, index) { var value = (index + min) .toString() .padStart(timeScale !== 'milliseconds' ? 2 : 3, '0'); return index % step === 0 ? { label: value, value: value } : undefined; }).filter(function (item) { return !!item; }); }; CustomDaysView.prototype.render = function () { var _a = this.props, date = _a.viewDate, useMobileUI = _a.useMobileUI, embed = _a.embed, timeFormat = _a.timeFormat, requiredConfirm = _a.requiredConfirm; var locale = date.localeData(); var __ = this.props.translate; if ((0, helper_1.isMobile)() && useMobileUI && !embed) { return (react_1.default.createElement("div", { className: "rdtYears" }, this.renderPicker())); } var tableChildren = [ this.props.hideHeader ? null : react_1.default.createElement("thead", { key: "th" }, react_1.default.createElement("tr", null, react_1.default.createElement("th", { colSpan: 7 }, react_1.default.createElement("div", { className: "rdtHeader" }, react_1.default.createElement("a", { className: "rdtPrev", onClick: this.props.subtractTime(1, 'years') }, "\u00AB"), react_1.default.createElement("a", { className: "rdtPrev", onClick: this.props.subtractTime(1, 'months') }, "\u2039"), react_1.default.createElement("div", { className: "rdtCenter" }, react_1.default.createElement("a", { className: "rdtSwitch", onClick: this.props.showView('years') }, date.format(__('dateformat.year'))), react_1.default.createElement("a", { className: "rdtSwitch", onClick: this.props.showView('months') }, date.format(__('MMM')))), react_1.default.createElement("a", { className: "rdtNext", onClick: this.props.addTime(1, 'months') }, "\u203A"), react_1.default.createElement("a", { className: "rdtNext", onClick: this.props.addTime(1, 'years') }, "\u00BB")), react_1.default.createElement("div", { className: "header-line" }))), react_1.default.createElement("tr", null, this.getDaysOfWeek(locale).map(function (day, index) { return (react_1.default.createElement("th", { key: day + index, className: "dow" }, day)); }))), react_1.default.createElement("tbody", { key: "tb" }, this.renderDays()) ]; return (react_1.default.createElement(react_1.default.Fragment, null, react_1.default.createElement("div", { className: timeFormat ? 'rdtDays' : '' }, react_1.default.createElement("table", { className: timeFormat ? 'rdtDaysPart' : '' }, tableChildren), timeFormat ? (react_1.default.createElement("div", { className: timeFormat.toLowerCase().indexOf('s') > 0 ? 'rdtTimePartWithS' : 'rdtTimePart' }, this.renderTimes())) : null), !!requiredConfirm && react_1.default.createElement("table", { className: 'footer' }, this.renderFooter()))); }; return CustomDaysView; }(DaysView_1.default)); exports.CustomDaysView = CustomDaysView; exports.default = (0, locale_1.localeable)(CustomDaysView); //# sourceMappingURL=./components/calendar/DaysView.js.map