diff --git a/src/features/online-board/components/details-panels/FlightDetailsAccordion.scss b/src/features/online-board/components/details-panels/FlightDetailsAccordion.scss index 9bf5d609..a4de6621 100644 --- a/src/features/online-board/components/details-panels/FlightDetailsAccordion.scss +++ b/src/features/online-board/components/details-panels/FlightDetailsAccordion.scss @@ -113,6 +113,16 @@ word-break: break-word; } + &__subtitle-link { + color: inherit; + text-decoration: none; + + &:hover, + &:focus-visible { + text-decoration: underline; + } + } + // Status label (Закончена / Идет / Ожидается). Angular sizes it 16px // and uses Aeroflot red (#C8102E) for the 'Finished' state. &__status { diff --git a/src/features/online-board/components/details-panels/FlightDetailsAccordion.test.tsx b/src/features/online-board/components/details-panels/FlightDetailsAccordion.test.tsx index 08346816..4189a08e 100644 --- a/src/features/online-board/components/details-panels/FlightDetailsAccordion.test.tsx +++ b/src/features/online-board/components/details-panels/FlightDetailsAccordion.test.tsx @@ -112,6 +112,27 @@ describe("FlightDetailsAccordion", () => { expect(screen.getByText("Airbus A320")).toBeTruthy(); }); + it("TIRREDESIGN-24: renders aircraft title as an external plane-park link", () => { + const leg = makeLeg({ + equipment: { name: "A320", aircraft: { actual: { title: "Airbus A320" } } }, + }); + render(); + + const link = screen.getByRole("link", { name: "Airbus A320" }); + expect(link.getAttribute("href")).toBe("http://www.aeroflot.ru/cms/ru/flight/plane_park"); + expect(link.getAttribute("target")).toBe("_blank"); + }); + + it("TIRREDESIGN-24: uses locale language in the plane-park link", () => { + const leg = makeLeg({ + equipment: { name: "A320", aircraft: { scheduled: { title: "Airbus A320" } } }, + }); + render(); + + expect(screen.getByRole("link", { name: "Airbus A320" }).getAttribute("href")) + .toBe("http://www.aeroflot.ru/cms/en/flight/plane_park"); + }); + it("renders meal tab when equipment.meal has items", () => { const leg = makeLeg({ equipment: { name: "A320", meal: [{ type: "Economy" }] }, diff --git a/src/features/online-board/components/details-panels/FlightDetailsAccordion.tsx b/src/features/online-board/components/details-panels/FlightDetailsAccordion.tsx index 2a0f7243..fc058a7b 100644 --- a/src/features/online-board/components/details-panels/FlightDetailsAccordion.tsx +++ b/src/features/online-board/components/details-panels/FlightDetailsAccordion.tsx @@ -48,6 +48,11 @@ interface RowDef { isTransition?: boolean; } +function aircraftParkHref(locale: string | undefined): string { + const language = locale?.split("-")[0] || "ru"; + return `http://www.aeroflot.ru/cms/${language}/flight/plane_park`; +} + // Registration — person with a badge/ID on the chest, mirroring Angular's // sprite #service icon (check-in agent silhouette). const ICON_REGISTRATION: JSX.Element = ( @@ -210,7 +215,16 @@ export const FlightDetailsAccordion: FC = ({ leg, v id: "aircraft", icon: ICON_AIRCRAFT, title: t("SHARED.PLANE"), - subtitle: title, + subtitle: title ? ( + + {title} + + ) : null, body: ( { + await page.route("**/api/flights/v1.1/ru/onlineboard/details?**", async (route) => { + await route.fulfill({ + status: 200, + contentType: "application/json", + body: onlineboardDetails, + }); + }); + + await context.route("http://www.aeroflot.ru/cms/ru/flight/plane_park", async (route) => { + await route.fulfill({ + status: 200, + contentType: "text/html", + body: "Plane park", + }); + }); + + await page.goto("/ru-ru/onlineboard/SU6951-20260514"); + + const aircraftRow = page.locator('[data-testid="details-row-aircraft"]'); + await expect(aircraftRow).toBeVisible({ timeout: 15000 }); + await expect(aircraftRow.getByText("Борт")).toBeVisible(); + + const link = aircraftRow.locator("a.details-row__subtitle-link"); + await expect(link).toHaveText("Sukhoi SuperJet 100"); + await expect(link).toHaveAttribute( + "href", + "http://www.aeroflot.ru/cms/ru/flight/plane_park", + ); + await expect(link).toHaveAttribute("target", "_blank"); + + const popupPromise = page.waitForEvent("popup"); + await link.click(); + const popup = await popupPromise; + await expect(popup).toHaveURL("http://www.aeroflot.ru/cms/ru/flight/plane_park"); + await popup.close(); +});