{"version":3,"file":"timetable.fd96905ee6dc659d.js","mappings":"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","names":["selectTimetableState","state","timetable","_selectSearch","createSelector","search","_selectData","data","_selectStatus","status","selectStatus","selectStatusStatus","select","selectData","selectSearch","setSearch","createAction","props","clearSearch","all","union","TimetableStatus","INITIAL","LOADING","READY","ERROR","getEarliestSearchDayInMonth","year","month","today","LocalDate","now","day","forDate","toDate","getFullYear","localMonth","lt","localDay","normalizeLocalDate","rawDate","isLocalDate","undefined","i0","ctx_r1","controlName","auto_r4","origin_r3","SvgLibraryIcon","CHEVRON_DOWN","CLOSE_DELETE","option_r5","cityName","locationCode","countryCode","title","_c1","options_r6","length","LocationSearchComponent_ng_container_18_span_1_Template","LoaderType","INLINE_TEXT","LocationSearchComponent","constructor","renderer","this","selectionDone","EventEmitter","panelOpen","subscriptions","Subscription","ngOnInit","inputHasValue$","ctrlField","valueChanges","pipe","distinctUntilChanged","map","val","searchInput","isString","isNotBlank","isStringWithValue","isObject","add","initialValue$","subscribe","location","setValue","ngOnDestroy","unsubscribe","setLocation","emit","displayLocation","dropdownClick","event","deleteValue","stopPropagation","inputAutoComplete","closePanel","selectRootElement","focus","locationSelectionEvent","parentForm","get","static","__ngFactoryType__","fesm2022_core","VBU","selectors","viewQuery","rf","ctx","MatAutocompleteTrigger","LocationSearchComponent_input_8_Template","$event","_r1","LocationSearchComponent_fcom_icon_12_Template","LocationSearchComponent_fcom_icon_13_Template","LocationSearchComponent_mat_option_16_Template","LocationSearchComponent_ng_container_18_Template","LocationSearchComponent_ng_template_20_Template","_c0","panelOpenInputLabel","inputLabel","options$","loading_r7","TimetableFormFields","ORIGIN","DESTINATION","DIRECT_FLIGHTS_ONLY","TimetableSearchComponent","fb","languageService","locationRouteCffService","store$","locationService","ButtonMode","ButtonSize","ButtonTheme","IconPosition","IconButtonTheme","IconButtonSize","getInitialLocation","boundType","take","skipWhile","code","switchMap","triggerLocationFetch","retrieveLocation","filter","Boolean","createForm","locationSuggestions$","getSuggestedLocations","localeValue","finShare","onLocationChanges","initialOrigin$","initialDestination$","reactiveForm","statusChanges","dispatch","origin","value","destination","directOnly","directFlights","switchLocations","newDestination","originLocationSearch","destinationLocationSearch","validateSelections","originChanged","ReactiveFormStatus","INVALID","hasError","originLocations$","startWith","debounceTime","AUTOCOMPLETE_DEBOUNCE_TIME","queryLocations","share","destinationLocations$","group","locationFormatValidator","Validators","required","validator","compose","locationsNotSameValidator","queryString","forOrigin","locale","searchText","locationMatchesFor","items","locationSuggestions","departures","destinations","control","currentOrigin","currentDestination","equals","sameOriginAndDestination","i1","i2","i3","i4","i5","_c2","SWITCH_FLIGHTS","LIGHT_TERTIARY_GHOST","MEDIUM","_c3","setStatus","setError","setResults","clearResults","noOfFlights_r1","AIRCRAFT_TILTED","TimetableCalendarComponent_ng_template_0_div_3_ng_container_1_ng_container_1_Template","noResults_r3","TimetableCalendarComponent_ng_template_0_div_3_ng_container_1_Template","results$","dayValue_r4","date","toString","TimetableCalendarComponent_ng_template_0_div_3_Template","dayString_r5","_r6","loadTimetables","EMBEDDED","_r7","monthChange","onDatesSelected","uiLabels_r8","minDate","maxDate","selectedDays$","dayTemplate_r9","CalendarNavigation","ARROWS","TimetableCalendarComponent","store","CalendarNavigationType","ngDestroyed$","Subject","identifier","uuid","endDate","plusMonths","getMonth","getAmountOfDaysInMonth","startDate","selectedDay","status$","flights","next","SearchActions","dates","selectedMonth","decls","vars","consts","template","TimetableCalendarComponent_ng_template_0_Template","TimetableCalendarComponent_div_2_Template","TimetableCalendarComponent_div_4_Template","TimetableCalendarComponent_fcom_calendar_6_Template","TimetableLocationsService","locationCodeToNameCache","getCityNameForLocationCode","bestGuessFor","jDH","factory","ɵfac","ctx_r0","search$","TimetableScheduleComponent_tr_21_div_2_Template","loading$","flight_r4","flightNumber","flight_r5","departureTime","flight_r6","icon","TimetableScheduleComponent_tr_24_ng_container_1_div_9_div_3_Template","flight_r7","arrivalTime","overnight","TimetableScheduleComponent_tr_24_ng_container_1_div_2_Template","TimetableScheduleComponent_tr_24_ng_container_1_div_4_Template","TimetableScheduleComponent_tr_24_ng_container_1_div_7_Template","TimetableScheduleComponent_tr_24_ng_container_1_div_9_Template","lastRow_r11","flights_r8","item_r3","duration","hours","minutes","i_r10","origin$","destination$","CHEVRON_RIGHT","_r2","$implicit","openModal","rowKeyPress","TimetableScheduleComponent_tr_24_ng_container_1_Template","TimetableScheduleComponent","timetableLocations","BoundType","detailsModalOpen","bounds$","combineLatest","searchDate","items$","bounds","bound","itinerary","isFlight","flight","getTime","departure","dateTime","arrival","isOvernight","aircraft","BUS_AIRCRAFT_CODE","BUS","AIRCRAFT_HORIZONTAL","item","selectedBound$","find","join","locations$","reduce","locationCodes","concat","unique","getLocations","closeModal","keyboardEvent","getKeyCodeFromEvent","keyCode","KeyCodes","ENTER","locations","getLocation","merge","accumulator","seed","operate","scanInternals","arguments","acc","cityCode","type","FinnairLocationType","AIRPORT","CITY","name","departureDate","getDate","arrivalDate","nextDay","plusDays","localYear","substring","indexOf","substr","TimetableScheduleComponent_tr_21_Template","TimetableScheduleComponent_tr_24_Template","outbound","NotificationLayout","EDGE_TO_EDGE","availability","start","end","SeasonalNotificationComponent","inputs","SeasonalNotificationComponent_fcom_notification_0_Template","data$","TimetableComponent_div_0_div_4_Template","TimetableComponent_div_0_div_8_Template","TimetableComponent_div_0_div_11_Template","template$","noSearchResults$","tmp_2_0","tmp_3_0","hasInitialLoadCompleted","backgroundImage$","TimetableComponent","pageService","breadcrumbService","configService","route","subscription","enablePageFeedback","queryParams","params","dest","getPageData","RootPaths","TIMETABLE_ROOT","tap","cmsPage","header","setMeta","obj","contentContentType","CmsContentType","CMChannel","setBreadcrumbNormal","navigationPathList","getBackgroundImageForCmsTemplate","originLocationCode","destinationLocationCode","Object","keys","showBookingWidget$","cfg","enableQualtricsPageFeedback","TimetableComponent_div_0_Template","TimetableComponent_cms_full_width_booking_widget_2_Template","TimetableComponent_ng_container_5_Template","timetableRoutes","path","component","TimetableRoutingComponent","LoginWidgetContext","LoginStatus","BOOKING","children","canActivate","TimetableSearchGuard","checkSelectedMonth","Date","currentYear","currentMonth","currentDate","getCurrentDateIfSearchIsBeforeToday","providedIn","TimetableRoutesModule","$C","G2t","RouterModule","forChild","statusReducer","createReducer","error","initialState","on","StatusActions","stateReducer","newSearch","weeklyFlights","DataActions","reducers","reducer","action","TimetableSearchService","GET_TIMETABLE_TIMEOUT_MS","sentryLogger","timetableService","getTimetable","numberOfDays","getTimetableForRoute$Response","instantSearchUrl","timeout","r","body","catchError","err","mapErrorForSentry","throwError","isPresent","message","groupBy","DataEffects","actions$","timetableSearchService","loadTimetables$","createEffect","ofType","withLatestFrom","prev","_search","results","hasNewSearch","_changes","firstDay","lastDay","getLastDayInMonth","forDateObj","searchDay","mergeMap","of","TimetableModule","ConfigService","imports","CommonModule","ComponentsModule","CommonBookingComponentsModule","NavigationModule","LoginModule","CmsModule","PipesModule","UiTranslateModule","UiComponentsModule","MatAutocompleteModule","ReactiveFormsModule","withConfig","callSetDisabledState","FinFormsModule","DirectiveModule","StoreModule","forFeature","TIMETABLE_FEATURE_KEY","EffectsModule"],"ignoreList":[],"sourceRoot":"webpack:///","sources":["./src/modules/timetable/store/selectors/index.ts","./src/modules/timetable/store/actions/search.actions.ts","./src/modules/timetable/interfaces/enums.ts","./src/modules/timetable/utils/timetable.utils.ts","./src/modules/timetable/components/location-search/location-search.component.html","./src/modules/timetable/components/location-search/location-search.component.ts","./src/modules/timetable/components/timetable-search/timetable-search.component.ts","./src/modules/timetable/components/timetable-search/timetable-search.component.html","./src/modules/timetable/store/actions/status.actions.ts","./src/modules/timetable/store/actions/data.actions.ts","./src/modules/timetable/components/timetable-calendar/timetable-calendar.component.html","./src/modules/timetable/components/timetable-calendar/timetable-calendar.component.ts","./src/modules/timetable/services/timetable-locations.service.ts","./src/modules/timetable/components/timetable-schedule/timetable-schedule.component.html","./src/modules/timetable/components/timetable-schedule/timetable-schedule.component.ts","./node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/src/internal/operators/reduce.ts","./src/modules/timetable/components/seasonal-notification/seasonal-notification.component.html","./src/modules/timetable/components/seasonal-notification/seasonal-notification.component.ts","./src/modules/timetable/components/timetable/timetable.component.html","./src/modules/timetable/components/timetable/timetable.component.ts","./src/modules/timetable/timetable.routes.ts","./src/modules/timetable/components/timetable-routing/timetable-routing.component.ts","./src/modules/timetable/components/timetable-routing/timetable-routing.component.html","./src/modules/timetable/guards/timetable-search.guard.ts","./src/modules/timetable/store/reducers/status.reducer.ts","./src/modules/timetable/store/reducers/search.reducer.ts","./src/modules/timetable/store/reducers/data.reducer.ts","./src/modules/timetable/store/reducers/index.ts","./src/modules/timetable/services/timetable-search.service.ts","./src/modules/timetable/store/effects/data.effects.ts","./src/modules/timetable/timetable.module.ts"],"sourcesContent":["import { createSelector, select } from '@ngrx/store';\n\nimport { StateSelector } from '@fcom/core/selectors/selector-utils';\n\nimport {\n DataState,\n SearchState,\n StatusState,\n TimetableFeatureState,\n TimetableState,\n} from '../../interfaces/store.interface';\n\nexport const selectTimetableState = (state: TimetableFeatureState): TimetableState => state.timetable;\n\nconst _selectSearch = createSelector(selectTimetableState, (state: TimetableState) => state.search);\nconst _selectData = createSelector(selectTimetableState, (state: TimetableState) => state.data);\nconst _selectStatus = createSelector(selectTimetableState, (state: TimetableState) => state.status);\n\nexport const selectStatusStatus = createSelector(_selectStatus, (state: StatusState) => state.status);\nexport const selectStatus = (): StateSelector => select(_selectStatus);\nexport const selectData = (): StateSelector => select(_selectData);\nexport const selectSearch = (): StateSelector => select(_selectSearch);\n","import { createAction, props, union } from '@ngrx/store';\n\nimport { SearchState } from '../../interfaces/index';\n\nexport const setSearch = createAction('[Timetable] setSearchTerms', props>());\nexport const clearSearch = createAction('[Timetable] clearSearchTerms');\n\nconst all = union({\n setSearch,\n clearSearch,\n});\n\nexport type SearchActionsUnion = typeof all;\n","export enum TimetableStatus {\n INITIAL,\n LOADING,\n READY,\n ERROR,\n}\n","import { Location } from '@fcom/core-api';\nimport { isNotBlank, isString, LocalDate } from '@fcom/core/utils';\n\nimport { SearchState } from '../interfaces';\n\nexport const isStringWithValue = (searchInput: string | Location | null): boolean =>\n isString(searchInput) && isNotBlank(searchInput);\n\nexport const getEarliestSearchDayInMonth = ({ year, month }: SearchState['selectedMonth']): LocalDate => {\n const today = LocalDate.now();\n const day = LocalDate.forDate(year, month, 1);\n\n return LocalDate.forDate(day.toDate().getFullYear(), day.localMonth, day.lt(today) ? today.localDay : 1);\n};\n\nexport const getLastDayInMonth = ({ year, month }: SearchState['selectedMonth']): LocalDate => {\n return LocalDate.forDateObj(new Date(year, month, 0));\n};\n\nexport const getCurrentDateIfSearchIsBeforeToday = (\n search: SearchState\n):\n | {\n year: number;\n month: number;\n day: LocalDate;\n }\n | undefined => {\n const currentDate = new Date();\n const currentYear = currentDate.getFullYear();\n const currentMonth = currentDate.getMonth() + 1;\n const { year, month } = search.selectedMonth;\n\n if (year < currentYear || (year === currentYear && month < currentMonth)) {\n return {\n year: currentYear,\n month: currentMonth,\n day: LocalDate.now(),\n };\n }\n};\n\nexport const normalizeLocalDate = (rawDate: string | LocalDate): LocalDate => {\n return typeof rawDate === 'string' ? (LocalDate.isLocalDate(rawDate) ? new LocalDate(rawDate) : undefined) : rawDate;\n};\n","
\n \n
\n \n
\n\n \n \n \n \n
\n\n \n \n
\n
\n
\n {{ option.cityName | finEmpty }} ({{ option.locationCode }})\n
\n
\n {{ option.title }}\n
\n
\n
\n
\n \n\n \n \n {{ 'timetable.aria.search.listItems' | finLocalization: { amount: options.length } }}\n \n \n\n\n\n
\n \n
\n
\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n Renderer2,\n ViewChild,\n} from '@angular/core';\nimport { AbstractControl, UntypedFormGroup } from '@angular/forms';\nimport { MatAutocompleteTrigger } from '@angular/material/autocomplete';\n\nimport { SvgLibraryIcon } from '@finnairoyj/fcom-ui-styles/enums';\nimport { Observable, Subscription } from 'rxjs';\nimport { distinctUntilChanged, map } from 'rxjs/operators';\n\nimport { LoaderType } from '@fcom/common';\nimport { Location } from '@fcom/core-api';\nimport { isObject, unsubscribe } from '@fcom/core/utils';\n\nimport { isStringWithValue } from '../../utils/timetable.utils';\n@Component({\n selector: 'fin-timetable-location-search',\n templateUrl: './location-search.component.html',\n styleUrls: ['./location-search.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LocationSearchComponent implements OnInit, OnDestroy {\n @ViewChild(MatAutocompleteTrigger, { read: MatAutocompleteTrigger }) inputAutoComplete: MatAutocompleteTrigger;\n\n public readonly LoaderType = LoaderType;\n public readonly SvgLibraryIcon = SvgLibraryIcon;\n\n @Input()\n options$: Observable;\n\n @Input()\n parentForm: UntypedFormGroup;\n\n @Input()\n controlName: string;\n\n @Input()\n inputLabel: string;\n\n @Input()\n panelOpenInputLabel: string;\n\n @Input()\n initialValue$: Observable;\n\n @Output()\n selectionDone: EventEmitter = new EventEmitter();\n\n inputHasValue$: Observable;\n\n panelOpen = false;\n\n private subscriptions: Subscription = new Subscription();\n\n constructor(private renderer: Renderer2) {}\n\n ngOnInit(): void {\n this.inputHasValue$ = this.ctrlField.valueChanges.pipe(\n distinctUntilChanged(),\n map((val) => isStringWithValue(val) || isObject(val))\n );\n\n this.subscriptions.add(\n this.initialValue$.subscribe((location) => {\n this.ctrlField.setValue(location);\n })\n );\n }\n\n ngOnDestroy(): void {\n this.subscriptions = unsubscribe(this.subscriptions);\n }\n\n setLocation(location: Location): void {\n this.ctrlField.setValue(location);\n this.selectionDone.emit(true);\n }\n\n displayLocation(location?: Location): string | undefined {\n return location ? `${location.title} (${location.locationCode})` : undefined;\n }\n\n dropdownClick(event: MouseEvent, deleteValue: boolean): void {\n event.stopPropagation();\n\n if (deleteValue) {\n this.ctrlField.setValue('');\n this.inputAutoComplete.closePanel();\n\n return;\n }\n\n this.renderer.selectRootElement(`#${this.controlName}`).focus();\n }\n\n locationSelectionEvent(): void {\n this.selectionDone.emit(true);\n }\n\n get ctrlField(): AbstractControl {\n return this.parentForm.get(this.controlName);\n }\n}\n","import { Component, ChangeDetectionStrategy, OnInit, OnDestroy, ViewChild } from '@angular/core';\nimport {\n AbstractControl,\n AbstractControlOptions,\n UntypedFormBuilder,\n UntypedFormGroup,\n ValidationErrors,\n Validators,\n} from '@angular/forms';\n\nimport { SvgLibraryIcon } from '@finnairoyj/fcom-ui-styles/enums';\nimport { Store } from '@ngrx/store';\nimport { Observable, Subscription } from 'rxjs';\nimport { debounceTime, filter, map, share, skipWhile, startWith, switchMap, take } from 'rxjs/operators';\n\nimport { LocationRouteCffService } from '@fcom/core';\nimport { Location, LocationSuggestions } from '@fcom/core-api';\nimport { locationFormatValidator } from '@fcom/service-forms/services/form-validators';\nimport { ReactiveFormStatus } from '@fcom/service-forms';\nimport { AUTOCOMPLETE_DEBOUNCE_TIME } from '@fcom/service-forms/services/utils';\nimport {\n ButtonMode,\n ButtonSize,\n ButtonTheme,\n IconButtonTheme,\n IconButtonSize,\n IconPosition,\n} from '@fcom/ui-components';\nimport { LanguageService } from '@fcom/ui-translate';\nimport { equals, isNotBlank, isObject, unsubscribe } from '@fcom/core/utils';\nimport { finShare } from '@fcom/rx';\nimport { LocationsService } from '@fcom/locations';\n\nimport { LocationSearchComponent } from '../location-search/location-search.component';\nimport { TimetableFeatureState } from '../../interfaces/index';\nimport { setSearch } from '../../store/actions/search.actions';\nimport { selectSearch } from '../..//store/selectors';\n\nenum TimetableFormFields {\n ORIGIN = 'origin',\n DESTINATION = 'destination',\n DIRECT_FLIGHTS_ONLY = 'directFlights',\n}\n\n@Component({\n selector: 'fin-timetable-search',\n styleUrls: ['./timetable-search.component.scss'],\n templateUrl: './timetable-search.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TimetableSearchComponent implements OnInit, OnDestroy {\n @ViewChild('originLocationSearch') originLocationSearch: LocationSearchComponent;\n @ViewChild('destinationLocationSearch') destinationLocationSearch: LocationSearchComponent;\n\n public readonly ButtonMode = ButtonMode;\n public readonly ButtonSize = ButtonSize;\n public readonly ButtonTheme = ButtonTheme;\n public readonly IconPosition = IconPosition;\n public readonly IconButtonTheme = IconButtonTheme;\n public readonly IconButtonSize = IconButtonSize;\n public readonly SvgLibraryIcon = SvgLibraryIcon;\n\n private subscriptions: Subscription = new Subscription();\n\n reactiveForm: UntypedFormGroup;\n originLocations$: Observable;\n destinationLocations$: Observable;\n initialOrigin$: Observable;\n initialDestination$: Observable;\n\n locationSuggestions$: Observable;\n\n constructor(\n private fb: UntypedFormBuilder,\n private languageService: LanguageService,\n private locationRouteCffService: LocationRouteCffService,\n private store$: Store,\n private locationService: LocationsService\n ) {}\n\n ngOnInit(): void {\n this.createForm();\n\n this.locationSuggestions$ = this.languageService.countryCode.pipe(\n switchMap((countryCode) =>\n this.locationRouteCffService.getSuggestedLocations(countryCode, this.languageService.localeValue)\n ),\n finShare()\n );\n\n this.onLocationChanges();\n\n this.initialOrigin$ = this.getInitialLocation('origin');\n this.initialDestination$ = this.getInitialLocation('destination');\n\n this.subscriptions.add(\n this.reactiveForm.statusChanges.pipe(filter((status) => status === 'VALID')).subscribe(() => {\n this.store$.dispatch(\n setSearch({\n origin: { code: this.origin.value.locationCode, title: this.origin.value.cityName },\n destination: { code: this.destination.value.locationCode, title: this.destination.value.cityName },\n directOnly: this.directFlights.value,\n })\n );\n })\n );\n }\n\n ngOnDestroy(): void {\n this.subscriptions = unsubscribe(this.subscriptions);\n }\n\n getInitialLocation = (boundType: string): Observable => {\n return this.store$.pipe(\n selectSearch(),\n take(1),\n skipWhile((search) => !search[boundType]?.code),\n switchMap((search) => {\n this.locationService.triggerLocationFetch(search[boundType]?.code);\n\n return this.locationService.retrieveLocation(search[boundType]?.code).pipe(filter(Boolean));\n })\n );\n };\n\n switchLocations(): void {\n const newDestination = this.origin.value;\n this.originLocationSearch.setLocation(this.destination.value);\n this.destinationLocationSearch.setLocation(newDestination);\n }\n\n validateSelections(originChanged: boolean): void {\n if (\n this.reactiveForm.status === ReactiveFormStatus.INVALID &&\n this.reactiveForm.hasError('sameOriginAndDestination')\n ) {\n originChanged ? this.destination.setValue(null) : this.origin.setValue(null);\n }\n }\n\n private onLocationChanges(): void {\n this.originLocations$ = this.origin.valueChanges.pipe(\n startWith(''),\n debounceTime(AUTOCOMPLETE_DEBOUNCE_TIME),\n switchMap((val) => this.queryLocations(val, true)),\n share()\n );\n this.destinationLocations$ = this.destination.valueChanges.pipe(\n startWith(''),\n debounceTime(AUTOCOMPLETE_DEBOUNCE_TIME),\n switchMap((val) => this.queryLocations(val, false)),\n share()\n );\n }\n\n private createForm(): void {\n this.reactiveForm = this.fb.group(\n {\n [TimetableFormFields.ORIGIN]: ['', [locationFormatValidator(), Validators.required]],\n [TimetableFormFields.DESTINATION]: ['', [locationFormatValidator(), Validators.required]],\n [TimetableFormFields.DIRECT_FLIGHTS_ONLY]: [false],\n },\n {\n validator: Validators.compose([this.locationsNotSameValidator, Validators.required]),\n } as AbstractControlOptions\n );\n }\n\n get origin(): AbstractControl {\n return this.reactiveForm.get(TimetableFormFields.ORIGIN);\n }\n\n get destination(): AbstractControl {\n return this.reactiveForm.get(TimetableFormFields.DESTINATION);\n }\n\n get directFlights(): AbstractControl {\n return this.reactiveForm.get(TimetableFormFields.DIRECT_FLIGHTS_ONLY);\n }\n\n private queryLocations(queryString: string | { title: string }, forOrigin: boolean): Observable {\n const locale: string = this.languageService.localeValue;\n const searchText = isObject(queryString) ? queryString.title : queryString;\n return isNotBlank(searchText)\n ? this.locationRouteCffService.locationMatchesFor(searchText, locale).pipe(map((data) => data.items))\n : this.locationSuggestions$.pipe(\n map((locationSuggestions) =>\n forOrigin ? locationSuggestions?.departures : locationSuggestions?.destinations\n )\n );\n }\n\n private locationsNotSameValidator(control: AbstractControl): ValidationErrors | null {\n const currentOrigin = control.get(TimetableFormFields.ORIGIN).value;\n const currentDestination = control.get(TimetableFormFields.DESTINATION).value;\n if (\n typeof currentOrigin !== 'string' &&\n typeof currentDestination !== 'string' &&\n equals(currentOrigin, currentDestination)\n ) {\n return { sameOriginAndDestination: true };\n }\n\n return null;\n }\n}\n","\n","import { createAction, props, union } from '@ngrx/store';\n\nimport { TimetableStatus, StatusState } from '../../interfaces/index';\n\nexport const setStatus = createAction('[Timetable] setStatus', props<{ status: TimetableStatus }>());\nexport const setError = createAction('[Timetable] setError', props<{ error: StatusState['error'] }>());\n\nconst all = union({\n setStatus,\n setError,\n});\n\nexport type StatusActionsUnion = typeof all;\n","import { createAction, props, union } from '@ngrx/store';\n\nimport { DataState } from '../../interfaces';\n\nexport const setResults = createAction('[Timetable] setData', props());\n\nexport const clearResults = createAction('[Timetable] clearResults');\n\nconst all = union({\n setResults,\n});\n\nexport type StateActionsUnion = typeof all;\n","\n
\n
{{ dayString }}
\n
\n \n 0\">\n {{ noOfFlights }}\n \n \n 0\"\n [class.grey-200-bg]=\"noResults || noOfFlights === 0\"\n >
\n \n
\n \n
\n\n\n
{{ 'timetable.error.title' | finLocalization }}
\n
{{ 'timetable.error.notLoading' | finLocalization }}
\n \n\n\n \n\n\n\n\n","import { Component, ChangeDetectionStrategy, OnInit, OnDestroy } from '@angular/core';\n\nimport { SvgLibraryIcon } from '@finnairoyj/fcom-ui-styles/enums';\nimport { v4 as uuid } from 'uuid';\nimport { Observable, Subject } from 'rxjs';\nimport { Store } from '@ngrx/store';\nimport { map } from 'rxjs/operators';\n\nimport { LoaderType } from '@fcom/common';\nimport { FinnairBoundItem } from '@fcom/dapi/api/models';\nimport { LocalDate } from '@fcom/core/utils';\nimport { DateSelection, Month } from '@fcom/ui-components/utils/date.interface';\nimport { CalendarNavigationType } from '@fcom/ui-components';\n\nimport { selectData, selectSearch, selectStatus } from '../../store/selectors';\nimport { SearchActions } from '../../store/actions';\nimport { TimetableFeatureState, TimetableStatus } from '../../interfaces/index';\nimport { getEarliestSearchDayInMonth, normalizeLocalDate } from '../../utils/timetable.utils';\n\n@Component({\n selector: 'fin-timetable-calendar',\n templateUrl: './timetable-calendar.component.html',\n styleUrls: ['./timetable-calendar.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TimetableCalendarComponent implements OnInit, OnDestroy {\n constructor(private store: Store) {}\n\n selectedDays$: Observable;\n status$: Observable;\n results$: Observable>;\n identifier: string;\n minDate: LocalDate;\n maxDate: LocalDate;\n\n readonly CalendarNavigation = CalendarNavigationType;\n public readonly TimetableStatus = TimetableStatus;\n public readonly LoaderType = LoaderType;\n public readonly SvgLibraryIcon = SvgLibraryIcon;\n\n private ngDestroyed$ = new Subject();\n\n ngOnInit(): void {\n this.identifier = uuid();\n const today = LocalDate.now().toDate();\n const endDate = LocalDate.now().plusMonths(12).toDate();\n\n this.minDate = LocalDate.forDate(today.getFullYear(), today.getMonth() + 1, 1);\n\n this.maxDate = LocalDate.forDate(\n endDate.getFullYear(),\n endDate.getMonth() + 1,\n LocalDate.getAmountOfDaysInMonth(endDate.getFullYear(), endDate.getMonth() + 1)\n );\n\n this.selectedDays$ = this.store\n .pipe(selectSearch())\n .pipe(map((search) => ({ startDate: normalizeLocalDate(search.selectedDay) })));\n\n this.status$ = this.store.pipe(selectStatus()).pipe(map((status) => status.status));\n this.results$ = this.store.pipe(selectData()).pipe(map((data) => data.flights));\n }\n\n ngOnDestroy(): void {\n this.ngDestroyed$.next(true);\n }\n\n loadTimetables(): void {\n this.store.dispatch(SearchActions.setSearch({}));\n }\n\n onDatesSelected(dates: DateSelection): void {\n this.store.dispatch(\n SearchActions.setSearch({\n selectedDay: dates.startDate,\n selectedMonth: {\n year: dates.startDate.toDate().getFullYear(),\n month: dates.startDate.toDate().getMonth() + 1,\n },\n })\n );\n }\n\n monthChange(month: Month): void {\n this.store.dispatch(\n SearchActions.setSearch({\n selectedDay: getEarliestSearchDayInMonth({\n year: month.year,\n month: month.value,\n }),\n selectedMonth: {\n year: month.year,\n month: month.value,\n },\n })\n );\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { map, Observable } from 'rxjs';\n\nimport { LocationRouteCffService } from '@fcom/core';\nimport { LanguageService } from '@fcom/ui-translate';\nimport { finShare } from '@fcom/rx';\n\n@Injectable()\nexport class TimetableLocationsService {\n constructor(\n private languageService: LanguageService,\n private locationRouteCffService: LocationRouteCffService\n ) {}\n locationCodeToNameCache: Record> = {};\n\n getCityNameForLocationCode = (locationCode: string): Observable => {\n if (this.locationCodeToNameCache[locationCode]) {\n return this.locationCodeToNameCache[locationCode];\n }\n\n this.locationCodeToNameCache[locationCode] = this.locationRouteCffService\n .bestGuessFor(locationCode, this.languageService.localeValue)\n .pipe(\n map((location) => location.cityName),\n finShare()\n );\n\n return this.locationCodeToNameCache[locationCode];\n };\n}\n","
\n \n \n \n \n \n {{ 'timetable.flightList.flight' | finLocalization }}\n \n \n \n \n \n \n \n \n \n
\n {{\n ((search$ | async).origin && (search$ | async).destination\n ? 'timetable.flightList.noFlights'\n : 'timetable.flightList.selectDate'\n ) | finLocalization\n }}\n
\n \n
\n \n \n \n \n {{ flight.flightNumber }}\n \n \n \n \n {{ flight.departureTime }}\n \n \n \n
\n
\n \n
\n
\n \n \n
\n
\n {{ flight.arrivalTime }}\n \n +1\n
\n
\n \n \n \n
\n {{ item.duration.hours + 'h ' + item.duration.minutes + 'min' }}\n
\n \n \n
\n

\n {{\n 'timetable.flightSummaryDetails'\n | finLocalization\n : {\n origin: item.origin$ | async,\n departureTime: item.departureTime,\n destination: item.destination$ | async,\n arrivalTime: item.arrivalTime,\n durationTime: item.duration.hours + 'h ' + item.duration.minutes + 'min',\n }\n }}\n

\n \n {{ 'timetable.viewDetails' | finLocalization }}\n \n \n \n \n \n
\n \n
\n \n
\n
\n {{\n 'timetable.flightList.caption' | finLocalization\n }}\n
\n {{ 'timetable.flightList.departure' | finLocalization }}\n \n {{ 'timetable.flightList.arrival' | finLocalization }}\n \n {{ 'timetable.flightList.duration' | finLocalization }}\n
\n
\n\n \n \n\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\n\nimport { SvgLibraryIcon } from '@finnairoyj/fcom-ui-styles/enums';\nimport { Store } from '@ngrx/store';\nimport { combineLatest, merge, Observable } from 'rxjs';\nimport { filter, map, reduce, switchMap } from 'rxjs/operators';\n\nimport { LocationRouteCffService } from '@fcom/core';\nimport { BoundType, LocationInfoMap } from '@fcom/dapi';\nimport { FinnairBoundItem, FinnairLocation, FinnairLocationType } from '@fcom/dapi/api/models';\nimport { LanguageService } from '@fcom/ui-translate';\nimport { getKeyCodeFromEvent, KeyCodes, LocalDate, unique } from '@fcom/core/utils';\nimport { BUS_AIRCRAFT_CODE } from '@fcom/common-booking/interfaces';\nimport { isFlight } from '@fcom/common-booking/utils/common-booking.utils';\n\nimport { TimetableLocationsService } from '../../services/timetable-locations.service';\nimport { SearchState, TimetableFeatureState, TimetableScheduleItem, TimetableStatus } from '../../interfaces';\nimport { selectData, selectSearch, selectStatus } from '../../store/selectors';\n\n@Component({\n selector: 'fin-timetable-schedule',\n templateUrl: './timetable-schedule.component.html',\n styleUrls: ['timetable-schedule.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TimetableScheduleComponent implements OnInit {\n public readonly BoundType = BoundType;\n readonly SvgLibraryIcon = SvgLibraryIcon;\n\n bounds$: Observable;\n items$: Observable;\n selectedBound$: Observable;\n locations$: Observable;\n search$: Observable;\n loading$: Observable;\n detailsModalOpen = false;\n\n constructor(\n private store: Store,\n private locationRouteCffService: LocationRouteCffService,\n private languageService: LanguageService,\n private timetableLocations: TimetableLocationsService\n ) {}\n\n ngOnInit(): void {\n this.search$ = this.store.pipe(selectSearch());\n this.loading$ = this.store.pipe(\n selectStatus(),\n map((state) => state.status === TimetableStatus.LOADING)\n );\n this.bounds$ = combineLatest([this.store.pipe(selectData()), this.search$]).pipe(\n filter(([data]) => {\n return !!data?.flights;\n }),\n map(([{ flights }, search]) => {\n const searchDate = search.selectedDay.toString();\n\n if (!flights || !flights[searchDate]) {\n return [];\n }\n\n return flights[searchDate];\n })\n );\n this.items$ = this.bounds$.pipe(\n map((bounds) =>\n bounds.map((bound) => {\n return {\n flights: bound.itinerary.filter(isFlight).map((flight) => {\n return {\n flightNumber: flight.flightNumber,\n departureTime: this.getTime(flight.departure.dateTime),\n arrivalTime: this.getTime(flight.arrival.dateTime),\n overnight: this.isOvernight(flight.departure.dateTime, flight.arrival.dateTime),\n icon:\n flight.aircraft?.code === BUS_AIRCRAFT_CODE ? SvgLibraryIcon.BUS : SvgLibraryIcon.AIRCRAFT_HORIZONTAL,\n };\n }),\n duration: bound.duration,\n origin$: this.timetableLocations.getCityNameForLocationCode(bound.departure.locationCode),\n destination$: this.timetableLocations.getCityNameForLocationCode(bound.arrival.locationCode),\n departureTime: this.getTime(bound.departure.dateTime),\n arrivalTime: this.getTime(bound.arrival.dateTime),\n };\n })\n )\n );\n }\n\n openModal(event: MouseEvent | KeyboardEvent, item: TimetableScheduleItem): void {\n event.stopPropagation();\n\n this.selectedBound$ = this.bounds$.pipe(\n map((bounds) =>\n bounds.find(\n (bound) =>\n bound.itinerary\n .filter(isFlight)\n .map((flight) => flight.flightNumber)\n .join(',') === item.flights.map((flight) => flight.flightNumber).join(',')\n )\n )\n );\n this.locations$ = this.selectedBound$.pipe(\n filter(Boolean),\n map((bound: FinnairBoundItem) => {\n return bound.itinerary\n .filter(isFlight)\n .reduce((locationCodes, flight) => {\n return locationCodes.concat([flight.departure.locationCode, flight.arrival.locationCode]);\n }, [])\n .filter(unique);\n }),\n switchMap((locationCodes: string[]) => {\n return this.getLocations(locationCodes);\n })\n );\n this.detailsModalOpen = true;\n }\n\n closeModal(): void {\n this.detailsModalOpen = false;\n }\n\n rowKeyPress(keyboardEvent: KeyboardEvent, item: TimetableScheduleItem): void {\n if (getKeyCodeFromEvent(keyboardEvent).keyCode !== KeyCodes.ENTER.keyCode) {\n return;\n }\n\n this.openModal(keyboardEvent, item);\n }\n\n private getLocations(locationCodes: string[]): Observable {\n const locations: Observable[] = locationCodes.map((locationCode) =>\n this.getLocation(locationCode)\n );\n return merge(...locations).pipe(\n reduce((acc, location) => {\n acc[location.cityCode] = location;\n return acc;\n }, {} as LocationInfoMap)\n );\n }\n\n private getLocation(locationCode: string): Observable {\n return this.locationRouteCffService.bestGuessFor(locationCode, this.languageService.localeValue).pipe(\n map((location) => {\n /**\n * TODO: remove the casting when backend FinnairPicture is fixed\n */\n return {\n ...location,\n type: location.type === 'airport' ? FinnairLocationType.AIRPORT : FinnairLocationType.CITY,\n cityCode: locationCode,\n name: location.title,\n } as unknown as FinnairLocation;\n })\n );\n }\n\n private isOvernight(departureTime: string, arrivalTime: string): boolean {\n const departureDate: LocalDate = new LocalDate(this.getDate(departureTime));\n const arrivalDate: LocalDate = new LocalDate(this.getDate(arrivalTime));\n const nextDay: LocalDate = departureDate.plusDays(1);\n return (\n arrivalDate.localDay === nextDay.localDay &&\n arrivalDate.localMonth === nextDay.localMonth &&\n arrivalDate.localYear === nextDay.localYear\n );\n }\n\n private getDate(dateTime: string): string {\n return dateTime.substring(0, dateTime.indexOf('T'));\n }\n\n private getTime(dateTime: string): string {\n return dateTime.substr(dateTime.indexOf('T') + 1, 5);\n }\n}\n","import { scanInternals } from './scanInternals';\nimport { OperatorFunction } from '../types';\nimport { operate } from '../util/lift';\n\nexport function reduce(accumulator: (acc: A | V, value: V, index: number) => A): OperatorFunction;\nexport function reduce(accumulator: (acc: A, value: V, index: number) => A, seed: A): OperatorFunction;\nexport function reduce(accumulator: (acc: A | S, value: V, index: number) => A, seed: S): OperatorFunction;\n\n/**\n * Applies an accumulator function over the source Observable, and returns the\n * accumulated result when the source completes, given an optional seed value.\n *\n * Combines together all values emitted on the source,\n * using an accumulator function that knows how to join a new source value into\n * the accumulation from the past.\n *\n * ![](reduce.png)\n *\n * Like\n * [Array.prototype.reduce()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce),\n * `reduce` applies an `accumulator` function against an accumulation and each\n * value of the source Observable (from the past) to reduce it to a single\n * value, emitted on the output Observable. Note that `reduce` will only emit\n * one value, only when the source Observable completes. It is equivalent to\n * applying operator {@link scan} followed by operator {@link last}.\n *\n * Returns an Observable that applies a specified `accumulator` function to each\n * item emitted by the source Observable. If a `seed` value is specified, then\n * that value will be used as the initial value for the accumulator. If no seed\n * value is specified, the first item of the source is used as the seed.\n *\n * ## Example\n *\n * Count the number of click events that happened in 5 seconds\n *\n * ```ts\n * import { fromEvent, takeUntil, interval, map, reduce } from 'rxjs';\n *\n * const clicksInFiveSeconds = fromEvent(document, 'click')\n * .pipe(takeUntil(interval(5000)));\n *\n * const ones = clicksInFiveSeconds.pipe(map(() => 1));\n * const seed = 0;\n * const count = ones.pipe(reduce((acc, one) => acc + one, seed));\n *\n * count.subscribe(x => console.log(x));\n * ```\n *\n * @see {@link count}\n * @see {@link expand}\n * @see {@link mergeScan}\n * @see {@link scan}\n *\n * @param accumulator The accumulator function called on each source value.\n * @param seed The initial accumulation value.\n * @return A function that returns an Observable that emits a single value that\n * is the result of accumulating the values emitted by the source Observable.\n */\nexport function reduce(accumulator: (acc: V | A, value: V, index: number) => A, seed?: any): OperatorFunction {\n return operate(scanInternals(accumulator, seed, arguments.length >= 2, false, true));\n}\n","\n
\n 1 ? 'timetable.seasonalNotification.plural' : 'timetable.seasonalNotification.singular')\n | finLocalization\n : {\n origin: origin,\n destination: destination,\n start: availability[0].start | finDateFormat: 'MMMM yyyy',\n end: availability[0].end | finDateFormat: 'MMMM yyyy',\n start2: availability?.length > 1 ? (availability[1].start | finDateFormat: 'MMMM yyyy') : null,\n end2: availability?.length > 1 ? (availability[1].end | finDateFormat: 'MMMM yyyy') : null,\n }\n \"\n >

\n

\n
\n
\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\n\nimport { AvailabilityEntry } from '@fcom/dapi/api/models';\nimport { NotificationLayout } from '@fcom/ui-components';\n\n@Component({\n selector: 'fin-seasonal-notification',\n templateUrl: './seasonal-notification.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SeasonalNotificationComponent {\n @Input() availability: AvailabilityEntry[];\n @Input() destination: string;\n @Input() origin: string;\n\n readonly NotificationLayout = NotificationLayout;\n}\n","
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n \n {{ search$ | finMap: 'origin.title' | async }} ({{ search$ | finMap: 'origin.code' | async }}) -\n {{ search$ | finMap: 'destination.title' | async }} ({{ search$ | finMap: 'destination.code' | async }})\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n\n\n\n\n\n\n \n\n","import { Component, ChangeDetectionStrategy, OnInit, OnDestroy } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\n\nimport { Store } from '@ngrx/store';\nimport { distinctUntilChanged, filter, map, tap, take } from 'rxjs/operators';\nimport { Observable, Subscription } from 'rxjs';\n\nimport { ConfigService, RootPaths } from '@fcom/core';\nimport { BreadcrumbService, CmsPageService, LoaderType } from '@fcom/common';\nimport { CmsContentType, CmsPage, CmsImageData, CmsTemplate } from '@fcom/core-api';\nimport { getBackgroundImageForCmsTemplate } from '@fcom/cms/services/cms-utils/cms-utils';\nimport { BookingLocationCodes } from '@fcom/common/interfaces/booking';\nimport { unsubscribe } from '@fcom/core/utils';\n\nimport { selectData, selectSearch, selectStatus } from '../../store/selectors';\nimport { setSearch } from '../../store/actions/search.actions';\nimport { DataState, SearchState, TimetableFeatureState, TimetableStatus } from '../../interfaces/index';\n\n@Component({\n selector: 'fin-timetable',\n templateUrl: './timetable.component.html',\n styleUrls: ['./timetable.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TimetableComponent implements OnInit, OnDestroy {\n search$: Observable;\n locations$: Observable;\n data$: Observable;\n noSearchResults$: Observable;\n showBookingWidget$: Observable;\n hasInitialLoadCompleted = false;\n\n template$: Observable;\n backgroundImage$: Observable;\n\n readonly LoaderType = LoaderType;\n private subscription: Subscription = new Subscription();\n\n enablePageFeedback = false;\n\n constructor(\n private store: Store,\n private pageService: CmsPageService,\n private breadcrumbService: BreadcrumbService,\n private configService: ConfigService,\n private route: ActivatedRoute\n ) {}\n\n ngOnInit(): void {\n this.route.queryParams.pipe(take(1)).subscribe((params) => {\n if (!params?.origin || !params?.dest) {\n return;\n }\n this.store.dispatch(\n setSearch({\n origin: { code: params.origin },\n destination: { code: params.dest },\n })\n );\n });\n\n this.template$ = this.pageService.getPageData(RootPaths.TIMETABLE_ROOT).pipe(\n filter((template) => template.status !== 404),\n tap((template) => {\n const cmsPage = template?.header?.[0] as CmsPage;\n\n this.pageService.setMeta(\n template.header.find((obj) => obj.contentContentType === CmsContentType.CMChannel) as CmsPage\n );\n this.breadcrumbService.setBreadcrumbNormal(cmsPage.navigationPathList);\n })\n );\n\n this.backgroundImage$ = getBackgroundImageForCmsTemplate(this.template$);\n\n this.search$ = this.store.pipe(selectSearch());\n this.locations$ = this.search$.pipe(\n map((search) => {\n return [\n {\n originLocationCode: search.origin.code,\n destinationLocationCode: search.destination.code,\n },\n ];\n })\n );\n this.data$ = this.store.pipe(selectData());\n this.noSearchResults$ = this.data$.pipe(\n map((data) => {\n return data?.flights && Object.keys(data.flights).length === 0;\n })\n );\n\n this.showBookingWidget$ = this.store.pipe(selectStatus()).pipe(\n map((status) => status.status),\n map((status) => {\n if (this.hasInitialLoadCompleted) {\n return true;\n }\n\n if (status === TimetableStatus.READY || status === TimetableStatus.ERROR) {\n this.hasInitialLoadCompleted = true;\n\n return true;\n }\n\n return false;\n }),\n distinctUntilChanged()\n );\n\n if (this.configService.cfg.enableQualtricsPageFeedback) {\n this.enablePageFeedback = true;\n }\n }\n\n ngOnDestroy(): void {\n unsubscribe(this.subscription);\n }\n}\n","import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\n\nimport { TimetableRoutingComponent } from './components/timetable-routing/timetable-routing.component';\nimport { TimetableSearchGuard } from './guards/timetable-search.guard';\n\nexport const timetableRoutes: Routes = [\n {\n path: '',\n component: TimetableRoutingComponent,\n children: [],\n canActivate: [TimetableSearchGuard],\n },\n];\n\n@NgModule({\n imports: [RouterModule.forChild(timetableRoutes)],\n declarations: [],\n providers: [],\n exports: [RouterModule],\n})\nexport class TimetableRoutesModule {}\n","import { Component, ChangeDetectionStrategy, ViewChild } from '@angular/core';\n\nimport { LoginWidgetComponent, LoginWidgetContext } from '@fcom/common/login';\nimport { LoginStatus } from '@fcom/core-api/login';\n\n@Component({\n selector: 'fin-timetable-routing',\n templateUrl: './timetable-routing.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TimetableRoutingComponent {\n @ViewChild('loginWidget', { static: true }) loginWidget: LoginWidgetComponent;\n\n public readonly LoginWidgetContext = LoginWidgetContext;\n public readonly LoginStatus = LoginStatus;\n}\n","\n\n\n\n\n","import { Injectable } from '@angular/core';\nimport { CanActivate } from '@angular/router';\n\nimport { Observable } from 'rxjs';\nimport { Store } from '@ngrx/store';\nimport { tap, take, map } from 'rxjs/operators';\n\nimport { LocalDate } from '@fcom/core/utils';\n\nimport { selectSearch } from '../store/selectors';\nimport { SearchState } from '../interfaces';\nimport { setSearch } from '../store/actions/search.actions';\nimport { getCurrentDateIfSearchIsBeforeToday } from '../utils/timetable.utils';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class TimetableSearchGuard implements CanActivate {\n constructor(private store$: Store) {}\n\n /**\n * This guard protects from the store from rehydrating from session storage with dates before the current date.\n *\n * Without this requests will be made to the backed for current dates, causing 400 bad request errors.\n */\n canActivate(): Observable {\n return this.store$.pipe(\n selectSearch(),\n tap((search: SearchState) => this.checkSelectedMonth(search)),\n map(() => true),\n take(1)\n );\n }\n\n private checkSelectedMonth(search: SearchState): void {\n const today = new Date();\n const currentYear = today.getFullYear();\n const currentMonth = today.getMonth() + 1;\n const currentDate = getCurrentDateIfSearchIsBeforeToday(search);\n\n if (currentDate) {\n this.store$.dispatch(\n setSearch({\n selectedMonth: {\n year: currentYear,\n month: currentMonth,\n },\n selectedDay: LocalDate.now(),\n })\n );\n }\n }\n}\n","import { createReducer, on } from '@ngrx/store';\n\nimport { TimetableStatus } from '../../interfaces/index';\nimport { StatusState } from '../../interfaces/store.interface';\nimport { StatusActions } from '../actions';\n\nexport const initialState: StatusState = {\n status: TimetableStatus.INITIAL,\n error: null,\n};\n\nconst statusReducer = createReducer(\n initialState,\n on(StatusActions.setStatus, (state, { status }) => ({\n ...state,\n status,\n })),\n on(StatusActions.setError, (state, { error }) => ({\n ...state,\n error,\n }))\n);\n\nexport function reducer(state: StatusState, action: StatusActions.StatusActionsUnion): StatusState {\n return statusReducer(state, action);\n}\n","import { createReducer, on } from '@ngrx/store';\n\nimport { LocalDate } from '@fcom/core/utils';\n\nimport { SearchState } from '../../interfaces/store.interface';\nimport { SearchActions } from '../actions';\n\nconst today = LocalDate.now();\n\nexport const initialState: SearchState = {\n origin: null,\n destination: null,\n selectedDay: today,\n selectedMonth: {\n year: today.toDate().getFullYear(),\n month: today.toDate().getMonth() + 1,\n },\n directOnly: false,\n};\n\nconst stateReducer = createReducer(\n initialState,\n on(SearchActions.setSearch, (state, newSearch) => ({\n ...state,\n ...newSearch,\n })),\n on(SearchActions.clearSearch, () => ({\n ...initialState,\n }))\n);\n\nexport function reducer(state: SearchState, action: SearchActions.SearchActionsUnion): SearchState {\n return stateReducer(state, action);\n}\n","import { createReducer, on } from '@ngrx/store';\n\nimport { DataState } from '../../interfaces';\nimport { DataActions } from '../actions';\n\nexport const initialState: DataState = {\n availability: null,\n flights: null,\n weeklyFlights: null,\n};\n\nconst statusReducer = createReducer(\n initialState,\n on(DataActions.setResults, (state, data) => ({\n ...state,\n availability: data.availability,\n weeklyFlights: data.weeklyFlights,\n flights: {\n ...state.flights,\n ...data.flights,\n },\n })),\n on(DataActions.clearResults, () => ({\n ...initialState,\n }))\n);\n\nexport function reducer(state: DataState, action: DataActions.StateActionsUnion): DataState {\n return statusReducer(state, action);\n}\n","import { ActionReducerMap } from '@ngrx/store';\n\nimport * as fromStatus from './status.reducer';\nimport * as fromSearch from './search.reducer';\nimport * as fromData from './data.reducer';\nimport { TimetableState } from '../../interfaces/store.interface';\n\nexport const reducers: ActionReducerMap = {\n status: fromStatus.reducer,\n search: fromSearch.reducer,\n data: fromData.reducer,\n};\n","import { Injectable } from '@angular/core';\nimport { HttpResponse } from '@angular/common/http';\n\nimport { Observable, throwError } from 'rxjs';\nimport { timeout, catchError, map, share } from 'rxjs/operators';\n\nimport { ConfigService, SentryLogger, mapErrorForSentry } from '@fcom/core';\nimport { FinnairBoundItem, TimetableFlights } from '@fcom/dapi/api/models';\nimport { groupBy, isPresent, LocalDate } from '@fcom/core/utils';\nimport { TimetableService } from '@fcom/dapi/api/services';\n\nimport { DataState, SearchState } from '../interfaces/index';\nimport { getEarliestSearchDayInMonth } from '../utils/timetable.utils';\n\n@Injectable()\nexport class TimetableSearchService {\n static readonly GET_TIMETABLE_TIMEOUT_MS = 20000;\n\n constructor(\n private configService: ConfigService,\n private sentryLogger: SentryLogger,\n private timetableService: TimetableService\n ) {}\n\n getTimetable(search: SearchState): Observable {\n const departureDate: LocalDate = getEarliestSearchDayInMonth(search.selectedMonth);\n // fetch for requested date and remainder of month\n const numberOfDays: number =\n LocalDate.getAmountOfDaysInMonth(departureDate.localYear, departureDate.localMonth) - departureDate.localDay + 1;\n const params = {\n originLocationCode: search.origin.code,\n destinationLocationCode: search.destination.code,\n departureDate: departureDate.toString(),\n numberOfDays,\n directFlights: search.directOnly,\n };\n\n return this.timetableService.getTimetableForRoute$Response(this.configService.cfg.instantSearchUrl, params).pipe(\n timeout(TimetableSearchService.GET_TIMETABLE_TIMEOUT_MS),\n map((r: HttpResponse) => r.body as TimetableFlights),\n catchError((err: unknown) => {\n this.sentryLogger.error('Error fetching timetable flights', {\n error: mapErrorForSentry(err),\n });\n\n return throwError(() => err);\n }),\n map((timetable) => {\n if (!isPresent(timetable)) {\n throw { code: 400, message: 'Malformed response' };\n }\n\n const bounds: FinnairBoundItem[] = timetable.flights;\n const flights = groupBy(bounds, (bound) =>\n bound.departure.dateTime.substring(0, bound.departure.dateTime.indexOf('T'))\n );\n\n return {\n availability: timetable.availability,\n flights,\n weeklyFlights: timetable.weeklyFlights,\n };\n }),\n share()\n );\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { Actions, createEffect, ofType } from '@ngrx/effects';\nimport { Store } from '@ngrx/store';\nimport { catchError, distinctUntilChanged, filter, map, mergeMap, tap, withLatestFrom } from 'rxjs/operators';\nimport { combineLatest, of } from 'rxjs';\n\nimport { equals } from '@fcom/core/utils';\n\nimport { initialState } from '../../store/reducers/data.reducer';\nimport { TimetableSearchService } from '../../services/timetable-search.service';\nimport { DataActions, SearchActions, StatusActions } from '../actions';\nimport { selectData, selectSearch } from '../selectors';\nimport { SearchState, TimetableFeatureState, TimetableStatus } from '../../interfaces/index';\nimport { getEarliestSearchDayInMonth, getLastDayInMonth } from '../../utils/timetable.utils';\n\nconst hasNewSearch = (prev: SearchState, next: SearchState): boolean => {\n if (!next.origin && !next.destination && !next.directOnly) {\n return false;\n }\n\n return prev.destination !== next.destination || prev.origin !== next.origin || prev.directOnly !== next.directOnly;\n};\n\n@Injectable()\nexport class DataEffects {\n loadTimetables$ = createEffect(\n () =>\n this.actions$.pipe(\n ofType(SearchActions.setSearch.type),\n withLatestFrom(\n combineLatest([\n this.store$.pipe(selectSearch()),\n this.store$.pipe(selectData()).pipe(map((data) => data.flights)),\n ])\n ),\n distinctUntilChanged(([prev], [next, [_search, results]]) => {\n if (equals(prev, next)) {\n return true;\n }\n\n if (results && hasNewSearch(prev, next)) {\n this.store$.dispatch(DataActions.clearResults());\n this.store$.dispatch(SearchActions.setSearch({}));\n\n return true;\n }\n\n return false;\n }),\n filter(([_changes, [search, results]]) => {\n const firstDay = getEarliestSearchDayInMonth(search.selectedMonth).toString();\n const lastDay = getLastDayInMonth(search.selectedMonth).toString();\n\n if (results && results[firstDay] && results[lastDay]) {\n return false;\n }\n\n return Boolean(search.origin && search.destination && search.selectedMonth);\n }),\n map(([_changes, [search]]) => {\n return {\n ...search,\n searchDay: getEarliestSearchDayInMonth(search.selectedMonth),\n };\n }),\n tap(() => {\n this.store$.dispatch(StatusActions.setStatus({ status: TimetableStatus.LOADING }));\n }),\n mergeMap((search) =>\n this.timetableSearchService.getTimetable(search).pipe(\n map((timetable) => {\n this.store$.dispatch(DataActions.setResults(timetable));\n this.store$.dispatch(StatusActions.setStatus({ status: TimetableStatus.READY }));\n }),\n catchError(() => {\n this.store$.dispatch(DataActions.setResults(initialState));\n this.store$.dispatch(StatusActions.setStatus({ status: TimetableStatus.ERROR }));\n\n return of(null);\n })\n )\n )\n ),\n {\n dispatch: false,\n }\n );\n\n constructor(\n private store$: Store,\n private actions$: Actions,\n private timetableSearchService: TimetableSearchService\n ) {}\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\n\nimport { StoreModule } from '@ngrx/store';\nimport { EffectsModule } from '@ngrx/effects';\n\nimport { CmsModule } from '@fcom/cms';\nimport { ComponentsModule, DirectiveModule, FinFormsModule, NavigationModule, PipesModule } from '@fcom/common';\nimport { LoginModule } from '@fcom/common/login';\nimport { CommonBookingComponentsModule } from '@fcom/common-booking';\nimport { UiTranslateModule } from '@fcom/ui-translate/ui-translate.module';\nimport { UiComponentsModule } from '@fcom/ui-components';\nimport { ConfigService } from '@fcom/core';\n\nimport { TimetableRoutingComponent } from './components/timetable-routing/timetable-routing.component';\nimport { TimetableRoutesModule } from './timetable.routes';\nimport { TIMETABLE_FEATURE_KEY } from './constants';\nimport { reducers } from './store/reducers';\nimport { TimetableComponent } from './components/timetable/timetable.component';\nimport { TimetableSearchComponent } from './components/timetable-search/timetable-search.component';\nimport { TimetableCalendarComponent } from './components/timetable-calendar/timetable-calendar.component';\nimport { TimetableScheduleComponent } from './components/timetable-schedule/timetable-schedule.component';\nimport { LocationSearchComponent } from './components/location-search/location-search.component';\nimport { TimetableSearchService } from './services/timetable-search.service';\nimport { SeasonalNotificationComponent } from './components/seasonal-notification/seasonal-notification.component';\nimport { DataEffects } from './store/effects/index';\nimport { TimetableLocationsService } from './services/timetable-locations.service';\n\n@NgModule({\n imports: [\n CommonModule,\n ComponentsModule,\n CommonBookingComponentsModule,\n NavigationModule,\n TimetableRoutesModule,\n LoginModule,\n CmsModule,\n ComponentsModule,\n PipesModule,\n UiTranslateModule,\n UiComponentsModule,\n PipesModule,\n UiComponentsModule,\n MatAutocompleteModule,\n ReactiveFormsModule.withConfig({\n callSetDisabledState: 'whenDisabledForLegacyCode',\n }),\n FinFormsModule,\n DirectiveModule,\n StoreModule.forFeature(TIMETABLE_FEATURE_KEY, reducers),\n EffectsModule.forFeature([DataEffects]),\n ],\n declarations: [\n TimetableRoutingComponent,\n TimetableComponent,\n TimetableSearchComponent,\n TimetableCalendarComponent,\n TimetableScheduleComponent,\n LocationSearchComponent,\n SeasonalNotificationComponent,\n ],\n providers: [TimetableSearchService, TimetableLocationsService, ConfigService],\n exports: [],\n})\nexport class TimetableModule {}\n"],"x_google_ignoreList":[15]}