Commit Graph

80 Commits

Author SHA1 Message Date
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
gnezim 92ffc2a103 feat: create OnlineBoardFilter with FlightNumber and Route filters 2026-04-05 21:07:08 +03:00
gnezim e53ac746a4 feat: create OnlineBoardStartPage component 2026-04-05 21:04:45 +03:00
gnezim fa43a9e026 feat: create SearchHistory accordion component 2026-04-05 21:03:05 +03:00
gnezim 0d7f6c0954 feat: create CityAutocomplete airport search component 2026-04-05 21:02:00 +03:00
gnezim fd054bc688 feat: create TimeSelector time range component 2026-04-05 20:59:02 +03:00
gnezim 9bc930fe91 feat: create CalendarInput date picker component 2026-04-05 20:57:57 +03:00
gnezim 3225ecd1fa feat: create DayTabs date carousel component 2026-04-05 20:56:42 +03:00
gnezim b5bdd1e18d feat: create PageEmptyList empty state component 2026-04-05 20:55:06 +03:00
gnezim 9ba5c9cbf0 feat: create PageLoader spinner component 2026-04-05 20:54:12 +03:00
gnezim 509e1afb20 feat: create PageTabs navigation component 2026-04-05 20:52:24 +03:00