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.
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.
- 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
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.
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.
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.
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.
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.
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.
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.
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.
Ports Angular PopularRequestsApiService and IPopularRequest types
to React with pure API function + React hook pattern matching
existing features (online-board, schedule).
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.
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.
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.
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.
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.
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.
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.
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.
TDD-driven schema.org JSON-LD builders using schema-dts types.
buildFlightJsonLd maps ISimpleFlight to Flight schema with
airports, times, and provider. buildFlightListJsonLd wraps
search results as an ItemList of ListItems.
SEO builder pure functions for all 6 Online Board route types,
each returning SeoHeadProps with title, description, canonical,
hreflang, OG, and Twitter card. Populated empty EN locale SEO
keys with English translations matching the Russian pattern.
OnlineBoardSearchPage (shared by all 4 search routes),
OnlineBoardStartPage (search form landing), and
OnlineBoardDetailsPage (flight detail view with legs).
All wired to existing hooks from 2C/2D. 21 tests passing.
Two thin composition hooks that connect the generic SignalR hook (1E)
to board-specific channels: useLiveBoardSearch for search pages
(SubscribeDate channel) and useLiveFlightDetails for the details page
(Subscribe channel). Both are SSR-safe and client-only.
Pure API functions (searchFlights, getFlightDetails, getCalendarDays)
with dependency-injected ApiClient, plus three thin React hooks
(useOnlineBoard, useFlightDetails, useCalendarDays) for search,
details, and calendar pages. 17 TDD tests for API layer covering
URL construction, response mapping, and error handling.
Pure TypeScript port of Angular OnlineBoardUrlBuilder/Parser covering
all 6 URL types (start, flight, departure, arrival, route, details).
Includes roundtrip parity tests and edge cases for suffixed flights,
variable-length flight numbers, time ranges, and 3-char carriers.
Port Angular flight types (ISimpleFlight, IFlightLeg, ITimesSet, etc.)
to minimal React-friendly interfaces. Add formatDuration/formatTime/
formatDate/isDayChange as pure functions. Stub useCityName hook as
passthrough pending customer dictionary API endpoint.