From 4a0b8779f9d7db3894eb88a78df6190c73bd76ba Mon Sep 17 00:00:00 2001 From: archmoj Date: Wed, 3 Jun 2020 15:17:47 -0400 Subject: [PATCH 1/7] add image test for bar with x in milisecond and base --- .../image/baselines/bar-with-milliseconds.png | Bin 0 -> 16963 bytes test/image/mocks/bar-with-milliseconds.json | 51 ++++++++++++++++++ test/jasmine/tests/mock_test.js | 2 + 3 files changed, 53 insertions(+) create mode 100644 test/image/baselines/bar-with-milliseconds.png create mode 100644 test/image/mocks/bar-with-milliseconds.json diff --git a/test/image/baselines/bar-with-milliseconds.png b/test/image/baselines/bar-with-milliseconds.png new file mode 100644 index 0000000000000000000000000000000000000000..60cd4f2448f38990367acb8d788852b32dcbd118 GIT binary patch literal 16963 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 literal 0 HcmV?d00001 diff --git a/test/image/mocks/bar-with-milliseconds.json b/test/image/mocks/bar-with-milliseconds.json new file mode 100644 index 00000000000..09cd6f847cd --- /dev/null +++ b/test/image/mocks/bar-with-milliseconds.json @@ -0,0 +1,51 @@ +{ + "data": [ + { + "base": [ + "2020-02-02 00:00" + ], + "orientation": "h", + "type": "bar", + "x": [ + 86400000 + ], + "y": [ + 1 + ], + "yaxis": "y" + }, + { + "base": [ + "2020-02-02 00:00" + ], + "orientation": "h", + "type": "bar", + "x": [ + "1970-01-02 00:00" + ], + "y": [ + 1 + ], + "yaxis": "y2" + } + ], + "layout": { + "width": 800, + "height": 400, + "xaxis": { + "type": "date" + }, + "yaxis": { + "domain": [ + 0, + 0.45 + ] + }, + "yaxis2": { + "domain": [ + 0.55, + 1 + ] + } + } +} diff --git a/test/jasmine/tests/mock_test.js b/test/jasmine/tests/mock_test.js index 17cd57d2cce..594006d4191 100644 --- a/test/jasmine/tests/mock_test.js +++ b/test/jasmine/tests/mock_test.js @@ -137,6 +137,7 @@ var list = [ 'bar-like_traces_tozero', 'bar-marker-line-colorscales', 'bar-offsetgroups', + 'bar-with-milliseconds', 'basic_area', 'basic_bar', 'basic_error_bar', @@ -1176,6 +1177,7 @@ figs['bar-like_traces_no-tozero_stack'] = require('@mocks/bar-like_traces_no-toz figs['bar-like_traces_tozero'] = require('@mocks/bar-like_traces_tozero'); figs['bar-marker-line-colorscales'] = require('@mocks/bar-marker-line-colorscales'); figs['bar-offsetgroups'] = require('@mocks/bar-offsetgroups'); +figs['bar-with-milliseconds'] = require('@mocks/bar-with-milliseconds'); figs['basic_area'] = require('@mocks/basic_area'); figs['basic_bar'] = require('@mocks/basic_bar'); figs['basic_error_bar'] = require('@mocks/basic_error_bar'); From 2087766a28159136f9828d80e9c617758d6945c7 Mon Sep 17 00:00:00 2001 From: archmoj Date: Wed, 3 Jun 2020 15:22:41 -0400 Subject: [PATCH 2/7] fix milliseconds not to depend on timezone --- src/plots/cartesian/set_convert.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/plots/cartesian/set_convert.js b/src/plots/cartesian/set_convert.js index d9d1c8384cd..e5d3a60d64a 100644 --- a/src/plots/cartesian/set_convert.js +++ b/src/plots/cartesian/set_convert.js @@ -103,7 +103,10 @@ module.exports = function setConvert(ax, fullLayout) { // same logic as in Lib.ms2DateTime var msecTenths = Math.floor(Lib.mod(v + 0.05, 1) * 10); var msRounded = Math.round(v - msecTenths / 10); - ms = dateTime2ms(new Date(msRounded)) + msecTenths / 10; + + var d = new Date(msRounded); + ms = dateTime2ms(d) + msecTenths / 10; + ms += d.getTimezoneOffset() * ONEMIN; } else return BADNUM; } return ms; From 61559659ea0b682869f6af795d9e88858c3ddf22 Mon Sep 17 00:00:00 2001 From: archmoj Date: Thu, 4 Jun 2020 12:17:26 -0400 Subject: [PATCH 3/7] apply UTC time only to bar length for now --- src/plots/cartesian/set_convert.js | 15 ++++++++++----- src/traces/bar/calc.js | 10 ++++++---- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/plots/cartesian/set_convert.js b/src/plots/cartesian/set_convert.js index e5d3a60d64a..0af1dd8fbf1 100644 --- a/src/plots/cartesian/set_convert.js +++ b/src/plots/cartesian/set_convert.js @@ -90,7 +90,7 @@ module.exports = function setConvert(ax, fullLayout) { * - inserts a dummy arg so calendar is the 3rd arg (see notes below). * - defaults to ax.calendar */ - function dt2ms(v, _, calendar) { + function dt2ms(v, _, calendar, msUTC) { // NOTE: Changed this behavior: previously we took any numeric value // to be a ms, even if it was a string that could be a bare year. // Now we convert it as a date if at all possible, and only try @@ -106,7 +106,12 @@ module.exports = function setConvert(ax, fullLayout) { var d = new Date(msRounded); ms = dateTime2ms(d) + msecTenths / 10; - ms += d.getTimezoneOffset() * ONEMIN; + if(msUTC) { + // For now it is only used + // to fix bar length in milliseconds. + // It could be applied in other places in v2 + ms += d.getTimezoneOffset() * ONEMIN; + } } else return BADNUM; } return ms; @@ -794,7 +799,7 @@ module.exports = function setConvert(ax, fullLayout) { // the first letter of ax._id?) // in case the expected data isn't there, make a list of // integers based on the opposite data - ax.makeCalcdata = function(trace, axLetter) { + ax.makeCalcdata = function(trace, axLetter, msUTC) { var arrayIn, arrayOut, i, len; var axType = ax.type; @@ -818,10 +823,10 @@ module.exports = function setConvert(ax, fullLayout) { arrayOut = new Array(len); for(i = 0; i < len; i++) { - arrayOut[i] = ax.d2c(arrayIn[i], 0, cal); + arrayOut[i] = ax.d2c(arrayIn[i], 0, cal, msUTC); } } else { - var v0 = ((axLetter + '0') in trace) ? ax.d2c(trace[axLetter + '0'], 0, cal) : 0; + var v0 = ((axLetter + '0') in trace) ? ax.d2c(trace[axLetter + '0'], 0, cal, false) : 0; var dv = (trace['d' + axLetter]) ? Number(trace['d' + axLetter]) : 1; // the opposing data, for size if we have x and dx etc diff --git a/src/traces/bar/calc.js b/src/traces/bar/calc.js index 44cb06ea147..bf40a2f8496 100644 --- a/src/traces/bar/calc.js +++ b/src/traces/bar/calc.js @@ -19,12 +19,14 @@ module.exports = function calc(gd, trace) { var ya = Axes.getFromId(gd, trace.yaxis || 'y'); var size, pos; + var msUTC = !!(trace.base || trace.base === 0); + if(trace.orientation === 'h') { - size = xa.makeCalcdata(trace, 'x'); - pos = ya.makeCalcdata(trace, 'y'); + size = xa.makeCalcdata(trace, 'x', msUTC); + pos = ya.makeCalcdata(trace, 'y', msUTC); } else { - size = ya.makeCalcdata(trace, 'y'); - pos = xa.makeCalcdata(trace, 'x'); + size = ya.makeCalcdata(trace, 'y', msUTC); + pos = xa.makeCalcdata(trace, 'x', msUTC); } // create the "calculated data" to plot From 118dc823783f26148067e2b8723c118b86408906 Mon Sep 17 00:00:00 2001 From: archmoj Date: Thu, 4 Jun 2020 16:08:50 -0400 Subject: [PATCH 4/7] add Gantt chart mock --- test/image/baselines/bar_gantt-chart.png | Bin 0 -> 49975 bytes test/image/mocks/bar_gantt-chart.json | 90 +++++++++++++++++++++++ test/jasmine/tests/mock_test.js | 2 + 3 files changed, 92 insertions(+) create mode 100644 test/image/baselines/bar_gantt-chart.png create mode 100644 test/image/mocks/bar_gantt-chart.json diff --git a/test/image/baselines/bar_gantt-chart.png b/test/image/baselines/bar_gantt-chart.png new file mode 100644 index 0000000000000000000000000000000000000000..14e305ea8153c7841d824f4fec17ba896dd5b936 GIT binary patch literal 49975 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 U7y9UOv0#C=#(wq8-G_bu56-u)82|tP literal 0 HcmV?d00001 diff --git a/test/image/mocks/bar_gantt-chart.json b/test/image/mocks/bar_gantt-chart.json new file mode 100644 index 00000000000..4262c6e1bce --- /dev/null +++ b/test/image/mocks/bar_gantt-chart.json @@ -0,0 +1,90 @@ +{ + "data": [ + { + "base": [ + "2020-03-01", + "2020-03-05", + "2020-03-05", + "2020-03-01", + "2020-03-06", + "2020-03-01", + "2020-03-07", + "2020-03-08", + "2020-03-09" + ], + "orientation": "h", + "type": "bar", + "x": [ + 345600000, + 172800000, + 259200000, + 432000000, + 86400000, + 518400000, + 302400000, + 86400000, + 172800000 + ], + "marker": { + "colorscale": "Portland", + "color": [ + 1, + 0, + 1, + 0, + 0, + 0.9, + 0.3, + 1, + 1 + ] + }, + "y": [ + "Activity A", + "Activity B", + "Activity C", + "Activity D", + "Activity E", + "Activity F", + "Activity X", + "Activity Y", + "Activity Z" + ], + "text": [ + "4 days", + "2 days", + "3 days", + "5 days", + "1 day", + "6 days", + "3½ days", + "1 day", + "2 days" + ], + "textfont": { "size": 16 }, + "textposition": "inside", + "insidetextanchor": "middle", + "hovertemplate": "%{y}
start: %{base}
duration: %{text}
end: %{x}" + } + ], + "layout": { + "width": 1000, + "height": 500, + "title": { + "text": "Gantt chart using Plotly.js bar" + }, + "xaxis": { + "gridwidth": 5, + "tickwidth": 5, + "ticklen": 10, + "type": "date" + }, + "yaxis": { + "tickfont": { + "family": "Times New Roman", + "size": 16 + }, + "autorange": "reversed" + } + } +} diff --git a/test/jasmine/tests/mock_test.js b/test/jasmine/tests/mock_test.js index 594006d4191..9b4280441dc 100644 --- a/test/jasmine/tests/mock_test.js +++ b/test/jasmine/tests/mock_test.js @@ -111,6 +111,7 @@ var list = [ 'bar_display_height_zero_no_line_width', 'bar_display_height_zero_only_line_width', 'bar_errorbars_inherit_color', + 'bar_gantt-chart', 'bar_group_percent', 'bar_hide_nulls', 'bar_line', @@ -1151,6 +1152,7 @@ figs['bar_display_height_zero'] = require('@mocks/bar_display_height_zero'); figs['bar_display_height_zero_no_line_width'] = require('@mocks/bar_display_height_zero_no_line_width'); figs['bar_display_height_zero_only_line_width'] = require('@mocks/bar_display_height_zero_only_line_width'); figs['bar_errorbars_inherit_color'] = require('@mocks/bar_errorbars_inherit_color'); +figs['bar_gantt-chart'] = require('@mocks/bar_gantt-chart'); figs['bar_group_percent'] = require('@mocks/bar_group_percent'); figs['bar_hide_nulls'] = require('@mocks/bar_hide_nulls'); figs['bar_line'] = require('@mocks/bar_line'); From bff79dc5e76739f674ac3d4c41b63b0fbd6f2ebc Mon Sep 17 00:00:00 2001 From: archmoj Date: Thu, 4 Jun 2020 17:04:16 -0400 Subject: [PATCH 5/7] add jasmine test to lock down issue 4558 --- test/jasmine/tests/bar_test.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/test/jasmine/tests/bar_test.js b/test/jasmine/tests/bar_test.js index 8fa264aa2eb..3ef5568c3c2 100644 --- a/test/jasmine/tests/bar_test.js +++ b/test/jasmine/tests/bar_test.js @@ -2600,6 +2600,26 @@ describe('bar hover', function() { }); }); }); + + describe('gantt chart using milliseconds from base', function() { + beforeAll(function(done) { + gd = createGraphDiv(); + + var mock = Lib.extendDeep({}, require('@mocks/bar-with-milliseconds.json')); + + Plotly.newPlot(gd, mock.data, mock.layout) + .catch(failTest) + .then(done); + }); + + it('should display the correct bar length passed in milliseconds from base', function() { + var out = _hover(gd, 0.5, 0.75, 'y'); + + var xEnd = out.style[2]; + expect(xEnd).not.toBe(1580670000000); + expect(xEnd).toBe(1580688000000); + }); + }); }); describe('Text templates on bar traces:', function() { From 2ae0fdfb53dfd3ce600347a2924f25793c4a7b5d Mon Sep 17 00:00:00 2001 From: archmoj Date: Thu, 4 Jun 2020 21:51:55 -0400 Subject: [PATCH 6/7] fixups thanks to AJ review --- src/traces/bar/calc.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/traces/bar/calc.js b/src/traces/bar/calc.js index bf40a2f8496..e03d4799f24 100644 --- a/src/traces/bar/calc.js +++ b/src/traces/bar/calc.js @@ -23,10 +23,10 @@ module.exports = function calc(gd, trace) { if(trace.orientation === 'h') { size = xa.makeCalcdata(trace, 'x', msUTC); - pos = ya.makeCalcdata(trace, 'y', msUTC); + pos = ya.makeCalcdata(trace, 'y'); } else { size = ya.makeCalcdata(trace, 'y', msUTC); - pos = xa.makeCalcdata(trace, 'x', msUTC); + pos = xa.makeCalcdata(trace, 'x'); } // create the "calculated data" to plot From bb5bec34bd03214b4e026a6fc0f054379fd2f009 Mon Sep 17 00:00:00 2001 From: archmoj Date: Thu, 4 Jun 2020 22:12:18 -0400 Subject: [PATCH 7/7] add simple early return --- src/plots/cartesian/set_convert.js | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/plots/cartesian/set_convert.js b/src/plots/cartesian/set_convert.js index 0af1dd8fbf1..612cd668815 100644 --- a/src/plots/cartesian/set_convert.js +++ b/src/plots/cartesian/set_convert.js @@ -99,19 +99,18 @@ module.exports = function setConvert(ax, fullLayout) { if(ms === BADNUM) { if(isNumeric(v)) { v = +v; - // keep track of tenths of ms, that `new Date` will drop - // same logic as in Lib.ms2DateTime - var msecTenths = Math.floor(Lib.mod(v + 0.05, 1) * 10); - var msRounded = Math.round(v - msecTenths / 10); - - var d = new Date(msRounded); - ms = dateTime2ms(d) + msecTenths / 10; if(msUTC) { // For now it is only used // to fix bar length in milliseconds. // It could be applied in other places in v2 - ms += d.getTimezoneOffset() * ONEMIN; + return v; } + + // keep track of tenths of ms, that `new Date` will drop + // same logic as in Lib.ms2DateTime + var msecTenths = Math.floor(Lib.mod(v + 0.05, 1) * 10); + var msRounded = Math.round(v - msecTenths / 10); + ms = dateTime2ms(new Date(msRounded)) + msecTenths / 10; } else return BADNUM; } return ms;