-
Notifications
You must be signed in to change notification settings - Fork 3k
/
dateValidator.js
74 lines (63 loc) · 2.08 KB
/
dateValidator.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import moment from 'moment';
import { getNormalizedDate } from '../helpers/date';
import { getEditorInstance } from '../editors';
/**
* The Date cell validator.
*
* @private
* @param {*} value Value of edited cell.
* @param {Function} callback Callback called with validation result.
*/
export default function dateValidator(value, callback) {
const dateEditor = getEditorInstance('date', this.instance);
let valueToValidate = value;
let valid = true;
if (valueToValidate === null || valueToValidate === void 0) {
valueToValidate = '';
}
let isValidFormat = moment(valueToValidate, this.dateFormat || dateEditor.defaultDateFormat, true).isValid();
let isValidDate = moment(new Date(valueToValidate)).isValid() || isValidFormat;
if (this.allowEmpty && valueToValidate === '') {
isValidDate = true;
isValidFormat = true;
}
if (!isValidDate) {
valid = false;
}
if (!isValidDate && isValidFormat) {
valid = true;
}
if (isValidDate && !isValidFormat) {
if (this.correctFormat === true) { // if format correction is enabled
const correctedValue = correctFormat(valueToValidate, this.dateFormat);
const row = this.instance.toVisualRow(this.row);
const column = this.instance.toVisualColumn(this.col);
this.instance.setDataAtCell(row, column, correctedValue, 'dateValidator');
valid = true;
} else {
valid = false;
}
}
callback(valid);
}
/**
* Format the given string using moment.js' format feature.
*
* @param {string} value The value to format.
* @param {string} dateFormat The date pattern to format to.
* @returns {string}
*/
export function correctFormat(value, dateFormat) {
const dateFromDate = moment(getNormalizedDate(value));
const dateFromMoment = moment(value, dateFormat);
const isAlphanumeric = value.search(/[A-z]/g) > -1;
let date;
if ((dateFromDate.isValid() && dateFromDate.format('x') === dateFromMoment.format('x')) ||
!dateFromMoment.isValid() ||
isAlphanumeric) {
date = dateFromDate;
} else {
date = dateFromMoment;
}
return date.format(dateFormat);
}