Mark P3 (filter + validation + history + search execution) rules Done in TZ audit spec
This commit is contained in:
@@ -129,14 +129,14 @@ _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) |
|
||||
| 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) |
|
||||
| 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) |
|
||||
| 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) |
|
||||
| Conflict | 7 (C1–C7 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 | ~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) |
|
||||
| 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.13–4.1.16 skeleton; §4.1.17-R3/R4; §4.1.18–4.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) |
|
||||
|
||||
### Merge log
|
||||
|
||||
@@ -144,6 +144,7 @@ _Updated after each plan merges. Plan task: after every merge, append a row to t
|
||||
|---|---|---|---|---|
|
||||
| 2026-04-21 | P1 | URLs / breadcrumbs / page names / cross-section nav | `8160286..e935596` | ~103 rules marked Done across §4.1.2/3/4/8; 5 conflicts registered (C1/C2/C4 resolved, C3 deferred, C5 pending P6); 2 rules Partial (R4 padding, R12/13 city-pair) |
|
||||
| 2026-04-22 | P2 | Start pages + first-entry geo + popular sections | `a6d8f43..b27ee2a` | 48 rules marked Done across §4.1.1/5/6/7; 19 pre-existing rules confirmed Implemented; 13 backend-only rules marked Out-of-scope; 1 conflict registered and resolved (C6: Board tab tooltip preposition `53b5359`) |
|
||||
| 2026-04-22 | P3 | Filter + validation + search history + search execution + cancel | `3b32233..a5c64a2` | 133 rules marked Done across §4.1.9/9.1/9.2/9.3/9.4/9.5/10/10.1/11/11.1/12 + §4.1.8-R4/R5; ~17 pre-existing rules confirmed Implemented in §4.1.9; 5 rules (R53-R57) moved to TBD(P4) calendar; 1 conflict registered and resolved (C7: localStorage→sessionStorage for search history `2b0a7ec`) |
|
||||
|
||||
---
|
||||
|
||||
@@ -159,6 +160,7 @@ Arbitrated case-by-case (Q2 = C). Each conflict blocks its owning plan's kickoff
|
||||
| C4 | 4.1.4-R14 | TZ Table 7 row 6 (transitions col) requires last breadcrumb crumb on details page to be clickable (navigates back to search with filter restored) | Angular: last crumb is a link | Previous React `Breadcrumbs` component rendered last crumb as non-link (`!isLast` guard) regardless of whether `url` was provided | TZ and Angular both require clickable leaf | **Adopt TZ**: removed `!isLast` guard — last crumb with `url` now rendered as `<a>` and clickable. Commit: `1821f7f`. Note: `aria-current="page"` is still set on the last crumb as required by R2. |
|
||||
| C5 | 4.1.1-R22 | TZ writes `"ДД.ММ.ГГГ"` (3 Г) for Flight Map date placeholder without geo consent | All other placeholders in TZ use `"ДД.ММ.ГГГГ"` (4 Г) | Not yet implemented (P6 scope) | Clear TZ typo — 3 Г is inconsistent with every other date placeholder in the document | **Treat as typo**: implement as `"ДД.ММ.ГГГГ"` (4 Г). Commit: pending (P6 start-page scope). Conflict to be closed when P6 implements Flight Map start-page. |
|
||||
| C6 | Tab-tooltip cross-cutting (§4.1 opening text) | TZ tab tooltip for Board tab = `"в ближайшие дни"` | Angular reference (and pre-P2 React impl) had `"на ближайшие дни"` | React impl had `"на ближайшие дни"` (incorrect preposition) | TZ uses "в" (in the coming days); Angular reference used "на" (for the coming days) — a copy drift | **Adopt TZ**: changed to `"в ближайшие дни"`. Commit: `53b5359`. Schedule and Map tooltips already matched TZ; only Board tab was affected. |
|
||||
| C7 | 4.1.9.5-R3 (search history storage scope) | TZ §4.1.9.5 ¶1: history is session-scoped ("в рамках одной сессии") | No prior Angular reference compared | Prior React impl used `localStorage` (persisted across sessions) | TZ phrase "в рамках одной сессии" unambiguously requires session scope; `localStorage` was incorrect | **Resolved**: migrated `useSearchHistory` from `localStorage` to `sessionStorage`. Commit: `2b0a7ec`. Rule 4.1.9.5-R3 now Done. |
|
||||
|
||||
---
|
||||
|
||||
@@ -427,8 +429,8 @@ Switching tabs between Online-Board / Schedule / Flight Map preserves user input
|
||||
| 4.1.8-R1 | Tab switch preserves `Город вылета` across Online-Board ↔ Schedule | 4.1.8 | all | `src/shared/crossSectionStore.ts` | Done 9863132 | Cross-section store carries `Город вылета` on tab switch; verified by e2e `e935596`. | P1 |
|
||||
| 4.1.8-R2 | Tab switch preserves `Дата рейса` where the new section's date-window allows it; otherwise clamp to the new window's bounds | 4.1.8 | all | `src/shared/crossSectionStore.ts` | Done ef0e1e3 | Clamp assertion verified by unit test `ef0e1e3`; Board←Schedule projection uses `dateWindow` constants. | P1 |
|
||||
| 4.1.8-R3 | Tab switch to Flight Map does **not** inherit Board/Schedule filter (§4.1.1-R26 — independence) | 4.1.8 / 4.1.1 ¶12 | all | `src/shared/crossSectionStore.ts` | Done 9863132 | Store isolates Flight Map state; no carry-over from Board/Schedule verified. | P1 |
|
||||
| 4.1.8-R4 | Closing popovers on focus-change (4.1 ¶ intro: "all popups close when user focuses elsewhere") applies on tab switch too | 4.1 ¶ intro | desktop, tablet | — | TBD | Popover close on tab-switch is a P3 filter concern; verify at P3 kickoff. | P3 |
|
||||
| 4.1.8-R5 | Search-history ("Вы искали") is shared across Online-Board and Schedule within session, but NOT with Flight Map | 4.1.8 / 4.1.9.5 | all | — | TBD | Search-history scoping is P3 scope. Verify at P3 kickoff. | P3 |
|
||||
| 4.1.8-R4 | Closing popovers on focus-change (4.1 ¶ intro: "all popups close when user focuses elsewhere") applies on tab switch too | 4.1 ¶ intro | desktop, tablet | — | Done d173159 | CityPickerPopup closes on Escape/click-outside (`d173159`); tab-switch triggers focus-loss → popup close path verified. | P3 |
|
||||
| 4.1.8-R5 | Search-history ("Вы искали") is shared across Online-Board and Schedule within session, but NOT with Flight Map | 4.1.8 / 4.1.9.5 | all | — | Done 2b0a7ec | Shared sessionStorage scope confirmed; Map searches excluded; see also Conflict C7 (localStorage→sessionStorage migration). | P3 |
|
||||
| 4.1.8-R6 | (Geo-consent = YES, Table 10 row 1) Online-Board default state (no search yet, city auto-detected) → switch to Schedule: Schedule filter gets `Город вылета` = user's city, `Город прилета` = placeholder ("Укажите город"), `Показать расписание на` = current week, `Время вылета` = 00:00–24:00, toggles off; search NOT auto-executed | 4.1.8 Table 10 row 1 | all | `src/shared/crossSectionStore.ts` | Done 47fee9d | Schedule filter hydration wired; store projection covers this scenario. | P1 |
|
||||
| 4.1.8-R7 | (Geo-consent = YES, Table 10 row 1) Returning from Schedule back to Online-Board default state: Board filter unchanged — still shows user's city, today's date, placeholder arrival, no search | 4.1.8 Table 10 row 1 (return col) | all | `src/shared/crossSectionStore.ts` | Done 47fee9d | Board state not mutated by Schedule visit; each section stores independently. | P1 |
|
||||
| 4.1.8-R8 | (Geo-consent = YES, Table 10 row 2) Online-Board with search executed → switch to Schedule: Schedule gets `Город вылета` = user's geo city (from Board context, NOT the searched route departure) | 4.1.8 Table 10 row 2 | all | `src/shared/crossSectionStore.ts` | Done 47fee9d | Projection uses geo-city from Board context; verified by cross-section store unit tests. | P1 |
|
||||
@@ -457,84 +459,84 @@ Specifies every filter attribute across all modes (Route / Flight-number for Boa
|
||||
|
||||
| # | Rule | TZ cite | Viewport | Current impl | Status | Action | Plan |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| 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 |
|
||||
| 4.1.9-R1 | Filter has two collapsible modes: «Номер рейса» and «Маршрут»; chevron direction reverses on collapse | 4.1.9 ¶1 | all | `OnlineBoardFilter.tsx` | Implemented | Collapse/expand toggle pre-existing; verified by `83951d4` X-button tests that assume collapsible structure. | P3 |
|
||||
| 4.1.9-R2 | Board flight-number mode «Номер рейса» field: placeholder = `"Номер рейса"` | 4.1.9 Table 11 | all | `OnlineBoardFilter.tsx` | Implemented | Placeholder pre-existing; confirmed by `c509131` validation tests. | 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` | Done c509131 | Prefix lock + digit-only mask + max-4 enforced; `c509131` tightened validation and added tests. | P3 |
|
||||
| 4.1.9-R4 | «Номер рейса» X button visible when field is non-empty; hidden when empty | 4.1.9 Table 11 | all | `OnlineBoardFilter.tsx` | Done 83951d4 | Conditional X render added; 21 new tests verify 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` | Done 83951d4 | Click-to-clear wired; X hides after clear; verified by `83951d4` tests. | 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` | Done 83951d4 | Both deletion paths verified (Backspace = native input; X = state clear via `83951d4`). | P3 |
|
||||
| 4.1.9-R7 | Board flight-number mode «Дата рейса» placeholder (no geo): `"ДД.ММ.ГГГГ"` | 4.1.9 Table 11 | all | `OnlineBoardFilter.tsx` | Done 04a3d9c | No-geo placeholder pre-existing; `04a3d9c` confirms it is preserved in no-geo path. | P3 |
|
||||
| 4.1.9-R8 | Board flight-number mode «Дата рейса» placeholder (with geo): `"Сегодня"` | 4.1.9 Table 11 | all | `OnlineBoardFilter.tsx` | Done 04a3d9c | Geo path sets today → label "Сегодня" via `dateLabels.ts`; verified by `04a3d9c` tests. | P3 |
|
||||
| 4.1.9-R9 | «Дата рейса» accepts calendar picker or manual keyboard input in `ДД.ММ.ГГГГ` format | 4.1.9 Table 11 | all | `OnlineBoardFilter.tsx` | Implemented | Dual entry (calendar + text) pre-existing; `c509131` adds out-of-window validation for manual input. | 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` | Done c509131 | `[-1,+14]` window enforced by `dateWindow.ts`; `c509131` validates manual entry outside window. | 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` | Done 04a3d9c | Today→«Сегодня» substitution in `dateLabels.ts`; unit tests in `04a3d9c`. | P3 |
|
||||
| 4.1.9-R12 | When selected date = tomorrow (today+1), display value changes to `"Завтра"` | 4.1.9 Table 11 | all | `OnlineBoardFilter.tsx` | Done 04a3d9c | Tomorrow→«Завтра» substitution in `dateLabels.ts`; unit tests in `04a3d9c`. | 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` | Done 83951d4 | Date X button added with visibility toggle; clear restores placeholder; tested in `83951d4`. | P3 |
|
||||
|
||||
### 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 |
|
||||
| 4.1.9-R14 | Board route mode «Город вылета» placeholder (no geo): `"Укажите город"` | 4.1.9 Table 12 | all | `OnlineBoardFilter.tsx` | Implemented | Placeholder pre-existing; confirmed by `c509131` filter tests. | 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` | Implemented | Geo auto-fill pre-existing (P2 `b023cb9`); placeholder during resolution pre-existing. | P3 |
|
||||
| 4.1.9-R16 | Board route mode «Город прилета» placeholder: `"Укажите город"` (both geo/no-geo) | 4.1.9 Table 12 | all | `OnlineBoardFilter.tsx` | Implemented | Arrival placeholder pre-existing; confirmed by `c509131` tests. | 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` | Done dc3ee10, d173159 | Manual entry audited `dc3ee10`; dictionary picker audited `d173159`; both entry paths verified. | 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` | Done 83951d4 | CityAutocomplete X already correct (CSS `has-value`); confirmed working in `83951d4` tests. | 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` | Done 04a3d9c, 83951d4 | Route-mode date uses same `dateLabels.ts` logic and X button as flight-number mode; verified by `04a3d9c` + `83951d4`. | 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` | Implemented | Desktop/tablet time default pre-existing (P2 `9aed10c`). | 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` | Implemented | Mobile time behavior pre-existing (P2 `9aed10c`, `b023cb9`). | P3 |
|
||||
| 4.1.9-R22 | «Время рейса» uses a dual-handle slider («Время с» / «Время по») | 4.1.9 Table 12 | all | `OnlineBoardFilter.tsx` | Implemented | Dual-handle slider pre-existing; `66518a6` adds gap enforcement on top. | P3 |
|
||||
| 4.1.9-R23 | Minimum gap between «Время с» and «Время по» handles is 1 hour | 4.1.9 Table 12 ("Минимальный шаг ... 1 час") | all | `OnlineBoardFilter.tsx` | Done 66518a6 | 1h minimum gap enforced in `onTimeChange`; 48 new tests verify Board slider constraints. | P3 |
|
||||
| 4.1.9-R24 | «Время по» cannot be set earlier than «Время с» | 4.1.9 Table 12 | all | `OnlineBoardFilter.tsx` | Done 66518a6 | Handle crossing blocked by 1h-gap guard in `66518a6`; handles cannot reach equal position either. | 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 |
|
||||
| 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` | Done c509131 | No-geo all-empty state validated and tested in `c509131` filter validation tests. | 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` | Done c509131 | Departure partial-fill state verified in `c509131`; all four field states tested. | 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` | Done c509131 | Cascade clear on departure X verified in `c509131` tests. | P3 |
|
||||
| 4.1.9-R28 | When geo granted and Прилет search: Город вылета placeholder = «Все направления», Город прилета = city name (filled), Дата = «Сегодня» | 4.1.9 Table 13 (geo+arrival) | all | `OnlineBoardFilter.tsx` | Done c509131 | Arrival partial-fill state verified in `c509131`. | 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` | Done c509131 | Arrival clear cascade tested in `c509131`. | 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` | Done c509131 | Mobile time reset on city clear tested in `c509131` filter validation. | 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 |
|
||||
| 4.1.9-R31 | Schedule has one mode only; no mode label shown in header | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | Implemented | Single-mode schedule filter pre-existing; no mode heading confirmed by `c509131` tests. | P3 |
|
||||
| 4.1.9-R32 | Schedule filter is NOT collapsible (Возможность свернуть/развернуть — нет) | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | Implemented | No collapse control pre-existing; confirmed by `c509131` schedule filter tests. | P3 |
|
||||
| 4.1.9-R33 | Schedule «Город вылета» placeholder (no geo): `"Укажите город"` | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | Implemented | Placeholder pre-existing; confirmed by `c509131` tests. | P3 |
|
||||
| 4.1.9-R34 | Schedule «Город вылета» placeholder (with geo): detected city name | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | Implemented | Geo fill pre-existing (P2 `c3c1f83`); confirmed unchanged by `c509131`. | P3 |
|
||||
| 4.1.9-R35 | Schedule «Город прилета» placeholder: `"Укажите город"` (both geo/no-geo) | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | Implemented | Arrival placeholder pre-existing; confirmed by `c509131` tests. | 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` | Done dc3ee10, d173159 | Both entry paths verified (same `CityAutocomplete` component); X clear confirmed by `83951d4`. | P3 |
|
||||
| 4.1.9-R37 | Schedule «Показать расписание на» placeholder (no geo): `"ДД.ММ.ГГГГ-ДД.ММ.ГГГГ"` | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | Implemented | Placeholder pre-existing; no-geo path confirmed by `8f4d5fc` tests. | P3 |
|
||||
| 4.1.9-R38 | Schedule «Показать расписание на» placeholder (with geo): `"Текущая неделя"` | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | Done 8f4d5fc | Geo path sets current-week label via `dateLabels.ts`; unit tests in `8f4d5fc`. | P3 |
|
||||
| 4.1.9-R39 | Selection in «Показать расписание на» is by whole weeks | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | Implemented | Week-granularity calendar pre-existing; `c509131` validation tests exercise week boundaries. | P3 |
|
||||
| 4.1.9-R40 | Calendar window for «Показать расписание на»: `[-1, +330]` days from today | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | Done c509131 | `[-1,+330]` window enforced; `c509131` validates manual entry outside window with `"Некорректная дата"`. | P3 |
|
||||
| 4.1.9-R41 | If selected week contains today, display value = `"Текущая неделя"` (not the date string) | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | Done 8f4d5fc | Current-week substitution in Schedule `dateLabels.ts`; unit tests in `8f4d5fc`. | P3 |
|
||||
| 4.1.9-R42 | «Показать расписание на» X clears value and restores placeholder; X hidden when empty | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | Done 83951d4 | Schedule outbound date X added with visibility toggle; tested in `83951d4`. | P3 |
|
||||
| 4.1.9-R43 | Schedule «Время вылета» placeholder: `"00:00 – 24:00"` (all viewports, all geo states) | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | Implemented | Time default pre-existing (P2 `c3c1f83`); no geo variant for schedule — confirmed. | P3 |
|
||||
| 4.1.9-R44 | Schedule «Время вылета»: dual-handle slider, 1h minimum gap, «Время по» cannot precede «Время с» | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | Done 66518a6 | 1h gap + crossing guard added for Schedule slider in `66518a6`; 64 new Schedule slider tests. | P3 |
|
||||
| 4.1.9-R45 | Schedule «Только прямые рейсы»: checkbox, initially unchecked | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | Implemented | Default unchecked pre-existing (P2 `c3c1f83`). | P3 |
|
||||
| 4.1.9-R46 | Schedule «Показать обратные рейсы»: checkbox, initially unchecked | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | Implemented | Default unchecked pre-existing (P2 `c3c1f83`). | P3 |
|
||||
| 4.1.9-R47 | When «Показать обратные рейсы» is checked, two extra fields appear: «Дата обратного рейса» and «Время отправления обратного рейса» | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | Implemented | Conditional return fields pre-existing; `c509131` validation tests exercise the round-trip path. | P3 |
|
||||
| 4.1.9-R48 | «Дата обратного рейса» placeholder: `"ДД.ММ.ГГГГ-ДД.ММ.ГГГГ"` | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | Implemented | Return date placeholder pre-existing; confirmed by `c509131`. | P3 |
|
||||
| 4.1.9-R49 | «Дата обратного рейса» selection by whole weeks; calendar window `[-1, +330]` | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | Done c509131 | Return week window enforced; cross-validation with outbound week tested in `c509131`. | P3 |
|
||||
| 4.1.9-R50 | «Дата обратного рейса» X clears + restores placeholder; X hidden when empty | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | Done 83951d4 | Schedule return date X added with visibility toggle; tested in `83951d4`. | P3 |
|
||||
| 4.1.9-R51 | «Время отправления обратного рейса» placeholder: `"00:00 – 24:00"` | 4.1.9 Table 14 | all | `ScheduleFilter.tsx` | Implemented | Return time placeholder pre-existing. | 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` | Done 66518a6 | Return time slider 1h gap + crossing guard added in `66518a6` alongside outbound slider. | 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 |
|
||||
| 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 (P4) | Not addressed in P3 — reactive midnight calendar update is a calendar component concern; deferred to P4 when calendar is enumerated. | P4 |
|
||||
| 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 (P4) | Mobile date-chip strip not explicitly wired in P3; deferred to P4 calendar enumeration. | P4 |
|
||||
| 4.1.9-R55 | Tapping today chip sets date field to `"Сегодня"` | 4.1.9 ¶ "При клике" | mobile | `OnlineBoardFilter.tsx` | TBD (P4) | Depends on R54 chip strip; label logic (`04a3d9c`) is ready. Deferred to P4. | P4 |
|
||||
| 4.1.9-R56 | Tapping today+1 chip sets date field to `"Завтра"` | 4.1.9 ¶ "При клике" | mobile | `OnlineBoardFilter.tsx` | TBD (P4) | Depends on R54 chip strip; label logic (`04a3d9c`) is ready. Deferred to P4. | P4 |
|
||||
| 4.1.9-R57 | Tapping today+2 chip sets date field to `ДД.ММ.ГГГГ` of today+2 date | 4.1.9 ¶ "При клике" | mobile | `OnlineBoardFilter.tsx` | TBD (P4) | Depends on R54 chip strip. Deferred to P4. | P4 |
|
||||
| 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` | Implemented | Board-only mobile time auto-set pre-existing (P2 `9aed10c`, `b023cb9`); Schedule unaffected (confirmed by `8f4d5fc`). | P3 |
|
||||
|
||||
**Rules in this subsection: 58 (R1–R58). Sub-subsection rules counted separately below.**
|
||||
|
||||
@@ -547,18 +549,18 @@ 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 |
|
||||
| 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` | Done dc3ee10 | Dropdown-on-first-keystroke confirmed by assertion tests in `dc3ee10`. | 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` | Done dc3ee10 | Both name and IATA-code matching verified by `dc3ee10` `searchCities` tests. | P3 |
|
||||
| 4.1.9.1-R3 | Results are grouped: city → airports in that city | 4.1.9.1 ¶2 item 1 | all | `CityAutocomplete.tsx` | Done dc3ee10 | City-grouped dropdown structure confirmed by `dc3ee10` assertion tests. | 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` | Done dc3ee10 | City-match shows city + all airports verified in `dc3ee10`. | 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` | Done dc3ee10 | Airport-match parent-city + siblings verified in `dc3ee10`. | 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` | Done dc3ee10 | `keyboardLayoutConverter.ts` added; EN→RU retry wired into `searchCities`; unit tested in `dc3ee10`. | P3 |
|
||||
| 4.1.9.1-R7 | Dropdown shows at most 10 results (top 10) | 4.1.9.1 ¶4 ("не более 10 наименований") | all | `CityAutocomplete.tsx` | Done dc3ee10 | 10-result cap verified by `dc3ee10` assertion tests. | P3 |
|
||||
| 4.1.9.1-R8 | Results sorted alphabetically in the active locale | 4.1.9.1 ¶5 ("сортировка в алфавитном порядке согласно текущему языку") | all | `CityAutocomplete.tsx` | Done dc3ee10 | Locale-aware sort confirmed by `dc3ee10` assertion tests. | 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` | Done dc3ee10 | Highlight markup confirmed by `dc3ee10` assertion tests. | 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` | Done dc3ee10 | Exact-match auto-commit pre-existing (`9efc76b`); locked by `dc3ee10` assertion tests. | 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` | Done dc3ee10 | Escape-restores-last-committed implemented in `dc3ee10`; tested in CityAutocomplete tests. | P3 |
|
||||
| 4.1.9.1-R12 | Focus loss (click outside) closes the dropdown without committing | 4.1.9.1 (focus-loss) | all | `CityAutocomplete.tsx` | Done dc3ee10 | Click-outside dismiss verified by `dc3ee10` assertion tests. | P3 |
|
||||
|
||||
**Rules in §4.1.9.1: 12 (R1–R12).**
|
||||
|
||||
@@ -571,17 +573,17 @@ 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 |
|
||||
| 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` | Done d173159 | Picker-on-focus confirmed by `d173159` CityPickerPopup tests. | 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` | Done d173159 | «Россия и СНГ» first + alphabetical remaining regions confirmed by `d173159` tests. | P3 |
|
||||
| 4.1.9.2-R3 | Within «Россия и СНГ», Russia is first; within Russia, Moscow is the first city | 4.1.9.2 ¶ ("первая должна быть страна «Россия», город «Москва»") | all | `CityPickerPopup.tsx` | Done d173159 | Russia/Moscow pinned positions verified by `d173159` assertion tests. | P3 |
|
||||
| 4.1.9.2-R4 | Countries within each region sorted alphabetically | 4.1.9.2 ¶ ("остальные страны … в алфавитном порядке") | all | `CityPickerPopup.tsx` | Done d173159 | Country sort within region verified by `d173159` tests. | 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` | Done d173159 | Column-based alphabetical city layout confirmed by `d173159` tests. | 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` | Done d173159 | Per-city airport sub-list sorted alphabetically; verified by `d173159` tests. | 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` | Done d173159 | ArrowDown/Up navigation added with `aria-activedescendant`; tested in `d173159`. | 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` | Done d173159 | Enter-commits-highlighted-item implemented and tested in `d173159`. | P3 |
|
||||
| 4.1.9.2-R9 | Escape key closes the picker without committing | 4.1.9.2 (keyboard cancel) | all | `CityPickerPopup.tsx` | Done d173159 | Escape closes picker without committing; tested in `d173159`. | P3 |
|
||||
| 4.1.9.2-R10 | Click outside the picker closes it without committing | 4.1.9.2 (click-outside) | all | `CityPickerPopup.tsx` | Done d173159 | Click-outside dismiss verified by `d173159` tests. | 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` | Done d173159 | Scrollable container confirmed by `d173159` (overflow-y CSS + overflow assertion). | P3 |
|
||||
|
||||
**Rules in §4.1.9.2: 11 (R1–R11).**
|
||||
|
||||
@@ -594,19 +596,19 @@ 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 |
|
||||
| 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` | Done c509131 | Pre-submit validation gate enforced; tested in `c509131` (77 new OB + 141 new Schedule tests). | P3 |
|
||||
| 4.1.9.3-R2 | Invalid «Номер рейса»: field highlighted + tooltip `"Неверно указан номер рейса. Номер рейса может состоять только из цифр и не должен быть длиннее 4-х символов."` | 4.1.9.3 ¶1 item 1 | all | `OnlineBoardFilter.tsx` | Done c509131 | Exact error message text verified by `c509131` tests; i18n keys added for all 9 languages. | P3 |
|
||||
| 4.1.9.3-R3 | When Город вылета = Город прилета: «Город вылета» field highlighted red + tooltip `"Город вылета не может быть равен городу прилета"` | 4.1.9.3 ¶1 item 2 | all | `OnlineBoardFilter.tsx`, `ScheduleFilter.tsx` | Done c509131 | Same-city validation and exact error text verified by `c509131` tests for both Board and Schedule. | P3 |
|
||||
| 4.1.9.3-R4 | Invalid value in «Город вылета»: field highlighted + tooltip `"Неверно указан пункт вылета"` | 4.1.9.3 ¶1 item 3 | all | `OnlineBoardFilter.tsx`, `ScheduleFilter.tsx` | Done c509131 | Invalid-departure error text and highlight verified by `c509131`. | 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` | Done c509131 | Arrival-only partial search permitted; departure-empty is not an error; verified by `c509131`. | P3 |
|
||||
| 4.1.9.3-R6 | Invalid value in «Город прилета»: field highlighted + tooltip `"Неверно указан пункт прилета"` | 4.1.9.3 ¶1 item 4 | all | `OnlineBoardFilter.tsx`, `ScheduleFilter.tsx` | Done c509131 | Invalid-arrival error text and highlight verified by `c509131`. | 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` | Done c509131 | Departure-only partial search permitted; arrival-empty is not an error; verified by `c509131`. | 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 | Done c509131 | Out-of-window date validation added with `"Некорректная дата"` error; tested in `c509131`. | P3 |
|
||||
| 4.1.9.3-R9 | Online-Board date validation window: `[-1, +14]` from today | 4.1.9.3 ¶ "Валидация календаря в Онлайн-табло" | all | `OnlineBoardFilter.tsx` | Done c509131 | Board `[-1,+14]` window from `dateWindow.ts` verified in `c509131` tests. | P3 |
|
||||
| 4.1.9.3-R10 | Schedule outbound date validation window: `[-1, +330]` from today | 4.1.9.3 ¶ "Валидация календаря в Расписании (рейсы туда)" | all | `ScheduleFilter.tsx` | Done c509131 | Schedule `[-1,+330]` outbound window verified in `c509131` tests. | 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` | Done c509131 | Return-date lower bound `+1` enforced; tested separately in `c509131`. | P3 |
|
||||
| 4.1.9.3-R12 | Flight Map filter: **no** validation on any filter fields | 4.1.9.3 ¶ "Валидация параметров фильтра подраздела «Карта полетов» не предусматривается" | all | `FlightsMapFilter.tsx` | Done c509131 | Absence of validation on Flight Map filter confirmed as deliberate; `c509131` does not touch `FlightsMapFilter`. | 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 | Done c509131 | Submit is blocked when any error is active; error fields rendered with red highlight; tested in `c509131`. | P3 |
|
||||
|
||||
**Rules in §4.1.9.3: 13 (R1–R13).**
|
||||
|
||||
@@ -619,15 +621,15 @@ 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 |
|
||||
| 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` | Done c509131 | Return-before-outbound guard implemented; tested in `c509131` schedule cross-validation tests. | 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` | Done c509131 | Return calendar min-week set to outbound week on selection; week X selectable; tested in `c509131`. | 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` | Done c509131 | Outbound-change within range preserves return; tested in `c509131`. | 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` | Done c509131 | Outbound-beyond-return clears return; tested in `c509131`. | 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` | Done c509131 | Outbound-clear resets return to current week; tested in `c509131`. | 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` | Done c509131 | Post-clear independence of return pick tested in `c509131`. | 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` | Done c509131 | Same-week scenario validity tested in `c509131`. | 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` | Done c509131 | Beyond-both-values case clears return; tested in `c509131`. | 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` | Done c509131 | Clear-return-only resets only the return field; outbound unchanged; tested in `c509131`. | P3 |
|
||||
|
||||
**Rules in §4.1.9.4: 9 (R1–R9).**
|
||||
|
||||
@@ -640,20 +642,20 @@ 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 |
|
||||
| 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` | Done 2b0a7ec | Empty initial state verified by `2b0a7ec` session-storage tests. | P3 |
|
||||
| 4.1.9.5-R2 | Block is positioned below the filter area | 4.1.9.5 ¶1 ("под блоком «Фильтра»") | all | layout | Done 2b0a7ec | DOM layout order confirmed by `2b0a7ec` assertion tests. | 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` | Done 2b0a7ec | Shared sessionStorage scope confirmed; Map searches excluded (Map hooks do not call history hook); tested in `2b0a7ec`. | P3 |
|
||||
| 4.1.9.5-R4 | When history list is long, a scrollbar is provided | 4.1.9.5 ¶3 | all | `SearchHistory.tsx` | Done 2b0a7ec | Scrollable container verified by `2b0a7ec` overflow tests. | 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` | Done 2b0a7ec | Flight-number entry format verified by `2b0a7ec` item-type tests. | 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` | Done 2b0a7ec | Departure entry format + time suppression for full-day verified by `2b0a7ec`. | 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` | Done 2b0a7ec | Arrival entry format verified by `2b0a7ec`. | 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` | Done 2b0a7ec | Route entry format + no-label confirmed by `2b0a7ec`. | 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` | Done 2b0a7ec | Schedule one-way entry format verified by `2b0a7ec`. | 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` | Done 2b0a7ec | Direct-only variant stored and displayed; icon variant tested in `2b0a7ec`. | 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` | Done 2b0a7ec | Round-trip entry format with two week ranges verified by `2b0a7ec`. | 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` | Done 2b0a7ec | Round-trip direct-only entry verified by `2b0a7ec`. | 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` | Done 2b0a7ec | `SearchHistory.scss` hover fixed to full blue background + white text per TZ; committed in `2b0a7ec`. | 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` | Done 2b0a7ec | Click rehydrates filter + triggers search; dedup + bump-to-top + most-recent-first ordering all tested in `2b0a7ec`. | P3 |
|
||||
|
||||
**Rules in §4.1.9.5: 14 (R1–R14).**
|
||||
|
||||
@@ -666,15 +668,15 @@ 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) — 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-R1 | Search executes only on explicit submit (button click) — not triggered automatically by attribute change | 4.1.10 ¶1 | all | `OnlineBoardFilter.tsx` | Done a5c64a2 | No auto-search on field change confirmed; submit-only trigger tested in `a5c64a2`. | 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` | Done a5c64a2 | 30s hard-coded lock implemented in `OnlineBoardFilter.tsx`; tested in `a5c64a2`. | P3 |
|
||||
| 4.1.10-R3 | During search: loader is shown; «Отменить поиск» button appears | 4.1.10 ¶3 | all | `OnlineBoardSearchPage.tsx` | Done a5c64a2 | Loader + «Отменить поиск» button rendered while fetch in flight; tested in `a5c64a2`. | 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 | Done a5c64a2 | `data-searching` attribute on search pages disables filter/tabs/breadcrumbs via `pointer-events:none` CSS; implemented in `a5c64a2`. | 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/*` | Done a5c64a2 | All three time sources requested by API; AbortController wired through `ApiClient → api → hooks` in `a5c64a2`. | 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/*` | Done a5c64a2 | Multi-segment flights included in results; API query confirmed in `a5c64a2` hook audit. | 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 | Done a5c64a2 | Zero-padding applied before API call; also see 4.1.2-R4; confirmed in `a5c64a2`. | P3 |
|
||||
| 4.1.10-R8 | If «Номер рейса» has exactly 4 digits, search by exact match (no padding) | 4.1.10 ¶8 | all | api layer | Done a5c64a2 | 4-digit number not further padded; tested in `a5c64a2`. | P3 |
|
||||
| 4.1.10-R9 | Successful search: navigate to result URL (per §4.1.2) before rendering results | 4.1.10 | all | routing | Done a5c64a2 | URL-first navigation confirmed; page is refresh-safe; verified in `a5c64a2`. | P3 |
|
||||
|
||||
## 4.1.10.1 — Обработка ошибок поиска (Онлайн-Табло)
|
||||
*Online-Board search error handling.*
|
||||
@@ -683,14 +685,14 @@ 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.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/*` | Done a5c64a2 | Per-status error messages `BOARD.ERROR-TIMEOUT / ERROR-4XX / ERROR-5XX` added; Aurora/Pobeda carrier links verified in `a5c64a2`. | 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/*` | Done a5c64a2 | Empty-results error message wired; error banners tested in `a5c64a2`. | 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` | Done a5c64a2 | Missing-params error for flight-number mode implemented and tested in `a5c64a2`. | 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` | Done a5c64a2 | Missing-params error for route mode implemented and tested in `a5c64a2`. | 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` | Done a5c64a2 | Bad-param searches excluded from history; tested in `a5c64a2` error tests. | 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` | Done a5c64a2 | Layout matches Table 18; error area wired in `OnlineBoardSearchPage.tsx` in `a5c64a2`. | 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/` | Done a5c64a2 | Disabled day-tabs on missing-params error implemented in `a5c64a2`. | 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/` | Done a5c64a2 | Day-tabs remain functional when date is present; tested in `a5c64a2` error test suite. | P3 |
|
||||
|
||||
---
|
||||
|
||||
@@ -701,16 +703,16 @@ Source: TZ §4.1.11 (lines 724–736).
|
||||
|
||||
| # | Rule | TZ cite | Viewport | Current impl | Status | Action | Plan |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| 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-R1 | Search executes only on explicit submit (button click) — not triggered automatically by filter changes | 4.1.11 ¶1 | all | `ScheduleFilter.tsx` | Done a5c64a2 | No auto-search on field change; submit-only trigger confirmed in `a5c64a2`. | 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` | Done a5c64a2 | 30s hard-coded lock in `ScheduleFilter.tsx`; tested in `a5c64a2`. | P3 |
|
||||
| 4.1.11-R3 | During search: loader shown; «Отменить поиск» button appears | 4.1.11 ¶3 | all | `ScheduleSearchPage.tsx` | Done a5c64a2 | Loader + cancel button during fetch verified by `a5c64a2` tests. | P3 |
|
||||
| 4.1.11-R4 | During search: section tabs, filter, breadcrumbs, and week-tabs are non-interactive | 4.1.11 ¶3 | all | layout / overlay | Done a5c64a2 | `data-searching` + `pointer-events:none` CSS disables Schedule navigation during search; implemented in `a5c64a2`. | 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/*` | Done a5c64a2 | Schedule API uses scheduled-only time source; confirmed in `a5c64a2` hook audit. | 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/*` | Done a5c64a2 | Connecting flights included; confirmed in `a5c64a2`. | 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/*` | Done a5c64a2 | Direct-only filter returns multi-segment flights; confirmed in `a5c64a2`. | P3 |
|
||||
| 4.1.11-R8 | Without «Только прямые рейсы»: system returns direct, multi-segment, and connecting flights | 4.1.11 ¶8 | all | `src/shared/api/*` | Done a5c64a2 | All three flight types returned when filter off; confirmed in `a5c64a2`. | 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` | Done a5c64a2 | Single-request round-trip; no second fetch on tab switch — AbortController wired in `a5c64a2`; tested. | P3 |
|
||||
| 4.1.11-R10 | Maximum one connecting leg (стыковка) is processed | 4.1.11 ¶10 | all | `src/shared/api/*` | Done a5c64a2 | Single-connection limit enforced by API parameter; confirmed in `a5c64a2`. | P3 |
|
||||
|
||||
## 4.1.11.1 — Обработка ошибок поиска (Расписание)
|
||||
*Schedule search error handling.*
|
||||
@@ -719,14 +721,14 @@ 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.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/*` | Done a5c64a2 | Empty-week error message wired; per-status error messages in `a5c64a2`. | 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` | Done a5c64a2 | Per-day inline empty-results message implemented in `a5c64a2`. | 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 | Done a5c64a2 | Empty-day color differentiation implemented in `ScheduleSearchPage.scss` in `a5c64a2`. | P3 |
|
||||
| 4.1.11.1-R4 | Empty days can still be collapsed/expanded | 4.1.11.1 ¶ | all | `DayGroupedFlightList.tsx` | Done a5c64a2 | Collapse/expand on empty-day rows preserved in `a5c64a2`. | P3 |
|
||||
| 4.1.11.1-R5 | Missing params search (no cities + no date): show `"Не верно заданы параметры поиска укажите Город вылета, Город прилета и Интервал поиска."` | 4.1.11.1 ¶1 item 3 | all | `ScheduleFilter.tsx` | Done a5c64a2 | Missing-params error text implemented and tested in `a5c64a2`. | 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` | Done a5c64a2 | Bad-params Schedule searches excluded from history; tested in `a5c64a2`. | 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` | Done a5c64a2 | Layout matches Table 19; error area wired in `ScheduleSearchPage.tsx` in `a5c64a2`. | 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` | Done a5c64a2 | Disabled week-tabs on missing-params implemented in `a5c64a2`. | P3 |
|
||||
|
||||
---
|
||||
|
||||
@@ -737,13 +739,13 @@ Source: TZ §4.1.12 (lines 757–766).
|
||||
|
||||
| # | Rule | TZ cite | Viewport | Current impl | Status | Action | Plan |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| 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 |
|
||||
| 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` | Done a5c64a2 | «Отменить поиск» button appears during fetch; click cancels — Escape key also triggers cancel; tested in `a5c64a2`. | 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` | Done a5c64a2 | Board cancel restores submit button + keeps filter values; tested in `a5c64a2`. | 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` | Done a5c64a2 | Right-area reverts to Board start-page state on cancel; tested in `a5c64a2`. | P3 |
|
||||
| 4.1.12-R4 | After cancelling Schedule search: filter retains values; «Показать расписание» button becomes available again | 4.1.12 ¶4 | all | `ScheduleSearchPage.tsx` | Done a5c64a2 | Schedule cancel restores submit button + keeps filter values; tested in `a5c64a2`. | 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` | Done a5c64a2 | Right-area reverts to Schedule start-page state on cancel; tested in `a5c64a2`. | 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/*` | Done a5c64a2 | AbortController wired through `ApiClient → api → hooks`; aborted response discarded; 3 new tests in `a5c64a2`. | 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 | Done a5c64a2 | Abort on component unmount / route change implemented in `useOnlineBoard` + `useScheduleSearch`; tested in `a5c64a2`. | P3 |
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user