UNPKG

@alifd/next

Version:

A configurable component library for web built on React.

296 lines (295 loc) 13.4 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var react_1 = tslib_1.__importDefault(require("react")); var react_lifecycles_compat_1 = require("react-lifecycles-compat"); var classnames_1 = tslib_1.__importDefault(require("classnames")); var prop_types_1 = tslib_1.__importDefault(require("prop-types")); var prop_types_2 = tslib_1.__importDefault(require("../prop-types")); var constant_1 = require("../constant"); var util_1 = require("../../util"); var bindCtx = util_1.func.bindCtx, renderNode = util_1.func.renderNode; var DATE = constant_1.DATE_PANEL_MODE.DATE, WEEK = constant_1.DATE_PANEL_MODE.WEEK, MONTH = constant_1.DATE_PANEL_MODE.MONTH, QUARTER = constant_1.DATE_PANEL_MODE.QUARTER, YEAR = constant_1.DATE_PANEL_MODE.YEAR, DECADE = constant_1.DATE_PANEL_MODE.DECADE; // 面板行数 var mode2Rows = (_a = {}, _a[DATE] = 7, _a[WEEK] = 7, _a[MONTH] = 4, _a[QUARTER] = 4, _a[YEAR] = 4, _a[DECADE] = 3, _a); var DateTable = /** @class */ (function (_super) { tslib_1.__extends(DateTable, _super); function DateTable(props) { var _this = _super.call(this, props) || this; _this.getCustomRender = function (mode) { var _a; var mode2RenderName = (_a = {}, _a[DATE] = 'dateCellRender', _a[QUARTER] = 'quarterCellRender', _a[MONTH] = 'monthCellRender', _a[YEAR] = 'yearCellRender', _a); return _this.props[mode2RenderName[mode]]; }; _this.prefixCls = "".concat(props.prefix, "calendar2"); bindCtx(_this, [ 'getDateCellData', 'getMonthCellData', 'getQuarterCellData', 'getYearCellData', 'getDecadeData', 'handleKeyDown', 'handleSelect', 'handleMouseEnter', 'handleMouseLeave', ]); _this.state = { hoverValue: null, }; return _this; } DateTable.prototype.handleSelect = function (v, e, args) { util_1.func.invoke(this.props, 'onSelect', [v, e, args]); }; DateTable.prototype.handleKeyDown = function (v, e, args) { switch (e.keyCode) { case util_1.KEYCODE.ENTER: this.handleSelect(v, e, args); break; case util_1.KEYCODE.RIGHT: break; } // e.preventDefault(); }; DateTable.prototype.handleMouseEnter = function (v, e, args) { util_1.func.invoke(this.props.cellProps, 'onMouseEnter', [v, e, args]); }; DateTable.prototype.handleMouseLeave = function (v, e, args) { util_1.func.invoke(this.props.cellProps, 'onMouseLeave', [v, e, args]); }; DateTable.prototype.isSame = function (curDate, date, mode) { switch (mode) { case DATE: return curDate.isSame(date, 'day'); case WEEK: return curDate.isSame(date, 'week'); case QUARTER: return curDate.isSame(date, 'quarter'); case MONTH: return curDate.isSame(date, 'month'); case YEAR: return curDate.isSame(date, 'year'); case DECADE: { var curYear = curDate.year(); // @ts-expect-error mode 为 decade 时要求 date 为 dayjs var targetYear = date.year(); return curYear <= targetYear && targetYear < curYear + 10; } } }; /** * 渲染日期面板 * @param cellData - 单元格数据 */ DateTable.prototype.renderCellContent = function (cellData) { var _a; var _this = this; var props = this.props; var mode = props.mode, hoveredState = props.hoveredState, cellClassName = props.cellClassName; var hoverValue = this.state.hoverValue; var cellContent = []; var cellCls = "".concat(this.prefixCls, "-cell"); var now = (0, util_1.datejs)(); var rowLen = mode2Rows[mode]; for (var i = 0; i < cellData.length;) { var children = []; var isCurrentWeek = void 0; var _loop_1 = function (j) { var _b; var _c = cellData[i++], label = _c.label, value = _c.value, key = _c.key, isCurrent = _c.isCurrent; // @ts-expect-error decade/quarter 不能作为 startOf 的参数 var v = value.startOf(mode); var isDisabled = props.disabledDate && props.disabledDate(v, mode); var hoverState = hoverValue && hoveredState && hoveredState(hoverValue); var className_1 = (0, classnames_1.default)(cellCls, tslib_1.__assign((_b = {}, _b["".concat(cellCls, "-current")] = isCurrent, _b["".concat(cellCls, "-today")] = mode === WEEK ? this_1.isSame(value, now, DATE) : this_1.isSame(v, now, mode), _b["".concat(cellCls, "-selected")] = this_1.isSame(v, props.value, mode), _b["".concat(cellCls, "-disabled")] = isDisabled, _b["".concat(cellCls, "-range-hover")] = hoverState, _b), (cellClassName && cellClassName(v)))); var onEvents = null; if (!isDisabled) { onEvents = { onClick: function (e) { return _this.handleSelect(v, e, { isCurrent: isCurrent, label: label }); }, onKeyDown: function (e) { return _this.handleKeyDown(v, e, { isCurrent: isCurrent, label: label }); }, onMouseEnter: function (e) { return _this.handleMouseEnter(v, e, { isCurrent: isCurrent, label: label }); }, onMouseLeave: function (e) { return _this.handleMouseLeave(v, e, { isCurrent: isCurrent, label: label }); }, }; } if (mode === WEEK && j === 0) { var week = v.week(); children.push(react_1.default.createElement("td", { key: "w-".concat(week), className: "".concat(cellCls) }, react_1.default.createElement("div", { className: "".concat(cellCls, "-inner") }, week))); isCurrentWeek = isCurrent; } var customRender = this_1.getCustomRender(mode); children.push(react_1.default.createElement("td", tslib_1.__assign({ key: key, title: key }, onEvents, { className: className_1 }), react_1.default.createElement("div", { className: "".concat(cellCls, "-inner") }, renderNode(customRender, react_1.default.createElement("div", { className: "".concat(cellCls, "-value") }, label), [v])))); }; var this_1 = this; for (var j = 0; j < rowLen; j++) { _loop_1(j); } var className = void 0; if (mode === WEEK) { className = (0, classnames_1.default)("".concat(this.prefixCls, "-week"), (_a = {}, _a["".concat(this.prefixCls, "-week-current")] = isCurrentWeek, _a)); } cellContent.push(react_1.default.createElement("tr", { key: i, className: className }, children)); } return cellContent; }; // 星期几 DateTable.prototype.renderWeekdaysHead = function () { var weekdaysMin = util_1.datejs.weekdaysMin(); var firstDayOfWeek = util_1.datejs.localeData().firstDayOfWeek(); // 默认一周的第一天是周日,否则需要调整 if (firstDayOfWeek !== 0) { weekdaysMin = weekdaysMin .slice(firstDayOfWeek) .concat(weekdaysMin.slice(0, firstDayOfWeek)); } return (react_1.default.createElement("thead", null, react_1.default.createElement("tr", null, this.props.mode === WEEK ? (react_1.default.createElement("th", { className: "".concat(this.prefixCls, "-cell-week") })) : null, weekdaysMin.map(function (d) { return react_1.default.createElement("th", { key: d }, d); })))); }; DateTable.prototype.getDateCellData = function () { var _a = this.props, panelValue = _a.panelValue, colNum = _a.colNum; var firstDayOfMonth = panelValue.clone().startOf('month'); var weekOfFirstDay = firstDayOfMonth.day(); // 当月第一天星期几 var daysOfCurMonth = panelValue.endOf('month').date(); // 当月天数 var firstDayOfWeek = util_1.datejs.localeData().firstDayOfWeek(); // 一周的第一天是星期几 var cellData = []; var preDays = (weekOfFirstDay - firstDayOfWeek + 7) % 7; var nextDays = colNum ? colNum * mode2Rows[DATE] - preDays - daysOfCurMonth : (7 - ((preDays + daysOfCurMonth) % 7)) % 7; // 上个月日期 for (var i = preDays; i > 0; i--) { cellData.push(firstDayOfMonth.clone().subtract(i, 'day')); } // 本月日期 for (var i = 0; i < daysOfCurMonth; i++) { cellData.push(firstDayOfMonth.clone().add(i, 'day')); } // 下个月日期 for (var i = 0; i < nextDays; i++) { cellData.push(firstDayOfMonth.clone().add(daysOfCurMonth + i, 'day')); } return cellData.map(function (value) { return { value: value, label: value.date(), isCurrent: value.isSame(firstDayOfMonth, 'month'), key: value.format('YYYY-MM-DD'), }; }); }; DateTable.prototype.getMonthCellData = function () { var panelValue = this.props.panelValue; return util_1.datejs.monthsShort().map(function (label, index) { var value = panelValue.clone().month(index); return { label: label, value: value, isCurrent: true, key: value.format('YYYY-MM'), }; }); }; DateTable.prototype.getQuarterCellData = function () { var panelValue = this.props.panelValue; return [1, 2, 3, 4].map(function (i) { return { label: "Q".concat(i), value: panelValue.clone().quarter(i), isCurrent: true, key: "Q".concat(i), }; }); }; DateTable.prototype.getYearCellData = function () { var panelValue = this.props.panelValue; var curYear = panelValue.year(); var startYear = curYear - (curYear % 10) - 1; var cellData = []; for (var i = 0; i < 12; i++) { var y = startYear + i; cellData.push({ value: panelValue.clone().year(y), label: y, isCurrent: i > 0 && i < 11, key: y, }); } return cellData; }; DateTable.prototype.getDecadeData = function () { var panelValue = this.props.panelValue; var curYear = panelValue.year(); var startYear = curYear - (curYear % 100) - 10; var cellData = []; for (var i = 0; i < 12; i++) { var y = startYear + i * 10; cellData.push({ value: panelValue.clone().year(y), label: "".concat(y, "-").concat(y + 9), isCurrent: i > 0 && i < 11, key: "".concat(y, "-").concat(y + 9), }); } return cellData; }; DateTable.prototype.render = function () { var _a; var mode = this.props.mode; var mode2Data = (_a = {}, _a[DATE] = this.getDateCellData, _a[WEEK] = this.getDateCellData, _a[MONTH] = this.getMonthCellData, _a[QUARTER] = this.getQuarterCellData, _a[YEAR] = this.getYearCellData, _a[DECADE] = this.getDecadeData, _a); return (react_1.default.createElement("table", { className: "".concat(this.prefixCls, "-table ").concat(this.prefixCls, "-table-").concat(mode) }, [DATE, WEEK].includes(mode) ? this.renderWeekdaysHead() : null, react_1.default.createElement("tbody", null, this.renderCellContent(mode2Data[mode]())))); }; DateTable.propTypes = { mode: prop_types_2.default.panelMode, value: prop_types_2.default.date, panelValue: prop_types_2.default.date, dateCellRender: prop_types_1.default.func, quarterCellRender: prop_types_1.default.func, monthCellRender: prop_types_1.default.func, yearCellRender: prop_types_1.default.func, disabledDate: prop_types_1.default.func, hoveredState: prop_types_1.default.func, onSelect: prop_types_1.default.func, cellClassName: prop_types_1.default.oneOfType([prop_types_1.default.func, prop_types_1.default.string]), colNum: prop_types_1.default.number, cellProps: prop_types_1.default.object, }; return DateTable; }(react_1.default.Component)); exports.default = (0, react_lifecycles_compat_1.polyfill)(DateTable);