diff --git a/.changeset/eighty-hoops-shake.md b/.changeset/eighty-hoops-shake.md new file mode 100644 index 000000000..e93ed1e12 --- /dev/null +++ b/.changeset/eighty-hoops-shake.md @@ -0,0 +1,7 @@ +--- +"flowbite-react": patch +--- + +Fix `Datepicker` decades view navigating to the wrong decade + +Clicking a decade computed the new view date relative to the selected date instead of the clicked decade, so the years view often displayed a different decade than the one clicked (and did nothing when no date was selected). The clicked decade is now used directly, matching the behavior of the years view. diff --git a/packages/ui/src/components/Datepicker/Datepicker.test.tsx b/packages/ui/src/components/Datepicker/Datepicker.test.tsx index 0028a2da5..d29adb36b 100644 --- a/packages/ui/src/components/Datepicker/Datepicker.test.tsx +++ b/packages/ui/src/components/Datepicker/Datepicker.test.tsx @@ -93,6 +93,33 @@ describe("Components / Datepicker", () => { expect(titleButton.textContent).toBe("1990 - 2100"); }); + it("should show the years of the clicked decade when the view date differs from the selected date", async () => { + const testDate = new Date(2024, 6, 20); + render(); + + const textBox = screen.getByRole("textbox"); + await userEvent.click(textBox); + + const titleButton = screen.getByText("July 2024"); + await userEvent.click(titleButton); + await userEvent.click(titleButton); + await userEvent.click(titleButton); + expect(titleButton.textContent).toBe("1990 - 2100"); + + // navigate the view (but not the selection) to a different decade + await userEvent.click(screen.getByText("1990")); + expect(titleButton.textContent).toBe("1990 - 2001"); + await userEvent.click(screen.getByText("1994")); + + // go back up to the decades view and pick another decade + await userEvent.click(titleButton); + await userEvent.click(titleButton); + expect(titleButton.textContent).toBe("1890 - 2000"); + await userEvent.click(screen.getByText("2000")); + + expect(titleButton.textContent).toBe("2000 - 2011"); + }); + it("should allow selecting earlier decades when setting max date", async () => { const testDate = new Date(2024, 6, 20); render(); diff --git a/packages/ui/src/components/Datepicker/Views/Decades.tsx b/packages/ui/src/components/Datepicker/Views/Decades.tsx index f81546903..d4e85d6b1 100644 --- a/packages/ui/src/components/Datepicker/Views/Decades.tsx +++ b/packages/ui/src/components/Datepicker/Views/Decades.tsx @@ -57,7 +57,7 @@ export function DatepickerViewsDecades() { onClick={() => { if (isDisabled) return; - selectedDate && setViewDate(addYears(viewDate, year - selectedDate.getFullYear())); + setViewDate(newDate); setView(Views.Years); }} >