Populate rule rows for P4 subsections 4.1.13/14 in TZ audit spec

This commit is contained in:
2026-04-21 22:34:32 +03:00
parent 890d575e88
commit 4fd1b054a4
@@ -128,15 +128,15 @@ _Updated after each plan merges. Plan task: after every merge, append a row to t
| Metric | Count |
|---|---|
| Total rules extracted | 494 (4.1.1: 27, 4.1.2: 42, 4.1.3: 22, 4.1.4: 26, 4.1.5: 30, 4.1.6: 14, 4.1.7: 16, 4.1.8: 19, **4.1.9: 58, 4.1.9.1: 12, 4.1.9.2: 11, 4.1.9.3: 13, 4.1.9.4: 9, 4.1.9.5: 14**, **4.1.10: 9, 4.1.10.1: 8**, **4.1.11: 10, 4.1.11.1: 8**, **4.1.12: 7**, 4.1.13: 5 skeleton, 4.1.14: 5 skeleton, 4.1.15: 11 skeleton, 4.1.16: 8 skeleton, 4.1.17: 4, 4.1.18: 3, 4.1.19: 6, 4.1.20: 4, 4.1.21: 5, 4.1.22: 4, 4.1.23: 3, 4.1.24: 7 skeleton) |
| Total rules extracted | **670** (4.1.1: 27, 4.1.2: 42, 4.1.3: 22, 4.1.4: 26, 4.1.5: 30, 4.1.6: 14, 4.1.7: 16, 4.1.8: 19, **4.1.9: 58, 4.1.9.1: 12, 4.1.9.2: 11, 4.1.9.3: 13, 4.1.9.4: 9, 4.1.9.5: 14**, **4.1.10: 9, 4.1.10.1: 8**, **4.1.11: 10, 4.1.11.1: 8**, **4.1.12: 7**, **4.1.13: 81** (opening 18 + §4.1.13.1 ×11 + §4.1.13.2 ×7 + §4.1.13.3 ×27 + §4.1.13.4 ×18), **4.1.14: 105** (opening 24 + §4.1.14.1 ×11 + §4.1.14.2 ×9 + §4.1.14.3 ×30 + §4.1.14.4 ×31), 4.1.15: 11 skeleton, 4.1.16: 8 skeleton, 4.1.17: 4, 4.1.18: 3, 4.1.19: 6, 4.1.20: 4, 4.1.21: 5, 4.1.22: 4, 4.1.23: 3, 4.1.24: 7 skeleton) |
| Done | 285 (P1: 104 across §4.1.2/3/4/8; P2 adds 48 across §4.1.1/5/6/7; **P3 adds 133**: §4.1.9 ×30 Done + §4.1.9.1 ×12 + §4.1.9.2 ×11 + §4.1.9.3 ×13 + §4.1.9.4 ×9 + §4.1.9.5 ×14 + §4.1.10 ×9 + §4.1.10.1 ×8 + §4.1.11 ×10 + §4.1.11.1 ×8 + §4.1.12 ×7 + §4.1.8-R4/R5 ×2) |
| Implemented | ~48 (pre-P1 + P2-verified: §4.1.1 ×10, §4.1.5 ×2, §4.1.6 ×4, §4.1.7 ×3, §4.1.14-R5, §4.1.17-R1/R2, §4.1.21-R1/R2, §4.1.4-R2, §4.1.2-R3, plus others; **P3 adds ~17 more** within §4.1.9: R1/R2/R9/R14/R15/R16/R20/R21/R22/R31/R32/R33/R34/R35/R37/R39/R43/R45/R46/R47/R48/R51/R58 and Schedule defaults) |
| Implemented | ~49 (pre-P1 + P2-verified: §4.1.1 ×10, §4.1.5 ×2, §4.1.6 ×4, §4.1.7 ×3, §4.1.17-R1/R2, §4.1.21-R1/R2, §4.1.4-R2, §4.1.2-R3, plus others; **P3 adds ~17 more** within §4.1.9; **P4 task 1 adds** §4.1.14.4-R19 (multi-leg logo compactness `3ae59da`)) |
| Partial | 2 (4.1.2-R4 flight-number padding not unit-tested; 4.1.4-R12 / R13 departure/arrival leaf city-pair deferred — see C3) |
| Missing | 0 |
| Conflict | 7 (C1C7 in Conflicts register; C1 resolved `bcaf3ab`, C2 resolved `2fe5364`, C3 deferred, C4 resolved `1821f7f`, C5 pending P6, C6 resolved `53b5359`, **C7 resolved `2b0a7ec`** (localStorage→sessionStorage for search history); 1 rule cell still marked Conflict: 4.1.1-R22 = C5 pending P6) |
| Out-of-scope (backend) | 13 (§4.1.5-R1..R11, R13, R28 — backend aggregation service rules; tracked separately) |
| TBD | ~131 (from P3 resolved: §4.1.8-R4/R5 now Done; §4.1.9-R53-R57 moved to TBD(P4); remaining pre-existing TBDs: §4.1.1: R15/R16/R25; §4.1.5-R12; §4.1.6-R14; §4.1.7-R16; §4.1.134.1.16 skeleton; §4.1.17-R3/R4; §4.1.184.1.24 skeleton; 4.1.9-R53-R57 now P4-tagged) |
| **Check** | 285 Done + 48 Implemented + 2 Partial + 1 Conflict + 13 Out-of-scope + ~131 TBD ≈ **480** (rounding on skeleton sections; NFR rows excluded; P3 resolved 133 rules Done + 17 more Implemented; 5 rules moved from TBD to TBD-P4 plan column) |
| TBD | ~316 (**P4 task 1 adds** 184 new TBD rules across §4.1.13/14; pre-existing TBDs: §4.1.1: R15/R16/R25; §4.1.5-R12; §4.1.6-R14; §4.1.7-R16; §4.1.15/16 skeleton; §4.1.17-R3/R4; §4.1.184.1.24 skeleton; §4.1.9-R53-R57 P4-tagged) |
| **Check** | 285 Done + 49 Implemented + 2 Partial + 1 Conflict + 13 Out-of-scope + ~316 TBD ≈ **666** (P4 task 1 populated §4.1.13 skeleton 5→81 rules, §4.1.14 skeleton 5→105 rules; net +176 rules to total; §4.1.14.4-R19 pre-confirmed Implemented) |
### Merge log
@@ -750,36 +750,252 @@ Source: TZ §4.1.12 (lines 757766).
---
# 4.1.13 — Список результатов поиска рейсов Онлайн-Табло
*Online-Board results list: day tabs (4.1.13.1), sort (4.1.13.2), collapsed row (4.1.13.3), expanded row (4.1.13.4). ~15 pages of UI rules, many mockup references. Target rule count: **80100**.*
*Online-Board results list: day tabs (4.1.13.1), sort (4.1.13.2), collapsed row (4.1.13.3), expanded row (4.1.13.4). Target rule count: **80100**.*
> **Populated at P4 kickoff.** Skeleton only.
Covers the full per-day results list shown after executing a search in Online-Board. Today's list auto-scrolls to current time and auto-expands the nearest flight. Other days open at the first result with no auto-scroll. No pagination — scroll only. No auto-refresh (live updates arrive via SignalR/WebSocket). Desktop and tablet have sticky day-tabs + filter; mobile has no sticky elements.
## §4.1.13 — opening + structure (R1R18)
| # | Rule | TZ cite | Viewport | Current impl | Status | Action | Plan |
|---|---|---|---|---|---|---|---|
| 4.1.13-R1 | **4.1.13.1** Day tabs — behavior (today/future/past styling, active-day visuals, keyboard nav, scroll/paging) | 4.1.13.1 | all | `DayTabs/` | TBD | Enumerate. | P4 |
| 4.1.13-R2 | **4.1.13.2** Sort rules (default order, user-toggle options, stable ordering by secondary key) | 4.1.13.2 | all | — | TBD | Enumerate. | P4 |
| 4.1.13-R3 | **4.1.13.3** Collapsed row — layout + per-field rendering (carrier, flight number, from-to, times, status, aircraft icon, etc.) | 4.1.13.3 | all | `src/ui/flights/*` | TBD | Enumerate. | P4 |
| 4.1.13-R4 | **4.1.13.4** Expanded row — layout, accordion behavior, mini-timeline, carriers operator+marketing, terminal/gate, registration/boarding blocks, live status | 4.1.13.4 | all | `OnlineBoardSearchPage.tsx` + `src/ui/flights/*` | TBD | Enumerate. | P4 |
| 4.1.13-R5 | Scroll-to-top "иконка-кнопка" appears when list scrolled past threshold | 4.1 ¶ intro | all | — | TBD | Verify + add if missing. | P4 |
| 4.1.13-R1 | Today's results list is scrolled to user's current time on load | 4.1.131 | all | `OnlineBoardSearchPage.tsx` | TBD | Verify scroll-to-current-time on today tab. | P4 |
| 4.1.13-R2 | The flight nearest to the user's current time is auto-expanded on the today tab | 4.1.13 ¶1 | all | `OnlineBoardSearchPage.tsx` | TBD | Verify auto-expand nearest-to-now. | P4 |
| 4.1.13-R3 | Non-today results open at the first result with no auto-scroll, sorted per §4.1.13.2 | 4.1.13 ¶2 | all | — | TBD | Verify no-scroll on non-today tabs. | P4 |
| 4.1.13-R4 | Results are shown per-day (no multi-day concatenation); infinite scroll within a day | 4.1.13 ¶3 | all | `OnlineBoardSearchPage.tsx` | TBD | Verify per-day isolation. | P4 |
| 4.1.13-R5 | No pagination UI — scroll-only for large result sets | 4.1.13 ¶3 | all | — | TBD | Verify no pagination component rendered. | P4 |
| 4.1.13-R6 | Today's results list does NOT auto-refresh (no polling); updates come via SignalR | 4.1.13 ¶4 | all | — | TBD | Verify no polling interval in board hook. | P4 |
| 4.1.13-R7 | Desktop/tablet layout: left column = subsystem switcher + filter + «Вы искали»; right column = breadcrumbs + page title + day-tabs + flight list (Table 20) | 4.1.13 Table 20 | desktop, tablet | `OnlineBoardSearchPage.tsx` | TBD | Verify two-column layout matches Table 20. | P4 |
| 4.1.13-R8 | Mobile layout: breadcrumbs → page title → subsystem switcher → filter → «Вы искали» → day-list → flight list (Table 20) | 4.1.13 Table 20 | mobile | `OnlineBoardSearchPage.tsx` | TBD | Verify single-column stacking order on mobile. | P4 |
| 4.1.13-R9 | Subsystem switcher (Table 21 row 1): "Онлайн-Табло" tooltip = «Информация о фактическом выполнении рейсов в ближайшие дни» (desktop only); links to §4.1.8 cross-section nav | 4.1.13 Table 21 row 1 | desktop | `SubsystemSwitcher/` | TBD | Verify tooltip text on Board button. | P4 |
| 4.1.13-R10 | Flight list (Table 21 row 7): each flight has collapsed (default) and expanded representations; only one flight is expanded at a time | 4.1.13 Table 21 row 7 + ¶ after table | all | `OnlineBoardFlightList/` | TBD | Verify single-expanded-at-a-time accordion behavior. | P4 |
| 4.1.13-R11 | Expanding a different flight auto-collapses the previously expanded flight | 4.1.13 ¶ after Table 21 | all | `OnlineBoardFlightList/` | TBD | Verify collapse of previous row on new expand. | P4 |
| 4.1.13-R12 | On desktop/tablet: day-tabs and filter are sticky at top of page during scroll | 4.1.13 Table 22 | desktop, tablet | — | TBD | Verify sticky positioning for day-tabs + filter. | P4 |
| 4.1.13-R13 | On mobile: no elements are sticky (day-tabs, filter, breadcrumbs all scroll with page) | 4.1.13 Table 22 | mobile | — | TBD | Verify no sticky on mobile board results. | P4 |
| 4.1.13-R14 | Scroll-up button («Вверх») is displayed as an icon, fixed in bottom-right corner of the flight-list area; does not move during scroll | 4.1.13 ¶ «Кнопка Вверх» | all | — | TBD | Verify fixed bottom-right positioning. | P4 |
| 4.1.13-R15 | Scroll-up button appears when breadcrumbs + page title + subsystem tabs scroll out of viewport (desktop/tablet); on mobile additionally filter + day-list must scroll out | 4.1.13 ¶ «Кнопка Вверх» + Table 22 | all | — | TBD | Verify visibility trigger threshold. | P4 |
| 4.1.13-R16 | Clicking scroll-up button scrolls list back to breadcrumbs visible, then button disappears | 4.1.13 ¶ «Кнопка Вверх» | all | — | TBD | Verify click behavior of scroll-up button. | P4 |
| 4.1.13-R17 | Scroll-up button has no hover/active color change | 4.1.13 ¶ «Кнопка Вверх» | all | — | TBD | Verify no hover style on scroll-up button. | P4 |
| 4.1.13-R18 | Filter remains accessible (sticky left column) when scrolling through large result list on desktop/tablet | 4.1.13 Table 22 | desktop, tablet | — | TBD | Verify filter sticky alongside day-tabs. | P4 |
**Rules enumerated at P4 kickoff.**
## §4.1.13.1 — Поведение Табов-дней (Day-tabs behavior)
| # | Rule | TZ cite | Viewport | Current impl | Status | Action | Plan |
|---|---|---|---|---|---|---|---|
| 4.1.13.1-R1 | Day-tabs (Табы-дни) paginate in groups of 7 | 4.1.13.1 ¶2 | desktop, tablet | `DayTabs/` | TBD | Verify 7-per-page grouping. | P4 |
| 4.1.13.1-R2 | Active day-tabs range: `[-1 day, +14 days]` from user's current date | 4.1.13.1 ¶3 | all | `DayTabs/` | TBD | Verify active range clipping. | P4 |
| 4.1.13.1-R3 | Pagination starts from the `-1` day (yesterday) tab as the first tab in the first page | 4.1.13.1 ¶4 | desktop, tablet | `DayTabs/` | TBD | Verify first page starts at -1 day. | P4 |
| 4.1.13.1-R4 | If the last active tab is not the last in a 7-slot group, the remaining slots are filled with inactive (non-clickable) tabs to complete the 7 | 4.1.13.1 ¶5 | desktop, tablet | `DayTabs/` | TBD | Verify inactive padding tabs at end of range. | P4 |
| 4.1.13.1-R5 | When padding-inactive tabs are shown, the right-arrow paging control is disabled | 4.1.13.1 ¶5 | desktop, tablet | `DayTabs/` | TBD | Verify right-arrow disabled state when padded. | P4 |
| 4.1.13.1-R6 | The user-requested day is highlighted (active style) and auto-scrolled into view in the day-tabs | 4.1.13.1 ¶6 | desktop, tablet | `DayTabs/` | TBD | Verify active highlight + scroll-to on load. | P4 |
| 4.1.13.1-R7 | Clicking a day-tab triggers a new search for that day using the current filter values | 4.1.13.1 ¶7 | desktop, tablet | `DayTabs/` | TBD | Verify search re-executes on tab click with same filter. | P4 |
| 4.1.13.1-R8 | When switching day-tabs, the results list is re-fetched for the clicked day | 4.1.13.1 ¶8 | desktop, tablet | `DayTabs/` | TBD | Verify API call on tab change. | P4 |
| 4.1.13.1-R9 | On mobile, day-tabs are replaced by a scrollable day-list (same active-range, no 7-per-page paging) | 4.1.13.1 ¶9 | mobile | `DayList/` | TBD | Verify day-list renders on mobile instead of tabs. | P4 |
| 4.1.13.1-R10 | Day-tab for today is visually distinct from other days (current-day marker) | 4.1.13.1 (TZ Table 21 + mockup App.4) | all | `DayTabs/` | TBD | Verify today styling. | P4 |
| 4.1.13.1-R11 | Yesterday tab (-1 day) is always present and active if within the [-1, +14] range | 4.1.13.1 ¶3 | all | `DayTabs/` | TBD | Verify -1 day tab always visible and clickable. | P4 |
## §4.1.13.2 — Сортировка (Default sort order)
| # | Rule | TZ cite | Viewport | Current impl | Status | Action | Plan |
|---|---|---|---|---|---|---|---|
| 4.1.13.2-R1 | No user-triggered re-sort — only default sort is applied | 4.1.13.2 ¶1 | all | — | TBD | Verify no sort controls are rendered in OB results. | P4 |
| 4.1.13.2-R2 | Default sort for "Номер рейса" mode: ascending by departure date | 4.1.13.2 ¶2 | all | — | TBD | Verify flight-number mode sort by departure date. | P4 |
| 4.1.13.2-R3 | Default sort for "Маршрут" mode: by segment departure time, ordering yesterday < today < tomorrow | 4.1.13.2 ¶3 | all | — | TBD | Verify route mode sort with day-ordering. | P4 |
| 4.1.13.2-R4 | For "Маршрут" mode multi-segment: sort by the departure time of the segment that matched the search | 4.1.13.2 ¶3 | all | — | TBD | Verify matched-segment departure time is sort key for multi-leg. | P4 |
| 4.1.13.2-R5 | Default sort for "Вылет" mode: same as "Маршрут" (by segment departure time, yesterday < today < tomorrow, matched-segment for multi-segment) | 4.1.13.2 ¶4 | all | — | TBD | Verify departure-only mode sort. | P4 |
| 4.1.13.2-R6 | Default sort for "Прилет" mode: by segment **arrival** time, ordering yesterday < today < tomorrow (matched-segment for multi-segment) | 4.1.13.2 ¶5 | all | — | TBD | Verify arrival-only mode sort by arrival time. | P4 |
| 4.1.13.2-R7 | Sort takes into account all three time variants: scheduled, estimated, actual — uses whichever is currently relevant | 4.1.13.2 ¶1 | all | — | TBD | Verify sort uses actual/estimated when available. | P4 |
## §4.1.13.3 — Свернутое представление (Collapsed row)
| # | Rule | TZ cite | Viewport | Current impl | Status | Action | Plan |
|---|---|---|---|---|---|---|---|
| 4.1.13.3-R1 | Flight number displayed as `SU XXXX` (4-digit format) | 4.1.13.3 Table 23 row 1 | all | `OnlineBoardFlightRow/` | TBD | Verify flight-number formatting. | P4 |
| 4.1.13.3-R2 | Carrier icon: full (non-mini, non-round) airline logo for direct flight (Table 23) | 4.1.13.3 Table 23 row 2 | all | `OnlineBoardFlightRow/` | TBD | Verify full logo (not round mini) for direct flight. | P4 |
| 4.1.13.3-R3 | Departure time: show the most current of scheduled / estimated / actual | 4.1.13.3 Table 23 row 3 | all | `OnlineBoardFlightRow/` | TBD | Verify time priority: actual > estimated > scheduled. | P4 |
| 4.1.13.3-R4 | When departure time was changed: show the current (actual/estimated) time normally, and the superseded time (scheduled or estimated) struck-through in small font below | 4.1.13.3 Table 23 row 3 | all | `OnlineBoardFlightRow/` | TBD | Verify strikethrough display of superseded time. | P4 |
| 4.1.13.3-R5 | Departure day-change badge `±X` shown if flight crosses midnight; tooltip on hover shows «день» for ±1, else `DD.MM.YYYY` of the relevant date; no tooltip on mobile | 4.1.13.3 Table 23 row 4 | all | `DayChangeBadge/` | TBD | Verify badge + tooltip content per 4.1.17. | P4 |
| 4.1.13.3-R6 | Departure city name shown | 4.1.13.3 Table 23 row 5 | all | `OnlineBoardFlightRow/` | TBD | Verify city field rendered. | P4 |
| 4.1.13.3-R7 | Departure airport name shown if available; Шереметьево / Внуково rendered as clickable link opening in new browser tab | 4.1.13.3 Table 23 row 6 | all | `OnlineBoardFlightRow/` | TBD | Verify airport link behavior for SVO/VKO. | P4 |
| 4.1.13.3-R8 | Departure terminal code shown if available | 4.1.13.3 Table 23 row 7 | all | `OnlineBoardFlightRow/` | TBD | Verify terminal field conditionally rendered. | P4 |
| 4.1.13.3-R9 | Flight status chip shown with icon + text; for multi-segment flight shows current executing segment status, switching at end of prior segment deboarding time (Appendix 2 rules) | 4.1.13.3 Table 23 row 8 | all | `FlightStatusChip/` | TBD | Verify status chip + multi-segment status switching logic. | P4 |
| 4.1.13.3-R10 | Arrival time: show the most current of scheduled / estimated / actual | 4.1.13.3 Table 23 row 9 | all | `OnlineBoardFlightRow/` | TBD | Verify arrival time priority. | P4 |
| 4.1.13.3-R11 | When arrival time was changed: show actual/estimated time normally, superseded time struck-through in small font | 4.1.13.3 Table 23 row 9 | all | `OnlineBoardFlightRow/` | TBD | Verify strikethrough on changed arrival time. | P4 |
| 4.1.13.3-R12 | Arrival day-change badge `±X` with same tooltip rules as departure | 4.1.13.3 Table 23 row 10 | all | `DayChangeBadge/` | TBD | Verify arrival day-change badge. | P4 |
| 4.1.13.3-R13 | Arrival city name shown | 4.1.13.3 Table 23 row 11 | all | `OnlineBoardFlightRow/` | TBD | Verify arrival city field. | P4 |
| 4.1.13.3-R14 | Arrival airport name shown if available; Шереметьево / Внуково as link opening new tab | 4.1.13.3 Table 23 row 12 | all | `OnlineBoardFlightRow/` | TBD | Verify arrival airport link. | P4 |
| 4.1.13.3-R15 | Arrival terminal code shown if available | 4.1.13.3 Table 23 row 13 | all | `OnlineBoardFlightRow/` | TBD | Verify arrival terminal conditional display. | P4 |
| 4.1.13.3-R16 | Expand/collapse toggle element (arrow icon) shown on every row | 4.1.13.3 Table 23 row 14 | all | `OnlineBoardFlightRow/` | TBD | Verify toggle arrow present. | P4 |
| 4.1.13.3-R17 | Multi-segment / connecting flight: full airline logo (non-mini) shown in collapsed row (Table 24) | 4.1.13.3 Table 24 row 2 | all | `OnlineBoardFlightRow/` | TBD | Verify full logo for multi-seg collapsed. | P4 |
| 4.1.13.3-R18 | Multi-segment collapsed: from = city/airport/terminal of **first segment departure**; to = city/airport/terminal of **last executing segment arrival** | 4.1.13.3 Table 24 rows 513 | all | `OnlineBoardFlightRow/` | TBD | Verify first-dep/last-arr for multi-seg collapsed. | P4 |
| 4.1.13.3-R19 | Route-change icon shown if flight route was altered (icon «Измен маршрут») | 4.1.13.3 Table 24 row 15 | all | `OnlineBoardFlightRow/` | TBD | Verify route-change icon conditional render. | P4 |
| 4.1.13.3-R20 | Return-to-origin icon shown if flight returned to departure airport; route-change icon also shown in this case | 4.1.13.3 Table 24 row 16 | all | `OnlineBoardFlightRow/` | TBD | Verify return-to-origin icon + co-shown route-change. | P4 |
| 4.1.13.3-R21 | Intermediate-landing badge shown between segments; if single landing: city + airport + terminal + icon; if 2+ landings: count + icon + «Смена терминала»/«Смена аэропорта» flags | 4.1.13.3 Table 24 row 17 + §4.1.13.3.2 | all | `IntermediateLandingBadge/` | TBD | Verify single vs multi-stop badge content. | P4 |
| 4.1.13.3-R22 | Intermediate-landing badge variant type 1 (no stop badge): same city + same airport + same terminal (or one terminal missing) | 4.1.13.3.2 rules | all | `IntermediateLandingBadge/` | TBD | Verify badge type 1 conditions. | P4 |
| 4.1.13.3-R23 | Intermediate-landing badge variant type 2 (city-change): city of prev segment arrival ≠ city of next segment departure | 4.1.13.3.2 rules | all | `IntermediateLandingBadge/` | TBD | Verify badge type 2 (city change). | P4 |
| 4.1.13.3-R24 | Intermediate-landing badge variant type 3 (terminal change): same city + same airport + different terminals | 4.1.13.3.2 rules | all | `IntermediateLandingBadge/` | TBD | Verify badge type 3 (terminal change). | P4 |
| 4.1.13.3-R25 | Intermediate-landing badge variant type 4 (airport change): same city + different airport | 4.1.13.3.2 rules | all | `IntermediateLandingBadge/` | TBD | Verify badge type 4 (airport change). | P4 |
| 4.1.13.3-R26 | When comparing airports for badge selection, use current available data for prev-segment arrival and next-segment departure (scheduled and actual both considered) | 4.1.13.3.2 rules | all | `IntermediateLandingBadge/` | TBD | Verify airport comparison uses both scheduled and actual data. | P4 |
| 4.1.13.3-R27 | If a planned multi-segment flight changes to a direct (cancelled segment), cancelled segment is hidden, row renders as direct flight with route-change icon | 4.1.13.3 ¶ after Table 24 | all | `OnlineBoardFlightRow/` | TBD | Verify multi→direct change rendering. | P4 |
## §4.1.13.4 — Развернутое представление (Expanded row)
| # | Rule | TZ cite | Viewport | Current impl | Status | Action | Plan |
|---|---|---|---|---|---|---|---|
| 4.1.13.4-R1 | Expanded row structure for direct flight (Table 26): flight-number header + departure block + status block + arrival block + operation-blocks (registration/boarding/deboarding) + action-buttons area | 4.1.13.4 Table 26 | all | `OnlineBoardFlightExpanded/` | TBD | Verify expanded layout structure for direct. | P4 |
| 4.1.13.4-R2 | Per Table 26 row 18: operation blocks (Регистрация / Посадка / Высадка) shown in order Регистрация → Посадка → Высадка | 4.1.13.4 §4.1.13.4.3 | all | `OnlineBoardFlightExpanded/` | TBD | Verify block ordering. | P4 |
| 4.1.13.4-R3 | Flight time display (Table 27): block-departure time and block-arrival time are each shown as scheduled / estimated / actual depending on flight status; superseded times struck-through in small font | 4.1.13.4 Table 27 | all | `OnlineBoardFlightExpanded/` | TBD | Verify time-block algorithm per Table 27. | P4 |
| 4.1.13.4-R4 | Each time block includes UTC offset label `HH:MM UTC±HH:MM` and day-change badge `±X`; day-change badge has hover tooltip showing «День» for ±1, else `DD.MM.YYYY`; no tooltip on mobile | 4.1.13.4 ¶ after Table 27 | all | `OnlineBoardFlightExpanded/` | TBD | Verify UTC offset + day-change tooltip in expanded. | P4 |
| 4.1.13.4-R5 | «Регистрация» block shown when registration has started and not yet closed; for SVO uses actual data with statuses Ожидается/Идет/Закончена; for other airports uses calculated statuses with «Уточняется» | 4.1.13.4 §4.1.13.4.3 Table 28 | all | `RegistrationBlock/` | TBD | Verify registration block show/hide logic. | P4 |
| 4.1.13.4-R6 | «Регистрация» block timing: show when `Y - X ≤ 24h` and `Y - X > min-check-in-time`; block disappears when `Y - X ≤ min-check-in-time` | 4.1.13.4 Table 28 | all | `RegistrationBlock/` | TBD | Verify time-window calculation for reg block. | P4 |
| 4.1.13.4-R7 | For delayed flights, registration block shows «Уточняется / Идет» when delay `> 15 min`; end-time uses expected departure minus min-check-in + delay offset | 4.1.13.4 Table 28 delayed rows | all | `RegistrationBlock/` | TBD | Verify delayed-flight reg block behavior. | P4 |
| 4.1.13.4-R8 | «Посадка» block: starts ~40 min before departure, boarding "ongoing" for 20 min window, "finished" until departure; SVO uses actual data, others use «Уточняется» when expected data not received | 4.1.13.4 Table 29 | all | `BoardingBlock/` | TBD | Verify boarding block timing logic (Tables 29). | P4 |
| 4.1.13.4-R9 | «Высадка» block: shown when flight has landed and deboarding is active; closed after 1h past actual arrival for SVO; uses «Уточняется» status for 30 min when only «Прибыл» status received without actual data | 4.1.13.4 Table 30 | all | `DeboaringBlock/` | TBD | Verify deboarding block logic (Table 30). | P4 |
| 4.1.13.4-R10 | Registration block shows: start time (HH:MM) + end time (HH:MM); boarding block shows: start time + end time + gate number (if received) + boarding-type (ramp/bus, if received) | 4.1.13.4 Table 28-29 attr cols | all | `RegistrationBlock/`, `BoardingBlock/` | TBD | Verify block attribute fields (start, end, gate, ramp/bus). | P4 |
| 4.1.13.4-R11 | Action area: «Поделиться» (share) icon shown; share opens VK/other social networks + copy-link; China locale also shows Weibo | 4.1.13.4 §4.1.13.4.5 | all | `SharePanel/` | TBD | Verify share networks + copy-link in expanded OB row. | P4 |
| 4.1.13.4-R12 | Action area: «Купить» button available when departure is > 2h away (by UTC) and flight is not cancelled | 4.1.13.4 §4.1.13.4.6 | all | `BuyButton/` | TBD | Verify Buy button visibility rule. | P4 |
| 4.1.13.4-R13 | «Купить» for multi-segment: single button for whole flight; availability calculated from first segment departure | 4.1.13.4 §4.1.13.4.6 | all | `BuyButton/` | TBD | Verify single Buy button for multi-seg; uses first-seg time. | P4 |
| 4.1.13.4-R14 | «Купить» not shown for cancelled flights | 4.1.13.4 §4.1.13.4.6 | all | `BuyButton/` | TBD | Verify Buy hidden for cancelled. | P4 |
| 4.1.13.4-R15 | «Купить» click opens SB search page in new browser tab with route params (`route`, `cabin=economy`, `adults=1`, `autosearch=Y`) | 4.1.13.4 §4.1.13.4.6 Table 31 | all | `BuyButton/` | TBD | Verify SB URL params (Table 31 format). | P4 |
| 4.1.13.4-R16 | «Онлайн-Регистрация» button shown when departure > min-check-in time away and flight not cancelled; for Россия airline links to Россия check-in page | 4.1.13.4 §4.1.13.4.7 | all | `OnlineCheckInButton/` | TBD | Verify online check-in button logic and URL. | P4 |
| 4.1.13.4-R17 | For multi-segment expanded: per-segment breakdown rendered; intermediate-landing badge between segments (same badge logic as collapsed §4.1.13.3.2) | 4.1.13.4 Table 26 multi-seg variant | all | `OnlineBoardFlightExpanded/` | TBD | Verify per-segment layout in expanded multi-seg. | P4 |
| 4.1.13.4-R18 | «Детали рейса» button in expanded row opens flight details page (§4.1.15) | 4.1.13.4 §4.1.13.4.8 | all | `DetailsButton/` | TBD | Verify details link navigates to §4.1.15 page. | P4 |
---
# 4.1.14 — Список результатов поиска рейсов Расписания
*Schedule results list: week tabs (4.1.14.1), sort (4.1.14.2), collapsed (4.1.14.3), expanded (4.1.14.4). Largest subsection by page count (~100 pages in TZ). Target rule count: **150200**.*
> **Populated at P4 kickoff.** Skeleton only.
Covers the full weekly results list shown after executing a Schedule search. Results are shown per week, grouped by day within the week. Active date range: `[-1 day, +330 days]` from today. No pagination — scroll within expanded day groups. Desktop/tablet have sticky week-tabs + search-direction header + column header; mobile has no sticky elements.
## §4.1.14 — opening + structure (R1R24)
| # | Rule | TZ cite | Viewport | Current impl | Status | Action | Plan |
|---|---|---|---|---|---|---|---|
| 4.1.14-R1 | **4.1.14.1** Week tabs — month spanning, today highlight, range selection, keyboard nav | 4.1.14.1 | all | `WeekTabs.tsx` | TBD | Enumerate. | P4 |
| 4.1.14-R2 | **4.1.14.2** Sort rules | 4.1.14.2 | all | — | TBD | Enumerate. | P4 |
| 4.1.14-R3 | **4.1.14.3** Collapsed row — day-grouping, weekday-mask, operator logos, times, duration | 4.1.14.3 | all | `DayGroupedFlightList.tsx` + `ScheduleFlightBody.tsx` | TBD | Enumerate. | P4 |
| 4.1.14-R4 | **4.1.14.4** Expanded row — per-segment breakdown, transfer bars, connecting-flight layout, onward-link | 4.1.14.4 | all | `src/features/schedule/components/*` | TBD | Enumerate. | P4 |
| 4.1.14-R5 | Multi-leg operator-logo compactness preserved on expand (see commit `3ae59da` for parity) | 4.1.14.4 | all | `src/features/schedule/*` | Implemented | — | P4 |
| 4.1.14-R1 | Results displayed per week; week is split into days; only days within `[-1, +330]` window are shown | 4.1.141 | all | `ScheduleSearchPage.tsx` | TBD | Verify per-week grouping with day-level expansion. | P4 |
| 4.1.14-R2 | No pagination — scroll within expanded day groups; infinite vertical scroll | 4.1.142 | all | — | TBD | Verify no pagination component in Schedule results. | P4 |
| 4.1.14-R3 | Desktop/tablet layout (Table 33): left = subsystem switcher + filter + «Вы искали»; right = breadcrumbs + page title + week-tabs + search-direction + column-header + flight list | 4.1.14 Table 33 | desktop, tablet | `ScheduleSearchPage.tsx` | TBD | Verify two-column layout per Table 33. | P4 |
| 4.1.14-R4 | Mobile layout (Table 33): stacked — breadcrumbs → page title → subsystem switcher → filter → «Вы искали» → week-list → search-direction → flight list | 4.1.14 Table 33 | mobile | `ScheduleSearchPage.tsx` | TBD | Verify mobile stacking order. | P4 |
| 4.1.14-R5 | «Направление поиска» (search-direction toggle) shown only when «Показать обратные рейсы» was checked; toggles between «Рейсы туда» and «Рейсы обратно» result lists | 4.1.14 Table 34 row 6 | all | `SearchDirectionToggle/` | TBD | Verify direction toggle visibility + switching behavior. | P4 |
| 4.1.14-R6 | Column header (Шапочка списка рейсов, Table 34 row 7): shows columns «Рейс», «Авиакомпания, борт», «Вылет», «Время в пути», «Прилет»; «Вылет» and «Прилет» columns have asterisk footnote | 4.1.14 Table 34 row 7 | desktop, tablet | `ScheduleListHeader/` | TBD | Verify column header with footnote asterisks. | P4 |
| 4.1.14-R7 | Footnote at bottom of list: «* Время в Системе - МЕСТНОЕ» | 4.1.14 Table 34 row 7 | all | `ScheduleSearchPage.tsx` | TBD | Verify footnote text rendered below list. | P4 |
| 4.1.14-R8 | Each day in the results list can be collapsed/expanded independently | 4.1.14 ¶ after Table 34 | all | `ScheduleDayGroup/` | TBD | Verify day-group accordion is independently collapsible. | P4 |
| 4.1.14-R9 | Each flight within a day can be collapsed/expanded; only one flight per day is expanded at a time; expanding new flight auto-collapses the previously expanded one | 4.1.14 ¶ after Table 34 | all | `ScheduleFlightList/` | TBD | Verify single-expanded-at-a-time per day. | P4 |
| 4.1.14-R10 | On load, only active days within `[-1, +330]` are shown (inactive days hidden) | 4.1.14 ¶ results behavior | all | `ScheduleDayGroup/` | TBD | Verify inactive day filtering. | P4 |
| 4.1.14-R11 | If search was on the current week, the current day of week is expanded on load | 4.1.14 ¶ results behavior | all | `ScheduleDayGroup/` | TBD | Verify today's day-group auto-expanded on current-week search. | P4 |
| 4.1.14-R12 | If only one active day remains in the search week (e.g. Sunday), that day is auto-expanded | 4.1.14 ¶ results behavior | all | `ScheduleDayGroup/` | TBD | Verify last-day-of-week auto-expand. | P4 |
| 4.1.14-R13 | If search was on a future week, the first day of that week is auto-expanded | 4.1.14 ¶ results behavior | all | `ScheduleDayGroup/` | TBD | Verify first-day auto-expand for future week. | P4 |
| 4.1.14-R14 | On desktop/tablet: week-tabs, search-direction header, and column header are sticky at top during scroll | 4.1.14 Table 35 | desktop, tablet | — | TBD | Verify sticky for week-tabs + direction + column header. | P4 |
| 4.1.14-R15 | On mobile: no elements are sticky (all scroll with page) | 4.1.14 Table 35 | mobile | — | TBD | Verify no sticky on mobile schedule results. | P4 |
| 4.1.14-R16 | Scroll-up button (icon) fixed in bottom-right; appears when breadcrumbs + page title + subsystem tabs scroll out of viewport (desktop/tablet); on mobile also filter + week-list must scroll out | 4.1.14 ¶ «Кнопка Вверх» + Table 35 | all | — | TBD | Verify scroll-up button trigger for Schedule page. | P4 |
| 4.1.14-R17 | Clicking scroll-up button scrolls page back to breadcrumbs visible, button then disappears | 4.1.14 ¶ «Кнопка Вверх» | all | — | TBD | Verify scroll-up click behavior. | P4 |
| 4.1.14-R18 | Scroll-up button has no hover/active color change | 4.1.14 ¶ «Кнопка Вверх» | all | — | TBD | Verify no hover style on Schedule scroll-up. | P4 |
| 4.1.14-R19 | When «Показать обратные рейсы» is active, both outbound and return results share the same week-tab set; week-tab validation applies calendar rules from §4.1.9.4 | 4.1.14.1 ¶ (round-trip) | all | `WeekTabs/` | TBD | Verify round-trip week-tab validation cross-check. | P4 |
| 4.1.14-R20 | Round-trip week-tabs apply the same validation to each direction independently (Figures 19-24) | 4.1.14.1 ¶ Figures 19-24 | all | `WeekTabs/` | TBD | Verify per-direction tab blocking per mockup Figs 19-24. | P4 |
| 4.1.14-R21 | Filter is sticky (left column) during scroll on desktop/tablet | 4.1.14 Table 35 | desktop, tablet | — | TBD | Verify filter sticky alongside week-tabs. | P4 |
| 4.1.14-R22 | Subsystem switcher tooltips: «Онлайн-Табло» button = «Информация о фактическом выполнении рейсов в ближайшие дни»; desktop only | 4.1.14 Table 34 row 1 | desktop | `SubsystemSwitcher/` | TBD | Verify tooltip on Board button in Schedule context. | P4 |
| 4.1.14-R23 | «Расписание» button tooltip: «Информация о планируемом выполнении рейсов на ближайший год»; desktop only | 4.1.14 Table 34 row 1 | desktop | `SubsystemSwitcher/` | TBD | Verify Schedule button tooltip text. | P4 |
| 4.1.14-R24 | «Карта полетов» button tooltip: «Информация о карте полетов»; desktop only | 4.1.14 Table 34 row 1 | desktop | `SubsystemSwitcher/` | TBD | Verify Map button tooltip in Schedule context. | P4 |
**Rules enumerated at P4 kickoff.**
## §4.1.14.1 — Поведение Табов-недель (Week-tabs behavior)
| # | Rule | TZ cite | Viewport | Current impl | Status | Action | Plan |
|---|---|---|---|---|---|---|---|
| 4.1.14.1-R1 | Week-tabs paginate in groups of 7 weeks | 4.1.14.1 ¶1 | desktop, tablet | `WeekTabs/` | TBD | Verify 7-per-page week grouping. | P4 |
| 4.1.14.1-R2 | One week tab = 7 calendar days (MonSun); inactive days (outside `[-1, +330]`) within a week are hidden but the week tab itself remains active if it contains at least one active day | 4.1.14.1 ¶2 | all | `WeekTabs/` | TBD | Verify partial-week handling: tab active but out-of-range days hidden. | P4 |
| 4.1.14.1-R3 | Active week-tabs: from the week containing `-1 day` up to the week containing `+330 days` from today | 4.1.14.1 ¶3 | all | `WeekTabs/` | TBD | Verify active week-tab range clipping. | P4 |
| 4.1.14.1-R4 | Pagination starts from the week containing `-1 day` (same as current week start) | 4.1.14.1 ¶4 | desktop, tablet | `WeekTabs/` | TBD | Verify first page starts at the week of -1 day. | P4 |
| 4.1.14.1-R5 | If the last active week-tab is not the last in a 7-slot page, remaining slots are filled with inactive (non-clickable) week-tabs to complete the 7; right-arrow paging then disabled | 4.1.14.1 ¶5 | desktop, tablet | `WeekTabs/` | TBD | Verify inactive padding + disabled right-arrow. | P4 |
| 4.1.14.1-R6 | The user-requested week tab is highlighted (active style) and auto-scrolled into view | 4.1.14.1 ¶6 | all | `WeekTabs/` | TBD | Verify requested-week highlight + scroll-to. | P4 |
| 4.1.14.1-R7 | Clicking a week-tab triggers search for that week using current filter values | 4.1.14.1 ¶7 | all | `WeekTabs/` | TBD | Verify search re-executes on week-tab click with same filter. | P4 |
| 4.1.14.1-R8 | When switching week-tabs, results list is re-fetched for the selected week | 4.1.14.1 ¶8 | all | `WeekTabs/` | TBD | Verify API call on week change. | P4 |
| 4.1.14.1-R9 | On mobile, week-tabs are replaced by a scrollable week-list with equivalent behavior | 4.1.14.1 ¶9 | mobile | `WeekList/` | TBD | Verify week-list renders on mobile instead of tabs. | P4 |
| 4.1.14.1-R10 | If the last active week is only a partial week (e.g. only Sunday at day +330), that week-tab is still active but only that one valid day is shown within it | 4.1.14.1 ¶2 | all | `WeekTabs/` | TBD | Verify partial last-week handling. | P4 |
| 4.1.14.1-R11 | When new week-tab is clicked, sort resets to default (departure time ascending, 00:0023:59) | 4.1.14.2 ¶ last | all | `ScheduleSearchPage.tsx` | TBD | Verify sort reset on week-tab switch. | P4 |
## §4.1.14.2 — Сортировка (Sort)
| # | Rule | TZ cite | Viewport | Current impl | Status | Action | Plan |
|---|---|---|---|---|---|---|---|
| 4.1.14.2-R1 | Default sort: by departure time ascending (00:00 → 23:59) | 4.1.14.2 ¶1 | all | — | TBD | Verify default sort order. | P4 |
| 4.1.14.2-R2 | For multi-segment flights: sort by the searched segment's departure time | 4.1.14.2 ¶2 | all | — | TBD | Verify multi-seg uses matched-segment departure for sort. | P4 |
| 4.1.14.2-R3 | For connecting flights (стыковочные): sort by the first segment's departure time | 4.1.14.2 ¶3 | all | — | TBD | Verify connecting sort by first-segment departure. | P4 |
| 4.1.14.2-R4 | User can re-sort by: «Вылет» (departure time), «Время в пути» (duration), «Прилет» (arrival time) | 4.1.14.2 ¶4 | all | `ScheduleListHeader/` | TBD | Verify three sort columns clickable. | P4 |
| 4.1.14.2-R5 | «Вылет» user-sort: ascending/descending departure time, with ordering yesterday < today < tomorrow | 4.1.14.2 ¶5 | all | — | TBD | Verify departure user-sort direction toggle + day ordering. | P4 |
| 4.1.14.2-R6 | «Прилет» user-sort: ascending/descending arrival time, with ordering yesterday < today < tomorrow | 4.1.14.2 ¶6 | all | — | TBD | Verify arrival user-sort direction toggle + day ordering. | P4 |
| 4.1.14.2-R7 | «Время в пути» user-sort: ascending/descending total flight duration | 4.1.14.2 ¶7 | all | — | TBD | Verify duration sort direction toggle. | P4 |
| 4.1.14.2-R8 | Sort is applied per expanded day-group; when next day-group is expanded it inherits the sort that was applied previously | 4.1.14.2 ¶8 | all | — | TBD | Verify sort persistence across day-groups within same week. | P4 |
| 4.1.14.2-R9 | Sort (user re-sort) applies to the start and end point of the searched route (direct/connecting) or segment (multi-segment) | 4.1.14.2 ¶4 | all | — | TBD | Verify sort applies to correct route endpoints. | P4 |
## §4.1.14.3 — Свернутое представление (Collapsed row)
| # | Rule | TZ cite | Viewport | Current impl | Status | Action | Plan |
|---|---|---|---|---|---|---|---|
| 4.1.14.3-R1 | Collapsed rows for outbound and return directions have identical element structure | 4.1.14.3 ¶1 | all | `ScheduleFlightRow/` | TBD | Verify same component used for both directions. | P4 |
| 4.1.14.3-R2 | Direct flight collapsed (Table 36): flight number `SU XXXX` (4-digit) | 4.1.14.3 Table 36 row 1 | all | `ScheduleFlightRow/` | TBD | Verify schedule flight number format. | P4 |
| 4.1.14.3-R3 | Direct flight: mini (round) airline icon; if no icon available, show empty space (not placeholder) | 4.1.14.3 Table 36 row 2 | all | `ScheduleFlightRow/` | TBD | Verify mini-round logo; empty space when missing. | P4 |
| 4.1.14.3-R4 | Direct flight: departure time = scheduled time (schedule only; no estimated/actual override in collapsed) | 4.1.14.3 Table 36 row 3 | all | `ScheduleFlightRow/` | TBD | Verify departure shows scheduled only in schedule collapsed. | P4 |
| 4.1.14.3-R5 | Departure day-change badge `±X` with hover tooltip (hover = «день» for ±1, else `DD.MM.YYYY`; no tooltip on mobile) | 4.1.14.3 Table 36 row 4 | all | `DayChangeBadge/` | TBD | Verify day-change badge on schedule departure. | P4 |
| 4.1.14.3-R6 | Departure city name shown | 4.1.14.3 Table 36 row 5 | all | `ScheduleFlightRow/` | TBD | Verify departure city. | P4 |
| 4.1.14.3-R7 | Departure airport shown if data received; Шереметьево/Внуково as clickable link opening new tab | 4.1.14.3 Table 36 row 6 | all | `ScheduleFlightRow/` | TBD | Verify airport link for SVO/VKO in schedule. | P4 |
| 4.1.14.3-R8 | Departure terminal shown if data received; hidden if not | 4.1.14.3 Table 36 row 7 | all | `ScheduleFlightRow/` | TBD | Verify terminal conditional display. | P4 |
| 4.1.14.3-R9 | Duration shown as icon + formatted time: `{MM}мин.` / `{HH}ч. {MM}мин.` / `{D}д. {MM}мин.` / `{D}д. {HH}ч. {MM}мин.` | 4.1.14.3 Table 36 row 8 | all | `ScheduleFlightRow/` | TBD | Verify duration format. | P4 |
| 4.1.14.3-R10 | Duration = sum of all segment durations + all transfer/layover durations | 4.1.14.3 Table 36 row 8 | all | `ScheduleFlightRow/` | TBD | Verify duration calculation includes transfer time. | P4 |
| 4.1.14.3-R11 | Arrival time = scheduled | 4.1.14.3 Table 36 row 9 | all | `ScheduleFlightRow/` | TBD | Verify arrival shows scheduled only. | P4 |
| 4.1.14.3-R12 | Arrival day-change badge `±X` with same hover tooltip rules | 4.1.14.3 Table 36 row 10 | all | `DayChangeBadge/` | TBD | Verify arrival day-change badge. | P4 |
| 4.1.14.3-R13 | Arrival city name shown | 4.1.14.3 Table 36 row 11 | all | `ScheduleFlightRow/` | TBD | Verify arrival city. | P4 |
| 4.1.14.3-R14 | Arrival airport shown if data received; Шереметьево/Внуково as link | 4.1.14.3 Table 36 row 12 | all | `ScheduleFlightRow/` | TBD | Verify arrival airport link. | P4 |
| 4.1.14.3-R15 | Arrival terminal shown if data received; hidden if not | 4.1.14.3 Table 36 row 13 | all | `ScheduleFlightRow/` | TBD | Verify arrival terminal conditional. | P4 |
| 4.1.14.3-R16 | Expand/collapse toggle arrow shown on every row | 4.1.14.3 Table 36 row 14 | all | `ScheduleFlightRow/` | TBD | Verify toggle arrow rendered. | P4 |
| 4.1.14.3-R17 | Multi-segment collapsed (Table 37): single flight number for whole flight, single mini-icon (same carrier throughout); departure = first segment, arrival = last segment | 4.1.14.3 Table 37 rows 114 | all | `ScheduleFlightRow/` | TBD | Verify multi-seg single number + single icon + first/last endpoints. | P4 |
| 4.1.14.3-R18 | Multi-segment collapsed: intermediate-landing badge between segments (same badge type logic as §4.1.13.3.2 / §4.1.14.3.2) | 4.1.14.3 Table 37 row 15 | all | `IntermediateLandingBadge/` | TBD | Verify intermediate-landing badge in schedule collapsed. | P4 |
| 4.1.14.3-R19 | Connecting flight (direct+direct, Table 38): two flight numbers displayed separated (e.g. `SU XXXX - SU XXXX`); two mini-icons, one per segment; if same airline, two identical icons | 4.1.14.3 Table 38 rows 12 | all | `ScheduleFlightRow/` | TBD | Verify connecting flight numbers + dual mini-icons. | P4 |
| 4.1.14.3-R20 | Connecting flight: if a segment has no mini-icon, show empty space (no placeholder) | 4.1.14.3 Table 38 row 2 | all | `ScheduleFlightRow/` | TBD | Verify empty space when mini-icon missing. | P4 |
| 4.1.14.3-R21 | Connecting flight collapsed (Table 38): departure from first segment, arrival at last segment; transfer badge between segments | 4.1.14.3 Table 38 rows 315 | all | `ScheduleFlightRow/` | TBD | Verify connecting flight endpoints + transfer badge. | P4 |
| 4.1.14.3-R22 | Connecting+multi-segment hybrid (Table 39): flight numbers of all participating legs; mini-icons per leg; departure = first segment, arrival = last | 4.1.14.3 Table 39 | all | `ScheduleFlightRow/` | TBD | Verify mixed multi-seg+connecting layout. | P4 |
| 4.1.14.3-R23 | Transfer/intermediate-landing badge (§4.1.14.3.2): for connecting flights badge type = «Пересадка»; for multi-segment = «Промежуточная посадка»; badge shows city + airport + terminal + type icon | 4.1.14.3.2 | all | `TransferBadge/`, `IntermediateLandingBadge/` | TBD | Verify correct badge type per flight type. | P4 |
| 4.1.14.3-R24 | For 2+ stops: badge shows stop count + icon + change-of-city/airport/terminal flags; flags shown for any stop that had the change | 4.1.14.3.2 ¶ (2+ stops) | all | `TransferBadge/` | TBD | Verify multi-stop badge with count + flags. | P4 |
| 4.1.14.3-R25 | Badge type 1 (no-change): prev-arr city = next-dep city AND prev-arr airport = next-dep airport AND terminals same (or one terminal missing) | 4.1.14.3.2 rules | all | `TransferBadge/` | TBD | Verify badge type 1 condition. | P4 |
| 4.1.14.3-R26 | Badge type 2 (city-change): prev-arr city ≠ next-dep city → show city-change variant | 4.1.14.3.2 rules | all | `TransferBadge/` | TBD | Verify badge type 2 condition. | P4 |
| 4.1.14.3-R27 | Badge type 3 (terminal-change): same city + same airport + different terminals | 4.1.14.3.2 rules | all | `TransferBadge/` | TBD | Verify badge type 3 condition. | P4 |
| 4.1.14.3-R28 | Badge type 4 (airport-change): same city + different airports | 4.1.14.3.2 rules | all | `TransferBadge/` | TBD | Verify badge type 4 condition. | P4 |
| 4.1.14.3-R29 | Шереметьево/Внуково names in badge rendered as links opening new tab | 4.1.14.3.2 | all | `TransferBadge/` | TBD | Verify airport links in transfer badge. | P4 |
| 4.1.14.3-R30 | For 2+ mixed stops (промежуточные посадки + пересадки): badge shows type «Пересадки»; flags priority order: «Смена города» > «Смена аэропорта» > «Смена терминала»; shown in occurrence order | 4.1.14.3.2 (2+ mixed) | all | `TransferBadge/` | TBD | Verify mixed-stop badge flag ordering. | P4 |
## §4.1.14.4 — Развернутое представление (Expanded row)
| # | Rule | TZ cite | Viewport | Current impl | Status | Action | Plan |
|---|---|---|---|---|---|---|---|
| 4.1.14.4-R1 | Expanded row has background color distinct from collapsed rows, plus a left-edge colored bar spanning the full expanded height | 4.1.14.4 ¶1 | all | `ScheduleFlightExpanded/` | TBD | Verify expanded row background + left bar. | P4 |
| 4.1.14.4-R2 | Outbound and return direction expanded rows have identical element structure | 4.1.14.4 ¶2 | all | `ScheduleFlightExpanded/` | TBD | Verify same structure for both directions. | P4 |
| 4.1.14.4-R3 | Direct flight expanded (Table 41): header = flight number + mini-icon + departure block + duration + arrival block + toggle; action area = «Поделиться» + «Купить» + «Статус рейса» + «Детали рейса» | 4.1.14.4 Table 41 | all | `ScheduleFlightExpanded/` | TBD | Verify direct flight expanded structure. | P4 |
| 4.1.14.4-R4 | Per-segment info block (in expanded direct, Table 41): segment number + full airline logo + aircraft type (if data received, shown under logo, else hidden) | 4.1.14.4 Table 41 / Table 42 per-seg rows | all | `ScheduleFlightExpanded/` | TBD | Verify full logo + aircraft type per segment. | P4 |
| 4.1.14.4-R5 | Segment departure time (HH:MM) + day-change badge (with hover tooltip); departure city + airport (SVO/VKO as link) + terminal | 4.1.14.4 Table 42 per-seg rows 48 | all | `ScheduleFlightExpanded/` | TBD | Verify segment departure block fields. | P4 |
| 4.1.14.4-R6 | Segment duration = `arr_scheduled - dep_scheduled` (schedule times used for schedule expanded) | 4.1.14.4 Table 42 per-seg row 9 | all | `ScheduleFlightExpanded/` | TBD | Verify segment duration uses scheduled times. | P4 |
| 4.1.14.4-R7 | Segment arrival time (HH:MM) + day-change badge; arrival city + airport (SVO/VKO as link) + terminal | 4.1.14.4 Table 42 per-seg rows 1014 | all | `ScheduleFlightExpanded/` | TBD | Verify segment arrival block fields. | P4 |
| 4.1.14.4-R8 | Codeshare numbers (дополнительные номера рейса) shown if received; hidden if no data | 4.1.14.4 Table 41 row 16 | all | `ScheduleFlightExpanded/` | TBD | Verify codeshare field conditional display. | P4 |
| 4.1.14.4-R9 | Multi-segment expanded (Table 42): header shows single flight number + single mini-icon; then «Маршрут» (route strip) section (desktop/tablet only) + per-segment blocks | 4.1.14.4 Table 42 | desktop, tablet | `ScheduleFlightExpanded/` | TBD | Verify multi-seg expanded header + route strip. | P4 |
| 4.1.14.4-R10 | «Маршрут» (route strip) NOT shown on mobile | 4.1.14.4 Table 42 ¶ Маршрут | mobile | `ScheduleFlightExpanded/` | TBD | Verify route strip hidden on mobile. | P4 |
| 4.1.14.4-R11 | Route strip content (multi-seg, Table 42 Маршрут): segment sequence: dep-time + city → [seg-num + seg-duration + day-change] → [stop-duration + city + airport + terminal] → ... → arr-time | 4.1.14.4 Table 42 Маршрут rows | desktop, tablet | `ScheduleRouteStrip/` | TBD | Verify route strip sequence elements. | P4 |
| 4.1.14.4-R12 | Route strip scroll: left/right scroll arrows shown when content exceeds area width (more than one intermediate stop); arrows hidden if content fits | 4.1.14.4 Table 42 Маршрут rows 1, 16 | desktop, tablet | `ScheduleRouteStrip/` | TBD | Verify route strip overflow scroll arrows. | P4 |
| 4.1.14.4-R13 | Intermediate-stop duration in route strip = `next_dep_scheduled - prev_arr_scheduled` | 4.1.14.4 Table 42 Маршрут row 11 | all | `ScheduleRouteStrip/` | TBD | Verify stop duration calculation. | P4 |
| 4.1.14.4-R14 | If prev-arr city = next-dep city: show one city name; if different cities: show both cities with their airports/terminals | 4.1.14.4 Table 42 Маршрут row 12 | all | `ScheduleRouteStrip/` | TBD | Verify city-change display in route strip. | P4 |
| 4.1.14.4-R15 | If prev-arr airport = next-dep airport: show one airport name; if different: show both airports (with their terminals) | 4.1.14.4 Table 42 Маршрут row 13 | all | `ScheduleRouteStrip/` | TBD | Verify airport-change display in route strip. | P4 |
| 4.1.14.4-R16 | Inter-segment transfer/landing badge in expanded (§4.1.14.4.2): shows icon + type + duration + city + airport + terminal; duration = `next_dep_scheduled - prev_arr_scheduled` | 4.1.14.4 §4.1.14.4.2 | all | `ScheduleTransferBar/` | TBD | Verify transfer bar content (type, duration, city, airport, terminal). | P4 |
| 4.1.14.4-R17 | Expanded transfer badge type logic (§4.1.14.4.2) same as collapsed (type 14 by city/airport/terminal equality) | 4.1.14.4 §4.1.14.4.2 rules | all | `ScheduleTransferBar/` | TBD | Verify expanded badge type matches collapsed type conditions. | P4 |
| 4.1.14.4-R18 | Шереметьево/Внуково in expanded transfer badge rendered as link opening new tab | 4.1.14.4 §4.1.14.4.2 | all | `ScheduleTransferBar/` | TBD | Verify airport link in expanded transfer badge. | P4 |
| 4.1.14.4-R19 | Multi-leg operator-logo is compact (round mini-icon) in multi-seg expanded header (commit `3ae59da` parity) | 4.1.14.4 Table 42 row 2 | all | `src/features/schedule/*` | Implemented | Verified by commit `3ae59da`. | P4 |
| 4.1.14.4-R20 | Action area: «Поделиться» (share) — same social network list as §4.1.13.4.5; VK + copy-link; China locale adds Weibo | 4.1.14.4 §4.1.14.4.3 | all | `SharePanel/` | TBD | Verify share in schedule expanded row. | P4 |
| 4.1.14.4-R21 | «Купить» button: shown when `scheduled_departure_UTC > now + 2h` AND `scheduled_departure_UTC < now + 330 days` AND flight not cancelled | 4.1.14.4 §4.1.14.4.4 | all | `BuyButton/` | TBD | Verify Schedule Buy button time window (330-day upper bound, 2h lower). | P4 |
| 4.1.14.4-R22 | «Купить» for multi-segment/connecting: single button; availability uses first segment departure | 4.1.14.4 §4.1.14.4.4 | all | `BuyButton/` | TBD | Verify single Buy for multi-seg uses first-seg time. | P4 |
| 4.1.14.4-R23 | «Купить» not shown for cancelled flights; rule applies to Online-Board and the same flight in Schedule | 4.1.14.4 §4.1.14.4.4 | all | `BuyButton/` | TBD | Verify Buy hidden for cancelled; cross-subsystem rule. | P4 |
| 4.1.14.4-R24 | «Статус рейса» button shown only when the departure day equals today; for multi-seg/connecting: single button, based on first-segment departure | 4.1.14.4 §4.1.14.4.5 | all | `FlightStatusButton/` | TBD | Verify Status button today-only visibility. | P4 |
| 4.1.14.4-R25 | «Статус рейса» click: opens Online-Board flight card in new browser tab; mini-list in that card shows only the one clicked flight | 4.1.14.4 §4.1.14.4.5 | all | `FlightStatusButton/` | TBD | Verify Status click opens OB card with single-flight mini-list. | P4 |
| 4.1.14.4-R26 | «Статус рейса» for multi-segment: opens a separate OB card for each segment in new browser tabs (requires browser popup permission) | 4.1.14.4 §4.1.14.4.5 | all | `FlightStatusButton/` | TBD | Verify multi-seg opens multiple tabs (one per segment). | P4 |
| 4.1.14.4-R27 | «Статус рейса» for Аврора segment: navigates to `https://www.flyaurora.ru/`; for Победа: `https://www.pobeda.aero` | 4.1.14.4 §4.1.14.4.5 | all | `FlightStatusButton/` | TBD | Verify Аврора/Победа external URL navigation. | P4 |
| 4.1.14.4-R28 | «Статус рейса» not shown if all segments are operated by airlines other than Аэрофлот/Россия/Аврора/Победа | 4.1.14.4 §4.1.14.4.5 | all | `FlightStatusButton/` | TBD | Verify Status hidden for non-group carriers. | P4 |
| 4.1.14.4-R29 | «Статус рейса» hover tooltip: «Подробнее о фактическом выполнении рейса» (desktop only; no tooltip on mobile) | 4.1.14.4 §4.1.14.4.5 | desktop | `FlightStatusButton/` | TBD | Verify Status button tooltip desktop-only. | P4 |
| 4.1.14.4-R30 | «Детали рейса» button: opens flight details card (§4.1.16) with date-tab set to the first-segment scheduled departure date | 4.1.14.4 §4.1.14.4.6 | all | `DetailsButton/` | TBD | Verify Details link opens §4.1.16 with correct date-tab. | P4 |
| 4.1.14.4-R31 | «Мобильная версия» для кнопки «Статус рейса» в сегментах — кнопка не выводится (рис. 26) | 4.1.14.4 §4.1.14.4.5 Fig 26 | mobile | `FlightStatusButton/` | TBD | Verify Status button suppressed in mobile per-segment view. | P4 |
---