OnlineBoardFilter: validate departure===arrival mismatch with inline error (Angular parity)
This commit is contained in:
@@ -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: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<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">
|
||||
|
||||
Reference in New Issue
Block a user