diff --git a/src/connectors/range-slider/__tests__/connectRangeSlider-test.js b/src/connectors/range-slider/__tests__/connectRangeSlider-test.js index c321e63707..2e4f2004cc 100644 --- a/src/connectors/range-slider/__tests__/connectRangeSlider-test.js +++ b/src/connectors/range-slider/__tests__/connectRangeSlider-test.js @@ -220,4 +220,45 @@ describe('connectRangeSlider', () => { expect(helper.getNumericRefinement('price', '<=')).toEqual(undefined); } }); + + it('should refine on boundaries when no min/max defined', () => { + const rendering = sinon.stub(); + const makeWidget = connectRangeSlider(rendering); + + const attributeName = 'price'; + const widget = makeWidget({ attributeName }); + + const helper = jsHelper(fakeClient, '', widget.getConfiguration()); + helper.search = sinon.stub(); + + widget.init({ + helper, + state: helper.state, + createURL: () => '#', + onHistoryChange: () => {}, + }); + + { + expect(helper.getNumericRefinement('price', '>=')).toEqual(undefined); + expect(helper.getNumericRefinement('price', '<=')).toEqual(undefined); + + const renderOptions = rendering.lastCall.args[0]; + const { refine } = renderOptions; + + refine([undefined, 100]); + expect(helper.getNumericRefinement('price', '>=')).toEqual(undefined); + expect(helper.getNumericRefinement('price', '<=')).toEqual([100]); + expect(helper.search.callCount).toBe(1); + + refine([0, undefined]); + expect(helper.getNumericRefinement('price', '>=')).toEqual([0]); + expect(helper.getNumericRefinement('price', '<=')).toEqual(undefined); + expect(helper.search.callCount).toBe(2); + + refine([0, 100]); + expect(helper.getNumericRefinement('price', '>=')).toEqual([0]); + expect(helper.getNumericRefinement('price', '<=')).toEqual([100]); + expect(helper.search.callCount).toBe(3); + } + }); }); diff --git a/src/connectors/range-slider/connectRangeSlider.js b/src/connectors/range-slider/connectRangeSlider.js index 415498dbc5..2442421610 100644 --- a/src/connectors/range-slider/connectRangeSlider.js +++ b/src/connectors/range-slider/connectRangeSlider.js @@ -132,10 +132,14 @@ export default function connectRangeSlider(renderFn) { currentValues[1] !== newValues[1] ) { helper.clearRefinements(attributeName); + + const hasMin = bounds.min !== null && bounds.min !== undefined; + const minValueChanged = + newValues[0] !== null && newValues[0] !== undefined; + if ( - bounds.min === null || - bounds.min === undefined || - newValues[0] > bounds.min + (hasMin && minValueChanged && bounds.min < newValues[0]) || + (!hasMin && minValueChanged) ) { helper.addNumericRefinement( attributeName, @@ -143,10 +147,14 @@ export default function connectRangeSlider(renderFn) { formatToNumber(newValues[0]) ); } + + const hasMax = bounds.max !== null && bounds.max !== undefined; + const maxValueChanged = + newValues[1] !== null && newValues[1] !== undefined; + if ( - bounds.max === null || - bounds.max === undefined || - newValues[1] < bounds.max + (hasMax && maxValueChanged && bounds.max > newValues[1]) || + (!hasMax && maxValueChanged) ) { helper.addNumericRefinement( attributeName,