OnlineBoardFilter: validate departure===arrival mismatch with inline error (Angular parity)

This commit is contained in:
2026-04-20 12:33:21 +03:00
parent 3a3a7cda5f
commit 2434bd702b
@@ -131,6 +131,10 @@ export const OnlineBoardFilter: FC<OnlineBoardFilterProps> = ({
initialTab === "flight" && initialDate ? yyyymmddToDate(initialDate) : null,
);
const [flightNumberError, setFlightNumberError] = useState<string | null>(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<string | null>(null);
// Route fields
const [routeDepartureCode, setRouteDepartureCode] = useState<string>(initialDeparture ?? "");
@@ -250,6 +254,15 @@ export const OnlineBoardFilter: FC<OnlineBoardFilterProps> = ({
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:0024:00 searches keep the URL clean (Angular spreads
// `...this.timeRange` which is undefined until interaction).
@@ -411,7 +424,10 @@ export const OnlineBoardFilter: FC<OnlineBoardFilterProps> = ({
: 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<OnlineBoardFilterProps> = ({
: t("SHARED.CITY_PLACEHOLDER")
}
value={routeArrivalCode}
onChange={setRouteArrivalCode}
onChange={(code) => {
setRouteArrivalCode(code);
if (routeSameCitiesError) setRouteSameCitiesError(null);
}}
dictionaries={dictionaries}
testIdPrefix="route-arrival"
/>
{routeSameCitiesError && (
<div
className="validation-tooltip"
data-testid="route-same-cities-error"
>
{t(routeSameCitiesError)}
</div>
)}
<div className="calendar">
<label className="label--filter">