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();
+});