nodemod
Version:
A collection of node modules for The Really Project
86 lines • 3.85 kB
JavaScript
import { getWeekNumber } from './helpers/get-week-number';
import { normalizeWeekday } from './helpers/normalize-weekday';
import { toUTCDate } from './helpers/to-utc-date';
import { toValidWeekday } from './helpers/to-valid-weekday';
export function calendar(init) {
const { date, dayFormat, disabledDates = [], disabledDays = [], firstDayOfWeek = 0, fullDateFormat, locale = 'en-US', max, min, showWeekNumber = false, weekNumberTemplate = 'Week %s', weekNumberType = 'first-4-day-week', } = init || {};
const firstDayOfWeek2 = toValidWeekday(firstDayOfWeek);
const dateYear = date.getUTCFullYear();
const dateMonth = date.getUTCMonth();
const firstDateOfMonth = toUTCDate(dateYear, dateMonth, 1);
const disabledDaysSet = new Set(disabledDays.map(n => normalizeWeekday(n, firstDayOfWeek2, showWeekNumber)));
const disabledDatesSet = new Set(disabledDates.map(n => +n));
const calendarKey = [
firstDateOfMonth.toJSON(),
firstDayOfWeek2,
locale,
null == max ? '' : max.toJSON(),
null == min ? '' : min.toJSON(),
Array.from(disabledDaysSet).join(','),
Array.from(disabledDatesSet).join(','),
weekNumberType,
].filter(Boolean).join(':');
const firstDayOfWeekOffset = normalizeWeekday(firstDateOfMonth.getUTCDay(), firstDayOfWeek2, showWeekNumber);
const minTime = null == min ? +new Date('2000-01-01') : +min;
const maxTime = null == max ? +new Date('2100-12-31') : +max;
const colNum = showWeekNumber ? 8 : 7;
const totalDays = toUTCDate(dateYear, 1 + dateMonth, 0).getUTCDate();
const rows = [];
let cols = [];
let calendarComplete = false;
let curDay = 1;
for (const row of [0, 1, 2, 3, 4, 5]) {
for (const col of ([0, 1, 2, 3, 4, 5, 6].concat(colNum === 7 ? [] : [7]))) {
const idx = col + (row * colNum);
if (!calendarComplete && showWeekNumber && col === 0) {
const weekNumberOffset = row < 1 ? firstDayOfWeek2 : 0;
const weekNumber = getWeekNumber(weekNumberType, toUTCDate(dateYear, dateMonth, curDay - weekNumberOffset));
const weekLabel = weekNumberTemplate.replace('%s', String(weekNumber));
cols.push({
fullDate: null,
label: weekLabel,
value: `${weekNumber}`,
key: `${calendarKey}:${weekLabel}`,
disabled: true,
});
continue;
}
if (calendarComplete || idx < firstDayOfWeekOffset) {
cols.push({
fullDate: null,
label: '',
value: '',
key: `${calendarKey}:${idx}`,
disabled: true,
});
continue;
}
const curDate = toUTCDate(dateYear, dateMonth, curDay);
const curTime = +curDate;
const isDisabledDay = disabledDaysSet.has(col) ||
disabledDatesSet.has(curTime) ||
(curTime < minTime || curTime > maxTime);
if (isDisabledDay)
disabledDatesSet.add(curTime);
cols.push({
fullDate: curDate,
label: fullDateFormat(curDate),
value: dayFormat(curDate),
key: `${calendarKey}:${curDate.toJSON()}`,
disabled: isDisabledDay,
});
curDay += 1;
if (curDay > totalDays)
calendarComplete = true;
}
rows.push(cols);
cols = [];
}
return {
disabledDatesSet,
calendar: rows,
disabledDaysSet: new Set(disabledDays.map(n => toValidWeekday(n))),
key: calendarKey,
};
}
//# sourceMappingURL=calendar.js.map