UNPKG

@skolacode/calendar-js

Version:

Simple JavaScript calendar generator

132 lines (131 loc) 5.14 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getCalendar = exports.daysInMonth = void 0; var WEEKDAYS = { 0: 'Sunday', 1: 'Monday', 2: 'Tuesday', 3: 'Wednesday', 4: 'Thursday', 5: 'Friday', 6: 'Saturday', }; var next = function (month, year) { var nextYear = month === 11 ? year + 1 : year; var nextMonth = (month + 1) % 12; return { nextYear: nextYear, nextMonth: nextMonth }; }; var previous = function (month, year) { var previousYear = month === 0 ? year - 1 : year; var previousMonth = month === 0 ? 11 : month - 1; return { previousYear: previousYear, previousMonth: previousMonth }; }; var daysInMonth = function (month, year) { return 32 - new Date(year, month, 32).getDate(); }; exports.daysInMonth = daysInMonth; // NOTE : old version is populating `calendar[]` array for 6 indexes. // the latest need to pass options `extraWeek` as `false` for un-populate the extra row var MAX_WEEK_ROW = 6; var getCalendar = function (month, year, options) { if (options === void 0) { options = {}; } var startingDayDefault = 1; var extraWeekDefault = true; // NOTE : Fallback for old version. // the latest should use options as an object var isLegacy = typeof options === 'number'; if (isLegacy) { options = { startingDay: options, extraWeek: extraWeekDefault }; } var _a = options.startingDay, startingDay = _a === void 0 ? startingDayDefault : _a, _b = options.extraWeek, extraWeek = _b === void 0 ? extraWeekDefault : _b; var startingDayReAssign = startingDay; if (typeof startingDay !== 'number') { Object.values(WEEKDAYS).forEach(function (dayName, index) { if ("".concat(startingDay).toLowerCase() === dayName.toLowerCase()) { startingDayReAssign = index; } }); } var firstDay = new Date(year, month).getDay(); // NOTE : `getDay()` will be used as cell-index for property `calendar[]` // so, `firstDay` will be offset if `startingDay` is not SUNDAY | 0 if (startingDayReAssign > 0 && firstDay === 0) { firstDay = 7; } var offsetPrevMonth = firstDay - startingDayReAssign; var daysInCalendar = (0, exports.daysInMonth)(month, year); var calendar = []; var _c = next(month, year), nextMonth = _c.nextMonth, nextYear = _c.nextYear; var _d = previous(month, year), previousYear = _d.previousYear, previousMonth = _d.previousMonth; var daysInPreviousCalendar = (0, exports.daysInMonth)(previousMonth, previousYear); var weekIsNextMonth = false; var i = 0; var date = 1; var dateNextMonth = 0; while (weekIsNextMonth === false) { // Create week array calendar.push([]); // creating individual cells, filing them up with data. for (var j = 0; j < 7; j += 1) { if (i === 0 && j < offsetPrevMonth) { var previousMonthDate = new Date(previousYear, previousMonth, daysInPreviousCalendar - j); // Add previous month date calendar[i].unshift({ date: previousMonthDate, day: daysInPreviousCalendar - j, weekday: WEEKDAYS[previousMonthDate.getDay()], isCurrentMonth: false, }); } else if (date > daysInCalendar) { // Next month date var lastIndex = calendar.length - 1; var lastWeek = calendar[lastIndex]; var wholeWeekIsNextMonth = j === 0 && weekIsNextMonth; var remainingDays = 7 - (wholeWeekIsNextMonth ? 0 : lastWeek.length); for (var x = 0; x < remainingDays; x += 1) { var nextMonthDate = new Date(nextYear, nextMonth, dateNextMonth + 1); dateNextMonth += 1; lastWeek.push({ date: nextMonthDate, day: dateNextMonth, weekday: WEEKDAYS[nextMonthDate.getDay()], isCurrentMonth: false, }); } weekIsNextMonth = true; } else { var currentMonthDate = new Date(year, month, date); // Add current month date calendar[i].push({ date: currentMonthDate, day: date, weekday: WEEKDAYS[currentMonthDate.getDay()], isCurrentMonth: true, }); date += 1; } } i += 1; var shouldStopPopulate = extraWeek ? i >= MAX_WEEK_ROW : date > daysInCalendar === true; weekIsNextMonth = shouldStopPopulate; } return { calendar: calendar, month: month, year: year, next: { month: nextMonth, year: nextYear, }, previous: { month: previousMonth, year: previousYear, }, }; }; exports.getCalendar = getCalendar;