UNPKG

dareway-rui

Version:

454 lines (374 loc) 14.3 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); exports.formatDateTime = formatDateTime; exports.normalizeInput = normalizeInput; exports.setCursor = setCursor; exports.isEmptyDate = isEmptyDate; exports.validDateTime = validDateTime; var DEFAULT_LEAST_YEAR = '0000'; var DEFAULT_MAX_YEAR = '9999'; var NUMBER_CHAR = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']; var DECOLLATOR_CHAR = [':', '-', '/', ' ']; function replaceString(objString, sourceString, reString) { if ( objString == null || objString.length == 0 || sourceString == null || sourceString.length == 0 || objString.search(sourceString) < 0 ) { return objString; } var frontStr = objString.substr(0, objString.search(sourceString)); var lastStr = objString.substr(objString.search(sourceString) + sourceString.length); return (frontStr || '') + (reString || '') + (lastStr || ''); } function getZero(zeroLength) { if (zeroLength == null || zeroLength == 0) { return ''; } var temp = ''; for (var i = 0; i < zeroLength; i++) { temp += '0'; } return temp; } function isNumber(char) { return NUMBER_CHAR.find(function(c) { return c === char; }); } function isDecollator(char) { return DECOLLATOR_CHAR.find(function(c) { return c === char; }); } function isValidChar(char) { return isNumber(char) || isDecollator(char); } function formatDateTime(mask, dateTimeString) { var autoConvertMonthAndDay = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; var yearIndex = mask.search('yyyy'); var monthIndex = mask.search('MM'); var dayIndex = mask.search('dd'); var hourIndex = mask.search('hh'); var minuteIndex = mask.search('mm'); var secondIndex = mask.search('ss'); // 输入日期字符串与当前格式不吻合,矫正. if (dateTimeString == null || dateTimeString.length == 0 || dateTimeString.length != mask.length) { dateTimeString = getZero(mask.length); } var result = mask; var yearString = ''; var monthString = ''; var dayString = ''; var hourString = ''; var minuteString = ''; var secondString = ''; if (yearIndex >= 0) { var year = Number(dateTimeString.substr(yearIndex, 4)); if (isNaN(year) || year < Number(DEFAULT_LEAST_YEAR)) { yearString = DEFAULT_LEAST_YEAR.toString(); } else if (year > Number(DEFAULT_MAX_YEAR)) { yearString = DEFAULT_MAX_YEAR.toString(); } else { yearString = year.toString(); } if (yearString.length < 4) { yearString = getZero(4 - yearString.length) + yearString; } result = replaceString(result, 'yyyy', yearString); } if (monthIndex >= 0) { var month = Number(dateTimeString.substr(monthIndex, 2)); if (isNaN(month) || month > 12 || month <= 0) { // 原来是day>12, 但当 "03"->"12" 修改时,中间结果"13"会引发校验失败,结果变为02 if (autoConvertMonthAndDay && yearString != '0000') { monthString = '01'; } else { monthString = '00'; } } else { monthString = month.toString(); } if (monthString.length < 2) { monthString = getZero(2 - monthString.length) + monthString; } result = replaceString(result, 'MM', monthString); } if (dayIndex >= 0) { var day = Number(dateTimeString.substr(dayIndex, 2)); if (isNaN(day) || day > 31 || day <= 0) { // 原来是day>31, 但当 "16"->"31" 修改时,中间结果"35"会引发校验失败,结果变为31 if (autoConvertMonthAndDay && yearString != '0000' && monthString != '00') { dayString = '01'; } else { dayString = '00'; } } else { dayString = day.toString(); } if (dayString.length < 2) { dayString = getZero(2 - dayString.length) + dayString; } result = replaceString(result, 'dd', dayString); } if (hourIndex >= 0) { var hour = Number(dateTimeString.substr(hourIndex, 2)); if (isNaN(hour) || hour > 23 || hour <= 0) { hourString = '00'; } else { hourString = hour.toString(); } if (hourString.length < 2) { hourString = getZero(2 - hourString.length) + hourString; } result = replaceString(result, 'hh', hourString); } if (minuteIndex >= 0) { var minute = Number(dateTimeString.substr(minuteIndex, 2)); if (isNaN(minute) || minute > 59 || minute <= 0) { minuteString = '00'; } else { minuteString = minute.toString(); } if (minuteString.length < 2) { minuteString = getZero(2 - minuteString.length) + minuteString; } result = replaceString(result, 'mm', minuteString); } if (secondIndex >= 0) { var second = Number(dateTimeString.substr(secondIndex, 2)); if (isNaN(second) || second > 59 || second <= 0) { secondString = '00'; } else { secondString = second.toString(); } if (secondString.length < 2) { secondString = getZero(2 - secondString.length) + secondString; } result = replaceString(result, 'ss', secondString); } return result; } function normalizeInput(mask, oldValue, newValue, cursorPosAfterChange) { // 修改前、修改后的数据,分解为数组 var valArr = Array.prototype.slice.call(oldValue); var newValArr = Array.prototype.slice.call(newValue); if (newValArr.length > valArr.length) { // ----------------------------录入 var cursorPosBeforeChange = cursorPosAfterChange - 1; // 限制录入的最大长度 if (cursorPosBeforeChange >= mask.length) { return; } // 取录入的字符 var charTypedIn = newValArr[cursorPosBeforeChange]; if (!isValidChar(charTypedIn)) { // 錄入非法字符,保持光標位置不變 return { value: oldValue, cursorPos: cursorPosBeforeChange }; } else if (isDecollator(charTypedIn)) { // 分隔符 // 取原始数据光标处的字符 var valCursorPosChar = valArr[cursorPosBeforeChange]; var newCursorPos = null; if (isDecollator(valCursorPosChar)) { // 若原始光标位置也是分隔符,直接移动光标跳过 newCursorPos = cursorPosBeforeChange + 1; } else { // 保持不动 newCursorPos = cursorPosBeforeChange; } return { value: oldValue, cursorPos: newCursorPos }; } else { // 取原始数据光标处的字符 var _valCursorPosChar = valArr[cursorPosBeforeChange]; var _newCursorPos = null; var _newValue = null; if (isDecollator(_valCursorPosChar)) { // 这里跳过分隔符,替换下一个元素 valArr[cursorPosBeforeChange + 1] = charTypedIn; // 光标前移2个单位 _newValue = formatDateTime(mask, valArr.join('')); _newCursorPos = cursorPosBeforeChange + 2; } else { // 直接替换 valArr[cursorPosBeforeChange] = charTypedIn; // 光标前移1个单位 _newValue = formatDateTime(mask, valArr.join('')); _newCursorPos = cursorPosBeforeChange + 1; } return { value: _newValue, cursorPos: _newCursorPos }; } } else if (newValArr.length < valArr.length) { // ----------------------------删除 var deletedCharNums = valArr.length - newValArr.length; var charBeginPosToDelete = cursorPosAfterChange; for (var i = 0; i < deletedCharNums; i++) { valArr[charBeginPosToDelete + i] = '0'; } var _newValue2 = formatDateTime(mask, valArr.join(''), false); return { value: _newValue2, cursorPos: charBeginPosToDelete }; } else { // ----------------------------修改 console.log('理论上只有 insert 模式会走到这个分支...'); } } function setCursor(ele, cursorPos) { ele.focus(); ele.setSelectionRange(cursorPos, cursorPos); } function isEmptyDate(mask, eleValue) { validDateTime(mask, eleValue); var yearIndex = mask.search('yyyy'); var monthIndex = mask.search('MM'); var dayIndex = mask.search('dd'); var hourIndex = mask.search('hh'); var minuteIndex = mask.search('mm'); var secondIndex = mask.search('ss'); var year = 0, month = 0, day = 0, hour = 0, minute = 0, second = 0; if (yearIndex >= 0) { year = new Number(eleValue.substr(yearIndex, 4)); } if (monthIndex >= 0) { month = new Number(eleValue.substr(monthIndex, 2)); } if (dayIndex >= 0) { day = new Number(eleValue.substr(dayIndex, 2)); } if (hourIndex >= 0) { hour = new Number(eleValue.substr(hourIndex, 2)); } if (minuteIndex >= 0) { minute = new Number(eleValue.substr(minuteIndex, 2)); } if (secondIndex >= 0) { second = new Number(eleValue.substr(secondIndex, 2)); } if (year == 0 && month == 0 && day == 0 && hour == 0 && minute == 0 && second == 0) { return true; } return false; } function validDateTime(mask, eleValue) { if (eleValue.length > mask.length) { throw new Error( '\u5F53\u524D\u5F55\u5165\u503C\u3010' .concat(eleValue, '\u3011\u4E0E mask\u3010') .concat(mask, '\u3011\u4E0D\u5339\u914D\uFF0C\u8BF7\u68C0\u67E5\uFF01') ); } var yearIndex = mask.search('yyyy'); var monthIndex = mask.search('MM'); var dayIndex = mask.search('dd'); var hourIndex = mask.search('hh'); var minuteIndex = mask.search('mm'); var secondIndex = mask.search('ss'); var year = 0, month = 0, day = 0, hour = 0, minute = 0, second = 0; if (yearIndex >= 0) { year = new Number(eleValue.substr(yearIndex, 4)); } if (monthIndex >= 0) { month = new Number(eleValue.substr(monthIndex, 2)); } if (dayIndex >= 0) { day = new Number(eleValue.substr(dayIndex, 2)); } if (hourIndex >= 0) { hour = new Number(eleValue.substr(hourIndex, 2)); } if (minuteIndex >= 0) { minute = new Number(eleValue.substr(minuteIndex, 2)); } if (secondIndex >= 0) { second = new Number(eleValue.substr(secondIndex, 2)); } if (year == 0 && month == 0 && day == 0 && hour == 0 && minute == 0 && second == 0) { return; } if ( yearIndex >= 0 && (isNaN(year) || year == 0 || year < Number(DEFAULT_LEAST_YEAR) || year > Number(DEFAULT_MAX_YEAR)) ) { throw new Error( '\u5F53\u524D\u5F55\u5165\u503C\u3010' .concat(eleValue, '\u3011\u7684\u5E74\u3010') .concat(eleValue.substr(yearIndex, 4), '\u3011\u4E0D\u6B63\u786E\uFF0C\u8BF7\u68C0\u67E5\uFF01') ); } if (monthIndex >= 0 && (isNaN(month) || month <= 0 || month > 12)) { throw new Error( '\u5F53\u524D\u5F55\u5165\u503C\u3010' .concat(eleValue, '\u3011\u7684\u6708\u3010') .concat(eleValue.substr(monthIndex, 2), '\u3011\u4E0D\u6B63\u786E\uFF0C\u8BF7\u68C0\u67E5\uFF01') ); } if (dayIndex >= 0 && (isNaN(day) || day <= 0 || day > 31)) { throw new Error( '\u5F53\u524D\u5F55\u5165\u503C\u3010' .concat(eleValue, '\u3011\u7684\u65E5\u3010') .concat(eleValue.substr(dayIndex, 2), '\u3011\u4E0D\u6B63\u786E\uFF0C\u8BF7\u68C0\u67E5\uFF01') ); } if (hourIndex >= 0 && (isNaN(hour) || hour < 0 || hour > 23)) { throw new Error( '\u5F53\u524D\u5F55\u5165\u503C\u3010' .concat(eleValue, '\u3011\u7684\u65F6\u3010') .concat(eleValue.substr(hourIndex, 2), '\u3011\u4E0D\u6B63\u786E\uFF0C\u8BF7\u68C0\u67E5\uFF01') ); } if (minuteIndex >= 0 && (isNaN(minute) || minute < 0 || minute > 59)) { throw new Error( '\u5F53\u524D\u5F55\u5165\u503C\u3010' .concat(eleValue, '\u3011\u7684\u5206\u3010') .concat(eleValue.substr(minuteIndex, 2), '\u3011\u4E0D\u6B63\u786E\uFF0C\u8BF7\u68C0\u67E5\uFF01') ); } if (secondIndex >= 0 && (isNaN(second) || second < 0 || second > 59)) { throw new Error( '\u5F53\u524D\u5F55\u5165\u503C\u3010' .concat(eleValue, '\u3011\u7684\u79D2\u3010') .concat(eleValue.substr(secondIndex, 2), '\u3011\u4E0D\u6B63\u786E\uFF0C\u8BF7\u68C0\u67E5\uFF01') ); } //增加对每月日期合法性的判断 2005-03-21 if (day > 28 && day < 31) { if (month == 2) { if (day != 29) { throw new Error(year + '年' + month + '月无' + day + '日,请检查!'); } else { if (year % 4 != 0) { throw new Error(year + '年' + month + '月无' + day + '日,请检查!'); } else { if (year % 100 == 0 && year % 400 != 0) { throw new Error(year + '年' + month + '月无' + day + '日,请检查!'); } } } } } else if (day == 31) { if (month == 2 || month == 4 || month == 6 || month == 9 || month == 11) { throw new Error(month + '月无' + day + '日,请检查!'); } } return; } //@ sourceMappingURL=DateMask.js.map