@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/esm/search.js CHANGED
@@ -4,7 +4,7 @@ import mapJson, { jpath } from 'jsonpath-mapper';
4
4
  import * as log from 'loglevel';
5
5
  import { takeEvery, select, put, call, all } from '@redux-saga/core/effects';
6
6
  import { Client } from 'contensis-delivery-api';
7
- import queryString__default from 'query-string';
7
+ import { stringify, parse } from 'query-string';
8
8
  import { Op, OrderBy, Query } from 'contensis-core-api';
9
9
  import merge from 'deepmerge';
10
10
  import { createSelector } from 'reselect';
@@ -150,11 +150,12 @@ const updateSearchTerm$1 = term => {
150
150
  term
151
151
  };
152
152
  };
153
- const updateSelectedFilters = (filter, key) => {
153
+ const updateSelectedFilters = (filter, key, isUnknownItem = false) => {
154
154
  return {
155
155
  type: UPDATE_SELECTED_FILTERS,
156
156
  filter,
157
- key
157
+ key,
158
+ isUnknownItem
158
159
  };
159
160
  };
160
161
  const updateSortOrder$1 = (orderBy, facet) => {
@@ -218,7 +219,7 @@ const getImmutableOrJS = (state, stateKey, fallbackValue, returnType = globalThi
218
219
  };
219
220
 
220
221
  const getSearchContext = state => getImmutableOrJS(state, ['search', 'context'], Context$1.facets);
221
- const getCurrent = (state, context = Context$1.facets) => context === Context$1.facets ? getCurrentFacet(state) : getCurrentListing(state);
222
+ const getCurrent$1 = (state, context = Context$1.facets) => context === Context$1.facets ? getCurrentFacet(state) : getCurrentListing(state);
222
223
  const getCurrentFacet = state => getImmutableOrJS(state, ['search', 'currentFacet']);
223
224
  const getCurrentListing = state => getImmutableOrJS(state, ['search', 'currentListing']);
224
225
  const getCurrentTab = state => getImmutableOrJS(state, ['search', Context$1.facets, getCurrentFacet(state), 'tabId'], 0);
@@ -237,14 +238,14 @@ const getFacet = (state, facetName = '', context = Context$1.facets, returnType)
237
238
  const currentFacet = facetName || getCurrentFacet(state);
238
239
  return getImmutableOrJS(state, ['search', context, currentFacet], {}, returnType);
239
240
  };
240
- const getListing = (state, listing = '') => {
241
+ const getListing$1 = (state, listing = '') => {
241
242
  const currentListing = listing || getCurrentListing(state);
242
243
  return getImmutableOrJS(state, ['search', Context$1.listings, currentListing], {});
243
244
  };
244
245
  const getFilters = (state, facet, context = Context$1.facets, returnType) => {
245
- return getImmutableOrJS(state, ['search', context, facet || getCurrent(state, context), 'filters'], {}, returnType);
246
+ return getImmutableOrJS(state, ['search', context, facet || getCurrent$1(state, context), 'filters'], {}, returnType);
246
247
  };
247
- 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));
248
+ 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));
248
249
  const getFiltersToLoad = (state, facet, context = Context$1.facets, returnType) => {
249
250
  const filters = getFilters(state, facet, context, returnType);
250
251
  const loadedFilters = Object.entries(filters).map(([key, f = {}]) => [key, (f.items || []).filter(i => {
@@ -260,51 +261,51 @@ const getSelectedFilters = (state, facet = '', context = Context$1.facets, retur
260
261
  const selectedFilters = Object.fromEntries(Object.entries(filters).map(([key, filter = {}]) => [key, (filter.items || []).filter(item => !!(item.isSelected || false)).map(item => {
261
262
  const key = (item === null || item === void 0 ? void 0 : item.key) || '';
262
263
  const isIsoDate = isoDateRegex.test(key);
263
- return isIsoDate ? key : key.toLowerCase();
264
+ return isIsoDate ? key : typeof key.toLowerCase !== 'undefined' ? key.toLowerCase() : key;
264
265
  })]));
265
266
  const fromJS = makeFromJS(returnType);
266
267
  return fromJS(selectedFilters);
267
268
  };
268
269
  const getResults = (state, current = '', context = Context$1.facets, returnType) => {
269
- return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'results'], [], returnType);
270
+ return getImmutableOrJS(state, ['search', context, current || getCurrent$1(state, context), 'results'], [], returnType);
270
271
  };
271
272
  const getIsInternalPaging = (state, current, context = Context$1.facets) => {
272
- return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'queryParams', 'internalPaging'], false);
273
+ return getImmutableOrJS(state, ['search', context, current || getCurrent$1(state, context), 'queryParams', 'internalPaging'], false);
273
274
  };
274
275
  const getIsLoaded = (state, context = Context$1.facets, facet) => {
275
- return !!getImmutableOrJS(state, ['search', context, facet || getCurrent(state, context), 'queryDuration'], 0);
276
+ return !!getImmutableOrJS(state, ['search', context, facet || getCurrent$1(state, context), 'queryDuration'], 0);
276
277
  };
277
- const getIsLoading = (state, context = Context$1.facets, facet) => {
278
- return getImmutableOrJS(state, ['search', context, facet || getCurrent(state, context), 'entries', 'isLoading']);
278
+ const getIsLoading$1 = (state, context = Context$1.facets, facet) => {
279
+ return getImmutableOrJS(state, ['search', context, facet || getCurrent$1(state, context), 'entries', 'isLoading']);
279
280
  };
280
281
  const getIsSsr = state => getImmutableOrJS(state, ['search', 'config', 'ssr'], false);
281
- const getFeaturedResults = (state, current = '', context = Context$1.facets) => {
282
- return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'featuredResults'], []);
282
+ const getFeaturedResults$1 = (state, current = '', context = Context$1.facets, returnType) => {
283
+ return getImmutableOrJS(state, ['search', context, current || getCurrent$1(state, context), 'featuredResults'], [], returnType);
283
284
  };
284
285
  const getPaging = (state, current = '', context = Context$1.facets, returnType) => {
285
- return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'pagingInfo'], {}, returnType);
286
+ return getImmutableOrJS(state, ['search', context, current || getCurrent$1(state, context), 'pagingInfo'], {}, returnType);
286
287
  };
287
- const getPageIndex = (state, current = '', context = Context$1.facets) => {
288
- return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'pagingInfo', 'pageIndex']);
288
+ const getPageIndex$1 = (state, current = '', context = Context$1.facets) => {
289
+ return getImmutableOrJS(state, ['search', context, current || getCurrent$1(state, context), 'pagingInfo', 'pageIndex']);
289
290
  };
290
291
  const getPrevPageIndex = (state, current = '', context = Context$1.facets) => {
291
- return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'pagingInfo', 'prevPageIndex']);
292
+ return getImmutableOrJS(state, ['search', context, current || getCurrent$1(state, context), 'pagingInfo', 'prevPageIndex']);
292
293
  };
293
- const getPageIsLoading = (state, current = '', context = Context$1.facets) => {
294
- return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'pagingInfo', 'isLoading']);
294
+ const getPageIsLoading$1 = (state, current = '', context = Context$1.facets) => {
295
+ return getImmutableOrJS(state, ['search', context, current || getCurrent$1(state, context), 'pagingInfo', 'isLoading']);
295
296
  };
296
297
  const getPagesLoaded = (state, current = '', context = Context$1.facets) => {
297
- return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'pagingInfo', 'pagesLoaded'], [], 'js');
298
+ return getImmutableOrJS(state, ['search', context, current || getCurrent$1(state, context), 'pagingInfo', 'pagesLoaded'], [], 'js');
298
299
  };
299
300
  const getTotalCount = (state, current = '', context = Context$1.facets) => {
300
- return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'pagingInfo', 'totalCount']);
301
+ return getImmutableOrJS(state, ['search', context, current || getCurrent$1(state, context), 'pagingInfo', 'totalCount']);
301
302
  };
302
- const getSearchTerm = state => getImmutableOrJS(state, ['search', 'term']);
303
+ const getSearchTerm$1 = state => getImmutableOrJS(state, ['search', 'term']);
303
304
  const getSearchTabs = (state, returnType) => getImmutableOrJS(state, ['search', 'tabs'], [], returnType);
304
305
  const getQueryParams = (state, current = '', context = Context$1.facets) => {
305
- return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'queryParams'], {}, 'js');
306
+ return getImmutableOrJS(state, ['search', context, current || getCurrent$1(state, context), 'queryParams'], {}, 'js');
306
307
  };
307
- const getQueryParameter = ({
308
+ const getQueryParameter$1 = ({
308
309
  state,
309
310
  facet,
310
311
  context = Context$1.facets
@@ -312,10 +313,10 @@ const getQueryParameter = ({
312
313
  return getImmutableOrJS(getQueryParams(state, facet, context), key, ifnull, 'js');
313
314
  };
314
315
  const getCustomApi = (state, current, context = Context$1.facets, returnType) => {
315
- return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'customApi'], null, returnType);
316
+ return getImmutableOrJS(state, ['search', context, current || getCurrent$1(state, context), 'customApi'], null, returnType);
316
317
  };
317
318
  const getCustomEnv = (state, current, context = Context$1.facets) => {
318
- return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'env']);
319
+ return getImmutableOrJS(state, ['search', context, current || getCurrent$1(state, context), 'env']);
319
320
  };
320
321
  const getTabsAndFacets = (state, returnType) => {
321
322
  const tabs = getSearchTabs(state, 'js');
@@ -361,69 +362,70 @@ const selectFacets = {
361
362
  getFacetTitles,
362
363
  getFacets,
363
364
  getFacetsTotalCount,
364
- getFeaturedResults,
365
+ getFeaturedResults: getFeaturedResults$1,
365
366
  getFilters,
366
367
  getFiltersToLoad,
367
368
  getIsLoaded,
368
- getIsLoading,
369
- getPageIndex,
370
- getPageIsLoading,
369
+ getIsLoading: getIsLoading$1,
370
+ getPageIndex: getPageIndex$1,
371
+ getPageIsLoading: getPageIsLoading$1,
371
372
  getPagesLoaded,
372
373
  getPaging,
373
374
  getQueryParams: (state, facet) => getQueryParams(state, facet, Context$1.facets),
374
375
  getQueryParameter: ({
375
376
  state,
376
377
  facet
377
- }, key, ifnull) => getQueryParameter({
378
+ }, key, ifnull) => getQueryParameter$1({
378
379
  state,
379
380
  facet,
380
381
  context: Context$1.facets
381
382
  }, key, ifnull),
382
- getRenderableFilters,
383
+ getRenderableFilters: getRenderableFilters$1,
383
384
  getResults,
384
385
  getTabFacets,
385
386
  getTabsAndFacets,
386
387
  getTotalCount,
387
388
  getSearchTabs,
388
- getSearchTerm,
389
+ getSearchTerm: getSearchTerm$1,
389
390
  getSearchTotalCount,
390
391
  getSelectedFilters
391
392
  }; // An exported copy of the relevant selectors pre-scoped to a listing context
392
393
 
393
394
  const selectListing = {
394
395
  getCurrent: getCurrentListing,
395
- getFeaturedResults: (state, listing = '') => getFeaturedResults(state, listing, Context$1.listings),
396
- getFilters: (state, listing = '') => getFilters(state, listing, Context$1.listings),
396
+ getFeaturedResults: (state, listing = '') => getFeaturedResults$1(state, listing, Context$1.listings, 'js'),
397
+ getFilters: (state, listing = '') => getFilters(state, listing, Context$1.listings, 'js'),
397
398
  getFiltersToLoad: (state, listing = '') => getFiltersToLoad(state, listing, Context$1.listings),
398
- getListing,
399
+ getListing: getListing$1,
399
400
  getIsLoaded: state => getIsLoaded(state, Context$1.listings),
400
- getIsLoading: state => getIsLoading(state, Context$1.listings),
401
- getPageIndex: (state, listing = '') => getPageIndex(state, listing, Context$1.listings),
402
- getPaging: (state, listing = '') => getPaging(state, listing, Context$1.listings),
403
- getPageIsLoading: (state, listing = '') => getPageIsLoading(state, listing, Context$1.listings),
401
+ getIsLoading: state => getIsLoading$1(state, Context$1.listings),
402
+ getPageIndex: (state, listing = '') => getPageIndex$1(state, listing, Context$1.listings),
403
+ getPaging: (state, listing = '') => getPaging(state, listing, Context$1.listings, 'js'),
404
+ getPageIsLoading: (state, listing = '') => getPageIsLoading$1(state, listing, Context$1.listings),
404
405
  getPagesLoaded: (state, listing = '') => getPagesLoaded(state, listing, Context$1.listings),
405
406
  getQueryParams: (state, listing = '') => getQueryParams(state, listing, Context$1.listings),
406
407
  getQueryParameter: ({
407
408
  state,
408
409
  facet
409
- }, key, ifnull) => getQueryParameter({
410
+ }, key, ifnull) => getQueryParameter$1({
410
411
  state,
411
412
  facet,
412
413
  context: Context$1.listings
413
414
  }, key, ifnull),
414
- getRenderableFilters: (state, listing = '') => getRenderableFilters(state, listing, Context$1.listings),
415
- getResults: (state, listing = '') => getResults(state, listing, Context$1.listings),
416
- getSearchTerm,
415
+ getRenderableFilters: (state, listing = '') => getRenderableFilters$1(state, listing, Context$1.listings),
416
+ getResults: (state, listing = '') => getResults(state, listing, Context$1.listings, 'js'),
417
+ getSearchTerm: getSearchTerm$1,
417
418
  getTotalCount: (state, listing = '') => getTotalCount(state, listing, Context$1.listings),
418
- getSelectedFilters: (state, listing = '') => getSelectedFilters(state, listing, Context$1.listings)
419
+ getSelectedFilters: (state, listing = '') => getSelectedFilters(state, listing, Context$1.listings, 'js')
419
420
  };
420
421
  const selectCurrentPath = state => getImmutableOrJS(state, ['routing', 'currentPath']);
422
+ const selectCurrentProject = state => getImmutableOrJS(state, ['routing', 'currentProject']);
421
423
  const selectVersionStatus = state => getImmutableOrJS(state, ['version', 'contensisVersionStatus']);
422
424
 
423
425
  var selectors = /*#__PURE__*/Object.freeze({
424
426
  __proto__: null,
425
427
  getSearchContext: getSearchContext,
426
- getCurrent: getCurrent,
428
+ getCurrent: getCurrent$1,
427
429
  getCurrentFacet: getCurrentFacet,
428
430
  getCurrentListing: getCurrentListing,
429
431
  getCurrentTab: getCurrentTab,
@@ -431,27 +433,27 @@ var selectors = /*#__PURE__*/Object.freeze({
431
433
  getTabFacets: getTabFacets,
432
434
  getFacetTitles: getFacetTitles,
433
435
  getFacet: getFacet,
434
- getListing: getListing,
436
+ getListing: getListing$1,
435
437
  getFilters: getFilters,
436
- getRenderableFilters: getRenderableFilters,
438
+ getRenderableFilters: getRenderableFilters$1,
437
439
  getFiltersToLoad: getFiltersToLoad,
438
440
  getSelectedFilters: getSelectedFilters,
439
441
  getResults: getResults,
440
442
  getIsInternalPaging: getIsInternalPaging,
441
443
  getIsLoaded: getIsLoaded,
442
- getIsLoading: getIsLoading,
444
+ getIsLoading: getIsLoading$1,
443
445
  getIsSsr: getIsSsr,
444
- getFeaturedResults: getFeaturedResults,
446
+ getFeaturedResults: getFeaturedResults$1,
445
447
  getPaging: getPaging,
446
- getPageIndex: getPageIndex,
448
+ getPageIndex: getPageIndex$1,
447
449
  getPrevPageIndex: getPrevPageIndex,
448
- getPageIsLoading: getPageIsLoading,
450
+ getPageIsLoading: getPageIsLoading$1,
449
451
  getPagesLoaded: getPagesLoaded,
450
452
  getTotalCount: getTotalCount,
451
- getSearchTerm: getSearchTerm,
453
+ getSearchTerm: getSearchTerm$1,
452
454
  getSearchTabs: getSearchTabs,
453
455
  getQueryParams: getQueryParams,
454
- getQueryParameter: getQueryParameter,
456
+ getQueryParameter: getQueryParameter$1,
455
457
  getCustomApi: getCustomApi,
456
458
  getCustomEnv: getCustomEnv,
457
459
  getTabsAndFacets: getTabsAndFacets,
@@ -460,12 +462,12 @@ var selectors = /*#__PURE__*/Object.freeze({
460
462
  selectFacets: selectFacets,
461
463
  selectListing: selectListing,
462
464
  selectCurrentPath: selectCurrentPath,
465
+ selectCurrentProject: selectCurrentProject,
463
466
  selectVersionStatus: selectVersionStatus
464
467
  });
465
468
 
466
469
  // eslint-disable-next-line import/default
467
470
 
468
- /* eslint-disable @typescript-eslint/naming-convention */
469
471
  const withSearch = mappers => SearchComponent => {
470
472
  const Wrapper = props => {
471
473
  return /*#__PURE__*/React.createElement(SearchComponent, props);
@@ -476,22 +478,23 @@ const withSearch = mappers => SearchComponent => {
476
478
  const mapStateToProps = state => {
477
479
  return {
478
480
  currentFacet: getCurrentFacet(state),
479
- currentPageIndex: getPageIndex(state),
481
+ currentPageIndex: getPageIndex$1(state),
480
482
  currentTabIndex: getCurrentTab(state),
481
483
  facet: getFacet(state),
482
484
  facets: getTabFacets(state),
483
485
  facetsTotalCount: getFacetsTotalCount(state),
484
486
  facetTitles: getFacetTitles(state),
485
- featuredResults: getFeaturedResults(state),
486
- filters: getRenderableFilters(state),
487
- isLoading: getIsLoading(state),
487
+ featuredResults: getFeaturedResults$1(state),
488
+ filters: getRenderableFilters$1(state),
489
+ isLoading: getIsLoading$1(state),
488
490
  paging: getPaging(state),
489
- pageIsLoading: getPageIsLoading(state),
491
+ pageIsLoading: getPageIsLoading$1(state),
490
492
  results: getResults(state),
491
493
  resultsInfo: (mappers === null || mappers === void 0 ? void 0 : mappers.resultsInfo) && mappers.resultsInfo(state),
492
- searchTerm: getSearchTerm(state),
494
+ searchTerm: getSearchTerm$1(state),
493
495
  searchTotalCount: getSearchTotalCount(state),
494
- sortOrder: getQueryParameter({
496
+ selectedFilters: getSelectedFilters(state),
497
+ sortOrder: getQueryParameter$1({
495
498
  state
496
499
  }, 'dynamicOrderBy', []),
497
500
  tabsAndFacets: getTabsAndFacets(state),
@@ -505,7 +508,7 @@ const withSearch = mappers => SearchComponent => {
505
508
  updateCurrentTab: id => withMappers(updateCurrentTab$1(id), mappers),
506
509
  updatePageIndex: pageIndex => withMappers(updatePageIndex$1(pageIndex), mappers),
507
510
  updateSearchTerm: term => withMappers(updateSearchTerm$1(term), mappers),
508
- updateSelectedFilters: (filter, key) => withMappers(updateSelectedFilters(filter, key), mappers),
511
+ updateSelectedFilters: (filter, key, isUnknownItem = false) => withMappers(updateSelectedFilters(filter, key, isUnknownItem), mappers),
509
512
  updateSortOrder: orderBy => withMappers(updateSortOrder$1(orderBy), mappers)
510
513
  };
511
514
  const connector = connect(mapStateToProps, mapDispatchToProps);
@@ -545,6 +548,7 @@ const withListing = mappers => ListingComponent => {
545
548
  results: getResults(state),
546
549
  resultsInfo: mappers && typeof mappers.resultsInfo === 'function' && mappers.resultsInfo(state),
547
550
  searchTerm: getSearchTerm(state),
551
+ selectedFilters: getSelectedFilters(state),
548
552
  sortOrder: getQueryParameter({
549
553
  state
550
554
  }, 'dynamicOrderBy', [])
@@ -556,7 +560,7 @@ const withListing = mappers => ListingComponent => {
556
560
  updateCurrentFacet: facet => withMappers(updateCurrentFacet$1(facet), mappers),
557
561
  updatePageIndex: pageIndex => withMappers(updatePageIndex$1(pageIndex), mappers),
558
562
  updateSearchTerm: term => withMappers(updateSearchTerm$1(term), mappers),
559
- updateSelectedFilters: (filter, key) => withMappers(updateSelectedFilters(filter, key), mappers),
563
+ updateSelectedFilters: (filter, key, isUnknownItem = false) => withMappers(updateSelectedFilters(filter, key, isUnknownItem), mappers),
560
564
  updateSortOrder: orderBy => withMappers(updateSortOrder$1(orderBy), mappers)
561
565
  };
562
566
  return connect(mapStateToProps, mapDispatchToProps)(toJS$1(Wrapper));
@@ -768,7 +772,7 @@ const extractQuotedPhrases = searchTerm => {
768
772
  return (searchTerm.match(pattern) || []).map(match => match.replace(/"/g, ''));
769
773
  };
770
774
  const buildUrl = (route, params) => {
771
- const qs = queryString__default.stringify(params);
775
+ const qs = stringify(params);
772
776
  const path = qs ? `${route}?${qs}` : route;
773
777
  return path;
774
778
  };
@@ -844,12 +848,12 @@ const Fields = {
844
848
  };
845
849
 
846
850
  const fieldExpression = (field, value, operator = 'equalTo', weight) => {
847
- if (!field || !value) return [];
851
+ if (!field || !value || Array.isArray(value) && value.length === 0) return [];
848
852
  if (Array.isArray(field)) // If an array of fieldIds have been provided, call self for each fieldId
849
853
  // to generate expressions that are combined with an 'or' operator
850
854
  return [Op.or(...field.map(fieldId => fieldExpression(fieldId, value, operator, weight)).flat())];
851
855
  if (operator === 'between') return between(field, value);
852
- if (Array.isArray(value)) return equalToOrIn(field, value, operator);else return !weight ? [Op[operator](field, value, undefined, undefined)] : [Op[operator](field, value, undefined, undefined).weight(weight)];
856
+ if (Array.isArray(value)) return equalToOrIn(field, value, operator);else return !weight ? equalToOrIn(field, value, operator) : [equalToOrIn(field, value, operator)[0].weight(weight)];
853
857
  };
854
858
  const contentTypeIdExpression = (contentTypeIds, webpageTemplates, assetTypes) => {
855
859
  const expressions = [];
@@ -873,8 +877,17 @@ const contentTypeIdExpression = (contentTypeIds, webpageTemplates, assetTypes) =
873
877
  const filterExpressions = filters => {
874
878
  if (!filters) return [];
875
879
  const expressions = [];
876
- filters.map(param => {
877
- expressions.push(...fieldExpression(param.key, param.value, param.operator || 'in'));
880
+ filters.map(selectedFilter => {
881
+ if (selectedFilter.logicOperator === 'and') // using 'and' logic operator we loop through each filter
882
+ // and loop through all values to add an expression for each filter value
883
+ selectedFilter.values.forEach(value => expressions.push(...fieldExpression(selectedFilter.key, value, selectedFilter.fieldOperator || 'equalTo')));else if (selectedFilter.logicOperator === 'not') {
884
+ const fieldExpressions = fieldExpression(selectedFilter.key, selectedFilter.values, selectedFilter.fieldOperator || 'in');
885
+ fieldExpressions.forEach(expr => {
886
+ expressions.push(Op.not(expr));
887
+ });
888
+ } // using 'or' logic operator we loop over each filter
889
+ // and simply add the array of values to an expression with an 'in' operator
890
+ else expressions.push(...fieldExpression(selectedFilter.key, selectedFilter.values, selectedFilter.fieldOperator || 'in'));
878
891
  });
879
892
  return expressions;
880
893
  };
@@ -891,8 +904,8 @@ const dataFormatExpression = (contentTypeIds, dataFormat = DataFormats.entry) =>
891
904
  const withExpr = fieldExpression(Fields.sys.contentTypeId, withContentTypeIds)[0];
892
905
  const notExpr = Op.not(fieldExpression(Fields.sys.contentTypeId, notContentTypeIds)[0]);
893
906
  andExpr.add(dataFormatExpr);
894
- if (withContentTypeIds.length > 0) andExpr.add(withExpr);
895
- if (notContentTypeIds.length > 0) andExpr.add(notExpr);
907
+ if (withContentTypeIds.length > 0 && withExpr) andExpr.add(withExpr);
908
+ if (notContentTypeIds.length > 0 && notExpr) andExpr.add(notExpr);
896
909
  return [andExpr];
897
910
  }
898
911
 
@@ -948,19 +961,48 @@ const equalToOrIn = (field, value, operator = 'equalTo') => {
948
961
  if (value.length === 0) return [];
949
962
 
950
963
  if (Array.isArray(value)) {
951
- if (value.length === 1) return [Op[operator](field, value[0], undefined, undefined)];
952
- return [Op.in(field, ...value)];
964
+ if (operator === 'equalTo' || operator === 'in') return [Op.in(field, ...value)];
965
+ return [Op.or(...value.map(innerValue => {
966
+ switch (operator) {
967
+ case 'between':
968
+ case 'distanceWithin':
969
+ // Not implemented
970
+ return Op.equalTo(field, innerValue);
971
+
972
+ case 'exists':
973
+ return Op.exists(field, innerValue);
974
+
975
+ case 'freeText':
976
+ // TODO: Potentially needs further implementation of new options
977
+ return Op[operator](field, innerValue, false, undefined);
978
+
979
+ default:
980
+ return Op[operator](field, innerValue);
981
+ }
982
+ }))];
953
983
  }
954
984
 
955
- return [];
985
+ switch (operator) {
986
+ case 'between':
987
+ case 'distanceWithin':
988
+ // Not implemented
989
+ return [Op.equalTo(field, value)];
990
+
991
+ case 'freeText':
992
+ // TODO: Potentially needs further implementation of new options
993
+ return [Op[operator](field, value, false, undefined)];
994
+
995
+ default:
996
+ return [Op[operator](field, value)];
997
+ }
956
998
  };
957
999
 
958
1000
  const between = (field, value) => {
959
1001
  const handle = betweenValue => {
960
- const valArr = betweenValue.split('-');
1002
+ const valArr = betweenValue.split('--');
961
1003
 
962
1004
  if (valArr.length > 1) {
963
- const [minimum, maximum = null] = betweenValue.split('-');
1005
+ const [minimum, maximum] = valArr;
964
1006
  return Op.between(field, minimum, maximum);
965
1007
  } else {
966
1008
  // eslint-disable-next-line no-console
@@ -970,10 +1012,9 @@ const between = (field, value) => {
970
1012
  };
971
1013
 
972
1014
  if (value.length === 0) return [];
973
- if (Array.isArray(value)) return [Op.or(...value.map(handle).filter(bc => bc !== false))]; // const valArr = value.split('-');
974
-
1015
+ if (Array.isArray(value)) return [Op.or(...value.map(handle).filter(bc => bc !== false))];
975
1016
  const op = handle(value);
976
- return op ? [op] : []; // valArr.length > 1 ? [Op.between(field, ...value.split('-'))] : [];
1017
+ return op ? [op] : [];
977
1018
  };
978
1019
  /**
979
1020
  * Accept HTTP style objects and map them to
@@ -1016,7 +1057,7 @@ const customWhereExpressions = where => {
1016
1057
  // the second property inside the clause
1017
1058
 
1018
1059
  if (notIdx === 1) {
1019
- expression = Op.not(Op[innerOperator](innerField, innerValue));
1060
+ expression = innerOperator === 'between' ? Op.not(Op[innerOperator](innerField, innerValue[0], innerValue[1])) : Op.not(Op[innerOperator](innerField, innerValue));
1020
1061
  }
1021
1062
  });
1022
1063
  }
@@ -1028,8 +1069,9 @@ const customWhereExpressions = where => {
1028
1069
 
1029
1070
  if (idx === 1 && // operator !== 'and' &&
1030
1071
  // operator !== 'or' &&
1031
- operator !== 'between' && operator !== 'distanceWithin') {
1032
- expression = operator === 'freeText' || operator === 'contains' ? Op[operator](field, value) : operator === 'in' ? Op[operator](field, ...value) : Op[operator](field, value);
1072
+ // operator !== 'between' &&
1073
+ operator !== 'distanceWithin') {
1074
+ expression = operator === 'freeText' || operator === 'contains' ? Op[operator](field, value) : operator === 'in' ? Op[operator](field, ...value) : operator === 'exists' ? Op[operator](field, value) : operator === 'between' ? Op[operator](field, value[0], value[1]) : Op[operator](field, value);
1033
1075
  if (typeof weight === 'number') expression = expression.weight(weight);
1034
1076
  }
1035
1077
  });
@@ -1159,20 +1201,16 @@ const searchUriTemplate = {
1159
1201
 
1160
1202
  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(',')]));
1161
1203
  const currentSearch = !term && getImmutableOrJS(state, ['routing', 'location', 'search']);
1162
- const currentQs = removeEmptyAttributes(queryString__default.parse(currentSearch));
1204
+ const currentQs = removeEmptyAttributes(parse(currentSearch));
1163
1205
  if (orderBy) currentQs.orderBy = orderBy;
1164
- const searchTerm = getSearchTerm(state); // Use Immutable's merge to merge the stateFilters with any current Qs
1165
- // to build the new Qs.
1206
+ const searchTerm = getSearchTerm$1(state); // Merge the stateFilters with any current qs to build the new qs
1166
1207
 
1167
1208
  const mergedSearch = removeEmptyAttributes({ ...merge(currentQs, stateFilters),
1168
1209
  term: searchTerm
1169
1210
  });
1170
- return queryString__default.stringify(mergedSearch);
1211
+ return stringify(mergedSearch);
1171
1212
  },
1172
- hash: {
1173
- $path: 'state',
1174
- $formatting: state => getImmutableOrJS(state, ['routing', 'location', 'hash'], '').replace('#', '')
1175
- }
1213
+ hash: state => getImmutableOrJS(state, ['routing', 'location', 'hash'], '').replace('#', '')
1176
1214
  };
1177
1215
 
1178
1216
  const mapStateToSearchUri = params => mapJson(params, searchUriTemplate);
@@ -1317,14 +1355,15 @@ const filterTemplate = {
1317
1355
  const filterExpressionMapper = {
1318
1356
  // Expression type: so we can identify how to build the query
1319
1357
  expressionType: ({
1320
- filter
1321
- }) => filter.contentTypeId ? FilterExpressionTypes.contentType : FilterExpressionTypes.field,
1358
+ contentTypeId
1359
+ }) => contentTypeId ? FilterExpressionTypes.contentType : FilterExpressionTypes.field,
1322
1360
  // Key: so we can target the query to a specific field
1323
- key: 'filter.fieldId',
1361
+ key: 'fieldId',
1324
1362
  // Value: so we can filter a specific field by an array of values
1325
1363
  // e.g. taxonomy key or contentTypeId array
1326
- value: 'selectedValue',
1327
- operator: 'filter.fieldOperator'
1364
+ values: 'selectedValues',
1365
+ fieldOperator: 'fieldOperator',
1366
+ logicOperator: 'logicOperator'
1328
1367
  };
1329
1368
 
1330
1369
  const mapFilterToFilterExpression = filter => mapJson(filter, filterExpressionMapper);
@@ -1334,18 +1373,15 @@ const mapFiltersToFilterExpression = (filters, selectedFilters) => {
1334
1373
  const filterExpressions = []; // Iterate through the keys in selectedFilters and locate
1335
1374
  // the items that are selected and queryable
1336
1375
 
1337
- Object.entries(selectedFilters).map(([fkey, selectedValue]) => {
1376
+ Object.entries(selectedFilters).map(([fkey, selectedValues]) => {
1338
1377
  const filter = filters[fkey];
1339
1378
 
1340
- if (selectedValue && filter) {
1341
- const selectedItems = filter.items && filter.items.filter(itm => itm.isSelected) || []; // Where we have a value for a selectedFilter
1379
+ if (selectedValues && filter) {
1380
+ // Where we have a value for a selectedFilter
1342
1381
  // and a filter is found for the current key
1343
1382
  // map the filter to a filterExpression object
1344
-
1345
- const expr = mapFilterToFilterExpression({
1346
- filter,
1347
- selectedItems,
1348
- selectedValue
1383
+ const expr = mapFilterToFilterExpression({ ...filter,
1384
+ selectedValues
1349
1385
  });
1350
1386
  filterExpressions.push(expr);
1351
1387
  }
@@ -1354,10 +1390,10 @@ const mapFiltersToFilterExpression = (filters, selectedFilters) => {
1354
1390
  };
1355
1391
 
1356
1392
  const queryParamsTemplate = {
1357
- assetTypes: root => getQueryParameter(root, 'assetTypes', []),
1358
- contentTypeIds: root => getQueryParameter(root, 'contentTypeIds', []),
1359
- customWhere: root => getQueryParameter(root, 'customWhere', []),
1360
- dynamicOrderBy: root => getQueryParameter(root, 'dynamicOrderBy', []),
1393
+ assetTypes: root => getQueryParameter$1(root, 'assetTypes', []),
1394
+ contentTypeIds: root => getQueryParameter$1(root, 'contentTypeIds', []),
1395
+ customWhere: root => getQueryParameter$1(root, 'customWhere', []),
1396
+ dynamicOrderBy: root => getQueryParameter$1(root, 'dynamicOrderBy', []),
1361
1397
  env: ({
1362
1398
  state,
1363
1399
  facet,
@@ -1372,8 +1408,8 @@ const queryParamsTemplate = {
1372
1408
  if (excludeIds) return Array.isArray(excludeIds) ? excludeIds : excludeIds.split(',').map(id => id.trim());
1373
1409
  return null;
1374
1410
  },
1375
- featuredResults: root => getQueryParameter(root, 'featuredResults', null),
1376
- fields: root => getQueryParameter(root, 'fields', []),
1411
+ featuredResults: root => getQueryParameter$1(root, 'featuredResults', null),
1412
+ fields: root => getQueryParameter$1(root, 'fields', []),
1377
1413
  filters: ({
1378
1414
  state,
1379
1415
  facet,
@@ -1385,28 +1421,28 @@ const queryParamsTemplate = {
1385
1421
  const filterParams = mapFiltersToFilterExpression(stateFilters, selectedFilters);
1386
1422
  return filterParams;
1387
1423
  },
1388
- includeInSearchFields: root => getQueryParameter(root, 'includeInSearch', []),
1424
+ includeInSearchFields: root => getQueryParameter$1(root, 'includeInSearch', []),
1389
1425
  internalPageIndex: ({
1390
1426
  action,
1391
1427
  state
1392
- }) => getPageIndex(state, '', action.context),
1393
- internalPaging: root => getQueryParameter(root, 'internalPaging', false),
1428
+ }) => getPageIndex$1(state, '', action.context),
1429
+ internalPaging: root => getQueryParameter$1(root, 'internalPaging', false),
1394
1430
  languages: ({
1395
1431
  action
1396
1432
  }) => action.defaultLang ? [action.defaultLang] : [],
1397
- linkDepth: root => getQueryParameter(root, 'linkDepth', 0),
1398
- loadMorePaging: root => getQueryParameter(root, 'loadMorePaging', false),
1399
- orderBy: root => getQueryParameter(root, 'orderBy', []),
1433
+ linkDepth: root => getQueryParameter$1(root, 'linkDepth', 0),
1434
+ loadMorePaging: root => getQueryParameter$1(root, 'loadMorePaging', false),
1435
+ orderBy: root => getQueryParameter$1(root, 'orderBy', []),
1400
1436
  pageIndex: root => {
1401
1437
  const {
1402
1438
  action,
1403
1439
  state
1404
1440
  } = root;
1405
- if (getQueryParameter(root, 'internalPaging', false)) return 0;
1441
+ if (getQueryParameter$1(root, 'internalPaging', false)) return 0;
1406
1442
  if (action.type === UPDATE_PAGE_INDEX) return action.params.pageIndex;
1407
- return !action.preload ? getPageIndex(state, '', action.context) : 0;
1443
+ return !action.preload ? getPageIndex$1(state, action.facet, action.context) : 0;
1408
1444
  },
1409
- pageSize: root => getQueryParameter(root, 'pageSize'),
1445
+ pageSize: root => getQueryParameter$1(root, 'pageSize'),
1410
1446
  pagesLoaded: ({
1411
1447
  state,
1412
1448
  facet,
@@ -1424,9 +1460,9 @@ const queryParamsTemplate = {
1424
1460
  }) => {
1425
1461
  var _getFacet;
1426
1462
 
1427
- return (_getFacet = getFacet(state, facet, context)) === null || _getFacet === void 0 ? void 0 : _getFacet.projectId;
1463
+ return ((_getFacet = getFacet(state, facet, context)) === null || _getFacet === void 0 ? void 0 : _getFacet.projectId) || selectCurrentProject(state);
1428
1464
  },
1429
- searchTerm: root => root.context !== Context$1.minilist || getQueryParameter(root, 'useSearchTerm', false) ? getSearchTerm(root.state) : '',
1465
+ searchTerm: root => root.context !== Context$1.minilist || getQueryParameter$1(root, 'useSearchTerm', false) ? getSearchTerm$1(root.state) : '',
1430
1466
  selectedFilters: ({
1431
1467
  state,
1432
1468
  facet,
@@ -1436,11 +1472,11 @@ const queryParamsTemplate = {
1436
1472
  state
1437
1473
  }) => selectVersionStatus(state),
1438
1474
  weightedSearchFields: root => {
1439
- const wsf = getQueryParameter(root, 'weightedSearchFields', []);
1475
+ const wsf = getQueryParameter$1(root, 'weightedSearchFields', []);
1440
1476
  const deduped = wsf.filter((v, i, a) => a.findIndex(t => t.fieldId === v.fieldId) === i);
1441
1477
  return deduped; // return wsf;
1442
1478
  },
1443
- webpageTemplates: root => getQueryParameter(root, 'webpageTemplates', [])
1479
+ webpageTemplates: root => getQueryParameter$1(root, 'webpageTemplates', [])
1444
1480
  };
1445
1481
 
1446
1482
  const mapStateToQueryParams = sourceJson => mapJson(sourceJson, queryParamsTemplate);
@@ -1486,8 +1522,8 @@ const runSearch = (action, state, queryParams) => {
1486
1522
  const facetIsLoaded = defaultLang ? false : getIsLoaded(state, context, facet);
1487
1523
  const stateParams = { ...getQueryParams(ogState, facet, context)
1488
1524
  };
1489
- stateParams.pageIndex = getPageIndex(ogState, facet, context);
1490
- stateParams.searchTerm = getSearchTerm(ogState);
1525
+ stateParams.pageIndex = getPageIndex$1(ogState, facet, context);
1526
+ stateParams.searchTerm = getSearchTerm$1(ogState);
1491
1527
 
1492
1528
  if (context === Context$1.facets && ssr || // context === Context.minilist ||
1493
1529
  preload || !facetIsLoaded || filterParamsChanged(action) || defaultLang) {
@@ -1538,9 +1574,10 @@ const filterParamsChanged = (action, state) => {
1538
1574
  const debugExecuteSearch = (action, state) => {
1539
1575
  const [queryParams, runSearch] = generateQueryParams(action, state);
1540
1576
  console.log('runSearch', runSearch, 'action', action, 'filterParamsChanged', filterParamsChanged(action, state), 'getIsLoaded(state, context, facet)', getIsLoaded(state, action.context, action.facet));
1541
- const stateParams = getQueryParams(action.ogState || state, action.facet, action.context);
1542
- stateParams.pageIndex = getPageIndex(action.ogState || state, action.facet, action.context);
1543
- stateParams.searchTerm = getSearchTerm(action.ogState || state);
1577
+ const stateParams = { ...getQueryParams(action.ogState || state, action.facet, action.context),
1578
+ pageIndex: getPageIndex$1(action.ogState || state, action.facet, action.context),
1579
+ searchTerm: getSearchTerm$1(action.ogState || state)
1580
+ };
1544
1581
  console.log(stateParams, queryParams);
1545
1582
  console.log('getSelectedFilters', getSelectedFilters(action.ogState || state, action.facet, action.context, 'js'), 'params', action.params);
1546
1583
  };
@@ -1605,14 +1642,20 @@ function* setRouteFilters(action) {
1605
1642
  ssr,
1606
1643
  debug
1607
1644
  };
1608
- yield put(nextAction); // Using call instead of triggering from the put
1645
+ yield put(nextAction); // keep track of this state ref for comparing changes to params later
1646
+
1647
+ const ogState = {
1648
+ search: state.search
1649
+ }; // Using call instead of triggering from the put
1609
1650
  // to allow this exported saga to continue during SSR
1610
1651
 
1611
1652
  yield call(ensureSearch, { ...nextAction,
1612
- ogState: state
1653
+ ogState
1613
1654
  });
1614
1655
  }
1615
1656
  function* doSearch(action) {
1657
+ var _action$params;
1658
+
1616
1659
  const state = toJS(yield select());
1617
1660
 
1618
1661
  if (action.config) {
@@ -1625,12 +1668,20 @@ function* doSearch(action) {
1625
1668
 
1626
1669
  const nextAction = { ...action,
1627
1670
  type: SET_SEARCH_FILTERS,
1628
- ssr: getIsSsr(state)
1671
+ ssr: getIsSsr(state),
1672
+ facet: action.facet || ((_action$params = action.params) === null || _action$params === void 0 ? void 0 : _action$params.facet)
1629
1673
  };
1630
- yield put(nextAction);
1631
- yield call(ensureSearch, { ...nextAction,
1632
- ogState: state
1633
- });
1674
+
1675
+ if (nextAction.facet && (action.config || Object.keys(getFacet(state, nextAction.facet, action.context, 'js')).length > 0)) {
1676
+ yield put(nextAction); // keep track of this state ref for comparing changes to params later
1677
+
1678
+ const ogState = {
1679
+ search: state.search
1680
+ };
1681
+ yield call(ensureSearch, { ...nextAction,
1682
+ ogState
1683
+ });
1684
+ }
1634
1685
  }
1635
1686
 
1636
1687
  function* loadFilters(action) {
@@ -1728,7 +1779,9 @@ function* ensureSearch(action) {
1728
1779
  try {
1729
1780
  const state = yield select();
1730
1781
  const nextAction = { ...action,
1731
- ogState: action.ogState || state
1782
+ ogState: action.ogState || {
1783
+ search: state.search
1784
+ }
1732
1785
  };
1733
1786
  const [queryParams, runSearch] = generateQueryParams(nextAction, state);
1734
1787
  if (debug && (debug === true || debug.executeSearch)) debugExecuteSearch(nextAction, state);
@@ -1868,7 +1921,7 @@ function* updateCurrentFacet(action) {
1868
1921
  facet,
1869
1922
  mappers
1870
1923
  } = action;
1871
- const pageIndex = yield select(getPageIndex, facet);
1924
+ const pageIndex = yield select(getPageIndex$1, facet);
1872
1925
  const uri = yield buildUri({
1873
1926
  facet,
1874
1927
  pageIndex
@@ -1926,7 +1979,7 @@ function* buildUri({
1926
1979
  term
1927
1980
  }, mappers) {
1928
1981
  const state = yield select();
1929
- const mapUri = mappers && mappers.navigate || mapStateToSearchUri;
1982
+ const mapUri = (mappers === null || mappers === void 0 ? void 0 : mappers.navigate) || mapStateToSearchUri;
1930
1983
  const uri = mapUri({
1931
1984
  state,
1932
1985
  facet,
@@ -1938,13 +1991,98 @@ function* buildUri({
1938
1991
  return `${uri.path}${uri.search && `?${uri.search}` || ''}${uri.hash && `#${uri.hash}` || ''}`;
1939
1992
  }
1940
1993
 
1994
+ var defaultMappers = {
1995
+ results: entries => entries,
1996
+ navigate: mapStateToSearchUri
1997
+ };
1998
+
1999
+ const {
2000
+ getCurrent,
2001
+ getFeaturedResults,
2002
+ getIsLoading,
2003
+ getListing,
2004
+ getPageIndex,
2005
+ getPageIsLoading,
2006
+ getQueryParameter,
2007
+ getRenderableFilters,
2008
+ getSearchTerm
2009
+ } = selectListing;
2010
+
2011
+ const makeSelectListingProps = () => createSelector(state => state, (_, mappers) => mappers, (state, mappers) => ({
2012
+ currentListing: getCurrent(state),
2013
+ currentPageIndex: getPageIndex(state),
2014
+ listing: getListing(state),
2015
+ featured: getFeaturedResults(state),
2016
+ filters: getRenderableFilters(state),
2017
+ isLoading: getIsLoading(state),
2018
+ pageIsLoading: getPageIsLoading(state),
2019
+ paging: getPaging(state, '', Context$1.listings, 'js'),
2020
+ results: getResults(state, '', Context$1.listings, 'js'),
2021
+ resultsInfo: mappers && typeof mappers.resultsInfo === 'function' && mappers.resultsInfo(state),
2022
+ searchTerm: getSearchTerm(state),
2023
+ selectedFilters: getSelectedFilters(state, '', Context$1.listings, 'js'),
2024
+ sortOrder: getQueryParameter({
2025
+ state
2026
+ }, 'dynamicOrderBy', [])
2027
+ }));
2028
+
2029
+ const useListing = ({
2030
+ mappers
2031
+ } = {
2032
+ id: ''
2033
+ }) => {
2034
+ const dispatch = useDispatch();
2035
+ const m = mappers || defaultMappers;
2036
+ const selectListingProps = useMemo(makeSelectListingProps, [m]);
2037
+ const dispatchProps = {
2038
+ clearFilters: () => dispatch(withMappers(clearFilters$1(), m)),
2039
+ updateCurrentFacet: facet => dispatch(withMappers(updateCurrentFacet$1(facet), m)),
2040
+ updatePageIndex: pageIndex => dispatch(withMappers(updatePageIndex$1(pageIndex), m)),
2041
+ updateSearchTerm: term => dispatch(withMappers(updateSearchTerm$1(term), m)),
2042
+ updateSelectedFilters: (filter, key, isUnknownItem = false) => dispatch(withMappers(updateSelectedFilters(filter, key, isUnknownItem), m)),
2043
+ updateSortOrder: orderBy => dispatch(withMappers(updateSortOrder$1(orderBy), m))
2044
+ };
2045
+ const {
2046
+ currentListing,
2047
+ currentPageIndex,
2048
+ featured,
2049
+ filters,
2050
+ isLoading,
2051
+ listing,
2052
+ paging,
2053
+ pageIsLoading,
2054
+ results,
2055
+ resultsInfo,
2056
+ searchTerm,
2057
+ selectedFilters,
2058
+ sortOrder
2059
+ } = useSelector(state => selectListingProps(state, m));
2060
+ return {
2061
+ currentListing,
2062
+ currentPageIndex,
2063
+ featured,
2064
+ filters,
2065
+ isLoading,
2066
+ listing,
2067
+ pageIsLoading,
2068
+ paging,
2069
+ results,
2070
+ resultsInfo,
2071
+ searchTerm,
2072
+ selectedFilters,
2073
+ sortOrder,
2074
+ title: listing.title,
2075
+ ...dispatchProps
2076
+ };
2077
+ };
2078
+
1941
2079
  const makeSelectMinilistProps = () => createSelector(state => state, (_, id) => id, (state, id) => ({
1942
2080
  facet: getFacet(state, id, Context$1.minilist, 'js'),
1943
2081
  filters: getFilters(state, id, Context$1.minilist, 'js'),
1944
- isLoading: getIsLoading(state, Context$1.minilist, id),
2082
+ isLoading: getIsLoading$1(state, Context$1.minilist, id),
1945
2083
  pagingInfo: getPaging(state, id, Context$1.minilist, 'js'),
1946
2084
  results: getResults(state, id, Context$1.minilist, 'js'),
1947
- searchTerm: getSearchTerm(state)
2085
+ searchTerm: getSearchTerm$1(state)
1948
2086
  }));
1949
2087
 
1950
2088
  const useMinilist = ({
@@ -1995,7 +2133,7 @@ const useMinilist = ({
1995
2133
  return {
1996
2134
  filters,
1997
2135
  isLoading,
1998
- pagingInfo,
2136
+ paging: pagingInfo,
1999
2137
  results,
2000
2138
  searchTerm,
2001
2139
  title: facet.title
@@ -2179,7 +2317,10 @@ const generateFiltersState = ({
2179
2317
  // the search results during SSR without needing to fetch the filters first
2180
2318
 
2181
2319
 
2182
- Object.entries(filterParams).map(([paramName = '', paramValue]) => typeof paramValue === 'string' && paramValue.split(',').map(pVal => filters = addFilterItem(filters, paramName, pVal)));
2320
+ Object.entries(filterParams).map(([paramName = '', paramValue]) => {
2321
+ if (typeof paramValue === 'string') return paramValue.split(',').map(pVal => filters = addFilterItem(filters, paramName, pVal));
2322
+ if (typeof paramValue === 'boolean') filters = addFilterItem(filters, paramName, paramValue);
2323
+ });
2183
2324
  return Object.fromEntries(filters);
2184
2325
  };
2185
2326
 
@@ -2208,7 +2349,7 @@ var reducers = (config => {
2208
2349
  case APPLY_CONFIG:
2209
2350
  {
2210
2351
  state = addConfigToState(state, action);
2211
- return;
2352
+ return state;
2212
2353
  }
2213
2354
 
2214
2355
  case CLEAR_FILTERS:
@@ -2392,13 +2533,22 @@ var reducers = (config => {
2392
2533
  {
2393
2534
  const {
2394
2535
  filter,
2395
- key
2536
+ key,
2537
+ isUnknownItem
2396
2538
  } = action;
2397
2539
  const isSingleSelect = state[context][current].filters[filter].isSingleSelect || false;
2398
2540
  const isGrouped = state[context][current].filters[filter].isGrouped || false;
2399
2541
  const currentItems = state[context][current].filters[filter].items;
2400
2542
  if (isGrouped) state[context] = resetFacets(state, context);
2401
2543
  state[context][current] = resetFacet(state[context][current]);
2544
+
2545
+ if (isUnknownItem && (currentItems === null || currentItems === void 0 ? void 0 : currentItems.findIndex(item => (item === null || item === void 0 ? void 0 : item.key) === key)) === -1) {
2546
+ currentItems === null || currentItems === void 0 ? void 0 : currentItems.push({
2547
+ key,
2548
+ isSelected: false
2549
+ });
2550
+ }
2551
+
2402
2552
  state[context][current].filters[filter].items = currentItems === null || currentItems === void 0 ? void 0 : currentItems.map(item => {
2403
2553
  if (item.key === key) {
2404
2554
  return { ...item,
@@ -2432,12 +2582,11 @@ var reducers = (config => {
2432
2582
  }, initState);
2433
2583
  });
2434
2584
 
2435
- // eslint-disable-next-line @typescript-eslint/naming-convention
2436
2585
  const Context = {
2437
2586
  facets: 'facets',
2438
2587
  listings: 'listings',
2439
2588
  minilist: 'minilist'
2440
2589
  };
2441
2590
 
2442
- export { Context, actions, doSearch, queries, reducers as reducer, searchSagas as sagas, schema, selectors, setRouteFilters, types, useMinilist, withListing, withSearch };
2591
+ export { Context, actions, doSearch, queries, reducers as reducer, searchSagas as sagas, schema, selectors, setRouteFilters, types, useListing, useMinilist, withListing, withSearch };
2443
2592
  //# sourceMappingURL=search.js.map