UNPKG

@duetds/date-picker

Version:

Duet Date Picker is an open source version of Duet Design System’s accessible date picker.

174 lines (173 loc) 4.77 kB
const ISO_DATE_FORMAT = /^(\d{4})-(\d{2})-(\d{2})$/; export var DaysOfWeek; (function (DaysOfWeek) { DaysOfWeek[DaysOfWeek["Sunday"] = 0] = "Sunday"; DaysOfWeek[DaysOfWeek["Monday"] = 1] = "Monday"; DaysOfWeek[DaysOfWeek["Tuesday"] = 2] = "Tuesday"; DaysOfWeek[DaysOfWeek["Wednesday"] = 3] = "Wednesday"; DaysOfWeek[DaysOfWeek["Thursday"] = 4] = "Thursday"; DaysOfWeek[DaysOfWeek["Friday"] = 5] = "Friday"; DaysOfWeek[DaysOfWeek["Saturday"] = 6] = "Saturday"; })(DaysOfWeek || (DaysOfWeek = {})); export function createDate(year, month, day) { var dayInt = parseInt(day, 10); var monthInt = parseInt(month, 10); var yearInt = parseInt(year, 10); const isValid = Number.isInteger(yearInt) && // all parts should be integers Number.isInteger(monthInt) && Number.isInteger(dayInt) && monthInt > 0 && // month must be 1-12 monthInt <= 12 && dayInt > 0 && // day must be 1-31 dayInt <= 31 && yearInt > 0; if (isValid) { return new Date(yearInt, monthInt - 1, dayInt); } } /** * @param value date string in ISO format YYYY-MM-DD */ export function parseISODate(value) { if (!value) { return; } const matches = value.match(ISO_DATE_FORMAT); if (matches) { return createDate(matches[1], matches[2], matches[3]); } } /** * print date in format YYYY-MM-DD * @param date */ export function printISODate(date) { if (!date) { return ""; } var d = date.getDate().toString(10); var m = (date.getMonth() + 1).toString(10); var y = date.getFullYear().toString(10); // days are not zero-indexed, so pad if less than 10 if (date.getDate() < 10) { d = `0${d}`; } // months *are* zero-indexed, pad if less than 9! if (date.getMonth() < 9) { m = `0${m}`; } return `${y}-${m}-${d}`; } /** * Compare if two dates are equal in terms of day, month, and year */ export function isEqual(a, b) { if (a == null || b == null) { return false; } return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate(); } export function addDays(date, days) { var d = new Date(date); d.setDate(d.getDate() + days); return d; } export function addMonths(date, months) { const d = new Date(date); d.setMonth(date.getMonth() + months); return d; } export function addYears(date, years) { const d = new Date(date); d.setFullYear(date.getFullYear() + years); return d; } export function startOfWeek(date, firstDayOfWeek = DaysOfWeek.Monday) { var d = new Date(date); var day = d.getDay(); var diff = (day < firstDayOfWeek ? 7 : 0) + day - firstDayOfWeek; d.setDate(d.getDate() - diff); return d; } export function endOfWeek(date, firstDayOfWeek = DaysOfWeek.Monday) { var d = new Date(date); var day = d.getDay(); var diff = (day < firstDayOfWeek ? -7 : 0) + 6 - (day - firstDayOfWeek); d.setDate(d.getDate() + diff); return d; } export function startOfMonth(date) { return new Date(date.getFullYear(), date.getMonth(), 1); } export function endOfMonth(date) { return new Date(date.getFullYear(), date.getMonth() + 1, 0); } export function setMonth(date, month) { const d = new Date(date); d.setMonth(month); return d; } export function setYear(date, year) { const d = new Date(date); d.setFullYear(year); return d; } /** * Check if date is within a min and max */ export function inRange(date, min, max) { return clamp(date, min, max) === date; } /** * Ensures date is within range, returns min or max if out of bounds */ export function clamp(date, min, max) { const time = date.getTime(); if (min && min instanceof Date && time < min.getTime()) { return min; } if (max && max instanceof Date && time > max.getTime()) { return max; } return date; } /** * given start and end date, return an (inclusive) array of all dates in between * @param start * @param end */ function getDaysInRange(start, end) { const days = []; let current = start; while (!isEqual(current, end)) { days.push(current); current = addDays(current, 1); } days.push(current); return days; } /** * given a date, return an array of dates from a calendar perspective * @param date * @param firstDayOfWeek */ export function getViewOfMonth(date, firstDayOfWeek = DaysOfWeek.Monday) { const start = startOfWeek(startOfMonth(date), firstDayOfWeek); const end = endOfWeek(endOfMonth(date), firstDayOfWeek); return getDaysInRange(start, end); } /** * Form random hash */ export function chr4() { return Math.random() .toString(16) .slice(-4); } /** * Create random identifier with a prefix * @param prefix */ export function createIdentifier(prefix) { return `${prefix}-${chr4()}${chr4()}-${chr4()}-${chr4()}-${chr4()}-${chr4()}${chr4()}${chr4()}`; }