@zengenti/contensis-react-base 3.0.0-beta.5 → 3.0.0-beta.52

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 (138) hide show
  1. package/README.md +4 -4
  2. package/cjs/{App-3324f784.js → App-478e0b4c.js} +114 -114
  3. package/cjs/App-478e0b4c.js.map +1 -0
  4. package/cjs/{RouteLoader-c7957b14.js → RouteLoader-8df335cf.js} +46 -22
  5. package/cjs/RouteLoader-8df335cf.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-a24bf46e.js → actions-6b9ef168.js} +5 -4
  9. package/cjs/actions-6b9ef168.js.map +1 -0
  10. package/cjs/client.js +11 -9
  11. package/cjs/client.js.map +1 -1
  12. package/cjs/contensis-react-base.js +2888 -84
  13. package/cjs/contensis-react-base.js.map +1 -1
  14. package/cjs/{fromJSLeaveImmer-c00d597f.js → fromJSLeaveImmer-65d26804.js} +2 -16
  15. package/cjs/fromJSLeaveImmer-65d26804.js.map +1 -0
  16. package/cjs/{login-c810cc4c.js → login-d67b82aa.js} +92 -55
  17. package/cjs/login-d67b82aa.js.map +1 -0
  18. package/cjs/{reducers-fde41d6b.js → reducers-3a4f8971.js} +26 -25
  19. package/cjs/reducers-3a4f8971.js.map +1 -0
  20. package/cjs/redux.js +6 -5
  21. package/cjs/redux.js.map +1 -1
  22. package/cjs/routing.js +5 -4
  23. package/cjs/routing.js.map +1 -1
  24. package/cjs/search.js +295 -146
  25. package/cjs/search.js.map +1 -1
  26. package/cjs/{selectors-0ec95076.js → selectors-2c1b1183.js} +7 -3
  27. package/cjs/selectors-2c1b1183.js.map +1 -0
  28. package/cjs/user.js +21 -12
  29. package/cjs/user.js.map +1 -1
  30. package/cjs/util.js +15 -8
  31. package/cjs/util.js.map +1 -1
  32. package/cjs/{version-4f0f5fa6.js → version-951bc80c.js} +28 -20
  33. package/cjs/version-951bc80c.js.map +1 -0
  34. package/cjs/{version-085d203d.js → version-dcfdafd9.js} +5 -5
  35. package/cjs/{version-085d203d.js.map → version-dcfdafd9.js.map} +1 -1
  36. package/esm/{App-1b05ab11.js → App-36e24faa.js} +114 -114
  37. package/esm/App-36e24faa.js.map +1 -0
  38. package/esm/{RouteLoader-e5f0e8cb.js → RouteLoader-93c0d740.js} +46 -22
  39. package/esm/RouteLoader-93c0d740.js.map +1 -0
  40. package/esm/ToJs-2627ce21.js +99 -0
  41. package/esm/ToJs-2627ce21.js.map +1 -0
  42. package/esm/{actions-927d9698.js → actions-5437f43d.js} +5 -4
  43. package/esm/actions-5437f43d.js.map +1 -0
  44. package/esm/client.js +12 -10
  45. package/esm/client.js.map +1 -1
  46. package/esm/contensis-react-base.js +2889 -85
  47. package/esm/contensis-react-base.js.map +1 -1
  48. package/esm/{fromJSLeaveImmer-392af4e3.js → fromJSLeaveImmer-e2f0f331.js} +2 -16
  49. package/esm/fromJSLeaveImmer-e2f0f331.js.map +1 -0
  50. package/esm/{login-f8ba3aeb.js → login-f6dfbe1b.js} +92 -55
  51. package/esm/login-f6dfbe1b.js.map +1 -0
  52. package/esm/{reducers-d6c0edb1.js → reducers-8e5d6232.js} +26 -25
  53. package/esm/reducers-8e5d6232.js.map +1 -0
  54. package/esm/redux.js +8 -7
  55. package/esm/redux.js.map +1 -1
  56. package/esm/routing.js +5 -4
  57. package/esm/routing.js.map +1 -1
  58. package/esm/search.js +296 -147
  59. package/esm/search.js.map +1 -1
  60. package/esm/{selectors-b98d5c76.js → selectors-65f0f31c.js} +7 -4
  61. package/esm/selectors-65f0f31c.js.map +1 -0
  62. package/esm/user.js +23 -14
  63. package/esm/user.js.map +1 -1
  64. package/esm/util.js +15 -8
  65. package/esm/util.js.map +1 -1
  66. package/esm/version-696796d7.js +15 -0
  67. package/esm/{version-3833e8b5.js.map → version-696796d7.js.map} +1 -1
  68. package/esm/{version-16aa83eb.js → version-b2ca1dab.js} +27 -20
  69. package/esm/version-b2ca1dab.js.map +1 -0
  70. package/models/redux/appstate.d.ts +5 -10
  71. package/models/redux/selectors/navigation.d.ts +2 -1
  72. package/models/routing/redux/actions.d.ts +1 -1
  73. package/models/routing/redux/selectors.d.ts +1 -1
  74. package/models/routing/routes.d.ts +3 -2
  75. package/models/routing/util/expressions.d.ts +3 -2
  76. package/models/routing/util/queries.d.ts +1 -1
  77. package/models/search/containers/withListing.d.ts +1 -1
  78. package/models/search/containers/withSearch.d.ts +1 -1
  79. package/models/search/hooks/useListing.hook.d.ts +3 -0
  80. package/models/search/hooks/useMinilist.hook.d.ts +2 -9
  81. package/models/search/index.d.ts +1 -0
  82. package/models/search/models/Queries.d.ts +8 -5
  83. package/models/search/models/Search.d.ts +58 -26
  84. package/models/search/models/SearchActions.d.ts +4 -3
  85. package/models/search/models/SearchProps.d.ts +31 -4
  86. package/models/search/models/SearchState.d.ts +5 -1
  87. package/models/search/models/index.d.ts +2 -1
  88. package/models/search/redux/actions.d.ts +2 -1
  89. package/models/search/redux/reducers.d.ts +230 -314
  90. package/models/search/redux/sagas.d.ts +5 -5
  91. package/models/search/redux/selectors.d.ts +7 -12
  92. package/models/search/search/expressions.d.ts +2 -6
  93. package/models/search/transformations/entry-to-filteritem.mapper.d.ts +2 -1
  94. package/models/search/transformations/filter-to-filterexpression.mapper.d.ts +6 -0
  95. package/models/search/transformations/filters-to-filterexpressions.mapper.d.ts +3 -0
  96. package/models/search/transformations/index.d.ts +3 -0
  97. package/models/search/transformations/state-to-searchuri.d.ts +2 -13
  98. package/models/server/middleware/bundleManipulation.d.ts +2 -1
  99. package/models/server/util/headers.d.ts +3 -2
  100. package/models/user/components/Login.d.ts +1 -2
  101. package/models/user/components/LoginForm.d.ts +1 -2
  102. package/models/user/hocs/withLogin.d.ts +2 -2
  103. package/models/user/hooks/useChangePassword.d.ts +5 -5
  104. package/models/user/hooks/useForgotPassword.d.ts +6 -6
  105. package/models/user/hooks/useLogin.d.ts +9 -45
  106. package/models/user/hooks/useRegistration.d.ts +4 -4
  107. package/models/user/redux/reducers.d.ts +4 -5
  108. package/models/user/redux/sagas/login.d.ts +11 -8
  109. package/models/user/redux/selectors.d.ts +33 -71
  110. package/models/user/util/LoginHelper.class.d.ts +4 -3
  111. package/models/util/json-mapper.d.ts +9 -3
  112. package/models/util/merge.d.ts +1 -0
  113. package/package-lock.json +279 -521
  114. package/package.json +9 -5
  115. package/cjs/App-3324f784.js.map +0 -1
  116. package/cjs/RouteLoader-c7957b14.js.map +0 -1
  117. package/cjs/ToJs-a38fa20e.js +0 -230
  118. package/cjs/ToJs-a38fa20e.js.map +0 -1
  119. package/cjs/actions-a24bf46e.js.map +0 -1
  120. package/cjs/fromJSLeaveImmer-c00d597f.js.map +0 -1
  121. package/cjs/login-c810cc4c.js.map +0 -1
  122. package/cjs/reducers-fde41d6b.js.map +0 -1
  123. package/cjs/selectors-0ec95076.js.map +0 -1
  124. package/cjs/version-4f0f5fa6.js.map +0 -1
  125. package/esm/App-1b05ab11.js.map +0 -1
  126. package/esm/RouteLoader-e5f0e8cb.js.map +0 -1
  127. package/esm/ToJs-879a5a85.js +0 -199
  128. package/esm/ToJs-879a5a85.js.map +0 -1
  129. package/esm/actions-927d9698.js.map +0 -1
  130. package/esm/fromJSLeaveImmer-392af4e3.js.map +0 -1
  131. package/esm/login-f8ba3aeb.js.map +0 -1
  132. package/esm/reducers-d6c0edb1.js.map +0 -1
  133. package/esm/selectors-b98d5c76.js.map +0 -1
  134. package/esm/version-16aa83eb.js.map +0 -1
  135. package/esm/version-3833e8b5.js +0 -15
  136. package/models/search/transformations/filters-to-filterexpression.d.ts +0 -1
  137. package/models/search/transformations/filters-to-filterexpression.mapper.d.ts +0 -2
  138. package/models/server/features/caching/cacheHashing.d.ts +0 -1
package/cjs/search.js CHANGED
@@ -38,7 +38,6 @@ function _interopNamespace(e) {
38
38
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
39
39
  var mapJson__default = /*#__PURE__*/_interopDefaultLegacy(mapJson);
40
40
  var log__namespace = /*#__PURE__*/_interopNamespace(log);
41
- var queryString__default = /*#__PURE__*/_interopDefaultLegacy(queryString);
42
41
  var merge__default = /*#__PURE__*/_interopDefaultLegacy(merge);
43
42
  var equals__default = /*#__PURE__*/_interopDefaultLegacy(equals);
44
43
 
@@ -181,11 +180,12 @@ const updateSearchTerm$1 = term => {
181
180
  term
182
181
  };
183
182
  };
184
- const updateSelectedFilters = (filter, key) => {
183
+ const updateSelectedFilters = (filter, key, isUnknownItem = false) => {
185
184
  return {
186
185
  type: UPDATE_SELECTED_FILTERS,
187
186
  filter,
188
- key
187
+ key,
188
+ isUnknownItem
189
189
  };
190
190
  };
191
191
  const updateSortOrder$1 = (orderBy, facet) => {
@@ -249,7 +249,7 @@ const getImmutableOrJS = (state, stateKey, fallbackValue, returnType = globalThi
249
249
  };
250
250
 
251
251
  const getSearchContext = state => getImmutableOrJS(state, ['search', 'context'], Context$1.facets);
252
- const getCurrent = (state, context = Context$1.facets) => context === Context$1.facets ? getCurrentFacet(state) : getCurrentListing(state);
252
+ const getCurrent$1 = (state, context = Context$1.facets) => context === Context$1.facets ? getCurrentFacet(state) : getCurrentListing(state);
253
253
  const getCurrentFacet = state => getImmutableOrJS(state, ['search', 'currentFacet']);
254
254
  const getCurrentListing = state => getImmutableOrJS(state, ['search', 'currentListing']);
255
255
  const getCurrentTab = state => getImmutableOrJS(state, ['search', Context$1.facets, getCurrentFacet(state), 'tabId'], 0);
@@ -268,14 +268,14 @@ const getFacet = (state, facetName = '', context = Context$1.facets, returnType)
268
268
  const currentFacet = facetName || getCurrentFacet(state);
269
269
  return getImmutableOrJS(state, ['search', context, currentFacet], {}, returnType);
270
270
  };
271
- const getListing = (state, listing = '') => {
271
+ const getListing$1 = (state, listing = '') => {
272
272
  const currentListing = listing || getCurrentListing(state);
273
273
  return getImmutableOrJS(state, ['search', Context$1.listings, currentListing], {});
274
274
  };
275
275
  const getFilters = (state, facet, context = Context$1.facets, returnType) => {
276
- return getImmutableOrJS(state, ['search', context, facet || getCurrent(state, context), 'filters'], {}, returnType);
276
+ return getImmutableOrJS(state, ['search', context, facet || getCurrent$1(state, context), 'filters'], {}, returnType);
277
277
  };
278
- const getRenderableFilters = (state, facet = '', context = Context$1.facets) => Object.fromEntries(Object.entries(getFilters(state, facet, context, 'js')).filter(([, f = {}]) => typeof f.renderable !== 'boolean' ? true : f.renderable));
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
279
  const getFiltersToLoad = (state, facet, context = Context$1.facets, returnType) => {
280
280
  const filters = getFilters(state, facet, context, returnType);
281
281
  const loadedFilters = Object.entries(filters).map(([key, f = {}]) => [key, (f.items || []).filter(i => {
@@ -291,51 +291,51 @@ const getSelectedFilters = (state, facet = '', context = Context$1.facets, retur
291
291
  const selectedFilters = Object.fromEntries(Object.entries(filters).map(([key, filter = {}]) => [key, (filter.items || []).filter(item => !!(item.isSelected || false)).map(item => {
292
292
  const key = (item === null || item === void 0 ? void 0 : item.key) || '';
293
293
  const isIsoDate = isoDateRegex.test(key);
294
- return isIsoDate ? key : key.toLowerCase();
294
+ return isIsoDate ? key : typeof key.toLowerCase !== 'undefined' ? key.toLowerCase() : key;
295
295
  })]));
296
296
  const fromJS = makeFromJS(returnType);
297
297
  return fromJS(selectedFilters);
298
298
  };
299
299
  const getResults = (state, current = '', context = Context$1.facets, returnType) => {
300
- return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'results'], [], returnType);
300
+ return getImmutableOrJS(state, ['search', context, current || getCurrent$1(state, context), 'results'], [], returnType);
301
301
  };
302
302
  const getIsInternalPaging = (state, current, context = Context$1.facets) => {
303
- return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'queryParams', 'internalPaging'], false);
303
+ return getImmutableOrJS(state, ['search', context, current || getCurrent$1(state, context), 'queryParams', 'internalPaging'], false);
304
304
  };
305
305
  const getIsLoaded = (state, context = Context$1.facets, facet) => {
306
- return !!getImmutableOrJS(state, ['search', context, facet || getCurrent(state, context), 'queryDuration'], 0);
306
+ return !!getImmutableOrJS(state, ['search', context, facet || getCurrent$1(state, context), 'queryDuration'], 0);
307
307
  };
308
- const getIsLoading = (state, context = Context$1.facets, facet) => {
309
- 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']);
310
310
  };
311
311
  const getIsSsr = state => getImmutableOrJS(state, ['search', 'config', 'ssr'], false);
312
- const getFeaturedResults = (state, current = '', context = Context$1.facets) => {
313
- return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'featuredResults'], []);
312
+ const getFeaturedResults$1 = (state, current = '', context = Context$1.facets, returnType) => {
313
+ return getImmutableOrJS(state, ['search', context, current || getCurrent$1(state, context), 'featuredResults'], [], returnType);
314
314
  };
315
315
  const getPaging = (state, current = '', context = Context$1.facets, returnType) => {
316
- return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'pagingInfo'], {}, returnType);
316
+ return getImmutableOrJS(state, ['search', context, current || getCurrent$1(state, context), 'pagingInfo'], {}, returnType);
317
317
  };
318
- const getPageIndex = (state, current = '', context = Context$1.facets) => {
319
- 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']);
320
320
  };
321
321
  const getPrevPageIndex = (state, current = '', context = Context$1.facets) => {
322
- return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'pagingInfo', 'prevPageIndex']);
322
+ return getImmutableOrJS(state, ['search', context, current || getCurrent$1(state, context), 'pagingInfo', 'prevPageIndex']);
323
323
  };
324
- const getPageIsLoading = (state, current = '', context = Context$1.facets) => {
325
- 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']);
326
326
  };
327
327
  const getPagesLoaded = (state, current = '', context = Context$1.facets) => {
328
- return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'pagingInfo', 'pagesLoaded'], [], 'js');
328
+ return getImmutableOrJS(state, ['search', context, current || getCurrent$1(state, context), 'pagingInfo', 'pagesLoaded'], [], 'js');
329
329
  };
330
330
  const getTotalCount = (state, current = '', context = Context$1.facets) => {
331
- return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'pagingInfo', 'totalCount']);
331
+ return getImmutableOrJS(state, ['search', context, current || getCurrent$1(state, context), 'pagingInfo', 'totalCount']);
332
332
  };
333
- const getSearchTerm = state => getImmutableOrJS(state, ['search', 'term']);
333
+ const getSearchTerm$1 = state => getImmutableOrJS(state, ['search', 'term']);
334
334
  const getSearchTabs = (state, returnType) => getImmutableOrJS(state, ['search', 'tabs'], [], returnType);
335
335
  const getQueryParams = (state, current = '', context = Context$1.facets) => {
336
- return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'queryParams'], {}, 'js');
336
+ return getImmutableOrJS(state, ['search', context, current || getCurrent$1(state, context), 'queryParams'], {}, 'js');
337
337
  };
338
- const getQueryParameter = ({
338
+ const getQueryParameter$1 = ({
339
339
  state,
340
340
  facet,
341
341
  context = Context$1.facets
@@ -343,10 +343,10 @@ const getQueryParameter = ({
343
343
  return getImmutableOrJS(getQueryParams(state, facet, context), key, ifnull, 'js');
344
344
  };
345
345
  const getCustomApi = (state, current, context = Context$1.facets, returnType) => {
346
- return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'customApi'], null, returnType);
346
+ return getImmutableOrJS(state, ['search', context, current || getCurrent$1(state, context), 'customApi'], null, returnType);
347
347
  };
348
348
  const getCustomEnv = (state, current, context = Context$1.facets) => {
349
- return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'env']);
349
+ return getImmutableOrJS(state, ['search', context, current || getCurrent$1(state, context), 'env']);
350
350
  };
351
351
  const getTabsAndFacets = (state, returnType) => {
352
352
  const tabs = getSearchTabs(state, 'js');
@@ -392,69 +392,70 @@ const selectFacets = {
392
392
  getFacetTitles,
393
393
  getFacets,
394
394
  getFacetsTotalCount,
395
- getFeaturedResults,
395
+ getFeaturedResults: getFeaturedResults$1,
396
396
  getFilters,
397
397
  getFiltersToLoad,
398
398
  getIsLoaded,
399
- getIsLoading,
400
- getPageIndex,
401
- getPageIsLoading,
399
+ getIsLoading: getIsLoading$1,
400
+ getPageIndex: getPageIndex$1,
401
+ getPageIsLoading: getPageIsLoading$1,
402
402
  getPagesLoaded,
403
403
  getPaging,
404
404
  getQueryParams: (state, facet) => getQueryParams(state, facet, Context$1.facets),
405
405
  getQueryParameter: ({
406
406
  state,
407
407
  facet
408
- }, key, ifnull) => getQueryParameter({
408
+ }, key, ifnull) => getQueryParameter$1({
409
409
  state,
410
410
  facet,
411
411
  context: Context$1.facets
412
412
  }, key, ifnull),
413
- getRenderableFilters,
413
+ getRenderableFilters: getRenderableFilters$1,
414
414
  getResults,
415
415
  getTabFacets,
416
416
  getTabsAndFacets,
417
417
  getTotalCount,
418
418
  getSearchTabs,
419
- getSearchTerm,
419
+ getSearchTerm: getSearchTerm$1,
420
420
  getSearchTotalCount,
421
421
  getSelectedFilters
422
422
  }; // An exported copy of the relevant selectors pre-scoped to a listing context
423
423
 
424
424
  const selectListing = {
425
425
  getCurrent: getCurrentListing,
426
- getFeaturedResults: (state, listing = '') => getFeaturedResults(state, listing, Context$1.listings),
427
- getFilters: (state, listing = '') => getFilters(state, listing, Context$1.listings),
426
+ getFeaturedResults: (state, listing = '') => getFeaturedResults$1(state, listing, Context$1.listings, 'js'),
427
+ getFilters: (state, listing = '') => getFilters(state, listing, Context$1.listings, 'js'),
428
428
  getFiltersToLoad: (state, listing = '') => getFiltersToLoad(state, listing, Context$1.listings),
429
- getListing,
429
+ getListing: getListing$1,
430
430
  getIsLoaded: state => getIsLoaded(state, Context$1.listings),
431
- getIsLoading: state => getIsLoading(state, Context$1.listings),
432
- getPageIndex: (state, listing = '') => getPageIndex(state, listing, Context$1.listings),
433
- getPaging: (state, listing = '') => getPaging(state, listing, Context$1.listings),
434
- getPageIsLoading: (state, listing = '') => getPageIsLoading(state, listing, 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(state, listing, Context$1.listings, 'js'),
434
+ getPageIsLoading: (state, listing = '') => getPageIsLoading$1(state, listing, Context$1.listings),
435
435
  getPagesLoaded: (state, listing = '') => getPagesLoaded(state, listing, Context$1.listings),
436
436
  getQueryParams: (state, listing = '') => getQueryParams(state, listing, Context$1.listings),
437
437
  getQueryParameter: ({
438
438
  state,
439
439
  facet
440
- }, key, ifnull) => getQueryParameter({
440
+ }, key, ifnull) => getQueryParameter$1({
441
441
  state,
442
442
  facet,
443
443
  context: Context$1.listings
444
444
  }, key, ifnull),
445
- getRenderableFilters: (state, listing = '') => getRenderableFilters(state, listing, Context$1.listings),
446
- getResults: (state, listing = '') => getResults(state, listing, Context$1.listings),
447
- getSearchTerm,
445
+ getRenderableFilters: (state, listing = '') => getRenderableFilters$1(state, listing, Context$1.listings),
446
+ getResults: (state, listing = '') => getResults(state, listing, Context$1.listings, 'js'),
447
+ getSearchTerm: getSearchTerm$1,
448
448
  getTotalCount: (state, listing = '') => getTotalCount(state, listing, Context$1.listings),
449
- getSelectedFilters: (state, listing = '') => getSelectedFilters(state, listing, Context$1.listings)
449
+ getSelectedFilters: (state, listing = '') => getSelectedFilters(state, listing, Context$1.listings, 'js')
450
450
  };
451
451
  const selectCurrentPath = state => getImmutableOrJS(state, ['routing', 'currentPath']);
452
+ const selectCurrentProject = state => getImmutableOrJS(state, ['routing', 'currentProject']);
452
453
  const selectVersionStatus = state => getImmutableOrJS(state, ['version', 'contensisVersionStatus']);
453
454
 
454
455
  var selectors = /*#__PURE__*/Object.freeze({
455
456
  __proto__: null,
456
457
  getSearchContext: getSearchContext,
457
- getCurrent: getCurrent,
458
+ getCurrent: getCurrent$1,
458
459
  getCurrentFacet: getCurrentFacet,
459
460
  getCurrentListing: getCurrentListing,
460
461
  getCurrentTab: getCurrentTab,
@@ -462,27 +463,27 @@ var selectors = /*#__PURE__*/Object.freeze({
462
463
  getTabFacets: getTabFacets,
463
464
  getFacetTitles: getFacetTitles,
464
465
  getFacet: getFacet,
465
- getListing: getListing,
466
+ getListing: getListing$1,
466
467
  getFilters: getFilters,
467
- getRenderableFilters: getRenderableFilters,
468
+ getRenderableFilters: getRenderableFilters$1,
468
469
  getFiltersToLoad: getFiltersToLoad,
469
470
  getSelectedFilters: getSelectedFilters,
470
471
  getResults: getResults,
471
472
  getIsInternalPaging: getIsInternalPaging,
472
473
  getIsLoaded: getIsLoaded,
473
- getIsLoading: getIsLoading,
474
+ getIsLoading: getIsLoading$1,
474
475
  getIsSsr: getIsSsr,
475
- getFeaturedResults: getFeaturedResults,
476
+ getFeaturedResults: getFeaturedResults$1,
476
477
  getPaging: getPaging,
477
- getPageIndex: getPageIndex,
478
+ getPageIndex: getPageIndex$1,
478
479
  getPrevPageIndex: getPrevPageIndex,
479
- getPageIsLoading: getPageIsLoading,
480
+ getPageIsLoading: getPageIsLoading$1,
480
481
  getPagesLoaded: getPagesLoaded,
481
482
  getTotalCount: getTotalCount,
482
- getSearchTerm: getSearchTerm,
483
+ getSearchTerm: getSearchTerm$1,
483
484
  getSearchTabs: getSearchTabs,
484
485
  getQueryParams: getQueryParams,
485
- getQueryParameter: getQueryParameter,
486
+ getQueryParameter: getQueryParameter$1,
486
487
  getCustomApi: getCustomApi,
487
488
  getCustomEnv: getCustomEnv,
488
489
  getTabsAndFacets: getTabsAndFacets,
@@ -491,12 +492,12 @@ var selectors = /*#__PURE__*/Object.freeze({
491
492
  selectFacets: selectFacets,
492
493
  selectListing: selectListing,
493
494
  selectCurrentPath: selectCurrentPath,
495
+ selectCurrentProject: selectCurrentProject,
494
496
  selectVersionStatus: selectVersionStatus
495
497
  });
496
498
 
497
499
  // eslint-disable-next-line import/default
498
500
 
499
- /* eslint-disable @typescript-eslint/naming-convention */
500
501
  const withSearch = mappers => SearchComponent => {
501
502
  const Wrapper = props => {
502
503
  return /*#__PURE__*/React__default["default"].createElement(SearchComponent, props);
@@ -507,22 +508,23 @@ const withSearch = mappers => SearchComponent => {
507
508
  const mapStateToProps = state => {
508
509
  return {
509
510
  currentFacet: getCurrentFacet(state),
510
- currentPageIndex: getPageIndex(state),
511
+ currentPageIndex: getPageIndex$1(state),
511
512
  currentTabIndex: getCurrentTab(state),
512
513
  facet: getFacet(state),
513
514
  facets: getTabFacets(state),
514
515
  facetsTotalCount: getFacetsTotalCount(state),
515
516
  facetTitles: getFacetTitles(state),
516
- featuredResults: getFeaturedResults(state),
517
- filters: getRenderableFilters(state),
518
- isLoading: getIsLoading(state),
517
+ featuredResults: getFeaturedResults$1(state),
518
+ filters: getRenderableFilters$1(state),
519
+ isLoading: getIsLoading$1(state),
519
520
  paging: getPaging(state),
520
- pageIsLoading: getPageIsLoading(state),
521
+ pageIsLoading: getPageIsLoading$1(state),
521
522
  results: getResults(state),
522
523
  resultsInfo: (mappers === null || mappers === void 0 ? void 0 : mappers.resultsInfo) && mappers.resultsInfo(state),
523
- searchTerm: getSearchTerm(state),
524
+ searchTerm: getSearchTerm$1(state),
524
525
  searchTotalCount: getSearchTotalCount(state),
525
- sortOrder: getQueryParameter({
526
+ selectedFilters: getSelectedFilters(state),
527
+ sortOrder: getQueryParameter$1({
526
528
  state
527
529
  }, 'dynamicOrderBy', []),
528
530
  tabsAndFacets: getTabsAndFacets(state),
@@ -536,7 +538,7 @@ const withSearch = mappers => SearchComponent => {
536
538
  updateCurrentTab: id => withMappers(updateCurrentTab$1(id), mappers),
537
539
  updatePageIndex: pageIndex => withMappers(updatePageIndex$1(pageIndex), mappers),
538
540
  updateSearchTerm: term => withMappers(updateSearchTerm$1(term), mappers),
539
- updateSelectedFilters: (filter, key) => withMappers(updateSelectedFilters(filter, key), mappers),
541
+ updateSelectedFilters: (filter, key, isUnknownItem = false) => withMappers(updateSelectedFilters(filter, key, isUnknownItem), mappers),
540
542
  updateSortOrder: orderBy => withMappers(updateSortOrder$1(orderBy), mappers)
541
543
  };
542
544
  const connector = reactRedux.connect(mapStateToProps, mapDispatchToProps);
@@ -576,6 +578,7 @@ const withListing = mappers => ListingComponent => {
576
578
  results: getResults(state),
577
579
  resultsInfo: mappers && typeof mappers.resultsInfo === 'function' && mappers.resultsInfo(state),
578
580
  searchTerm: getSearchTerm(state),
581
+ selectedFilters: getSelectedFilters(state),
579
582
  sortOrder: getQueryParameter({
580
583
  state
581
584
  }, 'dynamicOrderBy', [])
@@ -587,7 +590,7 @@ const withListing = mappers => ListingComponent => {
587
590
  updateCurrentFacet: facet => withMappers(updateCurrentFacet$1(facet), mappers),
588
591
  updatePageIndex: pageIndex => withMappers(updatePageIndex$1(pageIndex), mappers),
589
592
  updateSearchTerm: term => withMappers(updateSearchTerm$1(term), mappers),
590
- updateSelectedFilters: (filter, key) => withMappers(updateSelectedFilters(filter, key), mappers),
593
+ updateSelectedFilters: (filter, key, isUnknownItem = false) => withMappers(updateSelectedFilters(filter, key, isUnknownItem), mappers),
591
594
  updateSortOrder: orderBy => withMappers(updateSortOrder$1(orderBy), mappers)
592
595
  };
593
596
  return reactRedux.connect(mapStateToProps, mapDispatchToProps)(toJS$1(Wrapper));
@@ -799,7 +802,7 @@ const extractQuotedPhrases = searchTerm => {
799
802
  return (searchTerm.match(pattern) || []).map(match => match.replace(/"/g, ''));
800
803
  };
801
804
  const buildUrl = (route, params) => {
802
- const qs = queryString__default["default"].stringify(params);
805
+ const qs = queryString.stringify(params);
803
806
  const path = qs ? `${route}?${qs}` : route;
804
807
  return path;
805
808
  };
@@ -875,12 +878,12 @@ const Fields = {
875
878
  };
876
879
 
877
880
  const fieldExpression = (field, value, operator = 'equalTo', weight) => {
878
- if (!field || !value) return [];
881
+ if (!field || !value || Array.isArray(value) && value.length === 0) return [];
879
882
  if (Array.isArray(field)) // If an array of fieldIds have been provided, call self for each fieldId
880
883
  // to generate expressions that are combined with an 'or' operator
881
884
  return [contensisCoreApi.Op.or(...field.map(fieldId => fieldExpression(fieldId, value, operator, weight)).flat())];
882
885
  if (operator === 'between') return between(field, value);
883
- 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)];
886
+ if (Array.isArray(value)) return equalToOrIn(field, value, operator);else return !weight ? equalToOrIn(field, value, operator) : [equalToOrIn(field, value, operator)[0].weight(weight)];
884
887
  };
885
888
  const contentTypeIdExpression = (contentTypeIds, webpageTemplates, assetTypes) => {
886
889
  const expressions = [];
@@ -904,8 +907,17 @@ const contentTypeIdExpression = (contentTypeIds, webpageTemplates, assetTypes) =
904
907
  const filterExpressions = filters => {
905
908
  if (!filters) return [];
906
909
  const expressions = [];
907
- filters.map(param => {
908
- expressions.push(...fieldExpression(param.key, param.value, param.operator || 'in'));
910
+ filters.map(selectedFilter => {
911
+ if (selectedFilter.logicOperator === 'and') // using 'and' logic operator we loop through each filter
912
+ // and loop through all values to add an expression for each filter value
913
+ selectedFilter.values.forEach(value => expressions.push(...fieldExpression(selectedFilter.key, value, selectedFilter.fieldOperator || 'equalTo')));else if (selectedFilter.logicOperator === 'not') {
914
+ const fieldExpressions = fieldExpression(selectedFilter.key, selectedFilter.values, selectedFilter.fieldOperator || 'in');
915
+ fieldExpressions.forEach(expr => {
916
+ expressions.push(contensisCoreApi.Op.not(expr));
917
+ });
918
+ } // using 'or' logic operator we loop over each filter
919
+ // and simply add the array of values to an expression with an 'in' operator
920
+ else expressions.push(...fieldExpression(selectedFilter.key, selectedFilter.values, selectedFilter.fieldOperator || 'in'));
909
921
  });
910
922
  return expressions;
911
923
  };
@@ -922,8 +934,8 @@ const dataFormatExpression = (contentTypeIds, dataFormat = DataFormats.entry) =>
922
934
  const withExpr = fieldExpression(Fields.sys.contentTypeId, withContentTypeIds)[0];
923
935
  const notExpr = contensisCoreApi.Op.not(fieldExpression(Fields.sys.contentTypeId, notContentTypeIds)[0]);
924
936
  andExpr.add(dataFormatExpr);
925
- if (withContentTypeIds.length > 0) andExpr.add(withExpr);
926
- if (notContentTypeIds.length > 0) andExpr.add(notExpr);
937
+ if (withContentTypeIds.length > 0 && withExpr) andExpr.add(withExpr);
938
+ if (notContentTypeIds.length > 0 && notExpr) andExpr.add(notExpr);
927
939
  return [andExpr];
928
940
  }
929
941
 
@@ -979,19 +991,48 @@ const equalToOrIn = (field, value, operator = 'equalTo') => {
979
991
  if (value.length === 0) return [];
980
992
 
981
993
  if (Array.isArray(value)) {
982
- if (value.length === 1) return [contensisCoreApi.Op[operator](field, value[0], undefined, undefined)];
983
- return [contensisCoreApi.Op.in(field, ...value)];
994
+ if (operator === 'equalTo' || operator === 'in') return [contensisCoreApi.Op.in(field, ...value)];
995
+ return [contensisCoreApi.Op.or(...value.map(innerValue => {
996
+ switch (operator) {
997
+ case 'between':
998
+ case 'distanceWithin':
999
+ // Not implemented
1000
+ return contensisCoreApi.Op.equalTo(field, innerValue);
1001
+
1002
+ case 'exists':
1003
+ return contensisCoreApi.Op.exists(field, innerValue);
1004
+
1005
+ case 'freeText':
1006
+ // TODO: Potentially needs further implementation of new options
1007
+ return contensisCoreApi.Op[operator](field, innerValue, false, undefined);
1008
+
1009
+ default:
1010
+ return contensisCoreApi.Op[operator](field, innerValue);
1011
+ }
1012
+ }))];
984
1013
  }
985
1014
 
986
- return [];
1015
+ switch (operator) {
1016
+ case 'between':
1017
+ case 'distanceWithin':
1018
+ // Not implemented
1019
+ return [contensisCoreApi.Op.equalTo(field, value)];
1020
+
1021
+ case 'freeText':
1022
+ // TODO: Potentially needs further implementation of new options
1023
+ return [contensisCoreApi.Op[operator](field, value, false, undefined)];
1024
+
1025
+ default:
1026
+ return [contensisCoreApi.Op[operator](field, value)];
1027
+ }
987
1028
  };
988
1029
 
989
1030
  const between = (field, value) => {
990
1031
  const handle = betweenValue => {
991
- const valArr = betweenValue.split('-');
1032
+ const valArr = betweenValue.split('--');
992
1033
 
993
1034
  if (valArr.length > 1) {
994
- const [minimum, maximum = null] = betweenValue.split('-');
1035
+ const [minimum, maximum] = valArr;
995
1036
  return contensisCoreApi.Op.between(field, minimum, maximum);
996
1037
  } else {
997
1038
  // eslint-disable-next-line no-console
@@ -1001,10 +1042,9 @@ const between = (field, value) => {
1001
1042
  };
1002
1043
 
1003
1044
  if (value.length === 0) return [];
1004
- if (Array.isArray(value)) return [contensisCoreApi.Op.or(...value.map(handle).filter(bc => bc !== false))]; // const valArr = value.split('-');
1005
-
1045
+ if (Array.isArray(value)) return [contensisCoreApi.Op.or(...value.map(handle).filter(bc => bc !== false))];
1006
1046
  const op = handle(value);
1007
- return op ? [op] : []; // valArr.length > 1 ? [Op.between(field, ...value.split('-'))] : [];
1047
+ return op ? [op] : [];
1008
1048
  };
1009
1049
  /**
1010
1050
  * Accept HTTP style objects and map them to
@@ -1047,7 +1087,7 @@ const customWhereExpressions = where => {
1047
1087
  // the second property inside the clause
1048
1088
 
1049
1089
  if (notIdx === 1) {
1050
- expression = contensisCoreApi.Op.not(contensisCoreApi.Op[innerOperator](innerField, innerValue));
1090
+ expression = innerOperator === 'between' ? contensisCoreApi.Op.not(contensisCoreApi.Op[innerOperator](innerField, innerValue[0], innerValue[1])) : contensisCoreApi.Op.not(contensisCoreApi.Op[innerOperator](innerField, innerValue));
1051
1091
  }
1052
1092
  });
1053
1093
  }
@@ -1059,8 +1099,9 @@ const customWhereExpressions = where => {
1059
1099
 
1060
1100
  if (idx === 1 && // operator !== 'and' &&
1061
1101
  // operator !== 'or' &&
1062
- operator !== 'between' && operator !== 'distanceWithin') {
1063
- expression = operator === 'freeText' || operator === 'contains' ? contensisCoreApi.Op[operator](field, value) : operator === 'in' ? contensisCoreApi.Op[operator](field, ...value) : contensisCoreApi.Op[operator](field, value);
1102
+ // operator !== 'between' &&
1103
+ operator !== 'distanceWithin') {
1104
+ 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);
1064
1105
  if (typeof weight === 'number') expression = expression.weight(weight);
1065
1106
  }
1066
1107
  });
@@ -1190,20 +1231,16 @@ const searchUriTemplate = {
1190
1231
 
1191
1232
  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(',')]));
1192
1233
  const currentSearch = !term && getImmutableOrJS(state, ['routing', 'location', 'search']);
1193
- const currentQs = removeEmptyAttributes(queryString__default["default"].parse(currentSearch));
1234
+ const currentQs = removeEmptyAttributes(queryString.parse(currentSearch));
1194
1235
  if (orderBy) currentQs.orderBy = orderBy;
1195
- const searchTerm = getSearchTerm(state); // Use Immutable's merge to merge the stateFilters with any current Qs
1196
- // to build the new Qs.
1236
+ const searchTerm = getSearchTerm$1(state); // Merge the stateFilters with any current qs to build the new qs
1197
1237
 
1198
1238
  const mergedSearch = removeEmptyAttributes({ ...merge__default["default"](currentQs, stateFilters),
1199
1239
  term: searchTerm
1200
1240
  });
1201
- return queryString__default["default"].stringify(mergedSearch);
1241
+ return queryString.stringify(mergedSearch);
1202
1242
  },
1203
- hash: {
1204
- $path: 'state',
1205
- $formatting: state => getImmutableOrJS(state, ['routing', 'location', 'hash'], '').replace('#', '')
1206
- }
1243
+ hash: state => getImmutableOrJS(state, ['routing', 'location', 'hash'], '').replace('#', '')
1207
1244
  };
1208
1245
 
1209
1246
  const mapStateToSearchUri = params => mapJson__default["default"](params, searchUriTemplate);
@@ -1348,14 +1385,15 @@ const filterTemplate = {
1348
1385
  const filterExpressionMapper = {
1349
1386
  // Expression type: so we can identify how to build the query
1350
1387
  expressionType: ({
1351
- filter
1352
- }) => filter.contentTypeId ? FilterExpressionTypes.contentType : FilterExpressionTypes.field,
1388
+ contentTypeId
1389
+ }) => contentTypeId ? FilterExpressionTypes.contentType : FilterExpressionTypes.field,
1353
1390
  // Key: so we can target the query to a specific field
1354
- key: 'filter.fieldId',
1391
+ key: 'fieldId',
1355
1392
  // Value: so we can filter a specific field by an array of values
1356
1393
  // e.g. taxonomy key or contentTypeId array
1357
- value: 'selectedValue',
1358
- operator: 'filter.fieldOperator'
1394
+ values: 'selectedValues',
1395
+ fieldOperator: 'fieldOperator',
1396
+ logicOperator: 'logicOperator'
1359
1397
  };
1360
1398
 
1361
1399
  const mapFilterToFilterExpression = filter => mapJson__default["default"](filter, filterExpressionMapper);
@@ -1365,18 +1403,15 @@ const mapFiltersToFilterExpression = (filters, selectedFilters) => {
1365
1403
  const filterExpressions = []; // Iterate through the keys in selectedFilters and locate
1366
1404
  // the items that are selected and queryable
1367
1405
 
1368
- Object.entries(selectedFilters).map(([fkey, selectedValue]) => {
1406
+ Object.entries(selectedFilters).map(([fkey, selectedValues]) => {
1369
1407
  const filter = filters[fkey];
1370
1408
 
1371
- if (selectedValue && filter) {
1372
- const selectedItems = filter.items && filter.items.filter(itm => itm.isSelected) || []; // Where we have a value for a selectedFilter
1409
+ if (selectedValues && filter) {
1410
+ // Where we have a value for a selectedFilter
1373
1411
  // and a filter is found for the current key
1374
1412
  // map the filter to a filterExpression object
1375
-
1376
- const expr = mapFilterToFilterExpression({
1377
- filter,
1378
- selectedItems,
1379
- selectedValue
1413
+ const expr = mapFilterToFilterExpression({ ...filter,
1414
+ selectedValues
1380
1415
  });
1381
1416
  filterExpressions.push(expr);
1382
1417
  }
@@ -1385,10 +1420,10 @@ const mapFiltersToFilterExpression = (filters, selectedFilters) => {
1385
1420
  };
1386
1421
 
1387
1422
  const queryParamsTemplate = {
1388
- assetTypes: root => getQueryParameter(root, 'assetTypes', []),
1389
- contentTypeIds: root => getQueryParameter(root, 'contentTypeIds', []),
1390
- customWhere: root => getQueryParameter(root, 'customWhere', []),
1391
- dynamicOrderBy: root => getQueryParameter(root, 'dynamicOrderBy', []),
1423
+ assetTypes: root => getQueryParameter$1(root, 'assetTypes', []),
1424
+ contentTypeIds: root => getQueryParameter$1(root, 'contentTypeIds', []),
1425
+ customWhere: root => getQueryParameter$1(root, 'customWhere', []),
1426
+ dynamicOrderBy: root => getQueryParameter$1(root, 'dynamicOrderBy', []),
1392
1427
  env: ({
1393
1428
  state,
1394
1429
  facet,
@@ -1403,8 +1438,8 @@ const queryParamsTemplate = {
1403
1438
  if (excludeIds) return Array.isArray(excludeIds) ? excludeIds : excludeIds.split(',').map(id => id.trim());
1404
1439
  return null;
1405
1440
  },
1406
- featuredResults: root => getQueryParameter(root, 'featuredResults', null),
1407
- fields: root => getQueryParameter(root, 'fields', []),
1441
+ featuredResults: root => getQueryParameter$1(root, 'featuredResults', null),
1442
+ fields: root => getQueryParameter$1(root, 'fields', []),
1408
1443
  filters: ({
1409
1444
  state,
1410
1445
  facet,
@@ -1416,28 +1451,28 @@ const queryParamsTemplate = {
1416
1451
  const filterParams = mapFiltersToFilterExpression(stateFilters, selectedFilters);
1417
1452
  return filterParams;
1418
1453
  },
1419
- includeInSearchFields: root => getQueryParameter(root, 'includeInSearch', []),
1454
+ includeInSearchFields: root => getQueryParameter$1(root, 'includeInSearch', []),
1420
1455
  internalPageIndex: ({
1421
1456
  action,
1422
1457
  state
1423
- }) => getPageIndex(state, '', action.context),
1424
- internalPaging: root => getQueryParameter(root, 'internalPaging', false),
1458
+ }) => getPageIndex$1(state, '', action.context),
1459
+ internalPaging: root => getQueryParameter$1(root, 'internalPaging', false),
1425
1460
  languages: ({
1426
1461
  action
1427
1462
  }) => action.defaultLang ? [action.defaultLang] : [],
1428
- linkDepth: root => getQueryParameter(root, 'linkDepth', 0),
1429
- loadMorePaging: root => getQueryParameter(root, 'loadMorePaging', false),
1430
- orderBy: root => getQueryParameter(root, 'orderBy', []),
1463
+ linkDepth: root => getQueryParameter$1(root, 'linkDepth', 0),
1464
+ loadMorePaging: root => getQueryParameter$1(root, 'loadMorePaging', false),
1465
+ orderBy: root => getQueryParameter$1(root, 'orderBy', []),
1431
1466
  pageIndex: root => {
1432
1467
  const {
1433
1468
  action,
1434
1469
  state
1435
1470
  } = root;
1436
- if (getQueryParameter(root, 'internalPaging', false)) return 0;
1471
+ if (getQueryParameter$1(root, 'internalPaging', false)) return 0;
1437
1472
  if (action.type === UPDATE_PAGE_INDEX) return action.params.pageIndex;
1438
- return !action.preload ? getPageIndex(state, '', action.context) : 0;
1473
+ return !action.preload ? getPageIndex$1(state, action.facet, action.context) : 0;
1439
1474
  },
1440
- pageSize: root => getQueryParameter(root, 'pageSize'),
1475
+ pageSize: root => getQueryParameter$1(root, 'pageSize'),
1441
1476
  pagesLoaded: ({
1442
1477
  state,
1443
1478
  facet,
@@ -1455,9 +1490,9 @@ const queryParamsTemplate = {
1455
1490
  }) => {
1456
1491
  var _getFacet;
1457
1492
 
1458
- return (_getFacet = getFacet(state, facet, context)) === null || _getFacet === void 0 ? void 0 : _getFacet.projectId;
1493
+ return ((_getFacet = getFacet(state, facet, context)) === null || _getFacet === void 0 ? void 0 : _getFacet.projectId) || selectCurrentProject(state);
1459
1494
  },
1460
- searchTerm: root => root.context !== Context$1.minilist || getQueryParameter(root, 'useSearchTerm', false) ? getSearchTerm(root.state) : '',
1495
+ searchTerm: root => root.context !== Context$1.minilist || getQueryParameter$1(root, 'useSearchTerm', false) ? getSearchTerm$1(root.state) : '',
1461
1496
  selectedFilters: ({
1462
1497
  state,
1463
1498
  facet,
@@ -1467,11 +1502,11 @@ const queryParamsTemplate = {
1467
1502
  state
1468
1503
  }) => selectVersionStatus(state),
1469
1504
  weightedSearchFields: root => {
1470
- const wsf = getQueryParameter(root, 'weightedSearchFields', []);
1505
+ const wsf = getQueryParameter$1(root, 'weightedSearchFields', []);
1471
1506
  const deduped = wsf.filter((v, i, a) => a.findIndex(t => t.fieldId === v.fieldId) === i);
1472
1507
  return deduped; // return wsf;
1473
1508
  },
1474
- webpageTemplates: root => getQueryParameter(root, 'webpageTemplates', [])
1509
+ webpageTemplates: root => getQueryParameter$1(root, 'webpageTemplates', [])
1475
1510
  };
1476
1511
 
1477
1512
  const mapStateToQueryParams = sourceJson => mapJson__default["default"](sourceJson, queryParamsTemplate);
@@ -1517,8 +1552,8 @@ const runSearch = (action, state, queryParams) => {
1517
1552
  const facetIsLoaded = defaultLang ? false : getIsLoaded(state, context, facet);
1518
1553
  const stateParams = { ...getQueryParams(ogState, facet, context)
1519
1554
  };
1520
- stateParams.pageIndex = getPageIndex(ogState, facet, context);
1521
- stateParams.searchTerm = getSearchTerm(ogState);
1555
+ stateParams.pageIndex = getPageIndex$1(ogState, facet, context);
1556
+ stateParams.searchTerm = getSearchTerm$1(ogState);
1522
1557
 
1523
1558
  if (context === Context$1.facets && ssr || // context === Context.minilist ||
1524
1559
  preload || !facetIsLoaded || filterParamsChanged(action) || defaultLang) {
@@ -1569,9 +1604,10 @@ const filterParamsChanged = (action, state) => {
1569
1604
  const debugExecuteSearch = (action, state) => {
1570
1605
  const [queryParams, runSearch] = generateQueryParams(action, state);
1571
1606
  console.log('runSearch', runSearch, 'action', action, 'filterParamsChanged', filterParamsChanged(action, state), 'getIsLoaded(state, context, facet)', getIsLoaded(state, action.context, action.facet));
1572
- const stateParams = getQueryParams(action.ogState || state, action.facet, action.context);
1573
- stateParams.pageIndex = getPageIndex(action.ogState || state, action.facet, action.context);
1574
- stateParams.searchTerm = getSearchTerm(action.ogState || state);
1607
+ const stateParams = { ...getQueryParams(action.ogState || state, action.facet, action.context),
1608
+ pageIndex: getPageIndex$1(action.ogState || state, action.facet, action.context),
1609
+ searchTerm: getSearchTerm$1(action.ogState || state)
1610
+ };
1575
1611
  console.log(stateParams, queryParams);
1576
1612
  console.log('getSelectedFilters', getSelectedFilters(action.ogState || state, action.facet, action.context, 'js'), 'params', action.params);
1577
1613
  };
@@ -1636,14 +1672,20 @@ function* setRouteFilters(action) {
1636
1672
  ssr,
1637
1673
  debug
1638
1674
  };
1639
- yield effects.put(nextAction); // Using call instead of triggering from the put
1675
+ yield effects.put(nextAction); // keep track of this state ref for comparing changes to params later
1676
+
1677
+ const ogState = {
1678
+ search: state.search
1679
+ }; // Using call instead of triggering from the put
1640
1680
  // to allow this exported saga to continue during SSR
1641
1681
 
1642
1682
  yield effects.call(ensureSearch, { ...nextAction,
1643
- ogState: state
1683
+ ogState
1644
1684
  });
1645
1685
  }
1646
1686
  function* doSearch(action) {
1687
+ var _action$params;
1688
+
1647
1689
  const state = toJS(yield effects.select());
1648
1690
 
1649
1691
  if (action.config) {
@@ -1656,12 +1698,20 @@ function* doSearch(action) {
1656
1698
 
1657
1699
  const nextAction = { ...action,
1658
1700
  type: SET_SEARCH_FILTERS,
1659
- ssr: getIsSsr(state)
1701
+ ssr: getIsSsr(state),
1702
+ facet: action.facet || ((_action$params = action.params) === null || _action$params === void 0 ? void 0 : _action$params.facet)
1660
1703
  };
1661
- yield effects.put(nextAction);
1662
- yield effects.call(ensureSearch, { ...nextAction,
1663
- ogState: state
1664
- });
1704
+
1705
+ if (nextAction.facet && (action.config || Object.keys(getFacet(state, nextAction.facet, action.context, 'js')).length > 0)) {
1706
+ yield effects.put(nextAction); // keep track of this state ref for comparing changes to params later
1707
+
1708
+ const ogState = {
1709
+ search: state.search
1710
+ };
1711
+ yield effects.call(ensureSearch, { ...nextAction,
1712
+ ogState
1713
+ });
1714
+ }
1665
1715
  }
1666
1716
 
1667
1717
  function* loadFilters(action) {
@@ -1759,7 +1809,9 @@ function* ensureSearch(action) {
1759
1809
  try {
1760
1810
  const state = yield effects.select();
1761
1811
  const nextAction = { ...action,
1762
- ogState: action.ogState || state
1812
+ ogState: action.ogState || {
1813
+ search: state.search
1814
+ }
1763
1815
  };
1764
1816
  const [queryParams, runSearch] = generateQueryParams(nextAction, state);
1765
1817
  if (debug && (debug === true || debug.executeSearch)) debugExecuteSearch(nextAction, state);
@@ -1899,7 +1951,7 @@ function* updateCurrentFacet(action) {
1899
1951
  facet,
1900
1952
  mappers
1901
1953
  } = action;
1902
- const pageIndex = yield effects.select(getPageIndex, facet);
1954
+ const pageIndex = yield effects.select(getPageIndex$1, facet);
1903
1955
  const uri = yield buildUri({
1904
1956
  facet,
1905
1957
  pageIndex
@@ -1957,7 +2009,7 @@ function* buildUri({
1957
2009
  term
1958
2010
  }, mappers) {
1959
2011
  const state = yield effects.select();
1960
- const mapUri = mappers && mappers.navigate || mapStateToSearchUri;
2012
+ const mapUri = (mappers === null || mappers === void 0 ? void 0 : mappers.navigate) || mapStateToSearchUri;
1961
2013
  const uri = mapUri({
1962
2014
  state,
1963
2015
  facet,
@@ -1969,13 +2021,98 @@ function* buildUri({
1969
2021
  return `${uri.path}${uri.search && `?${uri.search}` || ''}${uri.hash && `#${uri.hash}` || ''}`;
1970
2022
  }
1971
2023
 
2024
+ var defaultMappers = {
2025
+ results: entries => entries,
2026
+ navigate: mapStateToSearchUri
2027
+ };
2028
+
2029
+ const {
2030
+ getCurrent,
2031
+ getFeaturedResults,
2032
+ getIsLoading,
2033
+ getListing,
2034
+ getPageIndex,
2035
+ getPageIsLoading,
2036
+ getQueryParameter,
2037
+ getRenderableFilters,
2038
+ getSearchTerm
2039
+ } = selectListing;
2040
+
2041
+ const makeSelectListingProps = () => reselect.createSelector(state => state, (_, mappers) => mappers, (state, mappers) => ({
2042
+ currentListing: getCurrent(state),
2043
+ currentPageIndex: getPageIndex(state),
2044
+ listing: getListing(state),
2045
+ featured: getFeaturedResults(state),
2046
+ filters: getRenderableFilters(state),
2047
+ isLoading: getIsLoading(state),
2048
+ pageIsLoading: getPageIsLoading(state),
2049
+ paging: getPaging(state, '', Context$1.listings, 'js'),
2050
+ results: getResults(state, '', Context$1.listings, 'js'),
2051
+ resultsInfo: mappers && typeof mappers.resultsInfo === 'function' && mappers.resultsInfo(state),
2052
+ searchTerm: getSearchTerm(state),
2053
+ selectedFilters: getSelectedFilters(state, '', Context$1.listings, 'js'),
2054
+ sortOrder: getQueryParameter({
2055
+ state
2056
+ }, 'dynamicOrderBy', [])
2057
+ }));
2058
+
2059
+ const useListing = ({
2060
+ mappers
2061
+ } = {
2062
+ id: ''
2063
+ }) => {
2064
+ const dispatch = reactRedux.useDispatch();
2065
+ const m = mappers || defaultMappers;
2066
+ const selectListingProps = React.useMemo(makeSelectListingProps, [m]);
2067
+ const dispatchProps = {
2068
+ clearFilters: () => dispatch(withMappers(clearFilters$1(), m)),
2069
+ updateCurrentFacet: facet => dispatch(withMappers(updateCurrentFacet$1(facet), m)),
2070
+ updatePageIndex: pageIndex => dispatch(withMappers(updatePageIndex$1(pageIndex), m)),
2071
+ updateSearchTerm: term => dispatch(withMappers(updateSearchTerm$1(term), m)),
2072
+ updateSelectedFilters: (filter, key, isUnknownItem = false) => dispatch(withMappers(updateSelectedFilters(filter, key, isUnknownItem), m)),
2073
+ updateSortOrder: orderBy => dispatch(withMappers(updateSortOrder$1(orderBy), m))
2074
+ };
2075
+ const {
2076
+ currentListing,
2077
+ currentPageIndex,
2078
+ featured,
2079
+ filters,
2080
+ isLoading,
2081
+ listing,
2082
+ paging,
2083
+ pageIsLoading,
2084
+ results,
2085
+ resultsInfo,
2086
+ searchTerm,
2087
+ selectedFilters,
2088
+ sortOrder
2089
+ } = reactRedux.useSelector(state => selectListingProps(state, m));
2090
+ return {
2091
+ currentListing,
2092
+ currentPageIndex,
2093
+ featured,
2094
+ filters,
2095
+ isLoading,
2096
+ listing,
2097
+ pageIsLoading,
2098
+ paging,
2099
+ results,
2100
+ resultsInfo,
2101
+ searchTerm,
2102
+ selectedFilters,
2103
+ sortOrder,
2104
+ title: listing.title,
2105
+ ...dispatchProps
2106
+ };
2107
+ };
2108
+
1972
2109
  const makeSelectMinilistProps = () => reselect.createSelector(state => state, (_, id) => id, (state, id) => ({
1973
2110
  facet: getFacet(state, id, Context$1.minilist, 'js'),
1974
2111
  filters: getFilters(state, id, Context$1.minilist, 'js'),
1975
- isLoading: getIsLoading(state, Context$1.minilist, id),
2112
+ isLoading: getIsLoading$1(state, Context$1.minilist, id),
1976
2113
  pagingInfo: getPaging(state, id, Context$1.minilist, 'js'),
1977
2114
  results: getResults(state, id, Context$1.minilist, 'js'),
1978
- searchTerm: getSearchTerm(state)
2115
+ searchTerm: getSearchTerm$1(state)
1979
2116
  }));
1980
2117
 
1981
2118
  const useMinilist = ({
@@ -2026,7 +2163,7 @@ const useMinilist = ({
2026
2163
  return {
2027
2164
  filters,
2028
2165
  isLoading,
2029
- pagingInfo,
2166
+ paging: pagingInfo,
2030
2167
  results,
2031
2168
  searchTerm,
2032
2169
  title: facet.title
@@ -2210,7 +2347,10 @@ const generateFiltersState = ({
2210
2347
  // the search results during SSR without needing to fetch the filters first
2211
2348
 
2212
2349
 
2213
- Object.entries(filterParams).map(([paramName = '', paramValue]) => typeof paramValue === 'string' && paramValue.split(',').map(pVal => filters = addFilterItem(filters, paramName, pVal)));
2350
+ Object.entries(filterParams).map(([paramName = '', paramValue]) => {
2351
+ if (typeof paramValue === 'string') return paramValue.split(',').map(pVal => filters = addFilterItem(filters, paramName, pVal));
2352
+ if (typeof paramValue === 'boolean') filters = addFilterItem(filters, paramName, paramValue);
2353
+ });
2214
2354
  return Object.fromEntries(filters);
2215
2355
  };
2216
2356
 
@@ -2239,7 +2379,7 @@ var reducers = (config => {
2239
2379
  case APPLY_CONFIG:
2240
2380
  {
2241
2381
  state = addConfigToState(state, action);
2242
- return;
2382
+ return state;
2243
2383
  }
2244
2384
 
2245
2385
  case CLEAR_FILTERS:
@@ -2423,13 +2563,22 @@ var reducers = (config => {
2423
2563
  {
2424
2564
  const {
2425
2565
  filter,
2426
- key
2566
+ key,
2567
+ isUnknownItem
2427
2568
  } = action;
2428
2569
  const isSingleSelect = state[context][current].filters[filter].isSingleSelect || false;
2429
2570
  const isGrouped = state[context][current].filters[filter].isGrouped || false;
2430
2571
  const currentItems = state[context][current].filters[filter].items;
2431
2572
  if (isGrouped) state[context] = resetFacets(state, context);
2432
2573
  state[context][current] = resetFacet(state[context][current]);
2574
+
2575
+ if (isUnknownItem && (currentItems === null || currentItems === void 0 ? void 0 : currentItems.findIndex(item => (item === null || item === void 0 ? void 0 : item.key) === key)) === -1) {
2576
+ currentItems === null || currentItems === void 0 ? void 0 : currentItems.push({
2577
+ key,
2578
+ isSelected: false
2579
+ });
2580
+ }
2581
+
2433
2582
  state[context][current].filters[filter].items = currentItems === null || currentItems === void 0 ? void 0 : currentItems.map(item => {
2434
2583
  if (item.key === key) {
2435
2584
  return { ...item,
@@ -2463,7 +2612,6 @@ var reducers = (config => {
2463
2612
  }, initState);
2464
2613
  });
2465
2614
 
2466
- // eslint-disable-next-line @typescript-eslint/naming-convention
2467
2615
  const Context = {
2468
2616
  facets: 'facets',
2469
2617
  listings: 'listings',
@@ -2480,6 +2628,7 @@ exports.schema = schema;
2480
2628
  exports.selectors = selectors;
2481
2629
  exports.setRouteFilters = setRouteFilters;
2482
2630
  exports.types = types;
2631
+ exports.useListing = useListing;
2483
2632
  exports.useMinilist = useMinilist;
2484
2633
  exports.withListing = withListing;
2485
2634
  exports.withSearch = withSearch;