Skip to content

Commit 32918c9

Browse files
Maxime Jantonbobylito
authored andcommitted
fix(connectRefinementList): set default value for limit (#2517)
* fix(connectRefinementList): set default value for limit * fix(connectRefinementList): compute of `hasExhaustiveItems` in edge cases * docs(connectRefinementList): missing word * refactor(connectRefinementList): `rawItems` -> `facetValues`
1 parent 06aa626 commit 32918c9

File tree

2 files changed

+112
-9
lines changed

2 files changed

+112
-9
lines changed

src/connectors/refinement-list/__tests__/connectRefinementList-test.js

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ describe('connectRefinementList', () => {
4848

4949
expect(widget.getConfiguration()).toEqual({
5050
disjunctiveFacets: ['myFacet'],
51+
maxValuesPerFacet: 10,
5152
});
5253
});
5354

@@ -79,6 +80,7 @@ describe('connectRefinementList', () => {
7980

8081
expect(widget.getConfiguration()).toEqual({
8182
facets: ['myFacet'],
83+
maxValuesPerFacet: 10,
8284
});
8385
});
8486
});
@@ -234,6 +236,105 @@ describe('connectRefinementList', () => {
234236
expect(secondRenderingOptions.canToggleShowMore).toBe(false);
235237
});
236238

239+
it('If there are no showMoreLimit specified, canToggleShowMore is false', () => {
240+
const widget = makeWidget({
241+
attributeName: 'category',
242+
limit: 1,
243+
});
244+
245+
const helper = algoliasearchHelper(
246+
fakeClient,
247+
'',
248+
widget.getConfiguration({})
249+
);
250+
helper.search = sinon.stub();
251+
252+
widget.init({
253+
helper,
254+
state: helper.state,
255+
createURL: () => '#',
256+
onHistoryChange: () => {},
257+
});
258+
259+
widget.render({
260+
results: new SearchResults(helper.state, [
261+
{
262+
hits: [],
263+
facets: {
264+
category: {
265+
c1: 880,
266+
c2: 47,
267+
},
268+
},
269+
},
270+
{
271+
facets: {
272+
category: {
273+
c1: 880,
274+
c2: 47,
275+
},
276+
},
277+
},
278+
]),
279+
state: helper.state,
280+
helper,
281+
createURL: () => '#',
282+
});
283+
284+
const secondRenderingOptions = rendering.lastCall.args[0];
285+
expect(secondRenderingOptions.canToggleShowMore).toBe(false);
286+
});
287+
288+
it('If there are same amount of items then canToggleShowMore is false', () => {
289+
const widget = makeWidget({
290+
attributeName: 'category',
291+
limit: 2,
292+
showMoreLimit: 10,
293+
});
294+
295+
const helper = algoliasearchHelper(
296+
fakeClient,
297+
'',
298+
widget.getConfiguration({})
299+
);
300+
helper.search = sinon.stub();
301+
302+
widget.init({
303+
helper,
304+
state: helper.state,
305+
createURL: () => '#',
306+
onHistoryChange: () => {},
307+
});
308+
309+
widget.render({
310+
results: new SearchResults(helper.state, [
311+
{
312+
hits: [],
313+
facets: {
314+
category: {
315+
c1: 880,
316+
c2: 47,
317+
},
318+
},
319+
},
320+
{
321+
facets: {
322+
category: {
323+
c1: 880,
324+
c2: 47,
325+
},
326+
},
327+
},
328+
]),
329+
state: helper.state,
330+
helper,
331+
createURL: () => '#',
332+
});
333+
334+
const secondRenderingOptions = rendering.lastCall.args[0];
335+
expect(secondRenderingOptions.canToggleShowMore).toBe(false);
336+
});
337+
237338
it('If there are enough items then canToggleShowMore is true', () => {
238339
const widget = makeWidget({
239340
attributeName: 'category',
@@ -342,6 +443,7 @@ describe('connectRefinementList', () => {
342443
});
343444

344445
const secondRenderingOptions = rendering.lastCall.args[0];
446+
expect(secondRenderingOptions.canToggleShowMore).toEqual(true);
345447
expect(secondRenderingOptions.items).toEqual([
346448
{
347449
label: 'c1',

src/connectors/refinement-list/connectRefinementList.js

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ export const checkUsage = ({
5858
* @typedef {Object} CustomRefinementListWidgetOptions
5959
* @property {string} attributeName The name of the attribute in the records.
6060
* @property {"and"|"or"} [operator = 'or'] How the filters are combined together.
61-
* @property {number} [limit = undefined] The max number of items to display when
62-
* `showMoreLimit` is not or if the widget is showing less value.
61+
* @property {number} [limit = 10] The max number of items to display when
62+
* `showMoreLimit` is not set or if the widget is showing less value.
6363
* @property {number} [showMoreLimit] The max number of items to display if the widget
6464
* is showing more items.
6565
* @property {string[]|function} [sortBy = ['isRefined', 'count:desc', 'name:asc']] How to sort refinements. Possible values: `count|isRefined|name:asc|name:desc`.
@@ -148,7 +148,7 @@ export default function connectRefinementList(renderFn) {
148148
const {
149149
attributeName,
150150
operator = 'or',
151-
limit,
151+
limit = 10,
152152
showMoreLimit,
153153
sortBy = ['isRefined', 'count:desc', 'name:asc'],
154154
} = widgetParams;
@@ -202,7 +202,9 @@ export default function connectRefinementList(renderFn) {
202202
canRefine: isFromSearch || items.length > 0,
203203
widgetParams,
204204
isShowingMore,
205-
canToggleShowMore: isShowingMore || !hasExhaustiveItems,
205+
canToggleShowMore: showMoreLimit
206+
? isShowingMore || !hasExhaustiveItems
207+
: false,
206208
toggleShowMore,
207209
hasExhaustiveItems,
208210
},
@@ -328,12 +330,11 @@ export default function connectRefinementList(renderFn) {
328330
createURL,
329331
instantSearchInstance,
330332
} = renderOptions;
331-
const items = results
332-
.getFacetValues(attributeName, { sortBy })
333-
.slice(0, this.getLimit())
334-
.map(formatItems);
335333

336-
const hasExhaustiveItems = items.length < this.getLimit();
334+
const facetValues = results.getFacetValues(attributeName, { sortBy });
335+
const items = facetValues.slice(0, this.getLimit()).map(formatItems);
336+
337+
const hasExhaustiveItems = facetValues.length <= this.getLimit();
337338

338339
lastResultsFromMainSearch = items;
339340

0 commit comments

Comments
 (0)