Skip to content

Commit 9ee3f45

Browse files
authored
Merge pull request #3304 from plotly/rangeslider-on-reversed-axes
Rangeslider on reversed axes
2 parents 7bef64e + d2a57e3 commit 9ee3f45

File tree

4 files changed

+114
-7
lines changed

4 files changed

+114
-7
lines changed

src/components/rangeslider/draw.js

+16-7
Original file line numberDiff line numberDiff line change
@@ -82,19 +82,28 @@ module.exports = function(gd) {
8282

8383
// update range
8484
// Expand slider range to the axis range
85-
// TODO: what if the ranges are reversed?
8685
if(opts.range) {
87-
var outRange = opts.range;
88-
var axRange = axisOpts.range;
86+
var rng = Lib.simpleMap(opts.range, axisOpts.r2l);
87+
var axRng = Lib.simpleMap(axisOpts.range, axisOpts.r2l);
88+
var newRng;
89+
90+
if(axRng[0] < axRng[1]) {
91+
newRng = [
92+
Math.min(rng[0], axRng[0]),
93+
Math.max(rng[1], axRng[1])
94+
];
95+
} else {
96+
newRng = [
97+
Math.max(rng[0], axRng[0]),
98+
Math.min(rng[1], axRng[1])
99+
];
100+
}
89101

90-
outRange[0] = axisOpts.l2r(Math.min(axisOpts.r2l(outRange[0]), axisOpts.r2l(axRange[0])));
91-
outRange[1] = axisOpts.l2r(Math.max(axisOpts.r2l(outRange[1]), axisOpts.r2l(axRange[1])));
92-
opts._input.range = outRange.slice();
102+
opts.range = opts._input.range = Lib.simpleMap(newRng, axisOpts.l2r);
93103
}
94104

95105
axisOpts.cleanRange('rangeslider.range');
96106

97-
98107
// update range slider dimensions
99108

100109
var margin = fullLayout.margin;
Loading
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
{
2+
"data": [
3+
{
4+
"mode": "lines",
5+
"hoverinfo": "x",
6+
"showlegend": false,
7+
"line": {
8+
"color": "blue"
9+
},
10+
"x": [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
11+
"y": [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120]
12+
}
13+
],
14+
"layout": {
15+
"xaxis": {
16+
"autorange": "reversed",
17+
"zeroline": false,
18+
"rangeslider": {
19+
"yaxis": {
20+
"rangemode": "match"
21+
}
22+
}
23+
},
24+
"yaxis": {
25+
"visible": false
26+
}
27+
}
28+
}

test/jasmine/tests/range_slider_test.js

+70
Original file line numberDiff line numberDiff line change
@@ -1062,6 +1062,76 @@ describe('rangesliders in general', function() {
10621062
.catch(failTest)
10631063
.then(done);
10641064
});
1065+
1066+
it('should give correct rangeslider range on reversed axes', function(done) {
1067+
function _assert(msg, exp) {
1068+
var xa = gd._fullLayout.xaxis;
1069+
1070+
expect(xa.range)
1071+
.toBeCloseToArray(exp.axRng, 1, 'x-axis rng ' + msg);
1072+
expect(xa.rangeslider.range)
1073+
.toBeCloseToArray(exp.rangesliderRng, 1, 'rangeslider rng ' + msg);
1074+
expect(xa.rangeslider._input.range)
1075+
.toBeCloseToArray(exp.rangesliderRng, 1, 'rangeslider input rng ' + msg);
1076+
}
1077+
1078+
Plotly.plot(gd, [{
1079+
x: [1, 2, 1]
1080+
}], {
1081+
xaxis: { rangeslider: {visible: true} }
1082+
})
1083+
.then(function() {
1084+
_assert('base', {
1085+
axRng: [0.935, 2.06],
1086+
rangesliderRng: [0.935, 2.06]
1087+
});
1088+
1089+
return Plotly.relayout(gd, 'xaxis.autorange', 'reversed');
1090+
})
1091+
.then(function() {
1092+
_assert('reversed!', {
1093+
axRng: [2.06, 0.935],
1094+
rangesliderRng: [2.06, 0.935]
1095+
});
1096+
1097+
return Plotly.relayout(gd, 'xaxis.range', [0, 3]);
1098+
})
1099+
.then(function() {
1100+
_assert('set increasing rng', {
1101+
axRng: [0, 3],
1102+
rangesliderRng: [0, 3]
1103+
});
1104+
1105+
return Plotly.relayout(gd, 'xaxis.range', [3, 0]);
1106+
})
1107+
.then(function() {
1108+
_assert('set reversed rng', {
1109+
axRng: [3, 0],
1110+
rangesliderRng: [3, 0]
1111+
});
1112+
1113+
return Plotly.relayout(gd, 'xaxis.rangeslider.range', [0, 3]);
1114+
})
1115+
.then(function() {
1116+
_assert('reversed ax rng / increasing rangeslider rng', {
1117+
axRng: [3, 0],
1118+
rangesliderRng: [3, 0]
1119+
});
1120+
1121+
return Plotly.relayout(gd, {
1122+
'xaxis.range': [0, 3],
1123+
'xaxis.rangeslider.range': [3, 0]
1124+
});
1125+
})
1126+
.then(function() {
1127+
_assert('increasing ax rng / reversed rangeslider rng', {
1128+
axRng: [0, 3],
1129+
rangesliderRng: [0, 3]
1130+
});
1131+
})
1132+
.catch(failTest)
1133+
.then(done);
1134+
});
10651135
});
10661136

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

0 commit comments

Comments
 (0)