Commit Graph

36 Commits

Author SHA1 Message Date
gnezim 13fb633ec4 Fix schedule details date format
Upstream /schedule/details returns 400 when dates are sent as
yyyy-MM-dd; it wants the full ISO datetime (yyyy-MM-ddT00:00:00), same
as Angular's ApiFormatterService.formatDate output. Update the date
helper in ScheduleDetailsPage to append T00:00:00.

Verified with curl: request now returns 200 with the full flight
payload for SU1942 on 2026-04-18.
2026-04-18 13:56:10 +03:00
gnezim abc387ac3c Omit blank departure/arrival in schedule details request
Upstream returned HTTP 400 for empty departure/arrival values. Angular
derives them from per-leg data when missing; easier fix here is to
simply not send them — the backend accepts the request without those
query params.
2026-04-18 13:47:19 +03:00
gnezim 34d74b44c5 Add filter sidebar to schedule search
Schedule results previously had nothing in the left rail. Angular fills
it with the route filter + search history. Reuse the OnlineBoardFilter
component pre-populated with current URL params plus SearchHistory
below it, so the layout matches the board pages.
2026-04-18 13:43:28 +03:00
gnezim 6f634092b2 Fix schedule search endpoint (GET not POST, dateTo + 1 day)
Angular's ScheduleApiService.getFlights uses GET with query params
and a half-open date interval (sends dateTo = requested end + 1 day).
React sent POST with a JSON body matching the params verbatim, which
returned HTTP 500 from the backend.

searchSchedule now:
- GETs flights/1/{lang}/schedule with ?departure=...&arrival=...
- extends dateTo by one day
- coerces connections to '0'/'1' and drops empty timeFrom/timeTo

Verified the call returns 200 with real flight data for
SVO→LED 2026-04-18..2026-04-25. Updated the api tests accordingly.
2026-04-18 13:38:15 +03:00
gnezim 08bddc0db6 Translate remaining raw status labels
- ScheduleDetailsPage flight status: rendered raw
  `flight.status` (English enum 'Scheduled'); now routes through
  FLIGHT-STATUSES.* keys for localized Russian labels.
- FlightsMiniListItem status icon aria-label: same fix, so screen
  readers say 'Запланирован' instead of 'Scheduled'.
2026-04-18 13:34:45 +03:00
gnezim 0c660671ea Close the remaining high-impact parity gaps
Batch of fixes identified by the comparison audit:

Schedule search page (ScheduleSearchPage):
- Resolve IATA codes to city/airport names, so the H1 reads
  'Маршрут: Шереметьево - Санкт-Петербург' instead of 'SVO - LED'.
- Breadcrumb trail now includes the human-friendly route as its
  last entry.

Details page (OnlineBoardDetailsPage):
- Hide the 'Перелет N' leg header for single-leg flights (Angular
  parity — that label is only meaningful for multi-leg routes).
- Translate the leg status through FLIGHT-STATUSES.* instead of
  emitting the raw enum ('Cancelled' → 'Отменен', etc.).
- Humanize leg and total flying time through formatDuration so the
  page reads '1ч 25м' rather than '01:25:00'.

Details meal panel (MealPanel):
- Use the same FOOD.* translation keys as Angular, so labels become
  'Эконом класс / Комфорт класс / Бизнес класс / Специальное
  питание'.
- Add the Special-meal icon + link (was stubbed out previously).

Accessibility:
- Route the English aria-labels through new SHARED.A11Y-* keys in
  DayTabs pagination, FlightListSkeleton, ScrollUpButton and
  PrintButton.

Breadcrumbs:
- Render the 'Главная' crumb as a link even when it's the only /
  last item (it was dropping to plain text on start pages). Angular
  always links it to aeroflot.ru.

Tests updated to assert the new translated labels and duration
formatting; 1258 tests passing.
2026-04-18 13:27:56 +03:00
gnezim 96235d5534 Wrap ScheduleDetailsPage in PageLayout + frame
The schedule-details view rendered bare content on the blue background
with no PageLayout, no PageTabs, no breadcrumbs, no white card — so
the flight-number heading, leg list and skeletons were invisible
against the page background. Wrap the component in PageLayout with
the schedule tab + breadcrumb + 'Информация о рейсе: SU 6805' title,
and put each branch inside a <section class='frame'> (error,
not-found, empty, success) so it sits on the same white card as the
board pages.

Also fix the same React key warning the board page had: the leg map
used leg.index as the key, which is undefined for Direct flights.
Fall back to the array index.
2026-04-18 13:11:28 +03:00
gnezim 77821c3893 Style schedule-start checkboxes to match Angular
The two filter toggles ('Только прямые рейсы' / 'Показать обратные рейсы')
were rendering as the browser default 16px native checkboxes, which look
inconsistent across browsers and thin against the rest of the page.
Add an appearance:none + custom box with a blue tick mark when checked,
matching Angular's filter card.
2026-04-18 13:00:07 +03:00
gnezim 96adf785aa Extract schedule \$.tsx body to a readable module
Modern.js routes catch-all paths via a file literally named \`\$.tsx\`.
The name is framework-mandated but cryptic at a glance. Move the real
component to src/features/schedule/ScheduleDetailsCatchAllRoute.tsx
and make \$.tsx a 12-line re-export, so every grep/import/stack-frame
shows the readable name and the \$.tsx file stays just a framework
shim.
2026-04-18 12:52:13 +03:00
gnezim de22fc3722 Rebuild schedule results page for Angular parity
Previously the /schedule/route results page rendered everything on the
dark-blue background and dumped the raw 382-char bitmask from the
/days endpoint straight into the DOM. Changes:

- Wrap the page in PageLayout with PageTabs, breadcrumb and an H1
  matching Angular ('Маршрут: SVO - LED').
- Swap the inline calendar loop for the shared <DayTabs> component
  (weekday + day + month labels, paging arrows).
- Replace the broken comma-split parser in getScheduleCalendarDays
  with the same bitmask-to-dates conversion the board endpoint uses,
  so the calendar now yields real yyyy-MM-dd strings.
- Frame the results in <section class='frame'> so they sit on a white
  card (matches the board pages).
- Translate the 'Invalid …' parameter errors on every route page to
  SHARED.INVALID-PARAMS ('Неверные параметры URL.') and wire t() into
  the two route files that still lacked useTranslation.
2026-04-18 00:35:37 +03:00
gnezim 692fb5e292 Translate schedule headers and connection badges
- Schedule round-trip page: 'Outbound' / 'Return' section headings now
  use SCHEDULE.OUTBOUND / SCHEDULE.RETURN keys ('Туда' / 'Обратно' in
  Russian).
- SignalR connection badge: 'Live' / 'Reconnecting…' / 'Offline' now
  route through SHARED.CONNECTION-* keys ('Онлайн' / 'Соединение…' /
  'Нет связи' in Russian). Applied on both board search and details
  pages.
- Bag-belt label on leg stations switched to the existing
  DETAILS.BAG_BELT key (SHARED variant doesn't exist).
- Integration tests updated to match the new badge keys under mocked t.
2026-04-18 00:27:09 +03:00
gnezim a444b71bcd Translate remaining English strings and color statuses
- FlightList empty-state, Operated-by label, details/schedule error
  and not-found messages now route through i18n instead of hardcoded
  English. Added BOARD.FLIGHT-NOT-FOUND, BOARD.LOAD-FAILED,
  BOARD.OPERATED-BY, SHARED.RETRY to all nine locales.
- FlightStatus label now picks up the same colour as the plane icon
  (red for Cancelled, green for Arrived/Landed, blue for In Flight,
  orange for Delayed) — matches Angular's flight-status text treatment
  so 'Отменен' reads at a glance.
- Tests updated to expect the translation keys under the mocked `t`.
2026-04-18 00:15:46 +03:00
gnezim 4a8ae20c47 Fix stale test URLs and skip tests for out-of-scope features 2026-04-16 22:47:16 +03:00
gnezim 9a278c3170 Fix route path: use onlineboard not online-board in navigation URLs 2026-04-16 18:37:18 +03:00
gnezim 68f7c239dc Pre-fill schedule form from popular request query params
Add buildSchedulePopularRequestQueryParams to convert Route/RouteWithBack
popular requests into URL search params. ScheduleStartPage now reads
departure/arrival/return from query params to initialize form state, and
the popular request click handler navigates with appropriate params for
both Schedule and Onlineboard request types.
2026-04-16 18:29:56 +03:00
gnezim b533124e04 Match Angular bottom-description padding and line-height exactly 2026-04-16 11:57:31 +03:00
gnezim 5f33ef371d Style schedule PrimeReact buttons and swap icon to match Angular 2026-04-16 11:54:35 +03:00
gnezim a2ab4fda16 Match Angular form controls: swap icon, city dropdowns, schedule date range
Online board filter: use Angular sprite SVG for swap button, add dropdown
chevron to city AutoComplete inputs.

Schedule filter: add swap button between cities, replace two separate
date fields with single range Calendar matching Angular. Fix button text
to "Показать расписание", date label to "Показать расписание на".
Add dropdown chevrons to city inputs.
2026-04-16 11:45:40 +03:00
gnezim d096fbe9e1 Restore date defaults to today so search forms submit correctly
Null dates broke form submission — the handlers bail early when date
is null. Restore initialization to today/+7 days as before. The
Calendar placeholder prop still provides the format hint when cleared.
2026-04-16 09:24:59 +03:00
gnezim 0cdf8c849d Match Angular form controls: time range slider, date placeholders, button colors
Online board filter: replace time input fields with PrimeReact Slider
matching Angular's p-slider range selector. Initialize dates to null
so placeholder "ДД.ММ.ГГГГ" shows instead of today's date.

Schedule filter: same time slider replacement, add missing "Только
прямые рейсы" (direct flights only) checkbox, date placeholders.

Error page: fix "На главную" button to use outlined style (transparent
bg + blue border) matching Angular's blue-home class. Remove max-width
on description text.
2026-04-16 09:20:26 +03:00
gnezim 46f6f3ef86 Match Angular pixel-for-pixel: error page, filter default, breadcrumbs, feedback button
Error page: add search input bar, align flex/spacing to Angular SCSS mixins,
match button display and illustration flex.

Online board filter: default to "route" tab expanded (Angular defaults to
route, not flight number).

Start pages: remove extra breadcrumb items — Angular start pages show only
"Главная", not the page title.

PageLayout: hide FeedbackButton — Angular gates it behind
FEEDBACK_BUTTON_AVAILABLE feature flag (off by default).
2026-04-16 09:03:00 +03:00
gnezim bb0353bb40 Match Schedule and Flights Map pages to Angular pixel-for-pixel
CI / ci (push) Failing after 37s
Deploy / build-and-deploy (push) Failing after 6s
Schedule: add SearchHistory below filter, time selector fields (timeFrom/timeTo)
for outbound and return flights, breadcrumbs, and bottom description section.

Flights Map: add FILTER_INFO message in filter panel, disabled states on
toggles when no departure/arrival selected (matching Angular logic), breadcrumbs,
and replace plain "Loading..." text with animated spinner matching Angular
loader-sheet component.
2026-04-16 01:09:04 +03:00
gnezim 5fc67f81bd Wire city autocomplete to dictionary API
CI / ci (push) Failing after 37s
Deploy / build-and-deploy (push) Failing after 6s
useCitySearch hook loads cities from /api/dictionary/1/cities on first
use, then searches in-memory by name prefix and code -- matching the
Angular CitiesSearchService behavior. Wired into OnlineBoardFilter,
ScheduleStartPage, and FlightsMapFilter AutoComplete components.
2026-04-15 21:32:39 +03:00
gnezim f61e050e8c Configure dev proxy to flights.test.aeroflot.ru and fix API endpoint paths
API functions now build the full localized path matching the Angular
EndpointService pattern (/api/flights/{version}/{locale}/{endpoint}).
The dev proxy forwards /api and /flights to the test backend.
2026-04-15 21:32:28 +03:00
gnezim 130ce1f56b Replace plain inputs with PrimeReact AutoComplete and add i18n to all pages
CI / ci (push) Failing after 39s
Deploy / build-and-deploy (push) Failing after 5s
OnlineBoardFilter and ScheduleStartPage city fields now use PrimeReact
AutoComplete for visual parity with Angular's PrimeNG city-autocomplete.
ScheduleStartPage labels switched from hardcoded English to i18n keys.
PopularRequestsPanel uses stable content-based keys instead of array index.
Error page loads i18n translations on mount and supports all locale strings.
2026-04-15 20:38:46 +03:00
gnezim 2f1aacea4f Replace native date inputs with PrimeReact Calendar component
CI / ci (push) Failing after 37s
Deploy / build-and-deploy (push) Failing after 6s
2026-04-15 20:09:49 +03:00
gnezim 5145232702 Final pixel-perfect polish: search button color, mobile !important rules
CI / ci (push) Failing after 37s
Deploy / build-and-deploy (push) Failing after 6s
Fix search button background to use $blue-light (#4a90e2) matching Angular's
color.blue-light class. Add missing !important flags on PopularRequestsPanel
mobile breakpoint rules to match Angular specificity.
2026-04-15 19:47:59 +03:00
gnezim 9d0e62b952 Wrap Schedule page in PageLayout with tabs and Angular-matching styles
Schedule start page now uses PageLayout with PageTabs (schedule tab active),
filter form in content-left column, and the info section with titles-container
and PopularRequests in the main content area. SCSS matches Angular start.scss.
2026-04-15 19:34:45 +03:00
gnezim b5d797236a Port Schedule and Popular Requests page styles
Added SCSS for ScheduleStartPage (form fields, schedule controls),
ScheduleSearchPage (calendar, outbound/inbound sections),
PopularRequestsPanel (grid layout, title), PopularRequestItem, and
RequestInfo (link styling). Replaced inline styles with SCSS class
names matching Angular source.
2026-04-15 19:08:03 +03:00
gnezim 6703c5a2f2 Fix lint issues in schedule feature code 2026-04-15 09:33:26 +03:00
gnezim c67686463a Add schedule parity harness, integration tests, barrel, and MF expose (Phase 3E)
Registers schedule URL serializer in parity harness with 18-entry fixture
corpus and fast-check fuzz. 10 URL round-trip integration tests, 6 SEO/
JSON-LD integration tests. Updates barrel and MF expose from stub to real.
2026-04-15 09:31:19 +03:00
gnezim 93f49cddae Add schedule SEO and JSON-LD tests (Phase 3D)
Tests cover start page, search, and details SEO builders plus
Flight/ItemList JSON-LD schema generation for schedule pages.
2026-04-15 09:28:04 +03:00
gnezim a072cd3bd2 Add schedule route pages and feature components (Phase 3C)
Four Modern.js routes: start page, one-way search, round-trip search,
and catch-all multi-flight details. Components wire hooks for data
fetching and render flight results with calendar navigation.
2026-04-15 09:26:42 +03:00
gnezim 7ad61554cb Add schedule API functions and React hooks (Phase 3B)
POST schedule/1 for search, GET schedule/details with indexed query
params, GET days/.../schedule/v1 for calendar. Three hooks wrap the
API functions with loading/error state management.
2026-04-15 09:22:50 +03:00
gnezim 1c5e85ea8e Implement schedule URL serializer/parser with TDD (Phase 3A)
Covers one-way search, round-trip search, multi-flight details (catch-all),
and airport-code-interleaved details format. Reuses online-board's flight
param parser for individual flight segments.
2026-04-15 09:20:56 +03:00
gnezim 0b9ea74617 Seed frozen public barrels for 4 features + UI adapter 2026-04-14 22:07:26 +03:00