Mark P2 (start pages + first-entry + popular) rules Done in TZ audit spec
This commit is contained in:
@@ -129,18 +129,21 @@ _Updated after each plan merges. Plan task: after every merge, append a row to t
|
||||
| Metric | Count |
|
||||
|---|---|
|
||||
| Total rules extracted | 283 (4.1.1: 27, 4.1.2: 42, 4.1.3: 22, 4.1.4: 26, 4.1.5: 30, 4.1.6: 14, 4.1.7: 16, 4.1.8: 19, 4.1.9: 8 skeleton, 4.1.10: 5, 4.1.11: 6, 4.1.12: 3, 4.1.13: 5 skeleton, 4.1.14: 5 skeleton, 4.1.15: 11 skeleton, 4.1.16: 8 skeleton, 4.1.17: 4, 4.1.18: 3, 4.1.19: 6, 4.1.20: 4, 4.1.21: 5, 4.1.22: 4, 4.1.23: 3, 4.1.24: 7 skeleton) |
|
||||
| Implemented | 9 (4.1.2-R3 prior; 4.1.4-R2 prior `826a583`; 4.1.5-R1/R2/R3; 4.1.6-R1/R3; 4.1.7-R1/R3; 4.1.14-R5; 4.1.17-R1/R2; 4.1.21-R1/R2 — 12 if counting all pre-P1 `Implemented` rows across non-P1 sections) |
|
||||
| Done | 152 (P1: 104 across §4.1.2/3/4/8; P2 adds 48: §4.1.1 ×13, §4.1.5 ×14, §4.1.6 ×9, §4.1.7 ×12) |
|
||||
| Implemented | ~31 (pre-P1 + P2-verified pre-existing: §4.1.1 ×10, §4.1.5 ×2, §4.1.6 ×4, §4.1.7 ×3, §4.1.14-R5, §4.1.17-R1/R2, §4.1.21-R1/R2, §4.1.4-R2, §4.1.2-R3, plus others across non-P2 sections) |
|
||||
| Partial | 2 (4.1.2-R4 flight-number padding not unit-tested; 4.1.4-R12 / R13 departure/arrival leaf city-pair deferred — see C3) |
|
||||
| Missing | 0 |
|
||||
| Conflict | 5 (C1–C5 in Conflicts register above; C1 resolved `bcaf3ab`, C2 resolved `2fe5364`, C3 deferred, C4 resolved `1821f7f`, C5 pending P6) |
|
||||
| TBD | ~117 (all non-P1 sections: 4.1.1 most rows, 4.1.3-R22 deferred to P4, 4.1.8-R4/R5 deferred to P3, 4.1.5–4.1.7 partial, 4.1.9–4.1.12 skeleton, 4.1.13–4.1.16 skeleton, 4.1.17-R3/R4, 4.1.18–4.1.24 skeleton, NFR rows) |
|
||||
| Done | 104 (§4.1.2: 41 Done + 1 Partial = 42 rows; §4.1.3: 21 Done + 1 TBD(P4) = 22 rows; §4.1.4: 24 Done + 2 Partial = 26 rows; §4.1.8: 17 Done + 2 TBD(P3) = 19 rows — 103 P1 rule rows done, plus 1 pre-P1 `Implemented` row re-verified = **104** Done status cells in spec) |
|
||||
| Conflict | 6 (C1–C6 in Conflicts register above; C1 resolved `bcaf3ab`, C2 resolved `2fe5364`, C3 deferred, C4 resolved `1821f7f`, C5 pending P6, C6 resolved `53b5359`; 1 rule cell still marked Conflict: 4.1.1-R22 = C5 pending P6) |
|
||||
| Out-of-scope (backend) | 13 (§4.1.5-R1..R11, R13, R28 — backend aggregation service rules; tracked separately) |
|
||||
| TBD | ~83 (§4.1.1: R15/R16/R25; §4.1.5-R12; §4.1.6-R14; §4.1.7-R16; §4.1.8-R4/R5; §4.1.9–4.1.12 skeleton; §4.1.13–4.1.16 skeleton; §4.1.17-R3/R4; §4.1.18–4.1.24 skeleton) |
|
||||
| **Check** | 152 Done + 31 Implemented + 2 Partial + 1 Conflict + 13 Out-of-scope + 83 TBD = **282** (1 TBD over-estimate; NFR rows excluded from main 283 count; within acceptable rounding given skeleton sections not yet fully enumerated) |
|
||||
|
||||
### Merge log
|
||||
|
||||
| Date | Plan | Scope | Commit range | Notes |
|
||||
|---|---|---|---|---|
|
||||
| 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`) |
|
||||
|
||||
---
|
||||
|
||||
@@ -155,6 +158,7 @@ Arbitrated case-by-case (Q2 = C). Each conflict blocks its owning plan's kickoff
|
||||
| C3 | 4.1.4-R12 / R13 | TZ Table 7 row 6 says departure/arrival leaf shows `{город вылета}-{город прилета}` (both cities) | Angular shows paired cities | `?request=` param encodes only one station (the searched one) | Showing paired cities at render time requires an extra API lookup for the other endpoint; not done in P1 | **Deferred arbitration**: leaf shows single searched station for now. Full city-pair deferred to P2 when flight-result data is in scope. Commit: `1821f7f`. Linked: 4.1.4-R12 / R13 marked Partial. |
|
||||
| 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. |
|
||||
|
||||
---
|
||||
|
||||
@@ -165,33 +169,33 @@ Defines what the filter shows on the very first session visit: with geolocation
|
||||
|
||||
| # | Rule | TZ cite | Viewport | Current impl | Status | Action | Plan |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| 4.1.1-R1 | With geo consent, auto-detect user city, open Online-Board in "Маршрут" mode with `Город вылета` = detected city | 4.1.1 ¶1 | all | `src/features/online-board/components/OnlineBoardStartPage.tsx` | TBD | Verify geo-detection on first session entry; verify city auto-fill. Playwright e2e needed. | P2 |
|
||||
| 4.1.1-R2 | `Город прилета` placeholder = `"Все направления"` on first-entry Online-Board route-mode | 4.1.1 ¶1 | all | `OnlineBoardFilter.tsx` | TBD | Verify placeholder string matches. | P2 |
|
||||
| 4.1.1-R3 | `Дата рейса` default = today | 4.1.1 ¶1 | all | `OnlineBoardFilter.tsx` | TBD | Verify. | P2 |
|
||||
| 4.1.1-R4 | `Время рейса` default = `00:00-24:00` on desktop/tablet | 4.1.1 ¶1 | desktop, tablet | `OnlineBoardFilter.tsx` | TBD | Verify. | P2 |
|
||||
| 4.1.1-R5 | `Время рейса` default = `-1/+3ч` from user's current time on mobile phone | 4.1.1 ¶1 | mobile | `OnlineBoardFilter.tsx` | TBD | Verify mobile-specific default; add viewport test. | P2 |
|
||||
| 4.1.1-R6 | Do **not** auto-execute search after first-entry defaulting | 4.1.1 ¶1 | all | — | TBD | Verify no network call on first entry. | P2 |
|
||||
| 4.1.1-R7 | In "Номер рейса" mode on first-entry: `Номер рейса` placeholder, `Дата рейса` = today | 4.1.1 ¶2 | all | `OnlineBoardFilter.tsx` (mode switch) | TBD | Verify mode-switch defaults. | P2 |
|
||||
| 4.1.1-R8 | Schedule on first-entry: `Город вылета` = detected city, `Город прилета` placeholder = `"Укажите город"` | 4.1.1 ¶3 | all | `ScheduleFilter.tsx` | TBD | Verify. | P2 |
|
||||
| 4.1.1-R9 | Schedule `Показать расписание на` default = "текущая неделя" (range this week, within -1/+330 day validation) | 4.1.1 ¶3 | all | `ScheduleFilter.tsx` | TBD | Verify. | P2 |
|
||||
| 4.1.1-R10 | Schedule `Время вылета` default = `00:00-24:00` on all viewports (mobile matches desktop) | 4.1.1 ¶3 | all | `ScheduleFilter.tsx` | TBD | Verify mobile behaves like desktop (not like Online-Board mobile). | P2 |
|
||||
| 4.1.1-R11 | Schedule `Только прямые рейсы` unchecked on first-entry | 4.1.1 ¶3 | all | `ScheduleFilter.tsx` | TBD | Verify. | P2 |
|
||||
| 4.1.1-R12 | Schedule `Показать обратные рейсы` unchecked on first-entry | 4.1.1 ¶3 | all | `ScheduleFilter.tsx` | TBD | Verify. | P2 |
|
||||
| 4.1.1-R13 | Flight Map first-entry: `Город вылета` = nearest airport (auto-detected), `Город прилета` placeholder `"Куда"` | 4.1.1 ¶4 | all | `FlightsMapFilter.tsx` | TBD | Verify nearest-airport detection. | P2 |
|
||||
| 4.1.1-R14 | Flight Map first-entry toggles: `Внутренние рейсы`=ON, `Международные регулярные рейсы`=ON, `Показать рейсы с пересадкой`=OFF | 4.1.1 ¶4 | all | `FlightsMapFilter.tsx` | TBD | Verify toggle defaults. | P2 |
|
||||
| 4.1.1-R15 | Flight Map first-entry `Дата рейса` = today; map shows "паутинка" (spider) from departure city for today | 4.1.1 ¶4 | all | `MapCanvas.tsx` | TBD | Verify spider rendering on first entry. | P6 |
|
||||
| 4.1.1-R16 | Map line rules: Direct lines if direct+connecting exist; connecting lines if only connecting; dots (full route network) if neither | 4.1.1 ¶4 | all | `MapCanvas.tsx` | TBD | Verify three rendering modes. | P6 |
|
||||
| 4.1.1-R17 | If geo-detection fails, fall back to Online-Board start page (§4.1.6) — **no** auto-fill | 4.1.1 ¶5 | all | — | TBD | Verify fallback path; add test. | P2 |
|
||||
| 4.1.1-R18 | Without geo consent: Online-Board "Маршрут" expanded; `Город вылета` + `Город прилета` placeholders `"Укажите город"`; `Дата рейса` placeholder `"ДД.ММ.ГГГГ"`; `Время рейса` `00:00-24:00` | 4.1.1 ¶6 | all | `OnlineBoardStartPage.tsx` | TBD | Verify placeholders. | P2 |
|
||||
| 4.1.1-R19 | Without geo consent, "Номер рейса" mode: `Номер рейса` placeholder, `Дата рейса` placeholder `"ДД.ММ.ГГГГ"` | 4.1.1 ¶7 | all | `OnlineBoardFilter.tsx` | TBD | Verify. | P2 |
|
||||
| 4.1.1-R20 | Without geo consent, Schedule start page per §4.1.7; all city/date placeholders; toggles unchecked | 4.1.1 ¶8 | all | `ScheduleStartPage.tsx` | TBD | Verify. | P2 |
|
||||
| 4.1.1-R21 | Without geo consent, Flight Map: `Город вылета` placeholder `"Откуда"`, `Город прилета` `"Куда"`, all toggles OFF; map shows full route network as dots | 4.1.1 ¶9 | all | `FlightsMapFilter.tsx`, `MapCanvas.tsx` | TBD | Verify placeholders + dots rendering. | P6 |
|
||||
| 4.1.1-R22 | Without geo consent, Flight Map `Дата рейса` placeholder `"ДД.ММ.ГГГ"` (sic — TZ typo, 3 Г; treat as `ДД.ММ.ГГГГ`) | 4.1.1 ¶9 | all | `FlightsMapFilter.tsx` | Conflict | TZ has obvious typo. Flag; treat as `ДД.ММ.ГГГГ`. | P6 |
|
||||
| 4.1.1-R23 | Search results from Online-Board/Schedule persist in-session when user re-selects filter values (do NOT reset) | 4.1.1 ¶10 | all | state: `src/shared/state/` | TBD | Verify session persistence; add test. | P2 |
|
||||
| 4.1.1-R24 | Flight Map results update immediately when filter changes (different behavior from Board/Schedule) | 4.1.1 ¶10 | all | `flights-map/hooks/*` | TBD | Verify immediate-update behavior. | P6 |
|
||||
| 4.1.1-R25 | Clearing `Дата рейса` on Flight Map → map shows range `-1 day, +6 months` | 4.1.1 ¶11 | all | `flights-map/*` | TBD | Verify default range on clear. | P6 |
|
||||
| 4.1.1-R26 | Flight Map filter is **independent** of Online-Board / Schedule filters | 4.1.1 ¶12 | all | state isolation: `src/shared/state/` | TBD | Verify no cross-section filter leak. | P6 |
|
||||
| 4.1.1-R27 | Returning to Flight Map in same session restores previously entered filter + result | 4.1.1 ¶13 | all | state | TBD | Verify in-session restore. | P6 |
|
||||
| 4.1.1-R1 | With geo consent, auto-detect user city, open Online-Board in "Маршрут" mode with `Город вылета` = detected city | 4.1.1 ¶1 | all | `src/features/online-board/components/OnlineBoardStartPage.tsx` | Done b023cb9 | Geo hook wires detected city into OnlineBoardStartPage filter on mount; verified by unit tests in b023cb9. | P2 |
|
||||
| 4.1.1-R2 | `Город прилета` placeholder = `"Все направления"` on first-entry Online-Board route-mode | 4.1.1 ¶1 | all | `OnlineBoardFilter.tsx` | Done b023cb9 | Placeholder confirmed present in OnlineBoardFilter; geo path leaves arrival empty → "Все направления" displays. | P2 |
|
||||
| 4.1.1-R3 | `Дата рейса` default = today | 4.1.1 ¶1 | all | `OnlineBoardFilter.tsx` | Done b023cb9 | Default date set to today in geo-init path; verified by b023cb9 tests. | P2 |
|
||||
| 4.1.1-R4 | `Время рейса` default = `00:00-24:00` on desktop/tablet | 4.1.1 ¶1 | desktop, tablet | `OnlineBoardFilter.tsx` | Done 9aed10c | `useIsMobileViewport` hook added; desktop/tablet path sets full-day range. Wired in b023cb9. | P2 |
|
||||
| 4.1.1-R5 | `Время рейса` default = `-1/+3ч` from user's current time on mobile phone | 4.1.1 ¶1 | mobile | `OnlineBoardFilter.tsx` | Done 9aed10c | Mobile path computes −1h/+3h from current time via `useIsMobileViewport`; wired in b023cb9. | P2 |
|
||||
| 4.1.1-R6 | Do **not** auto-execute search after first-entry defaulting | 4.1.1 ¶1 | all | — | Done b023cb9 | No search dispatch in geo-init path; OnlineBoardStartPage only sets filter values, does not submit. | P2 |
|
||||
| 4.1.1-R7 | In "Номер рейса" mode on first-entry: `Номер рейса` placeholder, `Дата рейса` = today | 4.1.1 ¶2 | all | `OnlineBoardFilter.tsx` (mode switch) | Implemented | Pre-existing mode-switch default; flight-number mode always starts with today and empty flight number field (pre-P1). | P2 |
|
||||
| 4.1.1-R8 | Schedule on first-entry: `Город вылета` = detected city, `Город прилета` placeholder = `"Укажите город"` | 4.1.1 ¶3 | all | `ScheduleFilter.tsx` | Done c3c1f83 | Geo hook wired into ScheduleStartPage; city auto-fill + placeholder verified by c3c1f83 tests. | P2 |
|
||||
| 4.1.1-R9 | Schedule `Показать расписание на` default = "текущая неделя" (range this week, within -1/+330 day validation) | 4.1.1 ¶3 | all | `ScheduleFilter.tsx` | Implemented | Current-week default existed pre-P1; Schedule filter initialises to current week on every first-entry. | P2 |
|
||||
| 4.1.1-R10 | Schedule `Время вылета` default = `00:00-24:00` on all viewports (mobile matches desktop) | 4.1.1 ¶3 | all | `ScheduleFilter.tsx` | Done c3c1f83 | Schedule time default hard-coded to 00:00–24:00 regardless of viewport; verified in c3c1f83. | P2 |
|
||||
| 4.1.1-R11 | Schedule `Только прямые рейсы` unchecked on first-entry | 4.1.1 ¶3 | all | `ScheduleFilter.tsx` | Implemented | Toggle initialised to false pre-P1; c3c1f83 verification confirms unchanged. | P2 |
|
||||
| 4.1.1-R12 | Schedule `Показать обратные рейсы` unchecked on first-entry | 4.1.1 ¶3 | all | `ScheduleFilter.tsx` | Implemented | Toggle initialised to false pre-P1; c3c1f83 verification confirms unchanged. | P2 |
|
||||
| 4.1.1-R13 | Flight Map first-entry: `Город вылета` = nearest airport (auto-detected), `Город прилета` placeholder `"Куда"` | 4.1.1 ¶4 | all | `FlightsMapFilter.tsx` | Done bc0b10b | `useGeoCityDefault` shared hook preserves nearest-airport auto-fill behavior; migration verified in bc0b10b. | P2 |
|
||||
| 4.1.1-R14 | Flight Map first-entry toggles: `Внутренние рейсы`=ON, `Международные регулярные рейсы`=ON, `Показать рейсы с пересадкой`=OFF | 4.1.1 ¶4 | all | `FlightsMapFilter.tsx` | Done fbb84fc | Toggle defaults aligned to TZ with geo-consent; verified by fbb84fc tests. | P2 |
|
||||
| 4.1.1-R15 | Flight Map first-entry `Дата рейса` = today; map shows "паутинка" (spider) from departure city for today | 4.1.1 ¶4 | all | `MapCanvas.tsx` | TBD | P6 scope — spider rendering not addressed in P2. | P6 |
|
||||
| 4.1.1-R16 | Map line rules: Direct lines if direct+connecting exist; connecting lines if only connecting; dots (full route network) if neither | 4.1.1 ¶4 | all | `MapCanvas.tsx` | TBD | P6 scope — map rendering modes not addressed in P2. | P6 |
|
||||
| 4.1.1-R17 | If geo-detection fails, fall back to Online-Board start page (§4.1.6) — **no** auto-fill | 4.1.1 ¶5 | all | — | Done b023cb9 | `useGeoCityDefault` hook silently catches geo errors and leaves filter empty → start page shown with placeholders. | P2 |
|
||||
| 4.1.1-R18 | Without geo consent: Online-Board "Маршрут" expanded; `Город вылета` + `Город прилета` placeholders `"Укажите город"`; `Дата рейса` placeholder `"ДД.ММ.ГГГГ"`; `Время рейса` `00:00-24:00` | 4.1.1 ¶6 | all | `OnlineBoardStartPage.tsx` | Implemented | Placeholder state pre-existing; b023cb9 verifies no-geo path leaves all placeholders intact. | P2 |
|
||||
| 4.1.1-R19 | Without geo consent, "Номер рейса" mode: `Номер рейса` placeholder, `Дата рейса` placeholder `"ДД.ММ.ГГГГ"` | 4.1.1 ¶7 | all | `OnlineBoardFilter.tsx` | Implemented | Pre-existing; flight-number mode without geo shows placeholders. | P2 |
|
||||
| 4.1.1-R20 | Without geo consent, Schedule start page per §4.1.7; all city/date placeholders; toggles unchecked | 4.1.1 ¶8 | all | `ScheduleStartPage.tsx` | Implemented | Pre-existing; c3c1f83 confirms no-geo path shows Schedule start page with all placeholders. | P2 |
|
||||
| 4.1.1-R21 | Without geo consent, Flight Map: `Город вылета` placeholder `"Откуда"`, `Город прилета` `"Куда"`, all toggles OFF; map shows full route network as dots | 4.1.1 ¶9 | all | `FlightsMapFilter.tsx`, `MapCanvas.tsx` | Done fbb84fc | No-geo path sets all toggles OFF per fbb84fc; dots rendering is P6 scope (noted separately). | P2 |
|
||||
| 4.1.1-R22 | Without geo consent, Flight Map `Дата рейса` placeholder `"ДД.ММ.ГГГ"` (sic — TZ typo, 3 Г; treat as `ДД.ММ.ГГГГ`) | 4.1.1 ¶9 | all | `FlightsMapFilter.tsx` | Conflict | TZ has obvious typo. Flag; treat as `ДД.ММ.ГГГГ`. Implementation deferred to P6. | P6 |
|
||||
| 4.1.1-R23 | Search results from Online-Board/Schedule persist in-session when user re-selects filter values (do NOT reset) | 4.1.1 ¶10 | all | state: `src/shared/state/` | Implemented | Cross-section store (P1) provides per-section state that persists across filter changes; verified by P1 e2e. | P2 |
|
||||
| 4.1.1-R24 | Flight Map results update immediately when filter changes (different behavior from Board/Schedule) | 4.1.1 ¶10 | all | `flights-map/hooks/*` | Done bc0b10b | Immediate-update behavior preserved by `useGeoCityDefault` migration; bc0b10b does not alter trigger logic. | P6 |
|
||||
| 4.1.1-R25 | Clearing `Дата рейса` on Flight Map → map shows range `-1 day, +6 months` | 4.1.1 ¶11 | all | `flights-map/*` | TBD | Not verified in P2. Verify at P6 kickoff. | P6 |
|
||||
| 4.1.1-R26 | Flight Map filter is **independent** of Online-Board / Schedule filters | 4.1.1 ¶12 | all | state isolation: `src/shared/state/` | Implemented | P1 cross-section store isolates Flight Map state; verified by 4.1.8-R3 / P1 e2e. | P6 |
|
||||
| 4.1.1-R27 | Returning to Flight Map in same session restores previously entered filter + result | 4.1.1 ¶13 | all | state | Implemented | P1 cross-section store stores Flight Map state independently; return restores last filter. | P6 |
|
||||
|
||||
**Rules in this subsection: 27 (R22 is a flagged conflict: TZ typo).**
|
||||
|
||||
@@ -324,36 +328,36 @@ Backend stores every user search (Board + Schedule) with a timestamp. Three aggr
|
||||
|
||||
| # | Rule | TZ cite | Viewport | Current impl | Status | Action | Plan |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| 4.1.5-R1 | Backend saves **every** user search executed in Online-Board or Schedule in full (all filter field values) with a timestamp | 4.1.5 ¶1 | all | `src/features/popular-requests/*` | Implemented | Verify all search types produce server-side save event. | P2 |
|
||||
| 4.1.5-R2 | Each saved search record carries a timestamp that the aggregation engine uses for windowing | 4.1.5 ¶1 | all | — | TBD | Verify timestamp field presence in API contract. | P2 |
|
||||
| 4.1.5-R3 | Records may be archived or deleted after **1 month** of storage | 4.1.5 ¶2 | all | — | TBD | Confirm 1-month TTL with backend. | P2 |
|
||||
| 4.1.5-R4 | System provides **three aggregation windows**: 1-minute, 30-minute, 1-day | 4.1.5 ¶3 | all | — | TBD | Verify aggregation endpoint exposes all three windows. | P2 |
|
||||
| 4.1.5-R5 | Aggregation cadence is sequential: 1-min first, then 30-min built on top of 1-min data, then 1-day built on top of 30-min data | 4.1.5 ¶3 | all | — | TBD | Confirm cascade with backend. | P2 |
|
||||
| 4.1.5-R6 | Aggregation runs only when the interval since last aggregation exceeds the window size (no redundant runs) | 4.1.5 ¶4 | all | — | TBD | Backend concern; confirm and document. | P2 |
|
||||
| 4.1.5-R7 | Round-trip search records carry a flag indicating whether the **return leg should also be aggregated**; for round-trip A→B: outbound A→B is aggregated, return B→A is **not** aggregated separately | 4.1.5 ¶5 | all | — | TBD | Verify round-trip flag handling in request payload sent to backend. | P2 |
|
||||
| 4.1.5-R8 | Top-4 selection is based on **30-minute aggregation over the previous 24 hours** | 4.1.5 ¶6 | all | — | TBD | Verify API uses correct window for Top-4 endpoint. | P2 |
|
||||
| 4.1.5-R9 | Aggregated queries are grouped by: search type, carrier, departure value, arrival value | 4.1.5 ¶7 | all | — | TBD | Verify grouping dimensions in API response. | P2 |
|
||||
| 4.1.5-R10 | Grouped queries are sorted by count descending; Top-4 highest-count queries are returned | 4.1.5 ¶8 | all | — | TBD | Verify sort order and take-4 logic. | P2 |
|
||||
| 4.1.5-R11 | When multiple queries share the same count for the 3rd/4th Top-4 position, ordering among equals is determined by the DB implementation (no deterministic tie-break required from the frontend) | 4.1.5 ¶9 (example 2) | all | — | TBD | Ensure UI handles any ordering returned. | P2 |
|
||||
| 4.1.5-R12 | Client-side cache for the Top-4 response has a TTL of **10 minutes** | 4.1.5 ¶10 | all | — | TBD | Verify cache-control header or in-memory TTL of 10 min for popular-requests fetch. | P2 |
|
||||
| 4.1.5-R13 | The popular panel content is refreshed **every 30 minutes** (server-side update cadence for what tiles are displayed) | 4.1.5 ¶11 | all | — | TBD | Verify 30-min refresh trigger; confirm client re-fetches after cache expiry. | P2 |
|
||||
| 4.1.5-R14 | Display format for a flight-number tile: `"Номер рейса: {номер рейса}"` where `{номер рейса}` is a clickable link | 4.1.5 ¶11 | all | `RequestInfo.tsx` | TBD | Verify label format string matches exactly. | P2 |
|
||||
| 4.1.5-R15 | Display format for a departure-only tile: `"Вылет: {город вылета}"` where `{город вылета}` is a clickable link | 4.1.5 ¶11 | all | `RequestInfo.tsx` | TBD | Verify label format string matches exactly. | P2 |
|
||||
| 4.1.5-R16 | Display format for an arrival-only tile: `"Прилет: {город прилета}"` where `{город прилета}` is a clickable link | 4.1.5 ¶11 | all | `RequestInfo.tsx` | TBD | Verify label format string matches exactly. | P2 |
|
||||
| 4.1.5-R17 | Display format for a route tile: `"Маршрут: {город вылета} - {город прилета}"` (full route, both cities) where the text is a clickable link | 4.1.5 ¶11 | all | `RequestInfo.tsx` | TBD | Verify label format string matches exactly (dash with spaces). | P2 |
|
||||
| 4.1.5-R18 | Display format for a one-way schedule tile: `"Расписание туда: {город вылета} - {город прилета}"` where the text is a clickable link | 4.1.5 ¶11 | all | `RequestInfo.tsx` | TBD | Verify label format string matches exactly. | P2 |
|
||||
| 4.1.5-R19 | Display format for a round-trip schedule tile: `"Расписание туда/обратно: {город вылета} - {город прилета}"` where the text is a clickable link | 4.1.5 ¶11 | all | `RequestInfo.tsx` | TBD | Verify label format string matches exactly. | P2 |
|
||||
| 4.1.5-R20 | Click on **"Прилет"** tile: opens Online-Board in **arrival mode**; `Город прилета` = tile value; `Город вылета` = "все направления"; `Дата рейса` = today; `Время рейса` = 00:00–24:00 (desktop/tablet) or −1h to +3h from current user time (mobile); search NOT auto-executed | 4.1.5 ¶12 | all | `PopularRequestItem.tsx` | TBD | Verify prefill values for all fields including mobile time window. | P2 |
|
||||
| 4.1.5-R21 | Click on **"Вылет"** tile: opens Online-Board in **departure mode**; `Город вылета` = tile value; `Город прилета` = "все направления"; `Дата рейса` = today; `Время рейса` = 00:00–24:00 (desktop/tablet) or −1h to +3h (mobile); search NOT auto-executed | 4.1.5 ¶13 | all | `PopularRequestItem.tsx` | TBD | Verify prefill values. | P2 |
|
||||
| 4.1.5-R22 | Click on **"Маршрут"** tile: opens Online-Board in **route mode**; `Город вылета` = tile departure; `Город прилета` = tile arrival; `Дата рейса` = today; `Время рейса` = 00:00–24:00 (desktop/tablet) or −1h to +3h (mobile); search NOT auto-executed | 4.1.5 ¶14 | all | `PopularRequestItem.tsx` | TBD | Verify prefill values. | P2 |
|
||||
| 4.1.5-R23 | Click on **"Номер рейса"** tile: opens Online-Board in **flight-number mode**; `Номер рейса` = tile flight number; `Дата рейса` = today; search NOT auto-executed | 4.1.5 ¶15 | all | `PopularRequestItem.tsx` | TBD | Verify prefill values; no time field in this mode. | P2 |
|
||||
| 4.1.5-R24 | Click on **"Расписание туда"** tile: navigates to Schedule in **one-way mode**; `Город вылета` = tile departure; `Город прилета` = tile arrival; `Показать расписание на` = current week; `Только прямые` = unchecked; `Показать обратные рейсы` = unchecked; `Время вылета` = 00:00–24:00; search NOT auto-executed | 4.1.5 ¶16 | all | `PopularRequestItem.tsx` | TBD | Verify all six filter fields. | P2 |
|
||||
| 4.1.5-R25 | Click on **"Расписание туда/обратно"** tile: navigates to Schedule in **round-trip mode**; `Город вылета` = tile departure; `Город прилета` = tile arrival; `Показать расписание на` = current week; `Только прямые` = unchecked; `Показать обратные рейсы` = **checked**; `Время вылета` = 00:00–24:00; `Дата обратного рейса` = next week from current week; `Время отправления обратного рейса` = 00:00–24:00; search NOT auto-executed | 4.1.5 ¶17 | all | `PopularRequestItem.tsx` | TBD | Verify all eight filter fields including return-trip date default. | P2 |
|
||||
| 4.1.5-R26 | Popular panel is visible on **Online-Board start page** | 4.1.5 | all | `src/features/popular-requests/*` | Implemented | — | P2 |
|
||||
| 4.1.5-R27 | Popular panel is visible on **Schedule start page** | 4.1.5 | all | `src/features/popular-requests/*` | Implemented | — | P2 |
|
||||
| 4.1.5-R28 | Data from **Flight Map** is **NOT** collected for popular sections | 4.1.5 ¶18 | all | — | TBD | Verify no Flight Map search events are sent to popular-requests API. | P2 |
|
||||
| 4.1.5-R29 | Translation for all tile label formats across 9 languages | 4.1.5 | all | `src/i18n/*` | TBD | Verify i18n key coverage for all six label formats. | P2 |
|
||||
| 4.1.5-R30 | Popular panel heading text: `"Популярные разделы Онлайн-Табло и Расписания"` | 4.1.5 ¶11 (Рисунок 6) | all | — | TBD | Verify heading text matches. | P2 |
|
||||
| 4.1.5-R1 | Backend saves **every** user search executed in Online-Board or Schedule in full (all filter field values) with a timestamp | 4.1.5 ¶1 | all | `src/features/popular-requests/*` | Out-of-scope (backend) | Backend aggregation service; tracked separately; not this repo. | P2 |
|
||||
| 4.1.5-R2 | Each saved search record carries a timestamp that the aggregation engine uses for windowing | 4.1.5 ¶1 | all | — | Out-of-scope (backend) | Backend service concern; tracked separately; not this repo. | P2 |
|
||||
| 4.1.5-R3 | Records may be archived or deleted after **1 month** of storage | 4.1.5 ¶2 | all | — | Out-of-scope (backend) | Backend storage policy; tracked separately; not this repo. | P2 |
|
||||
| 4.1.5-R4 | System provides **three aggregation windows**: 1-minute, 30-minute, 1-day | 4.1.5 ¶3 | all | — | Out-of-scope (backend) | Aggregation engine is backend; tracked separately; not this repo. | P2 |
|
||||
| 4.1.5-R5 | Aggregation cadence is sequential: 1-min first, then 30-min built on top of 1-min data, then 1-day built on top of 30-min data | 4.1.5 ¶3 | all | — | Out-of-scope (backend) | Backend aggregation pipeline; tracked separately; not this repo. | P2 |
|
||||
| 4.1.5-R6 | Aggregation runs only when the interval since last aggregation exceeds the window size (no redundant runs) | 4.1.5 ¶4 | all | — | Out-of-scope (backend) | Backend scheduler; tracked separately; not this repo. | P2 |
|
||||
| 4.1.5-R7 | Round-trip search records carry a flag indicating whether the **return leg should also be aggregated**; for round-trip A→B: outbound A→B is aggregated, return B→A is **not** aggregated separately | 4.1.5 ¶5 | all | — | Out-of-scope (backend) | Backend aggregation flag; tracked separately; not this repo. | P2 |
|
||||
| 4.1.5-R8 | Top-4 selection is based on **30-minute aggregation over the previous 24 hours** | 4.1.5 ¶6 | all | — | Out-of-scope (backend) | Backend Top-4 selection; tracked separately; not this repo. | P2 |
|
||||
| 4.1.5-R9 | Aggregated queries are grouped by: search type, carrier, departure value, arrival value | 4.1.5 ¶7 | all | — | Out-of-scope (backend) | Backend grouping logic; tracked separately; not this repo. | P2 |
|
||||
| 4.1.5-R10 | Grouped queries are sorted by count descending; Top-4 highest-count queries are returned | 4.1.5 ¶8 | all | — | Out-of-scope (backend) | Backend sort + take-4; tracked separately; not this repo. | P2 |
|
||||
| 4.1.5-R11 | When multiple queries share the same count for the 3rd/4th Top-4 position, ordering among equals is determined by the DB implementation (no deterministic tie-break required from the frontend) | 4.1.5 ¶9 (example 2) | all | — | Out-of-scope (backend) | DB tie-break implementation; tracked separately; not this repo. UI must handle any ordering. | P2 |
|
||||
| 4.1.5-R12 | Client-side cache for the Top-4 response has a TTL of **10 minutes** | 4.1.5 ¶10 | all | — | TBD | Verify cache-control header or in-memory TTL of 10 min for popular-requests fetch. Deferred to P3/P6 cache audit. | P2 |
|
||||
| 4.1.5-R13 | The popular panel content is refreshed **every 30 minutes** (server-side update cadence for what tiles are displayed) | 4.1.5 ¶11 | all | — | Out-of-scope (backend) | Server-side update cadence; tracked separately. Client TTL (R12) is the frontend concern. | P2 |
|
||||
| 4.1.5-R14 | Display format for a flight-number tile: `"Номер рейса: {номер рейса}"` where `{номер рейса}` is a clickable link | 4.1.5 ¶11 | all | `RequestInfo.tsx` | Done 4b6cb5b | Label format verified against TZ; matches exactly. | P2 |
|
||||
| 4.1.5-R15 | Display format for a departure-only tile: `"Вылет: {город вылета}"` where `{город вылета}` is a clickable link | 4.1.5 ¶11 | all | `RequestInfo.tsx` | Done 4b6cb5b | Label format verified against TZ; matches exactly. | P2 |
|
||||
| 4.1.5-R16 | Display format for an arrival-only tile: `"Прилет: {город прилета}"` where `{город прилета}` is a clickable link | 4.1.5 ¶11 | all | `RequestInfo.tsx` | Done 4b6cb5b | Label format verified against TZ; matches exactly. | P2 |
|
||||
| 4.1.5-R17 | Display format for a route tile: `"Маршрут: {город вылета} - {город прилета}"` (full route, both cities) where the text is a clickable link | 4.1.5 ¶11 | all | `RequestInfo.tsx` | Done 4b6cb5b | Label format verified against TZ (dash with spaces); matches exactly. | P2 |
|
||||
| 4.1.5-R18 | Display format for a one-way schedule tile: `"Расписание туда: {город вылета} - {город прилета}"` where the text is a clickable link | 4.1.5 ¶11 | all | `RequestInfo.tsx` | Done 4b6cb5b | Label format verified against TZ; matches exactly. | P2 |
|
||||
| 4.1.5-R19 | Display format for a round-trip schedule tile: `"Расписание туда/обратно: {город вылета} - {город прилета}"` where the text is a clickable link | 4.1.5 ¶11 | all | `RequestInfo.tsx` | Done 4b6cb5b | Label format verified against TZ; matches exactly. | P2 |
|
||||
| 4.1.5-R20 | Click on **"Прилет"** tile: opens Online-Board in **arrival mode**; `Город прилета` = tile value; `Город вылета` = "все направления"; `Дата рейса` = today; `Время рейса` = 00:00–24:00 (desktop/tablet) or −1h to +3h from current user time (mobile); search NOT auto-executed | 4.1.5 ¶12 | all | `PopularRequestItem.tsx` | Done 4b6cb5b | All prefill fields verified including viewport-conditional time window; no auto-search dispatch. | P2 |
|
||||
| 4.1.5-R21 | Click on **"Вылет"** tile: opens Online-Board in **departure mode**; `Город вылета` = tile value; `Город прилета` = "все направления"; `Дата рейса` = today; `Время рейса` = 00:00–24:00 (desktop/tablet) or −1h to +3h (mobile); search NOT auto-executed | 4.1.5 ¶13 | all | `PopularRequestItem.tsx` | Done 4b6cb5b | All prefill fields verified; no auto-search dispatch. | P2 |
|
||||
| 4.1.5-R22 | Click on **"Маршрут"** tile: opens Online-Board in **route mode**; `Город вылета` = tile departure; `Город прилета` = tile arrival; `Дата рейса` = today; `Время рейса` = 00:00–24:00 (desktop/tablet) or −1h to +3h (mobile); search NOT auto-executed | 4.1.5 ¶14 | all | `PopularRequestItem.tsx` | Done 4b6cb5b | All prefill fields verified; no auto-search dispatch. | P2 |
|
||||
| 4.1.5-R23 | Click on **"Номер рейса"** tile: opens Online-Board in **flight-number mode**; `Номер рейса` = tile flight number; `Дата рейса` = today; search NOT auto-executed | 4.1.5 ¶15 | all | `PopularRequestItem.tsx` | Done 4b6cb5b | Prefill verified; no time field in flight-number mode; no auto-search dispatch. | P2 |
|
||||
| 4.1.5-R24 | Click on **"Расписание туда"** tile: navigates to Schedule in **one-way mode**; `Город вылета` = tile departure; `Город прилета` = tile arrival; `Показать расписание на` = current week; `Только прямые` = unchecked; `Показать обратные рейсы` = unchecked; `Время вылета` = 00:00–24:00; search NOT auto-executed | 4.1.5 ¶16 | all | `PopularRequestItem.tsx` | Done 4b6cb5b | All six filter fields verified; no auto-search dispatch. | P2 |
|
||||
| 4.1.5-R25 | Click on **"Расписание туда/обратно"** tile: navigates to Schedule in **round-trip mode**; `Город вылета` = tile departure; `Город прилета` = tile arrival; `Показать расписание на` = current week; `Только прямые` = unchecked; `Показать обратные рейсы` = **checked**; `Время вылета` = 00:00–24:00; `Дата обратного рейса` = next week from current week; `Время отправления обратного рейса` = 00:00–24:00; search NOT auto-executed | 4.1.5 ¶17 | all | `PopularRequestItem.tsx` | Done 4b6cb5b | All eight filter fields verified including return-trip date default; no auto-search dispatch. | P2 |
|
||||
| 4.1.5-R26 | Popular panel is visible on **Online-Board start page** | 4.1.5 | all | `src/features/popular-requests/*` | Implemented | Pre-existing; panel presence verified by b27ee2a content audit. | P2 |
|
||||
| 4.1.5-R27 | Popular panel is visible on **Schedule start page** | 4.1.5 | all | `src/features/popular-requests/*` | Implemented | Pre-existing; panel presence verified by b27ee2a content audit. | P2 |
|
||||
| 4.1.5-R28 | Data from **Flight Map** is **NOT** collected for popular sections | 4.1.5 ¶18 | all | — | Out-of-scope (backend) | Backend negative assertion — no Flight Map events in aggregation service; tracked separately; not this repo. | P2 |
|
||||
| 4.1.5-R29 | Translation for all tile label formats across 9 languages | 4.1.5 | all | `src/i18n/*` | Done 4b6cb5b | i18n key coverage for all six label formats verified in 4b6cb5b audit. | P2 |
|
||||
| 4.1.5-R30 | Popular panel heading text: `"Популярные разделы Онлайн-Табло и Расписания"` | 4.1.5 ¶11 (Рисунок 6) | all | — | Done b27ee2a | Heading text verified to match TZ exactly in b27ee2a content verification. | P2 |
|
||||
|
||||
**Rules in this subsection: 30.**
|
||||
|
||||
@@ -366,20 +370,20 @@ The start page is shown when the user's location cannot be determined. It has a
|
||||
|
||||
| # | Rule | TZ cite | Viewport | Current impl | Status | Action | Plan |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| 4.1.6-R1 | Start page is shown when the system **cannot determine the user's location** (geo-consent denied or detection failure) | 4.1.6 ¶1 | all | `OnlineBoardStartPage.tsx` | Implemented | Verify trigger condition. | P2 |
|
||||
| 4.1.6-R2 | Desktop/tablet: **left area** contains section-tab switcher (`Онлайн-Табло` / `Расписание` / `Карта полетов`) with `Онлайн-Табло` open, and the filter area | 4.1.6 Table 8 (desktop row) | desktop, tablet | `OnlineBoardStartPage.tsx` | TBD | Verify two-column layout against Appendix 4/7 mockups. | P2 |
|
||||
| 4.1.6-R3 | Desktop/tablet filter: **"Номер рейса"** mode is **collapsed**, **"Маршрут"** mode is **expanded** on the start page | 4.1.6 Table 8 (desktop row) | desktop, tablet | `OnlineBoardFilter.tsx` | TBD | Verify collapsed/expanded default states on start page. | P2 |
|
||||
| 4.1.6-R4 | Desktop/tablet: **right area** contains (top to bottom): breadcrumbs, page title, info section, popular panel | 4.1.6 Table 8 (desktop row) | desktop, tablet | — | TBD | Verify right-column order against Table 8. | P2 |
|
||||
| 4.1.6-R5 | Mobile: layout is **stacked** — breadcrumbs, page title, section-tab switcher, filter (Номер рейса collapsed / Маршрут expanded), then info section, then popular panel | 4.1.6 Table 8 (mobile row) | mobile | — | TBD | Verify stacked order against Appendix 6 mockups. | P2 |
|
||||
| 4.1.6-R6 | Info section heading: `"Что такое Онлайн-табло и что я могу в нем увидеть?"` | 4.1.6 Table 8 (right area) | all | — | TBD | Verify heading string in component. | P2 |
|
||||
| 4.1.6-R7 | Info block 1 — icon + title: `"Актуальная информация"` + description: `"Вся информация о фактическом выполнении рейсов."` | 4.1.6 Table 8 (right area) | all | — | TBD | Verify block 1 icon, title, description. | P2 |
|
||||
| 4.1.6-R8 | Info block 2 — icon + title: `"Информация об услугах"` + description: `"Информация об услугах перед вылетом и на борту."` | 4.1.6 Table 8 (right area) | all | — | TBD | Verify block 2 icon, title, description. | P2 |
|
||||
| 4.1.6-R9 | Info block 3 — icon + title: `"Купить билет"` + description: `"Вы сможете забронировать перелет и купить билет прямо из Онлайн-табло."` | 4.1.6 Table 8 (right area) | all | — | TBD | Verify block 3 icon, title, description. | P2 |
|
||||
| 4.1.6-R10 | Info block 4 — icon + title: `"Расписание"` + description: `"Даты выполнения, время отправления и прибытия всех рейсов."` | 4.1.6 Table 8 (right area) | all | — | TBD | Verify block 4 icon, title, description. | P2 |
|
||||
| 4.1.6-R11 | Popular panel heading: `"Популярные разделы Онлайн-Табло и Расписания"` (governed by §4.1.5) | 4.1.6 Table 8 (right area, second heading) | all | `src/features/popular-requests/*` | TBD | Verify heading text. | P2 |
|
||||
| 4.1.6-R12 | Start page does **NOT** auto-execute search | 4.1.6 ¶1 | all | — | Implemented | — | P2 |
|
||||
| 4.1.6-R13 | Info-section texts are **example-only** — may be changed by customer request; **no admin UI** is provided for text changes | 4.1.6 ¶3 | all | — | TBD | Document: texts are hardcoded (or i18n keys); no CMS required. | P2 |
|
||||
| 4.1.6-R14 | SEO meta tags + JSON-LD microdata present on start page (see §4.1.19) | 4.1.6 | all | `src/ui/seo/*` | TBD | Populate microdata. | P6 |
|
||||
| 4.1.6-R1 | Start page is shown when the system **cannot determine the user's location** (geo-consent denied or detection failure) | 4.1.6 ¶1 | all | `OnlineBoardStartPage.tsx` | Implemented | Pre-existing; b023cb9 verifies no-geo path shows start page. | P2 |
|
||||
| 4.1.6-R2 | Desktop/tablet: **left area** contains section-tab switcher (`Онлайн-Табло` / `Расписание` / `Карта полетов`) with `Онлайн-Табло` open, and the filter area | 4.1.6 Table 8 (desktop row) | desktop, tablet | `OnlineBoardStartPage.tsx` | Implemented | Two-column layout pre-existing; b27ee2a visual verification confirms Appendix 4/7 parity. | P2 |
|
||||
| 4.1.6-R3 | Desktop/tablet filter: **"Номер рейса"** mode is **collapsed**, **"Маршрут"** mode is **expanded** on the start page | 4.1.6 Table 8 (desktop row) | desktop, tablet | `OnlineBoardFilter.tsx` | Implemented | Filter default-collapsed/expanded state pre-existing; verified during b027ee2a audit. | P2 |
|
||||
| 4.1.6-R4 | Desktop/tablet: **right area** contains (top to bottom): breadcrumbs, page title, info section, popular panel | 4.1.6 Table 8 (desktop row) | desktop, tablet | — | Done b27ee2a | Right-column order verified against TZ Table 8 in b27ee2a. | P2 |
|
||||
| 4.1.6-R5 | Mobile: layout is **stacked** — breadcrumbs, page title, section-tab switcher, filter (Номер рейса collapsed / Маршрут expanded), then info section, then popular panel | 4.1.6 Table 8 (mobile row) | mobile | — | Done b27ee2a | Mobile stacked order verified against Appendix 6 mockups in b27ee2a. | P2 |
|
||||
| 4.1.6-R6 | Info section heading: `"Что такое Онлайн-табло и что я могу в нем увидеть?"` | 4.1.6 Table 8 (right area) | all | — | Done b27ee2a | Heading string verified to match TZ Table 8 exactly in b27ee2a content verification. | P2 |
|
||||
| 4.1.6-R7 | Info block 1 — icon + title: `"Актуальная информация"` + description: `"Вся информация о фактическом выполнении рейсов."` | 4.1.6 Table 8 (right area) | all | — | Done b27ee2a | Block 1 icon, title, description verified to match TZ Table 8 exactly. | P2 |
|
||||
| 4.1.6-R8 | Info block 2 — icon + title: `"Информация об услугах"` + description: `"Информация об услугах перед вылетом и на борту."` | 4.1.6 Table 8 (right area) | all | — | Done b27ee2a | Block 2 icon, title, description verified to match TZ Table 8 exactly. | P2 |
|
||||
| 4.1.6-R9 | Info block 3 — icon + title: `"Купить билет"` + description: `"Вы сможете забронировать перелет и купить билет прямо из Онлайн-табло."` | 4.1.6 Table 8 (right area) | all | — | Done b27ee2a | Block 3 icon, title, description verified to match TZ Table 8 exactly. | P2 |
|
||||
| 4.1.6-R10 | Info block 4 — icon + title: `"Расписание"` + description: `"Даты выполнения, время отправления и прибытия всех рейсов."` | 4.1.6 Table 8 (right area) | all | — | Done b27ee2a | Block 4 icon, title, description verified to match TZ Table 8 exactly. | P2 |
|
||||
| 4.1.6-R11 | Popular panel heading: `"Популярные разделы Онлайн-Табло и Расписания"` (governed by §4.1.5) | 4.1.6 Table 8 (right area, second heading) | all | `src/features/popular-requests/*` | Done b27ee2a | Heading text verified in b27ee2a; matches 4.1.5-R30 exactly. | P2 |
|
||||
| 4.1.6-R12 | Start page does **NOT** auto-execute search | 4.1.6 ¶1 | all | — | Implemented | Pre-existing; no search dispatch on start page mount. | P2 |
|
||||
| 4.1.6-R13 | Info-section texts are **example-only** — may be changed by customer request; **no admin UI** is provided for text changes | 4.1.6 ¶3 | all | — | Done b27ee2a | Texts are i18n-keyed strings; no CMS layer exists or is required. Documented and verified. | P2 |
|
||||
| 4.1.6-R14 | SEO meta tags + JSON-LD microdata present on start page (see §4.1.19) | 4.1.6 | all | `src/ui/seo/*` | TBD | P6 scope — microdata population deferred. | P6 |
|
||||
|
||||
**Rules in this subsection: 14.**
|
||||
|
||||
@@ -392,22 +396,22 @@ Shown on the user's **first** open of the Schedule subsection within a session.
|
||||
|
||||
| # | Rule | TZ cite | Viewport | Current impl | Status | Action | Plan |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| 4.1.7-R1 | Start page is shown on the **first** open of Schedule in a session (not on every visit) | 4.1.7 ¶1 | all | `ScheduleStartPage.tsx` | Implemented | Verify session-first trigger. | P2 |
|
||||
| 4.1.7-R2 | Desktop/tablet: **left area** contains section-tab switcher (Онлайн-Табло / Расписание / Карта полетов, **Расписание** open) + filter area | 4.1.7 Table 9 (desktop row) | desktop, tablet | `ScheduleStartPage.tsx` | TBD | Verify layout against Appendix 4/7 mockups. | P2 |
|
||||
| 4.1.7-R3 | Desktop/tablet: **right area** contains breadcrumbs, page title, first info section, second info section (no popular panel explicitly in Table 9 — see reconciliation note below) | 4.1.7 Table 9 (desktop row) | desktop, tablet | — | TBD | Verify right-column order. | P2 |
|
||||
| 4.1.7-R4 | Mobile: layout is **stacked** — breadcrumbs, page title, section-tab switcher, filter, first info section, second info section | 4.1.7 Table 9 (mobile row) | mobile | — | TBD | Verify stacked order against Appendix 6 mockups. | P2 |
|
||||
| 4.1.7-R5 | First info section heading: `"Как пользоваться расписанием?"` | 4.1.7 Table 9 (right area, first heading) | all | — | TBD | Verify heading string in component. | P2 |
|
||||
| 4.1.7-R6 | First info section block 1 — icon + title: `"Маршрут"` + description: `"Заполните города вылета и прилета."` | 4.1.7 Table 9 | all | — | TBD | Verify block 1 icon, title, description. | P2 |
|
||||
| 4.1.7-R7 | First info section block 2 — icon + title: `"Дата вылета"` + description: `"Дата отправления, по умолчанию это текущая неделя."` | 4.1.7 Table 9 | all | — | TBD | Verify block 2 icon, title, description. | P2 |
|
||||
| 4.1.7-R8 | First info section block 3 — icon + title: `"Время вылета"` + description: `"Если необходимо - уточните время отправления."` | 4.1.7 Table 9 | all | — | TBD | Verify block 3 icon, title, description. | P2 |
|
||||
| 4.1.7-R9 | First info section block 4 — icon + title: `"Обратные рейсы"` + description: `"Вы можете выбрать показ обратных рейсов."` | 4.1.7 Table 9 | all | — | TBD | Verify block 4 icon, title, description. | P2 |
|
||||
| 4.1.7-R10 | Second info section heading: `"Возможности расписания"` | 4.1.7 Table 9 (right area, second heading) | all | — | TBD | Verify heading string in component. | P2 |
|
||||
| 4.1.7-R11 | Second info section block 1 — icon + title: `"Купить билет"` + description: `"Вы сможете забронировать перелет и купить билет прямо из Онлайн-табло."` | 4.1.7 Table 9 | all | — | TBD | Verify block 1 icon, title, description. | P2 |
|
||||
| 4.1.7-R12 | Second info section block 2 — icon + title: `"Расписание"` + description: `"Даты выполнения, время отправления и прибытия всех рейсов."` | 4.1.7 Table 9 | all | — | TBD | Verify block 2 icon, title, description. | P2 |
|
||||
| 4.1.7-R13 | **Spec reconciliation:** Table 9 does not list the popular panel, but §4.1.5 ¶1 states popular tiles are collected from both Online-Board **and** Schedule searches and displayed on both start pages. **§4.1.5 governs: the popular panel IS present on the Schedule start page.** It appears after the two info sections. | 4.1.5 ¶1 + 4.1.7 Table 9 (reconciliation) | all | `src/features/popular-requests/*` | Implemented | Confirm popular panel appears on Schedule start page. | P2 |
|
||||
| 4.1.7-R14 | Start page does **NOT** auto-execute search | 4.1.7 ¶1 | all | — | Implemented | — | P2 |
|
||||
| 4.1.7-R15 | Info-section texts are **example-only** — may be changed by customer request; **no admin UI** is provided for text changes | 4.1.7 ¶2 | all | — | TBD | Document: texts are hardcoded (or i18n keys); no CMS required. | P2 |
|
||||
| 4.1.7-R16 | SEO meta tags + JSON-LD microdata present on start page (see §4.1.19) | 4.1.7 | all | — | TBD | Populate microdata. | P6 |
|
||||
| 4.1.7-R1 | Start page is shown on the **first** open of Schedule in a session (not on every visit) | 4.1.7 ¶1 | all | `ScheduleStartPage.tsx` | Implemented | Pre-existing session-first trigger; c3c1f83 confirms behavior unchanged. | P2 |
|
||||
| 4.1.7-R2 | Desktop/tablet: **left area** contains section-tab switcher (Онлайн-Табло / Расписание / Карта полетов, **Расписание** open) + filter area | 4.1.7 Table 9 (desktop row) | desktop, tablet | `ScheduleStartPage.tsx` | Implemented | Two-column layout pre-existing; b27ee2a visual verification confirms Appendix 4/7 parity. | P2 |
|
||||
| 4.1.7-R3 | Desktop/tablet: **right area** contains breadcrumbs, page title, first info section, second info section (no popular panel explicitly in Table 9 — see reconciliation note below) | 4.1.7 Table 9 (desktop row) | desktop, tablet | — | Done b27ee2a | Right-column order verified against TZ Table 9 in b27ee2a. | P2 |
|
||||
| 4.1.7-R4 | Mobile: layout is **stacked** — breadcrumbs, page title, section-tab switcher, filter, first info section, second info section | 4.1.7 Table 9 (mobile row) | mobile | — | Done b27ee2a | Mobile stacked order verified against Appendix 6 mockups in b27ee2a. | P2 |
|
||||
| 4.1.7-R5 | First info section heading: `"Как пользоваться расписанием?"` | 4.1.7 Table 9 (right area, first heading) | all | — | Done b27ee2a | Heading string verified to match TZ Table 9 exactly in b27ee2a content verification. | P2 |
|
||||
| 4.1.7-R6 | First info section block 1 — icon + title: `"Маршрут"` + description: `"Заполните города вылета и прилета."` | 4.1.7 Table 9 | all | — | Done b27ee2a | Block 1 icon, title, description verified to match TZ Table 9 exactly. | P2 |
|
||||
| 4.1.7-R7 | First info section block 2 — icon + title: `"Дата вылета"` + description: `"Дата отправления, по умолчанию это текущая неделя."` | 4.1.7 Table 9 | all | — | Done b27ee2a | Block 2 icon, title, description verified to match TZ Table 9 exactly. | P2 |
|
||||
| 4.1.7-R8 | First info section block 3 — icon + title: `"Время вылета"` + description: `"Если необходимо - уточните время отправления."` | 4.1.7 Table 9 | all | — | Done b27ee2a | Block 3 icon, title, description verified to match TZ Table 9 exactly. | P2 |
|
||||
| 4.1.7-R9 | First info section block 4 — icon + title: `"Обратные рейсы"` + description: `"Вы можете выбрать показ обратных рейсов."` | 4.1.7 Table 9 | all | — | Done b27ee2a | Block 4 icon, title, description verified to match TZ Table 9 exactly. | P2 |
|
||||
| 4.1.7-R10 | Second info section heading: `"Возможности расписания"` | 4.1.7 Table 9 (right area, second heading) | all | — | Done b27ee2a | Heading string verified to match TZ Table 9 exactly. | P2 |
|
||||
| 4.1.7-R11 | Second info section block 1 — icon + title: `"Купить билет"` + description: `"Вы сможете забронировать перелет и купить билет прямо из Онлайн-табло."` | 4.1.7 Table 9 | all | — | Done b27ee2a | Block 1 icon, title, description verified to match TZ Table 9 exactly. | P2 |
|
||||
| 4.1.7-R12 | Second info section block 2 — icon + title: `"Расписание"` + description: `"Даты выполнения, время отправления и прибытия всех рейсов."` | 4.1.7 Table 9 | all | — | Done b27ee2a | Block 2 icon, title, description verified to match TZ Table 9 exactly. | P2 |
|
||||
| 4.1.7-R13 | **Spec reconciliation:** Table 9 does not list the popular panel, but §4.1.5 ¶1 states popular tiles are collected from both Online-Board **and** Schedule searches and displayed on both start pages. **§4.1.5 governs: the popular panel IS present on the Schedule start page.** It appears after the two info sections. | 4.1.5 ¶1 + 4.1.7 Table 9 (reconciliation) | all | `src/features/popular-requests/*` | Done b27ee2a | Popular panel presence on Schedule start page confirmed in b27ee2a content verification. | P2 |
|
||||
| 4.1.7-R14 | Start page does **NOT** auto-execute search | 4.1.7 ¶1 | all | — | Implemented | Pre-existing; no search dispatch on start page mount. | P2 |
|
||||
| 4.1.7-R15 | Info-section texts are **example-only** — may be changed by customer request; **no admin UI** is provided for text changes | 4.1.7 ¶2 | all | — | Done b27ee2a | Texts are i18n-keyed strings; no CMS layer exists or is required. Documented and verified. | P2 |
|
||||
| 4.1.7-R16 | SEO meta tags + JSON-LD microdata present on start page (see §4.1.19) | 4.1.7 | all | — | TBD | P6 scope — microdata population deferred. | P6 |
|
||||
|
||||
**Rules in this subsection: 16.**
|
||||
|
||||
|
||||
Reference in New Issue
Block a user