Skip to content

Commit 4d9b02d

Browse files
authored
Merge pull request #1162 from plotly/modebar-date-zoom-fix
Modebar date zoom fix
2 parents 1c32bc5 + f1b686f commit 4d9b02d

File tree

2 files changed

+55
-29
lines changed

2 files changed

+55
-29
lines changed

src/components/modebar/buttons.js

+12-3
Original file line numberDiff line numberDiff line change
@@ -204,9 +204,18 @@ function handleCartesian(gd, ev) {
204204
}
205205
}
206206
else {
207-
var rangeNow = ax.range;
208-
aobj[axName + '.range[0]'] = r0 * rangeNow[0] + r1 * rangeNow[1];
209-
aobj[axName + '.range[1]'] = r0 * rangeNow[1] + r1 * rangeNow[0];
207+
var rangeNow = [
208+
ax.r2l(ax.range[0]),
209+
ax.r2l(ax.range[1]),
210+
];
211+
212+
var rangeNew = [
213+
r0 * rangeNow[0] + r1 * rangeNow[1],
214+
r0 * rangeNow[1] + r1 * rangeNow[0]
215+
];
216+
217+
aobj[axName + '.range[0]'] = ax.l2r(rangeNew[0]);
218+
aobj[axName + '.range[1]'] = ax.l2r(rangeNew[1]);
210219
}
211220
}
212221
}

test/jasmine/tests/modebar_test.js

+43-26
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ var d3 = require('d3');
22

33
var createModeBar = require('@src/components/modebar/modebar');
44
var manageModeBar = require('@src/components/modebar/manage');
5+
var customMatchers = require('../assets/custom_matchers');
56

67
var Plotly = require('@lib/index');
78
var Plots = require('@src/plots/plots');
@@ -613,12 +614,25 @@ describe('ModeBar', function() {
613614
describe('modebar on clicks', function() {
614615
var gd, modeBar;
615616

617+
beforeAll(function() {
618+
jasmine.addMatchers(customMatchers);
619+
});
620+
616621
afterEach(destroyGraphDiv);
617622

618-
function assertRange(actual, expected) {
623+
function assertRange(axName, expected) {
619624
var PRECISION = 2;
620-
expect(actual[0]).toBeCloseTo(expected[0], PRECISION);
621-
expect(actual[1]).toBeCloseTo(expected[1], PRECISION);
625+
626+
var ax = gd._fullLayout[axName];
627+
var actual = ax.range;
628+
629+
if(ax.type === 'date') {
630+
var truncate = function(v) { return v.substr(0, 10); };
631+
expect(actual.map(truncate)).toEqual(expected.map(truncate), axName);
632+
}
633+
else {
634+
expect(actual).toBeCloseToArray(expected, PRECISION, axName);
635+
}
622636
}
623637

624638
function assertActive(buttons, activeButton) {
@@ -634,9 +648,11 @@ describe('ModeBar', function() {
634648
beforeEach(function(done) {
635649
var mockData = [{
636650
type: 'scatter',
637-
y: [2, 1, 2]
651+
x: ['2016-01-01', '2016-02-01', '2016-03-01'],
652+
y: [10, 100, 1000],
638653
}, {
639654
type: 'bar',
655+
x: ['a', 'b', 'c'],
640656
y: [2, 1, 2],
641657
xaxis: 'x2',
642658
yaxis: 'y2'
@@ -646,11 +662,12 @@ describe('ModeBar', function() {
646662
xaxis: {
647663
anchor: 'y',
648664
domain: [0, 0.5],
649-
range: [0, 5]
665+
range: ['2016-01-01', '2016-04-01']
650666
},
651667
yaxis: {
652668
anchor: 'x',
653-
range: [0, 3]
669+
type: 'log',
670+
range: [1, 3]
654671
},
655672
xaxis2: {
656673
anchor: 'y2',
@@ -679,35 +696,35 @@ describe('ModeBar', function() {
679696
buttonAutoScale = selectButton(modeBar, 'autoScale2d'),
680697
buttonResetScale = selectButton(modeBar, 'resetScale2d');
681698

682-
assertRange(gd._fullLayout.xaxis.range, [0, 5]);
683-
assertRange(gd._fullLayout.yaxis.range, [0, 3]);
684-
assertRange(gd._fullLayout.xaxis2.range, [-1, 4]);
685-
assertRange(gd._fullLayout.yaxis2.range, [0, 4]);
699+
assertRange('xaxis', ['2016-01-01', '2016-04-01']);
700+
assertRange('yaxis', [1, 3]);
701+
assertRange('xaxis2', [-1, 4]);
702+
assertRange('yaxis2', [0, 4]);
686703

687704
buttonZoomIn.click();
688-
assertRange(gd._fullLayout.xaxis.range, [1.25, 3.75]);
689-
assertRange(gd._fullLayout.yaxis.range, [0.75, 2.25]);
690-
assertRange(gd._fullLayout.xaxis2.range, [0.25, 2.75]);
691-
assertRange(gd._fullLayout.yaxis2.range, [1, 3]);
705+
assertRange('xaxis', ['2016-01-23 17:45', '2016-03-09 05:15']);
706+
assertRange('yaxis', [1.5, 2.5]);
707+
assertRange('xaxis2', [0.25, 2.75]);
708+
assertRange('yaxis2', [1, 3]);
692709

693710
buttonZoomOut.click();
694-
assertRange(gd._fullLayout.xaxis.range, [0, 5]);
695-
assertRange(gd._fullLayout.yaxis.range, [0, 3]);
696-
assertRange(gd._fullLayout.xaxis2.range, [-1, 4]);
697-
assertRange(gd._fullLayout.yaxis2.range, [0, 4]);
711+
assertRange('xaxis', ['2016-01-01', '2016-04-01']);
712+
assertRange('yaxis', [1, 3]);
713+
assertRange('xaxis2', [-1, 4]);
714+
assertRange('yaxis2', [0, 4]);
698715

699716
buttonZoomIn.click();
700717
buttonAutoScale.click();
701-
assertRange(gd._fullLayout.xaxis.range, [-0.1584327, 2.1584327]);
702-
assertRange(gd._fullLayout.yaxis.range, [0.92675159, 2.073248]);
703-
assertRange(gd._fullLayout.xaxis2.range, [-0.5, 2.5]);
704-
assertRange(gd._fullLayout.yaxis2.range, [0, 2.105263]);
718+
assertRange('xaxis', ['2015-12-27 06:36:39.6661', '2016-03-05 17:23:20.3339']);
719+
assertRange('yaxis', [0.8591, 3.1408]);
720+
assertRange('xaxis2', [-0.5, 2.5]);
721+
assertRange('yaxis2', [0, 2.105263]);
705722

706723
buttonResetScale.click();
707-
assertRange(gd._fullLayout.xaxis.range, [0, 5]);
708-
assertRange(gd._fullLayout.yaxis.range, [0, 3]);
709-
assertRange(gd._fullLayout.xaxis2.range, [-1, 4]);
710-
assertRange(gd._fullLayout.yaxis2.range, [0, 4]);
724+
assertRange('xaxis', ['2016-01-01', '2016-04-01']);
725+
assertRange('yaxis', [1, 3]);
726+
assertRange('xaxis2', [-1, 4]);
727+
assertRange('yaxis2', [0, 4]);
711728
});
712729
});
713730

0 commit comments

Comments
 (0)