@zengenti/contensis-react-base 3.0.0-beta.4 → 3.0.0-beta.43

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 (147) hide show
  1. package/README.md +4 -4
  2. package/cjs/{App-581b6653.js → App-2ff001f6.js} +139 -124
  3. package/cjs/App-2ff001f6.js.map +1 -0
  4. package/cjs/{RouteLoader-282c03ab.js → RouteLoader-2ed14766.js} +44 -30
  5. package/cjs/RouteLoader-2ed14766.js.map +1 -0
  6. package/cjs/ToJs-09204afd.js +129 -0
  7. package/cjs/ToJs-09204afd.js.map +1 -0
  8. package/cjs/{actions-12871aca.js → actions-6b9ef168.js} +9 -8
  9. package/cjs/actions-6b9ef168.js.map +1 -0
  10. package/cjs/client.js +43 -22
  11. package/cjs/client.js.map +1 -1
  12. package/cjs/contensis-react-base.js +46 -49
  13. package/cjs/contensis-react-base.js.map +1 -1
  14. package/cjs/forms.js +275 -275
  15. package/cjs/forms.js.map +1 -1
  16. package/cjs/fromJSLeaveImmer-65d26804.js +28 -0
  17. package/cjs/fromJSLeaveImmer-65d26804.js.map +1 -0
  18. package/cjs/{login-81d7f9ef.js → login-d67b82aa.js} +113 -79
  19. package/cjs/login-d67b82aa.js.map +1 -0
  20. package/cjs/{reducers-fde41d6b.js → reducers-3a4f8971.js} +26 -25
  21. package/cjs/reducers-3a4f8971.js.map +1 -0
  22. package/cjs/redux.js +13 -14
  23. package/cjs/redux.js.map +1 -1
  24. package/cjs/routing.js +9 -8
  25. package/cjs/routing.js.map +1 -1
  26. package/cjs/search.js +418 -256
  27. package/cjs/search.js.map +1 -1
  28. package/cjs/{selectors-ed26ed97.js → selectors-2c1b1183.js} +8 -4
  29. package/cjs/selectors-2c1b1183.js.map +1 -0
  30. package/cjs/user.js +32 -23
  31. package/cjs/user.js.map +1 -1
  32. package/cjs/util.js +49 -46
  33. package/cjs/util.js.map +1 -1
  34. package/cjs/{version-f061e409.js → version-951bc80c.js} +58 -52
  35. package/cjs/version-951bc80c.js.map +1 -0
  36. package/cjs/{version-0c190929.js → version-dcfdafd9.js} +5 -5
  37. package/cjs/{version-0c190929.js.map → version-dcfdafd9.js.map} +1 -1
  38. package/esm/{App-122f28a3.js → App-7b3aee16.js} +120 -124
  39. package/esm/App-7b3aee16.js.map +1 -0
  40. package/esm/{RouteLoader-c2faac87.js → RouteLoader-d4b4d320.js} +37 -23
  41. package/esm/RouteLoader-d4b4d320.js.map +1 -0
  42. package/esm/ToJs-2627ce21.js +99 -0
  43. package/esm/ToJs-2627ce21.js.map +1 -0
  44. package/esm/{actions-3cc39599.js → actions-5437f43d.js} +8 -7
  45. package/esm/actions-5437f43d.js.map +1 -0
  46. package/esm/client.js +22 -20
  47. package/esm/client.js.map +1 -1
  48. package/esm/contensis-react-base.js +28 -31
  49. package/esm/contensis-react-base.js.map +1 -1
  50. package/esm/forms.js +5 -5
  51. package/esm/forms.js.map +1 -1
  52. package/esm/fromJSLeaveImmer-e2f0f331.js +26 -0
  53. package/esm/fromJSLeaveImmer-e2f0f331.js.map +1 -0
  54. package/esm/{login-92db44d1.js → login-f6dfbe1b.js} +97 -60
  55. package/esm/login-f6dfbe1b.js.map +1 -0
  56. package/esm/{reducers-d6c0edb1.js → reducers-8e5d6232.js} +26 -25
  57. package/esm/reducers-8e5d6232.js.map +1 -0
  58. package/esm/redux.js +14 -13
  59. package/esm/redux.js.map +1 -1
  60. package/esm/routing.js +9 -8
  61. package/esm/routing.js.map +1 -1
  62. package/esm/search.js +387 -244
  63. package/esm/search.js.map +1 -1
  64. package/esm/{selectors-82e71d8e.js → selectors-65f0f31c.js} +9 -6
  65. package/esm/selectors-65f0f31c.js.map +1 -0
  66. package/esm/user.js +31 -22
  67. package/esm/user.js.map +1 -1
  68. package/esm/util.js +18 -11
  69. package/esm/util.js.map +1 -1
  70. package/esm/version-696796d7.js +15 -0
  71. package/esm/{version-59c8f9be.js.map → version-696796d7.js.map} +1 -1
  72. package/esm/{version-cb9cd09d.js → version-b2ca1dab.js} +38 -31
  73. package/esm/version-b2ca1dab.js.map +1 -0
  74. package/models/redux/appstate.d.ts +5 -10
  75. package/models/redux/reducers/navigation.d.ts +1 -6
  76. package/models/redux/reducers/version.d.ts +1 -5
  77. package/models/redux/selectors/navigation.d.ts +2 -1
  78. package/models/routing/redux/actions.d.ts +1 -1
  79. package/models/routing/redux/reducers.d.ts +1 -21
  80. package/models/routing/redux/selectors.d.ts +1 -1
  81. package/models/routing/routes.d.ts +3 -2
  82. package/models/routing/util/expressions.d.ts +3 -2
  83. package/models/routing/util/queries.d.ts +1 -1
  84. package/models/search/containers/withListing.d.ts +1 -1
  85. package/models/search/containers/withSearch.d.ts +1 -1
  86. package/models/search/hooks/useListing.hook.d.ts +3 -0
  87. package/models/search/hooks/useMinilist.hook.d.ts +2 -9
  88. package/models/search/index.d.ts +1 -0
  89. package/models/search/models/Queries.d.ts +8 -5
  90. package/models/search/models/Search.d.ts +58 -26
  91. package/models/search/models/SearchActions.d.ts +4 -3
  92. package/models/search/models/SearchProps.d.ts +25 -2
  93. package/models/search/models/SearchState.d.ts +5 -1
  94. package/models/search/models/index.d.ts +2 -1
  95. package/models/search/redux/actions.d.ts +2 -1
  96. package/models/search/redux/reducers.d.ts +230 -314
  97. package/models/search/redux/sagas.d.ts +5 -5
  98. package/models/search/redux/selectors.d.ts +5 -10
  99. package/models/search/search/expressions.d.ts +2 -6
  100. package/models/search/transformations/entry-to-filteritem.mapper.d.ts +2 -1
  101. package/models/search/transformations/filter-to-filterexpression.mapper.d.ts +6 -0
  102. package/models/search/transformations/filters-to-filterexpressions.mapper.d.ts +3 -0
  103. package/models/search/transformations/index.d.ts +3 -0
  104. package/models/search/transformations/state-to-searchuri.d.ts +2 -13
  105. package/models/server/util/headers.d.ts +3 -2
  106. package/models/testImmer/redux/reducer.d.ts +1 -7
  107. package/models/user/components/Login.d.ts +1 -2
  108. package/models/user/components/LoginForm.d.ts +1 -2
  109. package/models/user/hocs/withLogin.d.ts +2 -2
  110. package/models/user/hooks/useChangePassword.d.ts +5 -5
  111. package/models/user/hooks/useForgotPassword.d.ts +6 -6
  112. package/models/user/hooks/useLogin.d.ts +9 -45
  113. package/models/user/hooks/useRegistration.d.ts +4 -4
  114. package/models/user/redux/reducers.d.ts +5 -32
  115. package/models/user/redux/sagas/login.d.ts +11 -8
  116. package/models/user/redux/selectors.d.ts +33 -71
  117. package/models/user/util/LoginHelper.class.d.ts +4 -3
  118. package/models/util/json-mapper.d.ts +9 -3
  119. package/models/util/merge.d.ts +1 -0
  120. package/package-lock.json +2006 -4796
  121. package/package.json +47 -48
  122. package/cjs/App-581b6653.js.map +0 -1
  123. package/cjs/RouteLoader-282c03ab.js.map +0 -1
  124. package/cjs/ToJs-87edc45d.js +0 -230
  125. package/cjs/ToJs-87edc45d.js.map +0 -1
  126. package/cjs/actions-12871aca.js.map +0 -1
  127. package/cjs/fromJSLeaveImmer-9b550c8e.js +0 -40
  128. package/cjs/fromJSLeaveImmer-9b550c8e.js.map +0 -1
  129. package/cjs/login-81d7f9ef.js.map +0 -1
  130. package/cjs/reducers-fde41d6b.js.map +0 -1
  131. package/cjs/selectors-ed26ed97.js.map +0 -1
  132. package/cjs/version-f061e409.js.map +0 -1
  133. package/esm/App-122f28a3.js.map +0 -1
  134. package/esm/RouteLoader-c2faac87.js.map +0 -1
  135. package/esm/ToJs-52fee252.js +0 -199
  136. package/esm/ToJs-52fee252.js.map +0 -1
  137. package/esm/actions-3cc39599.js.map +0 -1
  138. package/esm/fromJSLeaveImmer-e44d1a91.js +0 -38
  139. package/esm/fromJSLeaveImmer-e44d1a91.js.map +0 -1
  140. package/esm/login-92db44d1.js.map +0 -1
  141. package/esm/reducers-d6c0edb1.js.map +0 -1
  142. package/esm/selectors-82e71d8e.js.map +0 -1
  143. package/esm/version-59c8f9be.js +0 -15
  144. package/esm/version-cb9cd09d.js.map +0 -1
  145. package/models/search/transformations/filters-to-filterexpression.d.ts +0 -1
  146. package/models/search/transformations/filters-to-filterexpression.mapper.d.ts +0 -2
  147. package/models/server/features/caching/cacheHashing.d.ts +0 -1
package/cjs/search.js CHANGED
@@ -5,26 +5,44 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var React = require('react');
6
6
  var reactRedux = require('react-redux');
7
7
  var mapJson = require('jsonpath-mapper');
8
- var immer = require('immer');
8
+ var log = require('loglevel');
9
9
  var effects = require('@redux-saga/core/effects');
10
10
  var contensisDeliveryApi = require('contensis-delivery-api');
11
11
  var queryString = require('query-string');
12
- var log = require('loglevel');
13
- var reselect = require('reselect');
14
12
  var contensisCoreApi = require('contensis-core-api');
15
13
  var merge = require('deepmerge');
14
+ var reselect = require('reselect');
15
+ var immer = require('immer');
16
16
  var equals = require('deep-equal');
17
17
 
18
18
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
19
19
 
20
+ function _interopNamespace(e) {
21
+ if (e && e.__esModule) return e;
22
+ var n = Object.create(null);
23
+ if (e) {
24
+ Object.keys(e).forEach(function (k) {
25
+ if (k !== 'default') {
26
+ var d = Object.getOwnPropertyDescriptor(e, k);
27
+ Object.defineProperty(n, k, d.get ? d : {
28
+ enumerable: true,
29
+ get: function () { return e[k]; }
30
+ });
31
+ }
32
+ });
33
+ }
34
+ n["default"] = e;
35
+ return Object.freeze(n);
36
+ }
37
+
20
38
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
21
39
  var mapJson__default = /*#__PURE__*/_interopDefaultLegacy(mapJson);
22
- var queryString__default = /*#__PURE__*/_interopDefaultLegacy(queryString);
40
+ var log__namespace = /*#__PURE__*/_interopNamespace(log);
23
41
  var merge__default = /*#__PURE__*/_interopDefaultLegacy(merge);
24
42
  var equals__default = /*#__PURE__*/_interopDefaultLegacy(equals);
25
43
 
26
44
  /* eslint-disable import/default */
27
- const toJS = WrappedComponent => wrappedComponentProps => {
45
+ const toJS$1 = WrappedComponent => wrappedComponentProps => {
28
46
  const KEY = 0;
29
47
  const VALUE = 1;
30
48
  const propsJS = Object.entries(wrappedComponentProps).reduce((newProps, wrappedComponentProp) => {
@@ -33,7 +51,7 @@ const toJS = WrappedComponent => wrappedComponentProps => {
33
51
  newProps[propKey] = propValue && typeof propValue === 'object' && 'toJS' in propValue ? propValue.toJS() : propValue;
34
52
  return newProps;
35
53
  }, {});
36
- return /*#__PURE__*/React__default['default'].createElement(WrappedComponent, propsJS);
54
+ return /*#__PURE__*/React__default["default"].createElement(WrappedComponent, propsJS);
37
55
  };
38
56
 
39
57
  const ACTION_PREFIX = '@SEARCH/';
@@ -133,43 +151,44 @@ const navigate = (path, state) => {
133
151
  state
134
152
  };
135
153
  };
136
- const clearFilters = () => {
154
+ const clearFilters$1 = () => {
137
155
  return {
138
156
  type: CLEAR_FILTERS
139
157
  };
140
158
  };
141
- const updatePageIndex = pageIndex => {
159
+ const updatePageIndex$1 = pageIndex => {
142
160
  return {
143
161
  type: UPDATE_PAGE_INDEX,
144
162
  pageIndex
145
163
  };
146
164
  };
147
- const updateCurrentFacet = facet => {
165
+ const updateCurrentFacet$1 = facet => {
148
166
  return {
149
167
  type: UPDATE_CURRENT_FACET,
150
168
  facet
151
169
  };
152
170
  };
153
- const updateCurrentTab = id => {
171
+ const updateCurrentTab$1 = id => {
154
172
  return {
155
173
  type: UPDATE_CURRENT_TAB,
156
174
  id
157
175
  };
158
176
  };
159
- const updateSearchTerm = term => {
177
+ const updateSearchTerm$1 = term => {
160
178
  return {
161
179
  type: UPDATE_SEARCH_TERM,
162
180
  term
163
181
  };
164
182
  };
165
- const updateSelectedFilters = (filter, key) => {
183
+ const updateSelectedFilters = (filter, key, isUnknownItem = false) => {
166
184
  return {
167
185
  type: UPDATE_SELECTED_FILTERS,
168
186
  filter,
169
- key
187
+ key,
188
+ isUnknownItem
170
189
  };
171
190
  };
172
- const updateSortOrder = (orderBy, facet) => {
191
+ const updateSortOrder$1 = (orderBy, facet) => {
173
192
  return {
174
193
  type: UPDATE_SORT_ORDER,
175
194
  orderBy,
@@ -183,22 +202,22 @@ var actions = /*#__PURE__*/Object.freeze({
183
202
  triggerSearch: triggerSearch,
184
203
  initListing: initListing,
185
204
  navigate: navigate,
186
- clearFilters: clearFilters,
187
- updatePageIndex: updatePageIndex,
188
- updateCurrentFacet: updateCurrentFacet,
189
- updateCurrentTab: updateCurrentTab,
190
- updateSearchTerm: updateSearchTerm,
205
+ clearFilters: clearFilters$1,
206
+ updatePageIndex: updatePageIndex$1,
207
+ updateCurrentFacet: updateCurrentFacet$1,
208
+ updateCurrentTab: updateCurrentTab$1,
209
+ updateSearchTerm: updateSearchTerm$1,
191
210
  updateSelectedFilters: updateSelectedFilters,
192
- updateSortOrder: updateSortOrder
211
+ updateSortOrder: updateSortOrder$1
193
212
  });
194
213
 
195
- let Context; // export type Context = 'facets' | 'listings' | 'minilist';
214
+ let Context$1; // export type Context = 'facets' | 'listings' | 'minilist';
196
215
 
197
216
  (function (Context) {
198
217
  Context["facets"] = "facets";
199
218
  Context["listings"] = "listings";
200
219
  Context["minilist"] = "minilist";
201
- })(Context || (Context = {}));
220
+ })(Context$1 || (Context$1 = {}));
202
221
 
203
222
  // or replace with a stub function for non-immutable gets
204
223
 
@@ -229,12 +248,12 @@ const getImmutableOrJS = (state, stateKey, fallbackValue, returnType = globalThi
229
248
  return result;
230
249
  };
231
250
 
232
- const getSearchContext = state => getImmutableOrJS(state, ['search', 'context'], Context.facets);
233
- const getCurrent = (state, context = Context.facets) => context === Context.facets ? getCurrentFacet(state) : getCurrentListing(state);
251
+ const getSearchContext = state => getImmutableOrJS(state, ['search', 'context'], Context$1.facets);
252
+ const getCurrent$1 = (state, context = Context$1.facets) => context === Context$1.facets ? getCurrentFacet(state) : getCurrentListing(state);
234
253
  const getCurrentFacet = state => getImmutableOrJS(state, ['search', 'currentFacet']);
235
254
  const getCurrentListing = state => getImmutableOrJS(state, ['search', 'currentListing']);
236
- const getCurrentTab = state => getImmutableOrJS(state, ['search', Context.facets, getCurrentFacet(state), 'tabId'], 0);
237
- const getFacets = (state, returnType) => getImmutableOrJS(state, ['search', Context.facets], {}, returnType);
255
+ const getCurrentTab = state => getImmutableOrJS(state, ['search', Context$1.facets, getCurrentFacet(state), 'tabId'], 0);
256
+ const getFacets = (state, returnType) => getImmutableOrJS(state, ['search', Context$1.facets], {}, returnType);
238
257
  const getTabFacets = state => Object.fromEntries(Object.entries(getFacets(state, 'js')).filter(([key]) => getImmutableOrJS(getFacets(state), [key, 'tabId'], 0) === getCurrentTab(state)));
239
258
  const getFacetTitles = state => Object.entries(getFacets(state, 'js')).map(([key, facet = {}]) => {
240
259
  var _facet$pagingInfo;
@@ -245,19 +264,19 @@ const getFacetTitles = state => Object.entries(getFacets(state, 'js')).map(([key
245
264
  totalCount: (_facet$pagingInfo = facet.pagingInfo) === null || _facet$pagingInfo === void 0 ? void 0 : _facet$pagingInfo.totalCount
246
265
  };
247
266
  });
248
- const getFacet = (state, facetName = '', context = Context.facets, returnType) => {
267
+ const getFacet = (state, facetName = '', context = Context$1.facets, returnType) => {
249
268
  const currentFacet = facetName || getCurrentFacet(state);
250
269
  return getImmutableOrJS(state, ['search', context, currentFacet], {}, returnType);
251
270
  };
252
- const getListing = (state, listing = '') => {
271
+ const getListing$1 = (state, listing = '') => {
253
272
  const currentListing = listing || getCurrentListing(state);
254
- return getImmutableOrJS(state, ['search', Context.listings, currentListing], {});
273
+ return getImmutableOrJS(state, ['search', Context$1.listings, currentListing], {});
255
274
  };
256
- const getFilters = (state, facet, context = Context.facets, returnType) => {
257
- return getImmutableOrJS(state, ['search', context, facet || getCurrent(state, context), 'filters'], {}, returnType);
275
+ const getFilters = (state, facet, context = Context$1.facets, returnType) => {
276
+ return getImmutableOrJS(state, ['search', context, facet || getCurrent$1(state, context), 'filters'], {}, returnType);
258
277
  };
259
- const getRenderableFilters = (state, facet = '', context = Context.facets) => Object.fromEntries(Object.entries(getFilters(state, facet, context, 'js')).filter(([, f = {}]) => typeof f.renderable !== 'boolean' ? true : f.renderable));
260
- const getFiltersToLoad = (state, facet, context = Context.facets, returnType) => {
278
+ const getRenderableFilters$1 = (state, facet = '', context = Context$1.facets) => Object.fromEntries(Object.entries(getFilters(state, facet, context, 'js')).filter(([, f = {}]) => typeof f.renderable !== 'boolean' ? true : f.renderable));
279
+ const getFiltersToLoad = (state, facet, context = Context$1.facets, returnType) => {
261
280
  const filters = getFilters(state, facet, context, returnType);
262
281
  const loadedFilters = Object.entries(filters).map(([key, f = {}]) => [key, (f.items || []).filter(i => {
263
282
  const title = i === null || i === void 0 ? void 0 : i.title;
@@ -266,68 +285,68 @@ const getFiltersToLoad = (state, facet, context = Context.facets, returnType) =>
266
285
  return loadedFilters.map(([filterKey, isLoaded]) => !isLoaded ? filterKey : null).filter(f => !!f);
267
286
  }; // We lowercase the filter key unless it's an ISO date string where the T must be uppercase
268
287
 
269
- const getSelectedFilters = (state, facet = '', context = Context.facets, returnType) => {
288
+ const getSelectedFilters = (state, facet = '', context = Context$1.facets, returnType) => {
270
289
  const filters = getFilters(state, facet, context, 'js');
271
290
  const isoDateRegex = RegExp(/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d/);
272
291
  const selectedFilters = Object.fromEntries(Object.entries(filters).map(([key, filter = {}]) => [key, (filter.items || []).filter(item => !!(item.isSelected || false)).map(item => {
273
292
  const key = (item === null || item === void 0 ? void 0 : item.key) || '';
274
293
  const isIsoDate = isoDateRegex.test(key);
275
- return isIsoDate ? key : key.toLowerCase();
294
+ return isIsoDate ? key : typeof key.toLowerCase !== 'undefined' ? key.toLowerCase() : key;
276
295
  })]));
277
296
  const fromJS = makeFromJS(returnType);
278
297
  return fromJS(selectedFilters);
279
298
  };
280
- const getResults = (state, current = '', context = Context.facets, returnType) => {
281
- return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'results'], [], returnType);
299
+ const getResults$1 = (state, current = '', context = Context$1.facets, returnType) => {
300
+ return getImmutableOrJS(state, ['search', context, current || getCurrent$1(state, context), 'results'], [], returnType);
282
301
  };
283
- const getIsInternalPaging = (state, current, context = Context.facets) => {
284
- return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'queryParams', 'internalPaging'], false);
302
+ const getIsInternalPaging = (state, current, context = Context$1.facets) => {
303
+ return getImmutableOrJS(state, ['search', context, current || getCurrent$1(state, context), 'queryParams', 'internalPaging'], false);
285
304
  };
286
- const getIsLoaded = (state, context = Context.facets, facet) => {
287
- return !!getImmutableOrJS(state, ['search', context, facet || getCurrent(state, context), 'queryDuration'], 0);
305
+ const getIsLoaded = (state, context = Context$1.facets, facet) => {
306
+ return !!getImmutableOrJS(state, ['search', context, facet || getCurrent$1(state, context), 'queryDuration'], 0);
288
307
  };
289
- const getIsLoading = (state, context = Context.facets, facet) => {
290
- return getImmutableOrJS(state, ['search', context, facet || getCurrent(state, context), 'entries', 'isLoading']);
308
+ const getIsLoading$1 = (state, context = Context$1.facets, facet) => {
309
+ return getImmutableOrJS(state, ['search', context, facet || getCurrent$1(state, context), 'entries', 'isLoading']);
291
310
  };
292
311
  const getIsSsr = state => getImmutableOrJS(state, ['search', 'config', 'ssr'], false);
293
- const getFeaturedResults = (state, current = '', context = Context.facets) => {
294
- return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'featuredResults'], []);
312
+ const getFeaturedResults$1 = (state, current = '', context = Context$1.facets) => {
313
+ return getImmutableOrJS(state, ['search', context, current || getCurrent$1(state, context), 'featuredResults'], []);
295
314
  };
296
- const getPaging = (state, current = '', context = Context.facets, returnType) => {
297
- return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'pagingInfo'], {}, returnType);
315
+ const getPaging$1 = (state, current = '', context = Context$1.facets, returnType) => {
316
+ return getImmutableOrJS(state, ['search', context, current || getCurrent$1(state, context), 'pagingInfo'], {}, returnType);
298
317
  };
299
- const getPageIndex = (state, current = '', context = Context.facets) => {
300
- return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'pagingInfo', 'pageIndex']);
318
+ const getPageIndex$1 = (state, current = '', context = Context$1.facets) => {
319
+ return getImmutableOrJS(state, ['search', context, current || getCurrent$1(state, context), 'pagingInfo', 'pageIndex']);
301
320
  };
302
- const getPrevPageIndex = (state, current = '', context = Context.facets) => {
303
- return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'pagingInfo', 'prevPageIndex']);
321
+ const getPrevPageIndex = (state, current = '', context = Context$1.facets) => {
322
+ return getImmutableOrJS(state, ['search', context, current || getCurrent$1(state, context), 'pagingInfo', 'prevPageIndex']);
304
323
  };
305
- const getPageIsLoading = (state, current = '', context = Context.facets) => {
306
- return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'pagingInfo', 'isLoading']);
324
+ const getPageIsLoading$1 = (state, current = '', context = Context$1.facets) => {
325
+ return getImmutableOrJS(state, ['search', context, current || getCurrent$1(state, context), 'pagingInfo', 'isLoading']);
307
326
  };
308
- const getPagesLoaded = (state, current = '', context = Context.facets) => {
309
- return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'pagingInfo', 'pagesLoaded'], [], 'js');
327
+ const getPagesLoaded = (state, current = '', context = Context$1.facets) => {
328
+ return getImmutableOrJS(state, ['search', context, current || getCurrent$1(state, context), 'pagingInfo', 'pagesLoaded'], [], 'js');
310
329
  };
311
- const getTotalCount = (state, current = '', context = Context.facets) => {
312
- return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'pagingInfo', 'totalCount']);
330
+ const getTotalCount = (state, current = '', context = Context$1.facets) => {
331
+ return getImmutableOrJS(state, ['search', context, current || getCurrent$1(state, context), 'pagingInfo', 'totalCount']);
313
332
  };
314
- const getSearchTerm = state => getImmutableOrJS(state, ['search', 'term']);
333
+ const getSearchTerm$1 = state => getImmutableOrJS(state, ['search', 'term']);
315
334
  const getSearchTabs = (state, returnType) => getImmutableOrJS(state, ['search', 'tabs'], [], returnType);
316
- const getQueryParams = (state, current = '', context = Context.facets) => {
317
- return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'queryParams'], {}, 'js');
335
+ const getQueryParams = (state, current = '', context = Context$1.facets) => {
336
+ return getImmutableOrJS(state, ['search', context, current || getCurrent$1(state, context), 'queryParams'], {}, 'js');
318
337
  };
319
- const getQueryParameter = ({
338
+ const getQueryParameter$1 = ({
320
339
  state,
321
340
  facet,
322
- context = Context.facets
341
+ context = Context$1.facets
323
342
  }, key, ifnull = null) => {
324
343
  return getImmutableOrJS(getQueryParams(state, facet, context), key, ifnull, 'js');
325
344
  };
326
- const getCustomApi = (state, current, context = Context.facets, returnType) => {
327
- return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'customApi'], null, returnType);
345
+ const getCustomApi = (state, current, context = Context$1.facets, returnType) => {
346
+ return getImmutableOrJS(state, ['search', context, current || getCurrent$1(state, context), 'customApi'], null, returnType);
328
347
  };
329
- const getCustomEnv = (state, current, context = Context.facets) => {
330
- return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'env']);
348
+ const getCustomEnv = (state, current, context = Context$1.facets) => {
349
+ return getImmutableOrJS(state, ['search', context, current || getCurrent$1(state, context), 'env']);
331
350
  };
332
351
  const getTabsAndFacets = (state, returnType) => {
333
352
  const tabs = getSearchTabs(state, 'js');
@@ -342,7 +361,7 @@ const getTabsAndFacets = (state, returnType) => {
342
361
  return 0;
343
362
  }).reduce((a, b) => a + b, 0);
344
363
  return { ...tab,
345
- [Context.facets]: Object.fromEntries(thisTabFacets),
364
+ [Context$1.facets]: Object.fromEntries(thisTabFacets),
346
365
  totalCount: thisTabTotal
347
366
  };
348
367
  });
@@ -373,69 +392,70 @@ const selectFacets = {
373
392
  getFacetTitles,
374
393
  getFacets,
375
394
  getFacetsTotalCount,
376
- getFeaturedResults,
395
+ getFeaturedResults: getFeaturedResults$1,
377
396
  getFilters,
378
397
  getFiltersToLoad,
379
398
  getIsLoaded,
380
- getIsLoading,
381
- getPageIndex,
382
- getPageIsLoading,
399
+ getIsLoading: getIsLoading$1,
400
+ getPageIndex: getPageIndex$1,
401
+ getPageIsLoading: getPageIsLoading$1,
383
402
  getPagesLoaded,
384
- getPaging,
385
- getQueryParams: (state, facet) => getQueryParams(state, facet, Context.facets),
403
+ getPaging: getPaging$1,
404
+ getQueryParams: (state, facet) => getQueryParams(state, facet, Context$1.facets),
386
405
  getQueryParameter: ({
387
406
  state,
388
407
  facet
389
- }, key, ifnull) => getQueryParameter({
408
+ }, key, ifnull) => getQueryParameter$1({
390
409
  state,
391
410
  facet,
392
- context: Context.facets
411
+ context: Context$1.facets
393
412
  }, key, ifnull),
394
- getRenderableFilters,
395
- getResults,
413
+ getRenderableFilters: getRenderableFilters$1,
414
+ getResults: getResults$1,
396
415
  getTabFacets,
397
416
  getTabsAndFacets,
398
417
  getTotalCount,
399
418
  getSearchTabs,
400
- getSearchTerm,
419
+ getSearchTerm: getSearchTerm$1,
401
420
  getSearchTotalCount,
402
421
  getSelectedFilters
403
422
  }; // An exported copy of the relevant selectors pre-scoped to a listing context
404
423
 
405
424
  const selectListing = {
406
425
  getCurrent: getCurrentListing,
407
- getFeaturedResults: (state, listing = '') => getFeaturedResults(state, listing, Context.listings),
408
- getFilters: (state, listing = '') => getFilters(state, listing, Context.listings),
409
- getFiltersToLoad: (state, listing = '') => getFiltersToLoad(state, listing, Context.listings),
410
- getListing,
411
- getIsLoaded: state => getIsLoaded(state, Context.listings),
412
- getIsLoading: state => getIsLoading(state, Context.listings),
413
- getPageIndex: (state, listing = '') => getPageIndex(state, listing, Context.listings),
414
- getPaging: (state, listing = '') => getPaging(state, listing, Context.listings),
415
- getPageIsLoading: (state, listing = '') => getPageIsLoading(state, listing, Context.listings),
416
- getPagesLoaded: (state, listing = '') => getPagesLoaded(state, listing, Context.listings),
417
- getQueryParams: (state, listing = '') => getQueryParams(state, listing, Context.listings),
426
+ getFeaturedResults: (state, listing = '') => getFeaturedResults$1(state, listing, Context$1.listings),
427
+ getFilters: (state, listing = '') => getFilters(state, listing, Context$1.listings),
428
+ getFiltersToLoad: (state, listing = '') => getFiltersToLoad(state, listing, Context$1.listings),
429
+ getListing: getListing$1,
430
+ getIsLoaded: state => getIsLoaded(state, Context$1.listings),
431
+ getIsLoading: state => getIsLoading$1(state, Context$1.listings),
432
+ getPageIndex: (state, listing = '') => getPageIndex$1(state, listing, Context$1.listings),
433
+ getPaging: (state, listing = '') => getPaging$1(state, listing, Context$1.listings),
434
+ getPageIsLoading: (state, listing = '') => getPageIsLoading$1(state, listing, Context$1.listings),
435
+ getPagesLoaded: (state, listing = '') => getPagesLoaded(state, listing, Context$1.listings),
436
+ getQueryParams: (state, listing = '') => getQueryParams(state, listing, Context$1.listings),
418
437
  getQueryParameter: ({
419
438
  state,
420
439
  facet
421
- }, key, ifnull) => getQueryParameter({
440
+ }, key, ifnull) => getQueryParameter$1({
422
441
  state,
423
442
  facet,
424
- context: Context.listings
443
+ context: Context$1.listings
425
444
  }, key, ifnull),
426
- getRenderableFilters: (state, listing = '') => getRenderableFilters(state, listing, Context.listings),
427
- getResults: (state, listing = '') => getResults(state, listing, Context.listings),
428
- getSearchTerm,
429
- getTotalCount: (state, listing = '') => getTotalCount(state, listing, Context.listings),
430
- getSelectedFilters: (state, listing = '') => getSelectedFilters(state, listing, Context.listings)
445
+ getRenderableFilters: (state, listing = '') => getRenderableFilters$1(state, listing, Context$1.listings),
446
+ getResults: (state, listing = '') => getResults$1(state, listing, Context$1.listings),
447
+ getSearchTerm: getSearchTerm$1,
448
+ getTotalCount: (state, listing = '') => getTotalCount(state, listing, Context$1.listings),
449
+ getSelectedFilters: (state, listing = '') => getSelectedFilters(state, listing, Context$1.listings)
431
450
  };
432
451
  const selectCurrentPath = state => getImmutableOrJS(state, ['routing', 'currentPath']);
452
+ const selectCurrentProject = state => getImmutableOrJS(state, ['routing', 'currentProject']);
433
453
  const selectVersionStatus = state => getImmutableOrJS(state, ['version', 'contensisVersionStatus']);
434
454
 
435
455
  var selectors = /*#__PURE__*/Object.freeze({
436
456
  __proto__: null,
437
457
  getSearchContext: getSearchContext,
438
- getCurrent: getCurrent,
458
+ getCurrent: getCurrent$1,
439
459
  getCurrentFacet: getCurrentFacet,
440
460
  getCurrentListing: getCurrentListing,
441
461
  getCurrentTab: getCurrentTab,
@@ -443,27 +463,27 @@ var selectors = /*#__PURE__*/Object.freeze({
443
463
  getTabFacets: getTabFacets,
444
464
  getFacetTitles: getFacetTitles,
445
465
  getFacet: getFacet,
446
- getListing: getListing,
466
+ getListing: getListing$1,
447
467
  getFilters: getFilters,
448
- getRenderableFilters: getRenderableFilters,
468
+ getRenderableFilters: getRenderableFilters$1,
449
469
  getFiltersToLoad: getFiltersToLoad,
450
470
  getSelectedFilters: getSelectedFilters,
451
- getResults: getResults,
471
+ getResults: getResults$1,
452
472
  getIsInternalPaging: getIsInternalPaging,
453
473
  getIsLoaded: getIsLoaded,
454
- getIsLoading: getIsLoading,
474
+ getIsLoading: getIsLoading$1,
455
475
  getIsSsr: getIsSsr,
456
- getFeaturedResults: getFeaturedResults,
457
- getPaging: getPaging,
458
- getPageIndex: getPageIndex,
476
+ getFeaturedResults: getFeaturedResults$1,
477
+ getPaging: getPaging$1,
478
+ getPageIndex: getPageIndex$1,
459
479
  getPrevPageIndex: getPrevPageIndex,
460
- getPageIsLoading: getPageIsLoading,
480
+ getPageIsLoading: getPageIsLoading$1,
461
481
  getPagesLoaded: getPagesLoaded,
462
482
  getTotalCount: getTotalCount,
463
- getSearchTerm: getSearchTerm,
483
+ getSearchTerm: getSearchTerm$1,
464
484
  getSearchTabs: getSearchTabs,
465
485
  getQueryParams: getQueryParams,
466
- getQueryParameter: getQueryParameter,
486
+ getQueryParameter: getQueryParameter$1,
467
487
  getCustomApi: getCustomApi,
468
488
  getCustomEnv: getCustomEnv,
469
489
  getTabsAndFacets: getTabsAndFacets,
@@ -472,15 +492,15 @@ var selectors = /*#__PURE__*/Object.freeze({
472
492
  selectFacets: selectFacets,
473
493
  selectListing: selectListing,
474
494
  selectCurrentPath: selectCurrentPath,
495
+ selectCurrentProject: selectCurrentProject,
475
496
  selectVersionStatus: selectVersionStatus
476
497
  });
477
498
 
478
499
  // eslint-disable-next-line import/default
479
500
 
480
- /* eslint-disable @typescript-eslint/naming-convention */
481
501
  const withSearch = mappers => SearchComponent => {
482
502
  const Wrapper = props => {
483
- return /*#__PURE__*/React__default['default'].createElement(SearchComponent, props);
503
+ return /*#__PURE__*/React__default["default"].createElement(SearchComponent, props);
484
504
  };
485
505
 
486
506
  Wrapper.displayName = `withSearch(${SearchComponent.displayName || SearchComponent.name})`;
@@ -488,22 +508,22 @@ const withSearch = mappers => SearchComponent => {
488
508
  const mapStateToProps = state => {
489
509
  return {
490
510
  currentFacet: getCurrentFacet(state),
491
- currentPageIndex: getPageIndex(state),
511
+ currentPageIndex: getPageIndex$1(state),
492
512
  currentTabIndex: getCurrentTab(state),
493
513
  facet: getFacet(state),
494
514
  facets: getTabFacets(state),
495
515
  facetsTotalCount: getFacetsTotalCount(state),
496
516
  facetTitles: getFacetTitles(state),
497
- featuredResults: getFeaturedResults(state),
498
- filters: getRenderableFilters(state),
499
- isLoading: getIsLoading(state),
500
- paging: getPaging(state),
501
- pageIsLoading: getPageIsLoading(state),
502
- results: getResults(state),
517
+ featuredResults: getFeaturedResults$1(state),
518
+ filters: getRenderableFilters$1(state),
519
+ isLoading: getIsLoading$1(state),
520
+ paging: getPaging$1(state),
521
+ pageIsLoading: getPageIsLoading$1(state),
522
+ results: getResults$1(state),
503
523
  resultsInfo: (mappers === null || mappers === void 0 ? void 0 : mappers.resultsInfo) && mappers.resultsInfo(state),
504
- searchTerm: getSearchTerm(state),
524
+ searchTerm: getSearchTerm$1(state),
505
525
  searchTotalCount: getSearchTotalCount(state),
506
- sortOrder: getQueryParameter({
526
+ sortOrder: getQueryParameter$1({
507
527
  state
508
528
  }, 'dynamicOrderBy', []),
509
529
  tabsAndFacets: getTabsAndFacets(state),
@@ -512,23 +532,23 @@ const withSearch = mappers => SearchComponent => {
512
532
  };
513
533
 
514
534
  const mapDispatchToProps = {
515
- clearFilters: () => withMappers(clearFilters(), mappers),
516
- updateCurrentFacet: facet => withMappers(updateCurrentFacet(facet), mappers),
517
- updateCurrentTab: id => withMappers(updateCurrentTab(id), mappers),
518
- updatePageIndex: pageIndex => withMappers(updatePageIndex(pageIndex), mappers),
519
- updateSearchTerm: term => withMappers(updateSearchTerm(term), mappers),
520
- updateSelectedFilters: (filter, key) => withMappers(updateSelectedFilters(filter, key), mappers),
521
- updateSortOrder: orderBy => withMappers(updateSortOrder(orderBy), mappers)
535
+ clearFilters: () => withMappers(clearFilters$1(), mappers),
536
+ updateCurrentFacet: facet => withMappers(updateCurrentFacet$1(facet), mappers),
537
+ updateCurrentTab: id => withMappers(updateCurrentTab$1(id), mappers),
538
+ updatePageIndex: pageIndex => withMappers(updatePageIndex$1(pageIndex), mappers),
539
+ updateSearchTerm: term => withMappers(updateSearchTerm$1(term), mappers),
540
+ updateSelectedFilters: (filter, key, isUnknownItem = false) => withMappers(updateSelectedFilters(filter, key, isUnknownItem), mappers),
541
+ updateSortOrder: orderBy => withMappers(updateSortOrder$1(orderBy), mappers)
522
542
  };
523
543
  const connector = reactRedux.connect(mapStateToProps, mapDispatchToProps);
524
- return connector(toJS(Wrapper));
544
+ return connector(toJS$1(Wrapper));
525
545
  };
526
546
 
527
547
  /* eslint-disable @typescript-eslint/naming-convention */
528
548
 
529
549
  const withListing = mappers => ListingComponent => {
530
550
  const Wrapper = props => {
531
- return /*#__PURE__*/React__default['default'].createElement(ListingComponent, props);
551
+ return /*#__PURE__*/React__default["default"].createElement(ListingComponent, props);
532
552
  };
533
553
 
534
554
  Wrapper.displayName = `withListing(${ListingComponent.displayName || ListingComponent.name})`;
@@ -564,14 +584,14 @@ const withListing = mappers => ListingComponent => {
564
584
  };
565
585
 
566
586
  const mapDispatchToProps = {
567
- clearFilters: () => withMappers(clearFilters(), mappers),
568
- updateCurrentFacet: facet => withMappers(updateCurrentFacet(facet), mappers),
569
- updatePageIndex: pageIndex => withMappers(updatePageIndex(pageIndex), mappers),
570
- updateSearchTerm: term => withMappers(updateSearchTerm(term), mappers),
571
- updateSelectedFilters: (filter, key) => withMappers(updateSelectedFilters(filter, key), mappers),
572
- updateSortOrder: orderBy => withMappers(updateSortOrder(orderBy), mappers)
587
+ clearFilters: () => withMappers(clearFilters$1(), mappers),
588
+ updateCurrentFacet: facet => withMappers(updateCurrentFacet$1(facet), mappers),
589
+ updatePageIndex: pageIndex => withMappers(updatePageIndex$1(pageIndex), mappers),
590
+ updateSearchTerm: term => withMappers(updateSearchTerm$1(term), mappers),
591
+ updateSelectedFilters: (filter, key, isUnknownItem = false) => withMappers(updateSelectedFilters(filter, key, isUnknownItem), mappers),
592
+ updateSortOrder: orderBy => withMappers(updateSortOrder$1(orderBy), mappers)
573
593
  };
574
- return reactRedux.connect(mapStateToProps, mapDispatchToProps)(toJS(Wrapper));
594
+ return reactRedux.connect(mapStateToProps, mapDispatchToProps)(toJS$1(Wrapper));
575
595
  };
576
596
 
577
597
  const getClientConfig = (project, env) => {
@@ -780,7 +800,7 @@ const extractQuotedPhrases = searchTerm => {
780
800
  return (searchTerm.match(pattern) || []).map(match => match.replace(/"/g, ''));
781
801
  };
782
802
  const buildUrl = (route, params) => {
783
- const qs = queryString__default['default'].stringify(params);
803
+ const qs = queryString.stringify(params);
784
804
  const path = qs ? `${route}?${qs}` : route;
785
805
  return path;
786
806
  };
@@ -861,7 +881,7 @@ const fieldExpression = (field, value, operator = 'equalTo', weight) => {
861
881
  // to generate expressions that are combined with an 'or' operator
862
882
  return [contensisCoreApi.Op.or(...field.map(fieldId => fieldExpression(fieldId, value, operator, weight)).flat())];
863
883
  if (operator === 'between') return between(field, value);
864
- if (Array.isArray(value)) return equalToOrIn(field, value, operator);else return !weight ? [contensisCoreApi.Op[operator](field, value, undefined, undefined)] : [contensisCoreApi.Op[operator](field, value, undefined, undefined).weight(weight)];
884
+ if (Array.isArray(value)) return equalToOrIn(field, value, operator);else return !weight ? equalToOrIn(field, value, operator) : [equalToOrIn(field, value, operator)[0].weight(weight)];
865
885
  };
866
886
  const contentTypeIdExpression = (contentTypeIds, webpageTemplates, assetTypes) => {
867
887
  const expressions = [];
@@ -885,8 +905,17 @@ const contentTypeIdExpression = (contentTypeIds, webpageTemplates, assetTypes) =
885
905
  const filterExpressions = filters => {
886
906
  if (!filters) return [];
887
907
  const expressions = [];
888
- filters.map(param => {
889
- expressions.push(...fieldExpression(param.key, param.value, param.operator || 'in'));
908
+ filters.map(selectedFilter => {
909
+ if (selectedFilter.logicOperator === 'and') // using 'and' logic operator we loop through each filter
910
+ // and loop through all values to add an expression for each filter value
911
+ selectedFilter.values.forEach(value => expressions.push(...fieldExpression(selectedFilter.key, value, selectedFilter.fieldOperator || 'equalTo')));else if (selectedFilter.logicOperator === 'not') {
912
+ const fieldExpressions = fieldExpression(selectedFilter.key, selectedFilter.values, selectedFilter.fieldOperator || 'in');
913
+ fieldExpressions.forEach(expr => {
914
+ expressions.push(contensisCoreApi.Op.not(expr));
915
+ });
916
+ } // using 'or' logic operator we loop over each filter
917
+ // and simply add the array of values to an expression with an 'in' operator
918
+ else expressions.push(...fieldExpression(selectedFilter.key, selectedFilter.values, selectedFilter.fieldOperator || 'in'));
890
919
  });
891
920
  return expressions;
892
921
  };
@@ -903,8 +932,8 @@ const dataFormatExpression = (contentTypeIds, dataFormat = DataFormats.entry) =>
903
932
  const withExpr = fieldExpression(Fields.sys.contentTypeId, withContentTypeIds)[0];
904
933
  const notExpr = contensisCoreApi.Op.not(fieldExpression(Fields.sys.contentTypeId, notContentTypeIds)[0]);
905
934
  andExpr.add(dataFormatExpr);
906
- if (withContentTypeIds.length > 0) andExpr.add(withExpr);
907
- if (notContentTypeIds.length > 0) andExpr.add(notExpr);
935
+ if (withContentTypeIds.length > 0 && withExpr) andExpr.add(withExpr);
936
+ if (notContentTypeIds.length > 0 && notExpr) andExpr.add(notExpr);
908
937
  return [andExpr];
909
938
  }
910
939
 
@@ -960,19 +989,45 @@ const equalToOrIn = (field, value, operator = 'equalTo') => {
960
989
  if (value.length === 0) return [];
961
990
 
962
991
  if (Array.isArray(value)) {
963
- if (value.length === 1) return [contensisCoreApi.Op[operator](field, value[0], undefined, undefined)];
964
- return [contensisCoreApi.Op.in(field, ...value)];
992
+ if (operator === 'equalTo') return [contensisCoreApi.Op.in(field, ...value)];
993
+ return [contensisCoreApi.Op.or(...value.map(innerValue => {
994
+ switch (operator) {
995
+ case 'between':
996
+ case 'distanceWithin':
997
+ // Not implemented
998
+ return contensisCoreApi.Op.equalTo(field, innerValue);
999
+
1000
+ case 'freeText':
1001
+ // TODO: Potentially needs further implementation of new options
1002
+ return contensisCoreApi.Op[operator](field, innerValue, false, undefined);
1003
+
1004
+ default:
1005
+ return contensisCoreApi.Op[operator](field, innerValue);
1006
+ }
1007
+ }))];
965
1008
  }
966
1009
 
967
- return [];
1010
+ switch (operator) {
1011
+ case 'between':
1012
+ case 'distanceWithin':
1013
+ // Not implemented
1014
+ return [contensisCoreApi.Op.equalTo(field, value)];
1015
+
1016
+ case 'freeText':
1017
+ // TODO: Potentially needs further implementation of new options
1018
+ return [contensisCoreApi.Op[operator](field, value, false, undefined)];
1019
+
1020
+ default:
1021
+ return [contensisCoreApi.Op[operator](field, value)];
1022
+ }
968
1023
  };
969
1024
 
970
1025
  const between = (field, value) => {
971
1026
  const handle = betweenValue => {
972
- const valArr = betweenValue.split('-');
1027
+ const valArr = betweenValue.split('--');
973
1028
 
974
1029
  if (valArr.length > 1) {
975
- const [minimum, maximum = null] = betweenValue.split('-');
1030
+ const [minimum, maximum] = valArr;
976
1031
  return contensisCoreApi.Op.between(field, minimum, maximum);
977
1032
  } else {
978
1033
  // eslint-disable-next-line no-console
@@ -982,10 +1037,9 @@ const between = (field, value) => {
982
1037
  };
983
1038
 
984
1039
  if (value.length === 0) return [];
985
- if (Array.isArray(value)) return [contensisCoreApi.Op.or(...value.map(handle).filter(bc => bc !== false))]; // const valArr = value.split('-');
986
-
1040
+ if (Array.isArray(value)) return [contensisCoreApi.Op.or(...value.map(handle).filter(bc => bc !== false))];
987
1041
  const op = handle(value);
988
- return op ? [op] : []; // valArr.length > 1 ? [Op.between(field, ...value.split('-'))] : [];
1042
+ return op ? [op] : [];
989
1043
  };
990
1044
  /**
991
1045
  * Accept HTTP style objects and map them to
@@ -1028,7 +1082,7 @@ const customWhereExpressions = where => {
1028
1082
  // the second property inside the clause
1029
1083
 
1030
1084
  if (notIdx === 1) {
1031
- expression = contensisCoreApi.Op.not(contensisCoreApi.Op[innerOperator](innerField, innerValue));
1085
+ expression = innerOperator === 'between' ? contensisCoreApi.Op.not(contensisCoreApi.Op[innerOperator](innerField, innerValue[0], innerValue[1])) : contensisCoreApi.Op.not(contensisCoreApi.Op[innerOperator](innerField, innerValue));
1032
1086
  }
1033
1087
  });
1034
1088
  }
@@ -1040,8 +1094,9 @@ const customWhereExpressions = where => {
1040
1094
 
1041
1095
  if (idx === 1 && // operator !== 'and' &&
1042
1096
  // operator !== 'or' &&
1043
- operator !== 'between' && operator !== 'distanceWithin') {
1044
- expression = operator === 'freeText' || operator === 'contains' ? contensisCoreApi.Op[operator](field, value) : operator === 'in' ? contensisCoreApi.Op[operator](field, ...value) : contensisCoreApi.Op[operator](field, value);
1097
+ // operator !== 'between' &&
1098
+ operator !== 'distanceWithin') {
1099
+ expression = operator === 'freeText' || operator === 'contains' ? contensisCoreApi.Op[operator](field, value) : operator === 'in' ? contensisCoreApi.Op[operator](field, ...value) : operator === 'exists' ? contensisCoreApi.Op[operator](field, value) : operator === 'between' ? contensisCoreApi.Op[operator](field, value[0], value[1]) : contensisCoreApi.Op[operator](field, value);
1045
1100
  if (typeof weight === 'number') expression = expression.weight(weight);
1046
1101
  }
1047
1102
  });
@@ -1154,7 +1209,7 @@ const searchUriTemplate = {
1154
1209
  facet,
1155
1210
  pageIndex
1156
1211
  }) => {
1157
- const currentFacet = getSearchContext(state) !== Context.listings && (facet || getCurrentFacet(state));
1212
+ const currentFacet = getSearchContext(state) !== Context$1.listings && (facet || getCurrentFacet(state));
1158
1213
  const currentPath = selectCurrentPath(state) || '/search';
1159
1214
  const newPath = currentFacet ? `${currentPath}/${currentFacet}` : currentPath;
1160
1215
  if (pageIndex) return `${newPath}/${pageIndex + 1}`;
@@ -1171,23 +1226,19 @@ const searchUriTemplate = {
1171
1226
 
1172
1227
  const stateFilters = term ? {} : Object.fromEntries(Object.entries(getSelectedFilters(state, facet, searchContext, 'js')).map(([key, f]) => [key, f === null || f === void 0 ? void 0 : f.join(',')]));
1173
1228
  const currentSearch = !term && getImmutableOrJS(state, ['routing', 'location', 'search']);
1174
- const currentQs = removeEmptyAttributes(queryString__default['default'].parse(currentSearch));
1229
+ const currentQs = removeEmptyAttributes(queryString.parse(currentSearch));
1175
1230
  if (orderBy) currentQs.orderBy = orderBy;
1176
- const searchTerm = getSearchTerm(state); // Use Immutable's merge to merge the stateFilters with any current Qs
1177
- // to build the new Qs.
1231
+ const searchTerm = getSearchTerm$1(state); // Merge the stateFilters with any current qs to build the new qs
1178
1232
 
1179
- const mergedSearch = removeEmptyAttributes({ ...merge__default['default'](currentQs, stateFilters),
1233
+ const mergedSearch = removeEmptyAttributes({ ...merge__default["default"](currentQs, stateFilters),
1180
1234
  term: searchTerm
1181
1235
  });
1182
- return queryString__default['default'].stringify(mergedSearch);
1236
+ return queryString.stringify(mergedSearch);
1183
1237
  },
1184
- hash: {
1185
- $path: 'state',
1186
- $formatting: state => getImmutableOrJS(state, ['routing', 'location', 'hash'], '').replace('#', '')
1187
- }
1238
+ hash: state => getImmutableOrJS(state, ['routing', 'location', 'hash'], '').replace('#', '')
1188
1239
  };
1189
1240
 
1190
- const mapStateToSearchUri = params => mapJson__default['default'](params, searchUriTemplate);
1241
+ const mapStateToSearchUri = params => mapJson__default["default"](params, searchUriTemplate);
1191
1242
 
1192
1243
  const mapEntriesToSearchResults = ({
1193
1244
  mappers,
@@ -1329,35 +1380,33 @@ const filterTemplate = {
1329
1380
  const filterExpressionMapper = {
1330
1381
  // Expression type: so we can identify how to build the query
1331
1382
  expressionType: ({
1332
- filter
1333
- }) => filter.contentTypeId ? FilterExpressionTypes.contentType : FilterExpressionTypes.field,
1383
+ contentTypeId
1384
+ }) => contentTypeId ? FilterExpressionTypes.contentType : FilterExpressionTypes.field,
1334
1385
  // Key: so we can target the query to a specific field
1335
- key: 'filter.fieldId',
1386
+ key: 'fieldId',
1336
1387
  // Value: so we can filter a specific field by an array of values
1337
1388
  // e.g. taxonomy key or contentTypeId array
1338
- value: 'selectedValue',
1339
- operator: 'filter.fieldOperator'
1389
+ values: 'selectedValues',
1390
+ fieldOperator: 'fieldOperator',
1391
+ logicOperator: 'logicOperator'
1340
1392
  };
1341
1393
 
1342
- const mapFilterToFilterExpression = filter => mapJson__default['default'](filter, filterExpressionMapper);
1394
+ const mapFilterToFilterExpression = filter => mapJson__default["default"](filter, filterExpressionMapper);
1343
1395
 
1344
1396
  const mapFiltersToFilterExpression = (filters, selectedFilters) => {
1345
1397
  if (!selectedFilters || Object.keys(selectedFilters).length === 0) return [];
1346
1398
  const filterExpressions = []; // Iterate through the keys in selectedFilters and locate
1347
1399
  // the items that are selected and queryable
1348
1400
 
1349
- Object.entries(selectedFilters).map(([fkey, selectedValue]) => {
1401
+ Object.entries(selectedFilters).map(([fkey, selectedValues]) => {
1350
1402
  const filter = filters[fkey];
1351
1403
 
1352
- if (selectedValue && filter) {
1353
- const selectedItems = filter.items && filter.items.filter(itm => itm.isSelected) || []; // Where we have a value for a selectedFilter
1404
+ if (selectedValues && filter) {
1405
+ // Where we have a value for a selectedFilter
1354
1406
  // and a filter is found for the current key
1355
1407
  // map the filter to a filterExpression object
1356
-
1357
- const expr = mapFilterToFilterExpression({
1358
- filter,
1359
- selectedItems,
1360
- selectedValue
1408
+ const expr = mapFilterToFilterExpression({ ...filter,
1409
+ selectedValues
1361
1410
  });
1362
1411
  filterExpressions.push(expr);
1363
1412
  }
@@ -1366,10 +1415,10 @@ const mapFiltersToFilterExpression = (filters, selectedFilters) => {
1366
1415
  };
1367
1416
 
1368
1417
  const queryParamsTemplate = {
1369
- assetTypes: root => getQueryParameter(root, 'assetTypes', []),
1370
- contentTypeIds: root => getQueryParameter(root, 'contentTypeIds', []),
1371
- customWhere: root => getQueryParameter(root, 'customWhere', []),
1372
- dynamicOrderBy: root => getQueryParameter(root, 'dynamicOrderBy', []),
1418
+ assetTypes: root => getQueryParameter$1(root, 'assetTypes', []),
1419
+ contentTypeIds: root => getQueryParameter$1(root, 'contentTypeIds', []),
1420
+ customWhere: root => getQueryParameter$1(root, 'customWhere', []),
1421
+ dynamicOrderBy: root => getQueryParameter$1(root, 'dynamicOrderBy', []),
1373
1422
  env: ({
1374
1423
  state,
1375
1424
  facet,
@@ -1384,8 +1433,8 @@ const queryParamsTemplate = {
1384
1433
  if (excludeIds) return Array.isArray(excludeIds) ? excludeIds : excludeIds.split(',').map(id => id.trim());
1385
1434
  return null;
1386
1435
  },
1387
- featuredResults: root => getQueryParameter(root, 'featuredResults', null),
1388
- fields: root => getQueryParameter(root, 'fields', []),
1436
+ featuredResults: root => getQueryParameter$1(root, 'featuredResults', null),
1437
+ fields: root => getQueryParameter$1(root, 'fields', []),
1389
1438
  filters: ({
1390
1439
  state,
1391
1440
  facet,
@@ -1397,28 +1446,28 @@ const queryParamsTemplate = {
1397
1446
  const filterParams = mapFiltersToFilterExpression(stateFilters, selectedFilters);
1398
1447
  return filterParams;
1399
1448
  },
1400
- includeInSearchFields: root => getQueryParameter(root, 'includeInSearch', []),
1449
+ includeInSearchFields: root => getQueryParameter$1(root, 'includeInSearch', []),
1401
1450
  internalPageIndex: ({
1402
1451
  action,
1403
1452
  state
1404
- }) => getPageIndex(state, '', action.context),
1405
- internalPaging: root => getQueryParameter(root, 'internalPaging', false),
1453
+ }) => getPageIndex$1(state, '', action.context),
1454
+ internalPaging: root => getQueryParameter$1(root, 'internalPaging', false),
1406
1455
  languages: ({
1407
1456
  action
1408
1457
  }) => action.defaultLang ? [action.defaultLang] : [],
1409
- linkDepth: root => getQueryParameter(root, 'linkDepth', 0),
1410
- loadMorePaging: root => getQueryParameter(root, 'loadMorePaging', false),
1411
- orderBy: root => getQueryParameter(root, 'orderBy', []),
1458
+ linkDepth: root => getQueryParameter$1(root, 'linkDepth', 0),
1459
+ loadMorePaging: root => getQueryParameter$1(root, 'loadMorePaging', false),
1460
+ orderBy: root => getQueryParameter$1(root, 'orderBy', []),
1412
1461
  pageIndex: root => {
1413
1462
  const {
1414
1463
  action,
1415
1464
  state
1416
1465
  } = root;
1417
- if (getQueryParameter(root, 'internalPaging', false)) return 0;
1466
+ if (getQueryParameter$1(root, 'internalPaging', false)) return 0;
1418
1467
  if (action.type === UPDATE_PAGE_INDEX) return action.params.pageIndex;
1419
- return !action.preload ? getPageIndex(state, '', action.context) : 0;
1468
+ return !action.preload ? getPageIndex$1(state, action.facet, action.context) : 0;
1420
1469
  },
1421
- pageSize: root => getQueryParameter(root, 'pageSize'),
1470
+ pageSize: root => getQueryParameter$1(root, 'pageSize'),
1422
1471
  pagesLoaded: ({
1423
1472
  state,
1424
1473
  facet,
@@ -1436,9 +1485,9 @@ const queryParamsTemplate = {
1436
1485
  }) => {
1437
1486
  var _getFacet;
1438
1487
 
1439
- return (_getFacet = getFacet(state, facet, context)) === null || _getFacet === void 0 ? void 0 : _getFacet.projectId;
1488
+ return ((_getFacet = getFacet(state, facet, context)) === null || _getFacet === void 0 ? void 0 : _getFacet.projectId) || selectCurrentProject(state);
1440
1489
  },
1441
- searchTerm: root => root.context !== Context.minilist || getQueryParameter(root, 'useSearchTerm', false) ? getSearchTerm(root.state) : '',
1490
+ searchTerm: root => root.context !== Context$1.minilist || getQueryParameter$1(root, 'useSearchTerm', false) ? getSearchTerm$1(root.state) : '',
1442
1491
  selectedFilters: ({
1443
1492
  state,
1444
1493
  facet,
@@ -1448,14 +1497,14 @@ const queryParamsTemplate = {
1448
1497
  state
1449
1498
  }) => selectVersionStatus(state),
1450
1499
  weightedSearchFields: root => {
1451
- const wsf = getQueryParameter(root, 'weightedSearchFields', []);
1500
+ const wsf = getQueryParameter$1(root, 'weightedSearchFields', []);
1452
1501
  const deduped = wsf.filter((v, i, a) => a.findIndex(t => t.fieldId === v.fieldId) === i);
1453
1502
  return deduped; // return wsf;
1454
1503
  },
1455
- webpageTemplates: root => getQueryParameter(root, 'webpageTemplates', [])
1504
+ webpageTemplates: root => getQueryParameter$1(root, 'webpageTemplates', [])
1456
1505
  };
1457
1506
 
1458
- const mapStateToQueryParams = sourceJson => mapJson__default['default'](sourceJson, queryParamsTemplate);
1507
+ const mapStateToQueryParams = sourceJson => mapJson__default["default"](sourceJson, queryParamsTemplate);
1459
1508
 
1460
1509
  /**
1461
1510
  * 1, Generates all the parameters required to run the search query.
@@ -1498,10 +1547,10 @@ const runSearch = (action, state, queryParams) => {
1498
1547
  const facetIsLoaded = defaultLang ? false : getIsLoaded(state, context, facet);
1499
1548
  const stateParams = { ...getQueryParams(ogState, facet, context)
1500
1549
  };
1501
- stateParams.pageIndex = getPageIndex(ogState, facet, context);
1502
- stateParams.searchTerm = getSearchTerm(ogState);
1550
+ stateParams.pageIndex = getPageIndex$1(ogState, facet, context);
1551
+ stateParams.searchTerm = getSearchTerm$1(ogState);
1503
1552
 
1504
- if (context === Context.facets && ssr || // context === Context.minilist ||
1553
+ if (context === Context$1.facets && ssr || // context === Context.minilist ||
1505
1554
  preload || !facetIsLoaded || filterParamsChanged(action) || defaultLang) {
1506
1555
  willRun = true;
1507
1556
  } else {
@@ -1550,9 +1599,10 @@ const filterParamsChanged = (action, state) => {
1550
1599
  const debugExecuteSearch = (action, state) => {
1551
1600
  const [queryParams, runSearch] = generateQueryParams(action, state);
1552
1601
  console.log('runSearch', runSearch, 'action', action, 'filterParamsChanged', filterParamsChanged(action, state), 'getIsLoaded(state, context, facet)', getIsLoaded(state, action.context, action.facet));
1553
- const stateParams = getQueryParams(action.ogState || state, action.facet, action.context);
1554
- stateParams.pageIndex = getPageIndex(action.ogState || state, action.facet, action.context);
1555
- stateParams.searchTerm = getSearchTerm(action.ogState || state);
1602
+ const stateParams = { ...getQueryParams(action.ogState || state, action.facet, action.context),
1603
+ pageIndex: getPageIndex$1(action.ogState || state, action.facet, action.context),
1604
+ searchTerm: getSearchTerm$1(action.ogState || state)
1605
+ };
1556
1606
  console.log(stateParams, queryParams);
1557
1607
  console.log('getSelectedFilters', getSelectedFilters(action.ogState || state, action.facet, action.context, 'js'), 'params', action.params);
1558
1608
  };
@@ -1575,16 +1625,16 @@ const mapEntriesToFilterItems = entries => {
1575
1625
  const template = base;
1576
1626
 
1577
1627
  if (template) {
1578
- return mapJson__default['default'](entry, template);
1628
+ return mapJson__default["default"](entry, template);
1579
1629
  }
1580
1630
 
1581
1631
  return entry;
1582
1632
  });
1583
1633
  };
1584
1634
 
1585
- const searchSagas = [effects.takeEvery(CLEAR_FILTERS, clearFilters$1), effects.takeEvery(DO_SEARCH, doSearch), effects.takeEvery(SET_ROUTE_FILTERS, loadFilters), effects.takeEvery(SET_SEARCH_ENTRIES, preloadOtherFacets), effects.takeEvery(UPDATE_CURRENT_FACET, updateCurrentFacet$1), effects.takeEvery(UPDATE_CURRENT_TAB, updateCurrentTab$1), effects.takeEvery(UPDATE_PAGE_INDEX, updatePageIndex$1), effects.takeEvery(UPDATE_SEARCH_TERM, updateSearchTerm$1), effects.takeEvery(UPDATE_SORT_ORDER, updateSortOrder$1), effects.takeEvery(UPDATE_SELECTED_FILTERS, applySearchFilter)];
1635
+ const searchSagas = [effects.takeEvery(CLEAR_FILTERS, clearFilters), effects.takeEvery(DO_SEARCH, doSearch), effects.takeEvery(SET_ROUTE_FILTERS, loadFilters), effects.takeEvery(SET_SEARCH_ENTRIES, preloadOtherFacets), effects.takeEvery(UPDATE_CURRENT_FACET, updateCurrentFacet), effects.takeEvery(UPDATE_CURRENT_TAB, updateCurrentTab), effects.takeEvery(UPDATE_PAGE_INDEX, updatePageIndex), effects.takeEvery(UPDATE_SEARCH_TERM, updateSearchTerm), effects.takeEvery(UPDATE_SORT_ORDER, updateSortOrder), effects.takeEvery(UPDATE_SELECTED_FILTERS, applySearchFilter)];
1586
1636
 
1587
- const toJS$1 = obj => obj && 'toJS' in obj && typeof obj.toJS === 'function' ? obj.toJS() : obj;
1637
+ const toJS = obj => obj && 'toJS' in obj && typeof obj.toJS === 'function' ? obj.toJS() : obj;
1588
1638
 
1589
1639
  function* setRouteFilters(action) {
1590
1640
  const {
@@ -1594,8 +1644,8 @@ function* setRouteFilters(action) {
1594
1644
  defaultLang,
1595
1645
  debug
1596
1646
  } = action;
1597
- const context = listingType ? Context.listings : Context.facets;
1598
- const state = toJS$1(yield effects.select());
1647
+ const context = listingType ? Context$1.listings : Context$1.facets;
1648
+ const state = toJS(yield effects.select());
1599
1649
  const ssr = getIsSsr(state); // Get current facet from params or state
1600
1650
 
1601
1651
  let currentFacet = params && params.facet || listingType; // Pick the default facet from initialState
@@ -1617,15 +1667,21 @@ function* setRouteFilters(action) {
1617
1667
  ssr,
1618
1668
  debug
1619
1669
  };
1620
- yield effects.put(nextAction); // Using call instead of triggering from the put
1670
+ yield effects.put(nextAction); // keep track of this state ref for comparing changes to params later
1671
+
1672
+ const ogState = {
1673
+ search: state.search
1674
+ }; // Using call instead of triggering from the put
1621
1675
  // to allow this exported saga to continue during SSR
1622
1676
 
1623
1677
  yield effects.call(ensureSearch, { ...nextAction,
1624
- ogState: state
1678
+ ogState
1625
1679
  });
1626
1680
  }
1627
1681
  function* doSearch(action) {
1628
- const state = toJS$1(yield effects.select());
1682
+ var _action$params;
1683
+
1684
+ const state = toJS(yield effects.select());
1629
1685
 
1630
1686
  if (action.config) {
1631
1687
  // If the action contains a config object, we can add this to the
@@ -1637,12 +1693,20 @@ function* doSearch(action) {
1637
1693
 
1638
1694
  const nextAction = { ...action,
1639
1695
  type: SET_SEARCH_FILTERS,
1640
- ssr: getIsSsr(state)
1696
+ ssr: getIsSsr(state),
1697
+ facet: action.facet || ((_action$params = action.params) === null || _action$params === void 0 ? void 0 : _action$params.facet)
1641
1698
  };
1642
- yield effects.put(nextAction);
1643
- yield effects.call(ensureSearch, { ...nextAction,
1644
- ogState: state
1645
- });
1699
+
1700
+ if (nextAction.facet) {
1701
+ yield effects.put(nextAction); // keep track of this state ref for comparing changes to params later
1702
+
1703
+ const ogState = {
1704
+ search: state.search
1705
+ };
1706
+ yield effects.call(ensureSearch, { ...nextAction,
1707
+ ogState
1708
+ });
1709
+ }
1646
1710
  }
1647
1711
 
1648
1712
  function* loadFilters(action) {
@@ -1726,7 +1790,7 @@ function* loadFilter(action) {
1726
1790
  createStateFrom.error = error;
1727
1791
  }
1728
1792
 
1729
- const nextAction = mapJson__default['default'](createStateFrom, filterTemplate);
1793
+ const nextAction = mapJson__default["default"](createStateFrom, filterTemplate);
1730
1794
  yield effects.put(nextAction);
1731
1795
  }
1732
1796
 
@@ -1740,7 +1804,9 @@ function* ensureSearch(action) {
1740
1804
  try {
1741
1805
  const state = yield effects.select();
1742
1806
  const nextAction = { ...action,
1743
- ogState: action.ogState || state
1807
+ ogState: action.ogState || {
1808
+ search: state.search
1809
+ }
1744
1810
  };
1745
1811
  const [queryParams, runSearch] = generateQueryParams(nextAction, state);
1746
1812
  if (debug && (debug === true || debug.executeSearch)) debugExecuteSearch(nextAction, state);
@@ -1760,7 +1826,7 @@ function* ensureSearch(action) {
1760
1826
  }
1761
1827
  } catch (error) {
1762
1828
  // eslint-disable-next-line import/namespace
1763
- log.error(...['Error running search saga:', error, error.stack]);
1829
+ log__namespace.error(...['Error running search saga:', error, error.stack]);
1764
1830
  }
1765
1831
  }
1766
1832
 
@@ -1803,15 +1869,15 @@ function* executeSearch(action) {
1803
1869
  action,
1804
1870
  featuredResult,
1805
1871
  pageIndex: queryParams.internalPaging && queryParams.internalPageIndex || queryParams.pageIndex,
1806
- prevResults: getResults(state, facet, action.context, 'js'),
1872
+ prevResults: getResults$1(state, facet, action.context, 'js'),
1807
1873
  result,
1808
1874
  state
1809
1875
  };
1810
- const nextAction = mapJson__default['default'](createStateFrom, facetTemplate);
1876
+ const nextAction = mapJson__default["default"](createStateFrom, facetTemplate);
1811
1877
  yield effects.put(nextAction);
1812
1878
  } catch (error) {
1813
1879
  // eslint-disable-next-line import/namespace
1814
- log.error(...['Error running search saga:', error, error.stack]);
1880
+ log__namespace.error(...['Error running search saga:', error, error.stack]);
1815
1881
  }
1816
1882
  }
1817
1883
 
@@ -1825,7 +1891,7 @@ function* preloadOtherFacets(action) {
1825
1891
  const state = yield effects.select();
1826
1892
  const currentFacet = getCurrentFacet(state);
1827
1893
 
1828
- if (!preload && facet === currentFacet && context !== Context.listings) {
1894
+ if (!preload && facet === currentFacet && context !== Context$1.listings) {
1829
1895
  const allFacets = getFacets(state, 'js');
1830
1896
  const otherFacets = Object.keys(allFacets).filter(f => f !== currentFacet);
1831
1897
  yield effects.all(otherFacets.map((preloadFacet = '') => {
@@ -1845,7 +1911,7 @@ function* preloadOtherFacets(action) {
1845
1911
  }
1846
1912
  }
1847
1913
 
1848
- function* updateCurrentTab$1(action) {
1914
+ function* updateCurrentTab(action) {
1849
1915
  const {
1850
1916
  id,
1851
1917
  mappers
@@ -1864,10 +1930,10 @@ function* updateCurrentTab$1(action) {
1864
1930
 
1865
1931
 
1866
1932
  if (!nextFacet) nextFacet = Object.entries(facets).filter(([, f]) => f.tabId === id)[0][0];
1867
- yield effects.put(withMappers(updateCurrentFacet(nextFacet), mappers));
1933
+ yield effects.put(withMappers(updateCurrentFacet$1(nextFacet), mappers));
1868
1934
  }
1869
1935
 
1870
- function* clearFilters$1(action) {
1936
+ function* clearFilters(action) {
1871
1937
  const {
1872
1938
  mappers
1873
1939
  } = action;
@@ -1875,12 +1941,12 @@ function* clearFilters$1(action) {
1875
1941
  yield effects.put(navigate(uri));
1876
1942
  }
1877
1943
 
1878
- function* updateCurrentFacet$1(action) {
1944
+ function* updateCurrentFacet(action) {
1879
1945
  const {
1880
1946
  facet,
1881
1947
  mappers
1882
1948
  } = action;
1883
- const pageIndex = yield effects.select(getPageIndex, facet);
1949
+ const pageIndex = yield effects.select(getPageIndex$1, facet);
1884
1950
  const uri = yield buildUri({
1885
1951
  facet,
1886
1952
  pageIndex
@@ -1888,7 +1954,7 @@ function* updateCurrentFacet$1(action) {
1888
1954
  yield effects.put(navigate(uri));
1889
1955
  }
1890
1956
 
1891
- function* updateSearchTerm$1(action) {
1957
+ function* updateSearchTerm(action) {
1892
1958
  const {
1893
1959
  term,
1894
1960
  mappers
@@ -1899,7 +1965,7 @@ function* updateSearchTerm$1(action) {
1899
1965
  yield effects.put(navigate(uri));
1900
1966
  }
1901
1967
 
1902
- function* updateSortOrder$1(action) {
1968
+ function* updateSortOrder(action) {
1903
1969
  const {
1904
1970
  orderBy,
1905
1971
  facet,
@@ -1912,7 +1978,7 @@ function* updateSortOrder$1(action) {
1912
1978
  yield effects.put(navigate(uri));
1913
1979
  }
1914
1980
 
1915
- function* updatePageIndex$1(action) {
1981
+ function* updatePageIndex(action) {
1916
1982
  const {
1917
1983
  pageIndex,
1918
1984
  mappers
@@ -1938,7 +2004,7 @@ function* buildUri({
1938
2004
  term
1939
2005
  }, mappers) {
1940
2006
  const state = yield effects.select();
1941
- const mapUri = mappers && mappers.navigate || mapStateToSearchUri;
2007
+ const mapUri = (mappers === null || mappers === void 0 ? void 0 : mappers.navigate) || mapStateToSearchUri;
1942
2008
  const uri = mapUri({
1943
2009
  state,
1944
2010
  facet,
@@ -1950,13 +2016,97 @@ function* buildUri({
1950
2016
  return `${uri.path}${uri.search && `?${uri.search}` || ''}${uri.hash && `#${uri.hash}` || ''}`;
1951
2017
  }
1952
2018
 
2019
+ var defaultMappers = {
2020
+ results: entries => entries,
2021
+ navigate: mapStateToSearchUri
2022
+ };
2023
+
2024
+ const {
2025
+ getCurrent,
2026
+ getFeaturedResults,
2027
+ getIsLoading,
2028
+ getListing,
2029
+ getPageIndex,
2030
+ getPageIsLoading,
2031
+ getPaging,
2032
+ getQueryParameter,
2033
+ getRenderableFilters,
2034
+ getResults,
2035
+ getSearchTerm
2036
+ } = selectListing;
2037
+
2038
+ const makeSelectListingProps = () => reselect.createSelector(state => state, (_, mappers) => mappers, (state, mappers) => ({
2039
+ currentListing: getCurrent(state),
2040
+ currentPageIndex: getPageIndex(state),
2041
+ listing: getListing(state),
2042
+ featured: getFeaturedResults(state),
2043
+ filters: getRenderableFilters(state),
2044
+ isLoading: getIsLoading(state),
2045
+ pageIsLoading: getPageIsLoading(state),
2046
+ paging: getPaging(state),
2047
+ results: getResults(state),
2048
+ resultsInfo: mappers && typeof mappers.resultsInfo === 'function' && mappers.resultsInfo(state),
2049
+ searchTerm: getSearchTerm(state),
2050
+ sortOrder: getQueryParameter({
2051
+ state
2052
+ }, 'dynamicOrderBy', [])
2053
+ }));
2054
+
2055
+ const useListing = ({
2056
+ mappers
2057
+ } = {
2058
+ id: ''
2059
+ }) => {
2060
+ const dispatch = reactRedux.useDispatch();
2061
+ const m = mappers || defaultMappers;
2062
+ const selectListingProps = React.useMemo(makeSelectListingProps, [m]);
2063
+ const dispatchProps = {
2064
+ clearFilters: () => dispatch(withMappers(clearFilters$1(), m)),
2065
+ updateCurrentFacet: facet => dispatch(withMappers(updateCurrentFacet$1(facet), m)),
2066
+ updatePageIndex: pageIndex => dispatch(withMappers(updatePageIndex$1(pageIndex), m)),
2067
+ updateSearchTerm: term => dispatch(withMappers(updateSearchTerm$1(term), m)),
2068
+ updateSelectedFilters: (filter, key, isUnknownItem = false) => dispatch(withMappers(updateSelectedFilters(filter, key, isUnknownItem), m)),
2069
+ updateSortOrder: orderBy => dispatch(withMappers(updateSortOrder$1(orderBy), m))
2070
+ };
2071
+ const {
2072
+ currentListing,
2073
+ currentPageIndex,
2074
+ featured,
2075
+ filters,
2076
+ isLoading,
2077
+ listing,
2078
+ paging,
2079
+ pageIsLoading,
2080
+ results,
2081
+ resultsInfo,
2082
+ searchTerm,
2083
+ sortOrder
2084
+ } = reactRedux.useSelector(state => selectListingProps(state, m));
2085
+ return {
2086
+ currentListing,
2087
+ currentPageIndex,
2088
+ featured,
2089
+ filters,
2090
+ isLoading,
2091
+ listing,
2092
+ pageIsLoading,
2093
+ paging,
2094
+ results,
2095
+ resultsInfo,
2096
+ searchTerm,
2097
+ sortOrder,
2098
+ title: listing.title,
2099
+ ...dispatchProps
2100
+ };
2101
+ };
2102
+
1953
2103
  const makeSelectMinilistProps = () => reselect.createSelector(state => state, (_, id) => id, (state, id) => ({
1954
- facet: getFacet(state, id, Context.minilist, 'js'),
1955
- filters: getFilters(state, id, Context.minilist, 'js'),
1956
- isLoading: getIsLoading(state, Context.minilist, id),
1957
- pagingInfo: getPaging(state, id, Context.minilist, 'js'),
1958
- results: getResults(state, id, Context.minilist, 'js'),
1959
- searchTerm: getSearchTerm(state)
2104
+ facet: getFacet(state, id, Context$1.minilist, 'js'),
2105
+ filters: getFilters(state, id, Context$1.minilist, 'js'),
2106
+ isLoading: getIsLoading$1(state, Context$1.minilist, id),
2107
+ pagingInfo: getPaging$1(state, id, Context$1.minilist, 'js'),
2108
+ results: getResults$1(state, id, Context$1.minilist, 'js'),
2109
+ searchTerm: getSearchTerm$1(state)
1960
2110
  }));
1961
2111
 
1962
2112
  const useMinilist = ({
@@ -1993,7 +2143,7 @@ const useMinilist = ({
1993
2143
  if (id && (mapper || mappers && mappers.results)) {
1994
2144
  dispatch(triggerSearch({
1995
2145
  config,
1996
- context: Context.minilist,
2146
+ context: Context$1.minilist,
1997
2147
  defaultLang,
1998
2148
  facet: id,
1999
2149
  mapper,
@@ -2007,7 +2157,7 @@ const useMinilist = ({
2007
2157
  return {
2008
2158
  filters,
2009
2159
  isLoading,
2010
- pagingInfo,
2160
+ paging: pagingInfo,
2011
2161
  results,
2012
2162
  searchTerm,
2013
2163
  title: facet.title
@@ -2119,7 +2269,7 @@ const generateSearchFacets = (context, config) => {
2119
2269
 
2120
2270
  if (Object.keys(thisConfig).length > 0) {
2121
2271
  Object.entries(thisConfig).map(([facetName, facet]) => {
2122
- const newFacet = merge__default['default'](searchFacet, facet);
2272
+ const newFacet = merge__default["default"](searchFacet, facet);
2123
2273
  if (!('isDisabled' in facet) || facet.isDisabled !== true) facets[facetName] = newFacet;
2124
2274
  });
2125
2275
  }
@@ -2191,7 +2341,10 @@ const generateFiltersState = ({
2191
2341
  // the search results during SSR without needing to fetch the filters first
2192
2342
 
2193
2343
 
2194
- Object.entries(filterParams).map(([paramName = '', paramValue]) => typeof paramValue === 'string' && paramValue.split(',').map(pVal => filters = addFilterItem(filters, paramName, pVal)));
2344
+ Object.entries(filterParams).map(([paramName = '', paramValue]) => {
2345
+ if (typeof paramValue === 'string') return paramValue.split(',').map(pVal => filters = addFilterItem(filters, paramName, pVal));
2346
+ if (typeof paramValue === 'boolean') filters = addFilterItem(filters, paramName, paramValue);
2347
+ });
2195
2348
  return Object.fromEntries(filters);
2196
2349
  };
2197
2350
 
@@ -2208,9 +2361,9 @@ var reducers = (config => {
2208
2361
  // Add facets from SearchConfig to initialState
2209
2362
  const initState = { ...initialState,
2210
2363
  tabs: config.tabs,
2211
- facets: generateSearchFacets(Context.facets, config),
2212
- listings: generateSearchFacets(Context.listings, config),
2213
- minilist: generateSearchFacets(Context.minilist, config)
2364
+ facets: generateSearchFacets(Context$1.facets, config),
2365
+ listings: generateSearchFacets(Context$1.listings, config),
2366
+ minilist: generateSearchFacets(Context$1.minilist, config)
2214
2367
  };
2215
2368
  return immer.produce((state = initState, action) => {
2216
2369
  const context = state.context;
@@ -2220,7 +2373,7 @@ var reducers = (config => {
2220
2373
  case APPLY_CONFIG:
2221
2374
  {
2222
2375
  state = addConfigToState(state, action);
2223
- return;
2376
+ return state;
2224
2377
  }
2225
2378
 
2226
2379
  case CLEAR_FILTERS:
@@ -2294,7 +2447,7 @@ var reducers = (config => {
2294
2447
  return;
2295
2448
  }
2296
2449
 
2297
- state[action.context][facetKey].filters[filterKey] = merge__default['default'](filter, nextFilter, {
2450
+ state[action.context][facetKey].filters[filterKey] = merge__default["default"](filter, nextFilter, {
2298
2451
  arrayMerge: (source, inbound) => inbound
2299
2452
  });
2300
2453
  return;
@@ -2329,7 +2482,7 @@ var reducers = (config => {
2329
2482
  context,
2330
2483
  isCurrentFacet
2331
2484
  }, state);
2332
- resetCurrentFacet = state.config.isLoaded === true && !equals__default['default'](nextFilters, stateFacet.filters);
2485
+ resetCurrentFacet = state.config.isLoaded === true && !equals__default["default"](nextFilters, stateFacet.filters);
2333
2486
  stateFacet = resetCurrentFacet ? resetFacet(stateFacet) : stateFacet;
2334
2487
  stateFacet.filters = nextFilters;
2335
2488
  stateFacet.queryParams.dynamicOrderBy = toArray(orderBy) || [];
@@ -2337,7 +2490,7 @@ var reducers = (config => {
2337
2490
  }));
2338
2491
  state.context = context;
2339
2492
  state[context] = nextFacets;
2340
- state[action.context === Context.facets ? 'currentFacet' : 'currentListing'] = facet;
2493
+ state[action.context === Context$1.facets ? 'currentFacet' : 'currentListing'] = facet;
2341
2494
  state.term = term;
2342
2495
  state.tabs[tabId].currentFacet = facet;
2343
2496
  state[context][facet].pagingInfo.pageIndex = Number(pageIndex) - 1 || (state[context][facet].queryParams.loadMorePaging ? state[context][facet].pagingInfo.pageIndex || 0 : 0);
@@ -2351,7 +2504,7 @@ var reducers = (config => {
2351
2504
  {
2352
2505
  const thisContext = action.context || context;
2353
2506
  const currentFacet = state[thisContext][action.facet];
2354
- state[thisContext][action.facet] = merge__default['default'](currentFacet, action.nextFacet, {
2507
+ state[thisContext][action.facet] = merge__default["default"](currentFacet, action.nextFacet, {
2355
2508
  arrayMerge: (source, inbound) => inbound
2356
2509
  });
2357
2510
  return;
@@ -2370,9 +2523,9 @@ var reducers = (config => {
2370
2523
  isCurrentFacet: true
2371
2524
  }, state);
2372
2525
  const term = action === null || action === void 0 ? void 0 : (_action$params = action.params) === null || _action$params === void 0 ? void 0 : _action$params.term;
2373
- const useSearchTerm = state[action.context || Context.minilist][action.facet].queryParams.useSearchTerm || false;
2374
- state[action.context || Context.minilist][action.facet].filters = filters;
2375
- state[action.context || Context.minilist][action.facet].queryParams.excludeIds = action.excludeIds;
2526
+ const useSearchTerm = state[action.context || Context$1.minilist][action.facet].queryParams.useSearchTerm || false;
2527
+ state[action.context || Context$1.minilist][action.facet].filters = filters;
2528
+ state[action.context || Context$1.minilist][action.facet].queryParams.excludeIds = action.excludeIds;
2376
2529
  state.term = useSearchTerm ? term : state.term;
2377
2530
  state.config.ssr = typeof window === 'undefined';
2378
2531
  return;
@@ -2404,13 +2557,22 @@ var reducers = (config => {
2404
2557
  {
2405
2558
  const {
2406
2559
  filter,
2407
- key
2560
+ key,
2561
+ isUnknownItem
2408
2562
  } = action;
2409
2563
  const isSingleSelect = state[context][current].filters[filter].isSingleSelect || false;
2410
2564
  const isGrouped = state[context][current].filters[filter].isGrouped || false;
2411
2565
  const currentItems = state[context][current].filters[filter].items;
2412
2566
  if (isGrouped) state[context] = resetFacets(state, context);
2413
2567
  state[context][current] = resetFacet(state[context][current]);
2568
+
2569
+ if (isUnknownItem && (currentItems === null || currentItems === void 0 ? void 0 : currentItems.findIndex(item => (item === null || item === void 0 ? void 0 : item.key) === key)) === -1) {
2570
+ currentItems === null || currentItems === void 0 ? void 0 : currentItems.push({
2571
+ key,
2572
+ isSelected: false
2573
+ });
2574
+ }
2575
+
2414
2576
  state[context][current].filters[filter].items = currentItems === null || currentItems === void 0 ? void 0 : currentItems.map(item => {
2415
2577
  if (item.key === key) {
2416
2578
  return { ...item,
@@ -2444,14 +2606,13 @@ var reducers = (config => {
2444
2606
  }, initState);
2445
2607
  });
2446
2608
 
2447
- // eslint-disable-next-line @typescript-eslint/naming-convention
2448
- const Context$1 = {
2609
+ const Context = {
2449
2610
  facets: 'facets',
2450
2611
  listings: 'listings',
2451
2612
  minilist: 'minilist'
2452
2613
  };
2453
2614
 
2454
- exports.Context = Context$1;
2615
+ exports.Context = Context;
2455
2616
  exports.actions = actions;
2456
2617
  exports.doSearch = doSearch;
2457
2618
  exports.queries = queries;
@@ -2461,6 +2622,7 @@ exports.schema = schema;
2461
2622
  exports.selectors = selectors;
2462
2623
  exports.setRouteFilters = setRouteFilters;
2463
2624
  exports.types = types;
2625
+ exports.useListing = useListing;
2464
2626
  exports.useMinilist = useMinilist;
2465
2627
  exports.withListing = withListing;
2466
2628
  exports.withSearch = withSearch;