UNPKG

ten-design-vue

Version:

ten-vue

718 lines (612 loc) 18.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.addMonth = addMonth; exports.cloneTime = cloneTime; exports.compareTime = compareTime; exports.dateToFormat = dateToFormat; exports.easeout = easeout; exports.firstUpperCase = firstUpperCase; exports.flagActive = flagActive; exports.getDateObj = getDateObj; exports.getFormatInfo = getFormatInfo; exports.getHours = getHours; exports.getMeridiem = getMeridiem; exports.getMintues = getMintues; exports.getMonths = getMonths; exports.getSeconds = getSeconds; exports.getToday = getToday; exports.getWeeks = getWeeks; exports.getYears = getYears; exports.hour12To24 = hour12To24; exports.hour24To12 = hour24To12; exports.isSame = isSame; exports.isSameTime = isSameTime; exports.isSiblingMonth = isSiblingMonth; exports.outOfRanges = outOfRanges; exports.padZero = padZero; exports.parseToDate = parseToDate; exports.setDateTime = setDateTime; exports.subtractMonth = subtractMonth; var _chunk = _interopRequireDefault(require("lodash/chunk")); var _date = _interopRequireDefault(require("../scripts/utils/date")); var _numbers = require("../scripts/utils/numbers"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _extends() { _extends = Object.assign || 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); } /** * 返回指定年、月的第一天日期 * @param {Object} { year, month } * @returns {Date} */ function getFirstDayOfMonth(_ref) { var year = _ref.year, month = _ref.month; return new Date(year, month, 1); } /** * 返回指定年、月的天数 * @param {Object} { year, month } * @returns {Number} */ function getDaysInMonth(_ref2) { var year = _ref2.year, month = _ref2.month; return new Date(year, month + 1, 0).getDate(); } /** * 返回指定年、月的最后一天日期 * @param {Object} { year, month } * @returns {Date} */ function getLastDayOfMonth(_ref3) { var year = _ref3.year, month = _ref3.month; return new Date(year, month, getDaysInMonth({ year: year, month: month })); } function isSameYear(date1, date2) { return date1.getFullYear() === date2.getFullYear(); } function isSameMonth(date1, date2) { return isSameYear(date1, date2) && date1.getMonth() === date2.getMonth(); } function isSameDate(date1, date2) { return isSameMonth(date1, date2) && date1.getDate() === date2.getDate(); } function isSameTimeHour(time1, time2) { return time1.getHours() === time2.getHours(); } function isSameTimeMins(time1, time2) { return isSameTimeHour(time1, time2) && time1.getMinutes() === time2.getMinutes(); } function isSameTimeSecs(time1, time2) { return isSameTimeMins(time1, time2) && time1.getSeconds() === time2.getSeconds(); } /** * 是否是某法范围内的日期,精确到日 * @param {Date} value 目标日期 * @param {Object} { start, end } 范围 * @returns {Boolean} */ function isBetween(value, _ref4) { var start = _ref4.start, end = _ref4.end; var date = new Date(value.getFullYear(), value.getMonth(), value.getDate()); var startTime = new Date(start.getFullYear(), start.getMonth(), start.getDate()); var endTime = new Date(end.getFullYear(), end.getMonth(), end.getDate()); return startTime <= date && endTime >= date; } /** * 比较两个日期对象的时间戳 * @param {Date} date1 日期1 * @param {Date} date2 日期2 * @returns {Number} 返回 date1.getTime() - date2.getTime() 的差值 */ function compareAsc(date1, date2) { var d1 = date1.getTime(); var d2 = date2.getTime(); if (d1 < d2) return -1; if (d1 > d2) return 1; return 0; } /** * 比较两个 Date 的时间部分是否是同一秒 或则 同一分 或则 同一小时 * @param {Date} date1 比较的日期 * @param {Date} date2 比较的日期 * @param {String} type 比较类型,默认比较到『秒』 secs|mins|hour * @returns {Boolean} */ function isSameTime(time1, time2) { var type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'secs'; var func = { isSameTimeHour: isSameTimeHour, isSameTimeMins: isSameTimeMins, isSameTimeSecs: isSameTimeSecs }; return func["isSameTime".concat(firstUpperCase(type))](time1, time2); } /** * 比较两个 Date 是否是同一天 或则 同一月 或则 同一年 * @param {Date} date1 比较的日期 * @param {Date} date2 比较的日期 * @param {String} type 比较类型,默认比较到『日』 date|month|year * @returns {Boolean} */ function isSame(date1, date2) { var type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'date'; var func = { isSameYear: isSameYear, isSameMonth: isSameMonth, isSameDate: isSameDate }; return func["isSame".concat(firstUpperCase(type))](date1, date2); } function outOfRanges(d, min, max) { return min && compareAsc(d, min) === -1 || max && compareAsc(d, max) === 1; } /** * 比较两个 Date 的时间部分,忽略年月日 * @param {Date} time1 日期1 * @param {Date} time2 日期2 * @returns {Number} 返回值:相等0,小于 -1,大于 1 */ function compareTime(time1, time2) { return compareAsc(time1, cloneTime(time2, time1)); } /** * @returns {Date} 当天零点的日期对象 */ function getToday() { return setDateTime(new Date(), 0, 0, 0); } /** * 返回日期对象的年、月、日、小时、分钟、秒、12小时制标识 * @param {Date} date * @returns {Object} */ function getDateObj(date) { if (!(date instanceof Date)) { date = getToday(); } return { year: date.getFullYear(), month: date.getMonth(), date: date.getDate(), hours: date.getHours(), minutes: date.getMinutes(), seconds: date.getSeconds(), meridiem: date.getHours() > 11 ? 'PM' : 'AM' }; } /** * 设置日期对象的时间部分 * @param {Date} d 日期 * @param {Number} hour 小时 * @param {Number} min 分钟 * @param {Number} sec 秒 * @returns {Date} 一个新的date */ function setDateTime(d, hour, min, sec) { var _getDateObj = getDateObj(d), year = _getDateObj.year, month = _getDateObj.month, date = _getDateObj.date; return new Date(year, month, date, hour, min, sec, 0); } /** * 增加月份 * @param {Date} date 起始日期 * @param {Number} num 月份数 * @returns {Date} */ function subtractMonth(date, num) { var day = date.getDate(); var newDate = new Date(date); // eslint-disable-next-line no-plusplus while (num--) { newDate.setDate(0); } newDate.setDate(day); return newDate; } /** * 减月份 * @param {Date} date 起始日期 * @param {Number} num 月份数 * @returns {Date} */ function addMonth(date, num) { if (num < 0) num = 0; var newDate = new Date(date); newDate.setMonth(date.getMonth() + num); return newDate; } /** * 是否为相邻月份 * @param {Date} start 开始日期 * @param {Date} end 结束日期 * @returns {Boolean} */ function isSiblingMonth(start, end) { if (!end) return true; return isSame(addMonth(start, 1), end, 'month'); } /** * 克隆 time1 的时间到 time2 上 * @param {Date} time1 时间目标 * @param {Date} time2 日期目标 * @returns {Date} 返回一个日期部分为 time2,时间部分为 time1 的新日期对象 */ function cloneTime(time1, time2) { var _getDateObj2 = getDateObj(time1), hours = _getDateObj2.hours, minutes = _getDateObj2.minutes, seconds = _getDateObj2.seconds; return setDateTime(time2, hours, minutes, seconds); } function getWeeks(_ref5) { var year = _ref5.year, month = _ref5.month; var _ref6 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, firstDayOfWeek = _ref6.firstDayOfWeek, _ref6$disabledDate = _ref6.disabledDate, disabledDate = _ref6$disabledDate === void 0 ? function () { return false; } : _ref6$disabledDate, minDate = _ref6.minDate, maxDate = _ref6.maxDate; var prependDay = getFirstDayOfMonth({ year: year, month: month }); var appendDay = getLastDayOfMonth({ year: year, month: month }); var maxDays = getDaysInMonth({ year: year, month: month }); var daysArr = []; var i = 1; var today = getToday(); for (i; i <= maxDays; i++) { var currentDay = new Date(year, month, i); daysArr.push({ text: i, active: false, value: currentDay, disabled: disabledDate(currentDay) || outOfRanges(currentDay, minDate, maxDate), now: isSame(today, currentDay), firstDayOfMonth: i === 1, lastDayOfMonth: i === maxDays, type: 'current-month' }); } if (prependDay.getDay() !== firstDayOfWeek) { prependDay.setDate(0); // 上一月 while (true) { // eslint-disable-line daysArr.unshift({ text: prependDay.getDate().toString(), active: false, value: new Date(prependDay), disabled: disabledDate(prependDay) || outOfRanges(prependDay, minDate, maxDate), additional: true, // 非当前月 type: 'prev-month' }); prependDay.setDate(prependDay.getDate() - 1); if (prependDay.getDay() === Math.abs(firstDayOfWeek + 6) % 7) break; } } var LEN = 42; // 显示6周 while (daysArr.length < LEN) { appendDay.setDate(appendDay.getDate() + 1); daysArr.push({ text: appendDay.getDate(), active: false, value: new Date(appendDay), disabled: disabledDate(appendDay) || outOfRanges(appendDay, minDate, maxDate), additional: true, // 非当前月 type: 'next-month' }); } return (0, _chunk.default)(daysArr, 7); } function getYears(year) { var _ref7 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref7$disabledDate = _ref7.disabledDate, disabledDate = _ref7$disabledDate === void 0 ? function () { return false; } : _ref7$disabledDate, minDate = _ref7.minDate, maxDate = _ref7.maxDate; var startYear = parseInt(year / 10, 10) * 10; var endYear = startYear + 9; var yearArr = []; var today = getToday(); for (var i = startYear; i <= endYear; i++) { var date = new Date(i, 1); var disabledMonth = 0; var outOfRangeMonth = 0; for (var j = 0; j < 12; j++) { var d = new Date(i, j); if (disabledDate(d)) disabledMonth += 1; if (outOfRanges(d, minDate, maxDate)) outOfRangeMonth += 1; } yearArr.push({ value: date, now: isSame(date, today, 'year'), disabled: disabledMonth === 12 || outOfRangeMonth === 12, active: false, text: "".concat(date.getFullYear()) }); } return (0, _chunk.default)(yearArr, 3); } function getMonths(year) { var _ref8 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref8$disabledDate = _ref8.disabledDate, disabledDate = _ref8$disabledDate === void 0 ? function () { return false; } : _ref8$disabledDate, minDate = _ref8.minDate, maxDate = _ref8.maxDate; var MonthArr = []; var today = getToday(); for (var i = 0; i <= 11; i++) { var date = new Date(year, i); var disabledDay = 0; var outOfRangeDay = 0; var daysInMonth = getDaysInMonth({ year: year, month: i }); for (var j = 1; j <= daysInMonth; j++) { var d = new Date(year, i, j); if (disabledDate(d)) disabledDay += 1; if (outOfRanges(d, minDate, maxDate)) outOfRangeDay += 1; } MonthArr.push({ value: date, now: isSame(date, today, 'month'), disabled: disabledDay === daysInMonth || outOfRangeDay === daysInMonth, active: false, text: "".concat(date.getMonth() + 1, " \u6708") }); } return (0, _chunk.default)(MonthArr, 3); } function flagActive(data, _ref9) { var args = _extends({}, _ref9); var start = args.start, end = args.end, _args$type = args.type, type = _args$type === void 0 ? 'date' : _args$type; if (!end) { return data.map(function (row) { return row.map(function (item) { item.active = isSame(item.value, start, type); return item; }); }); } return data.map(function (row) { return row.map(function (item) { var date = item.value; var isStart = isSame(start, date, type); var isEnd = isSame(end, date, type); item.active = isStart || isEnd; item.highlight = isBetween(date, { start: start, end: end }); item.startOfRange = isStart; item.endOfRange = isEnd; return item; }); }); } /** * 字符串转 Date 类型 * @param {String} dirtyDate Date string * @param {String} fmt Date parse format * @returns {Date|undefined} */ function parseToDate(dateStr, fmt) { if (!dateStr) return; return _date.default.parse(dateStr, fmt); } /** * Date 转字符串 * @param {Date|null} date Date obj * @param {String} fmt Date format string * @returns {String} */ function dateToFormat(date, fmt) { if (!date) return ''; return _date.default.format(date, fmt); } /** * 解析 format 字符串中 小时、分钟、秒、12小时制标识的类型和位置 * @param {String} format format字符串 * @returns {Object} { hourFormat, minFormat, secFormat, meridiemFormat } */ function getFormatInfo(format) { var hourFormat = format.match(/HH|H|hh|h/) || []; var minFormat = format.match(/mm|m/) || []; var secFormat = format.match(/ss|s/) || []; var meridiemFormat = format.match(/a|A/) || []; return { hourFormat: hourFormat, minFormat: minFormat, secFormat: secFormat, meridiemFormat: meridiemFormat }; } /** * 12小时转24小时 * @param {Number} hour 1~12 * @param {String} meridiem AM|PM * @returns {Number} 0~24 */ function hour12To24(hour, meridiem) { meridiem = meridiem.toUpperCase(); if (meridiem === 'AM') { if (hour === 12) return 0; return hour; } if (hour === 12) return 12; return hour + 12; } /** * 24小时转12小时 * @param {Number} hour 0~24 * @returns {Number} 1~12 */ function hour24To12(hour) { if (hour === 0) return 12; if (hour >= 1 && hour <= 12) return hour; return hour - 12; } function getHours(_ref10, options, selectedValue) { var hourType = _ref10.hourType, meridiem = _ref10.meridiem; var _options$disabledHour = options.disabledHour, disabledHour = _options$disabledHour === void 0 ? function () { return false; } : _options$disabledHour, minH = options.minH; if (hourType === 'h' || hourType === 'hh') { return (0, _numbers.range)(11, 0).map(function (i) { var text = i === 0 ? 12 : i; var hour24 = hour12To24(text, meridiem); return { value: text, text: padZero(text), disabled: disabledHour(hour24) || minH > hour24, selected: hour24To12(selectedValue) === text }; }); } // 默认24小时制 return (0, _numbers.range)(23, 0).map(function (i) { return { value: i, text: padZero(i), disabled: disabledHour(i) || minH > i, selected: selectedValue === i }; }); } function getMintues(hour, options, selectedValue) { var _options$disabledMin = options.disabledMin, disabledMin = _options$disabledMin === void 0 ? function () { return false; } : _options$disabledMin, minH = options.minH, minM = options.minM; return (0, _numbers.range)(59, 0).map(function (i) { return { value: i, text: padZero(i), disabled: disabledMin(hour, i) || hour === minH && minM > i, selected: selectedValue === i }; }); } function getSeconds(_ref11, options, selectedValue) { var hours = _ref11.hours, minutes = _ref11.minutes; var _options$disabledSec = options.disabledSec, disabledSec = _options$disabledSec === void 0 ? function () { return false; } : _options$disabledSec, minH = options.minH, minM = options.minM, minS = options.minS; return (0, _numbers.range)(59, 0).map(function (i) { return { value: i, text: padZero(i), disabled: disabledSec(hours, minutes, i) || hours === minH && minutes === minM && minS > i, selected: selectedValue === i }; }); } function getMeridiem(meridiemType, options, selectedValue) { var _options$disabledHour2 = options.disabledHour, disabledHour = _options$disabledHour2 === void 0 ? function () { return false; } : _options$disabledHour2; var amDisabled = true; var pmDisabled = true; for (var i = 0; i < 12; i++) { if (!disabledHour(i)) amDisabled = false; } for (var _i = 12; _i < 24; _i++) { if (!disabledHour(_i)) pmDisabled = false; } if (meridiemType === 'a') { return ['am', 'pm'].map(function (i) { return { value: i.toUpperCase(), text: i, selected: i === selectedValue.toLowerCase(), disabled: i === 'am' ? amDisabled : pmDisabled }; }); } return ['AM', 'PM'].map(function (i) { return { value: i, text: i, selected: i === selectedValue, disabled: i === 'AM' ? amDisabled : pmDisabled }; }); } /** * 小于 10 的数补零 * @param {Number} num 数 * @returns {String} */ function padZero(num) { return num >= 10 ? num.toString() : "0".concat(num); } /** * 开始一个动画 * @param {Number} A 起始值 * @param {Number} B 目标是 * @param {Number} rate 变化速率 * @param {Function} callback 回调 (curValue, isFinished) 参数为当前移动的位置,是否结束动画 */ function easeout(A, B, rate, callback) { if (A === B || typeof A !== 'number') { return; } B = B || 0; rate = rate || 2; var step = function step() { A += (B - A) / rate; if (Math.abs(A - B) < 1) { callback(B, true); return; } callback(A, false); requestAnimationFrame(step); }; step(); } /** * 首字母大写 * @param {String} str 目标字符串 * @returns {String} */ function firstUpperCase(str) { if (!str) return str; return str[0].toUpperCase().concat(str.substring(1, str.length)); }