grommet
Version:
focus on the essential experience
209 lines (205 loc) • 8.36 kB
JavaScript
;
exports.__esModule = true;
exports.valuesAreEqual = exports.valueToText = exports.validateBounds = exports.textToValue = exports.schemaToMask = exports.formatToSchema = void 0;
var _utils = require("../../utils");
var _utils2 = require("../Calendar/utils");
function _construct(t, e, r) { if (_isNativeReflectConstruct()) return Reflect.construct.apply(null, arguments); var o = [null]; o.push.apply(o, e); var p = new (t.bind.apply(t, o))(); return r && _setPrototypeOf(p, r.prototype), p; }
function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
// Converting between Date and String types is handled via a "schema".
// The schema is an array of strings, split into strings with identical
// characters. So, 'mm/dd/yyyy' will be ['mm', '/', 'dd', '/', 'yyyyy'].
var formatToSchema = exports.formatToSchema = function formatToSchema(format) {
if (!format) return undefined;
var result = [];
var i = 0;
var part;
while (i < format.length) {
if (!part || part[0] !== format[i]) {
if (part) result.push(part);
part = format[i];
} else {
part += format[i];
}
i += 1;
}
if (part) result.push(part);
return result;
};
var masks = {
m: {
length: [1, 2],
regexp: /^[1-9]$|^1[0-2]$/
},
mm: {
length: [1, 2],
regexp: /^[0-1]$|^0[1-9]$|^1[0-2]$/
},
d: {
length: [1, 2],
regexp: /^[1-9]$|^[1-2][0-9]$|^3[0-1]$/
},
dd: {
length: [1, 2],
regexp: /^[0-3]$|^0[1-9]$|^[1-2][0-9]$|^3[0-1]$/
},
yy: {
length: [1, 2],
regexp: /^[0-9]{1,2}$/
},
yyyy: {
length: [1, 4],
regexp: /^[0-9]{1,4}$/
}
};
var schemaToMask = exports.schemaToMask = function schemaToMask(schema) {
if (!schema) return undefined;
return schema.map(function (part) {
var lower = part.toLowerCase();
var _char = lower[0];
if (_char === 'm' || _char === 'd' || _char === 'y') return _extends({
placeholder: part
}, masks[lower]);
return {
fixed: part
};
});
};
// convert value into text representation using the schema
var valueToText = exports.valueToText = function valueToText(value, schema) {
var text = '';
// when user initializes dates as empty array, we want to still
// show the placeholder text
if (!value || Array.isArray(value) && !value.length) return text;
var dates = (Array.isArray(value) ? value : [value]).map(function (v) {
return (0, _utils.setHoursWithOffset)(v);
});
var dateIndex = 0;
var parts = {};
schema.every(function (part) {
var _char2 = part[0].toLowerCase();
// advance dateIndex if we already have this part
while (dateIndex < dates.length && (Number.isNaN(dates[dateIndex].date) || (_char2 === 'm' || _char2 === 'd' || _char2 === 'y') && parts[part])) {
dateIndex += 1;
parts = {};
}
var date = dates[dateIndex];
if (date && part === 'm') {
text += date.getMonth() + 1;
parts[part] = true;
} else if (date && part === 'mm') {
text += ("0" + (date.getMonth() + 1)).slice(-2);
parts[part] = true;
} else if (date && part === 'd') {
text += date.getDate();
parts[part] = true;
} else if (date && part === 'dd') {
text += ("0" + date.getDate()).slice(-2);
parts[part] = true;
} else if (date && part === 'yy') {
text += date.getFullYear().toString().slice(-2);
parts[part] = true;
} else if (date && part === 'yyyy') {
text += date.getFullYear();
parts[part] = true;
} else if (!date && (part[0] === 'm' || part[0] === 'd' || part[0] === 'y')) {
return false;
} else {
text += part;
}
return true;
});
return text;
};
var charCodeZero = '0'.charCodeAt(0);
var charCodeNine = '9'.charCodeAt(0);
var pullDigits = function pullDigits(text, index) {
var end = index;
while (text.charCodeAt(end) >= charCodeZero && text.charCodeAt(end) <= charCodeNine) end += 1;
return text.slice(index, end);
};
var validateBounds = exports.validateBounds = function validateBounds(dateBounds, selectedDate) {
if (!dateBounds || !selectedDate) return selectedDate;
var _dateBounds$map = dateBounds.map(function (date) {
return (0, _utils.setHoursWithOffset)(date).toISOString();
}),
startDate = _dateBounds$map[0],
endDate = _dateBounds$map[1];
var isoSelectedDates = (Array.isArray(selectedDate) ? selectedDate : [selectedDate]).map(function (date) {
return (0, _utils.setHoursWithOffset)(date).toISOString();
});
var validSelection = isoSelectedDates.every(function (isoSelectedDate) {
return !endDate && startDate === isoSelectedDate || isoSelectedDate >= startDate && isoSelectedDate <= endDate;
});
return validSelection ? selectedDate : undefined;
};
var textToValue = exports.textToValue = function textToValue(text, schema, range, reference, outputFormat) {
if (!text) return range ? [] : undefined;
var result;
var addDate = function addDate(parts) {
var leapYear = parts.y % 4 === 0 && parts.y % 100 !== 0 || parts.y % 400 === 0;
// Do a little sanity checking on the parts first.
// If not valid, leave as is.
if (!parts.m || !parts.d || !parts.y || parts.y.length < 4 || parts.m.length > 2 || parts.d.length > 2 || parts.m > 12 || parts.d > 31 || (parts.m === "02" || parts.m === "2") && parts.d > (leapYear ? 29 : 28)) return parts;
// use time info from reference date
var time = reference ? [reference.getHours(), reference.getMinutes(), reference.getSeconds(), reference.getMilliseconds()] : null;
var date = _construct(Date, [parts.y, parts.m - 1, parts.d].concat(time)).toISOString();
if (date && outputFormat === 'no timezone') {
var _handleOffset$toISOSt = (0, _utils2.handleOffset)(date).toISOString().split('T');
date = _handleOffset$toISOSt[0];
}
if (!range) {
if (!result) result = date;
} else {
if (!result) result = [];
result.push(date);
}
// we've consumed these parts, return an empty object in case we need
// to start building up another one for a range
return {};
};
var parts = {};
var index = 0;
schema.forEach(function (part) {
if (index < text.length) {
var lower = part.toLowerCase();
var _char3 = lower[0];
if (parts[_char3] !== undefined) parts = addDate(parts);
if (_char3 === 'm') {
parts.m = pullDigits(text, index);
index += parts.m.length;
} else if (_char3 === 'd') {
var _parts;
parts.d = pullDigits(text, index);
// when format is something like yyyy/mm/dd,
// '0' as incomplete day can cause date to be
// prematurely calculated.
// ex: 2022/01/0 would reutrn 2021/12/31 in addDate()
if (parts.d === '0') delete parts.d;
index += ((_parts = parts) == null || (_parts = _parts.d) == null ? void 0 : _parts.length) || 0;
} else if (_char3 === 'y') {
parts.y = pullDigits(text, index);
index += parts.y.length;
if (lower === 'yy' && parts.y.length === 2) {
// convert to full year, pivot at 69 based on POSIX strptime()
parts.y = "" + (parts.y < 69 ? 20 : 19) + parts.y;
}
} else if (text.slice(index, index + part.length) === part) {
index += part.length;
} else {
// syntax error
index = text.length;
result = undefined;
}
}
});
parts = addDate(parts);
if (!result) return range ? [] : undefined;
return result;
};
var valuesAreEqual = exports.valuesAreEqual = function valuesAreEqual(value1, value2) {
return Array.isArray(value1) && Array.isArray(value2) && value1.every(function (d1, i) {
return d1 === value2[i];
}) || value1 === value2;
};