diff --git a/src/features/online-board/components/OnlineBoardStartPage.test.tsx b/src/features/online-board/components/OnlineBoardStartPage.test.tsx
index 116478c3..011859b4 100644
--- a/src/features/online-board/components/OnlineBoardStartPage.test.tsx
+++ b/src/features/online-board/components/OnlineBoardStartPage.test.tsx
@@ -7,7 +7,7 @@
* @vitest-environment jsdom
*/
-import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
+import { describe, it, expect, vi, beforeEach, afterEach, afterAll } from "vitest";
import { render, screen, fireEvent, waitFor } from "@testing-library/react";
import { OnlineBoardStartPage, buildOnlineBoardPrefillState } from "./OnlineBoardStartPage.js";
import type { PopularRequest } from "@/features/popular-requests/types.js";
@@ -100,7 +100,16 @@ vi.mock("@/ui/city-autocomplete/index.js", () => ({
// ---------------------------------------------------------------------------
describe("buildOnlineBoardPrefillState", () => {
- it("builds state for FlightNumber mode", () => {
+ // Freeze clock so todayYyyymmdd() returns a deterministic value.
+ beforeEach(() => {
+ vi.useFakeTimers();
+ vi.setSystemTime(new Date(2026, 4, 15, 12, 0, 0)); // 2026-05-15
+ });
+ afterAll(() => {
+ vi.useRealTimers();
+ });
+
+ it("4.1.5-B1: FlightNumber click includes date=today, no time field", () => {
const request: PopularRequest = {
mode: "FlightNumber",
carrier: "SU",
@@ -110,30 +119,31 @@ describe("buildOnlineBoardPrefillState", () => {
expect(buildOnlineBoardPrefillState(request)).toEqual({
tab: "flight",
flightNumber: "SU0654",
+ date: "20260515",
});
});
- it("builds state for Departure mode", () => {
+ it("4.1.5-B2: Departure click includes date=today", () => {
expect(
buildOnlineBoardPrefillState({
mode: "Departure",
departure: "LED",
type: "Onlineboard",
}),
- ).toEqual({ tab: "route", departure: "LED" });
+ ).toEqual({ tab: "route", departure: "LED", date: "20260515" });
});
- it("builds state for Arrival mode", () => {
+ it("4.1.5-B3: Arrival click includes date=today", () => {
expect(
buildOnlineBoardPrefillState({
mode: "Arrival",
arrival: "VKO",
type: "Onlineboard",
}),
- ).toEqual({ tab: "route", arrival: "VKO" });
+ ).toEqual({ tab: "route", arrival: "VKO", date: "20260515" });
});
- it("builds state for Route mode", () => {
+ it("4.1.5-B4: Route click includes date=today", () => {
expect(
buildOnlineBoardPrefillState({
mode: "Route",
@@ -141,7 +151,7 @@ describe("buildOnlineBoardPrefillState", () => {
arrival: "KRR",
type: "Onlineboard",
}),
- ).toEqual({ tab: "route", departure: "LED", arrival: "KRR" });
+ ).toEqual({ tab: "route", departure: "LED", arrival: "KRR", date: "20260515" });
});
});
diff --git a/src/features/online-board/components/OnlineBoardStartPage.tsx b/src/features/online-board/components/OnlineBoardStartPage.tsx
index e1688b0d..84a24916 100644
--- a/src/features/online-board/components/OnlineBoardStartPage.tsx
+++ b/src/features/online-board/components/OnlineBoardStartPage.tsx
@@ -71,28 +71,42 @@ export interface OnlineBoardPrefillState {
departure?: string;
arrival?: string;
flightNumber?: string;
+ /** yyyyMMdd — date to pre-populate in the filter calendar (TZ §4.1.5) */
+ date?: string;
+}
+
+function todayYyyymmdd(): string {
+ const d = new Date();
+ const y = d.getFullYear().toString();
+ const m = (d.getMonth() + 1).toString().padStart(2, "0");
+ const day = d.getDate().toString().padStart(2, "0");
+ return `${y}${m}${day}`;
}
export function buildOnlineBoardPrefillState(
request: PopularRequest,
dictionaries: IDictionaries | null = null,
): OnlineBoardPrefillState {
+ // TZ §4.1.5: all Board popular-request kinds prefill date = today.
+ const date = todayYyyymmdd();
switch (request.mode) {
case "FlightNumber":
return {
tab: "flight",
flightNumber: `${request.carrier}${request.flightNumber}`,
+ date,
};
case "Departure":
- return { tab: "route", departure: toCityCode(request.departure, dictionaries) };
+ return { tab: "route", departure: toCityCode(request.departure, dictionaries), date };
case "Arrival":
- return { tab: "route", arrival: toCityCode(request.arrival, dictionaries) };
+ return { tab: "route", arrival: toCityCode(request.arrival, dictionaries), date };
case "Route":
case "RouteWithBack":
return {
tab: "route",
departure: toCityCode(request.departure, dictionaries),
arrival: toCityCode(request.arrival, dictionaries),
+ date,
};
}
}
@@ -164,6 +178,8 @@ export const OnlineBoardStartPage: FC = () => {
...(prefill.departure ? { initialDeparture: prefill.departure } : {}),
...(prefill.arrival ? { initialArrival: prefill.arrival } : {}),
...(prefill.flightNumber ? { initialFlightNumber: prefill.flightNumber } : {}),
+ // TZ §4.1.5: popular-request click prefills date=today for all Board modes.
+ ...(prefill.date ? { initialDate: prefill.date } : {}),
initialTimeFrom: defaultTimeRange.timeFrom,
initialTimeTo: defaultTimeRange.timeTo,
};
diff --git a/src/features/schedule/components/ScheduleStartPage.test.tsx b/src/features/schedule/components/ScheduleStartPage.test.tsx
index 0ec5d5cf..21d7a3df 100644
--- a/src/features/schedule/components/ScheduleStartPage.test.tsx
+++ b/src/features/schedule/components/ScheduleStartPage.test.tsx
@@ -7,7 +7,7 @@
* @vitest-environment jsdom
*/
-import { describe, it, expect, vi, beforeEach } from "vitest";
+import { describe, it, expect, vi, beforeEach, afterEach, afterAll } from "vitest";
import { render, screen, fireEvent } from "@testing-library/react";
import { ScheduleStartPage } from "./ScheduleStartPage.js";
import { sessionStore } from "@/shared/storage.js";
@@ -45,6 +45,12 @@ vi.mock("@/features/popular-requests/components/PopularRequestsPanel.js", () =>
>
Route
+