Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions examples/RangeResetSelection.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import { screen } from "@testing-library/react";
import { addDays } from "date-fns";
import React from "react";
import { dateButton } from "@/test/elements";
import { render } from "@/test/render";
import { user } from "@/test/user";
import { RangeResetSelection } from "./RangeResetSelection";

const today = new Date(2022, 8, 12);

beforeAll(() => jest.setSystemTime(today));
afterAll(() => jest.useRealTimers());

beforeEach(() => render(<RangeResetSelection />));

const getFrom = () => screen.getByTestId("from");
const getTo = () => screen.getByTestId("to");

test("select same day range", async () => {
await user.click(dateButton(today));
expect(getFrom()).toHaveTextContent("from: 2022-09-12");
expect(getTo()).toHaveTextContent("to:");
await user.click(dateButton(today));
expect(getFrom()).toHaveTextContent("from: 2022-09-12");
expect(getTo()).toHaveTextContent("to: 2022-09-12");
});

test("start range after click on day with range selected", async () => {
await user.click(dateButton(today));
expect(getFrom()).toHaveTextContent("from: 2022-09-12");
expect(getTo()).toHaveTextContent("to:");
await user.click(dateButton(addDays(today, 1)));
expect(getFrom()).toHaveTextContent("from: 2022-09-12");
expect(getTo()).toHaveTextContent("to: 2022-09-13");
await user.click(dateButton(addDays(today, 4)));
expect(getFrom()).toHaveTextContent("from: 2022-09-16");
expect(getTo()).toHaveTextContent("to:");
await user.click(dateButton(today));
expect(getFrom()).toHaveTextContent("from: 2022-09-12");
expect(getTo()).toHaveTextContent("to: 2022-09-16");
});
49 changes: 49 additions & 0 deletions examples/RangeResetSelection.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import { format } from "date-fns";
import React, { useState } from "react";

import {
type DateRange,
type DayEventHandler,
DayPicker,
type OnSelectHandler,
} from "react-day-picker";

export function RangeResetSelection() {
const [selected, setSelected] = useState<DateRange>();

// use onSelect event which properly handles valid range selection
// based on valid days in the calendar
const handleSelect: OnSelectHandler<DateRange | undefined> = (range) => {
// the other cases are handled by onDayClick handler
if (selected?.from && !selected.to) {
setSelected(range);
}
};

const handleDayClick: DayEventHandler<React.MouseEvent> = (date) => {
// handled by onSelect handler
if (selected?.from && !selected.to) {
return;
}
setSelected({ from: date });
};

return (
<DayPicker
mode="range"
selected={selected}
onSelect={handleSelect}
onDayClick={handleDayClick}
footer={
<div>
<p data-testid="from">
from: {selected?.from && format(selected?.from, "yyyy-MM-dd")}
</p>
<p data-testid="to">
to: {selected?.to && format(selected?.to, "yyyy-MM-dd")}
</p>
</div>
}
/>
);
}
1 change: 1 addition & 0 deletions examples/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ export * from "./RangeLong";
export * from "./RangeLongExcludeDisabled";
export * from "./RangeMinMax";
export * from "./RangeRequired";
export * from "./RangeResetSelection";
export * from "./RangeShiftKey";
export * from "./Rtl";
export * from "./Single";
Expand Down
14 changes: 13 additions & 1 deletion src/utils/addToRange.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,24 @@ describe("addToRange", () => {
expect(range).toEqual({ from: date, to: date });
});

test("add a date to an incomplete range with same start date", () => {
test("add a date to an incomplete range with same start date and min = 0", () => {
const date = new Date(2022, 0, 1);
const range = addToRange(date, { from: date, to: undefined });
expect(range).toEqual({ from: date, to: date });
});

test("add a date to an incomplete range with same start date and min > 0", () => {
const date = new Date(2022, 0, 1);
const range = addToRange(date, { from: date, to: undefined }, 1, 0, false);
expect(range).toEqual(undefined);
});

test("add a date to an incomplete range with same start date and min > 0 and required", () => {
const date = new Date(2022, 0, 1);
const range = addToRange(date, { from: date, to: undefined }, 1, 0, true);
expect(range).toEqual({ from: date, to: undefined });
});

test("add a date to an incomplete range with earlier date", () => {
const from = new Date(2022, 0, 1);
const earlierDate = new Date(2021, 11, 31);
Expand Down
4 changes: 3 additions & 1 deletion src/utils/addToRange.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,9 @@ export function addToRange(
// adding date to an incomplete range
if (isSameDay(from, date)) {
// adding a date equal to the start of the range
if (required) {
if (min === 0) {
range = { from, to: date };
} else if (required) {
range = { from, to: undefined };
} else {
range = undefined;
Expand Down