diff --git a/src/features/online-board/components/OnlineBoardDetailsPage.scss b/src/features/online-board/components/OnlineBoardDetailsPage.scss index 1e2ecf33..62689c71 100644 --- a/src/features/online-board/components/OnlineBoardDetailsPage.scss +++ b/src/features/online-board/components/OnlineBoardDetailsPage.scss @@ -119,6 +119,10 @@ .leg-route__status-text { color: colors.$blue; } } + &__center--delayed { + .leg-route__status-text { color: colors.$orange; } + } + &__center--cancelled { .leg-route__status-text { color: colors.$red; } // Light tint of $red (C8102E) for the track — derived from the diff --git a/src/features/online-board/components/OnlineBoardDetailsPage.test.tsx b/src/features/online-board/components/OnlineBoardDetailsPage.test.tsx index 8d5af14e..b06ee47d 100644 --- a/src/features/online-board/components/OnlineBoardDetailsPage.test.tsx +++ b/src/features/online-board/components/OnlineBoardDetailsPage.test.tsx @@ -506,6 +506,81 @@ describe("OnlineBoardDetailsPage", () => { }); }); + describe("TZ §4.1.15.8 timeline status center-class per status", () => { + /** + * Build a flight whose single leg has the given status, render the page, + * and return the center div element so we can assert its class. + */ + function renderWithStatus(status: string): HTMLElement { + const flight = { + ...mockFlight, + status, + leg: { ...mockFlight.leg, status }, + }; + mockState = { + flight: flight as typeof mockFlight, + allFlights: [flight as typeof mockFlight], + daysOfFlight: ["20250115"], + loading: false, + error: null, + }; + const { container } = render( + , + ); + const center = container.querySelector(".leg-route__center"); + if (!center) throw new Error("leg-route__center not found"); + return center as HTMLElement; + } + + it("4.1.15.8-R-Sched: Scheduled → center--progress (blue)", () => { + const center = renderWithStatus("Scheduled"); + expect(center.className).toContain("leg-route__center--progress"); + }); + + it("4.1.15.8-R-InFlight: InFlight → center--in-flight (green)", () => { + const center = renderWithStatus("InFlight"); + expect(center.className).toContain("leg-route__center--in-flight"); + }); + + it("4.1.15.8-R-Sent: Sent (departed from gate) → center--in-flight (green, plane visible)", () => { + // TZ §4.1.15.8 and Angular's FlightStatusLegacy.inFlight: Sent is treated + // as in-flight for the progress bar — the plane has left the gate. + const center = renderWithStatus("Sent"); + expect(center.className).toContain("leg-route__center--in-flight"); + }); + + it("4.1.15.8-R-Landed: Landed → center--finished (green, bar 100%)", () => { + const center = renderWithStatus("Landed"); + expect(center.className).toContain("leg-route__center--finished"); + }); + + it("4.1.15.8-R-Arrived: Arrived → center--finished (green, bar 100%)", () => { + const center = renderWithStatus("Arrived"); + expect(center.className).toContain("leg-route__center--finished"); + }); + + it("4.1.15.8-R-Cancelled: Cancelled → center--cancelled (red)", () => { + const center = renderWithStatus("Cancelled"); + expect(center.className).toContain("leg-route__center--cancelled"); + }); + + it("4.1.15.8-R-Delayed: Delayed → center--delayed (orange, not blue)", () => { + // Gap: prior to this fix Delayed fell into center--progress (blue). + const center = renderWithStatus("Delayed"); + expect(center.className).toContain("leg-route__center--delayed"); + expect(center.className).not.toContain("leg-route__center--progress"); + }); + + it("4.1.15.8-R-Unknown: Unknown → center--progress (blue, no plane marker)", () => { + const center = renderWithStatus("Unknown"); + expect(center.className).toContain("leg-route__center--progress"); + }); + }); + describe("parent-request codec (TZ §4.1.2 Table 5 row 6)", () => { it("4.1.2-R-Request-route: hydrates mini-list from route parent-request", () => { mockSearchParamsInstance = new URLSearchParams( diff --git a/src/features/online-board/components/OnlineBoardDetailsPage.tsx b/src/features/online-board/components/OnlineBoardDetailsPage.tsx index 54d6f560..082618d9 100644 --- a/src/features/online-board/components/OnlineBoardDetailsPage.tsx +++ b/src/features/online-board/components/OnlineBoardDetailsPage.tsx @@ -115,9 +115,10 @@ function LegRoute({ const isFinished = status === "Arrived" || status === "Landed"; const isCancelled = status === "Cancelled"; + const isDelayed = status === "Delayed"; // Matches Angular's FlightStatusLegacy.inFlight — covers Airborne/InFlight // as well as Departed/Sent once the plane has left the gate. - const isInFlight = status === "InFlight"; + const isInFlight = status === "InFlight" || status === "Sent"; // §4.1.15.7 R94–R97: compute elapsed / remaining / position via shared helper. // Arrival time priority: actual > estimated > scheduled (R94). @@ -154,7 +155,7 @@ function LegRoute({
{t(`FLIGHT-STATUSES.${status}`)}