ten-design-vue
Version:
ten-vue
718 lines (612 loc) • 18.3 kB
JavaScript
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));
}
;