Skip to content

Commit 2b26906

Browse files
committed
fix rangeslider range expansion on reversed-range axes
1 parent 7bb5daa commit 2b26906

File tree

2 files changed

+86
-7
lines changed

2 files changed

+86
-7
lines changed

src/components/rangeslider/draw.js

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -77,19 +77,28 @@ module.exports = function(gd) {
7777

7878
// update range
7979
// Expand slider range to the axis range
80-
// TODO: what if the ranges are reversed?
8180
if(opts.range) {
82-
var outRange = opts.range;
83-
var axRange = axisOpts.range;
81+
var rng = Lib.simpleMap(opts.range, axisOpts.r2l);
82+
var axRng = Lib.simpleMap(axisOpts.range, axisOpts.r2l);
83+
var newRng;
84+
85+
if(axRng[0] < axRng[1]) {
86+
newRng = [
87+
Math.min(rng[0], axRng[0]),
88+
Math.max(rng[1], axRng[1])
89+
];
90+
} else {
91+
newRng = [
92+
Math.max(rng[0], axRng[0]),
93+
Math.min(rng[1], axRng[1])
94+
];
95+
}
8496

85-
outRange[0] = axisOpts.l2r(Math.min(axisOpts.r2l(outRange[0]), axisOpts.r2l(axRange[0])));
86-
outRange[1] = axisOpts.l2r(Math.max(axisOpts.r2l(outRange[1]), axisOpts.r2l(axRange[1])));
87-
opts._input.range = outRange.slice();
97+
opts.range = opts._input.range = Lib.simpleMap(newRng, axisOpts.l2r);
8898
}
8999

90100
axisOpts.cleanRange('rangeslider.range');
91101

92-
93102
// update range slider dimensions
94103

95104
var margin = fullLayout.margin;

test/jasmine/tests/range_slider_test.js

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1019,6 +1019,76 @@ describe('rangesliders in general', function() {
10191019
.catch(failTest)
10201020
.then(done);
10211021
});
1022+
1023+
it('should give correct rangeslider range on reversed axes', function(done) {
1024+
function _assert(msg, exp) {
1025+
var xa = gd._fullLayout.xaxis;
1026+
1027+
expect(xa.range)
1028+
.toBeCloseToArray(exp.axRng, 1, 'x-axis rng ' + msg);
1029+
expect(xa.rangeslider.range)
1030+
.toBeCloseToArray(exp.rangesliderRng, 1, 'rangeslider rng ' + msg);
1031+
expect(xa.rangeslider._input.range)
1032+
.toBeCloseToArray(exp.rangesliderRng, 1, 'rangeslider input rng ' + msg);
1033+
}
1034+
1035+
Plotly.plot(gd, [{
1036+
x: [1, 2, 1]
1037+
}], {
1038+
xaxis: { rangeslider: {visible: true} }
1039+
})
1040+
.then(function() {
1041+
_assert('base', {
1042+
axRng: [0.935, 2.06],
1043+
rangesliderRng: [0.935, 2.06]
1044+
});
1045+
1046+
return Plotly.relayout(gd, 'xaxis.autorange', 'reversed');
1047+
})
1048+
.then(function() {
1049+
_assert('reversed!', {
1050+
axRng: [2.06, 0.935],
1051+
rangesliderRng: [2.06, 0.935]
1052+
});
1053+
1054+
return Plotly.relayout(gd, 'xaxis.range', [0, 3]);
1055+
})
1056+
.then(function() {
1057+
_assert('set increasing rng', {
1058+
axRng: [0, 3],
1059+
rangesliderRng: [0, 3]
1060+
});
1061+
1062+
return Plotly.relayout(gd, 'xaxis.range', [3, 0]);
1063+
})
1064+
.then(function() {
1065+
_assert('set reversed rng', {
1066+
axRng: [3, 0],
1067+
rangesliderRng: [3, 0]
1068+
});
1069+
1070+
return Plotly.relayout(gd, 'xaxis.rangeslider.range', [0, 3]);
1071+
})
1072+
.then(function() {
1073+
_assert('reversed ax rng / increasing rangeslider rng', {
1074+
axRng: [3, 0],
1075+
rangesliderRng: [3, 0]
1076+
});
1077+
1078+
return Plotly.relayout(gd, {
1079+
'xaxis.range': [0, 3],
1080+
'xaxis.rangeslider.range': [3, 0]
1081+
});
1082+
})
1083+
.then(function() {
1084+
_assert('increasing ax rng / reversed rangeslider rng', {
1085+
axRng: [0, 3],
1086+
rangesliderRng: [0, 3]
1087+
});
1088+
})
1089+
.catch(failTest)
1090+
.then(done);
1091+
});
10221092
});
10231093

10241094
function slide(fromX, fromY, toX, toY) {

0 commit comments

Comments
 (0)