@qite/tide-booking-component 1.4.69 → 1.4.70

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.
Files changed (61) hide show
  1. package/build/build-cjs/index.js +585 -445
  2. package/build/build-cjs/src/qsm/store/qsm-slice.d.ts +4 -4
  3. package/build/build-cjs/src/qsm/types.d.ts +2 -14
  4. package/build/build-cjs/src/search-results/components/filters/filters.d.ts +1 -1
  5. package/build/build-cjs/src/search-results/components/filters/utility.d.ts +2 -2
  6. package/build/build-cjs/src/search-results/components/group-tour/group-tour-card.d.ts +8 -0
  7. package/build/build-cjs/src/search-results/components/group-tour/group-tour-results.d.ts +6 -0
  8. package/build/build-cjs/src/search-results/components/hotel/hotel-accommodation-results.d.ts +0 -2
  9. package/build/build-cjs/src/search-results/store/search-results-slice.d.ts +3 -6
  10. package/build/build-cjs/src/search-results/types.d.ts +7 -2
  11. package/build/build-cjs/src/search-results/utils/search-results-utils.d.ts +3 -0
  12. package/build/build-cjs/src/shared/components/flyin.d.ts +1 -1
  13. package/build/build-cjs/src/shared/types.d.ts +12 -0
  14. package/build/build-cjs/src/shared/utils/localization-util.d.ts +4 -0
  15. package/build/build-esm/index.js +585 -444
  16. package/build/build-esm/src/qsm/store/qsm-slice.d.ts +4 -4
  17. package/build/build-esm/src/qsm/types.d.ts +2 -14
  18. package/build/build-esm/src/search-results/components/filters/filters.d.ts +1 -1
  19. package/build/build-esm/src/search-results/components/filters/utility.d.ts +2 -2
  20. package/build/build-esm/src/search-results/components/group-tour/group-tour-card.d.ts +8 -0
  21. package/build/build-esm/src/search-results/components/group-tour/group-tour-results.d.ts +6 -0
  22. package/build/build-esm/src/search-results/components/hotel/hotel-accommodation-results.d.ts +0 -2
  23. package/build/build-esm/src/search-results/store/search-results-slice.d.ts +3 -6
  24. package/build/build-esm/src/search-results/types.d.ts +7 -2
  25. package/build/build-esm/src/search-results/utils/search-results-utils.d.ts +3 -0
  26. package/build/build-esm/src/shared/components/flyin.d.ts +1 -1
  27. package/build/build-esm/src/shared/types.d.ts +12 -0
  28. package/build/build-esm/src/shared/utils/localization-util.d.ts +4 -0
  29. package/package.json +1 -1
  30. package/src/qsm/components/QSMContainer/qsm-container.tsx +3 -2
  31. package/src/qsm/store/qsm-slice.ts +4 -4
  32. package/src/qsm/types.ts +2 -15
  33. package/src/search-results/components/filters/filters.tsx +136 -293
  34. package/src/search-results/components/filters/utility.tsx +61 -2
  35. package/src/search-results/components/group-tour/group-tour-card.tsx +86 -0
  36. package/src/search-results/components/group-tour/group-tour-results.tsx +40 -0
  37. package/src/search-results/components/hotel/hotel-accommodation-results.tsx +13 -16
  38. package/src/search-results/components/icon.tsx +18 -0
  39. package/src/search-results/components/search-results-container/search-results-container.tsx +31 -19
  40. package/src/search-results/store/search-results-slice.ts +8 -2
  41. package/src/search-results/types.ts +9 -2
  42. package/src/search-results/utils/search-results-utils.ts +42 -0
  43. package/src/shared/components/flyin.tsx +2 -1
  44. package/src/shared/translations/ar-SA.json +2 -1
  45. package/src/shared/translations/da-DK.json +2 -1
  46. package/src/shared/translations/de-DE.json +2 -1
  47. package/src/shared/translations/en-GB.json +2 -1
  48. package/src/shared/translations/es-ES.json +2 -1
  49. package/src/shared/translations/fr-BE.json +2 -1
  50. package/src/shared/translations/fr-FR.json +2 -1
  51. package/src/shared/translations/is-IS.json +2 -1
  52. package/src/shared/translations/it-IT.json +2 -1
  53. package/src/shared/translations/ja-JP.json +2 -1
  54. package/src/shared/translations/nl-BE.json +2 -1
  55. package/src/shared/translations/nl-NL.json +2 -1
  56. package/src/shared/translations/no-NO.json +2 -1
  57. package/src/shared/translations/pl-PL.json +2 -1
  58. package/src/shared/translations/pt-PT.json +2 -1
  59. package/src/shared/translations/sv-SE.json +2 -1
  60. package/src/shared/types.ts +13 -0
  61. package/src/shared/utils/localization-util.ts +16 -0
@@ -620,7 +620,8 @@ var SRP$f = {
620
620
  DEPARTURE_TIME_ASC: 'وقت المغادرة تصاعدياً',
621
621
  DEPARTURE_TIME_DESC: 'وقت المغادرة تنازلياً',
622
622
  DURATION_ASC: 'المدة تصاعدياً',
623
- DURATION_DESC: 'المدة تنازلياً'
623
+ DURATION_DESC: 'المدة تنازلياً',
624
+ TRAVEL_GROUP: 'مجموعة المسافرين'
624
625
  };
625
626
  var arJson = {
626
627
  STEPS: STEPS$f,
@@ -1019,7 +1020,8 @@ var SRP$e = {
1019
1020
  DEPARTURE_TIME_ASC: 'Afgangstid stigende',
1020
1021
  DEPARTURE_TIME_DESC: 'Afgangstid faldende',
1021
1022
  DURATION_ASC: 'Varighed stigende',
1022
- DURATION_DESC: 'Varighed faldende'
1023
+ DURATION_DESC: 'Varighed faldende',
1024
+ TRAVEL_GROUP: 'Rejseselskab'
1023
1025
  };
1024
1026
  var daJson = {
1025
1027
  STEPS: STEPS$e,
@@ -1419,7 +1421,8 @@ var SRP$d = {
1419
1421
  DEPARTURE_RANGE: 'Abflugzeitraum',
1420
1422
  DEPARTURE_AIRPORTS: 'Abflughäfen',
1421
1423
  ARRIVAL_AIRPORTS: 'Ankunftsflughäfen',
1422
- PRICE: 'Preis'
1424
+ PRICE: 'Preis',
1425
+ TRAVEL_GROUP: 'Reisegruppe'
1423
1426
  };
1424
1427
  var deJson = {
1425
1428
  STEPS: STEPS$d,
@@ -1822,7 +1825,8 @@ var SRP$c = {
1822
1825
  NIGHT_RANGE: 'Night',
1823
1826
  DEPARTURE_RANGE: 'Departure range',
1824
1827
  DEPARTURE_AIRPORTS: 'Departure airports',
1825
- ARRIVAL_AIRPORTS: 'Arrival airports'
1828
+ ARRIVAL_AIRPORTS: 'Arrival airports',
1829
+ TRAVEL_GROUP: 'Travel group'
1826
1830
  };
1827
1831
  var enJson = {
1828
1832
  STEPS: STEPS$c,
@@ -2222,7 +2226,8 @@ var SRP$b = {
2222
2226
  DEPARTURE_RANGE: 'Franja de salida',
2223
2227
  DEPARTURE_AIRPORTS: 'Aeropuertos de salida',
2224
2228
  ARRIVAL_AIRPORTS: 'Aeropuertos de llegada',
2225
- PRICE: 'Precio'
2229
+ PRICE: 'Precio',
2230
+ TRAVEL_GROUP: 'Grupo de viaje'
2226
2231
  };
2227
2232
  var esJson = {
2228
2233
  STEPS: STEPS$b,
@@ -2626,7 +2631,8 @@ var SRP$a = {
2626
2631
  DEPARTURE_RANGE: 'Plage de départ',
2627
2632
  DEPARTURE_AIRPORTS: 'Aéroports de départ',
2628
2633
  ARRIVAL_AIRPORTS: 'Aéroports d’arrivée',
2629
- PRICE: 'Prix'
2634
+ PRICE: 'Prix',
2635
+ TRAVEL_GROUP: 'Groupe de voyageurs'
2630
2636
  };
2631
2637
  var frBeJson = {
2632
2638
  STEPS: STEPS$a,
@@ -3025,7 +3031,8 @@ var SRP$9 = {
3025
3031
  DEPARTURE_RANGE: 'Plage de départ',
3026
3032
  DEPARTURE_AIRPORTS: 'Aéroports de départ',
3027
3033
  ARRIVAL_AIRPORTS: 'Aéroports d’arrivée',
3028
- PRICE: 'Prix'
3034
+ PRICE: 'Prix',
3035
+ TRAVEL_GROUP: 'Groupe de voyageurs'
3029
3036
  };
3030
3037
  var frFrJson = {
3031
3038
  STEPS: STEPS$9,
@@ -3424,7 +3431,8 @@ var SRP$8 = {
3424
3431
  DEPARTURE_RANGE: 'Brottfarartímabil',
3425
3432
  DEPARTURE_AIRPORTS: 'Brottfararflugvellir',
3426
3433
  ARRIVAL_AIRPORTS: 'Komuflugvellir',
3427
- PRICE: 'Verð'
3434
+ PRICE: 'Verð',
3435
+ TRAVEL_GROUP: 'Ferðahópur'
3428
3436
  };
3429
3437
  var isJson = {
3430
3438
  STEPS: STEPS$8,
@@ -3824,7 +3832,8 @@ var SRP$7 = {
3824
3832
  DEPARTURE_RANGE: 'Fascia di partenza',
3825
3833
  DEPARTURE_AIRPORTS: 'Aeroporti di partenza',
3826
3834
  ARRIVAL_AIRPORTS: 'Aeroporti di arrivo',
3827
- PRICE: 'Prezzo'
3835
+ PRICE: 'Prezzo',
3836
+ TRAVEL_GROUP: 'Gruppo di viaggio'
3828
3837
  };
3829
3838
  var itJson = {
3830
3839
  STEPS: STEPS$7,
@@ -4228,7 +4237,8 @@ var SRP$6 = {
4228
4237
  DEPARTURE_RANGE: 'Vertrektijdstip',
4229
4238
  DEPARTURE_AIRPORTS: 'Vertrekluchthavens',
4230
4239
  ARRIVAL_AIRPORTS: 'Aankomstluchthavens',
4231
- PRICE: 'Prijs'
4240
+ PRICE: 'Prijs',
4241
+ TRAVEL_GROUP: 'Reisgezelschap'
4232
4242
  };
4233
4243
  var nlBeJson = {
4234
4244
  STEPS: STEPS$6,
@@ -4628,7 +4638,8 @@ var SRP$5 = {
4628
4638
  DEPARTURE_RANGE: 'Vertrektijdstip',
4629
4639
  DEPARTURE_AIRPORTS: 'Vertrekluchthavens',
4630
4640
  ARRIVAL_AIRPORTS: 'Aankomstluchthavens',
4631
- PRICE: 'Prijs'
4641
+ PRICE: 'Prijs',
4642
+ TRAVEL_GROUP: 'Reisgezelschap'
4632
4643
  };
4633
4644
  var nlNlJson = {
4634
4645
  STEPS: STEPS$5,
@@ -5028,7 +5039,8 @@ var SRP$4 = {
5028
5039
  DEPARTURE_RANGE: 'Avgangsperiode',
5029
5040
  DEPARTURE_AIRPORTS: 'Avgangsflyplasser',
5030
5041
  ARRIVAL_AIRPORTS: 'Ankomstflyplasser',
5031
- PRICE: 'Pris'
5042
+ PRICE: 'Pris',
5043
+ TRAVEL_GROUP: 'Reisefølge'
5032
5044
  };
5033
5045
  var noJson = {
5034
5046
  STEPS: STEPS$4,
@@ -5428,7 +5440,8 @@ var SRP$3 = {
5428
5440
  DEPARTURE_RANGE: 'Zakres wylotu',
5429
5441
  DEPARTURE_AIRPORTS: 'Lotniska wylotu',
5430
5442
  ARRIVAL_AIRPORTS: 'Lotniska przylotu',
5431
- PRICE: 'Cena'
5443
+ PRICE: 'Cena',
5444
+ TRAVEL_GROUP: 'Grupa podróżnych'
5432
5445
  };
5433
5446
  var plJson = {
5434
5447
  STEPS: STEPS$3,
@@ -5828,7 +5841,8 @@ var SRP$2 = {
5828
5841
  DEPARTURE_RANGE: 'Intervalo de partida',
5829
5842
  DEPARTURE_AIRPORTS: 'Aeroportos de partida',
5830
5843
  ARRIVAL_AIRPORTS: 'Aeroportos de chegada',
5831
- PRICE: 'Preço'
5844
+ PRICE: 'Preço',
5845
+ TRAVEL_GROUP: 'Grupo de viajantes'
5832
5846
  };
5833
5847
  var ptJson = {
5834
5848
  STEPS: STEPS$2,
@@ -6228,7 +6242,8 @@ var SRP$1 = {
6228
6242
  DEPARTURE_RANGE: 'Avgångsintervall',
6229
6243
  DEPARTURE_AIRPORTS: 'Avgångsflygplatser',
6230
6244
  ARRIVAL_AIRPORTS: 'Ankomstflygplatser',
6231
- PRICE: 'Pris'
6245
+ PRICE: 'Pris',
6246
+ TRAVEL_GROUP: 'Resesällskap'
6232
6247
  };
6233
6248
  var svJson = {
6234
6249
  STEPS: STEPS$1,
@@ -6626,7 +6641,8 @@ var SRP = {
6626
6641
  DEPARTURE_RANGE: '出発時間帯',
6627
6642
  DEPARTURE_AIRPORTS: '出発空港',
6628
6643
  ARRIVAL_AIRPORTS: '到着空港',
6629
- PRICE: '価格'
6644
+ PRICE: '価格',
6645
+ TRAVEL_GROUP: '旅行グループ'
6630
6646
  };
6631
6647
  var jaJson = {
6632
6648
  STEPS: STEPS,
@@ -6833,6 +6849,18 @@ var rangeFromDateTimeInMinutes = function (dateTime) {
6833
6849
  return exports.DepartureRange.Night;
6834
6850
  }
6835
6851
  };
6852
+ var calculateNights = function (fromDate, toDate) {
6853
+ var from = new Date(fromDate);
6854
+ var to = new Date(toDate);
6855
+ // Normalize to midnight to avoid time issues
6856
+ from.setHours(0, 0, 0, 0);
6857
+ to.setHours(0, 0, 0, 0);
6858
+ var diffTime = to.getTime() - from.getTime();
6859
+ return diffTime / (1000 * 60 * 60 * 24);
6860
+ };
6861
+ var calculateDays = function (fromDate, toDate) {
6862
+ return calculateNights(fromDate, toDate) + 1;
6863
+ };
6836
6864
 
6837
6865
  var getDateFromParams = function (params, name) {
6838
6866
  var dateString = params.get(name);
@@ -33425,6 +33453,7 @@ var SearchResultsConfigurationContext = React__default['default'].createContext(
33425
33453
  var _a;
33426
33454
  var initialState$1 = {
33427
33455
  results: [],
33456
+ filteredResults: [],
33428
33457
  selectedHotelId: null,
33429
33458
  selectedFlight: null,
33430
33459
  selectedFlightDetails: null,
@@ -33442,7 +33471,10 @@ var searchResultsSlice = toolkit.createSlice({
33442
33471
  initialState: initialState$1,
33443
33472
  reducers: {
33444
33473
  setResults: function (state, action) {
33445
- state.results = action.payload.results;
33474
+ state.results = action.payload;
33475
+ },
33476
+ setFilteredResults: function (state, action) {
33477
+ state.filteredResults = action.payload;
33446
33478
  },
33447
33479
  setSelectedHotel: function (state, action) {
33448
33480
  state.selectedHotelId = action.payload;
@@ -33511,6 +33543,7 @@ var searchResultsSlice = toolkit.createSlice({
33511
33543
  }
33512
33544
  });
33513
33545
  var setResults = ((_a = searchResultsSlice.actions), _a.setResults),
33546
+ setFilteredResults = _a.setFilteredResults,
33514
33547
  setSelectedHotel = _a.setSelectedHotel,
33515
33548
  setSelectedFlight = _a.setSelectedFlight,
33516
33549
  setSelectedFlightDetails = _a.setSelectedFlightDetails,
@@ -34527,6 +34560,27 @@ var Icon$1 = function (_a) {
34527
34560
  fill: 'currentColor'
34528
34561
  })
34529
34562
  );
34563
+ case 'ui-other':
34564
+ return React__default['default'].createElement(
34565
+ 'svg',
34566
+ {
34567
+ className: ['icon', 'icon--'.concat(name), className]
34568
+ .filter(function (className) {
34569
+ return !lodash.isEmpty(className);
34570
+ })
34571
+ .join(' '),
34572
+ width: width,
34573
+ height: height,
34574
+ viewBox: '0 0 640 512',
34575
+ fill: fill !== null && fill !== void 0 ? fill : 'currentColor'
34576
+ },
34577
+ React__default['default'].createElement(HTMLComment, { text: '!Font Awesome Free 6.7.2 - mars-and-venus' }),
34578
+ title && React__default['default'].createElement('title', null, title),
34579
+ React__default['default'].createElement('path', {
34580
+ d: 'M320 32c0-17.7 14.3-32 32-32l128 0c17.7 0 32 14.3 32 32l0 128c0 17.7-14.3 32-32 32s-32-14.3-32-32l0-50.7-64.2 64.2c19.5 28.4 31 62.7 31 99.8 0 97.2-78.8 176-176 176S32 401.2 32 304s78.8-176 176-176c37.1 0 71.4 11.5 99.8 31l64.2-64.2L320 96c-17.7 0-32-14.3-32-32zM208 416a112 112 0 1 0 0-224 112 112 0 1 0 0 224z',
34581
+ fill: 'currentColor'
34582
+ })
34583
+ );
34530
34584
  default:
34531
34585
  return null;
34532
34586
  }
@@ -38036,7 +38090,9 @@ var mapSearchResult = function (searchResult, cmsItem, languageCode, translation
38036
38090
  : ((_h = cmsItem === null || cmsItem === void 0 ? void 0 : cmsItem.parentItem) === null || _h === void 0 ? void 0 : _h.name) || '',
38037
38091
  price: formatPrice(searchResult.price, searchResult.currencyCode, languageCode),
38038
38092
  ctaText: translations === null || translations === void 0 ? void 0 : translations.SRP.VIEW_DETAILS,
38039
- days: calculateNights(searchResult.stayFromDate, searchResult.stayToDate, translations),
38093
+ days: ''
38094
+ .concat(calculateNights(searchResult.stayFromDate, searchResult.stayToDate), ' ')
38095
+ .concat(translations === null || translations === void 0 ? void 0 : translations.SRP.NIGHTS),
38040
38096
  accommodation: searchResult.accommodationName,
38041
38097
  regime: searchResult.regimeName,
38042
38098
  stars:
@@ -38045,17 +38101,13 @@ var mapSearchResult = function (searchResult, cmsItem, languageCode, translation
38045
38101
  : _k.stars) || searchResult.hotelStars
38046
38102
  };
38047
38103
  };
38048
- var calculateNights = function (fromDate, toDate, translations) {
38049
- var from = new Date(fromDate).getTime(); // returns a number
38050
- var to = new Date(toDate).getTime(); // returns a number
38051
- var diffTime = Math.abs(to - from);
38052
- var diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
38053
- return ''.concat(diffDays, ' ').concat(translations === null || translations === void 0 ? void 0 : translations.SRP.NIGHTS);
38054
- };
38055
38104
  var HotelAccommodationResults = function (_a) {
38056
38105
  var _b, _c;
38057
- var isLoading = _a.isLoading,
38058
- context = _a.context;
38106
+ var isLoading = _a.isLoading;
38107
+ var context = React.useContext(SearchResultsConfigurationContext);
38108
+ if (!context) {
38109
+ return;
38110
+ }
38059
38111
  if (context.showMockup) {
38060
38112
  return showMocukups(context);
38061
38113
  }
@@ -38072,9 +38124,9 @@ var HotelAccommodationResults = function (_a) {
38072
38124
  var _d = reactRedux.useSelector(function (state) {
38073
38125
  return state.searchResults;
38074
38126
  }),
38075
- results = _d.results,
38127
+ filteredResults = _d.filteredResults,
38076
38128
  activeTab = _d.activeTab;
38077
- if (!results.length) {
38129
+ if (!filteredResults.length) {
38078
38130
  return React__default['default'].createElement('div', { className: 'no-results' }, translations.SRP.NO_RESULTS);
38079
38131
  }
38080
38132
  var cmsMap = React__default['default'].useMemo(
@@ -38098,7 +38150,7 @@ var HotelAccommodationResults = function (_a) {
38098
38150
  },
38099
38151
  [context.cmsHotelData]
38100
38152
  );
38101
- var firstResult = results === null || results === void 0 ? void 0 : results[0];
38153
+ var firstResult = filteredResults === null || filteredResults === void 0 ? void 0 : filteredResults[0];
38102
38154
  var firstResultDay = (firstResult === null || firstResult === void 0 ? void 0 : firstResult.fromDate)
38103
38155
  ? dateFns.format(dateFns.parseISO(firstResult.fromDate), 'd')
38104
38156
  : null;
@@ -38129,7 +38181,7 @@ var HotelAccommodationResults = function (_a) {
38129
38181
  )
38130
38182
  )
38131
38183
  ),
38132
- renderResults(results, context, cmsMap, activeTab, translations)
38184
+ renderResults(filteredResults, context, cmsMap, activeTab, translations)
38133
38185
  );
38134
38186
  };
38135
38187
  var showMocukups = function (context) {
@@ -38472,12 +38524,11 @@ var RoundTripResults = function () {
38472
38524
  );
38473
38525
  };
38474
38526
 
38475
- var enrichFiltersWithResults = function (results, filters) {
38527
+ var enrichFiltersWithResults = function (results, filters, tags) {
38476
38528
  if (!results || results.length === 0 || !filters) {
38477
38529
  return filters !== null && filters !== void 0 ? filters : [];
38478
38530
  }
38479
- for (var _i = 0, filters_1 = filters; _i < filters_1.length; _i++) {
38480
- var filter = filters_1[_i];
38531
+ var _loop_1 = function (filter) {
38481
38532
  if (filter.property === 'price' && (filter.min == null || filter.max == null)) {
38482
38533
  var prices = results
38483
38534
  .map(function (r) {
@@ -38492,6 +38543,72 @@ var enrichFiltersWithResults = function (results, filters) {
38492
38543
  filter.max = Math.ceil(Math.max.apply(Math, prices));
38493
38544
  }
38494
38545
  }
38546
+ if (filter.property === 'accommodation') {
38547
+ var map_1 = new Map();
38548
+ results.forEach(function (r) {
38549
+ if (r.accommodationCode) {
38550
+ map_1.set(r.accommodationCode, {
38551
+ name: r.accommodationName,
38552
+ code: r.accommodationCode
38553
+ });
38554
+ }
38555
+ });
38556
+ console.log('map', map_1);
38557
+ filter.options = Array.from(map_1.values()).map(function (accommodation) {
38558
+ var _a;
38559
+ return {
38560
+ label: (_a = accommodation.name) !== null && _a !== void 0 ? _a : accommodation.code,
38561
+ value: accommodation.code,
38562
+ isChecked: false
38563
+ };
38564
+ });
38565
+ }
38566
+ if (filter.property === 'regime') {
38567
+ var map_2 = new Map();
38568
+ results.forEach(function (r) {
38569
+ if (r.regimeCode) {
38570
+ map_2.set(r.regimeCode, {
38571
+ name: r.regimeName,
38572
+ code: r.regimeCode
38573
+ });
38574
+ }
38575
+ });
38576
+ filter.options = Array.from(map_2.values()).map(function (regime) {
38577
+ var _a;
38578
+ return {
38579
+ label: (_a = regime.name) !== null && _a !== void 0 ? _a : regime.code,
38580
+ value: regime.code,
38581
+ isChecked: false
38582
+ };
38583
+ });
38584
+ }
38585
+ if (filter.property === 'theme') {
38586
+ var map_3 = new Map();
38587
+ results.forEach(function (r) {
38588
+ var _a;
38589
+ (_a = r.tagIds) === null || _a === void 0
38590
+ ? void 0
38591
+ : _a.forEach(function (tagId) {
38592
+ var tag = tags.find(function (t) {
38593
+ return t.id === tagId;
38594
+ });
38595
+ if (tag && tag.id != null && tag.name != null) {
38596
+ map_3.set(tag.id, { name: tag.name, id: tag.id });
38597
+ }
38598
+ });
38599
+ });
38600
+ filter.options = Array.from(map_3.values()).map(function (theme) {
38601
+ return {
38602
+ label: theme.name,
38603
+ value: theme.id,
38604
+ isChecked: false
38605
+ };
38606
+ });
38607
+ }
38608
+ };
38609
+ for (var _i = 0, filters_1 = filters; _i < filters_1.length; _i++) {
38610
+ var filter = filters_1[_i];
38611
+ _loop_1(filter);
38495
38612
  }
38496
38613
  return filters;
38497
38614
  };
@@ -40863,101 +40980,21 @@ var FlightResultsContainer = function (_a) {
40863
40980
  );
40864
40981
  };
40865
40982
 
40866
- var initialFilters = [
40867
- {
40868
- property: 'regime',
40869
- label: 'Regime',
40870
- type: 'checkbox',
40871
- options: [
40872
- {
40873
- label: 'Room only',
40874
- value: ['RO', 'LO', 'OB'],
40875
- isChecked: false
40876
- },
40877
- {
40878
- label: 'Bed & Beakfast',
40879
- value: ['BB', 'KO'],
40880
- isChecked: false
40881
- },
40882
- {
40883
- label: 'Half board',
40884
- value: ['HB'],
40885
- isChecked: false
40886
- },
40887
- {
40888
- label: 'Full board',
40889
- value: ['FB'],
40890
- isChecked: false
40891
- }
40892
- ],
40893
- isFrontendFilter: false
40894
- },
40895
- {
40896
- property: 'price',
40897
- label: 'Prijs',
40898
- type: 'slider',
40899
- isFrontendFilter: false,
40900
- min: 2244,
40901
- max: 6785
40902
- },
40903
- {
40904
- property: 'rating',
40905
- label: 'Rating',
40906
- type: 'star-rating',
40907
- isFrontendFilter: true
40908
- },
40909
- {
40910
- property: 'theme',
40911
- label: "Thema's",
40912
- type: 'toggle',
40913
- options: [
40914
- {
40915
- label: 'Adults',
40916
- value: 1,
40917
- isChecked: false
40918
- },
40919
- {
40920
- label: 'Luxury',
40921
- value: 2,
40922
- isChecked: false
40923
- },
40924
- {
40925
- label: 'Welness & Spa',
40926
- value: 3,
40927
- isChecked: false
40928
- },
40929
- {
40930
- label: 'familie',
40931
- value: 4,
40932
- isChecked: false
40933
- }
40934
- ],
40935
- isFrontendFilter: false
40936
- }
40937
- ];
40938
40983
  var Filters = function (_a) {
40939
40984
  var _b;
40940
- var filters = _a.filters,
40985
+ var initialFilters = _a.initialFilters,
40986
+ filters = _a.filters,
40941
40987
  isOpen = _a.isOpen,
40942
40988
  handleSetIsOpen = _a.handleSetIsOpen,
40943
- handleApplyFilters = _a.handleApplyFilters,
40944
40989
  isLoading = _a.isLoading;
40945
40990
  var context = React.useContext(SearchResultsConfigurationContext);
40991
+ if (!context || !context.showFilters) {
40992
+ return null;
40993
+ }
40946
40994
  var translations = getTranslations((_b = context === null || context === void 0 ? void 0 : context.languageCode) !== null && _b !== void 0 ? _b : 'en-GB');
40947
40995
  var _c = React.useState({}),
40948
40996
  visibleFilters = _c[0],
40949
40997
  setVisibleFilters = _c[1];
40950
- var _d = React.useState([]),
40951
- pendingFilters = _d[0],
40952
- setPendingFilters = _d[1];
40953
- React.useEffect(
40954
- function () {
40955
- if (initialFilters.length > 0) {
40956
- setPendingFilters(initialFilters);
40957
- }
40958
- },
40959
- [initialFilters]
40960
- );
40961
40998
  var dispatch = reactRedux.useDispatch();
40962
40999
  var toggleFilterVisibility = function (filterId) {
40963
41000
  setVisibleFilters(function (prev) {
@@ -40965,331 +41002,429 @@ var Filters = function (_a) {
40965
41002
  return __assign(__assign({}, prev), ((_a = {}), (_a[filterId] = !prev[filterId]), _a));
40966
41003
  });
40967
41004
  };
40968
- var updatePendingFilter = function (updatedFilter) {
40969
- setPendingFilters(function (prevFilters) {
40970
- var index = prevFilters.findIndex(function (f) {
40971
- return f.property === updatedFilter.property;
40972
- });
40973
- if (index !== -1) {
40974
- var newFilters = __spreadArray([], prevFilters, true);
40975
- newFilters[index] = updatedFilter;
40976
- return newFilters;
40977
- } else {
40978
- return __spreadArray(__spreadArray([], prevFilters, true), [updatedFilter], false);
40979
- }
40980
- });
40981
- };
40982
41005
  var handleCheckBoxFilter = function (filter, option) {
40983
- setPendingFilters(function (prev) {
41006
+ var updated = filters.map(function (f) {
40984
41007
  var _a;
40985
- var updated = prev.map(function (f) {
40986
- var _a;
40987
- if (f.property !== filter.property) {
40988
- return f;
40989
- }
40990
- return __assign(__assign({}, f), {
40991
- options:
40992
- (_a = f.options) === null || _a === void 0
40993
- ? void 0
40994
- : _a.map(function (opt) {
40995
- return opt.value === option.value ? __assign(__assign({}, opt), { isChecked: !opt.isChecked }) : opt;
40996
- })
40997
- });
41008
+ if (f.property !== filter.property) return f;
41009
+ return __assign(__assign({}, f), {
41010
+ options:
41011
+ (_a = f.options) === null || _a === void 0
41012
+ ? void 0
41013
+ : _a.map(function (opt) {
41014
+ return opt.value === option.value ? __assign(__assign({}, opt), { isChecked: !opt.isChecked }) : opt;
41015
+ })
40998
41016
  });
40999
- if (!(context === null || context === void 0 ? void 0 : context.useGlobalApplyFilterButton) && !filter.useApplyFilterButton) {
41000
- dispatch(setFilters(updated));
41001
- (_a = context === null || context === void 0 ? void 0 : context.onFilterChange) === null || _a === void 0 ? void 0 : _a.call(context, updated);
41002
- }
41003
- return updated;
41004
41017
  });
41018
+ dispatch(setFilters(updated));
41005
41019
  };
41006
- var handleSliderMinChange = function (filter, value) {
41007
- var _a, _b;
41008
- if (value < ((_b = (_a = filter.selectedMax) !== null && _a !== void 0 ? _a : filter.max) !== null && _b !== void 0 ? _b : 100)) {
41009
- var updatedFilter = __assign(__assign({}, filter), { selectedMin: value });
41010
- updatePendingFilter(updatedFilter);
41011
- if (!(context === null || context === void 0 ? void 0 : context.useGlobalApplyFilterButton) && !filter.useApplyFilterButton) {
41012
- applyFilters();
41013
- }
41014
- }
41015
- };
41016
- var handleSliderMaxChange = function (filter, value) {
41017
- var _a, _b;
41018
- if (value > ((_b = (_a = filter.selectedMin) !== null && _a !== void 0 ? _a : filter.min) !== null && _b !== void 0 ? _b : 0)) {
41019
- var updatedFilter = __assign(__assign({}, filter), { selectedMax: value });
41020
- updatePendingFilter(updatedFilter);
41021
- if (!(context === null || context === void 0 ? void 0 : context.useGlobalApplyFilterButton) && !filter.useApplyFilterButton) {
41022
- applyFilters();
41023
- }
41024
- }
41025
- };
41026
- var applyFilters = function () {
41027
- var _a;
41028
- dispatch(setFilters(pendingFilters));
41029
- (_a = context === null || context === void 0 ? void 0 : context.onFilterChange) === null || _a === void 0 ? void 0 : _a.call(context, pendingFilters);
41030
- handleApplyFilters();
41031
- if (isOpen) {
41032
- handleSetIsOpen();
41033
- }
41020
+ var handleSliderChange = function (filter, newMin, newMax) {
41021
+ var updated = filters.map(function (f) {
41022
+ if (f.property !== filter.property) return f;
41023
+ return __assign(__assign({}, f), { selectedMin: newMin, selectedMax: newMax });
41024
+ });
41025
+ dispatch(setFilters(updated));
41034
41026
  };
41035
41027
  var handleFullReset = function () {
41036
41028
  if (!isLoading) {
41037
- setPendingFilters(initialFilters);
41038
41029
  dispatch(resetFilters(initialFilters));
41039
41030
  }
41040
41031
  };
41041
- var handleResetPendingChanges = function () {
41042
- setPendingFilters(filters); // ← back to last applied
41043
- };
41044
- var hasPendingChanges = function () {
41045
- return JSON.stringify(pendingFilters) !== JSON.stringify(filters);
41046
- };
41047
- if (!context || !context.showFilters) {
41048
- return null;
41049
- }
41050
41032
  return React__default['default'].createElement(
41051
- React__default['default'].Fragment,
41052
- null,
41033
+ 'div',
41034
+ { className: 'search__filters--modal '.concat(isOpen ? 'is-open' : '') },
41035
+ React__default['default'].createElement('div', {
41036
+ className: 'search__filters--background',
41037
+ onClick: function () {
41038
+ return handleSetIsOpen();
41039
+ }
41040
+ }),
41053
41041
  React__default['default'].createElement(
41054
- 'div',
41055
- { className: 'search__filters--modal '.concat(isOpen ? 'is-open' : '') },
41056
- React__default['default'].createElement('div', {
41057
- className: 'search__filters--background',
41042
+ 'button',
41043
+ {
41044
+ className: 'search__filters--close',
41058
41045
  onClick: function () {
41059
41046
  return handleSetIsOpen();
41060
41047
  }
41061
- }),
41062
- React__default['default'].createElement(
41063
- 'button',
41064
- {
41065
- className: 'search__filters--close',
41066
- onClick: function () {
41067
- return handleSetIsOpen();
41068
- }
41069
- },
41070
- React__default['default'].createElement(Icon$1, { name: 'ui-close', height: 24 })
41071
- ),
41048
+ },
41049
+ React__default['default'].createElement(Icon$1, { name: 'ui-close', height: 24 })
41050
+ ),
41051
+ React__default['default'].createElement(
41052
+ 'div',
41053
+ { className: 'search__filters' },
41072
41054
  React__default['default'].createElement(
41073
41055
  'div',
41074
- { className: 'search__filters' },
41056
+ { className: 'search__filter-row search__filter__header' },
41075
41057
  React__default['default'].createElement(
41076
41058
  'div',
41077
- { className: 'search__filter-row search__filter__header' },
41059
+ { className: 'search__filter-row-flex-title' },
41060
+ React__default['default'].createElement('p', { className: 'search__filter-small-title' }, translations.SRP.FILTERS)
41061
+ ),
41062
+ !isLoading &&
41078
41063
  React__default['default'].createElement(
41079
- 'div',
41080
- { className: 'search__filter-row-flex-title' },
41081
- React__default['default'].createElement('p', { className: 'search__filter-small-title' }, translations.SRP.FILTERS)
41082
- ),
41083
- !isLoading &&
41064
+ 'a',
41065
+ {
41066
+ className: 'search__filter-reset',
41067
+ onClick: function () {
41068
+ return handleFullReset();
41069
+ }
41070
+ },
41071
+ translations.SRP.RESET
41072
+ )
41073
+ ),
41074
+ isLoading
41075
+ ? React__default['default'].createElement(Spinner, null)
41076
+ : React__default['default'].createElement(
41077
+ React__default['default'].Fragment,
41078
+ null,
41084
41079
  React__default['default'].createElement(
41085
- 'a',
41086
- {
41087
- className: 'search__filter-reset',
41088
- onClick: function () {
41089
- return handleFullReset();
41090
- }
41091
- },
41092
- translations.SRP.RESET
41093
- )
41094
- ),
41095
- isLoading
41096
- ? React__default['default'].createElement(Spinner, null)
41097
- : React__default['default'].createElement(
41098
- React__default['default'].Fragment,
41099
- null,
41100
- React__default['default'].createElement(
41101
- 'div',
41102
- { className: 'search__filters__group-container' },
41103
- pendingFilters.map(function (filter, index) {
41104
- var _a, _b;
41105
- var isVisible = (_a = visibleFilters[filter.property]) !== null && _a !== void 0 ? _a : true;
41106
- return React__default['default'].createElement(
41080
+ 'div',
41081
+ { className: 'search__filters__group-container' },
41082
+ filters.map(function (filter, index) {
41083
+ var _a, _b;
41084
+ var isVisible = (_a = visibleFilters[filter.property]) !== null && _a !== void 0 ? _a : true;
41085
+ return React__default['default'].createElement(
41086
+ 'div',
41087
+ { key: ''.concat(filter.property, '-').concat(index), className: 'search__filter-group' },
41088
+ React__default['default'].createElement(
41107
41089
  'div',
41108
- { key: ''.concat(filter.property, '-').concat(index), className: 'search__filter-group' },
41090
+ {
41091
+ className: 'search__filter-row search__filter-row--underline',
41092
+ onClick: function () {
41093
+ return toggleFilterVisibility(filter.property);
41094
+ },
41095
+ role: 'button',
41096
+ tabIndex: 0
41097
+ },
41098
+ React__default['default'].createElement('h6', { className: 'search__filter-large-title' }, filter.label),
41109
41099
  React__default['default'].createElement(
41110
- 'div',
41100
+ 'svg',
41111
41101
  {
41112
- className: 'search__filter-row search__filter-row--underline',
41113
- onClick: function () {
41114
- return toggleFilterVisibility(filter.property);
41115
- },
41116
- role: 'button',
41117
- tabIndex: 0
41102
+ id: 'search-chevron-up-icon',
41103
+ className: 'search__filter-chevron-icon '.concat(isVisible ? 'search__filter-chevron-icon--flipped' : '', ' '),
41104
+ viewBox: '0 0 10 6.063',
41105
+ width: 10,
41106
+ height: 6.063
41118
41107
  },
41119
- React__default['default'].createElement('h6', { className: 'search__filter-large-title' }, filter.label),
41120
- React__default['default'].createElement(
41121
- 'svg',
41122
- {
41123
- id: 'search-chevron-up-icon',
41124
- className: 'search__filter-chevron-icon '.concat(isVisible ? 'search__filter-chevron-icon--flipped' : '', ' '),
41125
- viewBox: '0 0 10 6.063',
41126
- width: 10,
41127
- height: 6.063
41128
- },
41129
- React__default['default'].createElement('path', {
41130
- id: 'Path_62',
41131
- 'data-name': 'Path 62',
41132
- d: 'M245-617.937l-5-5L241.063-624,245-620.062,248.938-624,250-622.937Z',
41133
- transform: 'translate(-240 624)',
41134
- fill: '#707070'
41108
+ React__default['default'].createElement('path', {
41109
+ id: 'Path_62',
41110
+ 'data-name': 'Path 62',
41111
+ d: 'M245-617.937l-5-5L241.063-624,245-620.062,248.938-624,250-622.937Z',
41112
+ transform: 'translate(-240 624)',
41113
+ fill: '#707070'
41114
+ })
41115
+ )
41116
+ ),
41117
+ isVisible &&
41118
+ filter.type === 'checkbox' &&
41119
+ React__default['default'].createElement(
41120
+ 'div',
41121
+ { className: 'search__filter-rows' },
41122
+ filter.options &&
41123
+ filter.options.map(function (option, optionIndex) {
41124
+ return React__default['default'].createElement(
41125
+ 'div',
41126
+ { className: 'search__filter-row search__filter-row--checkbox', key: ''.concat(option.label, '-').concat(optionIndex) },
41127
+ React__default['default'].createElement(
41128
+ 'div',
41129
+ { className: 'checkbox' },
41130
+ React__default['default'].createElement(
41131
+ 'label',
41132
+ { className: 'checkbox__label' },
41133
+ React__default['default'].createElement('input', {
41134
+ type: 'checkbox',
41135
+ className: 'checkbox__input checkbox__input--parent',
41136
+ checked: option.isChecked,
41137
+ onChange: function (e) {
41138
+ return handleCheckBoxFilter(filter, option);
41139
+ }
41140
+ }),
41141
+ React__default['default'].createElement('span', { className: 'radiobutton__label-text' }, option.label)
41142
+ )
41143
+ )
41144
+ );
41135
41145
  })
41136
- )
41137
41146
  ),
41138
- isVisible &&
41139
- filter.type === 'checkbox' &&
41140
- React__default['default'].createElement(
41141
- 'div',
41142
- { className: 'search__filter-rows' },
41143
- filter.options &&
41144
- filter.options.map(function (option, optionIndex) {
41147
+ isVisible &&
41148
+ filter.type === 'toggle' &&
41149
+ React__default['default'].createElement(
41150
+ 'div',
41151
+ { className: 'search__filter-rows' },
41152
+ (_b = filter.options) === null || _b === void 0
41153
+ ? void 0
41154
+ : _b.map(function (option, optionIndex) {
41145
41155
  return React__default['default'].createElement(
41146
41156
  'div',
41147
- { className: 'search__filter-row search__filter-row--checkbox', key: ''.concat(option.label, '-').concat(optionIndex) },
41157
+ { className: 'search__filter-row', key: ''.concat(option.label, '-').concat(optionIndex) },
41158
+ React__default['default'].createElement('span', { className: 'search__filter-toggle-label' }, option.label),
41159
+ React__default['default'].createElement('div', { className: 'checkbox' }),
41148
41160
  React__default['default'].createElement(
41149
- 'div',
41150
- { className: 'checkbox' },
41151
- React__default['default'].createElement(
41152
- 'label',
41153
- { className: 'checkbox__label' },
41154
- React__default['default'].createElement('input', {
41155
- type: 'checkbox',
41156
- className: 'checkbox__input checkbox__input--parent',
41157
- checked: option.isChecked,
41158
- onChange: function (e) {
41159
- return handleCheckBoxFilter(filter, option);
41160
- }
41161
- }),
41162
- React__default['default'].createElement('span', { className: 'radiobutton__label-text' }, option.label)
41163
- )
41161
+ 'label',
41162
+ { className: 'checkbox__label' },
41163
+ React__default['default'].createElement('input', {
41164
+ type: 'checkbox',
41165
+ className: 'checkbox__input',
41166
+ checked: option.isChecked,
41167
+ onChange: function () {
41168
+ return handleCheckBoxFilter(filter, option);
41169
+ }
41170
+ })
41164
41171
  )
41165
41172
  );
41166
41173
  })
41167
- ),
41168
- isVisible &&
41169
- filter.type === 'toggle' &&
41170
- React__default['default'].createElement(
41171
- 'div',
41172
- { className: 'search__filter-rows' },
41173
- (_b = filter.options) === null || _b === void 0
41174
- ? void 0
41175
- : _b.map(function (option, optionIndex) {
41176
- return React__default['default'].createElement(
41177
- 'div',
41178
- { className: 'search__filter-row', key: ''.concat(option.label, '-').concat(optionIndex) },
41179
- React__default['default'].createElement('span', { className: 'search__filter-toggle-label' }, option.label),
41180
- React__default['default'].createElement('div', { className: 'checkbox' }),
41181
- React__default['default'].createElement(
41182
- 'label',
41183
- { className: 'checkbox__label' },
41184
- React__default['default'].createElement('input', {
41185
- type: 'checkbox',
41186
- className: 'checkbox__input',
41187
- checked: option.isChecked,
41188
- onChange: function () {
41189
- return handleCheckBoxFilter(filter, option);
41190
- }
41191
- })
41192
- )
41193
- );
41194
- })
41195
- ),
41196
- isVisible &&
41197
- filter &&
41198
- filter.type === 'slider' &&
41199
- (function () {
41200
- var _a, _b, _c, _d;
41201
- var min = (_a = filter.min) !== null && _a !== void 0 ? _a : 0;
41202
- var max = (_b = filter.max) !== null && _b !== void 0 ? _b : 100;
41203
- var selectedMin = (_c = filter.selectedMin) !== null && _c !== void 0 ? _c : min;
41204
- var selectedMax = (_d = filter.selectedMax) !== null && _d !== void 0 ? _d : max;
41205
- return React__default['default'].createElement(MultiRangeFilter, {
41206
- min: min,
41207
- max: max,
41208
- selectedMin: selectedMin,
41209
- selectedMax: selectedMax,
41210
- valueFormatter: function (value) {
41211
- return ''.concat(value);
41212
- },
41213
- onChange: function (newMin, newMax) {
41214
- handleSliderMinChange(filter, newMin);
41215
- handleSliderMaxChange(filter, newMax);
41216
- }
41217
- });
41218
- })(),
41219
- isVisible &&
41220
- filter.property === 'rating' &&
41221
- filter.type === 'star-rating' &&
41222
- (function () {
41223
- var _a;
41224
- var selectedRating = (_a = filter.selectedRating) !== null && _a !== void 0 ? _a : 0;
41225
- var handleRatingChange = function (rating) {
41226
- var updatedFilter = __assign(__assign({}, filter), { selectedRating: rating });
41227
- updatePendingFilter(updatedFilter);
41228
- if (!(context === null || context === void 0 ? void 0 : context.useGlobalApplyFilterButton) && !filter.useApplyFilterButton) {
41229
- applyFilters();
41230
- }
41231
- };
41232
- return React__default['default'].createElement(
41233
- 'div',
41234
- { className: 'search__filter-row star-rating-filter' },
41235
- [5, 4, 3, 2, 1].map(function (star) {
41236
- return React__default['default'].createElement(
41237
- 'span',
41238
- {
41239
- key: star,
41240
- className: 'star '.concat(star <= selectedRating ? 'filled' : ''),
41241
- onClick: function () {
41242
- return handleRatingChange(star);
41243
- },
41244
- role: 'button',
41245
- tabIndex: 0,
41246
- onKeyDown: function (e) {
41247
- if (e.key === 'Enter' || e.key === ' ') handleRatingChange(star);
41248
- }
41249
- },
41250
- '\u2605'
41251
- );
41252
- })
41253
- );
41254
- })()
41255
- );
41256
- }),
41257
- context.useGlobalApplyFilterButton &&
41258
- hasPendingChanges() &&
41259
- React__default['default'].createElement(
41260
- 'div',
41261
- { className: 'search__filters__actions' },
41262
- React__default['default'].createElement(
41263
- 'button',
41264
- {
41265
- className: 'cta--secondary ',
41266
- onClick: function () {
41267
- handleResetPendingChanges();
41268
- handleSetIsOpen();
41269
- },
41270
- disabled: isLoading
41271
- },
41272
- translations.SRP.CANCEL
41273
41174
  ),
41274
- React__default['default'].createElement(
41275
- 'button',
41276
- {
41277
- className: 'cta',
41278
- onClick: function () {
41279
- return applyFilters();
41175
+ isVisible &&
41176
+ filter &&
41177
+ filter.type === 'slider' &&
41178
+ (function () {
41179
+ var _a, _b, _c, _d;
41180
+ var min = (_a = filter.min) !== null && _a !== void 0 ? _a : 0;
41181
+ var max = (_b = filter.max) !== null && _b !== void 0 ? _b : 100;
41182
+ var selectedMin = (_c = filter.selectedMin) !== null && _c !== void 0 ? _c : min;
41183
+ var selectedMax = (_d = filter.selectedMax) !== null && _d !== void 0 ? _d : max;
41184
+ return React__default['default'].createElement(MultiRangeFilter, {
41185
+ min: min,
41186
+ max: max,
41187
+ selectedMin: selectedMin,
41188
+ selectedMax: selectedMax,
41189
+ valueFormatter: function (value) {
41190
+ return ''.concat(value);
41280
41191
  },
41281
- disabled: isLoading
41282
- },
41283
- translations.SRP.APPLY
41284
- )
41285
- )
41192
+ onChange: function (newMin, newMax) {
41193
+ handleSliderChange(filter, newMin, newMax);
41194
+ }
41195
+ });
41196
+ })()
41197
+ );
41198
+ })
41199
+ )
41200
+ )
41201
+ )
41202
+ );
41203
+ };
41204
+
41205
+ var GroupTourCard = function (_a) {
41206
+ var _b;
41207
+ var result = _a.result,
41208
+ languageCode = _a.languageCode;
41209
+ var translations = getTranslations(languageCode !== null && languageCode !== void 0 ? languageCode : 'en-GB');
41210
+ var genders = ((_b = result.allotment) === null || _b === void 0 ? void 0 : _b.travellerGenders) || [];
41211
+ var maleCount = genders.filter(function (g) {
41212
+ return g === 0;
41213
+ }).length;
41214
+ var femaleCount = genders.filter(function (g) {
41215
+ return g === 1;
41216
+ }).length;
41217
+ var otherCount = genders.filter(function (g) {
41218
+ return g === 2;
41219
+ }).length;
41220
+ return React__default['default'].createElement(
41221
+ 'div',
41222
+ { className: 'search__result-card' },
41223
+ React__default['default'].createElement(
41224
+ 'div',
41225
+ { className: 'search__result-card__allotment' },
41226
+ React__default['default'].createElement(
41227
+ 'div',
41228
+ { className: 'search__result-card__allotment__title__wrapper' },
41229
+ React__default['default'].createElement(
41230
+ 'h3',
41231
+ { className: 'search__result-card__allotment__title' },
41232
+ result.name,
41233
+ React__default['default'].createElement(
41234
+ 'span',
41235
+ { className: 'search__result-card__allotment__badge' },
41236
+ React__default['default'].createElement(Icon$1, { name: 'ui-circle-check', width: 14, height: 14 }),
41237
+ 'GAR'
41238
+ )
41239
+ ),
41240
+ React__default['default'].createElement(
41241
+ 'div',
41242
+ { className: 'search__result-card__allotment__container' },
41243
+ React__default['default'].createElement(
41244
+ 'div',
41245
+ { className: 'search__result-card__allotment__header' },
41246
+ React__default['default'].createElement(
41247
+ 'div',
41248
+ { className: 'search__result-card__allotment__wrapper' },
41249
+ React__default['default'].createElement(
41250
+ 'div',
41251
+ { className: 'search__result-card__allotment__date' },
41252
+ React__default['default'].createElement(Icon$1, { name: 'ui-plane', height: 16 }),
41253
+ React__default['default'].createElement(
41254
+ 'div',
41255
+ { className: 'search__result-card__allotment__date--from' },
41256
+ dateFns.format(new Date(result.fromDate), 'dd/MM/yyyy')
41257
+ )
41258
+ ),
41259
+ React__default['default'].createElement(
41260
+ 'div',
41261
+ { className: 'search__result-card__allotment__info' },
41262
+ React__default['default'].createElement('span', null, React__default['default'].createElement(Icon$1, { name: 'ui-calendar', height: 16 })),
41263
+ ' ',
41264
+ calculateDays(result.stayFromDate, result.stayToDate),
41265
+ ' ',
41266
+ translations.PRODUCT.DAYS,
41267
+ ' -',
41268
+ ' ',
41269
+ React__default['default'].createElement('span', null, React__default['default'].createElement(Icon$1, { name: 'ui-moon', height: 16 })),
41270
+ calculateNights(result.stayFromDate, result.stayToDate),
41271
+ ' ',
41272
+ translations.SRP.NIGHTS
41273
+ )
41274
+ )
41275
+ ),
41276
+ result.allotment &&
41277
+ React__default['default'].createElement(
41278
+ 'div',
41279
+ { className: 'search__result-card__allotment__info' },
41280
+ React__default['default'].createElement(
41281
+ 'span',
41282
+ { className: 'search__result-card__allotment__info__group' },
41283
+ translations === null || translations === void 0 ? void 0 : translations.SRP.TRAVEL_GROUP
41284
+ ),
41285
+ React__default['default'].createElement(
41286
+ 'div',
41287
+ { className: 'search__result-card__allotment__persons' },
41288
+ React__default['default'].createElement(
41289
+ 'div',
41290
+ { className: 'search__result-card__allotment__person' },
41291
+ React__default['default'].createElement(Icon$1, { name: 'ui-men', width: 16, height: 16 }),
41292
+ React__default['default'].createElement('span', null, maleCount, ' p.')
41293
+ ),
41294
+ React__default['default'].createElement(
41295
+ 'div',
41296
+ { className: 'search__result-card__allotment__person' },
41297
+ React__default['default'].createElement(Icon$1, { name: 'ui-women', width: 16, height: 16 }),
41298
+ React__default['default'].createElement('span', null, femaleCount, ' p.')
41299
+ ),
41300
+ React__default['default'].createElement(
41301
+ 'div',
41302
+ { className: 'search__result-card__allotment__person' },
41303
+ React__default['default'].createElement(Icon$1, { name: 'ui-other', width: 16, height: 16 }),
41304
+ React__default['default'].createElement('span', null, otherCount, ' p.')
41305
+ )
41286
41306
  )
41287
41307
  )
41308
+ )
41309
+ ),
41310
+ React__default['default'].createElement(
41311
+ 'div',
41312
+ { className: 'search__result-card__allotment__footer' },
41313
+ React__default['default'].createElement(
41314
+ 'div',
41315
+ { className: 'search__result-card__allotment__price__wrapper' },
41316
+ React__default['default'].createElement(
41317
+ 'div',
41318
+ { className: 'search__result-card__allotment__price' },
41319
+ formatPrice(result.price, result.currencyCode, languageCode),
41320
+ ' ',
41321
+ translations.PRODUCT.PER_PERSON
41322
+ )
41323
+ ),
41324
+ React__default['default'].createElement('button', { className: 'cta cta--select' }, 'Bekijk reis')
41288
41325
  )
41289
41326
  )
41290
41327
  );
41291
41328
  };
41292
41329
 
41330
+ var GroupTourResults = function (_a) {
41331
+ var _b, _c;
41332
+ var isLoading = _a.isLoading;
41333
+ var context = React.useContext(SearchResultsConfigurationContext);
41334
+ if (!context) {
41335
+ return;
41336
+ }
41337
+ if (isLoading) {
41338
+ return React__default['default'].createElement(
41339
+ React__default['default'].Fragment,
41340
+ null,
41341
+ (_b = context.customSpinner) !== null && _b !== void 0 ? _b : React__default['default'].createElement(Spinner, null)
41342
+ );
41343
+ }
41344
+ var translations = getTranslations((_c = context.languageCode) !== null && _c !== void 0 ? _c : 'en-GB');
41345
+ var _d = reactRedux.useSelector(function (state) {
41346
+ return state.searchResults;
41347
+ }),
41348
+ filteredResults = _d.filteredResults;
41349
+ _d.activeTab;
41350
+ if (lodash.isEmpty(filteredResults)) {
41351
+ return React__default['default'].createElement('div', { className: 'no-results' }, translations.SRP.NO_RESULTS);
41352
+ }
41353
+ return React__default['default'].createElement(
41354
+ 'div',
41355
+ { className: 'search__results__cards search__results__cards--list' },
41356
+ filteredResults.map(function (result, index) {
41357
+ return React__default['default'].createElement(GroupTourCard, { key: index, result: result });
41358
+ })
41359
+ );
41360
+ };
41361
+
41362
+ var applyFilters = function (results, filters) {
41363
+ return results.filter(function (r) {
41364
+ return filters.every(function (filter) {
41365
+ var _a, _b, _c, _d;
41366
+ if (!filter.isFrontendFilter) return true;
41367
+ // ACCOMMODATION
41368
+ if (filter.property === 'accommodation') {
41369
+ var selected =
41370
+ (_a = filter.options) === null || _a === void 0
41371
+ ? void 0
41372
+ : _a
41373
+ .filter(function (o) {
41374
+ return o.isChecked;
41375
+ })
41376
+ .map(function (o) {
41377
+ return o.value;
41378
+ });
41379
+ if (!selected || selected.length === 0) return true;
41380
+ return selected.includes(r.accommodationCode);
41381
+ }
41382
+ // REGIME
41383
+ if (filter.property === 'regime') {
41384
+ var selected =
41385
+ (_b = filter.options) === null || _b === void 0
41386
+ ? void 0
41387
+ : _b
41388
+ .filter(function (o) {
41389
+ return o.isChecked;
41390
+ })
41391
+ .map(function (o) {
41392
+ return o.value;
41393
+ });
41394
+ if (!selected || selected.length === 0) return true;
41395
+ if (!r.regimeCode) return false;
41396
+ return selected.includes(r.regimeCode);
41397
+ }
41398
+ // PRICE
41399
+ if (filter.property === 'price') {
41400
+ if (filter.selectedMin != null && r.price < filter.selectedMin) return false;
41401
+ if (filter.selectedMax != null && r.price > filter.selectedMax) return false;
41402
+ return true;
41403
+ }
41404
+ // THEME
41405
+ if (filter.property === 'theme') {
41406
+ var selected_1 =
41407
+ (_c = filter.options) === null || _c === void 0
41408
+ ? void 0
41409
+ : _c
41410
+ .filter(function (o) {
41411
+ return o.isChecked;
41412
+ })
41413
+ .map(function (o) {
41414
+ return o.value;
41415
+ });
41416
+ if (!selected_1 || selected_1.length === 0) return true;
41417
+ return (_d = r.tagIds) === null || _d === void 0
41418
+ ? void 0
41419
+ : _d.some(function (tagId) {
41420
+ return selected_1.includes(tagId);
41421
+ });
41422
+ }
41423
+ return true;
41424
+ });
41425
+ });
41426
+ };
41427
+
41293
41428
  var SearchResultsContainer = function () {
41294
41429
  var _a;
41295
41430
  var dispatch = reactRedux.useDispatch();
@@ -41299,6 +41434,7 @@ var SearchResultsContainer = function () {
41299
41434
  return state.searchResults;
41300
41435
  }),
41301
41436
  results = _b.results,
41437
+ filteredResults = _b.filteredResults,
41302
41438
  bookingPackageDetails = _b.bookingPackageDetails,
41303
41439
  entry = _b.entry,
41304
41440
  isLoading = _b.isLoading,
@@ -41307,21 +41443,18 @@ var SearchResultsContainer = function () {
41307
41443
  selectedHotelId = _b.selectedHotelId,
41308
41444
  flyInIsOpen = _b.flyInIsOpen;
41309
41445
  var isMobile = useMediaQuery('(max-width: 1200px)');
41310
- var _c = React.useState(0),
41311
- searchTrigger = _c[0],
41312
- setSearchTrigger = _c[1];
41313
- var _d = React.useState(false),
41314
- initialFiltersSet = _d[0],
41315
- setInitialFiltersSet = _d[1];
41316
- var _e = React.useState([]);
41317
- _e[0];
41318
- var setInitialFilters = _e[1];
41446
+ var _c = React.useState(false),
41447
+ initialFiltersSet = _c[0],
41448
+ setInitialFiltersSet = _c[1];
41449
+ var _d = React.useState([]),
41450
+ initialFilters = _d[0],
41451
+ setInitialFilters = _d[1];
41452
+ var _e = React.useState(false),
41453
+ filtersOpen = _e[0],
41454
+ setFiltersOpen = _e[1];
41319
41455
  var _f = React.useState(false),
41320
- filtersOpen = _f[0],
41321
- setFiltersOpen = _f[1];
41322
- var _g = React.useState(false),
41323
- itineraryOpen = _g[0],
41324
- setItineraryOpen = _g[1];
41456
+ itineraryOpen = _f[0],
41457
+ setItineraryOpen = _f[1];
41325
41458
  var panelRef = React.useRef(null);
41326
41459
  var sortByTypes = [
41327
41460
  { direction: 'asc', label: 'price' },
@@ -41425,7 +41558,6 @@ var SearchResultsContainer = function () {
41425
41558
  var city = getNumberFromParams(params, 'location');
41426
41559
  var hotel = getNumberFromParams(params, 'hotel');
41427
41560
  var tagId = getNumberFromParams(params, 'tagId');
41428
- // temp hardcoded params
41429
41561
  if (!from || !to) {
41430
41562
  console.error('Missing fromDate or toDate in query params, using default values');
41431
41563
  return null;
@@ -41455,8 +41587,9 @@ var SearchResultsContainer = function () {
41455
41587
  officeId: 1,
41456
41588
  payload: {
41457
41589
  catalogueIds: (_a = context.tideConnection.catalogueIds) !== null && _a !== void 0 ? _a : [],
41458
- serviceType: context.type === 'hotel' || context.type === 'hotel-flight' ? 3 : context.type === 'flight' ? 7 : context.type === 'roundTrip' ? 1 : 0,
41459
- searchType: 0,
41590
+ serviceType:
41591
+ context.type === 'hotel' || context.type === 'hotel-flight' ? 3 : context.type === 'flight' ? 7 : context.type === 'roundTrip' ? 1 : undefined,
41592
+ searchType: context.type === 'groupTour' ? 1 : 0,
41460
41593
  destination: {
41461
41594
  id: Number(destinationId),
41462
41595
  isCountry: destinationIsCountry,
@@ -41477,7 +41610,7 @@ var SearchResultsContainer = function () {
41477
41610
  // .flatMap((o) => o.value.toString()) || [],
41478
41611
  // minPrice: filters.find((f) => f.property === 'price')?.selectedMin,
41479
41612
  // maxPrice: filters.find((f) => f.property === 'price')?.selectedMax,
41480
- useExactDates: true,
41613
+ useExactDates: (context === null || context === void 0 ? void 0 : context.type) === 'groupTour' ? false : true,
41481
41614
  onlyCachedResults: false,
41482
41615
  includeAllAllotments: true,
41483
41616
  productIds: hotel ? [hotel] : [],
@@ -41553,17 +41686,17 @@ var SearchResultsContainer = function () {
41553
41686
  // seperate Search
41554
41687
  React.useEffect(
41555
41688
  function () {
41556
- var runHotelSearch = function () {
41689
+ var runSearch = function () {
41557
41690
  return __awaiter(void 0, void 0, void 0, function () {
41558
- var config, params, entryId, entryLight, searchRequest, rq, packageSearchResults, enrichedFilters, matching, err_1;
41559
- var _a;
41560
- return __generator(this, function (_b) {
41561
- switch (_b.label) {
41691
+ var config, params, entryId, entryLight, searchRequest, rq, packageSearchResults, enrichedFilters, initialFilteredResults, matching, err_1;
41692
+ var _a, _b;
41693
+ return __generator(this, function (_c) {
41694
+ switch (_c.label) {
41562
41695
  case 0:
41563
41696
  dispatch(setIsLoading(true));
41564
- _b.label = 1;
41697
+ _c.label = 1;
41565
41698
  case 1:
41566
- _b.trys.push([1, 6, , 7]);
41699
+ _c.trys.push([1, 6, , 7]);
41567
41700
  if (!context) {
41568
41701
  return [2 /*return*/];
41569
41702
  }
@@ -41578,7 +41711,7 @@ var SearchResultsContainer = function () {
41578
41711
  if (!entryId) return [3 /*break*/, 3];
41579
41712
  return [4 /*yield*/, build.getEntryLight(config, entryId)];
41580
41713
  case 2:
41581
- entryLight = _b.sent();
41714
+ entryLight = _c.sent();
41582
41715
  // populate itinerary store
41583
41716
  dispatch(setEntry({ entry: entryLight }));
41584
41717
  searchRequest = buildSearchFromEntry(entryLight);
@@ -41589,19 +41722,21 @@ var SearchResultsContainer = function () {
41589
41722
  throw new Error('Invalid search parameters');
41590
41723
  }
41591
41724
  searchRequest = rq;
41592
- _b.label = 4;
41725
+ _c.label = 4;
41593
41726
  case 4:
41594
41727
  return [4 /*yield*/, build.search(config, searchRequest)];
41595
41728
  case 5:
41596
- packageSearchResults = _b.sent();
41729
+ packageSearchResults = _c.sent();
41597
41730
  console.log('Search results', packageSearchResults);
41598
- enrichedFilters = enrichFiltersWithResults(packageSearchResults, context.filters);
41731
+ enrichedFilters = enrichFiltersWithResults(packageSearchResults, context.filters, (_a = context.tags) !== null && _a !== void 0 ? _a : []);
41599
41732
  if (!initialFiltersSet) {
41600
41733
  dispatch(resetFilters(enrichedFilters));
41601
41734
  setInitialFilters(enrichedFilters);
41602
41735
  setInitialFiltersSet(true);
41603
41736
  }
41604
- dispatch(setResults({ results: packageSearchResults }));
41737
+ dispatch(setResults(packageSearchResults));
41738
+ initialFilteredResults = applyFilters(packageSearchResults, filters);
41739
+ dispatch(setFilteredResults(initialFilteredResults));
41605
41740
  if ((packageSearchResults === null || packageSearchResults === void 0 ? void 0 : packageSearchResults.length) > 0) {
41606
41741
  if (entryId) {
41607
41742
  matching = packageSearchResults.find(function (r) {
@@ -41611,13 +41746,13 @@ var SearchResultsContainer = function () {
41611
41746
  dispatch(setSelectedHotel(matching.productId));
41612
41747
  }
41613
41748
  } else {
41614
- dispatch(setSelectedHotel((_a = packageSearchResults[0]) === null || _a === void 0 ? void 0 : _a.productId));
41749
+ dispatch(setSelectedHotel((_b = packageSearchResults[0]) === null || _b === void 0 ? void 0 : _b.productId));
41615
41750
  }
41616
41751
  }
41617
41752
  dispatch(setIsLoading(false));
41618
41753
  return [3 /*break*/, 7];
41619
41754
  case 6:
41620
- err_1 = _b.sent();
41755
+ err_1 = _c.sent();
41621
41756
  console.error('Search failed', err_1);
41622
41757
  dispatch(setIsLoading(false));
41623
41758
  return [3 /*break*/, 7];
@@ -41630,13 +41765,14 @@ var SearchResultsContainer = function () {
41630
41765
  if (!(context === null || context === void 0 ? void 0 : context.showMockup)) {
41631
41766
  if (
41632
41767
  (context === null || context === void 0 ? void 0 : context.type) === 'hotel-flight' ||
41633
- (context === null || context === void 0 ? void 0 : context.type) === 'hotel'
41768
+ (context === null || context === void 0 ? void 0 : context.type) === 'hotel' ||
41769
+ (context === null || context === void 0 ? void 0 : context.type) === 'groupTour'
41634
41770
  ) {
41635
- runHotelSearch();
41771
+ runSearch();
41636
41772
  }
41637
41773
  }
41638
41774
  },
41639
- [location.search, searchTrigger]
41775
+ [location.search]
41640
41776
  );
41641
41777
  // Seperate detailsCall
41642
41778
  React.useEffect(
@@ -41737,6 +41873,13 @@ var SearchResultsContainer = function () {
41737
41873
  },
41738
41874
  [selectedHotelId]
41739
41875
  );
41876
+ React.useEffect(
41877
+ function () {
41878
+ var filteredResults = applyFilters(results, filters);
41879
+ dispatch(setFilteredResults(filteredResults));
41880
+ },
41881
+ [filters, results]
41882
+ );
41740
41883
  return React__default['default'].createElement(
41741
41884
  'div',
41742
41885
  { id: 'tide-booking', className: 'search__bg' },
@@ -41761,23 +41904,20 @@ var SearchResultsContainer = function () {
41761
41904
  }
41762
41905
  })
41763
41906
  ),
41764
- (context.type === 'hotel-flight' || context.type === 'hotel' || context.type === 'roundTrip') &&
41907
+ (context.type === 'hotel-flight' || context.type === 'hotel' || context.type === 'groupTour' || context.type === 'roundTrip') &&
41765
41908
  React__default['default'].createElement(
41766
41909
  React__default['default'].Fragment,
41767
41910
  null,
41768
41911
  context.type != 'hotel-flight' &&
41769
41912
  context.showFilters &&
41770
41913
  React__default['default'].createElement(Filters, {
41914
+ initialFilters: initialFilters,
41771
41915
  filters: filters,
41772
41916
  isOpen: filtersOpen,
41773
41917
  handleSetIsOpen: function () {
41774
41918
  return setFiltersOpen(!filtersOpen);
41775
41919
  },
41776
- handleApplyFilters: function () {
41777
- return setSearchTrigger(function (prev) {
41778
- return prev + 1;
41779
- });
41780
- },
41920
+ // handleApplyFilters={() => setSearchTrigger((prev) => prev + 1)}
41781
41921
  isLoading: isLoading
41782
41922
  }),
41783
41923
  context.type === 'hotel-flight' &&
@@ -41845,7 +41985,7 @@ var SearchResultsContainer = function () {
41845
41985
  React__default['default'].createElement(
41846
41986
  React__default['default'].Fragment,
41847
41987
  null,
41848
- (results === null || results === void 0 ? void 0 : results.length) && results.length,
41988
+ (filteredResults === null || filteredResults === void 0 ? void 0 : filteredResults.length) && filteredResults.length,
41849
41989
  ' ',
41850
41990
  translations.SRP.TOTAL_RESULTS_LABEL
41851
41991
  )
@@ -41871,6 +42011,7 @@ var SearchResultsContainer = function () {
41871
42011
  { className: 'search__results__wrapper' },
41872
42012
  context.showTabViews && React__default['default'].createElement(TabViews, null),
41873
42013
  context.showRoundTripResults && context.showMockup && React__default['default'].createElement(RoundTripResults, null),
42014
+ context.type === 'groupTour' && React__default['default'].createElement(GroupTourResults, { isLoading: isLoading }),
41874
42015
  context.type === 'hotel-flight' &&
41875
42016
  context.showFlightResults &&
41876
42017
  (bookingPackageDetails === null || bookingPackageDetails === void 0 ? void 0 : bookingPackageDetails.outwardFlights) &&
@@ -41878,8 +42019,7 @@ var SearchResultsContainer = function () {
41878
42019
  flights: bookingPackageDetails === null || bookingPackageDetails === void 0 ? void 0 : bookingPackageDetails.outwardFlights,
41879
42020
  isDeparture: true
41880
42021
  }),
41881
- context.showHotelAccommodationResults &&
41882
- React__default['default'].createElement(HotelAccommodationResults, { isLoading: isLoading, context: context }),
42022
+ context.showHotelAccommodationResults && React__default['default'].createElement(HotelAccommodationResults, { isLoading: isLoading }),
41883
42023
  context.type === 'hotel-flight' &&
41884
42024
  context.showFlightResults &&
41885
42025
  (bookingPackageDetails === null || bookingPackageDetails === void 0 ? void 0 : bookingPackageDetails.returnFlights) &&