+ <>
- {/* Connection status */}
-
- {connectionStatus === "live" && (
- Live
- )}
- {connectionStatus === "reconnecting" && (
- Reconnecting...
- )}
- {connectionStatus === "offline" && (
- Offline
- )}
-
+
}
+ title={
{flightNumber}
}
+ breadcrumbs={[
+ { label: t("BREADCRUMBS.ONLINEBOARD"), url: onlineboardHref },
+ { label: flightNumber },
+ ]}
+ contentLeft={
+
+ }
+ >
+
+ {/* Connection status */}
+
+ {connectionStatus === "live" && (
+ Live
+ )}
+ {connectionStatus === "reconnecting" && (
+ Reconnecting...
+ )}
+ {connectionStatus === "offline" && (
+ Offline
+ )}
+
- {/* Flight header */}
-
-
{flightNumber}
- {displayFlight.status}
-
+ {/* Overall status (h1 moved to PageLayout title) */}
+
+ {displayFlight.status}
+
- {/* Summary card */}
-
+ {/* Summary card */}
+
- {/* Operating carrier */}
- {displayFlight.operatingBy.carrier && (
-
- Operated by: {displayFlight.operatingBy.carrier}
- {displayFlight.operatingBy.flightNumber
- ? ` ${displayFlight.operatingBy.flightNumber}`
- : ""}
+ {/* Operating carrier */}
+ {displayFlight.operatingBy.carrier && (
+
+ Operated by: {displayFlight.operatingBy.carrier}
+ {displayFlight.operatingBy.flightNumber
+ ? ` ${displayFlight.operatingBy.flightNumber}`
+ : ""}
+
+ )}
+
+ {/* Detailed leg information */}
+
+
+ {/* Flying time */}
+
+ Total flying time: {displayFlight.flyingTime}
+
- )}
-
- {/* Detailed leg information */}
-
-
- {/* Flying time */}
-
- Total flying time: {displayFlight.flyingTime}
-
-
+
+ >
);
};
diff --git a/src/i18n/locales/en/common.json b/src/i18n/locales/en/common.json
index 887fd6a7..d165a16c 100644
--- a/src/i18n/locales/en/common.json
+++ b/src/i18n/locales/en/common.json
@@ -37,6 +37,9 @@
"TITLE": "Online Timetable",
"YOU_SEARCH": "You searched"
},
+ "BREADCRUMBS": {
+ "ONLINEBOARD": "Online Board"
+ },
"DETAILS": {
"REGISTRATION": "Check-in",
"BOARDING": "Boarding",
diff --git a/src/i18n/locales/ru/common.json b/src/i18n/locales/ru/common.json
index f4f6f09b..e3ea2ec8 100644
--- a/src/i18n/locales/ru/common.json
+++ b/src/i18n/locales/ru/common.json
@@ -37,6 +37,9 @@
"TITLE": "Онлайн-Табло",
"YOU_SEARCH": "Вы искали"
},
+ "BREADCRUMBS": {
+ "ONLINEBOARD": "Онлайн-табло"
+ },
"DETAILS": {
"REGISTRATION": "Регистрация",
"BOARDING": "Посадка",
diff --git a/tests/integration/online-board/flight-details.test.tsx b/tests/integration/online-board/flight-details.test.tsx
index 44a14d6b..e3095b7e 100644
--- a/tests/integration/online-board/flight-details.test.tsx
+++ b/tests/integration/online-board/flight-details.test.tsx
@@ -20,6 +20,17 @@ import { DIRECT_FLIGHT, MULTI_LEG_FLIGHT } from "./fixtures.js";
vi.mock("@modern-js/runtime/router", () => ({
useNavigate: () => vi.fn(),
useParams: () => ({ lang: "ru" }),
+ Link: ({ children, to, ...props }: { children: React.ReactNode; to: string; className?: string; [k: string]: unknown }) => (
+
{children}
+ ),
+}));
+
+vi.mock("@/ui/layout/PageTabs.js", () => ({
+ PageTabs: () =>
,
+}));
+
+vi.mock("@/features/flights-map/hooks/useFeatureFlag.js", () => ({
+ useFeatureFlag: () => false,
}));
vi.mock("@/i18n/provider.js", () => ({
@@ -52,6 +63,7 @@ const FLIGHT_ID: IParsedFlightId = {
function setupWithFlight(flight: ISimpleFlight = DIRECT_FLIGHT) {
mockUseFlightDetails.mockReturnValue({
flight,
+ allFlights: [flight],
loading: false,
error: null,
});
@@ -166,6 +178,7 @@ describe("Flight details page integration", () => {
it("renders error state when API fails", () => {
mockUseFlightDetails.mockReturnValue({
flight: null,
+ allFlights: [],
loading: false,
error: new Error("API error"),
});
@@ -187,6 +200,7 @@ describe("Flight details page integration", () => {
it("renders not-found state when flight is null without error", () => {
mockUseFlightDetails.mockReturnValue({
flight: null,
+ allFlights: [],
loading: false,
error: null,
});