diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index 4400f643d0f..99ab3b5354a 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -752,35 +752,47 @@ axes.calcTicks = function calcTicks(ax, opts) { } } - var removedPreTick0Label = false; - var ticksOut = new Array(tickVals.length); + var ticksOut = []; var i; + var prevText; for(i = 0; i < tickVals.length; i++) { var _minor = tickVals[i].minor; var _value = tickVals[i].value; - ticksOut[i] = axes.tickText( + var t = axes.tickText( ax, _value, false, // hover _minor // noSuffixPrefix ); - if(isPeriod) { - var v = tickVals[i].value; + if(isPeriod && prevText === t.text) continue; + prevText = t.text; + + ticksOut.push(t); + } + + if(isPeriod) { + var removedPreTick0Label = false; + + for(i = 0; i < ticksOut.length; i++) { + var v = ticksOut[i].x; var a = i; var b = i + 1; - if(i < tickVals.length - 1) { + if(i < ticksOut.length - 1) { a = i; b = i + 1; - } else { + } else if(i > 0) { a = i - 1; b = i; + } else { + a = i; + b = i; } - var A = tickVals[a].value; - var B = tickVals[b].value; + var A = ticksOut[a].x; + var B = ticksOut[b].x; var actualDelta = Math.abs(B - A); var delta = definedDelta || actualDelta; var periodLength = 0; @@ -828,15 +840,15 @@ axes.calcTicks = function calcTicks(ax, opts) { removedPreTick0Label = true; } } - } - if(removedPreTick0Label) { - for(i = 0; i < ticksOut.length; i++) { - if(ticksOut[i].periodX <= maxRange && ticksOut[i].periodX >= minRange) { - // redo first visible tick - ax._prevDateHead = ''; - ticksOut[i].text = axes.tickText(ax, tickVals[i].value).text; - break; + if(removedPreTick0Label) { + for(i = 0; i < ticksOut.length; i++) { + if(ticksOut[i].periodX <= maxRange && ticksOut[i].periodX >= minRange) { + // redo first visible tick + ax._prevDateHead = ''; + ticksOut[i].text = axes.tickText(ax, ticksOut[i].x).text; + break; + } } } } diff --git a/test/jasmine/tests/axes_test.js b/test/jasmine/tests/axes_test.js index e611f816097..b027f5030f1 100644 --- a/test/jasmine/tests/axes_test.js +++ b/test/jasmine/tests/axes_test.js @@ -5524,7 +5524,7 @@ describe('Test axes', function() { }); }); - ['%f', '%L', '%Q', '%s', '%S', '%M', '%H', '%I', '%p', '%X'].forEach(function(formatter, i) { + ['%Q', '%s', '%H', '%I', '%X'].forEach(function(formatter, i) { it('should respect daily tickformat that includes ' + formatter, function(done) { Plotly.newPlot(gd, { data: [{ @@ -5552,15 +5552,10 @@ describe('Test axes', function() { '2020-01-01 21:00', '2020-01-02' ], [ - ['', 'Wed-0', 'Wed-0', 'Wed-0', 'Wed-0', 'Wed-0', 'Wed-0', 'Wed-0', 'Wed-0', 'Thu-0'], - ['', 'Wed-000', 'Wed-000', 'Wed-000', 'Wed-000', 'Wed-000', 'Wed-000', 'Wed-000', 'Wed-000', 'Thu-000'], ['', 'Wed-1577836800000', 'Wed-1577847600000', 'Wed-1577858400000', 'Wed-1577869200000', 'Wed-1577880000000', 'Wed-1577890800000', 'Wed-1577901600000', 'Wed-1577912400000', 'Thu-1577923200000'], ['', 'Wed-1577836800', 'Wed-1577847600', 'Wed-1577858400', 'Wed-1577869200', 'Wed-1577880000', 'Wed-1577890800', 'Wed-1577901600', 'Wed-1577912400', 'Thu-1577923200'], - ['', 'Wed-00', 'Wed-00', 'Wed-00', 'Wed-00', 'Wed-00', 'Wed-00', 'Wed-00', 'Wed-00', 'Thu-00'], - ['', 'Wed-00', 'Wed-00', 'Wed-00', 'Wed-00', 'Wed-00', 'Wed-00', 'Wed-00', 'Wed-00', 'Thu-00'], ['', 'Wed-00', 'Wed-03', 'Wed-06', 'Wed-09', 'Wed-12', 'Wed-15', 'Wed-18', 'Wed-21', 'Thu-00'], ['', 'Wed-12', 'Wed-03', 'Wed-06', 'Wed-09', 'Wed-12', 'Wed-03', 'Wed-06', 'Wed-09', 'Thu-12'], - ['', 'Wed-AM', 'Wed-AM', 'Wed-AM', 'Wed-AM', 'Wed-PM', 'Wed-PM', 'Wed-PM', 'Wed-PM', 'Thu-AM'], ['', 'Wed-00:00:00', 'Wed-03:00:00', 'Wed-06:00:00', 'Wed-09:00:00', 'Wed-12:00:00', 'Wed-15:00:00', 'Wed-18:00:00', 'Wed-21:00:00', 'Thu-00:00:00'] ][i]); }) @@ -5569,6 +5564,56 @@ describe('Test axes', function() { }); }); + + [ + { + formatter: '%p', + positions: ['2019-12-31 21:00', '2020-01-01', '2020-01-01 12:00', '2020-01-02'], + labels: ['', 'Wed-AM', 'Wed-PM', 'Thu-AM'] + }, + { + formatter: '%M', + positions: ['2019-12-31 21:00', '2020-01-01 12:00', '2020-01-02 12:00'], + labels: ['', 'Wed-00', ''] + }, + { + formatter: '%S', + positions: ['2019-12-31 21:00', '2020-01-01 12:00', '2020-01-02 12:00'], + labels: ['', 'Wed-00', ''] + }, + { + formatter: '%L', + positions: ['2019-12-31 21:00', '2020-01-01 12:00', '2020-01-02 12:00'], + labels: ['', 'Wed-000', ''] + }, + { + formatter: '%f', + positions: ['2019-12-31 21:00', '2020-01-01 12:00', '2020-01-02 12:00'], + labels: ['', 'Wed-0', ''] + } + ].forEach(function(t) { + it('should respect time tickformat that includes ' + t.formatter, function(done) { + Plotly.newPlot(gd, { + data: [{ + hovertemplate: hovertemplate, + x: ['2020-01-01', '2020-01-02'] + }], + layout: { + width: 1000, + xaxis: { + ticklabelmode: 'period', + tickformat: '%a-' + t.formatter + } + } + }) + .then(function() { + _assert('', t.positions, t.labels); + }) + .catch(failTest) + .then(done); + }); + }); + [ { range: ['2020-12-15', '2084-12-15'],