UNPKG

grommet

Version:

focus on the essential experience

209 lines (205 loc) 8.36 kB
"use strict"; 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; };