From 9695f369a9ee39b8efb1acbd6a645cc26ff3c2dc Mon Sep 17 00:00:00 2001 From: Jack Biscupski Date: Sat, 28 Dec 2019 12:33:30 -0600 Subject: [PATCH 1/3] ensure newRng stays in bounds --- src/components/rangeslider/draw.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/components/rangeslider/draw.js b/src/components/rangeslider/draw.js index 43902b66934..dee6b239eb0 100644 --- a/src/components/rangeslider/draw.js +++ b/src/components/rangeslider/draw.js @@ -99,6 +99,15 @@ module.exports = function(gd) { ]; } + // make sure the slider's axis range (axRng) doesn't go above the + // axis max or below the axis min (rng) + if(axRng[1] > rng[1]) { + newRng[1] = rng[1]; + } + if(axRng[0] < rng[0]) { + newRng[0] = rng[0]; + } + opts.range = opts._input.range = Lib.simpleMap(newRng, axisOpts.l2r); } From d43a27487cfcd3e65165be4035faa8bf74e24244 Mon Sep 17 00:00:00 2001 From: Jack Biscupski Date: Sun, 29 Dec 2019 21:05:23 -0600 Subject: [PATCH 2/3] disregard limits on range, focus on pixel max/min --- src/components/rangeslider/draw.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/components/rangeslider/draw.js b/src/components/rangeslider/draw.js index dee6b239eb0..5003b55b035 100644 --- a/src/components/rangeslider/draw.js +++ b/src/components/rangeslider/draw.js @@ -99,15 +99,6 @@ module.exports = function(gd) { ]; } - // make sure the slider's axis range (axRng) doesn't go above the - // axis max or below the axis min (rng) - if(axRng[1] > rng[1]) { - newRng[1] = rng[1]; - } - if(axRng[0] < rng[0]) { - newRng[0] = rng[0]; - } - opts.range = opts._input.range = Lib.simpleMap(newRng, axisOpts.l2r); } @@ -214,18 +205,27 @@ function setupDragElement(rangeSlider, gd, axisOpts, opts) { switch(target) { case slideBox: cursor = 'ew-resize'; + if(minVal + delta > axisOpts._length || maxVal + delta < 0) { + return; + } pixelMin = minVal + delta; pixelMax = maxVal + delta; break; case grabAreaMin: cursor = 'col-resize'; + if(minVal + delta > axisOpts._length) { + return; + } pixelMin = minVal + delta; pixelMax = maxVal; break; case grabAreaMax: cursor = 'col-resize'; + if(maxVal + delta < 0) { + return; + } pixelMin = minVal; pixelMax = maxVal + delta; break; From 897a91d5a79811c1272392e7bdb0f5c97d1c1f29 Mon Sep 17 00:00:00 2001 From: Jack Biscupski Date: Tue, 18 Feb 2020 13:34:12 -0600 Subject: [PATCH 3/3] tests for range slider --- test/jasmine/tests/range_slider_test.js | 44 ++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/test/jasmine/tests/range_slider_test.js b/test/jasmine/tests/range_slider_test.js index 36343fd0106..5f90429a690 100644 --- a/test/jasmine/tests/range_slider_test.js +++ b/test/jasmine/tests/range_slider_test.js @@ -190,12 +190,48 @@ describe('Visible rangesliders', function() { return slide(start, sliderY, end, sliderY); }) .then(function() { - var maskMax = getRangeSliderChild(3); - var handleMax = getRangeSliderChild(6); + var maskMin = getRangeSliderChild(3); + var handleMin = getRangeSliderChild(6); expect(gd.layout.xaxis.range).toBeCloseToArray([0, 45.04], -0.5); - expect(+maskMax.getAttribute('width')).toBeCloseTo(-diff); - testTranslate1D(handleMax, dataMaxStart + diff); + expect(+maskMin.getAttribute('width')).toBeCloseTo(-diff); + testTranslate1D(handleMin, dataMaxStart + diff); + }) + .catch(failTest) + .then(done); + }); + + it('should not exceed slider bounds left to right', function(done) { + var start = 940; + var end = 990; + + plotMock().then(function() { + gd._fullLayout.xaxis.d2p(49); + + expect(gd.layout.xaxis.range).toBeCloseToArray([0, 49]); + + return slide(start, sliderY, end, sliderY); + }) + .then(function() { + expect(gd.layout.xaxis.range).toBeCloseToArray([0, 49], -0.5); + }) + .catch(failTest) + .then(done); + }); + + it('should not exceed slider bounds right to left', function(done) { + var start = 0; + var end = -50; + + plotMock().then(function() { + gd._fullLayout.xaxis.d2p(-49); + + expect(gd.layout.xaxis.range).toBeCloseToArray([0, 49]); + + return slide(start, sliderY, end, sliderY); + }) + .then(function() { + expect(gd.layout.xaxis.range).toBeCloseToArray([0, 49], -0.5); }) .catch(failTest) .then(done);