Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions draftlogs/8098_fix.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Fix `rangeslider` not resetting correctly after zooming out [[#8098](https://github.com/plotly/plotly.js/pull/8098)]
4 changes: 2 additions & 2 deletions src/components/rangeslider/draw.js
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ module.exports = function(gd) {
// update range
// Expand slider range to the axis range
if(opts.range) {
var rng = Lib.simpleMap(opts.range, axisOpts.r2l);
var rng = Lib.simpleMap(opts._input.range || opts.range, axisOpts.r2l);
var axRng = Lib.simpleMap(axisOpts.range, axisOpts.r2l);
var newRng;

Expand All @@ -92,7 +92,7 @@ module.exports = function(gd) {
];
}

opts.range = opts._input.range = Lib.simpleMap(newRng, axisOpts.l2r);
opts.range = Lib.simpleMap(newRng, axisOpts.l2r);
}

axisOpts.cleanRange('rangeslider.range');
Expand Down
83 changes: 73 additions & 10 deletions test/jasmine/tests/range_slider_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -928,12 +928,15 @@ describe('rangesliders in general', function() {

afterEach(destroyGraphDiv);

function assertRange(axRange, rsRange) {
function assertRange(axRange, rsRange, fullLayoutRsRange) {
// lower toBeCloseToArray precision for FF38 on CI
var precision = 1e-2;

if(!fullLayoutRsRange) fullLayoutRsRange = rsRange;

expect(gd.layout.xaxis.range).toBeCloseToArray(axRange, precision);
expect(gd.layout.xaxis.rangeslider.range).toBeCloseToArray(rsRange, precision);
expect(gd._fullLayout.xaxis.rangeslider.range).toBeCloseToArray(fullLayoutRsRange, precision);
}

it('should plot when only x data is provided', function(done) {
Expand Down Expand Up @@ -988,6 +991,60 @@ describe('rangesliders in general', function() {
.then(done, done.fail);
});

it('should reset autoranged rangeslider range after axis autorange', function(done) {
var initialRange;

Plotly.newPlot(gd, [{
y: [2, 1, 2]
}], {
xaxis: { rangeslider: {} }
})
.then(function() {
initialRange = gd._fullLayout.xaxis.range.slice();

assertRange(initialRange, initialRange);

// zoom out
return Plotly.relayout(gd, 'xaxis.range', [-1, 3]);
})
.then(function() {
assertRange([-1, 3], initialRange, [-1, 3]);

// reset axis
return Plotly.relayout(gd, 'xaxis.autorange', true);
})
.then(function() {
assertRange(initialRange, initialRange);
})
.then(done, done.fail);
});

it('should restore fixed rangeslider range when axis range is restored', function(done) {
Plotly.newPlot(gd, [{
x: [0, 50],
y: [1, 2]
}], {
xaxis: {
range: [10, 45],
rangeslider: {range: [20, 30]}
}
})
.then(function() {
assertRange([10, 45], [20, 30], [10, 45]);

return Plotly.relayout(gd, 'xaxis.range', [-10, 60]);
})
.then(function() {
assertRange([-10, 60], [20, 30], [-10, 60]);

return Plotly.relayout(gd, 'xaxis.range', [10, 45]);
})
.then(function() {
assertRange([10, 45], [20, 30], [10, 45]);
})
.then(done, done.fail);
});

it('should not expand its range when range slider range is set', function(done) {
Plotly.newPlot(gd, [{
y: [2, 1, 2]
Expand Down Expand Up @@ -1026,11 +1083,11 @@ describe('rangesliders in general', function() {
.then(function() {
assertRange([-0.26, 4.26], [-0.26, 4.26]);

// smaller than xaxis.range - won't be accepted
// smaller than xaxis.range - displayed range expands to cover the axis range
return Plotly.relayout(gd, {'xaxis.rangeslider.range': [0, 2]});
})
.then(function() {
assertRange([-0.26, 4.26], [-0.26, 4.26]);
assertRange([-0.26, 4.26], [0, 2], [-0.26, 4.26]);

// will be accepted (and autorange is disabled by impliedEdits)
return Plotly.relayout(gd, {'xaxis.rangeslider.range': [-2, 12]});
Expand Down Expand Up @@ -1162,7 +1219,7 @@ describe('rangesliders in general', function() {
expect(xa.rangeslider.range)
.toBeCloseToArray(exp.rangesliderRng, 1, 'rangeslider rng ' + msg);
expect(xa.rangeslider._input.range)
.toBeCloseToArray(exp.rangesliderRng, 1, 'rangeslider input rng ' + msg);
.toBeCloseToArray(exp.rangesliderInputRng, 1, 'rangeslider input rng ' + msg);
}

Plotly.newPlot(gd, [{
Expand All @@ -1173,39 +1230,44 @@ describe('rangesliders in general', function() {
.then(function() {
_assert('base', {
axRng: [0.935, 2.06],
rangesliderRng: [0.935, 2.06]
rangesliderRng: [0.935, 2.06],
rangesliderInputRng: [0.935, 2.06]
});

return Plotly.relayout(gd, 'xaxis.autorange', 'reversed');
})
.then(function() {
_assert('reversed!', {
axRng: [2.06, 0.935],
rangesliderRng: [2.06, 0.935]
rangesliderRng: [2.06, 0.935],
rangesliderInputRng: [0.935, 2.06]
});

return Plotly.relayout(gd, 'xaxis.range', [0, 3]);
})
.then(function() {
_assert('set increasing rng', {
axRng: [0, 3],
rangesliderRng: [0, 3]
rangesliderRng: [0, 3],
rangesliderInputRng: [0.935, 2.06]
});

return Plotly.relayout(gd, 'xaxis.range', [3, 0]);
})
.then(function() {
_assert('set reversed rng', {
axRng: [3, 0],
rangesliderRng: [3, 0]
rangesliderRng: [3, 0],
rangesliderInputRng: [0.935, 2.06]
});

return Plotly.relayout(gd, 'xaxis.rangeslider.range', [0, 3]);
})
.then(function() {
_assert('reversed ax rng / increasing rangeslider rng', {
axRng: [3, 0],
rangesliderRng: [3, 0]
rangesliderRng: [3, 0],
rangesliderInputRng: [0, 3]
});

return Plotly.relayout(gd, {
Expand All @@ -1216,7 +1278,8 @@ describe('rangesliders in general', function() {
.then(function() {
_assert('increasing ax rng / reversed rangeslider rng', {
axRng: [0, 3],
rangesliderRng: [0, 3]
rangesliderRng: [0, 3],
rangesliderInputRng: [3, 0]
});
})
.then(done, done.fail);
Expand Down
Loading