Skip to content

Commit 1feb539

Browse files
authored
fix(toggle): read numerical facet results stats for toggle count (#1098)
fixes #1096
1 parent 265ace3 commit 1feb539

File tree

2 files changed

+35
-7
lines changed

2 files changed

+35
-7
lines changed

src/widgets/toggle/__tests__/toggle-test.js

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,8 @@ describe('toggle()', () => {
100100
search: sinon.spy()
101101
};
102102
state = {
103-
toggleRefinement: sinon.spy()
103+
toggleRefinement: sinon.spy(),
104+
isFacetRefined: sinon.stub().returns(false)
104105
};
105106
props = {
106107
cssClasses: {
@@ -185,6 +186,25 @@ describe('toggle()', () => {
185186
expect(ReactDOM.render.secondCall.args[0]).toEqualJSX(<RefinementList {...props} />);
186187
});
187188

189+
it('understands numerical facets results', () => {
190+
results = {
191+
nbHits: 2,
192+
getFacetStats: sinon.stub().returns({sum: 200})
193+
};
194+
widget = toggle({container, values: {on: 1, off: 2}, attributeName, label});
195+
widget.init({state, helper});
196+
widget.render({results, helper, state, createURL});
197+
198+
props = {
199+
facetValues: [{count: 200, isRefined: false, name: label}],
200+
shouldAutoHideContainer: false,
201+
...props
202+
};
203+
204+
expect(results.getFacetStats.args[0][0]).toEqual(attributeName);
205+
expect(ReactDOM.render.firstCall.args[0]).toEqualJSX(<RefinementList {...props} />);
206+
});
207+
188208
it('without facet values', () => {
189209
results = {
190210
hits: [],

src/widgets/toggle/toggle.js

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ toggle({
5454
container,
5555
attributeName,
5656
label,
57-
[ userValues={on: true, off: undefined} ],
57+
[ values={on: true, off: undefined} ],
5858
[ cssClasses.{root,header,body,footer,list,item,active,label,checkbox,count} ],
5959
[ templates.{header,item,footer} ],
6060
[ transformData.{item} ],
@@ -83,7 +83,7 @@ function toggle({
8383
throw new Error(usage);
8484
}
8585

86-
let hasAnOffValue = (userValues.off !== undefined);
86+
let hasAnOffValue = userValues.off !== undefined;
8787

8888
let cssClasses = {
8989
root: cx(bem(null), userCssClasses.root),
@@ -111,7 +111,8 @@ function toggle({
111111
});
112112
this.toggleRefinement = this.toggleRefinement.bind(this, helper);
113113

114-
if (userValues.off === undefined) {
114+
// no need to refine anything at init if no custom off values
115+
if (!hasAnOffValue) {
115116
return;
116117
}
117118
// Add filtering on the 'off' value if set
@@ -142,12 +143,19 @@ function toggle({
142143
},
143144
render: function({helper, results, state, createURL}) {
144145
let isRefined = helper.state.isFacetRefined(attributeName, userValues.on);
145-
let values = find(results.getFacetValues(attributeName), {name: isRefined.toString()});
146+
let currentRefinement = isRefined ? userValues.on : userValues.off;
147+
let count;
148+
if (typeof currentRefinement === 'number') {
149+
count = results.getFacetStats(attributeName).sum;
150+
} else {
151+
let facetData = find(results.getFacetValues(attributeName), {name: isRefined.toString()});
152+
count = facetData !== undefined ? facetData.count : null;
153+
}
146154

147155
let facetValue = {
148156
name: label,
149-
isRefined: isRefined,
150-
count: values && values.count || null
157+
isRefined,
158+
count
151159
};
152160

153161
// Bind createURL to this specific attribute

0 commit comments

Comments
 (0)