UNPKG

react-calendar

Version:

Ultimate calendar for your React app.

364 lines (363 loc) 13.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.isWeekend = exports.isCurrentDayOfWeek = exports.getDecadeLabel = exports.getCenturyLabel = exports.getValueRange = exports.getRange = exports.getEndPrevious2 = exports.getEndPrevious = exports.getEnd = exports.getBeginNext2 = exports.getBeginPrevious2 = exports.getBeginNext = exports.getBeginPrevious = exports.getBegin = exports.getWeekNumber = exports.getBeginOfWeek = exports.getBeginOfDecadeYear = exports.getBeginOfCenturyYear = exports.getDayOfWeek = void 0; var date_utils_1 = require("@wojtekmaj/date-utils"); var const_1 = require("./const"); var dateFormatter_1 = require("./dateFormatter"); var SUNDAY = const_1.WEEKDAYS[0]; var FRIDAY = const_1.WEEKDAYS[5]; var SATURDAY = const_1.WEEKDAYS[6]; /* Simple getters - getting a property of a given point in time */ /** * Gets day of the week of a given date. * @param {Date} date Date. * @param {CalendarType} [calendarType="ISO 8601"] Calendar type. * @returns {number} Day of the week. */ function getDayOfWeek(date, calendarType) { if (calendarType === void 0) { calendarType = const_1.CALENDAR_TYPES.ISO_8601; } var weekday = date.getDay(); switch (calendarType) { case const_1.CALENDAR_TYPES.ISO_8601: // Shifts days of the week so that Monday is 0, Sunday is 6 return (weekday + 6) % 7; case const_1.CALENDAR_TYPES.ARABIC: return (weekday + 1) % 7; case const_1.CALENDAR_TYPES.HEBREW: case const_1.CALENDAR_TYPES.US: return weekday; default: throw new Error('Unsupported calendar type.'); } } exports.getDayOfWeek = getDayOfWeek; /** * Century */ /** * Gets the year of the beginning of a century of a given date. * @param {Date} date Date. * @returns {number} Year of the beginning of a century. */ function getBeginOfCenturyYear(date) { var beginOfCentury = (0, date_utils_1.getCenturyStart)(date); return (0, date_utils_1.getYear)(beginOfCentury); } exports.getBeginOfCenturyYear = getBeginOfCenturyYear; /** * Decade */ /** * Gets the year of the beginning of a decade of a given date. * @param {Date} date Date. * @returns {number} Year of the beginning of a decade. */ function getBeginOfDecadeYear(date) { var beginOfDecade = (0, date_utils_1.getDecadeStart)(date); return (0, date_utils_1.getYear)(beginOfDecade); } exports.getBeginOfDecadeYear = getBeginOfDecadeYear; /** * Week */ /** * Returns the beginning of a given week. * * @param {Date} date Date. * @param {CalendarType} [calendarType="ISO 8601"] Calendar type. * @returns {Date} Beginning of a given week. */ function getBeginOfWeek(date, calendarType) { if (calendarType === void 0) { calendarType = const_1.CALENDAR_TYPES.ISO_8601; } var year = (0, date_utils_1.getYear)(date); var monthIndex = (0, date_utils_1.getMonth)(date); var day = date.getDate() - getDayOfWeek(date, calendarType); return new Date(year, monthIndex, day); } exports.getBeginOfWeek = getBeginOfWeek; /** * Gets week number according to ISO 8601 or US standard. * In ISO 8601, Arabic and Hebrew week 1 is the one with January 4. * In US calendar week 1 is the one with January 1. * * @param {Date} date Date. * @param {CalendarType} [calendarType="ISO 8601"] Calendar type. * @returns {number} Week number. */ function getWeekNumber(date, calendarType) { if (calendarType === void 0) { calendarType = const_1.CALENDAR_TYPES.ISO_8601; } var calendarTypeForWeekNumber = calendarType === const_1.CALENDAR_TYPES.US ? const_1.CALENDAR_TYPES.US : const_1.CALENDAR_TYPES.ISO_8601; var beginOfWeek = getBeginOfWeek(date, calendarType); var year = (0, date_utils_1.getYear)(date) + 1; var dayInWeekOne; var beginOfFirstWeek; // Look for the first week one that does not come after a given date do { dayInWeekOne = new Date(year, 0, calendarTypeForWeekNumber === const_1.CALENDAR_TYPES.ISO_8601 ? 4 : 1); beginOfFirstWeek = getBeginOfWeek(dayInWeekOne, calendarType); year -= 1; } while (date < beginOfFirstWeek); return Math.round((beginOfWeek.getTime() - beginOfFirstWeek.getTime()) / (8.64e7 * 7)) + 1; } exports.getWeekNumber = getWeekNumber; /** * Others */ /** * Returns the beginning of a given range. * * @param {RangeType} rangeType Range type (e.g. 'day') * @param {Date} date Date. * @returns {Date} Beginning of a given range. */ function getBegin(rangeType, date) { switch (rangeType) { case 'century': return (0, date_utils_1.getCenturyStart)(date); case 'decade': return (0, date_utils_1.getDecadeStart)(date); case 'year': return (0, date_utils_1.getYearStart)(date); case 'month': return (0, date_utils_1.getMonthStart)(date); case 'day': return (0, date_utils_1.getDayStart)(date); default: throw new Error("Invalid rangeType: ".concat(rangeType)); } } exports.getBegin = getBegin; /** * Returns the beginning of a previous given range. * * @param {RangeType} rangeType Range type (e.g. 'day') * @param {Date} date Date. * @returns {Date} Beginning of a previous given range. */ function getBeginPrevious(rangeType, date) { switch (rangeType) { case 'century': return (0, date_utils_1.getPreviousCenturyStart)(date); case 'decade': return (0, date_utils_1.getPreviousDecadeStart)(date); case 'year': return (0, date_utils_1.getPreviousYearStart)(date); case 'month': return (0, date_utils_1.getPreviousMonthStart)(date); default: throw new Error("Invalid rangeType: ".concat(rangeType)); } } exports.getBeginPrevious = getBeginPrevious; /** * Returns the beginning of a next given range. * * @param {RangeType} rangeType Range type (e.g. 'day') * @param {Date} date Date. * @returns {Date} Beginning of a next given range. */ function getBeginNext(rangeType, date) { switch (rangeType) { case 'century': return (0, date_utils_1.getNextCenturyStart)(date); case 'decade': return (0, date_utils_1.getNextDecadeStart)(date); case 'year': return (0, date_utils_1.getNextYearStart)(date); case 'month': return (0, date_utils_1.getNextMonthStart)(date); default: throw new Error("Invalid rangeType: ".concat(rangeType)); } } exports.getBeginNext = getBeginNext; function getBeginPrevious2(rangeType, date) { switch (rangeType) { case 'decade': return (0, date_utils_1.getPreviousDecadeStart)(date, -100); case 'year': return (0, date_utils_1.getPreviousYearStart)(date, -10); case 'month': return (0, date_utils_1.getPreviousMonthStart)(date, -12); default: throw new Error("Invalid rangeType: ".concat(rangeType)); } } exports.getBeginPrevious2 = getBeginPrevious2; function getBeginNext2(rangeType, date) { switch (rangeType) { case 'decade': return (0, date_utils_1.getNextDecadeStart)(date, 100); case 'year': return (0, date_utils_1.getNextYearStart)(date, 10); case 'month': return (0, date_utils_1.getNextMonthStart)(date, 12); default: throw new Error("Invalid rangeType: ".concat(rangeType)); } } exports.getBeginNext2 = getBeginNext2; /** * Returns the end of a given range. * * @param {RangeType} rangeType Range type (e.g. 'day') * @param {Date} date Date. * @returns {Date} End of a given range. */ function getEnd(rangeType, date) { switch (rangeType) { case 'century': return (0, date_utils_1.getCenturyEnd)(date); case 'decade': return (0, date_utils_1.getDecadeEnd)(date); case 'year': return (0, date_utils_1.getYearEnd)(date); case 'month': return (0, date_utils_1.getMonthEnd)(date); case 'day': return (0, date_utils_1.getDayEnd)(date); default: throw new Error("Invalid rangeType: ".concat(rangeType)); } } exports.getEnd = getEnd; /** * Returns the end of a previous given range. * * @param {RangeType} rangeType Range type (e.g. 'day') * @param {Date} date Date. * @returns {Date} End of a previous given range. */ function getEndPrevious(rangeType, date) { switch (rangeType) { case 'century': return (0, date_utils_1.getPreviousCenturyEnd)(date); case 'decade': return (0, date_utils_1.getPreviousDecadeEnd)(date); case 'year': return (0, date_utils_1.getPreviousYearEnd)(date); case 'month': return (0, date_utils_1.getPreviousMonthEnd)(date); default: throw new Error("Invalid rangeType: ".concat(rangeType)); } } exports.getEndPrevious = getEndPrevious; function getEndPrevious2(rangeType, date) { switch (rangeType) { case 'decade': return (0, date_utils_1.getPreviousDecadeEnd)(date, -100); case 'year': return (0, date_utils_1.getPreviousYearEnd)(date, -10); case 'month': return (0, date_utils_1.getPreviousMonthEnd)(date, -12); default: throw new Error("Invalid rangeType: ".concat(rangeType)); } } exports.getEndPrevious2 = getEndPrevious2; /** * Returns an array with the beginning and the end of a given range. * * @param {RangeType} rangeType Range type (e.g. 'day') * @param {Date} date Date. * @returns {Date[]} Beginning and end of a given range. */ function getRange(rangeType, date) { switch (rangeType) { case 'century': return (0, date_utils_1.getCenturyRange)(date); case 'decade': return (0, date_utils_1.getDecadeRange)(date); case 'year': return (0, date_utils_1.getYearRange)(date); case 'month': return (0, date_utils_1.getMonthRange)(date); case 'day': return (0, date_utils_1.getDayRange)(date); default: throw new Error("Invalid rangeType: ".concat(rangeType)); } } exports.getRange = getRange; /** * Creates a range out of two values, ensuring they are in order and covering entire period ranges. * * @param {RangeType} rangeType Range type (e.g. 'day') * @param {Date} date1 First date. * @param {Date} date2 Second date. * @returns {Date[]} Beginning and end of a given range. */ function getValueRange(rangeType, date1, date2) { var rawNextValue = [date1, date2].sort(function (a, b) { return a.getTime() - b.getTime(); }); return [getBegin(rangeType, rawNextValue[0]), getEnd(rangeType, rawNextValue[1])]; } exports.getValueRange = getValueRange; function toYearLabel(locale, formatYear, dates) { if (formatYear === void 0) { formatYear = dateFormatter_1.formatYear; } return dates.map(function (date) { return formatYear(locale, date); }).join(' – '); } /** * @callback FormatYear * @param {string} locale Locale. * @param {Date} date Date. * @returns {string} Formatted year. */ /** * Returns a string labelling a century of a given date. * For example, for 2017 it will return 2001-2100. * * @param {string} locale Locale. * @param {FormatYear} formatYear Function to format a year. * @param {Date|string|number} date Date or a year as a string or as a number. * @returns {string} String labelling a century of a given date. */ function getCenturyLabel(locale, formatYear, date) { return toYearLabel(locale, formatYear, (0, date_utils_1.getCenturyRange)(date)); } exports.getCenturyLabel = getCenturyLabel; /** * Returns a string labelling a decade of a given date. * For example, for 2017 it will return 2011-2020. * * @param {string} locale Locale. * @param {FormatYear} formatYear Function to format a year. * @param {Date|string|number} date Date or a year as a string or as a number. * @returns {string} String labelling a decade of a given date. */ function getDecadeLabel(locale, formatYear, date) { return toYearLabel(locale, formatYear, (0, date_utils_1.getDecadeRange)(date)); } exports.getDecadeLabel = getDecadeLabel; /** * Returns a boolean determining whether a given date is the current day of the week. * * @param {Date} date Date. * @returns {boolean} Whether a given date is the current day of the week. */ function isCurrentDayOfWeek(date) { return date.getDay() === new Date().getDay(); } exports.isCurrentDayOfWeek = isCurrentDayOfWeek; /** * Returns a boolean determining whether a given date is a weekend day. * * @param {Date} date Date. * @param {CalendarType} [calendarType="ISO 8601"] Calendar type. * @returns {boolean} Whether a given date is a weekend day. */ function isWeekend(date, calendarType) { if (calendarType === void 0) { calendarType = const_1.CALENDAR_TYPES.ISO_8601; } var weekday = date.getDay(); switch (calendarType) { case const_1.CALENDAR_TYPES.ARABIC: case const_1.CALENDAR_TYPES.HEBREW: return weekday === FRIDAY || weekday === SATURDAY; case const_1.CALENDAR_TYPES.ISO_8601: case const_1.CALENDAR_TYPES.US: return weekday === SATURDAY || weekday === SUNDAY; default: throw new Error('Unsupported calendar type.'); } } exports.isWeekend = isWeekend;