@zag-js/date-utils
Version:
Date utilities for zag.js
188 lines (187 loc) • 6.16 kB
JavaScript
// 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
};