@skolacode/calendar-js
Version:
Simple JavaScript calendar generator
132 lines (131 loc) • 5.14 kB
JavaScript
"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;