@dotconnor/grommet
Version:
focus on the essential experience
113 lines (96 loc) • 3.3 kB
JavaScript
// 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'].
export var 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;
}; // convert value into text representation using the schema
export var valueToText = function valueToText(value, schema) {
if (!value) return '';
var text = '';
var dates = (Array.isArray(value) ? value : [value]).map(function (v) {
return new Date(v);
});
var dateIndex = 0;
var parts = {};
schema.forEach(function (part) {
var _char = part[0].toLowerCase(); // advance dateIndex if we already have this part
while (dateIndex < dates.length && (Number.isNaN(dates[dateIndex].date) || (_char === 'm' || _char === 'd' || _char === 'y') && parts[_char])) {
dateIndex += 1;
parts = {};
}
var date = dates[dateIndex];
if (date && _char === 'm') {
text += date.getMonth() + 1;
parts[_char] = true;
} else if (date && _char === 'd') {
text += date.getDate();
parts[_char] = true;
} else if (date && _char === 'y') {
text += date.getFullYear();
parts[_char] = true;
} else text += part;
});
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);
};
export var textToValue = function textToValue(text, schema) {
if (!text) return undefined;
var result;
var addDate = function addDate(parts) {
// do a little sanity checking on the values
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) return parts;
var date = new Date(parts.y, parts.m - 1, parts.d).toISOString();
if (!result) result = date; // single
else if (Array.isArray(result)) result.push(date); // second
else result = [result, date]; // third and beyond, unused?
return {};
};
var parts = {};
var index = 0;
schema.forEach(function (part) {
if (index < text.length) {
var _char2 = part[0].toLowerCase();
if (parts[_char2] !== undefined) parts = addDate(parts);
if (_char2 === 'm') {
parts.m = pullDigits(text, index);
index += parts.m.length;
} else if (_char2 === 'd') {
parts.d = pullDigits(text, index);
index += parts.d.length;
} else if (_char2 === 'y') {
parts.y = pullDigits(text, index);
index += parts.y.length;
} else if (text.slice(index, index + part.length) === part) {
index += part.length;
} else {
// syntax error
index = text.length;
result = undefined;
}
}
});
addDate(parts);
return result;
};