Skip to content

Commit 8ac494e

Browse files
author
vvo
committed
fix(toggle): pass isRefined to toggleRefinement
Was broken since perf improvements: we did not wanted to bind the function with isRefined in render() to avoid generating new function references each time. But we still need it, so passed all the way down from RefinementListItem
1 parent 5ff87f5 commit 8ac494e

File tree

5 files changed

+40
-28
lines changed

5 files changed

+40
-28
lines changed

src/components/RefinementList/RefinementList.js

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ class RefinementList extends React.Component {
1919
return nextState !== this.state || !isEqual(this.props.facetValues, nextProps.facetValues);
2020
}
2121

22-
refine(value) {
23-
this.props.toggleRefinement(value);
22+
refine(facetValueToRefine, isRefined) {
23+
this.props.toggleRefinement(facetValueToRefine, isRefined);
2424
}
2525

2626
_generateFacetItem(facetValue) {
@@ -53,8 +53,9 @@ class RefinementList extends React.Component {
5353

5454
return (
5555
<RefinementListItem
56-
facetValue={facetValue[this.props.attributeNameKey]}
56+
facetValueToRefine={facetValue[this.props.attributeNameKey]}
5757
handleClick={this.handleItemClick}
58+
isRefined={facetValue.isRefined}
5859
itemClassName={cssClassItem}
5960
key={key}
6061
subItems={subItems}
@@ -80,36 +81,36 @@ class RefinementList extends React.Component {
8081
//
8182
// Finally, we always stop propagation of the event to avoid multiple levels RefinementLists to fail: click
8283
// on child would click on parent also
83-
handleItemClick(value, e) {
84-
if (isSpecialClick(e)) {
84+
handleItemClick({facetValueToRefine, originalEvent, isRefined}) {
85+
if (isSpecialClick(originalEvent)) {
8586
// do not alter the default browser behavior
8687
// if one special key is down
8788
return;
8889
}
8990

90-
if (e.target.tagName === 'INPUT') {
91-
this.refine(value);
91+
if (originalEvent.target.tagName === 'INPUT') {
92+
this.refine(facetValueToRefine, isRefined);
9293
return;
9394
}
9495

95-
let parent = e.target;
96+
let parent = originalEvent.target;
9697

97-
while (parent !== e.currentTarget) {
98+
while (parent !== originalEvent.currentTarget) {
9899
if (parent.tagName === 'LABEL' && (parent.querySelector('input[type="checkbox"]')
99100
|| parent.querySelector('input[type="radio"]'))) {
100101
return;
101102
}
102103

103104
if (parent.tagName === 'A' && parent.href) {
104-
e.preventDefault();
105+
originalEvent.preventDefault();
105106
}
106107

107108
parent = parent.parentNode;
108109
}
109110

110-
e.stopPropagation();
111+
originalEvent.stopPropagation();
111112

112-
this.refine(value);
113+
this.refine(facetValueToRefine, isRefined);
113114
}
114115

115116
handleClickShowMore() {

src/components/RefinementList/RefinementListItem.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,12 @@ class RefinementListItem extends React.Component {
1212
return !isEqual(this.props, nextProps);
1313
}
1414

15-
handleClick(e) {
16-
this.props.handleClick(this.props.facetValue, e);
15+
handleClick(originalEvent) {
16+
this.props.handleClick({
17+
facetValueToRefine: this.props.facetValueToRefine,
18+
isRefined: this.props.isRefined,
19+
originalEvent
20+
});
1721
}
1822

1923
render() {
@@ -34,11 +38,12 @@ class RefinementListItem extends React.Component {
3438
}
3539

3640
RefinementListItem.propTypes = {
37-
facetValue: React.PropTypes.oneOfType([
41+
facetValueToRefine: React.PropTypes.oneOfType([
3842
React.PropTypes.string,
3943
React.PropTypes.number
4044
]).isRequired,
4145
handleClick: React.PropTypes.func.isRequired,
46+
isRefined: React.PropTypes.bool.isRequired,
4247
itemClassName: React.PropTypes.string,
4348
subItems: React.PropTypes.object,
4449
templateData: React.PropTypes.object.isRequired,

src/components/RefinementList/__tests__/RefinementList-test.js

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,17 +33,22 @@ describe('RefinementList', () => {
3333
parentListProps = {className: 'list'};
3434
itemProps = [{
3535
...commonItemProps,
36-
facetValue: 'facet1',
36+
itemClassName: 'item active',
37+
facetValueToRefine: 'facet1',
38+
isRefined: true,
3739
templateData: {
3840
...templateData,
39-
name: 'facet1'
41+
name: 'facet1',
42+
isRefined: true
4043
}
4144
}, {
4245
...commonItemProps,
43-
facetValue: 'facet2',
46+
facetValueToRefine: 'facet2',
47+
isRefined: false,
4448
templateData: {
4549
...templateData,
46-
name: 'facet2'
50+
name: 'facet2',
51+
isRefined: false
4752
}
4853
}];
4954
renderer = createRenderer();
@@ -63,8 +68,8 @@ describe('RefinementList', () => {
6368
/>
6469
</div>
6570
);
66-
expect(out.props.children[0][0].key).toEqual('facet1');
67-
expect(out.props.children[0][1].key).toEqual('facet2');
71+
expect(out.props.children[0][0].key).toEqual('facet1/true');
72+
expect(out.props.children[0][1].key).toEqual('facet2/false');
6873
});
6974

7075
it('should render default list highlighted', () => {
@@ -74,7 +79,6 @@ describe('RefinementList', () => {
7479
count: 42,
7580
isRefined: true
7681
};
77-
itemProps[0].itemClassName += ' active';
7882
expect(out).toEqualJSX(
7983
<div {...parentListProps}>
8084
<RefinementListItem
@@ -110,11 +114,13 @@ describe('RefinementList', () => {
110114
cssClasses: {
111115
depth: 'depth',
112116
item: 'item',
113-
list: 'list'
117+
list: 'list',
118+
active: 'active'
114119
},
115120
facetValues: [
116121
{
117122
name: 'facet1',
123+
isRefined: true,
118124
data: [
119125
{name: 'subfacet1'},
120126
{name: 'subfacet2'}
@@ -164,8 +170,8 @@ describe('RefinementList', () => {
164170
active: 'active'
165171
},
166172
facetValues: [
167-
{name: 'facet1'},
168-
{name: 'facet2'}
173+
{name: 'facet1', isRefined: true},
174+
{name: 'facet2', isRefined: false}
169175
],
170176
...extraProps
171177
};

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -253,10 +253,10 @@ describe('toggle()', () => {
253253
let values;
254254

255255
function toggleOn() {
256-
widget.toggleRefinement(helper, false);
256+
widget.toggleRefinement(helper, 'facetValueToRefine', false);
257257
}
258258
function toggleOff() {
259-
widget.toggleRefinement(helper, true);
259+
widget.toggleRefinement(helper, 'facetValueToRefine', true);
260260
}
261261

262262
beforeEach(() => {

src/widgets/toggle/toggle.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ function toggle({
113113
helper.addFacetRefinement(attributeName, userValues.off);
114114
}
115115
},
116-
toggleRefinement: (helper, isRefined) => {
116+
toggleRefinement: (helper, facetValue, isRefined) => {
117117
let on = userValues.on;
118118
let off = userValues.off;
119119

0 commit comments

Comments
 (0)