From effe988bbf491512a16e76bb1233b12e8aaf3c30 Mon Sep 17 00:00:00 2001 From: Jukka Kurkela Date: Wed, 2 Sep 2020 15:09:39 +0300 Subject: [PATCH] Reduce code duplication and sort generated ticks (#7747) * Reduce code duplication and sort generated ticks * Add test --- src/scales/scale.time.js | 42 ++++++++------------ test/fixtures/scale.time/negative-times.js | 35 ++++++++++++++++ test/fixtures/scale.time/negative-times.png | Bin 0 -> 14136 bytes 3 files changed, 51 insertions(+), 26 deletions(-) create mode 100644 test/fixtures/scale.time/negative-times.js create mode 100644 test/fixtures/scale.time/negative-times.png diff --git a/src/scales/scale.time.js b/src/scales/scale.time.js index 99f5b9412..2df061883 100644 --- a/src/scales/scale.time.js +++ b/src/scales/scale.time.js @@ -135,17 +135,18 @@ function determineMajorUnit(unit) { } /** - * @param {number[]} timestamps * @param {object} ticks * @param {number} time + * @param {number[]} [timestamps] - if defined, snap to these timestamps */ -function addTick(timestamps, ticks, time) { - if (!timestamps.length) { - return; +function addTick(ticks, time, timestamps) { + if (!timestamps) { + ticks[time] = true; + } else if (timestamps.length) { + const {lo, hi} = _lookup(timestamps, time); + const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi]; + ticks[timestamp] = true; } - const {lo, hi} = _lookup(timestamps, time); - const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi]; - ticks[timestamp] = true; } /** @@ -416,28 +417,17 @@ export default class TimeScale extends Scale { throw new Error(min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor); } - if (me.options.ticks.source === 'data') { - // need to make sure ticks are in data in this case - const timestamps = me.getDataTimestamps(); - - for (time = first; time < max; time = +adapter.add(time, stepSize, minor)) { - addTick(timestamps, ticks, time); - } - - if (time === max || options.bounds === 'ticks') { - addTick(timestamps, ticks, time); - } - } else { - for (time = first; time < max; time = +adapter.add(time, stepSize, minor)) { - ticks[time] = true; - } + const timestamps = options.ticks.source === 'data' && me.getDataTimestamps(); + for (time = first; time < max; time = +adapter.add(time, stepSize, minor)) { + addTick(ticks, time, timestamps); + } - if (time === max || options.bounds === 'ticks') { - ticks[time] = true; - } + if (time === max || options.bounds === 'ticks') { + addTick(ticks, time, timestamps); } - return Object.keys(ticks).map(x => +x); + // @ts-ignore + return Object.keys(ticks).sort((a, b) => a - b).map(x => +x); } /** diff --git a/test/fixtures/scale.time/negative-times.js b/test/fixtures/scale.time/negative-times.js new file mode 100644 index 000000000..a1863336d --- /dev/null +++ b/test/fixtures/scale.time/negative-times.js @@ -0,0 +1,35 @@ +module.exports = { + config: { + type: 'line', + data: { + datasets: [{ + data: [ + {x: -1000000, y: 1}, + {x: 1000000000, y: 2} + ] + }] + }, + options: { + scales: { + x: { + type: 'time', + time: { + unit: 'day' + }, + ticks: { + display: false + } + }, + y: { + ticks: { + display: false + } + } + }, + legend: false + } + }, + options: { + canvas: {width: 1000, height: 200} + } +}; diff --git a/test/fixtures/scale.time/negative-times.png b/test/fixtures/scale.time/negative-times.png new file mode 100644 index 0000000000000000000000000000000000000000..b7453937b51e728c7e7086070b546516aaa22a83 GIT binary patch literal 14136 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 literal 0 Hc-jL100001 -- 2.47.3