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 | 44 ++++++++------------ test/fixtures/scale.time/negative-times.js | 35 ++++++++++++++++ test/fixtures/scale.time/negative-times.png | Bin 0 -> 14136 bytes 3 files changed, 52 insertions(+), 27 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; - } - - if (time === max || options.bounds === 'ticks') { - 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); } - return Object.keys(ticks).map(x => +x); + if (time === max || options.bounds === 'ticks') { + addTick(ticks, time, timestamps); + } + + // @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 HcmV?d00001