UNPKG

@zag-js/date-utils

Version:

Date utilities for zag.js

188 lines (187 loc) 6.16 kB
// src/pagination.ts import { endOfMonth, endOfWeek, startOfMonth, startOfWeek } from "@internationalized/date"; import { isDateOutsideRange } from "./assertion.mjs"; import { alignEnd, alignStart, constrainStart, constrainValue } from "./constrain.mjs"; import { getEndDate, getUnitDuration } from "./duration.mjs"; function getAdjustedDateFn(visibleDuration, locale, minValue, maxValue) { return function getDate(options) { const { startDate, focusedDate } = options; const endDate = getEndDate(startDate, visibleDuration); if (isDateOutsideRange(focusedDate, minValue, maxValue)) { return { startDate, focusedDate: constrainValue(focusedDate, minValue, maxValue), endDate }; } if (focusedDate.compare(startDate) < 0) { return { startDate: alignEnd(focusedDate, visibleDuration, locale, minValue, maxValue), focusedDate: constrainValue(focusedDate, minValue, maxValue), endDate }; } if (focusedDate.compare(endDate) > 0) { return { startDate: alignStart(focusedDate, visibleDuration, locale, minValue, maxValue), endDate, focusedDate: constrainValue(focusedDate, minValue, maxValue) }; } return { startDate, endDate, focusedDate: constrainValue(focusedDate, minValue, maxValue) }; }; } function getNextPage(focusedDate, startDate, visibleDuration, locale, minValue, maxValue) { const adjust = getAdjustedDateFn(visibleDuration, locale, minValue, maxValue); const start = startDate.add(visibleDuration); return adjust({ focusedDate: focusedDate.add(visibleDuration), startDate: alignStart( constrainStart(focusedDate, start, visibleDuration, locale, minValue, maxValue), visibleDuration, locale ) }); } function getPreviousPage(focusedDate, startDate, visibleDuration, locale, minValue, maxValue) { const adjust = getAdjustedDateFn(visibleDuration, locale, minValue, maxValue); let start = startDate.subtract(visibleDuration); return adjust({ focusedDate: focusedDate.subtract(visibleDuration), startDate: alignStart( constrainStart(focusedDate, start, visibleDuration, locale, minValue, maxValue), visibleDuration, locale ) }); } function getNextRow(focusedDate, startDate, visibleDuration, locale, minValue, maxValue) { const adjust = getAdjustedDateFn(visibleDuration, locale, minValue, maxValue); if (visibleDuration.days) { return getNextPage(focusedDate, startDate, visibleDuration, locale, minValue, maxValue); } if (visibleDuration.weeks || visibleDuration.months || visibleDuration.years) { return adjust({ focusedDate: focusedDate.add({ weeks: 1 }), startDate }); } } function getPreviousRow(focusedDate, startDate, visibleDuration, locale, minValue, maxValue) { const adjust = getAdjustedDateFn(visibleDuration, locale, minValue, maxValue); if (visibleDuration.days) { return getPreviousPage(focusedDate, startDate, visibleDuration, locale, minValue, maxValue); } if (visibleDuration.weeks || visibleDuration.months || visibleDuration.years) { return adjust({ focusedDate: focusedDate.subtract({ weeks: 1 }), startDate }); } } function getSectionStart(focusedDate, startDate, visibleDuration, locale, minValue, maxValue) { const adjust = getAdjustedDateFn(visibleDuration, locale, minValue, maxValue); if (visibleDuration.days) { return adjust({ focusedDate: startDate, startDate }); } if (visibleDuration.weeks) { return adjust({ focusedDate: startOfWeek(focusedDate, locale), startDate }); } if (visibleDuration.months || visibleDuration.years) { return adjust({ focusedDate: startOfMonth(focusedDate), startDate }); } } function getSectionEnd(focusedDate, startDate, visibleDuration, locale, minValue, maxValue) { const adjust = getAdjustedDateFn(visibleDuration, locale, minValue, maxValue); const endDate = getEndDate(startDate, visibleDuration); if (visibleDuration.days) { return adjust({ focusedDate: endDate, startDate }); } if (visibleDuration.weeks) { return adjust({ focusedDate: endOfWeek(focusedDate, locale), startDate }); } if (visibleDuration.months || visibleDuration.years) { return adjust({ focusedDate: endOfMonth(focusedDate), startDate }); } } function getNextSection(focusedDate, startDate, larger, visibleDuration, locale, minValue, maxValue) { const adjust = getAdjustedDateFn(visibleDuration, locale, minValue, maxValue); if (!larger && !visibleDuration.days) { return adjust({ focusedDate: focusedDate.add(getUnitDuration(visibleDuration)), startDate }); } if (visibleDuration.days) { return getNextPage(focusedDate, startDate, visibleDuration, locale, minValue, maxValue); } if (visibleDuration.weeks) { return adjust({ focusedDate: focusedDate.add({ months: 1 }), startDate }); } if (visibleDuration.months || visibleDuration.years) { return adjust({ focusedDate: focusedDate.add({ years: 1 }), startDate }); } } function getPreviousSection(focusedDate, startDate, larger, visibleDuration, locale, minValue, maxValue) { const adjust = getAdjustedDateFn(visibleDuration, locale, minValue, maxValue); if (!larger && !visibleDuration.days) { return adjust({ focusedDate: focusedDate.subtract(getUnitDuration(visibleDuration)), startDate }); } if (visibleDuration.days) { return getPreviousPage(focusedDate, startDate, visibleDuration, locale, minValue, maxValue); } if (visibleDuration.weeks) { return adjust({ focusedDate: focusedDate.subtract({ months: 1 }), startDate }); } if (visibleDuration.months || visibleDuration.years) { return adjust({ focusedDate: focusedDate.subtract({ years: 1 }), startDate }); } } export { getAdjustedDateFn, getNextPage, getNextRow, getNextSection, getPreviousPage, getPreviousRow, getPreviousSection, getSectionEnd, getSectionStart };