react-day-picker
Version:
Customizable Date Picker for React
168 lines (140 loc) • 4.38 kB
text/typescript
import { DayFlag } from "../UI.js";
import { CalendarDay } from "../classes/index.js";
import type { Modifiers } from "../types/index.js";
import { calculateFocusTarget } from "./calculateFocusTarget";
const todayModifiers = {
[ ]: true
};
const todayHiddenModifiers = {
[ ]: true,
[ ]: true
};
const focusedModifiers = {
[ ]: true
};
const focusedDisabledModifiers = {
[ ]: true,
[ ]: true
};
const outsideModifiers = {
[ ]: true
};
const hiddenModifiers = {
[ ]: true
};
const disabledModifiers = {
[ ]: true
};
const month = new Date(2021, 0, 1);
const day1 = new CalendarDay(new Date(2021, 0, 1), month);
const dayToday = new CalendarDay(new Date(2021, 0, 2), month);
const daySelected = new CalendarDay(new Date(2021, 0, 3), month);
const dayLastFocused = new CalendarDay(new Date(2021, 0, 4), month);
const dayFocusedModifier = new CalendarDay(new Date(2021, 0, 5), month);
const day6 = new CalendarDay(new Date(2021, 0, 6), month);
const days: CalendarDay[] = [
day1,
dayToday,
daySelected,
dayLastFocused,
dayFocusedModifier,
day6
];
const isSelected = (date: Date) => {
return date.getTime() === daySelected.date.getTime();
};
function getModifiersFactory(
entries: [CalendarDay, Modifiers][]
): (day: CalendarDay) => Modifiers {
const map = new Map(entries);
return (day) => map.get(day) ?? {};
}
describe("calculateFocusTarget", () => {
describe("when determining the focus target based on priority", () => {
it("should prioritize the day with the 'focused' modifier", () => {
const getModifiers = getModifiersFactory([
[ ],
[ ],
[ ],
[ ],
[ ],
[ ]
]);
const focusTarget = calculateFocusTarget(
days,
getModifiers,
isSelected,
dayLastFocused
);
expect(focusTarget).toBe(dayFocusedModifier);
});
it("should fall back to the last focused day if no day has the 'focused' modifier", () => {
const getModifiers = getModifiersFactory([
[ ],
[ ],
[ ],
[ ],
[ ],
[ ]
]);
const focusTarget = calculateFocusTarget(
days,
getModifiers,
isSelected,
dayLastFocused
);
expect(focusTarget).toBe(dayLastFocused);
});
it("should prioritize the selected day if no day is focused or last focused", () => {
const getModifiers = getModifiersFactory([
[ ],
[ ],
[ ],
[ ],
[ ],
[ ]
]);
const focusTarget = calculateFocusTarget(
days,
getModifiers,
isSelected,
dayLastFocused
);
expect(focusTarget).toBe(daySelected);
});
it("should prioritize today if no day is focused, last focused, or selected", () => {
const getModifiers = getModifiersFactory([
[ ],
[ ],
[ ],
[ ],
[ ],
[ ]
]);
const focusTarget = calculateFocusTarget(
days,
getModifiers,
isSelected,
dayLastFocused
);
expect(focusTarget).toBe(dayToday);
});
it("should fall back to the first focusable day if no other priority is met", () => {
const getModifiers = getModifiersFactory([
[ ],
[ ],
[ ],
[ ],
[ ],
[ ]
]);
const focusTarget = calculateFocusTarget(
days,
getModifiers,
isSelected,
dayLastFocused
);
expect(focusTarget).toBe(day6);
});
});
});