@zengenti/contensis-react-base 2.5.1-beta.4 → 3.0.0-beta.3
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.
- package/README.md +8 -2
- package/cjs/{App-fbd91490.js → App-581b6653.js} +20 -19
- package/cjs/App-581b6653.js.map +1 -0
- package/cjs/{RouteLoader-f99cd734.js → RouteLoader-282c03ab.js} +5 -5
- package/cjs/RouteLoader-282c03ab.js.map +1 -0
- package/cjs/ToJs-87edc45d.js +230 -0
- package/cjs/ToJs-87edc45d.js.map +1 -0
- package/cjs/{actions-e9f69947.js → actions-12871aca.js} +9 -13
- package/cjs/actions-12871aca.js.map +1 -0
- package/cjs/client.js +47 -64
- package/cjs/client.js.map +1 -1
- package/cjs/contensis-react-base.js +54 -55
- package/cjs/contensis-react-base.js.map +1 -1
- package/cjs/forms.js +1 -1
- package/cjs/fromJSLeaveImmer-9b550c8e.js +40 -0
- package/cjs/fromJSLeaveImmer-9b550c8e.js.map +1 -0
- package/cjs/{login-4f274c6a.js → login-81d7f9ef.js} +11 -10
- package/cjs/login-81d7f9ef.js.map +1 -0
- package/cjs/{reducers-cb531715.js → reducers-fde41d6b.js} +76 -31
- package/cjs/reducers-fde41d6b.js.map +1 -0
- package/cjs/redux.js +11 -8
- package/cjs/redux.js.map +1 -1
- package/cjs/routing.js +5 -5
- package/cjs/search.js +409 -233
- package/cjs/search.js.map +1 -1
- package/cjs/selectors-ed26ed97.js +141 -0
- package/cjs/selectors-ed26ed97.js.map +1 -0
- package/cjs/user.js +14 -14
- package/cjs/user.js.map +1 -1
- package/cjs/util.js +24 -10
- package/cjs/util.js.map +1 -1
- package/cjs/version-0c190929.js +20 -0
- package/cjs/version-0c190929.js.map +1 -0
- package/cjs/{version-3a808c12.js → version-f061e409.js} +154 -76
- package/cjs/version-f061e409.js.map +1 -0
- package/esm/{App-fbef99b3.js → App-122f28a3.js} +20 -19
- package/esm/App-122f28a3.js.map +1 -0
- package/esm/{RouteLoader-281d47e1.js → RouteLoader-c2faac87.js} +5 -5
- package/esm/RouteLoader-c2faac87.js.map +1 -0
- package/esm/ToJs-52fee252.js +199 -0
- package/esm/ToJs-52fee252.js.map +1 -0
- package/esm/{actions-ddd9c623.js → actions-3cc39599.js} +4 -7
- package/esm/actions-3cc39599.js.map +1 -0
- package/esm/client.js +48 -65
- package/esm/client.js.map +1 -1
- package/esm/contensis-react-base.js +53 -53
- package/esm/contensis-react-base.js.map +1 -1
- package/esm/forms.js +1 -1
- package/esm/fromJSLeaveImmer-e44d1a91.js +38 -0
- package/esm/fromJSLeaveImmer-e44d1a91.js.map +1 -0
- package/esm/{login-1f9ad133.js → login-92db44d1.js} +11 -10
- package/esm/login-92db44d1.js.map +1 -0
- package/esm/{reducers-feab84fc.js → reducers-d6c0edb1.js} +77 -31
- package/esm/reducers-d6c0edb1.js.map +1 -0
- package/esm/redux.js +9 -8
- package/esm/redux.js.map +1 -1
- package/esm/routing.js +5 -5
- package/esm/search.js +409 -235
- package/esm/search.js.map +1 -1
- package/esm/selectors-82e71d8e.js +116 -0
- package/esm/selectors-82e71d8e.js.map +1 -0
- package/esm/user.js +10 -10
- package/esm/user.js.map +1 -1
- package/esm/util.js +24 -10
- package/esm/util.js.map +1 -1
- package/esm/version-59c8f9be.js +15 -0
- package/esm/version-59c8f9be.js.map +1 -0
- package/esm/{version-64906b26.js → version-cb9cd09d.js} +133 -76
- package/esm/version-cb9cd09d.js.map +1 -0
- package/models/app/pages/VersionInfo/components/VersionInfo.d.ts +1 -1
- package/models/config.d.ts +2 -0
- package/models/redux/appstate.d.ts +85 -0
- package/models/redux/index.d.ts +1 -0
- package/models/redux/reducers/navigation.d.ts +6 -2
- package/models/redux/reducers/version.d.ts +5 -2
- package/models/redux/store/store.d.ts +4 -1
- package/models/redux/util.d.ts +2 -0
- package/models/routing/components/RouteLoader.d.ts +20 -2
- package/models/routing/redux/reducers.d.ts +21 -3
- package/models/routing/redux/selectors.d.ts +29 -25
- package/models/routing/routes.d.ts +10 -2
- package/models/search/hooks/useMinilist.hook.d.ts +7 -20
- package/models/search/models/Search.d.ts +8 -1
- package/models/search/models/SearchActions.d.ts +3 -4
- package/models/search/models/SearchProps.d.ts +16 -2
- package/models/search/models/SearchState.d.ts +25 -9
- package/models/search/models/WithSearch.d.ts +61 -0
- package/models/search/redux/getIn.d.ts +3 -0
- package/models/search/redux/reducers.d.ts +346 -2
- package/models/search/redux/sagas.d.ts +2 -2
- package/models/search/redux/schema.d.ts +56 -8
- package/models/search/redux/selectors.d.ts +75 -66
- package/models/search/redux/util.d.ts +1 -1
- package/models/search/search/util.d.ts +2 -3
- package/models/user/components/Login.d.ts +10 -1
- package/models/user/containers/ChangePassword.container.d.ts +4 -1
- package/models/user/containers/ForgotPassword.container.d.ts +4 -1
- package/models/user/containers/Login.container.d.ts +4 -1
- package/models/user/containers/Registration.container.d.ts +4 -1
- package/models/user/hocs/withLogin.d.ts +9 -1
- package/models/user/hocs/withRegistration.d.ts +9 -1
- package/models/user/hooks/useChangePassword.d.ts +5 -5
- package/models/user/hooks/useForgotPassword.d.ts +6 -6
- package/models/user/hooks/useLogin.d.ts +45 -7
- package/models/user/hooks/useRegistration.d.ts +4 -4
- package/models/user/redux/reducers.d.ts +54 -3
- package/models/user/redux/selectors.d.ts +72 -27
- package/models/util/ToJs.d.ts +4 -1
- package/package-lock.json +1092 -21401
- package/package.json +9 -8
- package/cjs/App-fbd91490.js.map +0 -1
- package/cjs/RouteLoader-f99cd734.js.map +0 -1
- package/cjs/ToJs-d72e5b10.js +0 -167
- package/cjs/ToJs-d72e5b10.js.map +0 -1
- package/cjs/actions-e9f69947.js.map +0 -1
- package/cjs/login-4f274c6a.js.map +0 -1
- package/cjs/reducers-cb531715.js.map +0 -1
- package/cjs/selectors-1295124a.js +0 -139
- package/cjs/selectors-1295124a.js.map +0 -1
- package/cjs/version-2193b4a2.js +0 -24
- package/cjs/version-2193b4a2.js.map +0 -1
- package/cjs/version-3a808c12.js.map +0 -1
- package/esm/App-fbef99b3.js.map +0 -1
- package/esm/RouteLoader-281d47e1.js.map +0 -1
- package/esm/ToJs-6e7b247c.js +0 -136
- package/esm/ToJs-6e7b247c.js.map +0 -1
- package/esm/actions-ddd9c623.js.map +0 -1
- package/esm/login-1f9ad133.js.map +0 -1
- package/esm/reducers-feab84fc.js.map +0 -1
- package/esm/selectors-68799788.js +0 -117
- package/esm/selectors-68799788.js.map +0 -1
- package/esm/version-64906b26.js.map +0 -1
- package/esm/version-7fdbd2d5.js +0 -19
- package/esm/version-7fdbd2d5.js.map +0 -1
package/esm/search.js
CHANGED
|
@@ -1,14 +1,17 @@
|
|
|
1
|
-
import React, { useEffect } from 'react';
|
|
1
|
+
import React, { useMemo, useEffect } from 'react';
|
|
2
2
|
import { connect, useDispatch, useSelector } from 'react-redux';
|
|
3
|
-
import mapJson from 'jsonpath-mapper';
|
|
4
|
-
import {
|
|
3
|
+
import mapJson, { jpath } from 'jsonpath-mapper';
|
|
4
|
+
import { produce } from 'immer';
|
|
5
5
|
import { takeEvery, select, put, call, all } from '@redux-saga/core/effects';
|
|
6
6
|
import { Client } from 'contensis-delivery-api';
|
|
7
7
|
import queryString from 'query-string';
|
|
8
8
|
import { error } from 'loglevel';
|
|
9
|
+
import { createSelector } from 'reselect';
|
|
9
10
|
import { Op, OrderBy, Query } from 'contensis-core-api';
|
|
11
|
+
import merge from 'deepmerge';
|
|
12
|
+
import equals from 'deep-equal';
|
|
10
13
|
|
|
11
|
-
/* eslint-disable
|
|
14
|
+
/* eslint-disable import/default */
|
|
12
15
|
const toJS = WrappedComponent => wrappedComponentProps => {
|
|
13
16
|
const KEY = 0;
|
|
14
17
|
const VALUE = 1;
|
|
@@ -185,132 +188,167 @@ let Context; // export type Context = 'facets' | 'listings' | 'minilist';
|
|
|
185
188
|
Context["minilist"] = "minilist";
|
|
186
189
|
})(Context || (Context = {}));
|
|
187
190
|
|
|
188
|
-
|
|
191
|
+
// or replace with a stub function for non-immutable gets
|
|
192
|
+
|
|
193
|
+
const makeFromJS = (returnType = globalThis.STATE_TYPE || 'immutable') => {
|
|
194
|
+
var _immutable, _immutable2;
|
|
195
|
+
|
|
196
|
+
return returnType === 'immutable' ? ((_immutable = globalThis.immutable) === null || _immutable === void 0 ? void 0 : _immutable.fromJSOrdered) || ((_immutable2 = globalThis.immutable) === null || _immutable2 === void 0 ? void 0 : _immutable2.fromJS) || (v => v) : v => v;
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
const getImmutableOrJS = (state, stateKey, fallbackValue, returnType = globalThis.STATE_TYPE || 'immutable') => {
|
|
200
|
+
// Find a fromJS function from global that is dynamically loaded in createStore
|
|
201
|
+
// or replace with a stub function for non-immutable gets
|
|
202
|
+
const fromJS = makeFromJS(returnType);
|
|
203
|
+
|
|
204
|
+
if (state && 'get' in state && typeof state.get === 'function' && 'getIn' in state && typeof state.getIn === 'function' && 'toJS' in state && typeof state.toJS === 'function') {
|
|
205
|
+
if (Array.isArray(stateKey)) return fromJS(state.getIn(stateKey, fallbackValue));
|
|
206
|
+
return fromJS(state.get(stateKey, fallbackValue));
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
if (Array.isArray(stateKey) && state && typeof state === 'object') {
|
|
210
|
+
const result = jpath(stateKey.join('.'), state);
|
|
211
|
+
if (typeof result === 'undefined') return fallbackValue;
|
|
212
|
+
return result;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
const result = state && typeof state === 'object' ? state[stateKey] : undefined;
|
|
216
|
+
if (typeof result === 'undefined') return fallbackValue;
|
|
217
|
+
return result;
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
const getSearchContext = state => getImmutableOrJS(state, ['search', 'context'], Context.facets);
|
|
189
221
|
const getCurrent = (state, context = Context.facets) => context === Context.facets ? getCurrentFacet(state) : getCurrentListing(state);
|
|
190
|
-
const getCurrentFacet = state => state
|
|
191
|
-
const getCurrentListing = state => state
|
|
192
|
-
const getCurrentTab = state => state
|
|
193
|
-
const getFacets = state => state
|
|
194
|
-
const getTabFacets = state => getFacets(state).filter((
|
|
195
|
-
const getFacetTitles = state => getFacets(state).map((facet =
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
222
|
+
const getCurrentFacet = state => getImmutableOrJS(state, ['search', 'currentFacet']);
|
|
223
|
+
const getCurrentListing = state => getImmutableOrJS(state, ['search', 'currentListing']);
|
|
224
|
+
const getCurrentTab = state => getImmutableOrJS(state, ['search', Context.facets, getCurrentFacet(state), 'tabId'], 0);
|
|
225
|
+
const getFacets = (state, returnType) => getImmutableOrJS(state, ['search', Context.facets], {}, returnType);
|
|
226
|
+
const getTabFacets = state => Object.fromEntries(Object.entries(getFacets(state, 'js')).filter(([key]) => getImmutableOrJS(getFacets(state), [key, 'tabId'], 0) === getCurrentTab(state)));
|
|
227
|
+
const getFacetTitles = state => Object.entries(getFacets(state, 'js')).map(([key, facet = {}]) => {
|
|
228
|
+
var _facet$pagingInfo;
|
|
229
|
+
|
|
230
|
+
return {
|
|
231
|
+
key,
|
|
232
|
+
title: facet.title,
|
|
233
|
+
totalCount: (_facet$pagingInfo = facet.pagingInfo) === null || _facet$pagingInfo === void 0 ? void 0 : _facet$pagingInfo.totalCount
|
|
234
|
+
};
|
|
235
|
+
});
|
|
236
|
+
const getFacet = (state, facetName = '', context = Context.facets, returnType) => {
|
|
201
237
|
const currentFacet = facetName || getCurrentFacet(state);
|
|
202
|
-
return state
|
|
238
|
+
return getImmutableOrJS(state, ['search', context, currentFacet], {}, returnType);
|
|
203
239
|
};
|
|
204
240
|
const getListing = (state, listing = '') => {
|
|
205
241
|
const currentListing = listing || getCurrentListing(state);
|
|
206
|
-
return state
|
|
242
|
+
return getImmutableOrJS(state, ['search', Context.listings, currentListing], {});
|
|
207
243
|
};
|
|
208
|
-
const getFilters = (state, facet, context = Context.facets) => {
|
|
209
|
-
return state
|
|
244
|
+
const getFilters = (state, facet, context = Context.facets, returnType) => {
|
|
245
|
+
return getImmutableOrJS(state, ['search', context, facet || getCurrent(state, context), 'filters'], {}, returnType);
|
|
210
246
|
};
|
|
211
|
-
const getRenderableFilters = (state, facet = '', context = Context.facets) => getFilters(state, facet, context).filter((f =
|
|
212
|
-
const getFiltersToLoad = (state, facet, context = Context.facets) => {
|
|
213
|
-
const filters = getFilters(state, facet, context);
|
|
214
|
-
const loadedFilters = filters.map((f =
|
|
215
|
-
const title = i === null || i === void 0 ? void 0 : i.
|
|
247
|
+
const getRenderableFilters = (state, facet = '', context = Context.facets) => Object.fromEntries(Object.entries(getFilters(state, facet, context, 'js')).filter(([, f = {}]) => typeof f.renderable !== 'boolean' ? true : f.renderable));
|
|
248
|
+
const getFiltersToLoad = (state, facet, context = Context.facets, returnType) => {
|
|
249
|
+
const filters = getFilters(state, facet, context, returnType);
|
|
250
|
+
const loadedFilters = Object.entries(filters).map(([key, f = {}]) => [key, (f.items || []).filter(i => {
|
|
251
|
+
const title = i === null || i === void 0 ? void 0 : i.title;
|
|
216
252
|
return typeof title !== 'undefined' && !!title;
|
|
217
|
-
}).
|
|
218
|
-
return loadedFilters.map((
|
|
253
|
+
}).length > 0 && (f.isError || false) === false]);
|
|
254
|
+
return loadedFilters.map(([filterKey, isLoaded]) => !isLoaded ? filterKey : null).filter(f => !!f);
|
|
219
255
|
}; // We lowercase the filter key unless it's an ISO date string where the T must be uppercase
|
|
220
256
|
|
|
221
|
-
const getSelectedFilters = (state, facet = '', context = Context.facets) => {
|
|
222
|
-
const filters = getFilters(state, facet, context);
|
|
257
|
+
const getSelectedFilters = (state, facet = '', context = Context.facets, returnType) => {
|
|
258
|
+
const filters = getFilters(state, facet, context, 'js');
|
|
223
259
|
const isoDateRegex = RegExp(/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d/);
|
|
224
|
-
const selectedFilters = filters.map((filter =
|
|
225
|
-
const key = item === null || item === void 0 ? void 0 : item.
|
|
260
|
+
const selectedFilters = Object.fromEntries(Object.entries(filters).map(([key, filter = {}]) => [key, (filter.items || []).filter(item => !!(item.isSelected || false)).map(item => {
|
|
261
|
+
const key = (item === null || item === void 0 ? void 0 : item.key) || '';
|
|
226
262
|
const isIsoDate = isoDateRegex.test(key);
|
|
227
263
|
return isIsoDate ? key : key.toLowerCase();
|
|
228
|
-
}));
|
|
229
|
-
|
|
264
|
+
})]));
|
|
265
|
+
const fromJS = makeFromJS(returnType);
|
|
266
|
+
return fromJS(selectedFilters);
|
|
230
267
|
};
|
|
231
|
-
const getResults = (state, current = '', context = Context.facets) => {
|
|
232
|
-
return state
|
|
268
|
+
const getResults = (state, current = '', context = Context.facets, returnType) => {
|
|
269
|
+
return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'results'], [], returnType);
|
|
233
270
|
};
|
|
234
271
|
const getIsInternalPaging = (state, current, context = Context.facets) => {
|
|
235
|
-
return state
|
|
272
|
+
return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'queryParams', 'internalPaging'], false);
|
|
236
273
|
};
|
|
237
274
|
const getIsLoaded = (state, context = Context.facets, facet) => {
|
|
238
|
-
return !!state
|
|
275
|
+
return !!getImmutableOrJS(state, ['search', context, facet || getCurrent(state, context), 'queryDuration'], 0);
|
|
239
276
|
};
|
|
240
277
|
const getIsLoading = (state, context = Context.facets, facet) => {
|
|
241
|
-
return state
|
|
242
|
-
};
|
|
243
|
-
const getIsSsr = state => {
|
|
244
|
-
return state.getIn(['search', 'config', 'ssr'], false);
|
|
278
|
+
return getImmutableOrJS(state, ['search', context, facet || getCurrent(state, context), 'entries', 'isLoading']);
|
|
245
279
|
};
|
|
280
|
+
const getIsSsr = state => getImmutableOrJS(state, ['search', 'config', 'ssr'], false);
|
|
246
281
|
const getFeaturedResults = (state, current = '', context = Context.facets) => {
|
|
247
|
-
return state
|
|
282
|
+
return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'featuredResults'], []);
|
|
248
283
|
};
|
|
249
|
-
const getPaging = (state, current = '', context = Context.facets) => {
|
|
250
|
-
return state
|
|
284
|
+
const getPaging = (state, current = '', context = Context.facets, returnType) => {
|
|
285
|
+
return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'pagingInfo'], {}, returnType);
|
|
251
286
|
};
|
|
252
287
|
const getPageIndex = (state, current = '', context = Context.facets) => {
|
|
253
|
-
return state
|
|
288
|
+
return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'pagingInfo', 'pageIndex']);
|
|
254
289
|
};
|
|
255
290
|
const getPrevPageIndex = (state, current = '', context = Context.facets) => {
|
|
256
|
-
return state
|
|
291
|
+
return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'pagingInfo', 'prevPageIndex']);
|
|
257
292
|
};
|
|
258
293
|
const getPageIsLoading = (state, current = '', context = Context.facets) => {
|
|
259
|
-
return state
|
|
294
|
+
return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'pagingInfo', 'isLoading']);
|
|
260
295
|
};
|
|
261
296
|
const getPagesLoaded = (state, current = '', context = Context.facets) => {
|
|
262
|
-
return state
|
|
297
|
+
return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'pagingInfo', 'pagesLoaded'], [], 'js');
|
|
263
298
|
};
|
|
264
299
|
const getTotalCount = (state, current = '', context = Context.facets) => {
|
|
265
|
-
return state
|
|
266
|
-
};
|
|
267
|
-
const getFacetAuthentication = (state, facet) => state.getIn(['search', Context.facets, facet, 'authentication']);
|
|
268
|
-
const getFeaturedEntryIds = state => {
|
|
269
|
-
const currentFacet = getCurrentFacet(state);
|
|
270
|
-
const entryIds = state.getIn(['search', Context.facets, currentFacet, 'featuredEntries', 'items']).map(entry => entry.getIn(['sys', 'id']));
|
|
271
|
-
return entryIds;
|
|
300
|
+
return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'pagingInfo', 'totalCount']);
|
|
272
301
|
};
|
|
273
|
-
const getSearchTerm = state => state
|
|
274
|
-
const getSearchTabs = state => state
|
|
302
|
+
const getSearchTerm = state => getImmutableOrJS(state, ['search', 'term']);
|
|
303
|
+
const getSearchTabs = (state, returnType) => getImmutableOrJS(state, ['search', 'tabs'], [], returnType);
|
|
275
304
|
const getQueryParams = (state, current = '', context = Context.facets) => {
|
|
276
|
-
return state
|
|
305
|
+
return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'queryParams'], {}, 'js');
|
|
277
306
|
};
|
|
278
307
|
const getQueryParameter = ({
|
|
279
308
|
state,
|
|
280
309
|
facet,
|
|
281
310
|
context = Context.facets
|
|
282
311
|
}, key, ifnull = null) => {
|
|
283
|
-
return getQueryParams(state, facet, context)
|
|
312
|
+
return getImmutableOrJS(getQueryParams(state, facet, context), key, ifnull, 'js');
|
|
284
313
|
};
|
|
285
|
-
const getCustomApi = (state, current, context = Context.facets) => {
|
|
286
|
-
return state
|
|
314
|
+
const getCustomApi = (state, current, context = Context.facets, returnType) => {
|
|
315
|
+
return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'customApi'], null, returnType);
|
|
287
316
|
};
|
|
288
317
|
const getCustomEnv = (state, current, context = Context.facets) => {
|
|
289
|
-
return state
|
|
318
|
+
return getImmutableOrJS(state, ['search', context, current || getCurrent(state, context), 'env']);
|
|
290
319
|
};
|
|
291
|
-
const getTabsAndFacets = state => {
|
|
292
|
-
const tabs = getSearchTabs(state);
|
|
293
|
-
const facets = getFacets(state);
|
|
294
|
-
|
|
295
|
-
const fieldsToCount = tab.
|
|
320
|
+
const getTabsAndFacets = (state, returnType) => {
|
|
321
|
+
const tabs = getSearchTabs(state, 'js');
|
|
322
|
+
const facets = getFacets(state, 'js');
|
|
323
|
+
const tabsAndFacets = (tabs || []).map((tab = {}) => {
|
|
324
|
+
const fieldsToCount = tab.totalCount;
|
|
296
325
|
let countFields;
|
|
297
|
-
if (typeof fieldsToCount === 'string') countFields =
|
|
298
|
-
const thisTabFacets = facets.filter((
|
|
299
|
-
const thisTabTotal = thisTabFacets.map((facet =
|
|
300
|
-
if (!countFields || countFields.find((f =
|
|
326
|
+
if (typeof fieldsToCount === 'string') countFields = [[fieldsToCount]];
|
|
327
|
+
const thisTabFacets = Object.entries(facets).filter(([key]) => getImmutableOrJS(facets, [key, 'tabId'], 0) === tab.id);
|
|
328
|
+
const thisTabTotal = thisTabFacets.map(([facetName, facet = {}]) => {
|
|
329
|
+
if (!countFields || countFields.find((f = []) => (f === null || f === void 0 ? void 0 : f[0]) === facetName)) return getImmutableOrJS(facet, ['pagingInfo', 'totalCount']);
|
|
301
330
|
return 0;
|
|
302
331
|
}).reduce((a, b) => a + b, 0);
|
|
303
|
-
return tab
|
|
332
|
+
return { ...tab,
|
|
333
|
+
[Context.facets]: Object.fromEntries(thisTabFacets),
|
|
334
|
+
totalCount: thisTabTotal
|
|
335
|
+
};
|
|
304
336
|
});
|
|
337
|
+
const fromJS = makeFromJS(returnType);
|
|
338
|
+
return fromJS(tabsAndFacets);
|
|
305
339
|
};
|
|
306
340
|
const getSearchTotalCount = state => {
|
|
307
|
-
const tabsAndFacets = getTabsAndFacets(state);
|
|
308
|
-
const wholeSearchTotal = tabsAndFacets.map((t =
|
|
341
|
+
const tabsAndFacets = getTabsAndFacets(state, 'js');
|
|
342
|
+
const wholeSearchTotal = tabsAndFacets.map((t = {}) => t.totalCount).reduce((a, b) => a + b, 0);
|
|
309
343
|
return wholeSearchTotal;
|
|
310
344
|
};
|
|
311
345
|
const getFacetsTotalCount = state => {
|
|
312
346
|
const facets = getFacets(state);
|
|
313
|
-
const wholeSearchTotal = facets.map((t =
|
|
347
|
+
const wholeSearchTotal = Object.entries(facets).map(([, t = {}]) => {
|
|
348
|
+
var _t$pagingInfo;
|
|
349
|
+
|
|
350
|
+
return ((_t$pagingInfo = t.pagingInfo) === null || _t$pagingInfo === void 0 ? void 0 : _t$pagingInfo.totalCount) || 0;
|
|
351
|
+
}).reduce((a, b) => a + b, 0);
|
|
314
352
|
return wholeSearchTotal;
|
|
315
353
|
}; // An exported copy of the relevant selectors scoped by default to a facets context
|
|
316
354
|
|
|
@@ -379,8 +417,8 @@ const selectListing = {
|
|
|
379
417
|
getTotalCount: (state, listing = '') => getTotalCount(state, listing, Context.listings),
|
|
380
418
|
getSelectedFilters: (state, listing = '') => getSelectedFilters(state, listing, Context.listings)
|
|
381
419
|
};
|
|
382
|
-
const selectCurrentPath = state => state
|
|
383
|
-
const selectVersionStatus = state => state
|
|
420
|
+
const selectCurrentPath = state => getImmutableOrJS(state, ['routing', 'currentPath']);
|
|
421
|
+
const selectVersionStatus = state => getImmutableOrJS(state, ['version', 'contensisVersionStatus']);
|
|
384
422
|
|
|
385
423
|
var selectors = /*#__PURE__*/Object.freeze({
|
|
386
424
|
__proto__: null,
|
|
@@ -410,8 +448,6 @@ var selectors = /*#__PURE__*/Object.freeze({
|
|
|
410
448
|
getPageIsLoading: getPageIsLoading,
|
|
411
449
|
getPagesLoaded: getPagesLoaded,
|
|
412
450
|
getTotalCount: getTotalCount,
|
|
413
|
-
getFacetAuthentication: getFacetAuthentication,
|
|
414
|
-
getFeaturedEntryIds: getFeaturedEntryIds,
|
|
415
451
|
getSearchTerm: getSearchTerm,
|
|
416
452
|
getSearchTabs: getSearchTabs,
|
|
417
453
|
getQueryParams: getQueryParams,
|
|
@@ -427,6 +463,8 @@ var selectors = /*#__PURE__*/Object.freeze({
|
|
|
427
463
|
selectVersionStatus: selectVersionStatus
|
|
428
464
|
});
|
|
429
465
|
|
|
466
|
+
// eslint-disable-next-line import/default
|
|
467
|
+
|
|
430
468
|
/* eslint-disable @typescript-eslint/naming-convention */
|
|
431
469
|
const withSearch = mappers => SearchComponent => {
|
|
432
470
|
const Wrapper = props => {
|
|
@@ -692,6 +730,7 @@ const now = () => {
|
|
|
692
730
|
return window.performance.now();
|
|
693
731
|
};
|
|
694
732
|
|
|
733
|
+
// eslint-disable-next-line import/default
|
|
695
734
|
function fixFreeTextForElastic(s) {
|
|
696
735
|
const illegalChars = ['>', '<', '=', '|', '!', '{', '}', '[', ']', '^', '~', '*', '?', ':', '\\', '/'];
|
|
697
736
|
const illegalRegEx = new RegExp(illegalChars.map(c => '\\' + c).join('|'), 'g');
|
|
@@ -719,6 +758,7 @@ const getItemsFromResult = result => {
|
|
|
719
758
|
if (payload) {
|
|
720
759
|
if (Array.isArray(payload)) return payload;
|
|
721
760
|
if (Array.isArray(payload.items)) return payload.items;
|
|
761
|
+
return payload;
|
|
722
762
|
}
|
|
723
763
|
|
|
724
764
|
return [];
|
|
@@ -733,7 +773,7 @@ const buildUrl = (route, params) => {
|
|
|
733
773
|
return path;
|
|
734
774
|
};
|
|
735
775
|
const callCustomApi = async (customApi, filters) => {
|
|
736
|
-
const apiUri = customApi.
|
|
776
|
+
const apiUri = customApi.uri || '';
|
|
737
777
|
let uri = buildUrl(apiUri, filters);
|
|
738
778
|
if (!uri) throw new Error('uri is required to use customApi');
|
|
739
779
|
if (typeof window == 'undefined' && uri.startsWith('/')) uri = `http://localhost:3001${uri}`;
|
|
@@ -1117,19 +1157,21 @@ const searchUriTemplate = {
|
|
|
1117
1157
|
const searchContext = getSearchContext(state); // Lose stateFilters and currentSearch if a new
|
|
1118
1158
|
// term is passed via an argument
|
|
1119
1159
|
|
|
1120
|
-
const stateFilters = term ?
|
|
1121
|
-
const currentSearch = !term && state
|
|
1160
|
+
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
|
+
const currentSearch = !term && getImmutableOrJS(state, ['routing', 'location', 'search']);
|
|
1122
1162
|
const currentQs = removeEmptyAttributes(queryString.parse(currentSearch));
|
|
1123
1163
|
if (orderBy) currentQs.orderBy = orderBy;
|
|
1124
1164
|
const searchTerm = getSearchTerm(state); // Use Immutable's merge to merge the stateFilters with any current Qs
|
|
1125
1165
|
// to build the new Qs.
|
|
1126
1166
|
|
|
1127
|
-
const mergedSearch = removeEmptyAttributes(
|
|
1167
|
+
const mergedSearch = removeEmptyAttributes({ ...merge(currentQs, stateFilters),
|
|
1168
|
+
term: searchTerm
|
|
1169
|
+
});
|
|
1128
1170
|
return queryString.stringify(mergedSearch);
|
|
1129
1171
|
},
|
|
1130
1172
|
hash: {
|
|
1131
1173
|
$path: 'state',
|
|
1132
|
-
$formatting: state => state
|
|
1174
|
+
$formatting: state => getImmutableOrJS(state, ['routing', 'location', 'hash'], '').replace('#', '')
|
|
1133
1175
|
}
|
|
1134
1176
|
};
|
|
1135
1177
|
|
|
@@ -1186,9 +1228,13 @@ const facetTemplate = {
|
|
|
1186
1228
|
pageIndex,
|
|
1187
1229
|
pagesLoaded
|
|
1188
1230
|
}) => {
|
|
1189
|
-
const loaded =
|
|
1190
|
-
|
|
1191
|
-
|
|
1231
|
+
const loaded = [...(pagesLoaded || [])];
|
|
1232
|
+
|
|
1233
|
+
if (isNaN(loaded.find(l => l === pageIndex))) {
|
|
1234
|
+
loaded.push(pageIndex);
|
|
1235
|
+
}
|
|
1236
|
+
|
|
1237
|
+
return loaded.sort((a, b) => a - b);
|
|
1192
1238
|
}
|
|
1193
1239
|
},
|
|
1194
1240
|
prevPageIndex: 'action.queryParams.prevPageIndex'
|
|
@@ -1217,14 +1263,14 @@ const facetTemplate = {
|
|
|
1217
1263
|
_pagePosition: idx,
|
|
1218
1264
|
...r
|
|
1219
1265
|
}));
|
|
1220
|
-
const loadedPages =
|
|
1266
|
+
const loadedPages = pagesLoaded || []; // if pageIndex is found in loadedPages, we have already loaded this page
|
|
1221
1267
|
|
|
1222
1268
|
if (!isNaN(loadedPages.find(l => l === pageIndex))) return prevResults; // Determine where we put the results depending on if we
|
|
1223
1269
|
// are paging forwards, backwards, or doing a new search
|
|
1224
1270
|
|
|
1225
1271
|
const firstResultSet = pageIndex > prevPageIndex ? prevResults || [] : nextResults;
|
|
1226
1272
|
const secondResultSet = pageIndex > prevPageIndex ? nextResults : prevResults || [];
|
|
1227
|
-
const onlyResultSet = loadedPages.
|
|
1273
|
+
const onlyResultSet = loadedPages.length === 0 ? nextResults : false;
|
|
1228
1274
|
return onlyResultSet || [...firstResultSet, ...secondResultSet];
|
|
1229
1275
|
}
|
|
1230
1276
|
},
|
|
@@ -1308,10 +1354,10 @@ const mapFiltersToFilterExpression = (filters, selectedFilters) => {
|
|
|
1308
1354
|
};
|
|
1309
1355
|
|
|
1310
1356
|
const queryParamsTemplate = {
|
|
1311
|
-
assetTypes: root => getQueryParameter(root, 'assetTypes',
|
|
1312
|
-
contentTypeIds: root => getQueryParameter(root, 'contentTypeIds',
|
|
1313
|
-
customWhere: root => getQueryParameter(root, 'customWhere',
|
|
1314
|
-
dynamicOrderBy: root => getQueryParameter(root, 'dynamicOrderBy',
|
|
1357
|
+
assetTypes: root => getQueryParameter(root, 'assetTypes', []),
|
|
1358
|
+
contentTypeIds: root => getQueryParameter(root, 'contentTypeIds', []),
|
|
1359
|
+
customWhere: root => getQueryParameter(root, 'customWhere', []),
|
|
1360
|
+
dynamicOrderBy: root => getQueryParameter(root, 'dynamicOrderBy', []),
|
|
1315
1361
|
env: ({
|
|
1316
1362
|
state,
|
|
1317
1363
|
facet,
|
|
@@ -1327,19 +1373,19 @@ const queryParamsTemplate = {
|
|
|
1327
1373
|
return null;
|
|
1328
1374
|
},
|
|
1329
1375
|
featuredResults: root => getQueryParameter(root, 'featuredResults', null),
|
|
1330
|
-
fields: root => getQueryParameter(root, 'fields',
|
|
1376
|
+
fields: root => getQueryParameter(root, 'fields', []),
|
|
1331
1377
|
filters: ({
|
|
1332
1378
|
state,
|
|
1333
1379
|
facet,
|
|
1334
1380
|
context
|
|
1335
1381
|
}) => {
|
|
1336
|
-
const stateFilters = getFilters(state, facet, context)
|
|
1337
|
-
const selectedFilters = getSelectedFilters(state, facet, context)
|
|
1382
|
+
const stateFilters = getFilters(state, facet, context, 'js');
|
|
1383
|
+
const selectedFilters = getSelectedFilters(state, facet, context, 'js'); // Use another mapping function to map the filter parameters for the query
|
|
1338
1384
|
|
|
1339
1385
|
const filterParams = mapFiltersToFilterExpression(stateFilters, selectedFilters);
|
|
1340
1386
|
return filterParams;
|
|
1341
1387
|
},
|
|
1342
|
-
includeInSearchFields: root => getQueryParameter(root, 'includeInSearch',
|
|
1388
|
+
includeInSearchFields: root => getQueryParameter(root, 'includeInSearch', []),
|
|
1343
1389
|
internalPageIndex: ({
|
|
1344
1390
|
action,
|
|
1345
1391
|
state
|
|
@@ -1350,7 +1396,7 @@ const queryParamsTemplate = {
|
|
|
1350
1396
|
}) => action.defaultLang ? [action.defaultLang] : [],
|
|
1351
1397
|
linkDepth: root => getQueryParameter(root, 'linkDepth', 0),
|
|
1352
1398
|
loadMorePaging: root => getQueryParameter(root, 'loadMorePaging', false),
|
|
1353
|
-
orderBy: root => getQueryParameter(root, 'orderBy',
|
|
1399
|
+
orderBy: root => getQueryParameter(root, 'orderBy', []),
|
|
1354
1400
|
pageIndex: root => {
|
|
1355
1401
|
const {
|
|
1356
1402
|
action,
|
|
@@ -1375,31 +1421,35 @@ const queryParamsTemplate = {
|
|
|
1375
1421
|
state,
|
|
1376
1422
|
facet,
|
|
1377
1423
|
context
|
|
1378
|
-
}) =>
|
|
1424
|
+
}) => {
|
|
1425
|
+
var _getFacet;
|
|
1426
|
+
|
|
1427
|
+
return (_getFacet = getFacet(state, facet, context)) === null || _getFacet === void 0 ? void 0 : _getFacet.projectId;
|
|
1428
|
+
},
|
|
1379
1429
|
searchTerm: root => root.context !== Context.minilist || getQueryParameter(root, 'useSearchTerm', false) ? getSearchTerm(root.state) : '',
|
|
1380
1430
|
selectedFilters: ({
|
|
1381
1431
|
state,
|
|
1382
1432
|
facet,
|
|
1383
1433
|
context
|
|
1384
|
-
}) => getSelectedFilters(state, facet, context).map(f => f === null || f === void 0 ? void 0 : f.join(',')),
|
|
1434
|
+
}) => Object.fromEntries(Object.entries(getSelectedFilters(state, facet, context, 'js')).map(([key, f]) => [key, f === null || f === void 0 ? void 0 : f.join(',')])),
|
|
1385
1435
|
versionStatus: ({
|
|
1386
1436
|
state
|
|
1387
1437
|
}) => selectVersionStatus(state),
|
|
1388
1438
|
weightedSearchFields: root => {
|
|
1389
|
-
const wsf = getQueryParameter(root, 'weightedSearchFields',
|
|
1390
|
-
const deduped = wsf.
|
|
1439
|
+
const wsf = getQueryParameter(root, 'weightedSearchFields', []);
|
|
1440
|
+
const deduped = wsf.filter((v, i, a) => a.findIndex(t => t.fieldId === v.fieldId) === i);
|
|
1391
1441
|
return deduped; // return wsf;
|
|
1392
1442
|
},
|
|
1393
|
-
webpageTemplates: root => getQueryParameter(root, 'webpageTemplates',
|
|
1443
|
+
webpageTemplates: root => getQueryParameter(root, 'webpageTemplates', [])
|
|
1394
1444
|
};
|
|
1395
1445
|
|
|
1396
|
-
const mapStateToQueryParams = sourceJson =>
|
|
1446
|
+
const mapStateToQueryParams = sourceJson => mapJson(sourceJson, queryParamsTemplate);
|
|
1397
1447
|
|
|
1398
1448
|
/**
|
|
1399
1449
|
* 1, Generates all the parameters required to run the search query.
|
|
1400
1450
|
* 2, Tells us if we should run the search.
|
|
1401
1451
|
* @param {object} action
|
|
1402
|
-
* @param {
|
|
1452
|
+
* @param {AppState} state
|
|
1403
1453
|
* @returns [queryParams, runSearch]
|
|
1404
1454
|
*/
|
|
1405
1455
|
const generateQueryParams = (action, state) => {
|
|
@@ -1434,7 +1484,8 @@ const runSearch = (action, state, queryParams) => {
|
|
|
1434
1484
|
} = action;
|
|
1435
1485
|
let willRun = false;
|
|
1436
1486
|
const facetIsLoaded = defaultLang ? false : getIsLoaded(state, context, facet);
|
|
1437
|
-
const stateParams = getQueryParams(ogState, facet, context)
|
|
1487
|
+
const stateParams = { ...getQueryParams(ogState, facet, context)
|
|
1488
|
+
};
|
|
1438
1489
|
stateParams.pageIndex = getPageIndex(ogState, facet, context);
|
|
1439
1490
|
stateParams.searchTerm = getSearchTerm(ogState);
|
|
1440
1491
|
|
|
@@ -1475,7 +1526,7 @@ const filterParamsChanged = (action, state) => {
|
|
|
1475
1526
|
params,
|
|
1476
1527
|
ogState = state
|
|
1477
1528
|
} = action;
|
|
1478
|
-
const selectedFilters = getSelectedFilters(ogState, facet, context)
|
|
1529
|
+
const selectedFilters = getSelectedFilters(ogState, facet, context, 'js');
|
|
1479
1530
|
const paramsChanged = Object.entries(selectedFilters).map(([filterKey, selectedValues]) => {
|
|
1480
1531
|
const inboundValues = params && params[filterKey] && params[filterKey].split(',') || [];
|
|
1481
1532
|
if (!areArraysEqualSets(selectedValues, inboundValues)) return true;
|
|
@@ -1487,11 +1538,11 @@ const filterParamsChanged = (action, state) => {
|
|
|
1487
1538
|
const debugExecuteSearch = (action, state) => {
|
|
1488
1539
|
const [queryParams, runSearch] = generateQueryParams(action, state);
|
|
1489
1540
|
console.log('runSearch', runSearch, 'action', action, 'filterParamsChanged', filterParamsChanged(action, state), 'getIsLoaded(state, context, facet)', getIsLoaded(state, action.context, action.facet));
|
|
1490
|
-
const stateParams = getQueryParams(action.ogState || state, action.facet, action.context)
|
|
1541
|
+
const stateParams = getQueryParams(action.ogState || state, action.facet, action.context);
|
|
1491
1542
|
stateParams.pageIndex = getPageIndex(action.ogState || state, action.facet, action.context);
|
|
1492
1543
|
stateParams.searchTerm = getSearchTerm(action.ogState || state);
|
|
1493
1544
|
console.log(stateParams, queryParams);
|
|
1494
|
-
console.log('getSelectedFilters', getSelectedFilters(action.ogState || state, action.facet, action.context)
|
|
1545
|
+
console.log('getSelectedFilters', getSelectedFilters(action.ogState || state, action.facet, action.context, 'js'), 'params', action.params);
|
|
1495
1546
|
};
|
|
1496
1547
|
|
|
1497
1548
|
// Base mapping, fields that are the same across all mappings
|
|
@@ -1520,6 +1571,9 @@ const mapEntriesToFilterItems = entries => {
|
|
|
1520
1571
|
};
|
|
1521
1572
|
|
|
1522
1573
|
const searchSagas = [takeEvery(CLEAR_FILTERS, clearFilters$1), takeEvery(DO_SEARCH, doSearch), takeEvery(SET_ROUTE_FILTERS, loadFilters), takeEvery(SET_SEARCH_ENTRIES, preloadOtherFacets), takeEvery(UPDATE_CURRENT_FACET, updateCurrentFacet$1), takeEvery(UPDATE_CURRENT_TAB, updateCurrentTab$1), takeEvery(UPDATE_PAGE_INDEX, updatePageIndex$1), takeEvery(UPDATE_SEARCH_TERM, updateSearchTerm$1), takeEvery(UPDATE_SORT_ORDER, updateSortOrder$1), takeEvery(UPDATE_SELECTED_FILTERS, applySearchFilter)];
|
|
1574
|
+
|
|
1575
|
+
const toJS$1 = obj => obj && 'toJS' in obj && typeof obj.toJS === 'function' ? obj.toJS() : obj;
|
|
1576
|
+
|
|
1523
1577
|
function* setRouteFilters(action) {
|
|
1524
1578
|
const {
|
|
1525
1579
|
mappers,
|
|
@@ -1529,14 +1583,16 @@ function* setRouteFilters(action) {
|
|
|
1529
1583
|
debug
|
|
1530
1584
|
} = action;
|
|
1531
1585
|
const context = listingType ? Context.listings : Context.facets;
|
|
1532
|
-
const state = yield select();
|
|
1586
|
+
const state = toJS$1(yield select());
|
|
1533
1587
|
const ssr = getIsSsr(state); // Get current facet from params or state
|
|
1534
1588
|
|
|
1535
1589
|
let currentFacet = params && params.facet || listingType; // Pick the default facet from initialState
|
|
1536
1590
|
|
|
1537
1591
|
if (!currentFacet) {
|
|
1538
|
-
|
|
1539
|
-
|
|
1592
|
+
var _Object$keys;
|
|
1593
|
+
|
|
1594
|
+
const tabs = getSearchTabs(state, 'js');
|
|
1595
|
+
currentFacet = (tabs === null || tabs === void 0 ? void 0 : tabs[0].defaultFacet) || ((_Object$keys = Object.keys(getFacets(state, 'js'))) === null || _Object$keys === void 0 ? void 0 : _Object$keys[0]) || '';
|
|
1540
1596
|
}
|
|
1541
1597
|
|
|
1542
1598
|
const nextAction = {
|
|
@@ -1557,7 +1613,7 @@ function* setRouteFilters(action) {
|
|
|
1557
1613
|
});
|
|
1558
1614
|
}
|
|
1559
1615
|
function* doSearch(action) {
|
|
1560
|
-
const state = yield select();
|
|
1616
|
+
const state = toJS$1(yield select());
|
|
1561
1617
|
|
|
1562
1618
|
if (action.config) {
|
|
1563
1619
|
// If the action contains a config object, we can add this to the
|
|
@@ -1583,30 +1639,30 @@ function* loadFilters(action) {
|
|
|
1583
1639
|
context,
|
|
1584
1640
|
mappers = {}
|
|
1585
1641
|
} = action;
|
|
1586
|
-
const filtersToLoad = yield select(getFiltersToLoad, facetKey, context);
|
|
1642
|
+
const filtersToLoad = yield select(getFiltersToLoad, facetKey, context, 'js');
|
|
1587
1643
|
|
|
1588
|
-
if (filtersToLoad.
|
|
1644
|
+
if (filtersToLoad.length > 0) {
|
|
1589
1645
|
yield put({
|
|
1590
1646
|
type: LOAD_FILTERS,
|
|
1591
1647
|
filtersToLoad,
|
|
1592
1648
|
facetKey,
|
|
1593
1649
|
context
|
|
1594
1650
|
});
|
|
1595
|
-
const selectedKeys = yield select(getSelectedFilters, facetKey, context);
|
|
1596
|
-
const facet = yield select(getFacet, facetKey, context);
|
|
1597
|
-
const filters = facet.
|
|
1598
|
-
const projectId = facet.
|
|
1651
|
+
const selectedKeys = yield select(getSelectedFilters, facetKey, context, 'js');
|
|
1652
|
+
const facet = yield select(getFacet, facetKey, context, 'js');
|
|
1653
|
+
const filters = facet.filters || {};
|
|
1654
|
+
const projectId = facet.projectId;
|
|
1599
1655
|
const filtersToLoadSagas = filters && filtersToLoad.map((filterKey = '') => {
|
|
1600
1656
|
return call(loadFilter, {
|
|
1601
1657
|
facetKey,
|
|
1602
1658
|
filterKey,
|
|
1603
|
-
filter: filters
|
|
1659
|
+
filter: filters[filterKey],
|
|
1604
1660
|
projectId,
|
|
1605
|
-
selectedKeys: selectedKeys
|
|
1661
|
+
selectedKeys: selectedKeys[filterKey],
|
|
1606
1662
|
context,
|
|
1607
1663
|
mapper: 'filterItems' in mappers && mappers.filterItems || mapEntriesToFilterItems
|
|
1608
1664
|
});
|
|
1609
|
-
})
|
|
1665
|
+
});
|
|
1610
1666
|
if (filtersToLoadSagas) yield all(filtersToLoadSagas);
|
|
1611
1667
|
}
|
|
1612
1668
|
}
|
|
@@ -1625,7 +1681,7 @@ function* loadFilter(action) {
|
|
|
1625
1681
|
contentTypeId,
|
|
1626
1682
|
customWhere,
|
|
1627
1683
|
path
|
|
1628
|
-
} =
|
|
1684
|
+
} = filter;
|
|
1629
1685
|
const createStateFrom = {
|
|
1630
1686
|
type: LOAD_FILTERS_COMPLETE,
|
|
1631
1687
|
context,
|
|
@@ -1691,6 +1747,7 @@ function* ensureSearch(action) {
|
|
|
1691
1747
|
});
|
|
1692
1748
|
}
|
|
1693
1749
|
} catch (error$1) {
|
|
1750
|
+
// eslint-disable-next-line import/namespace
|
|
1694
1751
|
error(...['Error running search saga:', error$1, error$1.stack]);
|
|
1695
1752
|
}
|
|
1696
1753
|
}
|
|
@@ -1708,7 +1765,7 @@ function* executeSearch(action) {
|
|
|
1708
1765
|
let result = {};
|
|
1709
1766
|
let featuredResult;
|
|
1710
1767
|
let featuredQuery;
|
|
1711
|
-
const customApi = getCustomApi(state, facet, context);
|
|
1768
|
+
const customApi = getCustomApi(state, facet, context, 'js');
|
|
1712
1769
|
|
|
1713
1770
|
if (customApi) {
|
|
1714
1771
|
const apiParams = typeof mappers === 'object' && typeof mappers.customApi === 'function' && mappers.customApi(queryParams) || {};
|
|
@@ -1734,13 +1791,14 @@ function* executeSearch(action) {
|
|
|
1734
1791
|
action,
|
|
1735
1792
|
featuredResult,
|
|
1736
1793
|
pageIndex: queryParams.internalPaging && queryParams.internalPageIndex || queryParams.pageIndex,
|
|
1737
|
-
prevResults: getResults(state, facet, action.context),
|
|
1794
|
+
prevResults: getResults(state, facet, action.context, 'js'),
|
|
1738
1795
|
result,
|
|
1739
1796
|
state
|
|
1740
1797
|
};
|
|
1741
1798
|
const nextAction = mapJson(createStateFrom, facetTemplate);
|
|
1742
1799
|
yield put(nextAction);
|
|
1743
1800
|
} catch (error$1) {
|
|
1801
|
+
// eslint-disable-next-line import/namespace
|
|
1744
1802
|
error(...['Error running search saga:', error$1, error$1.stack]);
|
|
1745
1803
|
}
|
|
1746
1804
|
}
|
|
@@ -1756,7 +1814,7 @@ function* preloadOtherFacets(action) {
|
|
|
1756
1814
|
const currentFacet = getCurrentFacet(state);
|
|
1757
1815
|
|
|
1758
1816
|
if (!preload && facet === currentFacet && context !== Context.listings) {
|
|
1759
|
-
const allFacets = getFacets(state)
|
|
1817
|
+
const allFacets = getFacets(state, 'js');
|
|
1760
1818
|
const otherFacets = Object.keys(allFacets).filter(f => f !== currentFacet);
|
|
1761
1819
|
yield all(otherFacets.map((preloadFacet = '') => {
|
|
1762
1820
|
const preloadAction = { ...action,
|
|
@@ -1781,19 +1839,19 @@ function* updateCurrentTab$1(action) {
|
|
|
1781
1839
|
mappers
|
|
1782
1840
|
} = action;
|
|
1783
1841
|
const state = yield select();
|
|
1784
|
-
const facets = getFacets(state);
|
|
1785
|
-
const tabs = getSearchTabs(state);
|
|
1786
|
-
let nextFacet = tabs
|
|
1842
|
+
const facets = getFacets(state, 'js');
|
|
1843
|
+
const tabs = getSearchTabs(state, 'js');
|
|
1844
|
+
let nextFacet = tabs === null || tabs === void 0 ? void 0 : tabs[id].currentFacet;
|
|
1787
1845
|
|
|
1788
1846
|
if (!nextFacet) {
|
|
1789
|
-
facets.map((
|
|
1790
|
-
if (facet.
|
|
1847
|
+
Object.entries(facets).map(([facetName, facet]) => {
|
|
1848
|
+
if (facet.tabId === id && (tabs === null || tabs === void 0 ? void 0 : tabs[id].defaultFacet) === facetName) nextFacet = facetName;
|
|
1791
1849
|
});
|
|
1792
1850
|
} // If the next Tab does not have a defaultFacet,
|
|
1793
1851
|
// take the first facet for that tab
|
|
1794
1852
|
|
|
1795
1853
|
|
|
1796
|
-
if (!nextFacet) nextFacet = facets.filter((f
|
|
1854
|
+
if (!nextFacet) nextFacet = Object.entries(facets).filter(([, f]) => f.tabId === id)[0][0];
|
|
1797
1855
|
yield put(withMappers(updateCurrentFacet(nextFacet), mappers));
|
|
1798
1856
|
}
|
|
1799
1857
|
|
|
@@ -1880,6 +1938,15 @@ function* buildUri({
|
|
|
1880
1938
|
return `${uri.path}${uri.search && `?${uri.search}` || ''}${uri.hash && `#${uri.hash}` || ''}`;
|
|
1881
1939
|
}
|
|
1882
1940
|
|
|
1941
|
+
const makeSelectMinilistProps = () => createSelector(state => state, (_, id) => id, (state, id) => ({
|
|
1942
|
+
facet: getFacet(state, id, Context.minilist, 'js'),
|
|
1943
|
+
filters: getFilters(state, id, Context.minilist, 'js'),
|
|
1944
|
+
isLoading: getIsLoading(state, Context.minilist, id),
|
|
1945
|
+
pagingInfo: getPaging(state, id, Context.minilist, 'js'),
|
|
1946
|
+
results: getResults(state, id, Context.minilist, 'js'),
|
|
1947
|
+
searchTerm: getSearchTerm(state)
|
|
1948
|
+
}));
|
|
1949
|
+
|
|
1883
1950
|
const useMinilist = ({
|
|
1884
1951
|
id,
|
|
1885
1952
|
config,
|
|
@@ -1893,6 +1960,7 @@ const useMinilist = ({
|
|
|
1893
1960
|
id: ''
|
|
1894
1961
|
}) => {
|
|
1895
1962
|
const dispatch = useDispatch();
|
|
1963
|
+
const selectMinilistProps = useMemo(makeSelectMinilistProps, [id]);
|
|
1896
1964
|
const {
|
|
1897
1965
|
facet,
|
|
1898
1966
|
filters,
|
|
@@ -1900,14 +1968,15 @@ const useMinilist = ({
|
|
|
1900
1968
|
pagingInfo,
|
|
1901
1969
|
results,
|
|
1902
1970
|
searchTerm
|
|
1903
|
-
} = useSelector(state => ({
|
|
1904
|
-
|
|
1905
|
-
|
|
1906
|
-
|
|
1907
|
-
|
|
1908
|
-
|
|
1909
|
-
|
|
1910
|
-
}));
|
|
1971
|
+
} = useSelector(state => selectMinilistProps(state, id)); // useSelector((state: AppState) => ({
|
|
1972
|
+
// facet: getFacet(state, id, Context.minilist).toJS(),
|
|
1973
|
+
// filters: getFilters(state, id, Context.minilist).toJS(),
|
|
1974
|
+
// isLoading: getIsLoading(state, Context.minilist, id),
|
|
1975
|
+
// pagingInfo: getPaging(state, id, Context.minilist).toJS(),
|
|
1976
|
+
// results: getResults(state, id, Context.minilist).toJS(),
|
|
1977
|
+
// searchTerm: getSearchTerm(state),
|
|
1978
|
+
// }));
|
|
1979
|
+
|
|
1911
1980
|
useEffect(() => {
|
|
1912
1981
|
if (id && (mapper || mappers && mappers.results)) {
|
|
1913
1982
|
dispatch(triggerSearch({
|
|
@@ -1933,68 +2002,72 @@ const useMinilist = ({
|
|
|
1933
2002
|
};
|
|
1934
2003
|
};
|
|
1935
2004
|
|
|
1936
|
-
const entries =
|
|
2005
|
+
const entries = {
|
|
1937
2006
|
isLoading: false,
|
|
1938
2007
|
isError: false,
|
|
1939
|
-
items:
|
|
1940
|
-
}
|
|
1941
|
-
const pagingInfo =
|
|
2008
|
+
items: []
|
|
2009
|
+
};
|
|
2010
|
+
const pagingInfo = {
|
|
1942
2011
|
isLoading: false,
|
|
1943
2012
|
pageCount: 0,
|
|
1944
2013
|
pageIndex: 0,
|
|
1945
2014
|
pageSize: 0,
|
|
1946
|
-
pagesLoaded:
|
|
2015
|
+
pagesLoaded: [],
|
|
1947
2016
|
prevPageIndex: 0,
|
|
1948
2017
|
totalCount: 0
|
|
1949
|
-
}
|
|
1950
|
-
const searchFacet =
|
|
2018
|
+
};
|
|
2019
|
+
const searchFacet = {
|
|
1951
2020
|
title: null,
|
|
1952
2021
|
featuredEntries: entries,
|
|
1953
|
-
featuredResults:
|
|
2022
|
+
featuredResults: [],
|
|
1954
2023
|
entries,
|
|
1955
|
-
results:
|
|
1956
|
-
queryParams:
|
|
1957
|
-
filters:
|
|
2024
|
+
results: [],
|
|
2025
|
+
queryParams: {},
|
|
2026
|
+
filters: {},
|
|
1958
2027
|
queryDuration: 0,
|
|
1959
2028
|
pagingInfo,
|
|
1960
2029
|
projectId: ''
|
|
1961
|
-
}
|
|
1962
|
-
const searchTab =
|
|
2030
|
+
};
|
|
2031
|
+
const searchTab = {
|
|
1963
2032
|
currentFacet: undefined,
|
|
1964
|
-
facets:
|
|
2033
|
+
facets: {},
|
|
1965
2034
|
id: 0,
|
|
1966
2035
|
label: undefined,
|
|
1967
2036
|
totalCount: ''
|
|
1968
|
-
}
|
|
1969
|
-
const filtering =
|
|
2037
|
+
};
|
|
2038
|
+
const filtering = {
|
|
1970
2039
|
isLoading: false,
|
|
1971
2040
|
isError: false,
|
|
1972
2041
|
isGrouped: false,
|
|
1973
2042
|
title: undefined,
|
|
1974
2043
|
contentTypeId: undefined,
|
|
1975
|
-
customWhere:
|
|
2044
|
+
customWhere: [],
|
|
1976
2045
|
fieldId: undefined,
|
|
1977
|
-
items:
|
|
1978
|
-
}
|
|
1979
|
-
const filterItem =
|
|
2046
|
+
items: []
|
|
2047
|
+
};
|
|
2048
|
+
const filterItem = {
|
|
1980
2049
|
key: '',
|
|
1981
2050
|
type: undefined,
|
|
1982
2051
|
title: undefined,
|
|
1983
2052
|
path: undefined,
|
|
1984
2053
|
isSelected: false
|
|
1985
|
-
}
|
|
1986
|
-
const config =
|
|
2054
|
+
};
|
|
2055
|
+
const config = {
|
|
1987
2056
|
isLoaded: false,
|
|
1988
2057
|
isError: false
|
|
1989
|
-
}
|
|
2058
|
+
};
|
|
1990
2059
|
const searchState = {
|
|
2060
|
+
context: 'facets',
|
|
1991
2061
|
currentFacet: '',
|
|
2062
|
+
currentListing: '',
|
|
2063
|
+
facets: {},
|
|
2064
|
+
listings: {},
|
|
2065
|
+
minilist: {},
|
|
1992
2066
|
term: '',
|
|
1993
|
-
|
|
1994
|
-
tabs: List(),
|
|
2067
|
+
tabs: [],
|
|
1995
2068
|
config
|
|
1996
2069
|
};
|
|
1997
|
-
const initialState =
|
|
2070
|
+
const initialState = searchState;
|
|
1998
2071
|
|
|
1999
2072
|
var schema = /*#__PURE__*/Object.freeze({
|
|
2000
2073
|
__proto__: null,
|
|
@@ -2007,8 +2080,6 @@ var schema = /*#__PURE__*/Object.freeze({
|
|
|
2007
2080
|
initialState: initialState
|
|
2008
2081
|
});
|
|
2009
2082
|
|
|
2010
|
-
// eslint-disable no-console
|
|
2011
|
-
|
|
2012
2083
|
const addConfigToState = (state, action) => {
|
|
2013
2084
|
const {
|
|
2014
2085
|
context,
|
|
@@ -2017,26 +2088,27 @@ const addConfigToState = (state, action) => {
|
|
|
2017
2088
|
} = action; // Adding or changing the config of a single facet, listing or minilist
|
|
2018
2089
|
|
|
2019
2090
|
if (context && facet && config) {
|
|
2020
|
-
|
|
2091
|
+
state[context][facet] = { ...searchFacet,
|
|
2092
|
+
...config
|
|
2093
|
+
};
|
|
2021
2094
|
} else if (config) {
|
|
2022
2095
|
// Changing the entire search config
|
|
2023
|
-
|
|
2024
|
-
return newState;
|
|
2096
|
+
state = config;
|
|
2025
2097
|
}
|
|
2026
2098
|
|
|
2027
2099
|
return state;
|
|
2028
2100
|
};
|
|
2029
2101
|
|
|
2030
2102
|
const generateSearchFacets = (context, config) => {
|
|
2031
|
-
|
|
2103
|
+
const facets = {};
|
|
2032
2104
|
|
|
2033
2105
|
if (config) {
|
|
2034
2106
|
const thisConfig = config[context] || {};
|
|
2035
2107
|
|
|
2036
2108
|
if (Object.keys(thisConfig).length > 0) {
|
|
2037
2109
|
Object.entries(thisConfig).map(([facetName, facet]) => {
|
|
2038
|
-
const newFacet =
|
|
2039
|
-
if (!('isDisabled' in facet) || facet.isDisabled !== true) facets =
|
|
2110
|
+
const newFacet = merge(searchFacet, facet);
|
|
2111
|
+
if (!('isDisabled' in facet) || facet.isDisabled !== true) facets[facetName] = newFacet;
|
|
2040
2112
|
});
|
|
2041
2113
|
}
|
|
2042
2114
|
}
|
|
@@ -2051,15 +2123,27 @@ const generateFiltersState = ({
|
|
|
2051
2123
|
isCurrentFacet
|
|
2052
2124
|
}, state) => {
|
|
2053
2125
|
// Remove filters we know about from params
|
|
2054
|
-
const filterParams =
|
|
2126
|
+
const filterParams = { ...params,
|
|
2055
2127
|
facet: undefined,
|
|
2056
2128
|
orderBy: undefined,
|
|
2057
2129
|
pageIndex: undefined,
|
|
2058
2130
|
term: undefined
|
|
2059
|
-
}
|
|
2131
|
+
}; // Get any existing filters and normalise the items[]
|
|
2060
2132
|
// so we can start off with isSelected is false
|
|
2061
2133
|
|
|
2062
|
-
let filters =
|
|
2134
|
+
let filters = Object.entries(state[context][facet].filters || []).map(([key, filter]) => {
|
|
2135
|
+
if (isCurrentFacet || filter.isGrouped) {
|
|
2136
|
+
var _filter$items;
|
|
2137
|
+
|
|
2138
|
+
return [key, { ...filter,
|
|
2139
|
+
items: (_filter$items = filter.items) === null || _filter$items === void 0 ? void 0 : _filter$items.map(item => ({ ...item,
|
|
2140
|
+
isSelected: false
|
|
2141
|
+
}))
|
|
2142
|
+
}];
|
|
2143
|
+
}
|
|
2144
|
+
|
|
2145
|
+
return [key, filter];
|
|
2146
|
+
});
|
|
2063
2147
|
|
|
2064
2148
|
const addFilterItem = (filters, paramKey, paramValue) => // Iterate through all filters within the facet,
|
|
2065
2149
|
// if the paramKey matches the filter key
|
|
@@ -2067,14 +2151,25 @@ const generateFiltersState = ({
|
|
|
2067
2151
|
// already exists, if so set isSelected to true,
|
|
2068
2152
|
// if not create a new filterItem, setting the key only
|
|
2069
2153
|
// so we can match this key later on when we load the filters
|
|
2070
|
-
filters.map((
|
|
2071
|
-
if (paramKey !== key || !isCurrentFacet && !filter.
|
|
2072
|
-
return filter;
|
|
2154
|
+
filters.map(([key, filter]) => {
|
|
2155
|
+
if (paramKey !== key || !isCurrentFacet && !filter.isGrouped) {
|
|
2156
|
+
return [key, filter];
|
|
2073
2157
|
} else {
|
|
2074
|
-
const items = filter.
|
|
2075
|
-
const itemIndex = items.findIndex(item => (item === null || item === void 0 ? void 0 : item.
|
|
2076
|
-
|
|
2077
|
-
|
|
2158
|
+
const items = filter.items || [];
|
|
2159
|
+
const itemIndex = items.findIndex(item => (item === null || item === void 0 ? void 0 : item.key) === paramValue);
|
|
2160
|
+
|
|
2161
|
+
if (items.length > 0 && itemIndex !== -1) {
|
|
2162
|
+
items[itemIndex].isSelected = true;
|
|
2163
|
+
} else {
|
|
2164
|
+
items.push({ ...filterItem,
|
|
2165
|
+
key: paramValue,
|
|
2166
|
+
isSelected: true
|
|
2167
|
+
});
|
|
2168
|
+
}
|
|
2169
|
+
|
|
2170
|
+
return [key, { ...filter,
|
|
2171
|
+
items
|
|
2172
|
+
}];
|
|
2078
2173
|
}
|
|
2079
2174
|
}); // For each value found in filterParams
|
|
2080
2175
|
// we are looking to split that value into multiple by any comma
|
|
@@ -2084,44 +2179,66 @@ const generateFiltersState = ({
|
|
|
2084
2179
|
// the search results during SSR without needing to fetch the filters first
|
|
2085
2180
|
|
|
2086
2181
|
|
|
2087
|
-
filterParams.map((
|
|
2088
|
-
return filters;
|
|
2182
|
+
Object.entries(filterParams).map(([paramName = '', paramValue]) => typeof paramValue === 'string' && paramValue.split(',').map(pVal => filters = addFilterItem(filters, paramName, pVal)));
|
|
2183
|
+
return Object.fromEntries(filters);
|
|
2089
2184
|
};
|
|
2090
2185
|
|
|
2091
|
-
const resetFacets = (state, context) =>
|
|
2186
|
+
const resetFacets = (state, context) => Object.fromEntries(Object.entries(state[context]).map(([k, v]) => [k, resetFacet(v)]));
|
|
2092
2187
|
|
|
2093
|
-
const resetFacet = facet =>
|
|
2188
|
+
const resetFacet = facet => {
|
|
2189
|
+
facet.pagingInfo.pagesLoaded = [];
|
|
2190
|
+
facet.pagingInfo.pageIndex = 0;
|
|
2191
|
+
facet.queryDuration = 0;
|
|
2192
|
+
return facet;
|
|
2193
|
+
};
|
|
2094
2194
|
|
|
2095
2195
|
var reducers = (config => {
|
|
2096
2196
|
// Add facets from SearchConfig to initialState
|
|
2097
|
-
const initState = initialState
|
|
2098
|
-
|
|
2099
|
-
|
|
2100
|
-
|
|
2197
|
+
const initState = { ...initialState,
|
|
2198
|
+
tabs: config.tabs,
|
|
2199
|
+
facets: generateSearchFacets(Context.facets, config),
|
|
2200
|
+
listings: generateSearchFacets(Context.listings, config),
|
|
2201
|
+
minilist: generateSearchFacets(Context.minilist, config)
|
|
2202
|
+
};
|
|
2203
|
+
return produce((state = initState, action) => {
|
|
2204
|
+
const context = state.context;
|
|
2205
|
+
const current = context !== 'listings' ? state.currentFacet : state.currentListing;
|
|
2101
2206
|
|
|
2102
2207
|
switch (action.type) {
|
|
2103
2208
|
case APPLY_CONFIG:
|
|
2104
2209
|
{
|
|
2105
|
-
|
|
2210
|
+
state = addConfigToState(state, action);
|
|
2211
|
+
return;
|
|
2106
2212
|
}
|
|
2107
2213
|
|
|
2108
2214
|
case CLEAR_FILTERS:
|
|
2109
2215
|
{
|
|
2110
|
-
const currentFilters = state
|
|
2111
|
-
|
|
2112
|
-
const filterItems = filter
|
|
2113
|
-
|
|
2114
|
-
|
|
2216
|
+
const currentFilters = state[context][current].filters;
|
|
2217
|
+
state[context][current].filters = Object.fromEntries(Object.entries(currentFilters).map(([key, filter]) => {
|
|
2218
|
+
const filterItems = filter.items || [];
|
|
2219
|
+
filter.items = filterItems.map(item => ({ ...item,
|
|
2220
|
+
isSelected: false
|
|
2221
|
+
}));
|
|
2222
|
+
return [key, filter];
|
|
2223
|
+
}));
|
|
2224
|
+
state[context][current].queryDuration = 0;
|
|
2225
|
+
state[context][current].pagingInfo.pagesLoaded = [];
|
|
2226
|
+
return;
|
|
2115
2227
|
}
|
|
2116
2228
|
|
|
2117
2229
|
case EXECUTE_SEARCH:
|
|
2118
2230
|
{
|
|
2119
|
-
|
|
2231
|
+
state[action.context][action.facet].entries.isLoading = true;
|
|
2232
|
+
return;
|
|
2120
2233
|
}
|
|
2121
2234
|
|
|
2122
2235
|
case EXECUTE_SEARCH_ERROR:
|
|
2123
2236
|
{
|
|
2124
|
-
|
|
2237
|
+
state[action.context][action.facet].entries = { ...entries,
|
|
2238
|
+
isError: true,
|
|
2239
|
+
error: action.error
|
|
2240
|
+
};
|
|
2241
|
+
return;
|
|
2125
2242
|
}
|
|
2126
2243
|
|
|
2127
2244
|
case LOAD_FILTERS:
|
|
@@ -2130,8 +2247,20 @@ var reducers = (config => {
|
|
|
2130
2247
|
facetKey,
|
|
2131
2248
|
filtersToLoad
|
|
2132
2249
|
} = action;
|
|
2133
|
-
const filters = state
|
|
2134
|
-
|
|
2250
|
+
const filters = state[action.context][facetKey].filters;
|
|
2251
|
+
Object.entries(filters).map(([filterKey, filter]) => {
|
|
2252
|
+
if (filtersToLoad.find(f => f === filterKey)) return { ...filter,
|
|
2253
|
+
isLoading: true
|
|
2254
|
+
};
|
|
2255
|
+
return filter;
|
|
2256
|
+
});
|
|
2257
|
+
state[action.context][facetKey].filters = Object.fromEntries(Object.entries(filters).map(([filterKey, filter]) => {
|
|
2258
|
+
if (filtersToLoad.find(f => f === filterKey)) return [filterKey, { ...filter,
|
|
2259
|
+
isLoading: true
|
|
2260
|
+
}];
|
|
2261
|
+
return [filterKey, filter];
|
|
2262
|
+
}));
|
|
2263
|
+
return;
|
|
2135
2264
|
}
|
|
2136
2265
|
|
|
2137
2266
|
case LOAD_FILTERS_ERROR:
|
|
@@ -2142,10 +2271,21 @@ var reducers = (config => {
|
|
|
2142
2271
|
filterKey,
|
|
2143
2272
|
nextFilter
|
|
2144
2273
|
} = action;
|
|
2145
|
-
const filter = state
|
|
2146
|
-
|
|
2147
|
-
|
|
2148
|
-
|
|
2274
|
+
const filter = state[action.context][facetKey].filters[filterKey];
|
|
2275
|
+
|
|
2276
|
+
if (!(nextFilter.items && nextFilter.items.length > 0) && (filter.items || []).length >= nextFilter.items.length) {
|
|
2277
|
+
// Preserve items already in state
|
|
2278
|
+
state[action.context][facetKey].filters[filterKey] = { ...filter,
|
|
2279
|
+
isLoading: false,
|
|
2280
|
+
isError: nextFilter.isError
|
|
2281
|
+
};
|
|
2282
|
+
return;
|
|
2283
|
+
}
|
|
2284
|
+
|
|
2285
|
+
state[action.context][facetKey].filters[filterKey] = merge(filter, nextFilter, {
|
|
2286
|
+
arrayMerge: (source, inbound) => inbound
|
|
2287
|
+
});
|
|
2288
|
+
return;
|
|
2149
2289
|
}
|
|
2150
2290
|
|
|
2151
2291
|
case SET_ROUTE_FILTERS:
|
|
@@ -2160,8 +2300,8 @@ var reducers = (config => {
|
|
|
2160
2300
|
pageIndex,
|
|
2161
2301
|
orderBy
|
|
2162
2302
|
} = params;
|
|
2163
|
-
const stateTerm = state.
|
|
2164
|
-
const tabId = state
|
|
2303
|
+
const stateTerm = state.term;
|
|
2304
|
+
const tabId = state[context][facet].tabId || 0; // Reset the facet if the search term has changed, or if the any of
|
|
2165
2305
|
// the filters have changed
|
|
2166
2306
|
|
|
2167
2307
|
const resetAllFacets = stateTerm && term !== stateTerm;
|
|
@@ -2169,7 +2309,7 @@ var reducers = (config => {
|
|
|
2169
2309
|
// causing unfetched filter items to be generated with isSelected: true
|
|
2170
2310
|
// or existing filter items to be tagged with isSelected: true
|
|
2171
2311
|
|
|
2172
|
-
const nextFacets =
|
|
2312
|
+
const nextFacets = Object.fromEntries(Object.entries(state[context]).map(([facetName = '', stateFacet]) => {
|
|
2173
2313
|
const isCurrentFacet = facetName === facet;
|
|
2174
2314
|
const nextFilters = generateFiltersState({
|
|
2175
2315
|
facet: facetName,
|
|
@@ -2177,18 +2317,32 @@ var reducers = (config => {
|
|
|
2177
2317
|
context,
|
|
2178
2318
|
isCurrentFacet
|
|
2179
2319
|
}, state);
|
|
2180
|
-
resetCurrentFacet = state.
|
|
2181
|
-
|
|
2182
|
-
|
|
2183
|
-
|
|
2184
|
-
|
|
2320
|
+
resetCurrentFacet = state.config.isLoaded === true && !equals(nextFilters, stateFacet.filters);
|
|
2321
|
+
stateFacet = resetCurrentFacet ? resetFacet(stateFacet) : stateFacet;
|
|
2322
|
+
stateFacet.filters = nextFilters;
|
|
2323
|
+
stateFacet.queryParams.dynamicOrderBy = toArray(orderBy) || [];
|
|
2324
|
+
return [facetName, stateFacet];
|
|
2325
|
+
}));
|
|
2326
|
+
state.context = context;
|
|
2327
|
+
state[context] = nextFacets;
|
|
2328
|
+
state[action.context === Context.facets ? 'currentFacet' : 'currentListing'] = facet;
|
|
2329
|
+
state.term = term;
|
|
2330
|
+
state.tabs[tabId].currentFacet = facet;
|
|
2331
|
+
state[context][facet].pagingInfo.pageIndex = Number(pageIndex) - 1 || (state[context][facet].queryParams.loadMorePaging ? state[context][facet].pagingInfo.pageIndex || 0 : 0);
|
|
2332
|
+
state.config.isLoaded = true;
|
|
2333
|
+
state.config.ssr = typeof window === 'undefined';
|
|
2334
|
+
if (resetAllFacets) state[context] = resetFacets(state, context);
|
|
2335
|
+
return;
|
|
2185
2336
|
}
|
|
2186
2337
|
|
|
2187
2338
|
case SET_SEARCH_ENTRIES:
|
|
2188
2339
|
{
|
|
2189
2340
|
const thisContext = action.context || context;
|
|
2190
|
-
const currentFacet = state
|
|
2191
|
-
|
|
2341
|
+
const currentFacet = state[thisContext][action.facet];
|
|
2342
|
+
state[thisContext][action.facet] = merge(currentFacet, action.nextFacet, {
|
|
2343
|
+
arrayMerge: (source, inbound) => inbound
|
|
2344
|
+
});
|
|
2345
|
+
return;
|
|
2192
2346
|
}
|
|
2193
2347
|
|
|
2194
2348
|
case SET_SEARCH_FILTERS:
|
|
@@ -2204,8 +2358,12 @@ var reducers = (config => {
|
|
|
2204
2358
|
isCurrentFacet: true
|
|
2205
2359
|
}, state);
|
|
2206
2360
|
const term = action === null || action === void 0 ? void 0 : (_action$params = action.params) === null || _action$params === void 0 ? void 0 : _action$params.term;
|
|
2207
|
-
const useSearchTerm = state
|
|
2208
|
-
|
|
2361
|
+
const useSearchTerm = state[action.context || Context.minilist][action.facet].queryParams.useSearchTerm || false;
|
|
2362
|
+
state[action.context || Context.minilist][action.facet].filters = filters;
|
|
2363
|
+
state[action.context || Context.minilist][action.facet].queryParams.excludeIds = action.excludeIds;
|
|
2364
|
+
state.term = useSearchTerm ? term : state.term;
|
|
2365
|
+
state.config.ssr = typeof window === 'undefined';
|
|
2366
|
+
return;
|
|
2209
2367
|
}
|
|
2210
2368
|
|
|
2211
2369
|
case UPDATE_PAGE_INDEX:
|
|
@@ -2213,16 +2371,21 @@ var reducers = (config => {
|
|
|
2213
2371
|
const {
|
|
2214
2372
|
pageIndex
|
|
2215
2373
|
} = action;
|
|
2216
|
-
const internalPaging = state
|
|
2217
|
-
const currentPageIndex = state
|
|
2218
|
-
|
|
2219
|
-
|
|
2220
|
-
|
|
2374
|
+
const internalPaging = state[context][current].queryParams.internalPaging || false;
|
|
2375
|
+
const currentPageIndex = state[context][current].pagingInfo.pageIndex || 0;
|
|
2376
|
+
state[context][current].pagingInfo.pageIndex = Number(pageIndex) || 0;
|
|
2377
|
+
state[context][current].pagingInfo.prevPageIndex = currentPageIndex;
|
|
2378
|
+
state[context][current].pagingInfo.isLoading = true;
|
|
2379
|
+
if (internalPaging) return;
|
|
2380
|
+
state[context][current].queryDuration = 0;
|
|
2381
|
+
return;
|
|
2221
2382
|
}
|
|
2222
2383
|
|
|
2223
2384
|
case UPDATE_SEARCH_TERM:
|
|
2224
2385
|
{
|
|
2225
|
-
|
|
2386
|
+
state.term = action.term;
|
|
2387
|
+
state[context] = resetFacets(state, context);
|
|
2388
|
+
return;
|
|
2226
2389
|
}
|
|
2227
2390
|
|
|
2228
2391
|
case UPDATE_SELECTED_FILTERS:
|
|
@@ -2231,16 +2394,24 @@ var reducers = (config => {
|
|
|
2231
2394
|
filter,
|
|
2232
2395
|
key
|
|
2233
2396
|
} = action;
|
|
2234
|
-
const isSingleSelect = state
|
|
2235
|
-
const isGrouped = state
|
|
2236
|
-
const currentItems = state
|
|
2237
|
-
|
|
2238
|
-
|
|
2239
|
-
|
|
2397
|
+
const isSingleSelect = state[context][current].filters[filter].isSingleSelect || false;
|
|
2398
|
+
const isGrouped = state[context][current].filters[filter].isGrouped || false;
|
|
2399
|
+
const currentItems = state[context][current].filters[filter].items;
|
|
2400
|
+
if (isGrouped) state[context] = resetFacets(state, context);
|
|
2401
|
+
state[context][current] = resetFacet(state[context][current]);
|
|
2402
|
+
state[context][current].filters[filter].items = currentItems === null || currentItems === void 0 ? void 0 : currentItems.map(item => {
|
|
2403
|
+
if (item.key === key) {
|
|
2404
|
+
return { ...item,
|
|
2405
|
+
isSelected: !item.isSelected
|
|
2406
|
+
};
|
|
2240
2407
|
}
|
|
2241
2408
|
|
|
2242
|
-
|
|
2243
|
-
|
|
2409
|
+
if (isSingleSelect) return { ...item,
|
|
2410
|
+
isSelected: false
|
|
2411
|
+
};
|
|
2412
|
+
return item;
|
|
2413
|
+
});
|
|
2414
|
+
return;
|
|
2244
2415
|
}
|
|
2245
2416
|
|
|
2246
2417
|
case UPDATE_SORT_ORDER:
|
|
@@ -2249,13 +2420,16 @@ var reducers = (config => {
|
|
|
2249
2420
|
orderBy,
|
|
2250
2421
|
facet
|
|
2251
2422
|
} = action;
|
|
2252
|
-
|
|
2423
|
+
state[context] = resetFacets(state, context);
|
|
2424
|
+
const currentFacet = facet || current;
|
|
2425
|
+
state[context][currentFacet].queryParams.dynamicOrderBy = orderBy ? toArray(orderBy) || [] : [];
|
|
2426
|
+
return;
|
|
2253
2427
|
}
|
|
2254
2428
|
|
|
2255
2429
|
default:
|
|
2256
|
-
return
|
|
2430
|
+
return;
|
|
2257
2431
|
}
|
|
2258
|
-
};
|
|
2432
|
+
}, initState);
|
|
2259
2433
|
});
|
|
2260
2434
|
|
|
2261
2435
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|