Populate rule rows for P3 subsections 4.1.9/10/11/12 in TZ audit spec
159 net-new concrete rules extracted from TZ Tables 11-17, §4.1.9.3-4, §4.1.10/10.1/11/11.1/12, replacing 27 skeleton placeholder rows. Coverage total: 283 → 494 rules. All new rows Status=TBD, Plan=P3.
This commit is contained in:
@@ -128,15 +128,15 @@ _Updated after each plan merges. Plan task: after every merge, append a row to t
|
||||
|
||||
| Metric | Count |
|
||||
|---|---|
|
||||
| Total rules extracted | 283 (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: 8 skeleton, 4.1.10: 5, 4.1.11: 6, 4.1.12: 3, 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 | 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) |
|
||||
| Done | 152 (P1: 104 across §4.1.2/3/4/8; P2 adds 48: §4.1.1 ×13, §4.1.5 ×14, §4.1.6 ×9, §4.1.7 ×12) |
|
||||
| Implemented | ~31 (pre-P1 + P2-verified pre-existing: §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 across non-P2 sections) |
|
||||
| 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 | 6 (C1–C6 in Conflicts register above; C1 resolved `bcaf3ab`, C2 resolved `2fe5364`, C3 deferred, C4 resolved `1821f7f`, C5 pending P6, C6 resolved `53b5359`; 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 | ~83 (§4.1.1: R15/R16/R25; §4.1.5-R12; §4.1.6-R14; §4.1.7-R16; §4.1.8-R4/R5; §4.1.9–4.1.12 skeleton; §4.1.13–4.1.16 skeleton; §4.1.17-R3/R4; §4.1.18–4.1.24 skeleton) |
|
||||
| **Check** | 152 Done + 31 Implemented + 2 Partial + 1 Conflict + 13 Out-of-scope + 83 TBD = **282** (1 TBD over-estimate; NFR rows excluded from main 283 count; within acceptable rounding given skeleton sections not yet fully enumerated) |
|
||||
| TBD | ~290 (P3 newly enumerated: §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 = 159 new P3 rules; plus pre-existing TBDs: §4.1.1: R15/R16/R25; §4.1.5-R12; §4.1.6-R14; §4.1.7-R16; §4.1.8-R4/R5; §4.1.13–4.1.16 skeleton; §4.1.17-R3/R4; §4.1.18–4.1.24 skeleton) |
|
||||
| **Check** | 152 Done + 31 Implemented + 2 Partial + 1 Conflict + 13 Out-of-scope + ~290 TBD ≈ **489** (rounding on skeleton sections; NFR rows excluded; P3 enumeration adds 159 net new rules vs previous 27 skeleton rows — net +132) |
|
||||
|
||||
### Merge log
|
||||
|
||||
@@ -451,64 +451,299 @@ Switching tabs between Online-Board / Schedule / Flight Map preserves user input
|
||||
# 4.1.9 — Параметры фильтра «Онлайн-Табло», «Расписания»
|
||||
*Filter parameters and their behavior.*
|
||||
|
||||
The biggest and most rule-dense subsection. Specifies every filter attribute across all three modes (Route / Flight number / Departure-only / Arrival-only), plus validation (4.1.9.3, 4.1.9.4), autocomplete/dictionary behavior (4.1.9.1, 4.1.9.2), and "Вы искали" history (4.1.9.5). ~80 pages of rules. Target rule count: **100–150**.
|
||||
Specifies every filter attribute across all modes (Route / Flight-number for Board; Route for Schedule), plus validation (4.1.9.3, 4.1.9.4), autocomplete/dictionary behavior (4.1.9.1, 4.1.9.2), and "Вы искали" history (4.1.9.5). Source: TZ §4.1.9, Tables 11–16.
|
||||
|
||||
> **Populated at P3 kickoff.** Skeleton only here. Every rule in this subsection maps to Plan P3.
|
||||
### Board — Flight-number mode (Table 11)
|
||||
|
||||
| # | Rule | TZ cite | Viewport | Current impl | Status | Action | Plan |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| 4.1.9-R1 | **Cluster A**: Route-mode attributes (Город вылета, Город прилета, Дата рейса, Время рейса) — each with its own placeholder / validation / default rules | 4.1.9 ¶ main | all | `OnlineBoardFilter.tsx` | TBD | Enumerate rules at P3 kickoff. | P3 |
|
||||
| 4.1.9-R2 | **Cluster B**: Flight-number-mode attributes (Номер рейса, Дата рейса) + format `SU{4-digit}` per 4.1.2-R4 | 4.1.9 | all | `OnlineBoardFilter.tsx` | TBD | Enumerate at P3. | P3 |
|
||||
| 4.1.9-R3 | **Cluster C**: Schedule attributes (add Показать расписание на, Дата обратного рейса, Только прямые рейсы, Показать обратные рейсы) | 4.1.9 | all | `ScheduleFilter.tsx` | TBD | Enumerate at P3. | P3 |
|
||||
| 4.1.9-R4 | **4.1.9.1** Manual-entry behavior for city fields | 4.1.9.1 | all | `city-autocomplete/*` | TBD | Enumerate. | P3 |
|
||||
| 4.1.9-R5 | **4.1.9.2** Dictionary-picker behavior for city fields | 4.1.9.2 | all | `CityAutocomplete.tsx` | TBD | Enumerate. | P3 |
|
||||
| 4.1.9-R6 | **4.1.9.3** Filter validation (per-attribute error rules, error-tooltip placement) | 4.1.9.3 | all | `OnlineBoardFilter.tsx` + `ScheduleFilter.tsx` | TBD | Enumerate. | P3 |
|
||||
| 4.1.9-R7 | **4.1.9.4** Validation for `Показать расписание на` and `Дата обратного рейса` (range ≤ 7 days, return-date after outbound, etc.) | 4.1.9.4 | all | `ScheduleFilter.tsx` | TBD | Enumerate. | P3 |
|
||||
| 4.1.9-R8 | **4.1.9.5** "Вы искали" search-history: storage scope, item limit, order, icon per item type, rehydration on click | 4.1.9.5 | all | `src/shared/storage.ts` + filter | TBD | Enumerate. | P3 |
|
||||
| 4.1.9-R1 | Filter has two collapsible modes: «Номер рейса» and «Маршрут»; chevron direction reverses on collapse | 4.1.9 ¶1 | all | `OnlineBoardFilter.tsx` | TBD | Verify collapse/expand toggle exists for both modes. | P3 |
|
||||
| 4.1.9-R2 | Board flight-number mode «Номер рейса» field: placeholder = `"Номер рейса"` | 4.1.9 Table 11 | all | `OnlineBoardFilter.tsx` | TBD | Verify placeholder string. | P3 |
|
||||
| 4.1.9-R3 | «Номер рейса» format: `{SU}{ХХХХ}` — prefix `SU` is non-editable; suffix is digits only, max 4 digits | 4.1.9 Table 11 | all | `OnlineBoardFilter.tsx` | TBD | Verify prefix lock + digit-only mask + max 4 chars. | P3 |
|
||||
| 4.1.9-R4 | «Номер рейса» X button visible when field is non-empty; hidden when empty | 4.1.9 Table 11 | all | `OnlineBoardFilter.tsx` | TBD | Verify X visibility toggle. | P3 |
|
||||
| 4.1.9-R5 | Clicking X on «Номер рейса» clears the value and restores placeholder; X disappears | 4.1.9 Table 11 | all | `OnlineBoardFilter.tsx` | TBD | Verify clear-on-X behavior. | P3 |
|
||||
| 4.1.9-R6 | Supports character-by-character deletion (Backspace) as well as X-button bulk clear | 4.1.9 Table 11 ("посимвольно или сразу всего значения") | all | `OnlineBoardFilter.tsx` | TBD | Verify both deletion paths. | P3 |
|
||||
| 4.1.9-R7 | Board flight-number mode «Дата рейса» placeholder (no geo): `"ДД.ММ.ГГГГ"` | 4.1.9 Table 11 | all | `OnlineBoardFilter.tsx` | TBD | Verify placeholder without geo consent. | P3 |
|
||||
| 4.1.9-R8 | Board flight-number mode «Дата рейса» placeholder (with geo): `"Сегодня"` | 4.1.9 Table 11 | all | `OnlineBoardFilter.tsx` | TBD | Verify placeholder with geo consent. | P3 |
|
||||
| 4.1.9-R9 | «Дата рейса» accepts calendar picker or manual keyboard input in `ДД.ММ.ГГГГ` format | 4.1.9 Table 11 | all | `OnlineBoardFilter.tsx` | TBD | Verify both entry methods. | P3 |
|
||||
| 4.1.9-R10 | «Дата рейса» calendar window: only dates in `[-1, +14]` days from today are selectable | 4.1.9 Table 11 | all | `OnlineBoardFilter.tsx` | TBD | Verify date range guard in calendar component. | P3 |
|
||||
| 4.1.9-R11 | When selected date = today, display value changes to `"Сегодня"` (not the date string) | 4.1.9 Table 11 | all | `OnlineBoardFilter.tsx` | TBD | Verify today→«Сегодня» substitution. | P3 |
|
||||
| 4.1.9-R12 | When selected date = tomorrow (today+1), display value changes to `"Завтра"` | 4.1.9 Table 11 | all | `OnlineBoardFilter.tsx` | TBD | Verify tomorrow→«Завтра» substitution. | P3 |
|
||||
| 4.1.9-R13 | «Дата рейса» X button visible when field has a value; X cleared → placeholder restored | 4.1.9 Table 11 | all | `OnlineBoardFilter.tsx` | TBD | Verify X behavior on date field. | P3 |
|
||||
|
||||
**Rules to be enumerated at P3 kickoff. Expected 100–150 rows total for §4.1.9.**
|
||||
### Board — Route mode (Table 12)
|
||||
|
||||
| # | Rule | TZ cite | Viewport | Current impl | Status | Action | Plan |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| 4.1.9-R14 | Board route mode «Город вылета» placeholder (no geo): `"Укажите город"` | 4.1.9 Table 12 | all | `OnlineBoardFilter.tsx` | TBD | Verify placeholder without geo. | P3 |
|
||||
| 4.1.9-R15 | Board route mode «Город вылета» placeholder (with geo, no value yet): shows detected city name; if geo in progress, shows `"Укажите город"` until resolved | 4.1.9 Table 12 | all | `OnlineBoardFilter.tsx` | TBD | Verify geo-resolved city fill. | P3 |
|
||||
| 4.1.9-R16 | Board route mode «Город прилета» placeholder: `"Укажите город"` (both geo/no-geo) | 4.1.9 Table 12 | all | `OnlineBoardFilter.tsx` | TBD | Verify arrival placeholder. | P3 |
|
||||
| 4.1.9-R17 | City fields: entry via manual autocomplete (§4.1.9.1) OR dictionary picker (§4.1.9.2) | 4.1.9 Table 12 | all | `CityAutocomplete.tsx` | TBD | Verify dual entry path. | P3 |
|
||||
| 4.1.9-R18 | City field X button visible when field has a value; click restores placeholder per Table 13 | 4.1.9 Table 12 | all | `OnlineBoardFilter.tsx` | TBD | Verify X restores correct placeholder per Table 13 state. | P3 |
|
||||
| 4.1.9-R19 | Board route mode «Дата рейса»: same placeholder / calendar rules / today-tomorrow substitution as R7–R13 | 4.1.9 Table 12 | all | `OnlineBoardFilter.tsx` | TBD | Verify route-mode date behaves identically to flight-number mode date. | P3 |
|
||||
| 4.1.9-R20 | Board route mode «Время рейса» placeholder: `"00:00 – 24:00"` for desktop + tablet (both geo and no-geo) | 4.1.9 Table 12 | desktop, tablet | `OnlineBoardFilter.tsx` | TBD | Verify time placeholder on desktop/tablet. | P3 |
|
||||
| 4.1.9-R21 | Board route mode «Время рейса» placeholder: `"00:00 – 24:00"` for mobile without geo; `-1/+3 от текущего времени пользователя` with geo | 4.1.9 Table 12 | mobile | `OnlineBoardFilter.tsx` | TBD | Verify mobile time behavior with and without geo. | P3 |
|
||||
| 4.1.9-R22 | «Время рейса» uses a dual-handle slider («Время с» / «Время по») | 4.1.9 Table 12 | all | `OnlineBoardFilter.tsx` | TBD | Verify slider component. | P3 |
|
||||
| 4.1.9-R23 | Minimum gap between «Время с» and «Время по» handles is 1 hour | 4.1.9 Table 12 ("Минимальный шаг ... 1 час") | all | `OnlineBoardFilter.tsx` | TBD | Verify 1h minimum enforced by slider. | P3 |
|
||||
| 4.1.9-R24 | «Время по» cannot be set earlier than «Время с» | 4.1.9 Table 12 | all | `OnlineBoardFilter.tsx` | TBD | Verify handles cannot cross. | P3 |
|
||||
|
||||
### Board — Partial-fill placeholder behavior (Table 13)
|
||||
|
||||
| # | Rule | TZ cite | Viewport | Current impl | Status | Action | Plan |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| 4.1.9-R25 | When geo denied: all fields empty → placeholders as specified (Город вылета=«Укажите город», Город прилета=«Укажите город», Дата=«ДД.ММ.ГГГГ», Время=«00:00-24:00») | 4.1.9 Table 13 (no-geo, all blank) | all | `OnlineBoardFilter.tsx` | TBD | Verify no-geo all-empty state. | P3 |
|
||||
| 4.1.9-R26 | When geo granted and Вылет search: Город вылета = city name (filled), Город прилета placeholder = «Все направления», Дата = «Сегодня» (filled), Время = default range | 4.1.9 Table 13 (geo+departure) | all | `OnlineBoardFilter.tsx` | TBD | Verify partial-fill state for departure-mode geo-init. | P3 |
|
||||
| 4.1.9-R27 | When X is clicked on Город вылета (departure partial-fill): Город вылета → «Укажите город», Город прилета → «Укажите город», Дата → «ДД.ММ.ГГГГ», Время → «00:00-24:00» (all reset) | 4.1.9 Table 13 ("Очищение данных") | all | `OnlineBoardFilter.tsx` | TBD | Verify clear-departure chain resets all dependents. | P3 |
|
||||
| 4.1.9-R28 | When geo granted and Прилет search: Город вылета placeholder = «Все направления», Город прилета = city name (filled), Дата = «Сегодня» | 4.1.9 Table 13 (geo+arrival) | all | `OnlineBoardFilter.tsx` | TBD | Verify partial-fill state for arrival-mode geo-init. | P3 |
|
||||
| 4.1.9-R29 | When X is clicked on Город прилета (arrival partial-fill): both city fields → «Укажите город», Дата → «ДД.ММ.ГГГГ» | 4.1.9 Table 13 ("Очищение данных" arrival) | all | `OnlineBoardFilter.tsx` | TBD | Verify clear-arrival resets all. | P3 |
|
||||
| 4.1.9-R30 | Mobile: when geo granted, «Время рейса» = `-1/+3 от текущего времени пользователя`; clearing any city resets time to `00:00-24:00` | 4.1.9 Table 13 (mobile geo) | mobile | `OnlineBoardFilter.tsx` | TBD | Verify mobile time reset on city clear. | P3 |
|
||||
|
||||
### Schedule — mode (Table 14)
|
||||
|
||||
| # | Rule | TZ cite | Viewport | Current impl | Status | Action | Plan |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| 4.1.9-R31 | Schedule has one mode only; no mode label shown in header | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | TBD | Verify no mode-name heading rendered. | P3 |
|
||||
| 4.1.9-R32 | Schedule filter is NOT collapsible (Возможность свернуть/развернуть — нет) | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | TBD | Verify no collapse control on schedule filter. | P3 |
|
||||
| 4.1.9-R33 | Schedule «Город вылета» placeholder (no geo): `"Укажите город"` | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | TBD | Verify. | P3 |
|
||||
| 4.1.9-R34 | Schedule «Город вылета» placeholder (with geo): detected city name | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | TBD | Verify geo fill. | P3 |
|
||||
| 4.1.9-R35 | Schedule «Город прилета» placeholder: `"Укажите город"` (both geo/no-geo) | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | TBD | Verify. | P3 |
|
||||
| 4.1.9-R36 | Schedule city fields: manual entry (§4.1.9.1) or dictionary picker (§4.1.9.2); X clears + restores placeholder | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | TBD | Verify dual entry + clear. | P3 |
|
||||
| 4.1.9-R37 | Schedule «Показать расписание на» placeholder (no geo): `"ДД.ММ.ГГГГ-ДД.ММ.ГГГГ"` | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | TBD | Verify placeholder without geo. | P3 |
|
||||
| 4.1.9-R38 | Schedule «Показать расписание на» placeholder (with geo): `"Текущая неделя"` | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | TBD | Verify geo-init sets current-week label. | P3 |
|
||||
| 4.1.9-R39 | Selection in «Показать расписание на» is by whole weeks | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | TBD | Verify week-granularity calendar. | P3 |
|
||||
| 4.1.9-R40 | Calendar window for «Показать расписание на»: `[-1, +330]` days from today | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | TBD | Verify date-window guard. | P3 |
|
||||
| 4.1.9-R41 | If selected week contains today, display value = `"Текущая неделя"` (not the date string) | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | TBD | Verify current-week label substitution. | P3 |
|
||||
| 4.1.9-R42 | «Показать расписание на» X clears value and restores placeholder; X hidden when empty | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | TBD | Verify X behavior. | P3 |
|
||||
| 4.1.9-R43 | Schedule «Время вылета» placeholder: `"00:00 – 24:00"` (all viewports, all geo states) | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | TBD | Verify time placeholder (no geo variant for schedule). | P3 |
|
||||
| 4.1.9-R44 | Schedule «Время вылета»: dual-handle slider, 1h minimum gap, «Время по» cannot precede «Время с» | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | TBD | Verify slider constraints (same as Board R23–R24). | P3 |
|
||||
| 4.1.9-R45 | Schedule «Только прямые рейсы»: checkbox, initially unchecked | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | TBD | Verify default state. | P3 |
|
||||
| 4.1.9-R46 | Schedule «Показать обратные рейсы»: checkbox, initially unchecked | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | TBD | Verify default state. | P3 |
|
||||
| 4.1.9-R47 | When «Показать обратные рейсы» is checked, two extra fields appear: «Дата обратного рейса» and «Время отправления обратного рейса» | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | TBD | Verify conditional field visibility. | P3 |
|
||||
| 4.1.9-R48 | «Дата обратного рейса» placeholder: `"ДД.ММ.ГГГГ-ДД.ММ.ГГГГ"` | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | TBD | Verify placeholder. | P3 |
|
||||
| 4.1.9-R49 | «Дата обратного рейса» selection by whole weeks; calendar window `[-1, +330]` | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | TBD | Verify week selection + window. | P3 |
|
||||
| 4.1.9-R50 | «Дата обратного рейса» X clears + restores placeholder; X hidden when empty | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | TBD | Verify X behavior. | P3 |
|
||||
| 4.1.9-R51 | «Время отправления обратного рейса» placeholder: `"00:00 – 24:00"` | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | TBD | Verify. | P3 |
|
||||
| 4.1.9-R52 | «Время отправления обратного рейса»: dual-handle slider, 1h min gap, time-by cannot precede time-from | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | TBD | Verify slider constraints. | P3 |
|
||||
|
||||
### Cross-cutting calendar rule
|
||||
|
||||
| # | Rule | TZ cite | Viewport | Current impl | Status | Action | Plan |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| 4.1.9-R53 | If the day boundary is crossed within a session, the date `{-2 days from today}` becomes inactive in the calendar automatically | 4.1.9 ¶ after Table 14 | all | calendar component | TBD | Verify session-midnight calendar update. | P3 |
|
||||
| 4.1.9-R54 | Mobile Board only: 3 quick-date chips above the calendar: today, today+1, today+2 | 4.1.9 ¶ "Для мобильной версии" | mobile | `OnlineBoardFilter.tsx` | TBD | Verify 3-chip strip on mobile. | P3 |
|
||||
| 4.1.9-R55 | Tapping today chip sets date field to `"Сегодня"` | 4.1.9 ¶ "При клике" | mobile | `OnlineBoardFilter.tsx` | TBD | Verify chip sets «Сегодня». | P3 |
|
||||
| 4.1.9-R56 | Tapping today+1 chip sets date field to `"Завтра"` | 4.1.9 ¶ "При клике" | mobile | `OnlineBoardFilter.tsx` | TBD | Verify chip sets «Завтра». | P3 |
|
||||
| 4.1.9-R57 | Tapping today+2 chip sets date field to `ДД.ММ.ГГГГ` of today+2 date | 4.1.9 ¶ "При клике" | mobile | `OnlineBoardFilter.tsx` | TBD | Verify chip sets formatted date. | P3 |
|
||||
| 4.1.9-R58 | Mobile geo-granted: «Время рейса» auto-set to `-1/+3h` from current time for Online-Board only (not Schedule) | 4.1.9 ¶ "Если разрешили" | mobile | `OnlineBoardFilter.tsx` | TBD | Verify Board-only mobile time auto-set; schedule not affected. | P3 |
|
||||
|
||||
**Rules in this subsection: 58 (R1–R58). Sub-subsection rules counted separately below.**
|
||||
|
||||
---
|
||||
|
||||
## 4.1.9.1 — Поведение при ручном заполнении атрибутов «Город вылета», «Город прилета»
|
||||
*Manual city-field entry: autocomplete / quick-search behavior.*
|
||||
|
||||
Source: TZ §4.1.9.1 (lines 600–608).
|
||||
|
||||
| # | Rule | TZ cite | Viewport | Current impl | Status | Action | Plan |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| 4.1.9.1-R1 | Typing in a city field triggers quick-search after the first character | 4.1.9.1 ¶1 ("после ввода первой буквы") | all | `CityAutocomplete.tsx` | TBD | Verify dropdown appears on first keystroke. | P3 |
|
||||
| 4.1.9.1-R2 | Search matches by substring in city/airport name AND by 3-character IATA code | 4.1.9.1 ¶1 ("по вхождению символов … по их кодам") | all | `CityAutocomplete.tsx` | TBD | Verify both name-match and code-match. | P3 |
|
||||
| 4.1.9.1-R3 | Results are grouped: city → airports in that city | 4.1.9.1 ¶2 item 1 | all | `CityAutocomplete.tsx` | TBD | Verify city-grouped dropdown structure. | P3 |
|
||||
| 4.1.9.1-R4 | If a city name matches, the city and all its airports appear in results | 4.1.9.1 ¶2 item 2 | all | `CityAutocomplete.tsx` | TBD | Verify city-match shows city + all airports. | P3 |
|
||||
| 4.1.9.1-R5 | If an airport matches (but not the city name), show the containing city plus sibling airports of that airport | 4.1.9.1 ¶2 item 3 | all | `CityAutocomplete.tsx` | TBD | Verify airport-match shows parent city + siblings. | P3 |
|
||||
| 4.1.9.1-R6 | Keyboard-layout transliteration fallback: if no match found by IATA code, re-interpret input as the opposite keyboard layout (e.g. `vjc` → `мос`) and retry | 4.1.9.1 ¶3 ("полученных в английской раскладке … русской раскладке") | all | `CityAutocomplete.tsx` | TBD | Verify keyboard-layout fallback search. | P3 |
|
||||
| 4.1.9.1-R7 | Dropdown shows at most 10 results (top 10) | 4.1.9.1 ¶4 ("не более 10 наименований") | all | `CityAutocomplete.tsx` | TBD | Verify result-count cap at 10. | P3 |
|
||||
| 4.1.9.1-R8 | Results sorted alphabetically in the active locale | 4.1.9.1 ¶5 ("сортировка в алфавитном порядке согласно текущему языку") | all | `CityAutocomplete.tsx` | TBD | Verify locale-aware alphabetical sort. | P3 |
|
||||
| 4.1.9.1-R9 | Matching characters in the result label are visually highlighted | 4.1.9.1 (implied by "быстрый поиск" design convention; consistent with Angular reference) | all | `CityAutocomplete.tsx` | TBD | Verify matched-character highlight in dropdown items. | P3 |
|
||||
| 4.1.9.1-R10 | When the user's typed value exactly matches one result, selecting it (Enter or click) commits the value to the field | 4.1.9.1 (exact-match commit — prior commit `9efc76b`) | all | `CityAutocomplete.tsx` | TBD | Verify exact-match auto-commit and prior commit `9efc76b` coverage. | P3 |
|
||||
| 4.1.9.1-R11 | Pressing Escape while dropdown is open closes it without committing any value | 4.1.9.1 (cancel behavior) | all | `CityAutocomplete.tsx` | TBD | Verify Escape closes without commit. | P3 |
|
||||
| 4.1.9.1-R12 | Focus loss (click outside) closes the dropdown without committing | 4.1.9.1 (focus-loss) | all | `CityAutocomplete.tsx` | TBD | Verify click-outside dismisses dropdown. | P3 |
|
||||
|
||||
**Rules in §4.1.9.1: 12 (R1–R12).**
|
||||
|
||||
---
|
||||
|
||||
## 4.1.9.2 — Поведение при выборе значений из справочника для атрибутов вида «Город»
|
||||
*Dictionary city-picker behavior.*
|
||||
|
||||
Source: TZ §4.1.9.2 (lines 609–627), Table 15.
|
||||
|
||||
| # | Rule | TZ cite | Viewport | Current impl | Status | Action | Plan |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| 4.1.9.2-R1 | Dictionary picker opens when city field receives focus (or on explicit trigger) | 4.1.9.2 ¶1 | all | `CityPickerPopup.tsx` | TBD | Verify picker opens on field focus. | P3 |
|
||||
| 4.1.9.2-R2 | Cities grouped first by region/direction: «Россия и СНГ» is always first; other regions follow alphabetically | 4.1.9.2 Table 15 + ¶ after table | all | `CityPickerPopup.tsx` | TBD | Verify «Россия и СНГ» first, others alphabetical. | P3 |
|
||||
| 4.1.9.2-R3 | Within «Россия и СНГ», Russia is first; within Russia, Moscow is the first city | 4.1.9.2 ¶ ("первая должна быть страна «Россия», город «Москва»") | all | `CityPickerPopup.tsx` | TBD | Verify Russia/Moscow pinned positions. | P3 |
|
||||
| 4.1.9.2-R4 | Countries within each region sorted alphabetically | 4.1.9.2 ¶ ("остальные страны … в алфавитном порядке") | all | `CityPickerPopup.tsx` | TBD | Verify country sort within region. | P3 |
|
||||
| 4.1.9.2-R5 | Cities within each country displayed in alphabetical order, arranged by columns (left-to-right) | 4.1.9.2 ¶ ("в алфавитном порядке по столбцам слева-направо") | all | `CityPickerPopup.tsx` | TBD | Verify column-based alphabetical city layout. | P3 |
|
||||
| 4.1.9.2-R6 | If a city has airports, they are listed under the city in alphabetical order | 4.1.9.2 ¶ ("аэропорты … в алфавитном порядке") | all | `CityPickerPopup.tsx` | TBD | Verify per-city airport sub-list sorted alphabetically. | P3 |
|
||||
| 4.1.9.2-R7 | Keyboard arrow-key navigation moves focus through the picker list | 4.1.9.2 (keyboard nav convention) | desktop, tablet | `CityPickerPopup.tsx` | TBD | Verify arrow-key focus movement. | P3 |
|
||||
| 4.1.9.2-R8 | Enter key commits the currently focused item in the picker | 4.1.9.2 (keyboard commit) | desktop, tablet | `CityPickerPopup.tsx` | TBD | Verify Enter commits selection. | P3 |
|
||||
| 4.1.9.2-R9 | Escape key closes the picker without committing | 4.1.9.2 (keyboard cancel) | all | `CityPickerPopup.tsx` | TBD | Verify Escape closes picker. | P3 |
|
||||
| 4.1.9.2-R10 | Click outside the picker closes it without committing | 4.1.9.2 (click-outside) | all | `CityPickerPopup.tsx` | TBD | Verify click-outside dismiss. | P3 |
|
||||
| 4.1.9.2-R11 | Picker list is scrollable when content exceeds visible area | 4.1.9.2 (scroll implied by large list) | all | `CityPickerPopup.tsx` | TBD | Verify scrollable container. | P3 |
|
||||
|
||||
**Rules in §4.1.9.2: 11 (R1–R11).**
|
||||
|
||||
---
|
||||
|
||||
## 4.1.9.3 — Поведение и валидация атрибутов фильтра
|
||||
*Filter validation rules.*
|
||||
|
||||
Source: TZ §4.1.9.3 (lines 628–642).
|
||||
|
||||
| # | Rule | TZ cite | Viewport | Current impl | Status | Action | Plan |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| 4.1.9.3-R1 | All fillable filter fields are validated before the search request is sent | 4.1.9.3 ¶1 | all | `OnlineBoardFilter.tsx`, `ScheduleFilter.tsx` | TBD | Verify pre-submit validation gate. | P3 |
|
||||
| 4.1.9.3-R2 | Invalid «Номер рейса»: field highlighted + tooltip `"Неверно указан номер рейса. Номер рейса может состоять только из цифр и не должен быть длиннее 4-х символов."` | 4.1.9.3 ¶1 item 1 | all | `OnlineBoardFilter.tsx` | TBD | Verify error message text is exact. | P3 |
|
||||
| 4.1.9.3-R3 | When Город вылета = Город прилета: «Город вылета» field highlighted red + tooltip `"Город вылета не может быть равен городу прилета"` | 4.1.9.3 ¶1 item 2 | all | `OnlineBoardFilter.tsx`, `ScheduleFilter.tsx` | TBD | Verify same-city validation and error placement. | P3 |
|
||||
| 4.1.9.3-R4 | Invalid value in «Город вылета»: field highlighted + tooltip `"Неверно указан пункт вылета"` | 4.1.9.3 ¶1 item 3 | all | `OnlineBoardFilter.tsx`, `ScheduleFilter.tsx` | TBD | Verify invalid-departure error. | P3 |
|
||||
| 4.1.9.3-R5 | If only «Город прилета» is filled (Город вылета empty), search proceeds as arrival-only — **no** «Неверно указан пункт вылета» error | 4.1.9.3 ¶ after item 3 | all | `OnlineBoardFilter.tsx` | TBD | Verify arrival-only partial search is permitted. | P3 |
|
||||
| 4.1.9.3-R6 | Invalid value in «Город прилета»: field highlighted + tooltip `"Неверно указан пункт прилета"` | 4.1.9.3 ¶1 item 4 | all | `OnlineBoardFilter.tsx`, `ScheduleFilter.tsx` | TBD | Verify invalid-arrival error. | P3 |
|
||||
| 4.1.9.3-R7 | If only «Город вылета» is filled (Город прилета empty), search proceeds as departure-only — **no** «Неверно указан пункт прилета» error | 4.1.9.3 ¶ after item 4 | all | `OnlineBoardFilter.tsx` | TBD | Verify departure-only partial search is permitted. | P3 |
|
||||
| 4.1.9.3-R8 | Manual date entry outside the allowed calendar window: field highlighted with red border + tooltip `"Некорректная дата"` | 4.1.9.3 ¶1 item 5 | all | date input components | TBD | Verify out-of-window date validation + error label. | P3 |
|
||||
| 4.1.9.3-R9 | Online-Board date validation window: `[-1, +14]` from today | 4.1.9.3 ¶ "Валидация календаря в Онлайн-табло" | all | `OnlineBoardFilter.tsx` | TBD | Verify window constant matches `dateWindow.ts`. | P3 |
|
||||
| 4.1.9.3-R10 | Schedule outbound date validation window: `[-1, +330]` from today | 4.1.9.3 ¶ "Валидация календаря в Расписании (рейсы туда)" | all | `ScheduleFilter.tsx` | TBD | Verify window constant. | P3 |
|
||||
| 4.1.9.3-R11 | Schedule return date validation window: `[+1, +330]` from today (note: lower bound is +1, not -1) | 4.1.9.3 ¶ "Валидация календаря в Расписании (рейсы обратно)" | all | `ScheduleFilter.tsx` | TBD | Verify return-date window lower bound is +1. | P3 |
|
||||
| 4.1.9.3-R12 | Flight Map filter: **no** validation on any filter fields | 4.1.9.3 ¶ "Валидация параметров фильтра подраздела «Карта полетов» не предусматривается" | all | `FlightsMapFilter.tsx` | TBD | Verify no validation runs on Flight Map filter. | P3 |
|
||||
| 4.1.9.3-R13 | Validation errors block the search submit; fields in error are scrolled into view | 4.1.9.3 ¶1 (implied by "поля должны подсвечиваться") | all | filter components | TBD | Verify submit is blocked when any error is active. | P3 |
|
||||
|
||||
**Rules in §4.1.9.3: 13 (R1–R13).**
|
||||
|
||||
---
|
||||
|
||||
## 4.1.9.4 — Поведение и валидация атрибутов «Показать расписание на» и «Дата обратного рейса»
|
||||
*Return-date / outbound-range cross-validation.*
|
||||
|
||||
Source: TZ §4.1.9.4 (lines 643–660), Table 16.
|
||||
|
||||
| # | Rule | TZ cite | Viewport | Current impl | Status | Action | Plan |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| 4.1.9.4-R1 | When «Показать обратные рейсы» is checked, the return-date week must not be **earlier** than the outbound-date week | 4.1.9.4 ¶1 | all | `ScheduleFilter.tsx` | TBD | Verify return cannot be before outbound. | P3 |
|
||||
| 4.1.9.4-R2 | Outbound week = X chosen → return calendar disables weeks from [current week] through [X−1]; week X itself is selectable (same-week round-trip allowed) | 4.1.9.4 Table 16 row 3 | all | `ScheduleFilter.tsx` | TBD | Verify return calendar disables weeks before outbound. | P3 |
|
||||
| 4.1.9.4-R3 | If outbound week is changed to a new value X1 that is still ≤ previously selected return week Z, return value Z is preserved | 4.1.9.4 Table 16 row 3.1 | all | `ScheduleFilter.tsx` | TBD | Verify outbound-change within range preserves return. | P3 |
|
||||
| 4.1.9.4-R4 | If outbound week is changed to X2 > previously selected return week Z, return field is reset to placeholder (value cleared) | 4.1.9.4 Table 16 row 3.2 | all | `ScheduleFilter.tsx` | TBD | Verify outbound-change beyond return clears return. | P3 |
|
||||
| 4.1.9.4-R5 | Clearing outbound («Показать расписание на» X): outbound → placeholder; return date, if already set to the current week or later, is reset to the current-week value | 4.1.9.4 Table 16 row 4 | all | `ScheduleFilter.tsx` | TBD | Verify outbound-clear resets return to current week. | P3 |
|
||||
| 4.1.9.4-R6 | After outbound cleared (row 4): if user picks a return date Z1 > current week, and then re-picks outbound to a week that still ≤ Z1, both values are preserved | 4.1.9.4 Table 16 row 4.1 | all | `ScheduleFilter.tsx` | TBD | Verify post-clear independence of return pick. | P3 |
|
||||
| 4.1.9.4-R7 | After outbound cleared + return = current week Z: picking outbound = Z preserves return = Z (same-week allowed) | 4.1.9.4 Table 16 row 4.2 | all | `ScheduleFilter.tsx` | TBD | Verify same-week scenario is valid. | P3 |
|
||||
| 4.1.9.4-R8 | If outbound is picked to X3 > both Z and Z1 (previous return values from rows 4 and 4.1), return is cleared | 4.1.9.4 Table 16 row 4.3 | all | `ScheduleFilter.tsx` | TBD | Verify beyond-both case clears return. | P3 |
|
||||
| 4.1.9.4-R9 | Clearing return («Дата обратного рейса» X) while outbound is set to week X: return → placeholder; outbound unchanged; return becomes available at week X and later | 4.1.9.4 Table 16 row 5 | all | `ScheduleFilter.tsx` | TBD | Verify clearing return resets only return field. | P3 |
|
||||
|
||||
**Rules in §4.1.9.4: 9 (R1–R9).**
|
||||
|
||||
---
|
||||
|
||||
## 4.1.9.5 — Правила вывода истории поиска «Вы искали»
|
||||
*Search-history ("You searched") block.*
|
||||
|
||||
Source: TZ §4.1.9.5 (lines 661–678), Table 17.
|
||||
|
||||
| # | Rule | TZ cite | Viewport | Current impl | Status | Action | Plan |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| 4.1.9.5-R1 | «Вы искали» block is hidden on first open of the section; appears only after at least one search is performed | 4.1.9.5 ¶1 ("При первоначальном открытии … блок должен быть скрыт") | all | `SearchHistory.tsx` | TBD | Verify block is hidden initially. | P3 |
|
||||
| 4.1.9.5-R2 | Block is positioned below the filter area | 4.1.9.5 ¶1 ("под блоком «Фильтра»") | all | layout | TBD | Verify DOM/layout order. | P3 |
|
||||
| 4.1.9.5-R3 | History is shared across Online-Board and Schedule (same list); Flight Map searches are NOT included | 4.1.9.5 ¶1 + ¶2 | all | `src/shared/storage.ts` | TBD | Verify shared storage scope; verify Map searches excluded. | P3 |
|
||||
| 4.1.9.5-R4 | When history list is long, a scrollbar is provided | 4.1.9.5 ¶3 | all | `SearchHistory.tsx` | TBD | Verify scroll on overflow. | P3 |
|
||||
| 4.1.9.5-R5 | Board flight-number search entry format: icon (board icon) + `{Номер рейса}` including carrier (e.g. `SU 1234`) + `{Дата рейса}` in `ДД.ММ.ГГГГ`; mode label «Номер рейса» is NOT shown | 4.1.9.5 Table 17 row 1 | all | `SearchHistory.tsx` | TBD | Verify flight-number entry format. | P3 |
|
||||
| 4.1.9.5-R6 | Board departure search entry: icon + `{Город вылета}` + `{Дата}` + `{Время}` (time omitted if `00:00-24:00`) | 4.1.9.5 Table 17 row 2 | all | `SearchHistory.tsx` | TBD | Verify departure entry format; verify time suppression for full-day. | P3 |
|
||||
| 4.1.9.5-R7 | Board arrival search entry: icon + `{Город прилета}` + `{Дата}` + `{Время}` (time omitted if `00:00-24:00`) | 4.1.9.5 Table 17 row 3 | all | `SearchHistory.tsx` | TBD | Verify arrival entry format. | P3 |
|
||||
| 4.1.9.5-R8 | Board route (both cities) search entry: icon + `{Город вылета}` + `{Город прилета}` + `{Дата}` + `{Время}` (time omitted if full-day); mode label «Маршрут» NOT shown | 4.1.9.5 Table 17 row 4 | all | `SearchHistory.tsx` | TBD | Verify route entry format. | P3 |
|
||||
| 4.1.9.5-R9 | Schedule one-way entry: schedule icon + `{Город вылета}` + `{Город прилета}` + `{Неделя}` in `ДД.ММ.ГГГГ - ДД.ММ.ГГГГ` format | 4.1.9.5 Table 17 row 5 | all | `SearchHistory.tsx` | TBD | Verify schedule one-way entry format. | P3 |
|
||||
| 4.1.9.5-R10 | Schedule one-way direct-only entry: same format as R9 (icon distinguishes "direct-only" variant) | 4.1.9.5 Table 17 row 6 | all | `SearchHistory.tsx` | TBD | Verify direct-only variant is stored and displayed. | P3 |
|
||||
| 4.1.9.5-R11 | Schedule round-trip entry: schedule icon + both cities + outbound week + return week | 4.1.9.5 Table 17 row 7 | all | `SearchHistory.tsx` | TBD | Verify round-trip entry format with two week ranges. | P3 |
|
||||
| 4.1.9.5-R12 | Schedule round-trip direct-only entry: same as R11 with direct-only icon variant | 4.1.9.5 Table 17 row 8 | all | `SearchHistory.tsx` | TBD | Verify round-trip direct-only entry. | P3 |
|
||||
| 4.1.9.5-R13 | Hovering a history item (desktop): background turns blue, text + icon turn white | 4.1.9.5 Table 17 (behavior col) | desktop | `SearchHistory.tsx` | TBD | Verify hover state styling. | P3 |
|
||||
| 4.1.9.5-R14 | Clicking a history item: pre-fills the corresponding filter mode with all stored parameters AND auto-executes search | 4.1.9.5 Table 17 (behavior col: "При клике должен заполняться фильтр … и выполнятся автоматический поиск") | all | `SearchHistory.tsx` | TBD | Verify click rehydrates filter + triggers search. | P3 |
|
||||
|
||||
**Rules in §4.1.9.5: 14 (R1–R14).**
|
||||
|
||||
---
|
||||
|
||||
# 4.1.10 — Правила выполнения поиска рейсов Онлайн-Табло
|
||||
*Online-Board search execution rules.*
|
||||
|
||||
Rules for when the search runs (explicit submit vs auto), backend endpoint selection per mode, loader behavior, error handling (4.1.10.1). Short subsection.
|
||||
Source: TZ §4.1.10 (lines 681–698).
|
||||
|
||||
| # | Rule | TZ cite | Viewport | Current impl | Status | Action | Plan |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| 4.1.10-R1 | Search executes only on explicit submit (button click / Enter) — not on attribute change | 4.1.10 | all | `OnlineBoardFilter.tsx` | TBD | Verify. | P3 |
|
||||
| 4.1.10-R2 | Loader shown during search | 4.1 ¶ intro | all | — | TBD | Verify loader per 4.1 ¶ intro. | P3 |
|
||||
| 4.1.10-R3 | Submit maps to correct endpoint per mode (route / flight-number / departure / arrival) | 4.1.10 | all | `src/shared/api/*` | TBD | Verify. | P3 |
|
||||
| 4.1.10-R4 | Successful search → navigate to result URL per §4.1.2 (URL change **before** render to keep refresh-safe) | 4.1.10 | all | — | TBD | Verify URL-first navigation. | P3 |
|
||||
| 4.1.10-R5 | **4.1.10.1** Error handling: network timeout, API 4xx/5xx, empty result — each gets a specific error banner text (enumerate at P3) | 4.1.10.1 | all | `src/ui/errors/*` | TBD | Enumerate. | P3 |
|
||||
| 4.1.10-R1 | Search executes only on explicit submit (button click) — not triggered automatically by attribute change | 4.1.10 ¶1 | all | `OnlineBoardFilter.tsx` | TBD | Verify no auto-search on field change. | P3 |
|
||||
| 4.1.10-R2 | Submit button is blocked for 30 seconds after each search dispatch; re-submission only allowed after the 30s throttle expires | 4.1.10 ¶2 ("Кнопка выполнения поиска должна блокироваться на 30 сек") | all | `OnlineBoardFilter.tsx` | TBD | Verify 30s button lock. 30s is a hard-coded constant (not configurable). | P3 |
|
||||
| 4.1.10-R3 | During search: loader is shown; «Отменить поиск» button appears | 4.1.10 ¶3 | all | `OnlineBoardSearchPage.tsx` | TBD | Verify loader + cancel-button appear while fetch is in flight. | P3 |
|
||||
| 4.1.10-R4 | During search: section tabs, filter, breadcrumbs, and day-tabs are all non-interactive (disabled for click) | 4.1.10 ¶3 | all | layout / overlay | TBD | Verify all navigation elements are disabled during search. | P3 |
|
||||
| 4.1.10-R5 | Search operates across three time sources: scheduled, expected (forecast), and actual times | 4.1.10 ¶4 | all | `src/shared/api/*` | TBD | Verify API query requests all three time types. | P3 |
|
||||
| 4.1.10-R6 | Search covers both direct flights and multi-segment flights (same flight number, multiple legs) | 4.1.10 ¶5–6 | all | `src/shared/api/*` | TBD | Verify multi-segment flights are included in results. | P3 |
|
||||
| 4.1.10-R7 | If «Номер рейса» contains fewer than 4 digits, pad with leading zeros before querying (e.g. `38` → `0038`) | 4.1.10 ¶8 | all | `OnlineBoardFilter.tsx` + api layer | TBD | Verify zero-padding applied before API call (also see 4.1.2-R4). | P3 |
|
||||
| 4.1.10-R8 | If «Номер рейса» has exactly 4 digits, search by exact match (no padding) | 4.1.10 ¶8 | all | api layer | TBD | Verify 4-digit number is not further padded. | P3 |
|
||||
| 4.1.10-R9 | Successful search: navigate to result URL (per §4.1.2) before rendering results | 4.1.10 | all | routing | TBD | Verify URL-first navigation keeps page refresh-safe. | P3 |
|
||||
|
||||
## 4.1.10.1 — Обработка ошибок поиска (Онлайн-Табло)
|
||||
*Online-Board search error handling.*
|
||||
|
||||
Source: TZ §4.1.10.1 / lines 699–721, Table 18.
|
||||
|
||||
| # | Rule | TZ cite | Viewport | Current impl | Status | Action | Plan |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| 4.1.10.1-R1 | Flight-number search returns only Aurora/Pobeda flights: show message `"Вы указали рейс авиакомпании группы «Аэрофлот» или рейс авиакомпании партнера. Фактическая информация о выполнении рейсов доступна только для собственных рейсов авиакомпании «Аэрофлот». Перейдите на сайт фактического перевозчика по следующей ссылке."` with link to carrier site (Pobeda: `pobeda.aero`; Aurora: `flyaurora.ru`) | 4.1.10.1 ¶1–4 | all | `src/ui/errors/*` | TBD | Verify Aurora/Pobeda error with correct links. | P3 |
|
||||
| 4.1.10.1-R2 | Route/Departure/Arrival search returns only Aurora/Pobeda/other-carrier flights: show `"По выбранным параметрам не найдено рейсов. Измените параметры поиска."` | 4.1.10.1 ¶2 | all | `src/ui/errors/*` | TBD | Verify empty-results error message. | P3 |
|
||||
| 4.1.10.1-R3 | Flight-number mode: search submitted with no parameters filled → show `"Не верно заданы параметры поиска укажите Номер и Дату рейса."` | 4.1.10.1 ¶3 item 3 | all | `OnlineBoardFilter.tsx` | TBD | Verify missing-params error for flight-number mode. | P3 |
|
||||
| 4.1.10.1-R4 | Route mode: search submitted with no parameters filled → show `"Не верно заданы параметры поиска укажите Город вылета, Город прилета и Дату рейса."` | 4.1.10.1 ¶3 item 4 | all | `OnlineBoardFilter.tsx` | TBD | Verify missing-params error for route mode. | P3 |
|
||||
| 4.1.10.1-R5 | Error queries (errors 3+4) are NOT added to «Вы искали» history or popular-sections Top-4 | 4.1.10.1 ¶ after item 4 | all | `SearchHistory.tsx` | TBD | Verify bad-param searches are excluded from history. | P3 |
|
||||
| 4.1.10.1-R6 | Error page structure: left area = section tabs + filter + «Вы искали»; right area = breadcrumbs + page title + day-tabs + error message area | 4.1.10.1 Table 18 | all | `OnlineBoardSearchPage.tsx` | TBD | Verify layout matches Table 18 structure. | P3 |
|
||||
| 4.1.10.1-R7 | Errors 3+4 (missing params): day-tabs show 7 tabs starting at -1 from today; all tabs are disabled (non-clickable) | 4.1.10.1 Table 18 ("Табы-дни должны выводиться -1 … быть недоступными") | all | `DayTabs/` | TBD | Verify disabled day-tabs on missing-params error. | P3 |
|
||||
| 4.1.10.1-R8 | If filter has a date entered (errors 1+2): day-tabs follow normal 4.1.13.1 day-tab behavior (not disabled) | 4.1.10.1 Table 18 | all | `DayTabs/` | TBD | Verify day-tabs remain functional when date is present. | P3 |
|
||||
|
||||
---
|
||||
|
||||
# 4.1.11 — Правила выполнения поиска рейсов Расписания
|
||||
*Schedule search execution rules. Symmetric to §4.1.10 but with schedule-specific backend + date-range handling.*
|
||||
*Schedule search execution rules.*
|
||||
|
||||
Source: TZ §4.1.11 (lines 724–736).
|
||||
|
||||
| # | Rule | TZ cite | Viewport | Current impl | Status | Action | Plan |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| 4.1.11-R1 | Symmetric to 4.1.10-R1 (explicit submit) | 4.1.11 | all | `ScheduleFilter.tsx` | TBD | Verify. | P3 |
|
||||
| 4.1.11-R2 | Loader shown during search | 4.1 ¶ intro | all | — | TBD | Verify. | P3 |
|
||||
| 4.1.11-R3 | Submit maps to schedule endpoints | 4.1.11 | all | — | TBD | Verify. | P3 |
|
||||
| 4.1.11-R4 | Handles range date (Показать расписание на) | 4.1.11 | all | — | TBD | Verify. | P3 |
|
||||
| 4.1.11-R5 | Round-trip search: if `Показать обратные рейсы` checked and `Дата обратного рейса` set, execute second symmetric query | 4.1.11 | all | — | TBD | Verify. | P3 |
|
||||
| 4.1.11-R6 | **4.1.11.1** Error handling (enumerate at P3) | 4.1.11.1 | all | — | TBD | Enumerate. | P3 |
|
||||
| 4.1.11-R1 | Search executes only on explicit submit (button click) — not triggered automatically by filter changes | 4.1.11 ¶1 | all | `ScheduleFilter.tsx` | TBD | Verify no auto-search on field change. | P3 |
|
||||
| 4.1.11-R2 | Submit button blocked for 30 seconds after each search; hard-coded constant (not in config) | 4.1.11 ¶2 | all | `ScheduleFilter.tsx` | TBD | Verify 30s button lock. | P3 |
|
||||
| 4.1.11-R3 | During search: loader shown; «Отменить поиск» button appears | 4.1.11 ¶3 | all | `ScheduleSearchPage.tsx` | TBD | Verify loader + cancel button during fetch. | P3 |
|
||||
| 4.1.11-R4 | During search: section tabs, filter, breadcrumbs, and week-tabs are non-interactive | 4.1.11 ¶3 | all | layout / overlay | TBD | Verify navigation elements disabled during search. | P3 |
|
||||
| 4.1.11-R5 | Schedule search operates on scheduled times only (unlike Board which also uses estimated/actual) | 4.1.11 ¶4 ("по времени: по расписанию") | all | `src/shared/api/*` | TBD | Verify schedule API query uses scheduled-only times. | P3 |
|
||||
| 4.1.11-R6 | Schedule search covers direct, multi-segment, AND connecting flights (stыковочный — separate flight numbers per segment) | 4.1.11 ¶5 | all | `src/shared/api/*` | TBD | Verify connecting flights included in schedule results. | P3 |
|
||||
| 4.1.11-R7 | «Только прямые рейсы» query returns direct + multi-segment flights (same algorithm as Board, per TZ cross-reference) | 4.1.11 ¶7 | all | `src/shared/api/*` | TBD | Verify direct-only filter returns multi-segment flights too. | P3 |
|
||||
| 4.1.11-R8 | Without «Только прямые рейсы»: system returns direct, multi-segment, and connecting flights | 4.1.11 ¶8 | all | `src/shared/api/*` | TBD | Verify all three flight types returned when filter off. | P3 |
|
||||
| 4.1.11-R9 | Round-trip search (туда+обратно) is executed as **one server request** covering both outbound and return weeks; switching between «Рейсы туда» / «Рейсы обратно» lists does NOT trigger a new request or loader | 4.1.11 ¶9 | all | `ScheduleSearchPage.tsx` | TBD | Verify single-request round-trip; verify no second fetch on tab switch. | P3 |
|
||||
| 4.1.11-R10 | Maximum one connecting leg (стыковка) is processed | 4.1.11 ¶10 | all | `src/shared/api/*` | TBD | Verify connecting-flight results are limited to single connection. | P3 |
|
||||
|
||||
## 4.1.11.1 — Обработка ошибок поиска (Расписание)
|
||||
*Schedule search error handling.*
|
||||
|
||||
Source: TZ §4.1.11.1 / lines 737–753, Table 19.
|
||||
|
||||
| # | Rule | TZ cite | Viewport | Current impl | Status | Action | Plan |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| 4.1.11.1-R1 | All days in the requested week yield no results: show one shared message `"Рейсы не найдены. По выбранным параметрам не найдено рейсов. Измените параметры поиска."` | 4.1.11.1 ¶1 item 1 | all | `src/ui/errors/*` | TBD | Verify empty-week error message. | P3 |
|
||||
| 4.1.11.1-R2 | Some days within the requested week have no results: for those specific days show `"Рейсы не найдены. По выбранным параметрам не найдено рейсов. Измените параметры поиска."` (inline, not a full-page error) | 4.1.11.1 ¶1 item 2 | all | `DayGroupedFlightList.tsx` | TBD | Verify per-day empty-results message shown inline. | P3 |
|
||||
| 4.1.11.1-R3 | Days with no results have distinct visual styling from days with results | 4.1.11.1 ¶ ("дни … должны иметь отличную цветовую индикацию") | all | `WeekTabs.tsx` + day rows | TBD | Verify empty-day color differentiation. | P3 |
|
||||
| 4.1.11.1-R4 | Empty days can still be collapsed/expanded | 4.1.11.1 ¶ | all | `DayGroupedFlightList.tsx` | TBD | Verify expand/collapse works on empty-day rows. | P3 |
|
||||
| 4.1.11.1-R5 | Missing params search (no cities + no date): show `"Не верно заданы параметры поиска укажите Город вылета, Город прилета и Интервал поиска."` | 4.1.11.1 ¶1 item 3 | all | `ScheduleFilter.tsx` | TBD | Verify missing-params error text. | P3 |
|
||||
| 4.1.11.1-R6 | Missing-params queries are NOT added to «Вы искали» or Top-4 popular sections | 4.1.11.1 ¶ after item 3 | all | `SearchHistory.tsx` | TBD | Verify bad-params schedule searches excluded from history. | P3 |
|
||||
| 4.1.11.1-R7 | Error page structure: left = tabs + filter + «Вы искали»; right = breadcrumbs `Главная / Расписание` + page title «Расписание» + week-tabs + error message | 4.1.11.1 Table 19 | all | `ScheduleSearchPage.tsx` | TBD | Verify layout matches Table 19. | P3 |
|
||||
| 4.1.11.1-R8 | Missing-params error (type 3): week-tabs show 7 tabs starting at -1 from today; all tabs disabled | 4.1.11.1 Table 19 ("Табы-недели … недоступными для нажатия") | all | `WeekTabs.tsx` | TBD | Verify disabled week-tabs on missing-params. | P3 |
|
||||
|
||||
---
|
||||
|
||||
# 4.1.12 — Отмена поиска рейсов Онлайн-Табло, Расписания
|
||||
*Search cancellation rules.*
|
||||
|
||||
Short subsection — user can cancel in-flight search; subsequent filter changes abort prior in-flight request.
|
||||
Source: TZ §4.1.12 (lines 757–766).
|
||||
|
||||
| # | Rule | TZ cite | Viewport | Current impl | Status | Action | Plan |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| 4.1.12-R1 | New search aborts any in-flight search (latest-wins) | 4.1.12 | all | — | TBD | Verify AbortController wiring. | P3 |
|
||||
| 4.1.12-R2 | Escape (desktop/tablet) cancels in-flight search if loader shown | 4.1.12 | desktop, tablet | — | TBD | Implement + test. | P3 |
|
||||
| 4.1.12-R3 | Navigating away (back button, tab switch) cancels in-flight search | 4.1.12 | all | — | TBD | Verify. | P3 |
|
||||
| 4.1.12-R1 | Cancellation is triggered by clicking «Отменить поиск» button (which appears after search is launched) | 4.1.12 ¶1–2 | all | `OnlineBoardSearchPage.tsx`, `ScheduleSearchPage.tsx` | TBD | Verify «Отменить поиск» button appears during fetch and click cancels. | P3 |
|
||||
| 4.1.12-R2 | After cancelling Board search: filter retains the values that were used for the search; «Найти» button becomes available again | 4.1.12 ¶3 ("В фильтре введены значения … Кнопка «Найти» доступа для повторного нажатия") | all | `OnlineBoardSearchPage.tsx` | TBD | Verify Board cancel restores submit button + keeps filter values. | P3 |
|
||||
| 4.1.12-R3 | After cancelling Board search: right-area content reverts to Online-Board start-page content (§4.1.6) | 4.1.12 ¶3 | all | `OnlineBoardSearchPage.tsx` | TBD | Verify right-area shows Board start-page state after cancel. | P3 |
|
||||
| 4.1.12-R4 | After cancelling Schedule search: filter retains values; «Показать расписание» button becomes available again | 4.1.12 ¶4 | all | `ScheduleSearchPage.tsx` | TBD | Verify Schedule cancel restores submit button. | P3 |
|
||||
| 4.1.12-R5 | After cancelling Schedule search: right-area content reverts to Schedule start-page content (§4.1.7) | 4.1.12 ¶4 | all | `ScheduleSearchPage.tsx` | TBD | Verify right-area shows Schedule start-page state after cancel. | P3 |
|
||||
| 4.1.12-R6 | Cancellation aborts the in-flight HTTP request (no stale response rendered after cancel) | 4.1.12 (implied by cancel semantics) | all | `src/shared/api/*` | TBD | Verify AbortController used; aborted response is discarded. | P3 |
|
||||
| 4.1.12-R7 | Navigating away from the page (tab switch, back button) while search is in flight also cancels the request | 4.1.12 (cancel on unmount) | all | fetch hooks | TBD | Verify abort on component unmount / route change. | P3 |
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user