diff --git a/src/features/online-board/components/DayTabs/DaySelect.test.tsx b/src/features/online-board/components/DayTabs/DaySelect.test.tsx new file mode 100644 index 00000000..0e048cbc --- /dev/null +++ b/src/features/online-board/components/DayTabs/DaySelect.test.tsx @@ -0,0 +1,51 @@ +// @vitest-environment jsdom +import { describe, it, expect, vi } from "vitest"; +import { render, screen, fireEvent } from "@testing-library/react"; +import { DaySelect } from "./DaySelect.js"; + +describe("DaySelect", () => { + it("renders a select with data-testid", () => { + render( {}} />); + expect(screen.getByTestId("day-select")).toBeTruthy(); + }); + + it("renders one option per available date", () => { + render( + {}} + />, + ); + const select = screen.getByTestId("day-select") as HTMLSelectElement; + expect(select.options).toHaveLength(3); + }); + + it("has selectedDate as select value", () => { + render( + {}} + />, + ); + const select = screen.getByTestId("day-select") as HTMLSelectElement; + expect(select.value).toBe("20260416"); + }); + + it("fires onNavigate with new date on change", () => { + const onNavigate = vi.fn(); + render( + , + ); + fireEvent.change(screen.getByTestId("day-select"), { target: { value: "20260417" } }); + expect(onNavigate).toHaveBeenCalledWith("20260417"); + }); +}); diff --git a/src/features/online-board/components/DayTabs/DaySelect.tsx b/src/features/online-board/components/DayTabs/DaySelect.tsx new file mode 100644 index 00000000..b9402acc --- /dev/null +++ b/src/features/online-board/components/DayTabs/DaySelect.tsx @@ -0,0 +1,41 @@ +import type { FC } from "react"; +import { parseYyyymmdd } from "./dateRange.js"; +import "./DayTabs.scss"; + +export interface DaySelectProps { + selectedDate: string; + availableDates: string[]; + locale: string; + onNavigate: (date: string) => void; +} + +function formatLabel(date: string, locale: string): string { + const d = parseYyyymmdd(date); + return new Intl.DateTimeFormat(locale, { + weekday: "short", + month: "short", + day: "numeric", + }).format(d); +} + +export const DaySelect: FC = ({ + selectedDate, + availableDates, + locale, + onNavigate, +}) => { + return ( + + ); +}; diff --git a/src/features/online-board/components/DayTabs/DayTabs.scss b/src/features/online-board/components/DayTabs/DayTabs.scss index 106949e0..cf14285a 100644 --- a/src/features/online-board/components/DayTabs/DayTabs.scss +++ b/src/features/online-board/components/DayTabs/DayTabs.scss @@ -38,3 +38,16 @@ display: block; } } + +.day-select { + display: none; + + @media (max-width: 768px) { + display: block; + width: 100%; + padding: 12px; + border-radius: 8px; + background: #fff; + border: 1px solid #d0dae5; + } +}