90 Commits

Author SHA1 Message Date
gnezim 349cd029f7 Update PageTabs styling to display horizontally with proper border styling 2026-04-06 10:56:14 +03:00
gnezim 3aefa18e54 Fix PageTabs styling and clean up duplicate files 2026-04-06 10:55:21 +03:00
gnezim 4884c45cf9 fix: update PageLayout structure to use two-row header/content layout
- Restructure PageLayout to render header row (tabs + title) and content row separately
- Update OnlineBoardStartPage and ScheduleStartPage to pass tabs as headerLeft
- Update search and details pages to use new headerLeft/title props
- Delete conflicting compiled JS files (page-layout.js, old index.tsx)
2026-04-06 10:49:32 +03:00
gnezim b181440e6f fix: restructure PageLayout to match Angular's two-row header/content layout
- Convert PageLayout from single-row to two-row structure (header row + content row)
- Move tabs to headerLeft prop to appear in proper header row
- Update all page components (OnlineBoardStartPage, ScheduleStartPage, search pages, detail pages)
- Update SCSS to use page-layout__row and page-layout__column-left/right classes
- Ensure pixel-perfect layout parity with Angular version
2026-04-06 10:43:23 +03:00
gnezim 7eebdf3c4b fix: align React CSS with Angular pixel-perfect layout
- Convert page-layout from CSS Grid to Flexbox to match Angular layout structure
  - Use flex-direction: row with sticky left sidebar positioning
  - Apply exact sidebar width (285px) and spacing (1.5% margin-right)
  - Implement responsive breakpoints matching Angular media queries
  - Set max-width: 1440px container with proper padding

- Standardize route-filter spacing using Angular spacing variables
  - Update gap values: 16px → 10px (match $space-m)
  - Update padding: 16px 0 → 20px (full padding around content)
  - Update label margins: 8px gap → proper Angular spacing
  - Adjust trip options gap: 16px → 20px ($space-xl)
  - Update passenger/cabin controls gaps and padding to match Angular

- Fix online-board-filter accordion padding
  - Remove top padding (5px → 0) for proper accordion content spacing
  - Keep side/bottom padding at 20px to match Angular layout

This fixes paddings, margins, labels positioning, and gaps to achieve pixel-perfect parity with Angular.
2026-04-06 10:27:23 +03:00
gnezim 7af82e3759 fix: copy updated translation files to correct directory for Vite
The src/public directory contained older i18n JSON files missing many keys including
SHARED namespace translations. Copied the updated files from public/assets/i18n to
src/public/assets/i18n to ensure Vite serves the complete translation data.
2026-04-06 10:17:49 +03:00
gnezim 221c7ed2c7 fix: add detailed logging to i18n loading process 2026-04-06 10:15:21 +03:00
gnezim 2c1d706e0f fix: implement asynchronous translation loading via fetch 2026-04-06 10:13:40 +03:00
gnezim d6be4d4716 fix: add static JSON imports with debug logging for i18n 2026-04-06 10:12:35 +03:00
gnezim 1b5f07249d fix: implement dynamic i18n translation loading with flattening 2026-04-06 10:10:23 +03:00
gnezim d0a0db5c75 revert to http backend for i18n loading; static imports not working properly 2026-04-06 09:58:45 +03:00
gnezim e12c93922b fix: use static translations in i18n configuration instead of async loading 2026-04-06 09:50:34 +03:00
gnezim 8f64346921 fix: add !important to route-filter swap button margin to override PrimeReact defaults 2026-04-06 09:48:50 +03:00
gnezim 2e7c8b3287 fix: accordion content padding for online-board-filter component 2026-04-06 09:47:19 +03:00
gnezim 947af08bb1 Fix CalendarInput date clearing and validation
- Expose native input field with data-testid support for test control
- Support clearing dates with empty value (null/undefined)
- Add ISO date format parsing (YYYY-MM-DD) for string inputs
- Sync native input with Calendar selection automatically
- Update styling to show native input with calendar icon button
- Display elements (selected-departure-date, selected-return-date) now disappear when date is cleared
2026-04-06 08:42:16 +03:00
gnezim 1e3147929c Add autocomplete suggestions display to CityAutocomplete
- Add 'suggestion-list' test ID to dropdown container
- Add 'suggestion-item' test ID to individual airport suggestions
- Update dropdown styling with proper positioning, borders, and hover effects
- Suggestions display as absolute-positioned list below input
- Each suggestion shows airport code and name (e.g. 'SVO - Moscow Sheremetyevo')
- List is hidden when input is empty or user loses focus
- Items are clickable to select and populate the input field
2026-04-06 08:40:22 +03:00
gnezim a3e5ee9bdd Add validation error displays to RouteFilter component
- Add three error display elements with test IDs: departure-error, same-city-error, validation-error
- Add validation state management: departureError, arrivalError, sameAirportError, searchValidationError
- Add validateDepartureInput() function for input validation (reuses validateCityCode)
- Implement same-city validation in useEffect to detect duplicate departure/arrival
- Update handleSearch() to check all required fields and show validation-error when missing
- Add error styling: .route-filter__error with red text (#d32f2f), light red background (#ffebee), and left border
- Same-city error shows inline below arrival input
- Search validation error displays below action buttons
- Errors automatically clear when conditions are fixed
2026-04-06 08:38:56 +03:00
gnezim afc81cab3b Add multi-city trip type support to RouteFilter
- Extend tripType state to include 'multi-city' option alongside 'one-way' and 'round-trip'
- Add third radio button for multi-city selection with test ID trip-type-multicity
- Update test IDs for existing radio buttons: trip-type-oneway (was trip-type-one-way) and trip-type-round (was trip-type-round-trip)
- Show additional-segments container only when multi-city is selected
- Display example segment with departure→arrival route and date
- Add comprehensive SCSS styling for multi-city UI elements:
  - .route-filter__multicity-message for instruction text
  - .route-filter__additional-segments for container
  - .route-filter__segment for individual segment display
  - .route-filter__segment-label, route, and date styles
- handleSearch callback already passes all tripType options including new 'multi-city'
- Maintains existing one-way and round-trip functionality unchanged
2026-04-06 08:36:53 +03:00
gnezim e426317eef Add cabin class dropdown to RouteFilter component
- Add cabinClass state with type 'economy' | 'business' | 'first' (default: economy)
- Add showCabinDropdown state to control visibility
- Add cabin-class-dropdown button to toggle visibility
- Add cabin-economy, cabin-business, cabin-first selection buttons
- Add cabin-class-display div showing selected cabin class
- Pass cabinClass in handleSearch callback
- Update RouteFilterProps with initialCabinClass prop
- Add SCSS styling for cabin class dropdown and options
- Integrate into OnlineBoardFilter to pass initialCabinClass
- Integrate into OnlineBoardSearchPage to decode cabinClass from URL params
2026-04-06 08:33:56 +03:00
gnezim ec0c67db91 Fix critical blockers in passenger count selector feature
CRITICAL ISSUE #1: Callback Signature Mismatch
- Updated handleRouteSearch callback to include passengers parameter
- Added passengers to params encoding in navigation state
- Updated OnlineBoardFilterProps to include passengers in initialSearchParams

CRITICAL ISSUE #2: Missing Validation on initialPassengers
- Added validatePassengerCounts function to validate and sanitize passenger counts
- Ensures all values are in valid range (0-9) and total doesn't exceed 9
- Updated state initialization to use validated passenger counts
- Removed unnecessary type assertion from handleSearch callback

Changes:
- online-board-filter.tsx: Updated callback signature and params encoding
- route-filter.tsx: Added passenger validation function and updated state init
2026-04-06 08:32:14 +03:00
gnezim 32cc851f72 Add passenger count selector to RouteFilter component
- Add PassengerCounts interface for type safety
- Add adults, children, infants state variables (default: 1, 0, 0)
- Add passengers-dropdown button to toggle visibility
- Add increment/decrement buttons for each passenger type
- Display passenger counts in dedicated elements
- Enforce maximum 9 passengers total constraint
- Disable add buttons when max reached
- Pass passenger counts in handleSearch callback
- Add SCSS styling for dropdown and controls
- Support initialPassengers prop for pre-filling values
2026-04-06 08:28:51 +03:00
gnezim 3de1ee3f62 fix: add missing PrimeReact and PrimeIcons CSS imports
Import PrimeReact and PrimeIcons CSS libraries at the app entry point
to ensure styling is loaded. This matches the Angular app which imports
these libraries in angular.json.

- primereact/resources/primereact.min.css: Base component styles
- primeicons/primeicons.css: Icon library styles

This fixes missing component styling that was relying only on custom
overrides without the base theme.
2026-04-06 08:14:19 +03:00
gnezim 2d0c5c2c15 fix: add missing i18n translation keys across all languages
Added 49 missing translation keys that were being used in the React components but were not defined in the i18n JSON files:

SHARED keys (23):
- AIRCRAFT, AIRPORT, ARRIVAL, BACK, CANCEL, CLEAR, DATE, DEPARTURE, END_DATE
- FLIGHT, FROM, ONE_WAY, OPERATOR, REMARKS, RETURN_DATE, ROUND_TRIP, ROUTE
- SEARCH_HISTORY, SELECT_CITY, START_DATE, STATUS, TO, TRIP_TYPE

BOARD keys (12):
- AMENITIES, AVAILABLE_SEATS, BOARDING, CAPTAIN, CODESHARING, CREW_INFORMATION
- DEBOARDING, FIRST_OFFICER, FLIGHT_ATTENDANTS, SEATS, TOTAL_SEATS, VIEW_DETAILS

SCHEDULE keys (14):
- BROWSE_SCHEDULE, BROWSE_SCHEDULE_DESC, CODESHARE, DAYS_OF_WEEK
- DOWNLOAD_SCHEDULE, DOWNLOAD_SCHEDULE_DESC, DURATION, OPERATING_DAYS
- POPULAR_ROUTES, ROUTE_SCHEDULE, ROUTE_SCHEDULE_DESC, STOPS
- WEEKLY_VIEW, WEEKLY_VIEW_DESC

All 9 language files (en, ru, de, es, fr, it, ja, ko, zh) have been updated consistently.
2026-04-06 07:38:51 +03:00
gnezim 4c1a1e0b66 feat: add auto-search on city selection and display elements
- Auto-trigger search when departure or arrival city is selected
- Add display elements for selected cities (departure-display, arrival-display)
- Add display elements for selected dates (selected-departure-date, selected-return-date)
- Pass search params to filter component on search results page
- Support round-trip date selection with return date field
- Pass return date and trip type through navigation params

This fixes the first two search-filter tests (departure and arrival city searches).
Fixes #1 and #2 of the search-filter test suite.
2026-04-06 03:13:17 +03:00
gnezim 1a3256147a feat: align React online-board start page styling with Angular version
- Updated feature card grid from CSS Grid to Flexbox (2x2 layout with 50% width)
- Added background image and title icon SVGs for visual parity
- Changed card title colors from dark gray to blue (#0066cc) matching Angular links
- Fixed padding and spacing to match Angular (50px sections, 65px icon offset)
- Added data-testid attributes for E2E testing
- Created comprehensive visual design alignment report documenting changes
2026-04-06 02:26:51 +03:00
gnezim f6c126a804 test: configure BackstopJS for visual regression testing
- Update backstop configs to test React app at /ru-ru/onlineboard
- Generate reference screenshot from Angular version
- Run visual test: 47.31% mismatch identified (layout/styling differences)
- Identify key differences for design alignment
2026-04-06 02:12:58 +03:00
gnezim 403dc01708 fix: i18n language detection from URL path and add missing translation keys
- Update i18n language detection to extract language code from URL (/ru-ru/ → 'ru')
- Move public assets to src/public/ to match Vite root directory
- Add missing translation keys: SHARED.DATE, SHARED.FROM, SHARED.TO, SHARED.DEPARTURE, SHARED.ROUTE
- Fix router configuration to use relative paths for language-prefixed routes
- App now loads at /ru-ru/onlineboard with full Russian translations
2026-04-06 02:07:28 +03:00
gnezim c9a5bcd22d fix: replace dynamic imports with static imports to fix React app loading 2026-04-06 01:53:35 +03:00
gnezim e8e8796b6f fix: add missing i18n translation keys to ru.json 2026-04-06 01:40:45 +03:00
gnezim 739d1f7e4a fix: correct i18n keys in PageTabs and OnlineBoardStartPage components 2026-04-06 01:38:05 +03:00
gnezim 2b4eeb93eb fix: show route filter by default in online board
- Changed default activeTab from 0 to 1 to show Route Filter accordion tab by default
- This makes departure/arrival inputs visible for e2e tests
- Matches test expectations where inputs are directly accessible on start page
2026-04-06 00:55:59 +03:00
gnezim 3eb2697881 feat: improve online board tabs and flight data mocking
- Replaced PrimeReact TabView with custom tab buttons for better test compatibility
- Added proper 'active' class styling to tab buttons based on activeTab state
- Enhanced API mock data with complete flight information (all fields)
- Added 3 sample flights with different statuses (ON_TIME, DELAYED, BOARDING)
- Included departure/arrival details, boarding times, gates, and aircraft info
2026-04-06 00:53:41 +03:00
gnezim 273c3cf2fb feat: implement online board tabs and update component test IDs
- Added TabView to OnlineBoardSearchPage with Departures/Arrivals tabs
- Updated RouteFilter test IDs to match test expectations (departure-input, arrival-input, search-button)
- Integrated BoardSearchResult component for flight list display
- Added proper tab state management and data-testid attributes
2026-04-06 00:41:17 +03:00
gnezim 483e034e63 fix: update routing to show online board at /, fix component tests
- Changed root route (/) to show OnlineBoardStartPage directly instead of redirecting
- Updated component tests to visit /components route
- Fixed button component test assertions (CSS checks and disabled state verification)
2026-04-06 00:31:58 +03:00
gnezim f08a86c453 feat: implement NotFoundPage (404) and fix Cypress config
- Implement NotFoundPage with required test IDs for 404 error page
- Add data-testids: error-404-title, error-message, back-button, home-link, error-heading
- Fix Cypress baseUrl config from 3003/components to localhost:3001
- Clean up .js files in pages directory (keep only .tsx)
- App passes Task 1.1 requirements (404 page structure complete)
2026-04-06 00:18:31 +03:00
gnezim 14bcc960b4 feat: create shared component stubs and fix SCSS circular imports
- Created 8 core shared components: Card, PageLayout, PageTabs, DayTabs, CalendarInput, TimeSelector, CityAutocomplete, SearchHistory, PageLoader, PageEmptyList
- Fixed SCSS circular dependency: removed self-imports in components/modules-components/index.scss and modules-pages/index.scss
- Updated page exports to use feature-based implementations
- Added City interface to CityAutocomplete with mock city data
- App now loads at localhost:3001 without SCSS errors
2026-04-06 00:07:38 +03:00
gnezim 64c919afa0 fix: correct SCSS relative import depths for nested components
- Fixed all component SCSS files using single '../' to use '../../' to properly reach root styles directory
- Replaced incorrect './src/styles/' absolute-style paths with proper relative paths
- Fixed page directory imports with incorrect depth (../../../pages to ../../)
- All files in src/styles/components/* now use '../../' to reach framework, colors, variables, etc
- All files in src/styles/pages/* now use correct relative depth to reach sibling directories
- 86 SCSS files corrected
2026-04-05 23:00:38 +03:00
gnezim c4b02ccb6b fix: convert all SCSS absolute imports to relative paths for Vite compatibility 2026-04-05 22:56:21 +03:00
gnezim c4e7519d6f fix: convert SCSS absolute imports to relative paths for Vite compatibility 2026-04-05 22:55:14 +03:00
gnezim 399a35faa6 chore: add missing background image asset to React app 2026-04-05 22:49:12 +03:00
gnezim 7c59864680 feat: create ComponentShowcase page for e2e component testing 2026-04-05 22:06:35 +03:00
gnezim 4b2a03fb18 feat: create ScheduleFlightDetailsPage with schedule flight details 2026-04-05 21:22:01 +03:00
gnezim 0dc6732947 feat: create ScheduleSearchPage with week day tabs and flight schedule display 2026-04-05 21:20:17 +03:00
gnezim 8c68d31e12 feat: create ScheduleFilter with date range and day selection 2026-04-05 21:18:26 +03:00
gnezim dfd267f852 feat: create ScheduleStartPage and schedule feature structure 2026-04-05 21:16:40 +03:00
gnezim 50a5442d79 feat: create FlightDetailsPage with full flight information 2026-04-05 21:14:54 +03:00
gnezim 49c696610c feat: implement BoardFlightBody with detailed flight information 2026-04-05 21:13:12 +03:00
gnezim 0366db1a2f feat: implement BoardFlightHeader with full flight details display 2026-04-05 21:11:56 +03:00
gnezim 3e2d37887e feat: create BoardSearchResult with flight list and header/body components 2026-04-05 21:10:03 +03:00
gnezim 573b99ea1c feat: create OnlineBoardSearchPage for search results 2026-04-05 21:08:44 +03:00