Skip to content

Commit e7976ad

Browse files
author
Alexandre Stanislawski
committed
fix(clearsQuery): not applied when only the query was not empty
The clearsQuery option let you specify that the clearAll widget should also clear the query. However, when only the query was set, clearing had no effect.
1 parent 0cadcc3 commit e7976ad

File tree

3 files changed

+95
-6
lines changed

3 files changed

+95
-6
lines changed

src/connectors/clear-all/__tests__/connectClearAll-test.js

Lines changed: 87 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,12 @@ describe('connectClearAll', () => {
6060

6161
const helper = jsHelper({addAlgoliaAgent: () => {}}, '', {facets: ['myFacet']});
6262
helper.search = sinon.stub();
63+
helper.setQuery('not empty');
6364
helper.toggleRefinement('myFacet', 'myValue');
6465

6566
const rendering = sinon.stub();
6667
const makeWidget = connectClearAll(rendering);
67-
const widget = makeWidget();
68+
const widget = makeWidget({clearsQuery: false});
6869

6970
widget.init({
7071
helper,
@@ -74,10 +75,12 @@ describe('connectClearAll', () => {
7475
});
7576

7677
expect(helper.hasRefinements('myFacet')).toBe(true);
78+
expect(helper.state.query).toBe('not empty');
7779
const initClearMethod = rendering.lastCall.args[0].refine;
7880
initClearMethod();
7981

8082
expect(helper.hasRefinements('myFacet')).toBe(false);
83+
expect(helper.state.query).toBe('not empty');
8184

8285
helper.toggleRefinement('myFacet', 'someOtherValue');
8386

@@ -89,9 +92,57 @@ describe('connectClearAll', () => {
8992
});
9093

9194
expect(helper.hasRefinements('myFacet')).toBe(true);
95+
expect(helper.state.query).toBe('not empty');
9296
const renderClearMethod = rendering.lastCall.args[0].refine;
9397
renderClearMethod();
9498
expect(helper.hasRefinements('myFacet')).toBe(false);
99+
expect(helper.state.query).toBe('not empty');
100+
});
101+
102+
it('Receives a mean to clear the values (and the query)', () => {
103+
// test the function received by the rendering function
104+
// to clear the refinements
105+
106+
const helper = jsHelper({addAlgoliaAgent: () => {}}, '', {facets: ['myFacet']});
107+
helper.search = sinon.stub();
108+
helper.setQuery('a query');
109+
helper.toggleRefinement('myFacet', 'myValue');
110+
111+
const rendering = sinon.stub();
112+
const makeWidget = connectClearAll(rendering);
113+
const widget = makeWidget({clearsQuery: true});
114+
115+
widget.init({
116+
helper,
117+
state: helper.state,
118+
createURL: () => '#',
119+
onHistoryChange: () => {},
120+
});
121+
122+
expect(helper.hasRefinements('myFacet')).toBe(true);
123+
expect(helper.state.query).toBe('a query');
124+
const initClearMethod = rendering.lastCall.args[0].refine;
125+
initClearMethod();
126+
127+
expect(helper.hasRefinements('myFacet')).toBe(false);
128+
expect(helper.state.query).toBe('');
129+
130+
helper.toggleRefinement('myFacet', 'someOtherValue');
131+
helper.setQuery('another query');
132+
133+
widget.render({
134+
results: new SearchResults(helper.state, [{}]),
135+
state: helper.state,
136+
helper,
137+
createURL: () => '#',
138+
});
139+
140+
expect(helper.hasRefinements('myFacet')).toBe(true);
141+
expect(helper.state.query).toBe('another query');
142+
const renderClearMethod = rendering.lastCall.args[0].refine;
143+
renderClearMethod();
144+
expect(helper.hasRefinements('myFacet')).toBe(false);
145+
expect(helper.state.query).toBe('');
95146
});
96147

97148
it('some refinements from results <=> hasRefinements = true', () => {
@@ -124,16 +175,49 @@ describe('connectClearAll', () => {
124175
expect(rendering.lastCall.args[0].hasRefinements).toBe(true);
125176
});
126177

127-
it('no refinements <=> hasRefinements = false', () => {
178+
it('(clearsQuery: true) query not empty <=> hasRefinements = true', () => {
179+
// test if the values sent to the rendering function
180+
// are consistent with the search state
181+
const helper = jsHelper({addAlgoliaAgent: () => {}}, undefined, {facets: ['aFacet']});
182+
helper.setQuery('no empty');
183+
helper.search = sinon.stub();
184+
185+
const rendering = sinon.stub();
186+
const makeWidget = connectClearAll(rendering);
187+
const widget = makeWidget({
188+
clearsQuery: true,
189+
});
190+
191+
widget.init({
192+
helper,
193+
state: helper.state,
194+
createURL: () => '#',
195+
onHistoryChange: () => {},
196+
});
197+
198+
expect(rendering.lastCall.args[0].hasRefinements).toBe(true);
199+
200+
widget.render({
201+
results: new SearchResults(helper.state, [{}]),
202+
state: helper.state,
203+
helper,
204+
createURL: () => '#',
205+
});
206+
207+
expect(rendering.lastCall.args[0].hasRefinements).toBe(true);
208+
});
209+
210+
it('(clearsQuery: false) no refinements <=> hasRefinements = false', () => {
128211
// test if the values sent to the rendering function
129212
// are consistent with the search state
130213

131214
const helper = jsHelper({addAlgoliaAgent: () => {}});
215+
helper.setQuery('not empty');
132216
helper.search = sinon.stub();
133217

134218
const rendering = sinon.stub();
135219
const makeWidget = connectClearAll(rendering);
136-
const widget = makeWidget();
220+
const widget = makeWidget({clearsQuery: false});
137221

138222
widget.init({
139223
helper,

src/connectors/clear-all/connectClearAll.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,9 @@ export default function connectClearAll(renderFn) {
104104
.map(one => one.attributeName)
105105
.filter(one => excludeAttributes.indexOf(one) === -1);
106106

107-
const hasRefinements = clearAttributes.length !== 0;
107+
const hasRefinements = clearsQuery ?
108+
clearAttributes.length !== 0 || helper.state.query !== '' :
109+
clearAttributes.length !== 0;
108110
const preparedCreateURL = () => createURL(clearRefinementsFromState(helper.state, [], clearsQuery));
109111

110112
this._refine = refine({helper, clearAttributes, hasRefinements, clearsQuery});
@@ -123,7 +125,9 @@ export default function connectClearAll(renderFn) {
123125
.map(one => one.attributeName)
124126
.filter(one => excludeAttributes.indexOf(one) === -1);
125127

126-
const hasRefinements = clearAttributes.length !== 0;
128+
const hasRefinements = clearsQuery ?
129+
clearAttributes.length !== 0 || helper.state.query !== '' :
130+
clearAttributes.length !== 0;
127131
const preparedCreateURL = () => createURL(clearRefinementsFromState(state, [], clearsQuery));
128132

129133
this._refine = refine({helper, clearAttributes, hasRefinements, clearsQuery});

src/widgets/clear-all/clear-all.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,8 @@ clearAll({
9999
* templates: {
100100
* link: 'Reset everything'
101101
* },
102-
* autoHideContainer: false
102+
* autoHideContainer: false,
103+
* clearsQuery: true,
103104
* })
104105
* );
105106
*/

0 commit comments

Comments
 (0)