From 2434bd702ba7f87822873cb7d3ccba19c31eba32 Mon Sep 17 00:00:00 2001 From: gnezim Date: Mon, 20 Apr 2026 12:33:21 +0300 Subject: [PATCH] OnlineBoardFilter: validate departure===arrival mismatch with inline error (Angular parity) --- .../components/OnlineBoardFilter.tsx | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/features/online-board/components/OnlineBoardFilter.tsx b/src/features/online-board/components/OnlineBoardFilter.tsx index d20a4011..40eb5c0c 100644 --- a/src/features/online-board/components/OnlineBoardFilter.tsx +++ b/src/features/online-board/components/OnlineBoardFilter.tsx @@ -131,6 +131,10 @@ export const OnlineBoardFilter: FC = ({ initialTab === "flight" && initialDate ? yyyymmddToDate(initialDate) : null, ); const [flightNumberError, setFlightNumberError] = useState(null); + // Mirrors Angular OnlineBoardRouteFilterValidationService state: a + // single rejection message shown next to the arrival input when + // departure === arrival. Cleared as soon as the user edits either field. + const [routeSameCitiesError, setRouteSameCitiesError] = useState(null); // Route fields const [routeDepartureCode, setRouteDepartureCode] = useState(initialDeparture ?? ""); @@ -250,6 +254,15 @@ export const OnlineBoardFilter: FC = ({ const arrCode = routeArrivalCode.trim().toUpperCase(); if (!depCode && !arrCode) return; + // Angular's validation rejects identical departure/arrival codes. + // Surface the same translated message and bail out before building + // a URL that would return an empty board. + if (depCode && arrCode && depCode === arrCode) { + setRouteSameCitiesError("SHARED.ARRIVAL-EQUALS-DEPARTURE-ERROR"); + return; + } + setRouteSameCitiesError(null); + // Only send time range when the user has narrowed the slider, so // default 00:00–24:00 searches keep the URL clean (Angular spreads // `...this.timeRange` which is undefined until interaction). @@ -411,7 +424,10 @@ export const OnlineBoardFilter: FC = ({ : t("SHARED.CITY_PLACEHOLDER") } value={routeDepartureCode} - onChange={setRouteDepartureCode} + onChange={(code) => { + setRouteDepartureCode(code); + if (routeSameCitiesError) setRouteSameCitiesError(null); + }} dictionaries={dictionaries} testIdPrefix="route-departure" /> @@ -437,10 +453,21 @@ export const OnlineBoardFilter: FC = ({ : t("SHARED.CITY_PLACEHOLDER") } value={routeArrivalCode} - onChange={setRouteArrivalCode} + onChange={(code) => { + setRouteArrivalCode(code); + if (routeSameCitiesError) setRouteSameCitiesError(null); + }} dictionaries={dictionaries} testIdPrefix="route-arrival" /> + {routeSameCitiesError && ( +
+ {t(routeSameCitiesError)} +
+ )}