@qite/tide-booking-component 1.4.71 → 1.4.73

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.
@@ -12915,6 +12915,7 @@ PERFORMANCE OF THIS SOFTWARE.
12915
12915
  var ENDPOINT_PORTAL = function (portalId) {
12916
12916
  return ENDPOINT$4 + '/portal/' + portalId;
12917
12917
  };
12918
+ var ENDPOINT_AIRPORT = '/api/web/entity/airport';
12918
12919
  /**
12919
12920
  * api/search/countries
12920
12921
  * Gets all Countries
@@ -12927,6 +12928,13 @@ PERFORMANCE OF THIS SOFTWARE.
12927
12928
  var apiKey = config.apiKey;
12928
12929
  return get(url, apiKey, config.token, signal, true);
12929
12930
  };
12931
+ var searchCountries = function (config, searchTerm, signal) {
12932
+ var apiKey = config.apiKey;
12933
+ var safeSearch = searchTerm.replace(/'/g, "''");
12934
+ var filter = "$skip=0&$top=20&$orderby=name%20asc&$filter=contains(name,'" + safeSearch.toLowerCase() + "')";
12935
+ var url = '' + config.host + ENDPOINT_COUNTRIES + '?' + filter;
12936
+ return get(url, apiKey, config.token, signal, true);
12937
+ };
12930
12938
  var searchRegions = function (config, searchTerm, signal) {
12931
12939
  var apiKey = config.apiKey;
12932
12940
  var safeSearch = searchTerm.replace(/'/g, "''");
@@ -12953,6 +12961,11 @@ PERFORMANCE OF THIS SOFTWARE.
12953
12961
  var apiKey = config.apiKey;
12954
12962
  return get(url, apiKey, config.token, signal, true);
12955
12963
  };
12964
+ var getAirports = function (config, signal) {
12965
+ var url = '' + config.host + ENDPOINT_AIRPORT;
12966
+ var apiKey = config.apiKey;
12967
+ return get(url, apiKey, config.token, signal, true);
12968
+ };
12956
12969
 
12957
12970
  var createParams = function (filter, all, gridColumns, mode, forceToLower) {
12958
12971
  var params = {};
@@ -13332,6 +13345,7 @@ PERFORMANCE OF THIS SOFTWARE.
13332
13345
  exports.forgotPassword = forgotPassword;
13333
13346
  exports.generateBookingAccommodations = generateBookingAccommodations;
13334
13347
  exports.getAffiliates = getAffiliates;
13348
+ exports.getAirports = getAirports;
13335
13349
  exports.getAllotment = getAllotment;
13336
13350
  exports.getAllotmentAvailability = getAllotmentAvailability;
13337
13351
  exports.getAllotmentList = getAllotmentList;
@@ -13356,6 +13370,7 @@ PERFORMANCE OF THIS SOFTWARE.
13356
13370
  exports.print = print;
13357
13371
  exports.resetPassword = resetPassword;
13358
13372
  exports.search = search;
13373
+ exports.searchCountries = searchCountries;
13359
13374
  exports.searchElastic = searchElastic;
13360
13375
  exports.searchFlightPool = searchFlightPool;
13361
13376
  exports.searchLocations = searchLocations;
@@ -31080,6 +31095,24 @@ var Icon$2 = function (_a) {
31080
31095
  }
31081
31096
  };
31082
31097
 
31098
+ var SearchResultsConfigurationContext = React__default['default'].createContext(undefined);
31099
+
31100
+ var Spinner = function () {
31101
+ var _a;
31102
+ var context = React.useContext(SearchResultsConfigurationContext);
31103
+ var translations = getTranslations((_a = context === null || context === void 0 ? void 0 : context.languageCode) !== null && _a !== void 0 ? _a : 'en-GB');
31104
+ return React__default['default'].createElement(
31105
+ 'div',
31106
+ { className: 'spinner__container' },
31107
+ React__default['default'].createElement('span', { className: 'spinner__icon' }),
31108
+ React__default['default'].createElement(
31109
+ 'span',
31110
+ { className: 'spinner__label' },
31111
+ translations === null || translations === void 0 ? void 0 : translations.SRP.LOADING
31112
+ )
31113
+ );
31114
+ };
31115
+
31083
31116
  var SearchInput = function (_a) {
31084
31117
  var searchResults = _a.searchResults,
31085
31118
  onOptionSelect = _a.onOptionSelect,
@@ -31087,7 +31120,8 @@ var SearchInput = function (_a) {
31087
31120
  _a.label;
31088
31121
  var isSecondInput = _a.isSecondInput,
31089
31122
  isDoubleInput = _a.isDoubleInput,
31090
- isDisabled = _a.isDisabled;
31123
+ isDisabled = _a.isDisabled,
31124
+ isLoading = _a.isLoading;
31091
31125
  if (isDisabled) {
31092
31126
  return null;
31093
31127
  }
@@ -31106,9 +31140,9 @@ var SearchInput = function (_a) {
31106
31140
  })
31107
31141
  );
31108
31142
  };
31109
- if (searchResults.length === 0) {
31110
- return null;
31111
- }
31143
+ // if (searchResults.length === 0) {
31144
+ // return null;
31145
+ // }
31112
31146
  return React__default['default'].createElement(
31113
31147
  'div',
31114
31148
  {
@@ -31116,6 +31150,7 @@ var SearchInput = function (_a) {
31116
31150
  .concat(isSecondInput ? ' qsm__double-input-options--second-input' : '')
31117
31151
  .concat(isDoubleInput ? ' qsm__double-input-options--splittable' : '')
31118
31152
  },
31153
+ isLoading && React__default['default'].createElement(Spinner, null),
31119
31154
  searchResults.map(function (option, index) {
31120
31155
  return React__default['default'].createElement(
31121
31156
  'div',
@@ -32443,6 +32478,9 @@ var SearchInputGroup = function (_a) {
32443
32478
  placeholder = fieldConfig.placeholder,
32444
32479
  options = fieldConfig.options,
32445
32480
  autoComplete = fieldConfig.autoComplete;
32481
+ var _j = React.useState(false),
32482
+ isLoading = _j[0],
32483
+ setIsLoading = _j[1];
32446
32484
  var selector = React.useMemo(
32447
32485
  function () {
32448
32486
  return function (state) {
@@ -32453,11 +32491,11 @@ var SearchInputGroup = function (_a) {
32453
32491
  [fieldKey]
32454
32492
  );
32455
32493
  var value = reactRedux.useSelector(selector);
32456
- var _j = reactRedux.useSelector(function (state) {
32494
+ var _k = reactRedux.useSelector(function (state) {
32457
32495
  return state.qsm;
32458
32496
  }),
32459
- searchResults = _j.searchResults,
32460
- activeSearchField = _j.activeSearchField;
32497
+ searchResults = _k.searchResults,
32498
+ activeSearchField = _k.activeSearchField;
32461
32499
  var selectedOption = options.find(function (option) {
32462
32500
  return option.value === value;
32463
32501
  });
@@ -32485,6 +32523,7 @@ var SearchInputGroup = function (_a) {
32485
32523
  // if field has custom onChange (API search)
32486
32524
  if (fieldConfig.onChange) {
32487
32525
  fieldConfig.onChange(input);
32526
+ setIsLoading(true);
32488
32527
  return;
32489
32528
  }
32490
32529
  // fallback to local filtering
@@ -32492,6 +32531,13 @@ var SearchInputGroup = function (_a) {
32492
32531
  },
32493
32532
  [dispatch, fieldKey, small, match, fieldConfig]
32494
32533
  );
32534
+ React.useEffect(
32535
+ function () {
32536
+ console.log('options updated, resetting loading state');
32537
+ setIsLoading(false);
32538
+ },
32539
+ [options]
32540
+ );
32495
32541
  React.useEffect(
32496
32542
  function () {
32497
32543
  if (!value || activeSearchField !== fieldKey) return;
@@ -32609,7 +32655,8 @@ var SearchInputGroup = function (_a) {
32609
32655
  label: label,
32610
32656
  isSecondInput: isSecondInput,
32611
32657
  isDoubleInput: isDoubleInput,
32612
- isDisabled: isDisabled
32658
+ isDisabled: isDisabled,
32659
+ isLoading: isLoading
32613
32660
  })
32614
32661
  );
32615
32662
  };
@@ -32982,6 +33029,10 @@ var QSMContainer = function () {
32982
33029
  if (fromDate || toDate) return;
32983
33030
  var startDate = dateFns.addMonths(new Date(), 1);
32984
33031
  var endDate = dateFns.addDays(startDate, 7);
33032
+ if (qsmType === 'groupTour') {
33033
+ startDate = new Date();
33034
+ endDate = dateFns.addYears(startDate, 1);
33035
+ }
32985
33036
  dispatch(setFromDate(startDate.toISOString()));
32986
33037
  dispatch(setToDate(endDate.toISOString()));
32987
33038
  },
@@ -33007,17 +33058,16 @@ var QSMContainer = function () {
33007
33058
  };
33008
33059
  var handleQsmTypeChange = function (value) {
33009
33060
  dispatch(setSelectedQsmType(value));
33061
+ var startDate = dateFns.addMonths(new Date(), 1);
33062
+ var endDate = dateFns.addDays(startDate, 7);
33010
33063
  if (value === 'groupTour') {
33011
- handleDateChange({
33012
- fromDate: new Date(fromDate !== null && fromDate !== void 0 ? fromDate : Date.now()),
33013
- toDate: dateFns.addYears(new Date(fromDate !== null && fromDate !== void 0 ? fromDate : Date.now()), 1)
33014
- });
33015
- } else {
33016
- handleDateChange({
33017
- fromDate: new Date(fromDate !== null && fromDate !== void 0 ? fromDate : Date.now()),
33018
- toDate: dateFns.addDays(new Date(fromDate !== null && fromDate !== void 0 ? fromDate : Date.now()), 7)
33019
- });
33064
+ startDate = new Date();
33065
+ endDate = dateFns.addYears(startDate, 1);
33020
33066
  }
33067
+ handleDateChange({
33068
+ fromDate: startDate,
33069
+ toDate: endDate
33070
+ });
33021
33071
  };
33022
33072
  var handleSubmit = function () {
33023
33073
  if (!onSubmit) return;
@@ -33475,8 +33525,6 @@ var QSM = function (_a) {
33475
33525
  );
33476
33526
  };
33477
33527
 
33478
- var SearchResultsConfigurationContext = React__default['default'].createContext(undefined);
33479
-
33480
33528
  var _a;
33481
33529
  var initialState$1 = {
33482
33530
  results: [],
@@ -34613,22 +34661,6 @@ var Icon$1 = function (_a) {
34613
34661
  }
34614
34662
  };
34615
34663
 
34616
- var Spinner = function () {
34617
- var _a;
34618
- var context = React.useContext(SearchResultsConfigurationContext);
34619
- var translations = getTranslations((_a = context === null || context === void 0 ? void 0 : context.languageCode) !== null && _a !== void 0 ? _a : 'en-GB');
34620
- return React__default['default'].createElement(
34621
- 'div',
34622
- { className: 'spinner__container' },
34623
- React__default['default'].createElement('span', { className: 'spinner__icon' }),
34624
- React__default['default'].createElement(
34625
- 'span',
34626
- { className: 'spinner__label' },
34627
- translations === null || translations === void 0 ? void 0 : translations.SRP.LOADING
34628
- )
34629
- );
34630
- };
34631
-
34632
34664
  var getDepartureTime = function (flight) {
34633
34665
  var _a, _b;
34634
34666
  if (lodash.isEmpty(flight === null || flight === void 0 ? void 0 : flight.metaDatas)) return '';
@@ -40917,33 +40949,96 @@ var FlightResultsContainer = function (_a) {
40917
40949
  React__default['default'].createElement(
40918
40950
  'div',
40919
40951
  { className: 'search__results' },
40920
- flightsLoading
40921
- ? React__default['default'].createElement(Spinner, null)
40922
- : React__default['default'].createElement(
40923
- React__default['default'].Fragment,
40924
- null,
40925
- isMobile &&
40952
+ React__default['default'].createElement(
40953
+ React__default['default'].Fragment,
40954
+ null,
40955
+ isMobile &&
40956
+ React__default['default'].createElement(
40957
+ 'div',
40958
+ { className: 'search__result-row' },
40959
+ React__default['default'].createElement(
40960
+ 'div',
40961
+ { className: 'search__results__actions' },
40962
+ (context === null || context === void 0 ? void 0 : context.showFilters) &&
40963
+ React__default['default'].createElement(
40964
+ 'div',
40965
+ {
40966
+ className: 'cta cta--filter',
40967
+ onClick: function () {
40968
+ return setFiltersOpen(true);
40969
+ }
40970
+ },
40971
+ React__default['default'].createElement(Icon$1, { name: 'ui-filter', className: 'mobile-filters-button__icon', height: 16 }),
40972
+ translations.SRP.FILTERS
40973
+ )
40974
+ ),
40975
+ sortByTypes &&
40976
+ sortByTypes.length > 0 &&
40977
+ React__default['default'].createElement(ItemPicker, {
40978
+ items: sortByTypes,
40979
+ selection: (selectedSortByType === null || selectedSortByType === void 0 ? void 0 : selectedSortByType.label) || undefined,
40980
+ selectedSortByType: selectedSortByType || undefined,
40981
+ label: translations.SRP.SORTBY,
40982
+ placeholder: translations.SRP.SORTBY,
40983
+ classModifier: 'travel-class-picker__items',
40984
+ valueFormatter: function (value, direction) {
40985
+ return getSortingName(translations, findSortByType(value, direction !== null && direction !== void 0 ? direction : 'asc'));
40986
+ },
40987
+ onPick: handleSortChange
40988
+ })
40989
+ ),
40990
+ React__default['default'].createElement(
40991
+ 'div',
40992
+ { className: 'search__result-row' },
40993
+ React__default['default'].createElement(
40994
+ 'span',
40995
+ { className: 'search__result-row-text' },
40996
+ !flightsLoading &&
40997
+ React__default['default'].createElement(
40998
+ React__default['default'].Fragment,
40999
+ null,
41000
+ (results === null || results === void 0 ? void 0 : results.length) &&
41001
+ React__default['default'].createElement(React__default['default'].Fragment, null, results.length, ' ', translations.SRP.TOTAL_RESULTS_LABEL)
41002
+ )
41003
+ ),
41004
+ !isMobile &&
41005
+ React__default['default'].createElement(
41006
+ React__default['default'].Fragment,
41007
+ null,
40926
41008
  React__default['default'].createElement(
40927
41009
  'div',
40928
- { className: 'search__result-row' },
41010
+ { className: 'search__result-row-filter' },
41011
+ React__default['default'].createElement(ItemPicker, {
41012
+ items: selectionTypes,
41013
+ selection:
41014
+ ((_c = selectionTypes.find(function (type) {
41015
+ return type.code === flightSelectionType;
41016
+ })) === null || _c === void 0
41017
+ ? void 0
41018
+ : _c.label) || undefined,
41019
+ label: 'Selection Type',
41020
+ placeholder: 'Selection Type',
41021
+ classModifier: 'travel-class-picker__items',
41022
+ valueFormatter: function (value) {
41023
+ return value;
41024
+ },
41025
+ onPick: function (value) {
41026
+ var _a;
41027
+ return setFlightSelectionType(
41028
+ ((_a = selectionTypes.find(function (type) {
41029
+ return type.label === value;
41030
+ })) === null || _a === void 0
41031
+ ? void 0
41032
+ : _a.code) || 'independent'
41033
+ );
41034
+ }
41035
+ })
41036
+ ),
41037
+ sortByTypes &&
41038
+ sortByTypes.length > 0 &&
40929
41039
  React__default['default'].createElement(
40930
41040
  'div',
40931
- { className: 'search__results__actions' },
40932
- (context === null || context === void 0 ? void 0 : context.showFilters) &&
40933
- React__default['default'].createElement(
40934
- 'div',
40935
- {
40936
- className: 'cta cta--filter',
40937
- onClick: function () {
40938
- return setFiltersOpen(true);
40939
- }
40940
- },
40941
- React__default['default'].createElement(Icon$1, { name: 'ui-filter', className: 'mobile-filters-button__icon', height: 16 }),
40942
- translations.SRP.FILTERS
40943
- )
40944
- ),
40945
- sortByTypes &&
40946
- sortByTypes.length > 0 &&
41041
+ { className: 'search__result-row-filter' },
40947
41042
  React__default['default'].createElement(ItemPicker, {
40948
41043
  items: sortByTypes,
40949
41044
  selection: (selectedSortByType === null || selectedSortByType === void 0 ? void 0 : selectedSortByType.label) || undefined,
@@ -40956,85 +41051,20 @@ var FlightResultsContainer = function (_a) {
40956
41051
  },
40957
41052
  onPick: handleSortChange
40958
41053
  })
40959
- ),
40960
- React__default['default'].createElement(
40961
- 'div',
40962
- { className: 'search__result-row' },
40963
- React__default['default'].createElement(
40964
- 'span',
40965
- { className: 'search__result-row-text' },
40966
- !flightsLoading &&
40967
- React__default['default'].createElement(
40968
- React__default['default'].Fragment,
40969
- null,
40970
- (results === null || results === void 0 ? void 0 : results.length) && results.length,
40971
- ' ',
40972
- translations.SRP.TOTAL_RESULTS_LABEL
40973
- )
40974
- ),
40975
- !isMobile &&
40976
- React__default['default'].createElement(
40977
- React__default['default'].Fragment,
40978
- null,
40979
- React__default['default'].createElement(
40980
- 'div',
40981
- { className: 'search__result-row-filter' },
40982
- React__default['default'].createElement(ItemPicker, {
40983
- items: selectionTypes,
40984
- selection:
40985
- ((_c = selectionTypes.find(function (type) {
40986
- return type.code === flightSelectionType;
40987
- })) === null || _c === void 0
40988
- ? void 0
40989
- : _c.label) || undefined,
40990
- label: 'Selection Type',
40991
- placeholder: 'Selection Type',
40992
- classModifier: 'travel-class-picker__items',
40993
- valueFormatter: function (value) {
40994
- return value;
40995
- },
40996
- onPick: function (value) {
40997
- var _a;
40998
- return setFlightSelectionType(
40999
- ((_a = selectionTypes.find(function (type) {
41000
- return type.label === value;
41001
- })) === null || _a === void 0
41002
- ? void 0
41003
- : _a.code) || 'independent'
41004
- );
41005
- }
41006
- })
41007
- ),
41008
- sortByTypes &&
41009
- sortByTypes.length > 0 &&
41010
- React__default['default'].createElement(
41011
- 'div',
41012
- { className: 'search__result-row-filter' },
41013
- React__default['default'].createElement(ItemPicker, {
41014
- items: sortByTypes,
41015
- selection: (selectedSortByType === null || selectedSortByType === void 0 ? void 0 : selectedSortByType.label) || undefined,
41016
- selectedSortByType: selectedSortByType || undefined,
41017
- label: translations.SRP.SORTBY,
41018
- placeholder: translations.SRP.SORTBY,
41019
- classModifier: 'travel-class-picker__items',
41020
- valueFormatter: function (value, direction) {
41021
- return getSortingName(translations, findSortByType(value, direction !== null && direction !== void 0 ? direction : 'asc'));
41022
- },
41023
- onPick: handleSortChange
41024
- })
41025
- )
41026
41054
  )
41027
- ),
41028
- React__default['default'].createElement(
41029
- 'div',
41030
- { className: 'search__results__wrapper' },
41031
- (context === null || context === void 0 ? void 0 : context.type) == 'flight' &&
41032
- (context === null || context === void 0 ? void 0 : context.showFlightAccommodationResults) &&
41033
- results &&
41034
- results.length > 0 &&
41035
- React__default['default'].createElement(FlightSelection, { searchResults: results, flightSelectionType: flightSelectionType })
41036
41055
  )
41037
- )
41056
+ ),
41057
+ React__default['default'].createElement(
41058
+ 'div',
41059
+ { className: 'search__results__wrapper' },
41060
+ flightsLoading && React__default['default'].createElement(Spinner, null),
41061
+ (context === null || context === void 0 ? void 0 : context.type) == 'flight' &&
41062
+ (context === null || context === void 0 ? void 0 : context.showFlightAccommodationResults) &&
41063
+ results &&
41064
+ results.length > 0 &&
41065
+ React__default['default'].createElement(FlightSelection, { searchResults: results, flightSelectionType: flightSelectionType })
41066
+ )
41067
+ )
41038
41068
  )
41039
41069
  );
41040
41070
  };
@@ -41746,7 +41776,7 @@ var SearchResultsContainer = function () {
41746
41776
  var room = { index: i, pax: [] };
41747
41777
  lodash.range(0, x.adults).forEach(function () {
41748
41778
  room.pax.push({
41749
- age: Math.floor(Math.random() * 100)
41779
+ age: 30
41750
41780
  });
41751
41781
  });
41752
41782
  x.childAges.forEach(function (x) {
@@ -9,6 +9,7 @@ interface SearchInputProps {
9
9
  isSecondInput?: boolean;
10
10
  isDoubleInput?: boolean;
11
11
  isDisabled?: boolean;
12
+ isLoading?: boolean;
12
13
  }
13
14
  declare const SearchInput: React.FC<SearchInputProps>;
14
15
  export default SearchInput;
@@ -12946,6 +12946,7 @@ PERFORMANCE OF THIS SOFTWARE.
12946
12946
  var ENDPOINT_PORTAL = function (portalId) {
12947
12947
  return ENDPOINT$4 + '/portal/' + portalId;
12948
12948
  };
12949
+ var ENDPOINT_AIRPORT = '/api/web/entity/airport';
12949
12950
  /**
12950
12951
  * api/search/countries
12951
12952
  * Gets all Countries
@@ -12958,6 +12959,13 @@ PERFORMANCE OF THIS SOFTWARE.
12958
12959
  var apiKey = config.apiKey;
12959
12960
  return get(url, apiKey, config.token, signal, true);
12960
12961
  };
12962
+ var searchCountries = function (config, searchTerm, signal) {
12963
+ var apiKey = config.apiKey;
12964
+ var safeSearch = searchTerm.replace(/'/g, "''");
12965
+ var filter = "$skip=0&$top=20&$orderby=name%20asc&$filter=contains(name,'" + safeSearch.toLowerCase() + "')";
12966
+ var url = '' + config.host + ENDPOINT_COUNTRIES + '?' + filter;
12967
+ return get(url, apiKey, config.token, signal, true);
12968
+ };
12961
12969
  var searchRegions = function (config, searchTerm, signal) {
12962
12970
  var apiKey = config.apiKey;
12963
12971
  var safeSearch = searchTerm.replace(/'/g, "''");
@@ -12984,6 +12992,11 @@ PERFORMANCE OF THIS SOFTWARE.
12984
12992
  var apiKey = config.apiKey;
12985
12993
  return get(url, apiKey, config.token, signal, true);
12986
12994
  };
12995
+ var getAirports = function (config, signal) {
12996
+ var url = '' + config.host + ENDPOINT_AIRPORT;
12997
+ var apiKey = config.apiKey;
12998
+ return get(url, apiKey, config.token, signal, true);
12999
+ };
12987
13000
 
12988
13001
  var createParams = function (filter, all, gridColumns, mode, forceToLower) {
12989
13002
  var params = {};
@@ -13363,6 +13376,7 @@ PERFORMANCE OF THIS SOFTWARE.
13363
13376
  exports.forgotPassword = forgotPassword;
13364
13377
  exports.generateBookingAccommodations = generateBookingAccommodations;
13365
13378
  exports.getAffiliates = getAffiliates;
13379
+ exports.getAirports = getAirports;
13366
13380
  exports.getAllotment = getAllotment;
13367
13381
  exports.getAllotmentAvailability = getAllotmentAvailability;
13368
13382
  exports.getAllotmentList = getAllotmentList;
@@ -13387,6 +13401,7 @@ PERFORMANCE OF THIS SOFTWARE.
13387
13401
  exports.print = print;
13388
13402
  exports.resetPassword = resetPassword;
13389
13403
  exports.search = search;
13404
+ exports.searchCountries = searchCountries;
13390
13405
  exports.searchElastic = searchElastic;
13391
13406
  exports.searchFlightPool = searchFlightPool;
13392
13407
  exports.searchLocations = searchLocations;
@@ -30965,6 +30980,20 @@ var Icon$2 = function (_a) {
30965
30980
  }
30966
30981
  };
30967
30982
 
30983
+ var SearchResultsConfigurationContext = React__default.createContext(undefined);
30984
+
30985
+ var Spinner = function () {
30986
+ var _a;
30987
+ var context = useContext(SearchResultsConfigurationContext);
30988
+ var translations = getTranslations((_a = context === null || context === void 0 ? void 0 : context.languageCode) !== null && _a !== void 0 ? _a : 'en-GB');
30989
+ return React__default.createElement(
30990
+ 'div',
30991
+ { className: 'spinner__container' },
30992
+ React__default.createElement('span', { className: 'spinner__icon' }),
30993
+ React__default.createElement('span', { className: 'spinner__label' }, translations === null || translations === void 0 ? void 0 : translations.SRP.LOADING)
30994
+ );
30995
+ };
30996
+
30968
30997
  var SearchInput = function (_a) {
30969
30998
  var searchResults = _a.searchResults,
30970
30999
  onOptionSelect = _a.onOptionSelect,
@@ -30972,7 +31001,8 @@ var SearchInput = function (_a) {
30972
31001
  _a.label;
30973
31002
  var isSecondInput = _a.isSecondInput,
30974
31003
  isDoubleInput = _a.isDoubleInput,
30975
- isDisabled = _a.isDisabled;
31004
+ isDisabled = _a.isDisabled,
31005
+ isLoading = _a.isLoading;
30976
31006
  if (isDisabled) {
30977
31007
  return null;
30978
31008
  }
@@ -30991,9 +31021,9 @@ var SearchInput = function (_a) {
30991
31021
  })
30992
31022
  );
30993
31023
  };
30994
- if (searchResults.length === 0) {
30995
- return null;
30996
- }
31024
+ // if (searchResults.length === 0) {
31025
+ // return null;
31026
+ // }
30997
31027
  return React__default.createElement(
30998
31028
  'div',
30999
31029
  {
@@ -31001,6 +31031,7 @@ var SearchInput = function (_a) {
31001
31031
  .concat(isSecondInput ? ' qsm__double-input-options--second-input' : '')
31002
31032
  .concat(isDoubleInput ? ' qsm__double-input-options--splittable' : '')
31003
31033
  },
31034
+ isLoading && React__default.createElement(Spinner, null),
31004
31035
  searchResults.map(function (option, index) {
31005
31036
  return React__default.createElement(
31006
31037
  'div',
@@ -32312,6 +32343,9 @@ var SearchInputGroup = function (_a) {
32312
32343
  placeholder = fieldConfig.placeholder,
32313
32344
  options = fieldConfig.options,
32314
32345
  autoComplete = fieldConfig.autoComplete;
32346
+ var _j = useState(false),
32347
+ isLoading = _j[0],
32348
+ setIsLoading = _j[1];
32315
32349
  var selector = useMemo(
32316
32350
  function () {
32317
32351
  return function (state) {
@@ -32322,11 +32356,11 @@ var SearchInputGroup = function (_a) {
32322
32356
  [fieldKey]
32323
32357
  );
32324
32358
  var value = useSelector(selector);
32325
- var _j = useSelector(function (state) {
32359
+ var _k = useSelector(function (state) {
32326
32360
  return state.qsm;
32327
32361
  }),
32328
- searchResults = _j.searchResults,
32329
- activeSearchField = _j.activeSearchField;
32362
+ searchResults = _k.searchResults,
32363
+ activeSearchField = _k.activeSearchField;
32330
32364
  var selectedOption = options.find(function (option) {
32331
32365
  return option.value === value;
32332
32366
  });
@@ -32354,6 +32388,7 @@ var SearchInputGroup = function (_a) {
32354
32388
  // if field has custom onChange (API search)
32355
32389
  if (fieldConfig.onChange) {
32356
32390
  fieldConfig.onChange(input);
32391
+ setIsLoading(true);
32357
32392
  return;
32358
32393
  }
32359
32394
  // fallback to local filtering
@@ -32361,6 +32396,13 @@ var SearchInputGroup = function (_a) {
32361
32396
  },
32362
32397
  [dispatch, fieldKey, small, match, fieldConfig]
32363
32398
  );
32399
+ useEffect(
32400
+ function () {
32401
+ console.log('options updated, resetting loading state');
32402
+ setIsLoading(false);
32403
+ },
32404
+ [options]
32405
+ );
32364
32406
  useEffect(
32365
32407
  function () {
32366
32408
  if (!value || activeSearchField !== fieldKey) return;
@@ -32478,7 +32520,8 @@ var SearchInputGroup = function (_a) {
32478
32520
  label: label,
32479
32521
  isSecondInput: isSecondInput,
32480
32522
  isDoubleInput: isDoubleInput,
32481
- isDisabled: isDisabled
32523
+ isDisabled: isDisabled,
32524
+ isLoading: isLoading
32482
32525
  })
32483
32526
  );
32484
32527
  };
@@ -32851,6 +32894,10 @@ var QSMContainer = function () {
32851
32894
  if (fromDate || toDate) return;
32852
32895
  var startDate = addMonths(new Date(), 1);
32853
32896
  var endDate = addDays(startDate, 7);
32897
+ if (qsmType === 'groupTour') {
32898
+ startDate = new Date();
32899
+ endDate = addYears(startDate, 1);
32900
+ }
32854
32901
  dispatch(setFromDate(startDate.toISOString()));
32855
32902
  dispatch(setToDate(endDate.toISOString()));
32856
32903
  },
@@ -32876,17 +32923,16 @@ var QSMContainer = function () {
32876
32923
  };
32877
32924
  var handleQsmTypeChange = function (value) {
32878
32925
  dispatch(setSelectedQsmType(value));
32926
+ var startDate = addMonths(new Date(), 1);
32927
+ var endDate = addDays(startDate, 7);
32879
32928
  if (value === 'groupTour') {
32880
- handleDateChange({
32881
- fromDate: new Date(fromDate !== null && fromDate !== void 0 ? fromDate : Date.now()),
32882
- toDate: addYears(new Date(fromDate !== null && fromDate !== void 0 ? fromDate : Date.now()), 1)
32883
- });
32884
- } else {
32885
- handleDateChange({
32886
- fromDate: new Date(fromDate !== null && fromDate !== void 0 ? fromDate : Date.now()),
32887
- toDate: addDays(new Date(fromDate !== null && fromDate !== void 0 ? fromDate : Date.now()), 7)
32888
- });
32929
+ startDate = new Date();
32930
+ endDate = addYears(startDate, 1);
32889
32931
  }
32932
+ handleDateChange({
32933
+ fromDate: startDate,
32934
+ toDate: endDate
32935
+ });
32890
32936
  };
32891
32937
  var handleSubmit = function () {
32892
32938
  if (!onSubmit) return;
@@ -33301,8 +33347,6 @@ var QSM = function (_a) {
33301
33347
  );
33302
33348
  };
33303
33349
 
33304
- var SearchResultsConfigurationContext = React__default.createContext(undefined);
33305
-
33306
33350
  var _a;
33307
33351
  var initialState$1 = {
33308
33352
  results: [],
@@ -34437,18 +34481,6 @@ var Icon$1 = function (_a) {
34437
34481
  }
34438
34482
  };
34439
34483
 
34440
- var Spinner = function () {
34441
- var _a;
34442
- var context = useContext(SearchResultsConfigurationContext);
34443
- var translations = getTranslations((_a = context === null || context === void 0 ? void 0 : context.languageCode) !== null && _a !== void 0 ? _a : 'en-GB');
34444
- return React__default.createElement(
34445
- 'div',
34446
- { className: 'spinner__container' },
34447
- React__default.createElement('span', { className: 'spinner__icon' }),
34448
- React__default.createElement('span', { className: 'spinner__label' }, translations === null || translations === void 0 ? void 0 : translations.SRP.LOADING)
34449
- );
34450
- };
34451
-
34452
34484
  var getDepartureTime = function (flight) {
34453
34485
  var _a, _b;
34454
34486
  if (isEmpty(flight === null || flight === void 0 ? void 0 : flight.metaDatas)) return '';
@@ -40622,33 +40654,96 @@ var FlightResultsContainer = function (_a) {
40622
40654
  React__default.createElement(
40623
40655
  'div',
40624
40656
  { className: 'search__results' },
40625
- flightsLoading
40626
- ? React__default.createElement(Spinner, null)
40627
- : React__default.createElement(
40628
- React__default.Fragment,
40629
- null,
40630
- isMobile &&
40657
+ React__default.createElement(
40658
+ React__default.Fragment,
40659
+ null,
40660
+ isMobile &&
40661
+ React__default.createElement(
40662
+ 'div',
40663
+ { className: 'search__result-row' },
40664
+ React__default.createElement(
40665
+ 'div',
40666
+ { className: 'search__results__actions' },
40667
+ (context === null || context === void 0 ? void 0 : context.showFilters) &&
40668
+ React__default.createElement(
40669
+ 'div',
40670
+ {
40671
+ className: 'cta cta--filter',
40672
+ onClick: function () {
40673
+ return setFiltersOpen(true);
40674
+ }
40675
+ },
40676
+ React__default.createElement(Icon$1, { name: 'ui-filter', className: 'mobile-filters-button__icon', height: 16 }),
40677
+ translations.SRP.FILTERS
40678
+ )
40679
+ ),
40680
+ sortByTypes &&
40681
+ sortByTypes.length > 0 &&
40682
+ React__default.createElement(ItemPicker, {
40683
+ items: sortByTypes,
40684
+ selection: (selectedSortByType === null || selectedSortByType === void 0 ? void 0 : selectedSortByType.label) || undefined,
40685
+ selectedSortByType: selectedSortByType || undefined,
40686
+ label: translations.SRP.SORTBY,
40687
+ placeholder: translations.SRP.SORTBY,
40688
+ classModifier: 'travel-class-picker__items',
40689
+ valueFormatter: function (value, direction) {
40690
+ return getSortingName(translations, findSortByType(value, direction !== null && direction !== void 0 ? direction : 'asc'));
40691
+ },
40692
+ onPick: handleSortChange
40693
+ })
40694
+ ),
40695
+ React__default.createElement(
40696
+ 'div',
40697
+ { className: 'search__result-row' },
40698
+ React__default.createElement(
40699
+ 'span',
40700
+ { className: 'search__result-row-text' },
40701
+ !flightsLoading &&
40702
+ React__default.createElement(
40703
+ React__default.Fragment,
40704
+ null,
40705
+ (results === null || results === void 0 ? void 0 : results.length) &&
40706
+ React__default.createElement(React__default.Fragment, null, results.length, ' ', translations.SRP.TOTAL_RESULTS_LABEL)
40707
+ )
40708
+ ),
40709
+ !isMobile &&
40710
+ React__default.createElement(
40711
+ React__default.Fragment,
40712
+ null,
40631
40713
  React__default.createElement(
40632
40714
  'div',
40633
- { className: 'search__result-row' },
40715
+ { className: 'search__result-row-filter' },
40716
+ React__default.createElement(ItemPicker, {
40717
+ items: selectionTypes,
40718
+ selection:
40719
+ ((_c = selectionTypes.find(function (type) {
40720
+ return type.code === flightSelectionType;
40721
+ })) === null || _c === void 0
40722
+ ? void 0
40723
+ : _c.label) || undefined,
40724
+ label: 'Selection Type',
40725
+ placeholder: 'Selection Type',
40726
+ classModifier: 'travel-class-picker__items',
40727
+ valueFormatter: function (value) {
40728
+ return value;
40729
+ },
40730
+ onPick: function (value) {
40731
+ var _a;
40732
+ return setFlightSelectionType(
40733
+ ((_a = selectionTypes.find(function (type) {
40734
+ return type.label === value;
40735
+ })) === null || _a === void 0
40736
+ ? void 0
40737
+ : _a.code) || 'independent'
40738
+ );
40739
+ }
40740
+ })
40741
+ ),
40742
+ sortByTypes &&
40743
+ sortByTypes.length > 0 &&
40634
40744
  React__default.createElement(
40635
40745
  'div',
40636
- { className: 'search__results__actions' },
40637
- (context === null || context === void 0 ? void 0 : context.showFilters) &&
40638
- React__default.createElement(
40639
- 'div',
40640
- {
40641
- className: 'cta cta--filter',
40642
- onClick: function () {
40643
- return setFiltersOpen(true);
40644
- }
40645
- },
40646
- React__default.createElement(Icon$1, { name: 'ui-filter', className: 'mobile-filters-button__icon', height: 16 }),
40647
- translations.SRP.FILTERS
40648
- )
40649
- ),
40650
- sortByTypes &&
40651
- sortByTypes.length > 0 &&
40746
+ { className: 'search__result-row-filter' },
40652
40747
  React__default.createElement(ItemPicker, {
40653
40748
  items: sortByTypes,
40654
40749
  selection: (selectedSortByType === null || selectedSortByType === void 0 ? void 0 : selectedSortByType.label) || undefined,
@@ -40661,85 +40756,20 @@ var FlightResultsContainer = function (_a) {
40661
40756
  },
40662
40757
  onPick: handleSortChange
40663
40758
  })
40664
- ),
40665
- React__default.createElement(
40666
- 'div',
40667
- { className: 'search__result-row' },
40668
- React__default.createElement(
40669
- 'span',
40670
- { className: 'search__result-row-text' },
40671
- !flightsLoading &&
40672
- React__default.createElement(
40673
- React__default.Fragment,
40674
- null,
40675
- (results === null || results === void 0 ? void 0 : results.length) && results.length,
40676
- ' ',
40677
- translations.SRP.TOTAL_RESULTS_LABEL
40678
- )
40679
- ),
40680
- !isMobile &&
40681
- React__default.createElement(
40682
- React__default.Fragment,
40683
- null,
40684
- React__default.createElement(
40685
- 'div',
40686
- { className: 'search__result-row-filter' },
40687
- React__default.createElement(ItemPicker, {
40688
- items: selectionTypes,
40689
- selection:
40690
- ((_c = selectionTypes.find(function (type) {
40691
- return type.code === flightSelectionType;
40692
- })) === null || _c === void 0
40693
- ? void 0
40694
- : _c.label) || undefined,
40695
- label: 'Selection Type',
40696
- placeholder: 'Selection Type',
40697
- classModifier: 'travel-class-picker__items',
40698
- valueFormatter: function (value) {
40699
- return value;
40700
- },
40701
- onPick: function (value) {
40702
- var _a;
40703
- return setFlightSelectionType(
40704
- ((_a = selectionTypes.find(function (type) {
40705
- return type.label === value;
40706
- })) === null || _a === void 0
40707
- ? void 0
40708
- : _a.code) || 'independent'
40709
- );
40710
- }
40711
- })
40712
- ),
40713
- sortByTypes &&
40714
- sortByTypes.length > 0 &&
40715
- React__default.createElement(
40716
- 'div',
40717
- { className: 'search__result-row-filter' },
40718
- React__default.createElement(ItemPicker, {
40719
- items: sortByTypes,
40720
- selection: (selectedSortByType === null || selectedSortByType === void 0 ? void 0 : selectedSortByType.label) || undefined,
40721
- selectedSortByType: selectedSortByType || undefined,
40722
- label: translations.SRP.SORTBY,
40723
- placeholder: translations.SRP.SORTBY,
40724
- classModifier: 'travel-class-picker__items',
40725
- valueFormatter: function (value, direction) {
40726
- return getSortingName(translations, findSortByType(value, direction !== null && direction !== void 0 ? direction : 'asc'));
40727
- },
40728
- onPick: handleSortChange
40729
- })
40730
- )
40731
40759
  )
40732
- ),
40733
- React__default.createElement(
40734
- 'div',
40735
- { className: 'search__results__wrapper' },
40736
- (context === null || context === void 0 ? void 0 : context.type) == 'flight' &&
40737
- (context === null || context === void 0 ? void 0 : context.showFlightAccommodationResults) &&
40738
- results &&
40739
- results.length > 0 &&
40740
- React__default.createElement(FlightSelection, { searchResults: results, flightSelectionType: flightSelectionType })
40741
40760
  )
40742
- )
40761
+ ),
40762
+ React__default.createElement(
40763
+ 'div',
40764
+ { className: 'search__results__wrapper' },
40765
+ flightsLoading && React__default.createElement(Spinner, null),
40766
+ (context === null || context === void 0 ? void 0 : context.type) == 'flight' &&
40767
+ (context === null || context === void 0 ? void 0 : context.showFlightAccommodationResults) &&
40768
+ results &&
40769
+ results.length > 0 &&
40770
+ React__default.createElement(FlightSelection, { searchResults: results, flightSelectionType: flightSelectionType })
40771
+ )
40772
+ )
40743
40773
  )
40744
40774
  );
40745
40775
  };
@@ -41451,7 +41481,7 @@ var SearchResultsContainer = function () {
41451
41481
  var room = { index: i, pax: [] };
41452
41482
  range(0, x.adults).forEach(function () {
41453
41483
  room.pax.push({
41454
- age: Math.floor(Math.random() * 100)
41484
+ age: 30
41455
41485
  });
41456
41486
  });
41457
41487
  x.childAges.forEach(function (x) {
@@ -9,6 +9,7 @@ interface SearchInputProps {
9
9
  isSecondInput?: boolean;
10
10
  isDoubleInput?: boolean;
11
11
  isDisabled?: boolean;
12
+ isLoading?: boolean;
12
13
  }
13
14
  declare const SearchInput: React.FC<SearchInputProps>;
14
15
  export default SearchInput;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qite/tide-booking-component",
3
- "version": "1.4.71",
3
+ "version": "1.4.73",
4
4
  "description": "React Booking wizard & Booking product component for Tide",
5
5
  "main": "build/build-cjs/index.js",
6
6
  "types": "build/build-cjs/src/index.d.ts",
@@ -29,7 +29,7 @@
29
29
  "devDependencies": {
30
30
  "@jsonurl/jsonurl": "^1.1.4",
31
31
  "@popperjs/core": "^2.10.2",
32
- "@qite/tide-client": "^1.1.143",
32
+ "@qite/tide-client": "^1.1.144",
33
33
  "@reduxjs/toolkit": "^2.8.2",
34
34
  "@rollup/plugin-commonjs": "^19.0.1",
35
35
  "@rollup/plugin-json": "^4.1.0",
@@ -47,8 +47,13 @@ const QSMContainer: React.FC = () => {
47
47
  useEffect(() => {
48
48
  if (fromDate || toDate) return;
49
49
 
50
- const startDate = addMonths(new Date(), 1);
51
- const endDate = addDays(startDate, 7);
50
+ let startDate = addMonths(new Date(), 1);
51
+ let endDate = addDays(startDate, 7);
52
+
53
+ if (qsmType === 'groupTour') {
54
+ startDate = new Date();
55
+ endDate = addYears(startDate, 1);
56
+ }
52
57
 
53
58
  dispatch(setFromDate(startDate.toISOString()));
54
59
  dispatch(setToDate(endDate.toISOString()));
@@ -75,17 +80,18 @@ const QSMContainer: React.FC = () => {
75
80
  const handleQsmTypeChange = (value: SRPType) => {
76
81
  dispatch(setSelectedQsmType(value));
77
82
 
83
+ let startDate = addMonths(new Date(), 1);
84
+ let endDate = addDays(startDate, 7);
85
+
78
86
  if (value === 'groupTour') {
79
- handleDateChange({
80
- fromDate: new Date(fromDate ?? Date.now()),
81
- toDate: addYears(new Date(fromDate ?? Date.now()), 1)
82
- });
83
- } else {
84
- handleDateChange({
85
- fromDate: new Date(fromDate ?? Date.now()),
86
- toDate: addDays(new Date(fromDate ?? Date.now()), 7)
87
- });
87
+ startDate = new Date();
88
+ endDate = addYears(startDate, 1);
88
89
  }
90
+
91
+ handleDateChange({
92
+ fromDate: startDate,
93
+ toDate: endDate
94
+ });
89
95
  };
90
96
 
91
97
  const handleSubmit = () => {
@@ -1,6 +1,7 @@
1
1
  import React from 'react';
2
2
  import Icon from '../icon';
3
3
  import { TypeaheadOption } from '../../types';
4
+ import Spinner from '../../../search-results/components/spinner/spinner';
4
5
 
5
6
  interface SearchInputProps {
6
7
  onChange: (input: string) => void;
@@ -11,9 +12,19 @@ interface SearchInputProps {
11
12
  isSecondInput?: boolean;
12
13
  isDoubleInput?: boolean;
13
14
  isDisabled?: boolean;
15
+ isLoading?: boolean;
14
16
  }
15
17
 
16
- const SearchInput: React.FC<SearchInputProps> = ({ searchResults, onOptionSelect, highlightTarget, label, isSecondInput, isDoubleInput, isDisabled }) => {
18
+ const SearchInput: React.FC<SearchInputProps> = ({
19
+ searchResults,
20
+ onOptionSelect,
21
+ highlightTarget,
22
+ label,
23
+ isSecondInput,
24
+ isDoubleInput,
25
+ isDisabled,
26
+ isLoading
27
+ }) => {
17
28
  if (isDisabled) {
18
29
  return null;
19
30
  }
@@ -38,15 +49,16 @@ const SearchInput: React.FC<SearchInputProps> = ({ searchResults, onOptionSelect
38
49
  );
39
50
  };
40
51
 
41
- if (searchResults.length === 0) {
42
- return null;
43
- }
52
+ // if (searchResults.length === 0) {
53
+ // return null;
54
+ // }
44
55
 
45
56
  return (
46
57
  <div
47
58
  className={`qsm__double-input-options${isSecondInput ? ' qsm__double-input-options--second-input' : ''}${
48
59
  isDoubleInput ? ' qsm__double-input-options--splittable' : ''
49
60
  }`}>
61
+ {isLoading && <Spinner />}
50
62
  {searchResults.map((option, index) => (
51
63
  <div
52
64
  key={index}
@@ -1,4 +1,4 @@
1
- import React, { useEffect, useRef, useMemo, useCallback } from 'react';
1
+ import React, { useEffect, useRef, useMemo, useCallback, useState } from 'react';
2
2
  import { useDispatch, useSelector } from 'react-redux';
3
3
  import { QSMRootState } from '../../store/qsm-store';
4
4
  import { setFieldValue, setSearchResults, setActiveSearchField, setMobileFilterType, setActiveSearchFieldProps } from '../../store/qsm-slice';
@@ -32,8 +32,8 @@ const SearchInputGroup: React.FC<Props> = ({
32
32
  if (!fieldConfig) {
33
33
  return null;
34
34
  }
35
-
36
35
  const { fieldKey, label, placeholder, options, autoComplete } = fieldConfig;
36
+ const [isLoading, setIsLoading] = useState(false);
37
37
 
38
38
  const selector = useMemo(() => (state: QSMRootState) => ((state.qsm as any)[fieldKey] ?? '') as string, [fieldKey]);
39
39
  const value = useSelector(selector);
@@ -66,6 +66,7 @@ const SearchInputGroup: React.FC<Props> = ({
66
66
  // if field has custom onChange (API search)
67
67
  if (fieldConfig.onChange) {
68
68
  fieldConfig.onChange(input);
69
+ setIsLoading(true);
69
70
  return;
70
71
  }
71
72
 
@@ -75,6 +76,11 @@ const SearchInputGroup: React.FC<Props> = ({
75
76
  [dispatch, fieldKey, small, match, fieldConfig]
76
77
  );
77
78
 
79
+ useEffect(() => {
80
+ console.log('options updated, resetting loading state');
81
+ setIsLoading(false);
82
+ }, [options]);
83
+
78
84
  useEffect(() => {
79
85
  if (!value || activeSearchField !== fieldKey) return;
80
86
 
@@ -183,6 +189,7 @@ const SearchInputGroup: React.FC<Props> = ({
183
189
  isSecondInput={isSecondInput}
184
190
  isDoubleInput={isDoubleInput}
185
191
  isDisabled={isDisabled}
192
+ isLoading={isLoading}
186
193
  />
187
194
  )}
188
195
  </label>
@@ -57,81 +57,82 @@ const FlightResultsContainer: React.FC<FlightResultsContainerProps> = ({ isMobil
57
57
  {context?.showFilters && <FlightFilters isOpen={filtersOpen} handleSetIsOpen={() => setFiltersOpen(!filtersOpen)} isLoading={flightsLoading} />}
58
58
  {/* ---------------- Results ---------------- */}
59
59
  <div className="search__results">
60
- {flightsLoading ? (
61
- <Spinner />
62
- ) : (
63
- <>
64
- {isMobile && (
65
- <div className="search__result-row">
66
- <div className="search__results__actions">
67
- {context?.showFilters && (
68
- <div className="cta cta--filter" onClick={() => setFiltersOpen(true)}>
69
- <Icon name="ui-filter" className="mobile-filters-button__icon" height={16} />
70
- {translations.SRP.FILTERS}
71
- </div>
72
- )}
73
- </div>
74
- {sortByTypes && sortByTypes.length > 0 && (
75
- <ItemPicker
76
- items={sortByTypes}
77
- selection={selectedSortByType?.label || undefined}
78
- selectedSortByType={selectedSortByType || undefined}
79
- label={translations.SRP.SORTBY}
80
- placeholder={translations.SRP.SORTBY}
81
- classModifier="travel-class-picker__items"
82
- valueFormatter={(value, direction) => getSortingName(translations, findSortByType(value, direction ?? 'asc'))}
83
- onPick={handleSortChange}
84
- />
60
+ <>
61
+ {isMobile && (
62
+ <div className="search__result-row">
63
+ <div className="search__results__actions">
64
+ {context?.showFilters && (
65
+ <div className="cta cta--filter" onClick={() => setFiltersOpen(true)}>
66
+ <Icon name="ui-filter" className="mobile-filters-button__icon" height={16} />
67
+ {translations.SRP.FILTERS}
68
+ </div>
85
69
  )}
86
70
  </div>
87
- )}
71
+ {sortByTypes && sortByTypes.length > 0 && (
72
+ <ItemPicker
73
+ items={sortByTypes}
74
+ selection={selectedSortByType?.label || undefined}
75
+ selectedSortByType={selectedSortByType || undefined}
76
+ label={translations.SRP.SORTBY}
77
+ placeholder={translations.SRP.SORTBY}
78
+ classModifier="travel-class-picker__items"
79
+ valueFormatter={(value, direction) => getSortingName(translations, findSortByType(value, direction ?? 'asc'))}
80
+ onPick={handleSortChange}
81
+ />
82
+ )}
83
+ </div>
84
+ )}
88
85
 
89
- <div className="search__result-row">
90
- <span className="search__result-row-text">
91
- {!flightsLoading && (
92
- <>
93
- {results?.length && results.length} {translations.SRP.TOTAL_RESULTS_LABEL}
94
- </>
95
- )}
96
- </span>
97
- {!isMobile && (
86
+ <div className="search__result-row">
87
+ <span className="search__result-row-text">
88
+ {!flightsLoading && (
98
89
  <>
90
+ {results?.length && (
91
+ <>
92
+ {results.length} {translations.SRP.TOTAL_RESULTS_LABEL}
93
+ </>
94
+ )}
95
+ </>
96
+ )}
97
+ </span>
98
+ {!isMobile && (
99
+ <>
100
+ <div className="search__result-row-filter">
101
+ <ItemPicker
102
+ items={selectionTypes}
103
+ selection={selectionTypes.find((type) => type.code === flightSelectionType)?.label || undefined}
104
+ label="Selection Type"
105
+ placeholder="Selection Type"
106
+ classModifier="travel-class-picker__items"
107
+ valueFormatter={(value) => value}
108
+ onPick={(value) => setFlightSelectionType(selectionTypes.find((type) => type.label === value)?.code || 'independent')}
109
+ />
110
+ </div>
111
+ {sortByTypes && sortByTypes.length > 0 && (
99
112
  <div className="search__result-row-filter">
100
113
  <ItemPicker
101
- items={selectionTypes}
102
- selection={selectionTypes.find((type) => type.code === flightSelectionType)?.label || undefined}
103
- label="Selection Type"
104
- placeholder="Selection Type"
114
+ items={sortByTypes}
115
+ selection={selectedSortByType?.label || undefined}
116
+ selectedSortByType={selectedSortByType || undefined}
117
+ label={translations.SRP.SORTBY}
118
+ placeholder={translations.SRP.SORTBY}
105
119
  classModifier="travel-class-picker__items"
106
- valueFormatter={(value) => value}
107
- onPick={(value) => setFlightSelectionType(selectionTypes.find((type) => type.label === value)?.code || 'independent')}
120
+ valueFormatter={(value, direction) => getSortingName(translations, findSortByType(value, direction ?? 'asc'))}
121
+ onPick={handleSortChange}
108
122
  />
109
123
  </div>
110
- {sortByTypes && sortByTypes.length > 0 && (
111
- <div className="search__result-row-filter">
112
- <ItemPicker
113
- items={sortByTypes}
114
- selection={selectedSortByType?.label || undefined}
115
- selectedSortByType={selectedSortByType || undefined}
116
- label={translations.SRP.SORTBY}
117
- placeholder={translations.SRP.SORTBY}
118
- classModifier="travel-class-picker__items"
119
- valueFormatter={(value, direction) => getSortingName(translations, findSortByType(value, direction ?? 'asc'))}
120
- onPick={handleSortChange}
121
- />
122
- </div>
123
- )}
124
- </>
125
- )}
126
- </div>
124
+ )}
125
+ </>
126
+ )}
127
+ </div>
127
128
 
128
- <div className="search__results__wrapper">
129
- {context?.type == 'flight' && context?.showFlightAccommodationResults && results && results.length > 0 && (
130
- <FlightSelection searchResults={results} flightSelectionType={flightSelectionType} />
131
- )}
132
- </div>
133
- </>
134
- )}
129
+ <div className="search__results__wrapper">
130
+ {flightsLoading && <Spinner />}
131
+ {context?.type == 'flight' && context?.showFlightAccommodationResults && results && results.length > 0 && (
132
+ <FlightSelection searchResults={results} flightSelectionType={flightSelectionType} />
133
+ )}
134
+ </div>
135
+ </>
135
136
  </div>
136
137
  </>
137
138
  );
@@ -270,7 +270,7 @@ const SearchResultsContainer: React.FC = () => {
270
270
  var room = { index: i, pax: [] } as BookingPackageRequestRoom;
271
271
  range(0, x.adults).forEach(() => {
272
272
  room.pax.push({
273
- age: Math.floor(Math.random() * 100)
273
+ age: 30
274
274
  } as BookingPackagePax);
275
275
  });
276
276
  x.childAges.forEach((x) => {
@@ -1,4 +1,5 @@
1
- #tide-booking {
1
+ #tide-booking,
2
+ #tide-content {
2
3
  @import './components/mixins';
3
4
  @import './components/placeholders';
4
5
  @import './components/base';