Commit Graph

59 Commits

Author SHA1 Message Date
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 1aaebc5176 Wire popular request clicks to pre-fill OnlineBoardFilter via query params
Clicking a popular request now builds URLSearchParams and navigates with
them, so the filter initializes with the correct tab/fields pre-filled.
Schedule-type requests redirect to the schedule feature instead.
2026-04-16 18:24:53 +03:00
gnezim 65ed6c1749 Fix calendar days bitmask parsing and filter hydration from URL params
Calendar days API returns a 31-char bitmask ('1'=available, '0'=unavailable)
starting from baseDate-1. parseCalendarDays now converts this to yyyyMMdd
date strings matching Angular's search-page-base.component.ts logic.

Calendar strip buttons now show formatted day numbers instead of raw dates.

OnlineBoardFilter now accepts initial values from URL params so the
departure/arrival/date fields are populated on search results pages.
2026-04-16 13:56:08 +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 63c3705a0c Style PrimeReact dropdown/calendar buttons to match Angular subtle chevrons
Override PrimeReact AutoComplete dropdown button: transparent bg, no border,
gray color, smaller icon — matches Angular's custom city-autocomplete
search-button styling.

Override PrimeReact Calendar trigger button: transparent bg, smaller icon,
blue color — matches Angular's outline calendar icon.

Fix swap button: remove circular border, use Angular's flat white style
with rotate(90deg) on the arrows SVG.
2026-04-16 11:52:27 +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 797d0699d7 Match Angular Online Board pixel-for-pixel: accordion filter, swap button, breadcrumbs, search history
CI / ci (push) Failing after 38s
Deploy / build-and-deploy (push) Failing after 6s
Replace 4-radio-button filter with PrimeNG-style accordion (2 tabs: Flight Number, Route).
Add swap button between departure/arrival in route filter, clear button on flight number input,
time selector in route filter, flight number validation with error tooltip.
Add SearchHistory component below filter, Breadcrumbs in page header, FeedbackButton stub,
ScrollUpButton for scroll-to-top. SeoHead already wired on start page route.
All tests updated to match new accordion structure.
2026-04-16 00:58:10 +03:00
gnezim d9bcccc1c5 Fix all e2e failures, sass warnings, and HMR websocket errors
CI / ci (push) Failing after 38s
Deploy / build-and-deploy (push) Failing after 6s
- Restructure OnlineBoardFilter to use radio tabs (flight/departure/
  arrival/route) with dynamic fields matching e2e test expectations
- Fix error page e2e tests to use client-side navigation (SSR renders
  empty outside [lang]/layout) and use specific CSS class locators
- Replace deprecated transparentize() with rgba() in _shadows.scss
- Handle WebSocket upgrades explicitly in dev-server to prevent HMR
  reconnection spam
- Resolve DEP0190 by spawning modern binary directly without shell
- Add tests/e2e-angular to tsconfig excludes
2026-04-16 00:23:10 +03:00
gnezim 47628c9a15 Fix lint warning and update test assertions for ISO date format
CI / ci (push) Failing after 37s
Deploy / build-and-deploy (push) Failing after 6s
2026-04-15 22:41:08 +03:00
gnezim 71d0c983fd Fix API calls: bind fetch to globalThis, fix date format for calendar
CI / ci (push) Failing after 28s
Deploy / build-and-deploy (push) Failing after 5s
Root cause of search not working: globalThis.fetch stored as a class
field loses its Window binding, causing 'Illegal invocation'. Fixed
with fetch.bind(globalThis).

Also fix calendar days endpoint date format from yyyyMMdd to
yyyy-MM-ddT00:00:00 matching Angular's ApiFormatterService.
2026-04-15 22:32:51 +03:00
gnezim e7c20c3d2d Fix API integration: proxy via Angular, date format, root redirect
CI / ci (push) Failing after 36s
Deploy / build-and-deploy (push) Failing after 5s
- Point API_BASE_URL to localhost:4200 (Angular's dev proxy) which
  correctly forwards to flights.test.aeroflot.ru with proper headers
- Convert URL date format (yyyyMMdd) to API format (yyyy-MM-ddT00:00:00)
  matching Angular's ApiFormatterService behavior
- Add standalone api-proxy.mjs script for running without Angular
- Root page redirect uses both loader and client-side navigate
- SignalR hub URL points to platform.yc.webzavod.ru/tracker/hub
- Remove broken server/modern-js.server.ts (proxy handled externally)
2026-04-15 22:08:54 +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 8df20a9ed9 Fix OnlineBoardSearchPage tests for PageLayout restructuring
CI / ci (push) Failing after 36s
Deploy / build-and-deploy (push) Failing after 5s
Tests failed because PageTabs uses Link from @modern-js/runtime/router
which wasn't included in the router mock. Added Link to the router mock,
added mocks for PageTabs, OnlineBoardFilter, and other transitive deps,
and updated error text assertions to match the new Russian strings.
2026-04-15 21:04:28 +03:00
gnezim 11026cd244 Add graceful API error state with retry on search pages
CI / ci (push) Failing after 37s
Deploy / build-and-deploy (push) Failing after 6s
When the API fetch fails (backend unavailable), show a styled white
error card with a Russian-language message and retry button instead
of barely-visible text on a dark background.
2026-04-15 20:58:07 +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 cbd47afd77 Wire flights-map feature flag through PageTabs and fix map component issues
PageTabs now reads the FEATURE_FLIGHTS_MAP flag directly via useFeatureFlag
instead of relying on a prop default, matching the Angular page-tabs pattern.
FlightsMapFilter uses PrimeReact AutoComplete and Calendar instead of plain
HTML inputs, with i18n labels. MapCanvas init effect uses refs to avoid
React exhaustive-deps warnings. Root layout imports leaflet CSS and
PrimeReact theme globally. Env schema accepts NODE_ENV "test" for vitest.
2026-04-15 20:38:39 +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 fb64095a63 Fix static asset serving and tile icons
CI / ci (push) Failing after 36s
Deploy / build-and-deploy (push) Failing after 5s
- Move public/ to config/public/ (Modern.js serves static files
  from config/public/, not public/)
- Add explicit background-size: 45px 45px on info tile icons
- All SVGs, fonts, and images now serve with correct MIME types
2026-04-15 20:06:34 +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 dee10544e0 Polish Flights Map page with PageLayout, tabs, and filter styling
CI / ci (push) Failing after 38s
Deploy / build-and-deploy (push) Failing after 6s
Flights Map now uses PageLayout with PageTabs (flights-map tab active),
filter in content-left column, and map in a .frame section. Added SCSS
for filter panel and map wrapper matching Angular structure.
2026-04-15 19:35:02 +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 7c11e2dca5 Polish filter panel input styling to match Angular custom-input mixin
Add right padding, font-overflow, and transition to input fields and
prefix element for full parity with Angular's custom-input mixin output.
2026-04-15 19:28:14 +03:00
gnezim 4af3373279 Add fallback data so popular sections always render on start page
When the API is unavailable the popular requests panel was hidden
because the hook returned empty data on error. Add fallback mock data
matching Angular's test fixtures so the panel renders in dev and
degraded environments.
2026-04-15 19:27:09 +03:00
gnezim 1b11609c50 Fix search button styling, page title width, and sticky content rendering
Add blue background/hover styles to the search button matching Angular's
.color.blue button pattern. Fix page title width to calc(100% - 120px)
matching Angular layout. Conditionally render sticky-content wrapper
to avoid empty DOM nodes.
2026-04-15 19:25:09 +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 64bfc25db7 Port Online Board search results and details page styles
Added SCSS for OnlineBoardSearchPage (calendar strip, connection badges,
day selector) and OnlineBoardDetailsPage (flight legs, station details,
status sections). Ported from Angular component styles with Angular-
specific selectors removed.
2026-04-15 19:06:45 +03:00
gnezim 3c315d5114 Port Online Board start page UI to match Angular DOM and classes
Rewrite OnlineBoardStartPage to use PageLayout two-column structure,
add OnlineBoardFilter with PrimeNG-style accordion tabs, and render
the info tiles and popular requests section matching the Angular
template. Update tests for the new component structure.
2026-04-15 18:58:51 +03:00
gnezim 031ad7c15d Fix lint warnings and test environment for Phase 5 tests
Remove unused type alias, unused variable, add jsdom environment
directive, and use container.textContent for cross-element text
assertions.
2026-04-15 10:09:56 +03:00
gnezim 78205c378e Add Phase 5C integration tests for PopularRequestsPanel
Covers all 5 request modes, loading/error states, keyboard
accessibility, and the 4-item display limit.
2026-04-15 10:02:09 +03:00
gnezim e172df8cf9 Add Phase 5B components, route page, and update MF expose
PopularRequestsPanel renders up to 4 popular request items in a
grid. MF expose upgraded from stub to real component. Route page
at /{lang}/popular provides standalone access.
2026-04-15 10:01:22 +03:00
gnezim 0a8ccfe36e Add Phase 5A types, API function, and usePopularRequests hook
Ports Angular PopularRequestsApiService and IPopularRequest types
to React with pure API function + React hook pattern matching
existing features (online-board, schedule).
2026-04-15 10:01:11 +03:00
gnezim 5839692e52 Fix lint and typecheck issues in flights-map feature
Add explicit undefined to optional properties for exactOptionalPropertyTypes
compatibility. Remove unused import. Fix non-null assertions with proper
null guards. Remove invalid eslint-disable comment.
2026-04-15 09:51:23 +03:00
gnezim a60494366f Update flights-map barrel and MF expose from stub to real
Populate the feature barrel with all 4A-4D exports. Replace the
FlightsMap MF expose stub with lazy-loaded FlightsMapStartPage,
gated by the flightsMap feature flag.
2026-04-15 09:43:54 +03:00
gnezim 0f5d7915be Add flights-map SEO builder and JSON-LD WebPage schema
Phase 4D: buildFlightsMapSeo generates meta tags, canonical, hreflang, OG
and Twitter Card props. buildFlightsMapJsonLd produces a schema.org WebPage
object for structured data. 10 tests cover both builders.
2026-04-15 09:43:24 +03:00
gnezim a2cf781b02 Add flights-map route page, start page container, and filter
Phase 4C: FlightsMapStartPage manages filter state and drives search/calendar
hooks. FlightsMapFilter provides departure/arrival/connections/domestic/
international controls. Route page gates on flightsMap feature flag, rendering
404 when disabled.
2026-04-15 09:42:31 +03:00
gnezim dc030aceea Add Leaflet map wrapper and ClientOnly SSR-safe component
Phase 4B: MapCanvas.tsx is the sole Leaflet consumer in the codebase.
Renders markers (blue/orange), polylines (solid/dashed) with great-circle
arcs, popups and tooltips. Accepts all data as props (stateless).
ClientOnly.tsx provides SSR safety by deferring render until mount.
2026-04-15 09:41:11 +03:00
gnezim aa61049229 Add flights-map types, API functions, hooks, and feature flag
Phase 4A: Define IFlightRoute, IMapMarker, IMapPolyline types; implement
searchDestinations and getFlightsMapCalendar API functions with 11 tests;
add useFlightsMapSearch, useFlightsMapCalendar hooks; add FEATURE_FLIGHTS_MAP
env var for feature flag gating.
2026-04-15 09:40:19 +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 e20686b11f Wire SEO and JSON-LD into all 6 Online Board route pages
Each route page now renders <SeoHead> with title, description,
canonical, hreflang, OG, and Twitter card from the SEO builders.
Search pages render <JsonLdRenderer> with ItemList of Flight
schemas. Details page renders Flight JSON-LD. Barrel exports
updated with 2F SEO and JSON-LD functions.
2026-04-15 08:37:47 +03:00