@qite/tide-components 1.0.9 → 1.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,8 +2,8 @@
2
2
  import * as React from 'react';
3
3
  import React__default, { useLayoutEffect as useLayoutEffect$1, useEffect, useContext, useState, useRef, useCallback, useMemo } from 'react';
4
4
  import JsonURL from '@jsonurl/jsonurl';
5
- import { format as format$2, isToday, getDate, startOfWeek, startOfMonth, endOfWeek, addWeeks, endOfMonth, eachDayOfInterval, getYear, getMonth, getISOWeek, getISODay, isSameMonth, startOfDay, isAfter, isSameDay, isEqual, isWithinInterval, endOfDay, isBefore, differenceInCalendarDays, addMonths, addDays, formatISO, addYears, differenceInYears, parseISO, differenceInMinutes, isValid, parse, startOfToday } from 'date-fns';
6
- import { merge, cloneDeep, isNil, isArray as isArray$1, compact, isEmpty as isEmpty$1, range, chunk, isFunction as isFunction$1, clamp, now, omit, isPlainObject as isPlainObject$1, mapValues, pickBy, first, orderBy, uniq, uniqBy, sortBy, sum, last, findIndex as findIndex$1, set, get, isEqual as isEqual$1, groupBy, minBy, concat, flatMap } from 'lodash';
5
+ import { format as format$2, isToday, getDate, startOfWeek, startOfMonth, endOfWeek, addWeeks, endOfMonth, eachDayOfInterval, getYear, getMonth, getISOWeek, getISODay, isSameMonth, startOfDay, isAfter, isSameDay, isEqual, isWithinInterval, endOfDay, isBefore, differenceInCalendarDays, addMonths, addDays, formatISO, addYears, differenceInYears, parseISO, differenceInMinutes, parse, isValid, startOfToday } from 'date-fns';
6
+ import { merge, cloneDeep, isNil, isArray as isArray$1, compact, isEmpty as isEmpty$1, range, chunk, isFunction as isFunction$1, clamp, now, omit, isPlainObject as isPlainObject$1, mapValues, pickBy, first, orderBy, uniq, uniqBy, sortBy, sum, last, findIndex as findIndex$1, get, set, isEqual as isEqual$1, groupBy, minBy, concat, flatMap } from 'lodash';
7
7
  import { arSA, da, de, enGB, es, fr, is, it, nl, nb, pl, pt, sv, ja, enUS } from 'date-fns/locale';
8
8
  import { usePopper } from 'react-popper';
9
9
  import { useSelector, useDispatch, Provider } from 'react-redux';
@@ -95,7 +95,7 @@ var PRODUCT$f = {
95
95
  PER_PERSON_PER_NIGHT: "لكل شخص / لكل ليلة",
96
96
  BOOK_NOW: "احجز الآن",
97
97
  TO_YOUR_OFFER: "إلى عرضك",
98
- NOT_AVAILABLE: "غير متاح",
98
+ NOT_AVAILABLE: "غير متاح — يرجى اختيار تاريخ آخر",
99
99
  NUMBER_OF_ROOMS: "عدد الغرف",
100
100
  AGE_BY_DEPARTURE_DATE: "عمر الأطفال عند تاريخ المغادرة",
101
101
  YEAR: "سنة/سنوات",
@@ -182,6 +182,12 @@ var TRAVELERS_FORM$f = {
182
182
  FIRST_NAME: "الاسم الأول",
183
183
  LAST_NAME: "اسم العائلة",
184
184
  BIRTHDATE: "تاريخ الميلاد",
185
+ WEIGHT: "الوزن",
186
+ WEIGHT_UNIT_KG: "kg",
187
+ WEIGHT_UNIT_LB: "lb",
188
+ HEIGHT: "الطول",
189
+ HEIGHT_UNIT_CM: "cm",
190
+ HEIGHT_UNIT_FT_IN: "ft/in",
185
191
  STREET: "الشارع",
186
192
  STREET_PLACEHOLDER: "اسم الشارع",
187
193
  HOUSE_NUMBER: "رقم المنزل",
@@ -439,7 +445,7 @@ var SRP$f = {
439
445
  };
440
446
  var ITINERARY$f = {
441
447
  DAY: "اليوم",
442
- NO_ITEMS: "لا توجد عناصر لهذا اليوم."
448
+ NO_ITEMS: "لم يتم اختيار أنشطة لهذا اليوم."
443
449
  };
444
450
  var FORM$f = {
445
451
  LOADING: "جاري تحميل النموذج...",
@@ -542,7 +548,7 @@ var PRODUCT$e = {
542
548
  PER_PERSON_PER_NIGHT: "Per person / per nat",
543
549
  BOOK_NOW: "Book nu",
544
550
  TO_YOUR_OFFER: "Til dit tilbud",
545
- NOT_AVAILABLE: "Ikke tilgængelig",
551
+ NOT_AVAILABLE: "Ikke tilgængelig — vælg venligst en anden dato",
546
552
  NUMBER_OF_ROOMS: "Antal værelser",
547
553
  AGE_BY_DEPARTURE_DATE: "Børns alder på afrejsedato",
548
554
  YEAR: "år",
@@ -629,6 +635,12 @@ var TRAVELERS_FORM$e = {
629
635
  FIRST_NAME: "Fornavn",
630
636
  LAST_NAME: "Efternavn",
631
637
  BIRTHDATE: "Fødselsdato",
638
+ WEIGHT: "Vægt",
639
+ WEIGHT_UNIT_KG: "kg",
640
+ WEIGHT_UNIT_LB: "lb",
641
+ HEIGHT: "Højde",
642
+ HEIGHT_UNIT_CM: "cm",
643
+ HEIGHT_UNIT_FT_IN: "ft/in",
632
644
  STREET: "Gade",
633
645
  STREET_PLACEHOLDER: "Din gade",
634
646
  HOUSE_NUMBER: "Husnummer",
@@ -886,7 +898,7 @@ var SRP$e = {
886
898
  };
887
899
  var ITINERARY$e = {
888
900
  DAY: "Dag",
889
- NO_ITEMS: "Ingen elementer for denne dag."
901
+ NO_ITEMS: "Ingen aktiviteter valgt for denne dag."
890
902
  };
891
903
  var FORM$e = {
892
904
  LOADING: "Indlæser formular...",
@@ -989,7 +1001,7 @@ var PRODUCT$d = {
989
1001
  PER_PERSON_PER_NIGHT: "Pro Person / pro Nacht",
990
1002
  BOOK_NOW: "Jetzt buchen",
991
1003
  TO_YOUR_OFFER: "Zu Ihrem Angebot",
992
- NOT_AVAILABLE: "Nicht verfügbar",
1004
+ NOT_AVAILABLE: "Nicht verfügbar — bitte wählen Sie ein anderes Datum",
993
1005
  NUMBER_OF_ROOMS: "Anzahl der Zimmer",
994
1006
  AGE_BY_DEPARTURE_DATE: "Alter der Kinder am Abreisedatum",
995
1007
  YEAR: "Jahr(e)",
@@ -1076,6 +1088,12 @@ var TRAVELERS_FORM$d = {
1076
1088
  FIRST_NAME: "Vorname",
1077
1089
  LAST_NAME: "Nachname",
1078
1090
  BIRTHDATE: "Geburtsdatum",
1091
+ WEIGHT: "Gewicht",
1092
+ WEIGHT_UNIT_KG: "kg",
1093
+ WEIGHT_UNIT_LB: "lb",
1094
+ HEIGHT: "Größe",
1095
+ HEIGHT_UNIT_CM: "cm",
1096
+ HEIGHT_UNIT_FT_IN: "ft/in",
1079
1097
  STREET: "Straße",
1080
1098
  STREET_PLACEHOLDER: "Ihre Straße",
1081
1099
  HOUSE_NUMBER: "Hausnummer",
@@ -1333,7 +1351,7 @@ var SRP$d = {
1333
1351
  };
1334
1352
  var ITINERARY$d = {
1335
1353
  DAY: "Tag",
1336
- NO_ITEMS: "Keine Elemente für diesen Tag."
1354
+ NO_ITEMS: "Keine Aktivitäten für diesen Tag ausgewählt."
1337
1355
  };
1338
1356
  var FORM$d = {
1339
1357
  LOADING: "Formular wird geladen...",
@@ -1436,7 +1454,7 @@ var PRODUCT$c = {
1436
1454
  PER_PERSON_PER_NIGHT: "Per person / per night",
1437
1455
  BOOK_NOW: "Book now",
1438
1456
  TO_YOUR_OFFER: "To your quote",
1439
- NOT_AVAILABLE: "Not available",
1457
+ NOT_AVAILABLE: "Not available — please select a different date",
1440
1458
  NUMBER_OF_ROOMS: "Number of rooms",
1441
1459
  AGE_BY_DEPARTURE_DATE: "Age of children on departure date",
1442
1460
  YEAR: "Year(s)",
@@ -1524,6 +1542,12 @@ var TRAVELERS_FORM$c = {
1524
1542
  FIRST_NAME: "First name",
1525
1543
  LAST_NAME: "Last name",
1526
1544
  BIRTHDATE: "Date of birth",
1545
+ WEIGHT: "Weight",
1546
+ WEIGHT_UNIT_KG: "kg",
1547
+ WEIGHT_UNIT_LB: "lb",
1548
+ HEIGHT: "Height",
1549
+ HEIGHT_UNIT_CM: "cm",
1550
+ HEIGHT_UNIT_FT_IN: "ft/in",
1527
1551
  STREET: "Street",
1528
1552
  STREET_PLACEHOLDER: "Your street",
1529
1553
  HOUSE_NUMBER: "House number",
@@ -1784,7 +1808,7 @@ var SRP$c = {
1784
1808
  };
1785
1809
  var ITINERARY$c = {
1786
1810
  DAY: "Day",
1787
- NO_ITEMS: "No items for this day."
1811
+ NO_ITEMS: "No activities selected for this day."
1788
1812
  };
1789
1813
  var FORM$c = {
1790
1814
  LOADING: "Loading form...",
@@ -1887,7 +1911,7 @@ var PRODUCT$b = {
1887
1911
  PER_PERSON_PER_NIGHT: "Por persona / por noche",
1888
1912
  BOOK_NOW: "Reservar ahora",
1889
1913
  TO_YOUR_OFFER: "A su presupuesto",
1890
- NOT_AVAILABLE: "No disponible",
1914
+ NOT_AVAILABLE: "No disponible — seleccione otra fecha",
1891
1915
  NUMBER_OF_ROOMS: "Número de habitaciones",
1892
1916
  AGE_BY_DEPARTURE_DATE: "Edad de los niños en la fecha de salida",
1893
1917
  YEAR: "Año(s)",
@@ -1974,6 +1998,12 @@ var TRAVELERS_FORM$b = {
1974
1998
  FIRST_NAME: "Nombre",
1975
1999
  LAST_NAME: "Apellido",
1976
2000
  BIRTHDATE: "Fecha de nacimiento",
2001
+ WEIGHT: "Peso",
2002
+ WEIGHT_UNIT_KG: "kg",
2003
+ WEIGHT_UNIT_LB: "lb",
2004
+ HEIGHT: "Estatura",
2005
+ HEIGHT_UNIT_CM: "cm",
2006
+ HEIGHT_UNIT_FT_IN: "ft/in",
1977
2007
  STREET: "Calle",
1978
2008
  STREET_PLACEHOLDER: "Su calle",
1979
2009
  HOUSE_NUMBER: "Número",
@@ -2231,7 +2261,7 @@ var SRP$b = {
2231
2261
  };
2232
2262
  var ITINERARY$b = {
2233
2263
  DAY: "Día",
2234
- NO_ITEMS: "No hay elementos para este día."
2264
+ NO_ITEMS: "No hay actividades seleccionadas para este día."
2235
2265
  };
2236
2266
  var FORM$b = {
2237
2267
  LOADING: "Cargando formulario...",
@@ -2334,7 +2364,7 @@ var PRODUCT$a = {
2334
2364
  PER_PERSON_PER_NIGHT: "Par personne / par nuit",
2335
2365
  BOOK_NOW: "Réserver maintenant",
2336
2366
  TO_YOUR_OFFER: "Vers votre devis",
2337
- NOT_AVAILABLE: "Non disponible",
2367
+ NOT_AVAILABLE: "Non disponible — veuillez sélectionner une autre date",
2338
2368
  NUMBER_OF_ROOMS: "Nombre de chambres",
2339
2369
  AGE_BY_DEPARTURE_DATE: "Âge des enfants à la date de départ",
2340
2370
  YEAR: "An(s)",
@@ -2422,6 +2452,12 @@ var TRAVELERS_FORM$a = {
2422
2452
  FIRST_NAME: "Prénom",
2423
2453
  LAST_NAME: "Nom",
2424
2454
  BIRTHDATE: "Date de naissance",
2455
+ WEIGHT: "Poids",
2456
+ WEIGHT_UNIT_KG: "kg",
2457
+ WEIGHT_UNIT_LB: "lb",
2458
+ HEIGHT: "Taille",
2459
+ HEIGHT_UNIT_CM: "cm",
2460
+ HEIGHT_UNIT_FT_IN: "ft/in",
2425
2461
  STREET: "Rue",
2426
2462
  STREET_PLACEHOLDER: "Votre rue",
2427
2463
  HOUSE_NUMBER: "N°",
@@ -2682,7 +2718,7 @@ var SRP$a = {
2682
2718
  };
2683
2719
  var ITINERARY$a = {
2684
2720
  DAY: "Jour",
2685
- NO_ITEMS: "Aucun élément pour ce jour."
2721
+ NO_ITEMS: "Aucune activité sélectionnée pour ce jour."
2686
2722
  };
2687
2723
  var FORM$a = {
2688
2724
  LOADING: "Chargement du formulaire...",
@@ -2785,7 +2821,7 @@ var PRODUCT$9 = {
2785
2821
  PER_PERSON_PER_NIGHT: "Par personne / par nuit",
2786
2822
  BOOK_NOW: "Réservez maintenant",
2787
2823
  TO_YOUR_OFFER: "Vers votre devis",
2788
- NOT_AVAILABLE: "Indisponible",
2824
+ NOT_AVAILABLE: "Indisponible — veuillez sélectionner une autre date",
2789
2825
  NUMBER_OF_ROOMS: "Nombre de chambres",
2790
2826
  AGE_BY_DEPARTURE_DATE: "Âge des enfants à la date de départ",
2791
2827
  YEAR: "An(s)",
@@ -2872,6 +2908,12 @@ var TRAVELERS_FORM$9 = {
2872
2908
  FIRST_NAME: "Prénom",
2873
2909
  LAST_NAME: "Nom",
2874
2910
  BIRTHDATE: "Date de naissance",
2911
+ WEIGHT: "Poids",
2912
+ WEIGHT_UNIT_KG: "kg",
2913
+ WEIGHT_UNIT_LB: "lb",
2914
+ HEIGHT: "Taille",
2915
+ HEIGHT_UNIT_CM: "cm",
2916
+ HEIGHT_UNIT_FT_IN: "ft/in",
2875
2917
  STREET: "Rue",
2876
2918
  STREET_PLACEHOLDER: "Votre rue",
2877
2919
  HOUSE_NUMBER: "Numéro",
@@ -3129,7 +3171,7 @@ var SRP$9 = {
3129
3171
  };
3130
3172
  var ITINERARY$9 = {
3131
3173
  DAY: "Jour",
3132
- NO_ITEMS: "Aucun élément pour ce jour."
3174
+ NO_ITEMS: "Aucune activité sélectionnée pour ce jour."
3133
3175
  };
3134
3176
  var FORM$9 = {
3135
3177
  LOADING: "Chargement du formulaire...",
@@ -3232,7 +3274,7 @@ var PRODUCT$8 = {
3232
3274
  PER_PERSON_PER_NIGHT: "Á mann / á nótt",
3233
3275
  BOOK_NOW: "Panta núna",
3234
3276
  TO_YOUR_OFFER: "Til tilboðsins þíns",
3235
- NOT_AVAILABLE: "Ekki í boði",
3277
+ NOT_AVAILABLE: "Ekki í boði — vinsamlegast veldu aðra dagsetningu",
3236
3278
  NUMBER_OF_ROOMS: "Fjöldi herbergja",
3237
3279
  AGE_BY_DEPARTURE_DATE: "Aldur barna á brottfarardegi",
3238
3280
  YEAR: "ár",
@@ -3319,6 +3361,12 @@ var TRAVELERS_FORM$8 = {
3319
3361
  FIRST_NAME: "Fornafn",
3320
3362
  LAST_NAME: "Eftirnafn",
3321
3363
  BIRTHDATE: "Fæðingardagur",
3364
+ WEIGHT: "Þyngd",
3365
+ WEIGHT_UNIT_KG: "kg",
3366
+ WEIGHT_UNIT_LB: "lb",
3367
+ HEIGHT: "Hæð",
3368
+ HEIGHT_UNIT_CM: "cm",
3369
+ HEIGHT_UNIT_FT_IN: "ft/in",
3322
3370
  STREET: "Gata",
3323
3371
  STREET_PLACEHOLDER: "Gatan þín",
3324
3372
  HOUSE_NUMBER: "Húsnúmer",
@@ -3576,7 +3624,7 @@ var SRP$8 = {
3576
3624
  };
3577
3625
  var ITINERARY$8 = {
3578
3626
  DAY: "Dagur",
3579
- NO_ITEMS: "Engar upplýsingar fyrir þennan dag."
3627
+ NO_ITEMS: "Engin afþreying valin fyrir þennan dag."
3580
3628
  };
3581
3629
  var FORM$8 = {
3582
3630
  LOADING: "Hleður eyðublað...",
@@ -3679,7 +3727,7 @@ var PRODUCT$7 = {
3679
3727
  PER_PERSON_PER_NIGHT: "A persona / a notte",
3680
3728
  BOOK_NOW: "Prenota ora",
3681
3729
  TO_YOUR_OFFER: "Vai al preventivo",
3682
- NOT_AVAILABLE: "Non disponibile",
3730
+ NOT_AVAILABLE: "Non disponibile — seleziona un'altra data",
3683
3731
  NUMBER_OF_ROOMS: "Numero di camere",
3684
3732
  AGE_BY_DEPARTURE_DATE: "Età dei bambini alla data di partenza",
3685
3733
  YEAR: "Anno/i",
@@ -3766,6 +3814,12 @@ var TRAVELERS_FORM$7 = {
3766
3814
  FIRST_NAME: "Nome",
3767
3815
  LAST_NAME: "Cognome",
3768
3816
  BIRTHDATE: "Data di nascita",
3817
+ WEIGHT: "Peso",
3818
+ WEIGHT_UNIT_KG: "kg",
3819
+ WEIGHT_UNIT_LB: "lb",
3820
+ HEIGHT: "Altezza",
3821
+ HEIGHT_UNIT_CM: "cm",
3822
+ HEIGHT_UNIT_FT_IN: "ft/in",
3769
3823
  STREET: "Via",
3770
3824
  STREET_PLACEHOLDER: "La tua via",
3771
3825
  HOUSE_NUMBER: "Numero civico",
@@ -4023,7 +4077,7 @@ var SRP$7 = {
4023
4077
  };
4024
4078
  var ITINERARY$7 = {
4025
4079
  DAY: "Giorno",
4026
- NO_ITEMS: "Nessun elemento per questo giorno."
4080
+ NO_ITEMS: "Nessuna attività selezionata per questo giorno."
4027
4081
  };
4028
4082
  var FORM$7 = {
4029
4083
  LOADING: "Caricamento modulo...",
@@ -4126,7 +4180,7 @@ var PRODUCT$6 = {
4126
4180
  PER_PERSON_PER_NIGHT: "Per persoon / per nacht",
4127
4181
  BOOK_NOW: "Boek nu",
4128
4182
  TO_YOUR_OFFER: "Naar uw offerte",
4129
- NOT_AVAILABLE: "Niet beschikbaar",
4183
+ NOT_AVAILABLE: "Niet beschikbaar — kies een andere datum",
4130
4184
  NUMBER_OF_ROOMS: "Aantal kamers",
4131
4185
  AGE_BY_DEPARTURE_DATE: "Leeftijd kinderen op vertrekdatum",
4132
4186
  YEAR: "Jaar",
@@ -4214,6 +4268,12 @@ var TRAVELERS_FORM$6 = {
4214
4268
  FIRST_NAME: "Voornaam",
4215
4269
  LAST_NAME: "Naam",
4216
4270
  BIRTHDATE: "Geboortedatum",
4271
+ WEIGHT: "Gewicht",
4272
+ WEIGHT_UNIT_KG: "kg",
4273
+ WEIGHT_UNIT_LB: "lb",
4274
+ HEIGHT: "Lengte",
4275
+ HEIGHT_UNIT_CM: "cm",
4276
+ HEIGHT_UNIT_FT_IN: "ft/in",
4217
4277
  STREET: "Straat",
4218
4278
  STREET_PLACEHOLDER: "Jouw straat",
4219
4279
  HOUSE_NUMBER: "Huisnr",
@@ -4474,7 +4534,7 @@ var SRP$6 = {
4474
4534
  };
4475
4535
  var ITINERARY$6 = {
4476
4536
  DAY: "Dag",
4477
- NO_ITEMS: "Geen elementen voor deze dag."
4537
+ NO_ITEMS: "Geen activiteiten geselecteerd voor deze dag."
4478
4538
  };
4479
4539
  var FORM$6 = {
4480
4540
  LOADING: "Formulier laden...",
@@ -4577,7 +4637,7 @@ var PRODUCT$5 = {
4577
4637
  PER_PERSON_PER_NIGHT: "Per persoon / per nacht",
4578
4638
  BOOK_NOW: "Nu boeken",
4579
4639
  TO_YOUR_OFFER: "Naar uw offerte",
4580
- NOT_AVAILABLE: "Niet beschikbaar",
4640
+ NOT_AVAILABLE: "Niet beschikbaar — kies een andere datum",
4581
4641
  NUMBER_OF_ROOMS: "Aantal kamers",
4582
4642
  AGE_BY_DEPARTURE_DATE: "Leeftijd van kinderen op vertrekdatum",
4583
4643
  YEAR: "Jaar",
@@ -4664,6 +4724,12 @@ var TRAVELERS_FORM$5 = {
4664
4724
  FIRST_NAME: "Voornaam",
4665
4725
  LAST_NAME: "Achternaam",
4666
4726
  BIRTHDATE: "Geboortedatum",
4727
+ WEIGHT: "Gewicht",
4728
+ WEIGHT_UNIT_KG: "kg",
4729
+ WEIGHT_UNIT_LB: "lb",
4730
+ HEIGHT: "Lengte",
4731
+ HEIGHT_UNIT_CM: "cm",
4732
+ HEIGHT_UNIT_FT_IN: "ft/in",
4667
4733
  STREET: "Straat",
4668
4734
  STREET_PLACEHOLDER: "Uw straat",
4669
4735
  HOUSE_NUMBER: "Huisnummer",
@@ -4921,7 +4987,7 @@ var SRP$5 = {
4921
4987
  };
4922
4988
  var ITINERARY$5 = {
4923
4989
  DAY: "Dag",
4924
- NO_ITEMS: "Geen elementen voor deze dag."
4990
+ NO_ITEMS: "Geen activiteiten geselecteerd voor deze dag."
4925
4991
  };
4926
4992
  var FORM$5 = {
4927
4993
  LOADING: "Formulier laden...",
@@ -5024,7 +5090,7 @@ var PRODUCT$4 = {
5024
5090
  PER_PERSON_PER_NIGHT: "Per person / per natt",
5025
5091
  BOOK_NOW: "Bestill nå",
5026
5092
  TO_YOUR_OFFER: "Til ditt tilbud",
5027
- NOT_AVAILABLE: "Ikke tilgjengelig",
5093
+ NOT_AVAILABLE: "Ikke tilgjengelig — velg en annen dato",
5028
5094
  NUMBER_OF_ROOMS: "Antall rom",
5029
5095
  AGE_BY_DEPARTURE_DATE: "Barnas alder på avreisedato",
5030
5096
  YEAR: "År",
@@ -5111,6 +5177,12 @@ var TRAVELERS_FORM$4 = {
5111
5177
  FIRST_NAME: "Fornavn",
5112
5178
  LAST_NAME: "Etternavn",
5113
5179
  BIRTHDATE: "Fødselsdato",
5180
+ WEIGHT: "Vekt",
5181
+ WEIGHT_UNIT_KG: "kg",
5182
+ WEIGHT_UNIT_LB: "lb",
5183
+ HEIGHT: "Høyde",
5184
+ HEIGHT_UNIT_CM: "cm",
5185
+ HEIGHT_UNIT_FT_IN: "ft/in",
5114
5186
  STREET: "Gate",
5115
5187
  STREET_PLACEHOLDER: "Din gate",
5116
5188
  HOUSE_NUMBER: "Husnummer",
@@ -5368,7 +5440,7 @@ var SRP$4 = {
5368
5440
  };
5369
5441
  var ITINERARY$4 = {
5370
5442
  DAY: "Dag",
5371
- NO_ITEMS: "Ingen elementer for denne dagen."
5443
+ NO_ITEMS: "Ingen aktiviteter valgt for denne dagen."
5372
5444
  };
5373
5445
  var FORM$4 = {
5374
5446
  LOADING: "Laster inn skjema...",
@@ -5471,7 +5543,7 @@ var PRODUCT$3 = {
5471
5543
  PER_PERSON_PER_NIGHT: "Za osobę / za noc",
5472
5544
  BOOK_NOW: "Zarezerwuj teraz",
5473
5545
  TO_YOUR_OFFER: "Do oferty",
5474
- NOT_AVAILABLE: "Niedostępne",
5546
+ NOT_AVAILABLE: "Niedostępne — wybierz inną datę",
5475
5547
  NUMBER_OF_ROOMS: "Liczba pokoi",
5476
5548
  AGE_BY_DEPARTURE_DATE: "Wiek dzieci w dniu wyjazdu",
5477
5549
  YEAR: "Rok(lata)",
@@ -5558,6 +5630,12 @@ var TRAVELERS_FORM$3 = {
5558
5630
  FIRST_NAME: "Imię",
5559
5631
  LAST_NAME: "Nazwisko",
5560
5632
  BIRTHDATE: "Data urodzenia",
5633
+ WEIGHT: "Waga",
5634
+ WEIGHT_UNIT_KG: "kg",
5635
+ WEIGHT_UNIT_LB: "lb",
5636
+ HEIGHT: "Wzrost",
5637
+ HEIGHT_UNIT_CM: "cm",
5638
+ HEIGHT_UNIT_FT_IN: "ft/in",
5561
5639
  STREET: "Ulica",
5562
5640
  STREET_PLACEHOLDER: "Twoja ulica",
5563
5641
  HOUSE_NUMBER: "Numer domu",
@@ -5815,7 +5893,7 @@ var SRP$3 = {
5815
5893
  };
5816
5894
  var ITINERARY$3 = {
5817
5895
  DAY: "Dzień",
5818
- NO_ITEMS: "Brak elementów dla tego dnia."
5896
+ NO_ITEMS: "Nie wybrano atrakcji na ten dzień."
5819
5897
  };
5820
5898
  var FORM$3 = {
5821
5899
  LOADING: "Ładowanie formularza...",
@@ -5918,7 +5996,7 @@ var PRODUCT$2 = {
5918
5996
  PER_PERSON_PER_NIGHT: "Por pessoa / por noite",
5919
5997
  BOOK_NOW: "Reservar agora",
5920
5998
  TO_YOUR_OFFER: "Ir para o orçamento",
5921
- NOT_AVAILABLE: "Indisponível",
5999
+ NOT_AVAILABLE: "Indisponível — selecione outra data",
5922
6000
  NUMBER_OF_ROOMS: "Número de quartos",
5923
6001
  AGE_BY_DEPARTURE_DATE: "Idade das crianças à data de partida",
5924
6002
  YEAR: "Ano(s)",
@@ -6005,6 +6083,12 @@ var TRAVELERS_FORM$2 = {
6005
6083
  FIRST_NAME: "Nome",
6006
6084
  LAST_NAME: "Apelido",
6007
6085
  BIRTHDATE: "Data de nascimento",
6086
+ WEIGHT: "Peso",
6087
+ WEIGHT_UNIT_KG: "kg",
6088
+ WEIGHT_UNIT_LB: "lb",
6089
+ HEIGHT: "Altura",
6090
+ HEIGHT_UNIT_CM: "cm",
6091
+ HEIGHT_UNIT_FT_IN: "ft/in",
6008
6092
  STREET: "Rua",
6009
6093
  STREET_PLACEHOLDER: "A sua rua",
6010
6094
  HOUSE_NUMBER: "Número de porta",
@@ -6262,7 +6346,7 @@ var SRP$2 = {
6262
6346
  };
6263
6347
  var ITINERARY$2 = {
6264
6348
  DAY: "Dia",
6265
- NO_ITEMS: "Nenhum item para este dia."
6349
+ NO_ITEMS: "Nenhuma atividade selecionada para este dia."
6266
6350
  };
6267
6351
  var FORM$2 = {
6268
6352
  LOADING: "A carregar formulário...",
@@ -6365,7 +6449,7 @@ var PRODUCT$1 = {
6365
6449
  PER_PERSON_PER_NIGHT: "Per person / per natt",
6366
6450
  BOOK_NOW: "Boka nu",
6367
6451
  TO_YOUR_OFFER: "Till din offert",
6368
- NOT_AVAILABLE: "Ej tillgänglig",
6452
+ NOT_AVAILABLE: "Ej tillgänglig — välj ett annat datum",
6369
6453
  NUMBER_OF_ROOMS: "Antal rum",
6370
6454
  AGE_BY_DEPARTURE_DATE: "Barnens ålder vid avresedatum",
6371
6455
  YEAR: "År",
@@ -6452,6 +6536,12 @@ var TRAVELERS_FORM$1 = {
6452
6536
  FIRST_NAME: "Förnamn",
6453
6537
  LAST_NAME: "Efternamn",
6454
6538
  BIRTHDATE: "Födelsedatum",
6539
+ WEIGHT: "Vikt",
6540
+ WEIGHT_UNIT_KG: "kg",
6541
+ WEIGHT_UNIT_LB: "lb",
6542
+ HEIGHT: "Längd",
6543
+ HEIGHT_UNIT_CM: "cm",
6544
+ HEIGHT_UNIT_FT_IN: "ft/in",
6455
6545
  STREET: "Gata",
6456
6546
  STREET_PLACEHOLDER: "Din gata",
6457
6547
  HOUSE_NUMBER: "Husnummer",
@@ -6709,7 +6799,7 @@ var SRP$1 = {
6709
6799
  };
6710
6800
  var ITINERARY$1 = {
6711
6801
  DAY: "Dag",
6712
- NO_ITEMS: "Inga element för denna dag."
6802
+ NO_ITEMS: "Inga aktiviteter valda för denna dag."
6713
6803
  };
6714
6804
  var FORM$1 = {
6715
6805
  LOADING: "Laddar formulär...",
@@ -6812,7 +6902,7 @@ var PRODUCT = {
6812
6902
  PER_PERSON_PER_NIGHT: "1名・1泊あたり",
6813
6903
  BOOK_NOW: "今すぐ予約",
6814
6904
  TO_YOUR_OFFER: "見積もりへ",
6815
- NOT_AVAILABLE: "利用不可",
6905
+ NOT_AVAILABLE: "利用不可 — 別の日付をお選びください",
6816
6906
  NUMBER_OF_ROOMS: "客室数",
6817
6907
  AGE_BY_DEPARTURE_DATE: "出発日時点での子供の年齢",
6818
6908
  YEAR: "歳",
@@ -6899,6 +6989,12 @@ var TRAVELERS_FORM = {
6899
6989
  FIRST_NAME: "名",
6900
6990
  LAST_NAME: "姓",
6901
6991
  BIRTHDATE: "生年月日",
6992
+ WEIGHT: "体重",
6993
+ WEIGHT_UNIT_KG: "kg",
6994
+ WEIGHT_UNIT_LB: "lb",
6995
+ HEIGHT: "身長",
6996
+ HEIGHT_UNIT_CM: "cm",
6997
+ HEIGHT_UNIT_FT_IN: "ft/in",
6902
6998
  STREET: "住所",
6903
6999
  STREET_PLACEHOLDER: "住所を入力",
6904
7000
  HOUSE_NUMBER: "番地",
@@ -7156,7 +7252,7 @@ var SRP = {
7156
7252
  };
7157
7253
  var ITINERARY = {
7158
7254
  DAY: "日",
7159
- NO_ITEMS: "この日のアイテムはありません。"
7255
+ NO_ITEMS: "この日に選択されたアクティビティはありません。"
7160
7256
  };
7161
7257
  var FORM = {
7162
7258
  LOADING: "フォームを読み込んでいます...",
@@ -7552,6 +7648,14 @@ exports.AvailabilitySearchType = void 0;
7552
7648
  AvailabilitySearchType[(AvailabilitySearchType["flight"] = 3)] = "flight";
7553
7649
  })(exports.AvailabilitySearchType || (exports.AvailabilitySearchType = {}));
7554
7650
 
7651
+ var CustomFieldDataType = {
7652
+ bool: 0,
7653
+ date: 1,
7654
+ time: 2,
7655
+ string: 3,
7656
+ numeric: 4,
7657
+ };
7658
+
7555
7659
  var DataType = {
7556
7660
  text: "text",
7557
7661
  numeric: "number",
@@ -7567,6 +7671,12 @@ var DataType = {
7567
7671
  template: "template",
7568
7672
  };
7569
7673
 
7674
+ exports.DateAmountType = void 0;
7675
+ (function (DateAmountType) {
7676
+ DateAmountType[(DateAmountType["days"] = 0)] = "days";
7677
+ DateAmountType[(DateAmountType["months"] = 1)] = "months";
7678
+ })(exports.DateAmountType || (exports.DateAmountType = {}));
7679
+
7570
7680
  var DossierType = {
7571
7681
  hotelOnly: 0,
7572
7682
  transportOnly: 1,
@@ -7574,6 +7684,13 @@ var DossierType = {
7574
7684
  package: 3,
7575
7685
  };
7576
7686
 
7687
+ var DurationType = {
7688
+ hours: 0,
7689
+ days: 1,
7690
+ nights: 2,
7691
+ minutes: 3,
7692
+ };
7693
+
7577
7694
  var EntryLineFlag = {
7578
7695
  none: 0,
7579
7696
  allotmentNoPlace: 1,
@@ -7651,6 +7768,11 @@ var Gender = {
7651
7768
  other: 2,
7652
7769
  };
7653
7770
 
7771
+ var HeightType = {
7772
+ centimeters: 0,
7773
+ feetInches: 1,
7774
+ };
7775
+
7654
7776
  exports.MetaDataItemPropertyType = void 0;
7655
7777
  (function (MetaDataItemPropertyType) {
7656
7778
  MetaDataItemPropertyType[(MetaDataItemPropertyType["Height"] = 0)] = "Height";
@@ -7687,6 +7809,22 @@ var PaymentType = {
7687
7809
  cash: 3,
7688
7810
  };
7689
7811
 
7812
+ exports.PortalQsmType = void 0;
7813
+ (function (PortalQsmType) {
7814
+ PortalQsmType[(PortalQsmType["Multidestination"] = 0)] = "Multidestination";
7815
+ PortalQsmType[(PortalQsmType["Accommodation"] = 1)] = "Accommodation";
7816
+ PortalQsmType[(PortalQsmType["AccommodationAndFlight"] = 2)] =
7817
+ "AccommodationAndFlight";
7818
+ PortalQsmType[(PortalQsmType["Flight"] = 3)] = "Flight";
7819
+ PortalQsmType[(PortalQsmType["RoundTrip"] = 4)] = "RoundTrip";
7820
+ PortalQsmType[(PortalQsmType["GroupTour"] = 5)] = "GroupTour";
7821
+ PortalQsmType[(PortalQsmType["Package"] = 6)] = "Package";
7822
+ PortalQsmType[(PortalQsmType["Ticket"] = 7)] = "Ticket";
7823
+ PortalQsmType[(PortalQsmType["Car"] = 8)] = "Car";
7824
+ PortalQsmType[(PortalQsmType["Transfer"] = 9)] = "Transfer";
7825
+ PortalQsmType[(PortalQsmType["Cruise"] = 10)] = "Cruise";
7826
+ })(exports.PortalQsmType || (exports.PortalQsmType = {}));
7827
+
7690
7828
  var PriceChartType = {
7691
7829
  purchasePrices: 0,
7692
7830
  sellingPrices: 1,
@@ -7720,6 +7858,26 @@ var RoomType = {
7720
7858
  pk6: 5,
7721
7859
  };
7722
7860
 
7861
+ var RouteTransportType = {
7862
+ none: 0,
7863
+ privateTransport: 1,
7864
+ publicTransport: 2,
7865
+ rentalCar: 3,
7866
+ bus: 4,
7867
+ camper: 5,
7868
+ car: 6,
7869
+ charter: 7,
7870
+ cruise: 8,
7871
+ ferry: 9,
7872
+ flight: 10,
7873
+ taxi: 11,
7874
+ train: 12,
7875
+ transfer: 13,
7876
+ rocket: 14,
7877
+ walking: 15,
7878
+ cycling: 16,
7879
+ };
7880
+
7723
7881
  var SaleType = {
7724
7882
  ownOrganization: 0,
7725
7883
  resale: 1,
@@ -7759,6 +7917,13 @@ var ServiceType = {
7759
7917
  camp: 30,
7760
7918
  };
7761
7919
 
7920
+ var TrajectNodeType = {
7921
+ regular: 0,
7922
+ connectingNode: 1,
7923
+ poi: 2,
7924
+ subroute: 3,
7925
+ };
7926
+
7762
7927
  exports.UnitOfMeasure = void 0;
7763
7928
  (function (UnitOfMeasure) {
7764
7929
  UnitOfMeasure[(UnitOfMeasure["cm"] = 0)] = "cm";
@@ -7791,60 +7956,9 @@ var VendorType = {
7791
7956
  sunnyCars: 20,
7792
7957
  };
7793
7958
 
7794
- exports.DateAmountType = void 0;
7795
- (function (DateAmountType) {
7796
- DateAmountType[(DateAmountType["days"] = 0)] = "days";
7797
- DateAmountType[(DateAmountType["months"] = 1)] = "months";
7798
- })(exports.DateAmountType || (exports.DateAmountType = {}));
7799
-
7800
- exports.PortalQsmType = void 0;
7801
- (function (PortalQsmType) {
7802
- PortalQsmType[(PortalQsmType["Multidestination"] = 0)] = "Multidestination";
7803
- PortalQsmType[(PortalQsmType["Accommodation"] = 1)] = "Accommodation";
7804
- PortalQsmType[(PortalQsmType["AccommodationAndFlight"] = 2)] =
7805
- "AccommodationAndFlight";
7806
- PortalQsmType[(PortalQsmType["Flight"] = 3)] = "Flight";
7807
- PortalQsmType[(PortalQsmType["RoundTrip"] = 4)] = "RoundTrip";
7808
- PortalQsmType[(PortalQsmType["GroupTour"] = 5)] = "GroupTour";
7809
- PortalQsmType[(PortalQsmType["Package"] = 6)] = "Package";
7810
- PortalQsmType[(PortalQsmType["Ticket"] = 7)] = "Ticket";
7811
- PortalQsmType[(PortalQsmType["Car"] = 8)] = "Car";
7812
- PortalQsmType[(PortalQsmType["Transfer"] = 9)] = "Transfer";
7813
- PortalQsmType[(PortalQsmType["Cruise"] = 10)] = "Cruise";
7814
- })(exports.PortalQsmType || (exports.PortalQsmType = {}));
7815
-
7816
- var TrajectNodeType = {
7817
- regular: 0,
7818
- connectingNode: 1,
7819
- poi: 2,
7820
- subroute: 3,
7821
- };
7822
-
7823
- var DurationType = {
7824
- hours: 0,
7825
- days: 1,
7826
- nights: 2,
7827
- minutes: 3,
7828
- };
7829
-
7830
- var RouteTransportType = {
7831
- none: 0,
7832
- privateTransport: 1,
7833
- publicTransport: 2,
7834
- rentalCar: 3,
7835
- bus: 4,
7836
- camper: 5,
7837
- car: 6,
7838
- charter: 7,
7839
- cruise: 8,
7840
- ferry: 9,
7841
- flight: 10,
7842
- taxi: 11,
7843
- train: 12,
7844
- transfer: 13,
7845
- rocket: 14,
7846
- walking: 15,
7847
- cycling: 16,
7959
+ var WeightType = {
7960
+ kilograms: 0,
7961
+ pounds: 1,
7848
7962
  };
7849
7963
 
7850
7964
  /******************************************************************************
@@ -15196,6 +15310,7 @@ var submitForm = function (config, id, request, signal) {
15196
15310
  };
15197
15311
 
15198
15312
  exports.AllotmentType = AllotmentType;
15313
+ exports.CustomFieldDataType = CustomFieldDataType;
15199
15314
  exports.DataType = DataType;
15200
15315
  exports.DossierType = DossierType;
15201
15316
  exports.DurationType = DurationType;
@@ -15206,6 +15321,7 @@ exports.FormFieldType = FormFieldType;
15206
15321
  exports.FormFieldWidth = FormFieldWidth;
15207
15322
  exports.FormType = FormType;
15208
15323
  exports.Gender = Gender;
15324
+ exports.HeightType = HeightType;
15209
15325
  exports.MetaDataType = MetaDataType;
15210
15326
  exports.PaymentType = PaymentType;
15211
15327
  exports.PriceChartType = PriceChartType;
@@ -15217,6 +15333,7 @@ exports.ServiceTokenError = ServiceTokenError;
15217
15333
  exports.ServiceType = ServiceType;
15218
15334
  exports.TrajectNodeType = TrajectNodeType;
15219
15335
  exports.VendorType = VendorType;
15336
+ exports.WeightType = WeightType;
15220
15337
  exports.agents = agents;
15221
15338
  exports.alternateFlights = alternateFlights;
15222
15339
  exports.alternateHotels = alternateHotels;
@@ -17475,7 +17592,7 @@ const Product = ({ productCode, productName, duration, rating }) => {
17475
17592
  const [hasFlight, setHasFlight] = useState(false);
17476
17593
  const [hasTransfer, setHasTransfer] = useState(false);
17477
17594
  const [rooms, setRooms] = useState([{ adults: 2, children: 0, childAges: [] }]);
17478
- const [searchResponse, setSearchResponse] = useState([]);
17595
+ const [searchResponse, setSearchResponse] = useState();
17479
17596
  const [detailResponse, setDetailResponse] = useState();
17480
17597
  const [dateRange, setDateRange] = useState();
17481
17598
  const [urlDateRange, setUrlDateRange] = useState({ from: null, to: null });
@@ -17613,6 +17730,9 @@ const Product = ({ productCode, productName, duration, rating }) => {
17613
17730
  setPackageProductName(selectedItem.name);
17614
17731
  };
17615
17732
  useEffect(() => {
17733
+ if (searchResponse === undefined) {
17734
+ return;
17735
+ }
17616
17736
  if (searchResponse && !isEmpty$1(searchResponse)) {
17617
17737
  setSearchResults(searchResponse);
17618
17738
  const selectedItem = searchResponse.find((item) => new Date(item.fromDate).getTime() === dateRange?.fromDate?.getTime() && new Date(item.toDate).getTime() === dateRange?.toDate?.getTime());
@@ -18783,6 +18903,7 @@ const selectPackageOptionUnits = (state) => state.booking.package?.options.find(
18783
18903
  const selectPackageOptionPax = (state) => state.booking.package?.options.find((x) => x.isSelected)?.optionPax;
18784
18904
  const selectPackageGroups = (state) => state.booking.package?.options.find((x) => x.isSelected)?.groups;
18785
18905
  const selectPackageDetails = (state) => state.booking.package;
18906
+ const selectPaxCustomFields = (state) => state.booking.package?.paxCustomFields ?? [];
18786
18907
  const selectPackageFlights = (state) => ({
18787
18908
  outward: state.booking.package?.outwardFlights,
18788
18909
  return: state.booking.package?.returnFlights
@@ -19009,7 +19130,12 @@ const buildPax = (traveler, mainBookerId) => {
19009
19130
  lastName: traveler.lastName,
19010
19131
  dateOfBirth: traveler.birthDate,
19011
19132
  age: traveler.birthDate ? null : traveler.age,
19012
- isMainBooker: traveler.id == mainBookerId
19133
+ isMainBooker: traveler.id == mainBookerId,
19134
+ weight: traveler.weight ?? null,
19135
+ weightType: traveler.weightType ?? build.WeightType.kilograms,
19136
+ height: traveler.height ?? null,
19137
+ heightType: traveler.heightType ?? build.HeightType.centimeters,
19138
+ customFields: traveler.customFields ?? []
19013
19139
  };
19014
19140
  };
19015
19141
  const parseGender = (gender) => {
@@ -19519,7 +19645,9 @@ const SettingsContext = React__default.createContext({
19519
19645
  travellers: {
19520
19646
  pathSuffix: '/reizigers',
19521
19647
  travelersFirstStep: false,
19522
- showAllCountries: false
19648
+ showAllCountries: false,
19649
+ showWeightField: false,
19650
+ showHeightField: false
19523
19651
  },
19524
19652
  summary: {
19525
19653
  pathSuffix: '/samenvatting',
@@ -21824,6 +21952,7 @@ const OptionRoom = ({ packageRoom, pax, optionPax, onRoomChange, includedService
21824
21952
 
21825
21953
  function useOfferPrinter({ bookingPackage, getPax, tagIds = [], printActionId = null, onPrinted }) {
21826
21954
  const settings = useContext(SettingsContext);
21955
+ const apiSettings = useSelector(selectApiSettings);
21827
21956
  if (!settings)
21828
21957
  throw new Error('useOfferPrinter must be used inside <BookingWizard>');
21829
21958
  const { language, officeId } = settings;
@@ -21852,9 +21981,9 @@ function useOfferPrinter({ bookingPackage, getPax, tagIds = [], printActionId =
21852
21981
  customerRequests: []
21853
21982
  }
21854
21983
  };
21855
- const cfg = buildTideClientConfig();
21984
+ const cfg = buildTideClientConfig(apiSettings);
21856
21985
  return build.book(cfg, request, undefined, language);
21857
- }, [agentId, bookingPackage, getPax, language, officeId, tagIds]);
21986
+ }, [agentId, apiSettings, bookingPackage, getPax, language, officeId, tagIds]);
21858
21987
  const languageData = [
21859
21988
  { code: 'nl-BE', tideId: 1 },
21860
21989
  { code: 'fr-BE', tideId: 2 },
@@ -21864,7 +21993,7 @@ function useOfferPrinter({ bookingPackage, getPax, tagIds = [], printActionId =
21864
21993
  return languageData.find((l) => l.code === code)?.tideId || 1;
21865
21994
  }
21866
21995
  const printOffer = useCallback(async (offer) => {
21867
- const cfg = buildTideClientConfig();
21996
+ const cfg = buildTideClientConfig(apiSettings);
21868
21997
  const req = {
21869
21998
  id: printActionId ?? 0,
21870
21999
  dossierNumber: offer.dossierNumber ?? offer.number,
@@ -21875,7 +22004,7 @@ function useOfferPrinter({ bookingPackage, getPax, tagIds = [], printActionId =
21875
22004
  const url = URL.createObjectURL(new Blob([buf], { type: 'application/pdf' }));
21876
22005
  onPrinted?.(url);
21877
22006
  window.open(url);
21878
- }, [language, onPrinted]);
22007
+ }, [apiSettings, language, onPrinted, printActionId]);
21879
22008
  const handlePrint = useCallback(async () => {
21880
22009
  try {
21881
22010
  setStage('creating');
@@ -23031,185 +23160,6 @@ const Summary = () => {
23031
23160
  React__default.createElement("button", { title: settings.isOffer ? translations.STEPS.SUBMIT_OFFER : translations.STEPS.SUBMIT_BOOKING, className: buildClassName(['cta', !userValidated && 'cta--disabled']), disabled: !userValidated, name: "default" }, settings.isOffer ? translations.STEPS.SUBMIT_OFFER : translations.STEPS.SUBMIT_BOOKING))))));
23032
23161
  };
23033
23162
 
23034
- function isValidEmail(email) {
23035
- return !/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,24}$/i.test(email);
23036
- }
23037
- const NAME_CHARACTERS_REGEX = /^[\p{L}\s-]+$/u;
23038
- function hasInvalidNameCharacters(name) {
23039
- return !NAME_CHARACTERS_REGEX.test(name);
23040
- }
23041
- // Rejects values like a 5-digit year, which the native date input allows while typing
23042
- function isValidBirthDate(birthDateText) {
23043
- return isValid(parse(birthDateText, 'yyyy-MM-dd', new Date()));
23044
- }
23045
- function getAge(birthDateText, startDateText) {
23046
- var birthDate = new Date(birthDateText);
23047
- var startDate = new Date(startDateText);
23048
- var age = startDate.getFullYear() - birthDate.getFullYear();
23049
- var m = startDate.getMonth() - birthDate.getMonth();
23050
- if (m < 0 || (m === 0 && startDate.getDate() < birthDate.getDate())) {
23051
- age--;
23052
- }
23053
- return age;
23054
- }
23055
- const validateForm$1 = (values, agentRequired, bookingType, translations, formFields, mainBookerFormFields, maxChildAge = CHILD_MAX_AGE, maxBabyAge = BABY_MAX_AGE) => {
23056
- const errors = {};
23057
- const isFormFieldPresent = (type) => {
23058
- return formFields?.some((f) => f.type === type) ?? true;
23059
- };
23060
- const isMainBookerFormFieldPresent = (type) => {
23061
- return mainBookerFormFields?.some((f) => f.type === type) ?? true;
23062
- };
23063
- const formatTravelerField = (room, pax, field) => {
23064
- return values.rooms.length > 1
23065
- ? format$1(translations.TRAVELERS_FORM.VALIDATION.TRAVELER_X_FIELD, [room, pax, field])
23066
- : format$1(translations.TRAVELERS_FORM.VALIDATION.SINGLE_ROOM_TRAVELER_X_FIELD, [pax, field]);
23067
- };
23068
- const formatTravelerIsNoAdult = (room, pax) => {
23069
- return values.rooms.length > 1
23070
- ? format$1(translations.TRAVELERS_FORM.VALIDATION.TRAVELER_X_IS_NO_ADULT, [room, pax])
23071
- : format$1(translations.TRAVELERS_FORM.VALIDATION.SINGLE_ROOM_TRAVELER_X_IS_NO_ADULT, [pax]);
23072
- };
23073
- const formatTravelerIsNoChild = (room, pax) => {
23074
- return values.rooms.length > 1
23075
- ? format$1(translations.TRAVELERS_FORM.VALIDATION.TRAVELER_X_IS_NO_CHILD, [room, pax])
23076
- : format$1(translations.TRAVELERS_FORM.VALIDATION.SINGLE_ROOM_TRAVELER_X_IS_NO_CHILD, [pax]);
23077
- };
23078
- const formatTravelerIsNoBaby = (room, pax) => {
23079
- // The message states the boundary the traveler has to stay under, so we pass
23080
- // the first age that is too old rather than the inclusive maxBabyAge.
23081
- const tooOldAge = maxBabyAge + 1;
23082
- return values.rooms.length > 1
23083
- ? format$1(translations.TRAVELERS_FORM.VALIDATION.TRAVELER_X_IS_NO_BABY, [room, pax, tooOldAge])
23084
- : format$1(translations.TRAVELERS_FORM.VALIDATION.SINGLE_ROOM_TRAVELER_X_IS_NO_BABY, [pax, tooOldAge]);
23085
- };
23086
- const formatTravelerFieldInvalidCharacters = (room, pax, field) => {
23087
- return values.rooms.length > 1
23088
- ? format$1(translations.TRAVELERS_FORM.VALIDATION.TRAVELER_X_FIELD_INVALID_CHARACTERS, [room, pax, field])
23089
- : format$1(translations.TRAVELERS_FORM.VALIDATION.SINGLE_ROOM_TRAVELER_X_FIELD_INVALID_CHARACTERS, [pax, field]);
23090
- };
23091
- values.rooms.forEach((r, rIndex) => r.adults.forEach((adult, index) => {
23092
- if (isEmpty$1(adult.gender) && isFormFieldPresent('gender')) {
23093
- set(errors, `rooms[${rIndex}].adults[${index}].gender`, formatTravelerField(rIndex + 1, index + 1, translations.TRAVELERS_FORM.GENDER));
23094
- }
23095
- if (isFormFieldPresent('firstName')) {
23096
- if (isEmpty$1(adult.firstName)) {
23097
- set(errors, `rooms[${rIndex}].adults[${index}].firstName`, formatTravelerField(rIndex + 1, index + 1, translations.TRAVELERS_FORM.FIRST_NAME));
23098
- }
23099
- else if (hasInvalidNameCharacters(adult.firstName)) {
23100
- set(errors, `rooms[${rIndex}].adults[${index}].firstName`, formatTravelerFieldInvalidCharacters(rIndex + 1, index + 1, translations.TRAVELERS_FORM.FIRST_NAME));
23101
- }
23102
- }
23103
- if (isFormFieldPresent('lastName')) {
23104
- if (isEmpty$1(adult.lastName)) {
23105
- set(errors, `rooms[${rIndex}].adults[${index}].lastName`, formatTravelerField(rIndex + 1, index + 1, translations.TRAVELERS_FORM.LAST_NAME));
23106
- }
23107
- else if (hasInvalidNameCharacters(adult.lastName)) {
23108
- set(errors, `rooms[${rIndex}].adults[${index}].lastName`, formatTravelerFieldInvalidCharacters(rIndex + 1, index + 1, translations.TRAVELERS_FORM.LAST_NAME));
23109
- }
23110
- }
23111
- if (isFormFieldPresent('birthDate')) {
23112
- if (isEmpty$1(adult.birthDate) || !isValidBirthDate(adult.birthDate)) {
23113
- set(errors, `rooms[${rIndex}].adults[${index}].birthDate`, formatTravelerField(rIndex + 1, index + 1, translations.TRAVELERS_FORM.BIRTHDATE));
23114
- }
23115
- else if (values.endDate) {
23116
- // If you are younger than the maxChildAge at the end of the trip, you are considered a child, so we check the endDate here instead of the startDate
23117
- const age = getAge(adult.birthDate, values.endDate);
23118
- if (age <= maxChildAge) {
23119
- set(errors, `rooms[${rIndex}].adults[${index}].birthDate`, formatTravelerIsNoAdult(rIndex + 1, index + 1));
23120
- }
23121
- }
23122
- }
23123
- }));
23124
- values.rooms.forEach((r, rIndex) => r.children.forEach((child, index) => {
23125
- if (isEmpty$1(child.gender) && isFormFieldPresent('gender')) {
23126
- set(errors, `rooms[${rIndex}].children[${index}].gender`, formatTravelerField(rIndex + 1, r.adults.length + index + 1, translations.TRAVELERS_FORM.GENDER));
23127
- }
23128
- if (isFormFieldPresent('firstName')) {
23129
- if (isEmpty$1(child.firstName)) {
23130
- set(errors, `rooms[${rIndex}].children[${index}].firstName`, formatTravelerField(rIndex + 1, r.adults.length + index + 1, translations.TRAVELERS_FORM.FIRST_NAME));
23131
- }
23132
- else if (hasInvalidNameCharacters(child.firstName)) {
23133
- set(errors, `rooms[${rIndex}].children[${index}].firstName`, formatTravelerFieldInvalidCharacters(rIndex + 1, r.adults.length + index + 1, translations.TRAVELERS_FORM.FIRST_NAME));
23134
- }
23135
- }
23136
- if (isFormFieldPresent('lastName')) {
23137
- if (isEmpty$1(child.lastName)) {
23138
- set(errors, `rooms[${rIndex}].children[${index}].lastName`, formatTravelerField(rIndex + 1, r.adults.length + index + 1, translations.TRAVELERS_FORM.LAST_NAME));
23139
- }
23140
- else if (hasInvalidNameCharacters(child.lastName)) {
23141
- set(errors, `rooms[${rIndex}].children[${index}].lastName`, formatTravelerFieldInvalidCharacters(rIndex + 1, r.adults.length + index + 1, translations.TRAVELERS_FORM.LAST_NAME));
23142
- }
23143
- }
23144
- if (isFormFieldPresent('birthDate')) {
23145
- if (isEmpty$1(child.birthDate) || !isValidBirthDate(child.birthDate)) {
23146
- set(errors, `rooms[${rIndex}].children[${index}].birthDate`, formatTravelerField(rIndex + 1, r.adults.length + index + 1, translations.TRAVELERS_FORM.BIRTHDATE));
23147
- }
23148
- else if (child.isBaby && values.startDate) {
23149
- // A baby only has to be under the maxBabyAge on departure, so we check the startDate here instead of the endDate (TIDE-3269)
23150
- const age = getAge(child.birthDate, values.startDate);
23151
- if (age > maxBabyAge) {
23152
- set(errors, `rooms[${rIndex}].children[${index}].birthDate`, formatTravelerIsNoBaby(rIndex + 1, r.adults.length + index + 1));
23153
- }
23154
- }
23155
- else if (values.endDate) {
23156
- // You need to be under the maxChildAge until the end of the trip, so we check the endDate here instead of the startDate.
23157
- // Babies land here too when there is no startDate to check them against, so they keep at least the child age check.
23158
- const age = getAge(child.birthDate, values.endDate);
23159
- if (age > maxChildAge) {
23160
- set(errors, `rooms[${rIndex}].children[${index}].birthDate`, formatTravelerIsNoChild(rIndex + 1, r.adults.length + index + 1));
23161
- }
23162
- }
23163
- }
23164
- }));
23165
- if (values.mainBookerId < 0) {
23166
- errors.mainBookerId = translations.TRAVELERS_FORM.VALIDATION.NO_MAIN_BOOKER_SELECTED;
23167
- }
23168
- if (bookingType != 'b2b' || mainBookerFormFields?.length) {
23169
- if (isEmpty$1(values.street) && isMainBookerFormFieldPresent('street')) {
23170
- errors.street = format$1(translations.TRAVELERS_FORM.VALIDATION.MAIN_BOOKER_FIELD, [translations.TRAVELERS_FORM.STREET]);
23171
- }
23172
- if (isEmpty$1(values.houseNumber) && isMainBookerFormFieldPresent('houseNumber')) {
23173
- errors.houseNumber = format$1(translations.TRAVELERS_FORM.VALIDATION.MAIN_BOOKER_FIELD, [translations.TRAVELERS_FORM.HOUSE_NUMBER]);
23174
- }
23175
- if (isEmpty$1(values.zipCode) && isMainBookerFormFieldPresent('zipCode')) {
23176
- errors.zipCode = format$1(translations.TRAVELERS_FORM.VALIDATION.MAIN_BOOKER_FIELD, [translations.TRAVELERS_FORM.ZIPCODE]);
23177
- }
23178
- if (isEmpty$1(values.place) && isMainBookerFormFieldPresent('place')) {
23179
- errors.place = format$1(translations.TRAVELERS_FORM.VALIDATION.MAIN_BOOKER_FIELD, [translations.TRAVELERS_FORM.CITY]);
23180
- }
23181
- if (isMainBookerFormFieldPresent('email')) {
23182
- if (isEmpty$1(values.email)) {
23183
- errors.email = format$1(translations.TRAVELERS_FORM.VALIDATION.MAIN_BOOKER_FIELD, [translations.TRAVELERS_FORM.EMAIL]);
23184
- }
23185
- else if (isValidEmail(values.email)) {
23186
- errors.email = translations.TRAVELERS_FORM.VALIDATION.MAIN_BOOKER_EMAIL_IS_INVALID;
23187
- }
23188
- if (isEmpty$1(values.emailConfirmation)) {
23189
- errors.emailConfirmation = format$1(translations.TRAVELERS_FORM.VALIDATION.MAIN_BOOKER_FIELD, [translations.TRAVELERS_FORM.REPEAT_EMAIL]);
23190
- }
23191
- else if (values.emailConfirmation !== values.email) {
23192
- errors.emailConfirmation = translations.TRAVELERS_FORM.VALIDATION.MAIN_BOOKER_EMAIL_DOES_NOT_MATCH;
23193
- }
23194
- }
23195
- if (isEmpty$1(values.country) && isMainBookerFormFieldPresent('country')) {
23196
- errors.country = format$1(translations.TRAVELERS_FORM.VALIDATION.MAIN_BOOKER_FIELD, [translations.TRAVELERS_FORM.COUNTRY]);
23197
- }
23198
- if (isEmpty$1(values.phone) && isMainBookerFormFieldPresent('phone')) {
23199
- errors.phone = format$1(translations.TRAVELERS_FORM.VALIDATION.MAIN_BOOKER_FIELD, [translations.TRAVELERS_FORM.PHONE]);
23200
- }
23201
- }
23202
- else {
23203
- if (isEmpty$1(values.phone)) {
23204
- errors.phone = format$1(translations.TRAVELERS_FORM.VALIDATION.MAIN_BOOKER_FIELD, [translations.TRAVELERS_FORM.PHONE]);
23205
- }
23206
- }
23207
- if (agentRequired && !values.travelAgentId) {
23208
- errors.travelAgentId = translations.TRAVELERS_FORM.VALIDATION.AGENT_IS_REQUIRED;
23209
- }
23210
- return errors;
23211
- };
23212
-
23213
23163
  const LabeledInput = ({ name, type, required, value, defaultValue, min, max, label, placeholder, extraClassName, hasError, onChange, onBlur }) => {
23214
23164
  return (React__default.createElement("label", { className: buildClassName(['form__group', extraClassName, hasError && 'form__group--error']) },
23215
23165
  React__default.createElement("span", { className: "form__label" }, compact([label, required && '*']).join(' ')),
@@ -23374,7 +23324,33 @@ function formatBirthDate$1(birthDate) {
23374
23324
  const parsed = parse(birthDate, 'yyyy-MM-dd', new Date());
23375
23325
  return isValid(parsed) ? format$2(parsed, 'dd-MM-yyyy') : '';
23376
23326
  }
23377
- function createTraveler(traveler, followNumber, personTranslation, isCompact, maxBabyAge) {
23327
+ // A customFieldConfigurationId can have separate "main-booker"/other-pax variants; resolved per traveler below.
23328
+ const MAIN_BOOKER_GROUP = 'main-booker';
23329
+ function buildEmptyCustomFields(paxCustomFields = []) {
23330
+ const uniqueIds = Array.from(new Set(paxCustomFields.map((field) => field.customFieldConfigurationId)));
23331
+ return uniqueIds.map((customFieldConfigurationId) => ({ customFieldConfigurationId, value: '' }));
23332
+ }
23333
+ function getApplicablePaxCustomFields(paxCustomFields = [], isMainBooker) {
23334
+ const variantsById = new Map();
23335
+ paxCustomFields.forEach((field) => {
23336
+ const variants = variantsById.get(field.customFieldConfigurationId) ?? [];
23337
+ variants.push(field);
23338
+ variantsById.set(field.customFieldConfigurationId, variants);
23339
+ });
23340
+ const applicableFields = [];
23341
+ variantsById.forEach((variants) => {
23342
+ const hasRoleSplit = variants.some((v) => v.group === MAIN_BOOKER_GROUP);
23343
+ if (!hasRoleSplit) {
23344
+ applicableFields.push(variants[0]);
23345
+ return;
23346
+ }
23347
+ const roleMatch = variants.find((v) => (v.group === MAIN_BOOKER_GROUP) === isMainBooker);
23348
+ if (roleMatch)
23349
+ applicableFields.push(roleMatch);
23350
+ });
23351
+ return applicableFields;
23352
+ }
23353
+ function createTraveler(traveler, followNumber, personTranslation, isCompact, maxBabyAge, paxCustomFields) {
23378
23354
  if (isCompact) {
23379
23355
  return {
23380
23356
  id: traveler.id,
@@ -23386,9 +23362,14 @@ function createTraveler(traveler, followNumber, personTranslation, isCompact, ma
23386
23362
  // old, while still falling back for a missing or unusable age. `??` alone would let a
23387
23363
  // NaN (unparseable date of birth upstream) reach the age input and the booked pax.
23388
23364
  // See TIDE-3269.
23389
- age: Number.isFinite(traveler.age) ? traveler.age : 30
23365
+ age: Number.isFinite(traveler.age) ? traveler.age : 30,
23390
23366
  // No isBaby here on purpose: the age below is editable and nothing revalidates it
23391
23367
  // in compact mode, so a stored flag would end up contradicting the entered age.
23368
+ weight: null,
23369
+ weightType: build.WeightType.kilograms,
23370
+ height: null,
23371
+ heightType: build.HeightType.centimeters,
23372
+ customFields: buildEmptyCustomFields(paxCustomFields)
23392
23373
  };
23393
23374
  }
23394
23375
  return {
@@ -23397,17 +23378,22 @@ function createTraveler(traveler, followNumber, personTranslation, isCompact, ma
23397
23378
  lastName: '',
23398
23379
  birthDate: '',
23399
23380
  gender: '',
23400
- isBaby: isBabyAge(traveler.age, maxBabyAge)
23381
+ isBaby: isBabyAge(traveler.age, maxBabyAge),
23382
+ weight: null,
23383
+ weightType: build.WeightType.kilograms,
23384
+ height: null,
23385
+ heightType: build.HeightType.centimeters,
23386
+ customFields: buildEmptyCustomFields(paxCustomFields)
23401
23387
  };
23402
23388
  }
23403
- function createInitialValuesFromRooms(formRooms, startDate, endDate, agentAdressId, personTranslation, isCompact, maxBabyAge) {
23389
+ function createInitialValuesFromRooms(formRooms, startDate, endDate, agentAdressId, personTranslation, isCompact, maxBabyAge, paxCustomFields) {
23404
23390
  const followNumber = { number: 1 };
23405
23391
  const initialValues = {
23406
23392
  startDate,
23407
23393
  endDate,
23408
23394
  rooms: formRooms.map((room) => ({
23409
- adults: room.adults.map((traveler) => createTraveler(traveler, followNumber, personTranslation, isCompact, maxBabyAge)),
23410
- children: room.children.map((traveler) => createTraveler(traveler, followNumber, personTranslation, isCompact, maxBabyAge))
23395
+ adults: room.adults.map((traveler) => createTraveler(traveler, followNumber, personTranslation, isCompact, maxBabyAge, paxCustomFields)),
23396
+ children: room.children.map((traveler) => createTraveler(traveler, followNumber, personTranslation, isCompact, maxBabyAge, paxCustomFields))
23411
23397
  })),
23412
23398
  mainBookerId: -1,
23413
23399
  street: '',
@@ -23501,7 +23487,7 @@ function applyTravelersFormValuesToEditablePackagingEntry(editablePackagingEntry
23501
23487
  }
23502
23488
  };
23503
23489
  }
23504
- const SharedTravelersForm = ({ formik, translations, travellersSettings, countries, agents, bookingType, agentAdressId, travelersFirstStep = false, isUnavailable = false, useCompactForm = false, showAllCountries = false, showAgentSelection = false, initialShowAgents = false, renderPreviousButton, onBookingTypeChange }) => {
23490
+ const SharedTravelersForm = ({ formik, translations, travellersSettings, countries, agents, bookingType, agentAdressId, travelersFirstStep = false, isUnavailable = false, useCompactForm = false, showAllCountries = false, showWeightField = false, showHeightField = false, paxCustomFields, showAgentSelection = false, initialShowAgents = false, renderPreviousButton, onBookingTypeChange }) => {
23505
23491
  const [showAgents, setShowAgents] = useState(initialShowAgents);
23506
23492
  const typeaheadAgents = useMemo(() => sortBy(agents?.map((agent) => ({
23507
23493
  key: `${agent.id}`,
@@ -23554,7 +23540,18 @@ const SharedTravelersForm = ({ formik, translations, travellersSettings, countri
23554
23540
  };
23555
23541
  const handleAddTraveler = (roomIndex) => {
23556
23542
  const rooms = [...formik.values.rooms];
23557
- const newAdult = { id: Date.now(), firstName: '', lastName: '', birthDate: '', gender: '' };
23543
+ const newAdult = {
23544
+ id: Date.now(),
23545
+ firstName: '',
23546
+ lastName: '',
23547
+ birthDate: '',
23548
+ gender: '',
23549
+ weight: null,
23550
+ weightType: build.WeightType.kilograms,
23551
+ height: null,
23552
+ heightType: build.HeightType.centimeters,
23553
+ customFields: buildEmptyCustomFields(paxCustomFields)
23554
+ };
23558
23555
  rooms[roomIndex] = { ...rooms[roomIndex], adults: [...rooms[roomIndex].adults, newAdult] };
23559
23556
  formik.setFieldValue('rooms', rooms);
23560
23557
  };
@@ -23569,7 +23566,23 @@ const SharedTravelersForm = ({ formik, translations, travellersSettings, countri
23569
23566
  };
23570
23567
  const handleAddRoom = () => {
23571
23568
  const rooms = [...formik.values.rooms];
23572
- rooms.push({ adults: [{ id: Date.now(), firstName: '', lastName: '', birthDate: '', gender: '' }], children: [] });
23569
+ rooms.push({
23570
+ adults: [
23571
+ {
23572
+ id: Date.now(),
23573
+ firstName: '',
23574
+ lastName: '',
23575
+ birthDate: '',
23576
+ gender: '',
23577
+ weight: null,
23578
+ weightType: build.WeightType.kilograms,
23579
+ height: null,
23580
+ heightType: build.HeightType.centimeters,
23581
+ customFields: buildEmptyCustomFields(paxCustomFields)
23582
+ }
23583
+ ],
23584
+ children: []
23585
+ });
23573
23586
  formik.setFieldValue('rooms', rooms);
23574
23587
  };
23575
23588
  const handleRemoveRoom = (roomIndex) => {
@@ -23588,6 +23601,54 @@ const SharedTravelersForm = ({ formik, translations, travellersSettings, countri
23588
23601
  React__default.createElement("label", { className: "radiobutton__label" },
23589
23602
  React__default.createElement("input", { type: "radio", className: "radiobutton__input", name: name, onChange: formik.handleChange, onBlur: formik.handleBlur, value: gender, checked: value.gender === gender }),
23590
23603
  label)))))));
23604
+ const renderWeightControl = (namePrefix, value) => (React__default.createElement("div", { className: "form__row" },
23605
+ React__default.createElement(LabeledInput, { type: "number", min: 0, hasError: hasVisibleError(`${namePrefix}.weight`), extraClassName: "form__group--md-33", label: translations.TRAVELERS_FORM.WEIGHT, name: `${namePrefix}.weight`, onChange: formik.handleChange, onBlur: formik.handleBlur, value: value.weight ?? '' }),
23606
+ React__default.createElement(LabeledSelect, { extraClassName: "form__group--md-33", name: `${namePrefix}.weightType`, onChange: formik.handleChange, onBlur: formik.handleBlur, value: value.weightType, options: [
23607
+ { key: 'kg', value: build.WeightType.kilograms, label: translations.TRAVELERS_FORM.WEIGHT_UNIT_KG },
23608
+ { key: 'lb', value: build.WeightType.pounds, label: translations.TRAVELERS_FORM.WEIGHT_UNIT_LB }
23609
+ ] })));
23610
+ const renderHeightControl = (namePrefix, value) => (React__default.createElement("div", { className: "form__row" },
23611
+ React__default.createElement(LabeledInput, { type: "number", min: 0, hasError: hasVisibleError(`${namePrefix}.height`), extraClassName: "form__group--md-33", label: translations.TRAVELERS_FORM.HEIGHT, name: `${namePrefix}.height`, onChange: formik.handleChange, onBlur: formik.handleBlur, value: value.height ?? '' }),
23612
+ React__default.createElement(LabeledSelect, { extraClassName: "form__group--md-33", name: `${namePrefix}.heightType`, onChange: formik.handleChange, onBlur: formik.handleBlur, value: value.heightType, options: [
23613
+ { key: 'cm', value: build.HeightType.centimeters, label: translations.TRAVELERS_FORM.HEIGHT_UNIT_CM },
23614
+ { key: 'ftIn', value: build.HeightType.feetInches, label: translations.TRAVELERS_FORM.HEIGHT_UNIT_FT_IN }
23615
+ ] })));
23616
+ const getCustomFieldControl = (field, value, name) => {
23617
+ const label = compact([field.fieldName, field.isRequired && '*']).join(' ');
23618
+ switch (field.dataType) {
23619
+ case build.CustomFieldDataType.bool:
23620
+ return (React__default.createElement("div", { className: buildClassName(['form__group', hasVisibleError(name) && 'form__group--error']) },
23621
+ React__default.createElement("div", { className: "checkbox" },
23622
+ React__default.createElement("label", { className: "checkbox__label" },
23623
+ React__default.createElement("input", { type: "checkbox", className: "checkbox__input", checked: value === 'true', onChange: (e) => formik.setFieldValue(name, e.target.checked ? 'true' : 'false'), onBlur: formik.handleBlur, name: name }),
23624
+ label))));
23625
+ case build.CustomFieldDataType.date:
23626
+ return (React__default.createElement(LabeledInput, { type: "date", hasError: hasVisibleError(name), label: label, name: name, onChange: (e) => formik.setFieldValue(name, e.target.value), onBlur: formik.handleBlur, value: value }));
23627
+ case build.CustomFieldDataType.time:
23628
+ return (React__default.createElement(LabeledInput, { type: "time", hasError: hasVisibleError(name), label: label, name: name, onChange: (e) => formik.setFieldValue(name, e.target.value), onBlur: formik.handleBlur, value: value }));
23629
+ case build.CustomFieldDataType.numeric:
23630
+ return (React__default.createElement(LabeledInput, { type: "number", hasError: hasVisibleError(name), label: label, name: name, onChange: (e) => formik.setFieldValue(name, e.target.value), onBlur: formik.handleBlur, value: value }));
23631
+ case build.CustomFieldDataType.string:
23632
+ default:
23633
+ return (React__default.createElement(LabeledInput, { hasError: hasVisibleError(name), label: label, name: name, onChange: (e) => formik.setFieldValue(name, e.target.value), onBlur: formik.handleBlur, value: value }));
23634
+ }
23635
+ };
23636
+ const renderCustomFields = (travelerValues, namePrefix) => {
23637
+ if (!paxCustomFields?.length)
23638
+ return null;
23639
+ const isMainBooker = travelerValues.id === formik.values.mainBookerId;
23640
+ const applicableFields = getApplicablePaxCustomFields(paxCustomFields, isMainBooker);
23641
+ if (!applicableFields.length)
23642
+ return null;
23643
+ return (React__default.createElement("div", { className: "travelers-form__custom-fields-grid" }, applicableFields.map((field) => {
23644
+ const fieldIndex = travelerValues.customFields?.findIndex((c) => c.customFieldConfigurationId === field.customFieldConfigurationId) ?? -1;
23645
+ if (fieldIndex < 0)
23646
+ return null;
23647
+ const name = `${namePrefix}.customFields[${fieldIndex}].value`;
23648
+ const value = travelerValues.customFields[fieldIndex].value;
23649
+ return (React__default.createElement("div", { key: field.customFieldConfigurationId, style: { gridColumn: `span ${field.col || 12}` } }, getCustomFieldControl(field, value, name)));
23650
+ })));
23651
+ };
23591
23652
  const getControl = (type, value, name) => {
23592
23653
  switch (type) {
23593
23654
  case 'gender':
@@ -23635,7 +23696,11 @@ const SharedTravelersForm = ({ formik, translations, travellersSettings, countri
23635
23696
  React__default.createElement(LabeledInput, { hasError: hasVisibleError(`${namePrefix}.age`), extraClassName: "form__group--md-33", label: translations.TRAVELERS_FORM.AGE, required: true, name: `${namePrefix}.age`, onChange: formik.handleChange, onBlur: formik.handleBlur, value: travelerValues.age })));
23636
23697
  }
23637
23698
  if (travellersSettings?.formFields?.length) {
23638
- return (React__default.createElement("div", { className: "travelers-form__grid" }, travellersSettings.formFields.map((field, index) => (React__default.createElement("div", { key: index, className: `control control--${field.type}` }, getControl(field.type, travelerValues, `${namePrefix}.${field.type}`))))));
23699
+ return (React__default.createElement(React__default.Fragment, null,
23700
+ React__default.createElement("div", { className: "travelers-form__grid" }, travellersSettings.formFields.map((field, index) => (React__default.createElement("div", { key: index, className: `control control--${field.type}` }, getControl(field.type, travelerValues, `${namePrefix}.${field.type}`))))),
23701
+ showWeightField && renderWeightControl(namePrefix, travelerValues),
23702
+ showHeightField && renderHeightControl(namePrefix, travelerValues),
23703
+ renderCustomFields(travelerValues, namePrefix)));
23639
23704
  }
23640
23705
  return (React__default.createElement(React__default.Fragment, null,
23641
23706
  React__default.createElement("div", { className: "form__row" }, renderGenderControl(`${namePrefix}.gender`, travelerValues)),
@@ -23643,6 +23708,9 @@ const SharedTravelersForm = ({ formik, translations, travellersSettings, countri
23643
23708
  React__default.createElement(LabeledInput, { hasError: hasVisibleError(`${namePrefix}.firstName`), extraClassName: "form__group--md-33", label: translations.TRAVELERS_FORM.FIRST_NAME, required: true, name: `${namePrefix}.firstName`, onChange: formik.handleChange, onBlur: formik.handleBlur, value: travelerValues.firstName }),
23644
23709
  React__default.createElement(LabeledInput, { hasError: hasVisibleError(`${namePrefix}.lastName`), extraClassName: "form__group--md-33", label: translations.TRAVELERS_FORM.LAST_NAME, required: true, name: `${namePrefix}.lastName`, onChange: formik.handleChange, onBlur: formik.handleBlur, value: travelerValues.lastName }),
23645
23710
  React__default.createElement(LabeledInput, { type: "date", hasError: hasVisibleError(`${namePrefix}.birthDate`), extraClassName: "form__group--md-33", label: translations.TRAVELERS_FORM.BIRTHDATE, required: true, name: `${namePrefix}.birthDate`, onChange: formik.handleChange, onBlur: formik.handleBlur, value: travelerValues.birthDate })),
23711
+ showWeightField && renderWeightControl(namePrefix, travelerValues),
23712
+ showHeightField && renderHeightControl(namePrefix, travelerValues),
23713
+ renderCustomFields(travelerValues, namePrefix),
23646
23714
  travelersFirstStep && isAdult && formik.values.rooms[roomIndex].adults.length > 1 && (React__default.createElement("button", { type: "button", className: "cta cta--secondary", onClick: () => handleRemoveTraveler(roomIndex, travelerIndex) }, translations.TRAVELERS_FORM.REMOVE_TRAVELER))));
23647
23715
  };
23648
23716
  return (React__default.createElement("form", { className: "form form__travelers", name: "booking--travellers", id: "booking--travellers", noValidate: true, onSubmit: formik.handleSubmit, onReset: formik.handleReset },
@@ -23724,6 +23792,199 @@ const SharedTravelersForm = ({ formik, translations, travellersSettings, countri
23724
23792
  React__default.createElement("button", { type: "submit", title: translations.STEPS.NEXT, className: 'cta' + (isUnavailable ? ' cta--disabled' : '') }, translations.STEPS.NEXT))));
23725
23793
  };
23726
23794
 
23795
+ function isValidEmail(email) {
23796
+ return !/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,24}$/i.test(email);
23797
+ }
23798
+ const NAME_CHARACTERS_REGEX = /^[\p{L}\s-]+$/u;
23799
+ function hasInvalidNameCharacters(name) {
23800
+ return !NAME_CHARACTERS_REGEX.test(name);
23801
+ }
23802
+ // Rejects values like a 5-digit year, which the native date input allows while typing
23803
+ function isValidBirthDate(birthDateText) {
23804
+ return isValid(parse(birthDateText, 'yyyy-MM-dd', new Date()));
23805
+ }
23806
+ function getAge(birthDateText, startDateText) {
23807
+ var birthDate = new Date(birthDateText);
23808
+ var startDate = new Date(startDateText);
23809
+ var age = startDate.getFullYear() - birthDate.getFullYear();
23810
+ var m = startDate.getMonth() - birthDate.getMonth();
23811
+ if (m < 0 || (m === 0 && startDate.getDate() < birthDate.getDate())) {
23812
+ age--;
23813
+ }
23814
+ return age;
23815
+ }
23816
+ const validateForm$1 = (values, agentRequired, bookingType, translations, formFields, mainBookerFormFields, maxChildAge = CHILD_MAX_AGE, maxBabyAge = BABY_MAX_AGE, paxCustomFields = []) => {
23817
+ const errors = {};
23818
+ const isFormFieldPresent = (type) => {
23819
+ return formFields?.some((f) => f.type === type) ?? true;
23820
+ };
23821
+ const isMainBookerFormFieldPresent = (type) => {
23822
+ return mainBookerFormFields?.some((f) => f.type === type) ?? true;
23823
+ };
23824
+ const formatTravelerField = (room, pax, field) => {
23825
+ return values.rooms.length > 1
23826
+ ? format$1(translations.TRAVELERS_FORM.VALIDATION.TRAVELER_X_FIELD, [room, pax, field])
23827
+ : format$1(translations.TRAVELERS_FORM.VALIDATION.SINGLE_ROOM_TRAVELER_X_FIELD, [pax, field]);
23828
+ };
23829
+ const formatTravelerIsNoAdult = (room, pax) => {
23830
+ return values.rooms.length > 1
23831
+ ? format$1(translations.TRAVELERS_FORM.VALIDATION.TRAVELER_X_IS_NO_ADULT, [room, pax])
23832
+ : format$1(translations.TRAVELERS_FORM.VALIDATION.SINGLE_ROOM_TRAVELER_X_IS_NO_ADULT, [pax]);
23833
+ };
23834
+ const formatTravelerIsNoChild = (room, pax) => {
23835
+ return values.rooms.length > 1
23836
+ ? format$1(translations.TRAVELERS_FORM.VALIDATION.TRAVELER_X_IS_NO_CHILD, [room, pax])
23837
+ : format$1(translations.TRAVELERS_FORM.VALIDATION.SINGLE_ROOM_TRAVELER_X_IS_NO_CHILD, [pax]);
23838
+ };
23839
+ const formatTravelerIsNoBaby = (room, pax) => {
23840
+ // The message states the boundary the traveler has to stay under, so we pass
23841
+ // the first age that is too old rather than the inclusive maxBabyAge.
23842
+ const tooOldAge = maxBabyAge + 1;
23843
+ return values.rooms.length > 1
23844
+ ? format$1(translations.TRAVELERS_FORM.VALIDATION.TRAVELER_X_IS_NO_BABY, [room, pax, tooOldAge])
23845
+ : format$1(translations.TRAVELERS_FORM.VALIDATION.SINGLE_ROOM_TRAVELER_X_IS_NO_BABY, [pax, tooOldAge]);
23846
+ };
23847
+ const formatTravelerFieldInvalidCharacters = (room, pax, field) => {
23848
+ return values.rooms.length > 1
23849
+ ? format$1(translations.TRAVELERS_FORM.VALIDATION.TRAVELER_X_FIELD_INVALID_CHARACTERS, [room, pax, field])
23850
+ : format$1(translations.TRAVELERS_FORM.VALIDATION.SINGLE_ROOM_TRAVELER_X_FIELD_INVALID_CHARACTERS, [pax, field]);
23851
+ };
23852
+ const validateRequiredCustomFields = (traveler, path, room, pax) => {
23853
+ const isMainBooker = traveler.id === values.mainBookerId;
23854
+ const requiredFields = getApplicablePaxCustomFields(paxCustomFields, isMainBooker).filter((f) => f.isRequired);
23855
+ requiredFields.forEach((field) => {
23856
+ const fieldIndex = traveler.customFields?.findIndex((c) => c.customFieldConfigurationId === field.customFieldConfigurationId) ?? -1;
23857
+ if (fieldIndex < 0)
23858
+ return;
23859
+ if (isEmpty$1(traveler.customFields[fieldIndex].value)) {
23860
+ set(errors, `${path}.customFields[${fieldIndex}].value`, formatTravelerField(room, pax, field.fieldName));
23861
+ }
23862
+ });
23863
+ };
23864
+ values.rooms.forEach((r, rIndex) => r.adults.forEach((adult, index) => {
23865
+ if (isEmpty$1(adult.gender) && isFormFieldPresent('gender')) {
23866
+ set(errors, `rooms[${rIndex}].adults[${index}].gender`, formatTravelerField(rIndex + 1, index + 1, translations.TRAVELERS_FORM.GENDER));
23867
+ }
23868
+ if (isFormFieldPresent('firstName')) {
23869
+ if (isEmpty$1(adult.firstName)) {
23870
+ set(errors, `rooms[${rIndex}].adults[${index}].firstName`, formatTravelerField(rIndex + 1, index + 1, translations.TRAVELERS_FORM.FIRST_NAME));
23871
+ }
23872
+ else if (hasInvalidNameCharacters(adult.firstName)) {
23873
+ set(errors, `rooms[${rIndex}].adults[${index}].firstName`, formatTravelerFieldInvalidCharacters(rIndex + 1, index + 1, translations.TRAVELERS_FORM.FIRST_NAME));
23874
+ }
23875
+ }
23876
+ if (isFormFieldPresent('lastName')) {
23877
+ if (isEmpty$1(adult.lastName)) {
23878
+ set(errors, `rooms[${rIndex}].adults[${index}].lastName`, formatTravelerField(rIndex + 1, index + 1, translations.TRAVELERS_FORM.LAST_NAME));
23879
+ }
23880
+ else if (hasInvalidNameCharacters(adult.lastName)) {
23881
+ set(errors, `rooms[${rIndex}].adults[${index}].lastName`, formatTravelerFieldInvalidCharacters(rIndex + 1, index + 1, translations.TRAVELERS_FORM.LAST_NAME));
23882
+ }
23883
+ }
23884
+ if (isFormFieldPresent('birthDate')) {
23885
+ if (isEmpty$1(adult.birthDate) || !isValidBirthDate(adult.birthDate)) {
23886
+ set(errors, `rooms[${rIndex}].adults[${index}].birthDate`, formatTravelerField(rIndex + 1, index + 1, translations.TRAVELERS_FORM.BIRTHDATE));
23887
+ }
23888
+ else if (values.endDate) {
23889
+ // If you are younger than the maxChildAge at the end of the trip, you are considered a child, so we check the endDate here instead of the startDate
23890
+ const age = getAge(adult.birthDate, values.endDate);
23891
+ if (age <= maxChildAge) {
23892
+ set(errors, `rooms[${rIndex}].adults[${index}].birthDate`, formatTravelerIsNoAdult(rIndex + 1, index + 1));
23893
+ }
23894
+ }
23895
+ }
23896
+ validateRequiredCustomFields(adult, `rooms[${rIndex}].adults[${index}]`, rIndex + 1, index + 1);
23897
+ }));
23898
+ values.rooms.forEach((r, rIndex) => r.children.forEach((child, index) => {
23899
+ if (isEmpty$1(child.gender) && isFormFieldPresent('gender')) {
23900
+ set(errors, `rooms[${rIndex}].children[${index}].gender`, formatTravelerField(rIndex + 1, r.adults.length + index + 1, translations.TRAVELERS_FORM.GENDER));
23901
+ }
23902
+ if (isFormFieldPresent('firstName')) {
23903
+ if (isEmpty$1(child.firstName)) {
23904
+ set(errors, `rooms[${rIndex}].children[${index}].firstName`, formatTravelerField(rIndex + 1, r.adults.length + index + 1, translations.TRAVELERS_FORM.FIRST_NAME));
23905
+ }
23906
+ else if (hasInvalidNameCharacters(child.firstName)) {
23907
+ set(errors, `rooms[${rIndex}].children[${index}].firstName`, formatTravelerFieldInvalidCharacters(rIndex + 1, r.adults.length + index + 1, translations.TRAVELERS_FORM.FIRST_NAME));
23908
+ }
23909
+ }
23910
+ if (isFormFieldPresent('lastName')) {
23911
+ if (isEmpty$1(child.lastName)) {
23912
+ set(errors, `rooms[${rIndex}].children[${index}].lastName`, formatTravelerField(rIndex + 1, r.adults.length + index + 1, translations.TRAVELERS_FORM.LAST_NAME));
23913
+ }
23914
+ else if (hasInvalidNameCharacters(child.lastName)) {
23915
+ set(errors, `rooms[${rIndex}].children[${index}].lastName`, formatTravelerFieldInvalidCharacters(rIndex + 1, r.adults.length + index + 1, translations.TRAVELERS_FORM.LAST_NAME));
23916
+ }
23917
+ }
23918
+ if (isFormFieldPresent('birthDate')) {
23919
+ if (isEmpty$1(child.birthDate) || !isValidBirthDate(child.birthDate)) {
23920
+ set(errors, `rooms[${rIndex}].children[${index}].birthDate`, formatTravelerField(rIndex + 1, r.adults.length + index + 1, translations.TRAVELERS_FORM.BIRTHDATE));
23921
+ }
23922
+ else if (child.isBaby && values.startDate) {
23923
+ // A baby only has to be under the maxBabyAge on departure, so we check the startDate here instead of the endDate (TIDE-3269)
23924
+ const age = getAge(child.birthDate, values.startDate);
23925
+ if (age > maxBabyAge) {
23926
+ set(errors, `rooms[${rIndex}].children[${index}].birthDate`, formatTravelerIsNoBaby(rIndex + 1, r.adults.length + index + 1));
23927
+ }
23928
+ }
23929
+ else if (values.endDate) {
23930
+ // You need to be under the maxChildAge until the end of the trip, so we check the endDate here instead of the startDate.
23931
+ // Babies land here too when there is no startDate to check them against, so they keep at least the child age check.
23932
+ const age = getAge(child.birthDate, values.endDate);
23933
+ if (age > maxChildAge) {
23934
+ set(errors, `rooms[${rIndex}].children[${index}].birthDate`, formatTravelerIsNoChild(rIndex + 1, r.adults.length + index + 1));
23935
+ }
23936
+ }
23937
+ }
23938
+ validateRequiredCustomFields(child, `rooms[${rIndex}].children[${index}]`, rIndex + 1, r.adults.length + index + 1);
23939
+ }));
23940
+ if (values.mainBookerId < 0) {
23941
+ errors.mainBookerId = translations.TRAVELERS_FORM.VALIDATION.NO_MAIN_BOOKER_SELECTED;
23942
+ }
23943
+ if (bookingType != 'b2b' || mainBookerFormFields?.length) {
23944
+ if (isEmpty$1(values.street) && isMainBookerFormFieldPresent('street')) {
23945
+ errors.street = format$1(translations.TRAVELERS_FORM.VALIDATION.MAIN_BOOKER_FIELD, [translations.TRAVELERS_FORM.STREET]);
23946
+ }
23947
+ if (isEmpty$1(values.houseNumber) && isMainBookerFormFieldPresent('houseNumber')) {
23948
+ errors.houseNumber = format$1(translations.TRAVELERS_FORM.VALIDATION.MAIN_BOOKER_FIELD, [translations.TRAVELERS_FORM.HOUSE_NUMBER]);
23949
+ }
23950
+ if (isEmpty$1(values.zipCode) && isMainBookerFormFieldPresent('zipCode')) {
23951
+ errors.zipCode = format$1(translations.TRAVELERS_FORM.VALIDATION.MAIN_BOOKER_FIELD, [translations.TRAVELERS_FORM.ZIPCODE]);
23952
+ }
23953
+ if (isEmpty$1(values.place) && isMainBookerFormFieldPresent('place')) {
23954
+ errors.place = format$1(translations.TRAVELERS_FORM.VALIDATION.MAIN_BOOKER_FIELD, [translations.TRAVELERS_FORM.CITY]);
23955
+ }
23956
+ if (isMainBookerFormFieldPresent('email')) {
23957
+ if (isEmpty$1(values.email)) {
23958
+ errors.email = format$1(translations.TRAVELERS_FORM.VALIDATION.MAIN_BOOKER_FIELD, [translations.TRAVELERS_FORM.EMAIL]);
23959
+ }
23960
+ else if (isValidEmail(values.email)) {
23961
+ errors.email = translations.TRAVELERS_FORM.VALIDATION.MAIN_BOOKER_EMAIL_IS_INVALID;
23962
+ }
23963
+ if (isEmpty$1(values.emailConfirmation)) {
23964
+ errors.emailConfirmation = format$1(translations.TRAVELERS_FORM.VALIDATION.MAIN_BOOKER_FIELD, [translations.TRAVELERS_FORM.REPEAT_EMAIL]);
23965
+ }
23966
+ else if (values.emailConfirmation !== values.email) {
23967
+ errors.emailConfirmation = translations.TRAVELERS_FORM.VALIDATION.MAIN_BOOKER_EMAIL_DOES_NOT_MATCH;
23968
+ }
23969
+ }
23970
+ if (isEmpty$1(values.country) && isMainBookerFormFieldPresent('country')) {
23971
+ errors.country = format$1(translations.TRAVELERS_FORM.VALIDATION.MAIN_BOOKER_FIELD, [translations.TRAVELERS_FORM.COUNTRY]);
23972
+ }
23973
+ if (isEmpty$1(values.phone) && isMainBookerFormFieldPresent('phone')) {
23974
+ errors.phone = format$1(translations.TRAVELERS_FORM.VALIDATION.MAIN_BOOKER_FIELD, [translations.TRAVELERS_FORM.PHONE]);
23975
+ }
23976
+ }
23977
+ else {
23978
+ if (isEmpty$1(values.phone)) {
23979
+ errors.phone = format$1(translations.TRAVELERS_FORM.VALIDATION.MAIN_BOOKER_FIELD, [translations.TRAVELERS_FORM.PHONE]);
23980
+ }
23981
+ }
23982
+ if (agentRequired && !values.travelAgentId) {
23983
+ errors.travelAgentId = translations.TRAVELERS_FORM.VALIDATION.AGENT_IS_REQUIRED;
23984
+ }
23985
+ return errors;
23986
+ };
23987
+
23727
23988
  const TravelersForm = () => {
23728
23989
  const dispatch = useAppDispatch();
23729
23990
  const settings = useContext(SettingsContext);
@@ -23742,12 +24003,15 @@ const TravelersForm = () => {
23742
24003
  const bookingAttributes = useSelector(selectBookingAttributes);
23743
24004
  const hasMounted = useSelector(selectHasMounted);
23744
24005
  const countries = useSelector(selectCountries);
24006
+ const paxCustomFields = useSelector(selectPaxCustomFields);
23745
24007
  const inFlight = useRef(false);
23746
24008
  const pendingRefetch = useRef(false);
23747
24009
  const useCompactForm = !!settings.travellers.compactForm && !!settings.agentAdressId;
23748
24010
  const showAllCountries = !!settings.travellers.showAllCountries;
24011
+ const showWeightField = !!settings.travellers.showWeightField;
24012
+ const showHeightField = !!settings.travellers.showHeightField;
23749
24013
  const initialValues = useSelector(selectTravelersFormValues) ??
23750
- createInitialValuesFromRooms(formRooms, startDate, endDate, agentAdressId, translations.TRAVELERS_FORM.PERSON, useCompactForm, settings.maxBabyAge);
24014
+ createInitialValuesFromRooms(formRooms, startDate, endDate, agentAdressId, translations.TRAVELERS_FORM.PERSON, useCompactForm, settings.maxBabyAge, paxCustomFields);
23751
24015
  const [showAgentSelection, setShowAgentSelection] = useState(!settings.agentAdressId && !settings.hideAgentSelection);
23752
24016
  const formik = useFormik({
23753
24017
  initialValues,
@@ -23757,7 +24021,7 @@ const TravelersForm = () => {
23757
24021
  // The travel dates are captured into initialValues once and then persisted in
23758
24022
  // redux, so validating against the values would use the dates of whichever
23759
24023
  // package option was selected first. Age checks need the current ones.
23760
- { ...values, startDate, endDate }, settings.agentRequired, bookingType, translations, settings.travellers.formFields, settings.travellers.mainBookerFormFields, settings.maxChildAge, settings.maxBabyAge),
24024
+ { ...values, startDate, endDate }, settings.agentRequired, bookingType, translations, settings.travellers.formFields, settings.travellers.mainBookerFormFields, settings.maxChildAge, settings.maxBabyAge, paxCustomFields),
23761
24025
  onSubmit: (values) => {
23762
24026
  dispatch(setFormValues(values));
23763
24027
  if (useCompactForm) {
@@ -23840,7 +24104,7 @@ const TravelersForm = () => {
23840
24104
  dispatch(setFormValues(formValues));
23841
24105
  setShowAgentSelection(false);
23842
24106
  }, [agents, settings.affiliateSlug]);
23843
- return (React__default.createElement(SharedTravelersForm, { formik: formik, translations: translations, travellersSettings: settings.travellers, countries: countries, agents: agents, bookingType: bookingType, agentAdressId: agentAdressId, travelersFirstStep: travelersFirstStep, isUnavailable: isUnavailable, useCompactForm: useCompactForm, showAllCountries: showAllCountries, showAgentSelection: showAgentSelection, initialShowAgents: settings.agentRequired ?? false, onBookingTypeChange: (nextBookingType) => dispatch(setBookingType(nextBookingType)), renderPreviousButton: () => !travelersFirstStep && settings.skipRouter ? (React__default.createElement("button", { type: "button", title: translations.STEPS.PREVIOUS, onClick: () => dispatch(setCurrentStep$1(OPTIONS_FORM_STEP)), className: "cta cta--secondary" }, translations.STEPS.PREVIOUS)) : !travelersFirstStep ? (React__default.createElement(Link, { to: `${!settings.skipBasePathInRouting ? settings.basePath : ''}${settings.options.pathSuffix}?${bookingQueryString}`, title: translations.STEPS.PREVIOUS, className: "cta cta--secondary" }, translations.STEPS.PREVIOUS)) : null }));
24107
+ return (React__default.createElement(SharedTravelersForm, { formik: formik, translations: translations, travellersSettings: settings.travellers, countries: countries, agents: agents, bookingType: bookingType, agentAdressId: agentAdressId, travelersFirstStep: travelersFirstStep, isUnavailable: isUnavailable, useCompactForm: useCompactForm, showAllCountries: showAllCountries, showWeightField: showWeightField, showHeightField: showHeightField, paxCustomFields: paxCustomFields, showAgentSelection: showAgentSelection, initialShowAgents: settings.agentRequired ?? false, onBookingTypeChange: (nextBookingType) => dispatch(setBookingType(nextBookingType)), renderPreviousButton: () => !travelersFirstStep && settings.skipRouter ? (React__default.createElement("button", { type: "button", title: translations.STEPS.PREVIOUS, onClick: () => dispatch(setCurrentStep$1(OPTIONS_FORM_STEP)), className: "cta cta--secondary" }, translations.STEPS.PREVIOUS)) : !travelersFirstStep ? (React__default.createElement(Link, { to: `${!settings.skipBasePathInRouting ? settings.basePath : ''}${settings.options.pathSuffix}?${bookingQueryString}`, title: translations.STEPS.PREVIOUS, className: "cta cta--secondary" }, translations.STEPS.PREVIOUS)) : null }));
23844
24108
  };
23845
24109
 
23846
24110
  const Booking = ({ productCode, productName, thumbnailUrl }) => {
@@ -27912,7 +28176,12 @@ const mapPackagingPaxToBookingPax = (pax, fallbackId, referenceDate) => ({
27912
28176
  dateOfBirth: pax?.dateOfBirth ?? undefined,
27913
28177
  age: pax?.dateOfBirth ? getAgeAtReferenceDate(pax.dateOfBirth, referenceDate) : undefined,
27914
28178
  isMainBooker: pax?.isMainBooker,
27915
- email: ''
28179
+ email: '',
28180
+ weight: null,
28181
+ weightType: build.WeightType.kilograms,
28182
+ height: null,
28183
+ heightType: build.HeightType.centimeters,
28184
+ customFields: []
27916
28185
  });
27917
28186
  const getRequestRoomsFromPackagingEntry = (entry) => {
27918
28187
  const accommodationLines = (entry.lines ?? []).filter((line) => line.serviceType === ACCOMMODATION_SERVICE_TYPE && line.pax?.length > 0);
@@ -28232,8 +28501,6 @@ const buildTrajectNodeRequest = ({ node, line }, context, productCode, destinati
28232
28501
  language: context.language,
28233
28502
  serviceType: node.serviceType,
28234
28503
  fromDate: toDateOnlyString(line.from),
28235
- // An excursion happens on a day rather than over a span. The traject gives its line an end a day
28236
- // out, the way a night is counted, which asks the search for a window it does not have.
28237
28504
  toDate: toDateOnlyString(node.serviceType === EXCURSION_SERVICE_TYPE ? line.from : line.to),
28238
28505
  destination: destination ?? buildDestination(line, node),
28239
28506
  productCode,
@@ -31153,7 +31420,7 @@ const Filters = ({ initialFilters, filters, isOpen, handleSetIsOpen, isLoading,
31153
31420
  const max = filter.max ?? 100;
31154
31421
  const selectedMin = filter.selectedMin ?? min;
31155
31422
  const selectedMax = filter.selectedMax ?? max;
31156
- return (React__default.createElement(MultiRangeFilter, { min: min, max: max, selectedMin: selectedMin, selectedMax: selectedMax, valueFormatter: (value) => `${value}`, onChange: (newMin, newMax) => {
31423
+ return (React__default.createElement(MultiRangeFilter, { min: min, max: max, selectedMin: selectedMin, selectedMax: selectedMax, valueFormatter: (value) => (filter.property === 'price' ? value.toFixed(2).replace('.', ',') : `${value}`), onChange: (newMin, newMax) => {
31157
31424
  handleSliderChange(filter, newMin, newMax);
31158
31425
  } }));
31159
31426
  })(),
@@ -32645,7 +32912,7 @@ const FlightFilters = ({ isOpen, handleSetIsOpen, isLoading }) => {
32645
32912
  !isEmpty$1(priceRangeValues) &&
32646
32913
  (() => {
32647
32914
  return (React__default.createElement("div", { className: "search__filter-rows" },
32648
- React__default.createElement(MultiRangeFilter, { min: minPrice, max: maxPrice, selectedMin: first(priceRangeValues) ?? minPrice, selectedMax: last(priceRangeValues) ?? maxPrice, valueFormatter: (value) => `€${value}`, onChange: (newMin, newMax) => {
32915
+ React__default.createElement(MultiRangeFilter, { min: minPrice, max: maxPrice, selectedMin: first(priceRangeValues) ?? minPrice, selectedMax: last(priceRangeValues) ?? maxPrice, valueFormatter: (value) => `€${value.toFixed(2).replace('.', ',')}`, onChange: (newMin, newMax) => {
32649
32916
  handlePriceSliderChange([newMin, newMax]);
32650
32917
  } })));
32651
32918
  })()))))));
@@ -33305,7 +33572,12 @@ const getRequestRoomsFromPackagingSegments = (entry, segments) => {
33305
33572
  dateOfBirth: paxSource?.dateOfBirth ?? undefined,
33306
33573
  age: paxSource?.dateOfBirth ? undefined : 30,
33307
33574
  isMainBooker: paxSource?.isMainBooker,
33308
- email: ''
33575
+ email: '',
33576
+ weight: null,
33577
+ weightType: build.WeightType.kilograms,
33578
+ height: null,
33579
+ heightType: build.HeightType.centimeters,
33580
+ customFields: []
33309
33581
  };
33310
33582
  if (!groupedByRoom.has(roomIndexWithinLine)) {
33311
33583
  groupedByRoom.set(roomIndexWithinLine, []);
@@ -34313,6 +34585,7 @@ const getNodeIcon = (node) => {
34313
34585
  const isRenderableNode = (node) => node.trajectNodeType === REGULAR_TRAJECT_NODE_TYPE &&
34314
34586
  (node.serviceType === ACCOMMODATION_SERVICE_TYPE || node.serviceType === EXCURSION_SERVICE_TYPE || node.serviceType === FLIGHT_SERVICE_TYPE);
34315
34587
  const MAX_DAY_ACTIVITIES = 6;
34588
+ const MAX_HOTEL_RESULTS = 6;
34316
34589
  const TrajectResults = ({ isLoading }) => {
34317
34590
  const context = useContext(SearchResultsConfigurationContext);
34318
34591
  const dispatch = useDispatch();
@@ -34322,6 +34595,8 @@ const TrajectResults = ({ isLoading }) => {
34322
34595
  const { trajectNodeAvailability, trajectFlightAvailability, trajectDaySuggestions, editablePackagingEntry } = useSelector((state) => state.searchResults);
34323
34596
  const trajectEntry = context?.trajectEntry;
34324
34597
  const hideShowMoreResults = !!context?.hideShowMoreResults;
34598
+ const loadDayActivitiesOnDemand = !!context?.loadDayActivitiesOnDemand;
34599
+ const showNonPreferredHotels = !!context?.showNonPreferredHotels;
34325
34600
  const nodesWithLines = useMemo(() => (trajectEntry ? getTrajectNodesWithLines(trajectEntry) : []), [trajectEntry]);
34326
34601
  const lineByNodeId = useMemo(() => new Map(nodesWithLines.map((x) => [x.node.nodeId, x])), [nodesWithLines]);
34327
34602
  const nodesByDay = useMemo(() => {
@@ -34359,13 +34634,14 @@ const TrajectResults = ({ isLoading }) => {
34359
34634
  /**
34360
34635
  * Each day's activities are one more search, and a traject has as many as it has days. They go
34361
34636
  * out together, but only once the trip itself has resolved — sharing the connections with the
34362
- * searches the trip cannot do without would only make those slower.
34637
+ * searches the trip cannot do without would only make those slower. A portal can turn the
34638
+ * automatic load off, and then each day waits for its own "show activities" click instead.
34363
34639
  */
34364
34640
  useEffect(() => {
34365
- if (!trajectEntry || !tripResolved)
34641
+ if (!trajectEntry || !tripResolved || loadDayActivitiesOnDemand)
34366
34642
  return;
34367
34643
  (trajectEntry.traject.days ?? []).filter((day) => stayByDay.has(day.order)).forEach((day) => loadDay(day));
34368
- }, [trajectEntry, tripResolved, stayByDay]);
34644
+ }, [trajectEntry, tripResolved, stayByDay, loadDayActivitiesOnDemand]);
34369
34645
  if (!context || !trajectEntry)
34370
34646
  return null;
34371
34647
  const handleSelect = (item, code) => {
@@ -34439,6 +34715,10 @@ const TrajectResults = ({ isLoading }) => {
34439
34715
  const selected = results.find((x) => x.code === availability?.selectedCode) ?? null;
34440
34716
  const configured = results.filter((x) => x.code !== selected?.code && !!findCandidateForResult(node, x));
34441
34717
  const others = results.filter((x) => x.code !== selected?.code && !findCandidateForResult(node, x));
34718
+ // A hotel row holds the hotels configured on the node; a portal can also let it fill up with
34719
+ // non-preferred hotels found in the area, the rest staying behind "show more".
34720
+ const fill = showNonPreferredHotels && node.serviceType === ACCOMMODATION_SERVICE_TYPE ? others.slice(0, Math.max(MAX_HOTEL_RESULTS - 1 - configured.length, 0)) : [];
34721
+ const remaining = others.length - fill.length;
34442
34722
  // No entry yet means the node's search has been queued but not dispatched — still loading.
34443
34723
  const status = availability?.status ?? 'loading';
34444
34724
  return (React__default.createElement(React__default.Fragment, { key: line.guid },
@@ -34458,12 +34738,12 @@ const TrajectResults = ({ isLoading }) => {
34458
34738
  node.preferredAccommodationName,
34459
34739
  " \u2014 ",
34460
34740
  translations.SRP.NO_RESULTS))),
34461
- React__default.createElement("div", { className: "search__results__cards search__results__cards--scroll" }, [selected, ...configured].map((result) => (React__default.createElement(TrajectNodeCard, { key: result.code, node: node, result: result, isSelected: result.code === selected.code, languageCode: context.languageCode, translations: translations, onSelect: () => handleSelect(item, result.code), onEditOptions: node.serviceType === ACCOMMODATION_SERVICE_TYPE ? () => handleEditOptions(item) : undefined, showNights: node.serviceType === ACCOMMODATION_SERVICE_TYPE })))),
34462
- others.length > 0 && !hideShowMoreResults && (React__default.createElement("div", { className: "search__results__cards__actions" },
34741
+ React__default.createElement("div", { className: "search__results__cards search__results__cards--scroll" }, [selected, ...configured, ...fill].map((result) => (React__default.createElement(TrajectNodeCard, { key: result.code, node: node, result: result, isSelected: result.code === selected.code, languageCode: context.languageCode, translations: translations, onSelect: () => handleSelect(item, result.code), onEditOptions: node.serviceType === ACCOMMODATION_SERVICE_TYPE ? () => handleEditOptions(item) : undefined, showNights: node.serviceType === ACCOMMODATION_SERVICE_TYPE })))),
34742
+ remaining > 0 && !hideShowMoreResults && (React__default.createElement("div", { className: "search__results__cards__actions" },
34463
34743
  React__default.createElement("button", { type: "button", className: "cta cta--secondary", onClick: () => handleShowMore(item) },
34464
34744
  translations.SRP.SHOW_MORE,
34465
34745
  " (",
34466
- others.length,
34746
+ remaining,
34467
34747
  ")")))))));
34468
34748
  };
34469
34749
  const handleSelectFlight = (item, flight) => {
@@ -34554,6 +34834,7 @@ const TrajectResults = ({ isLoading }) => {
34554
34834
  return null;
34555
34835
  const visible = cards.slice(0, MAX_DAY_ACTIVITIES);
34556
34836
  const hidden = cards.length - visible.length;
34837
+ const awaitsRequest = loadDayActivitiesOnDemand && !suggestions && canSearch && !nodesResolving && hidden === 0;
34557
34838
  return (React__default.createElement(React__default.Fragment, { key: `activities-${day.order}` },
34558
34839
  React__default.createElement("div", { className: "search__results__label search__results__label--sub" },
34559
34840
  React__default.createElement("div", { className: "search__results__label__text" },
@@ -34563,11 +34844,13 @@ const TrajectResults = ({ isLoading }) => {
34563
34844
  (nodesResolving || isSearching) && !cards.length && React__default.createElement(Spinner, { label: translations.SRP.LOADING_ACTIVITIES }),
34564
34845
  !!cards.length && React__default.createElement("div", { className: "search__results__cards search__results__cards--scroll" }, visible.map(renderActivityCard)),
34565
34846
  !nodesResolving && !isSearching && !cards.length && (!!items.length || !!suggestions) && (React__default.createElement("div", { className: "no-results" }, translations.SRP.NO_RESULTS)),
34566
- React__default.createElement("div", { className: "search__results__cards__actions" }, hidden > 0 && !hideShowMoreResults && (React__default.createElement("button", { type: "button", className: "cta cta--secondary", onClick: () => handleShowMoreActivities(day.order) },
34567
- translations.SRP.SHOW_MORE,
34568
- " (",
34569
- hidden,
34570
- ")")))));
34847
+ React__default.createElement("div", { className: "search__results__cards__actions" },
34848
+ awaitsRequest && (React__default.createElement("button", { type: "button", className: "cta cta--secondary", onClick: () => loadDay(day) }, translations.SRP.SHOW_ACTIVITIES)),
34849
+ hidden > 0 && !hideShowMoreResults && (React__default.createElement("button", { type: "button", className: "cta cta--secondary", onClick: () => handleShowMoreActivities(day.order) },
34850
+ translations.SRP.SHOW_MORE,
34851
+ " (",
34852
+ hidden,
34853
+ ")")))));
34571
34854
  };
34572
34855
  /**
34573
34856
  * An activity the traject books is swapped for another, the way a hotel is; one the traveller