From cb571ca4a3f6b66133ee50357204c5277642cc96 Mon Sep 17 00:00:00 2001 From: jiawulin001 Date: Tue, 17 May 2022 11:42:43 +0800 Subject: [PATCH 1/3] Allow user to use `interval` at time axis --- src/coord/axisHelper.ts | 3 +++ src/scale/Interval.ts | 8 +++++++- src/scale/Scale.ts | 4 +++- src/scale/Time.ts | 32 +++++++++++++++++++------------- 4 files changed, 32 insertions(+), 15 deletions(-) diff --git a/src/coord/axisHelper.ts b/src/coord/axisHelper.ts index c487d52871..10ff3190ce 100644 --- a/src/coord/axisHelper.ts +++ b/src/coord/axisHelper.ts @@ -168,6 +168,7 @@ export function niceScaleExtent( scale.setExtent(extent[0], extent[1]); scale.calcNiceExtent({ + interval: interval, splitNumber: splitNumber, fixMin: extentInfo.fixMin, fixMax: extentInfo.fixMax, @@ -182,6 +183,8 @@ export function niceScaleExtent( // FIXME if (interval != null) { (scale as IntervalScale).setInterval && (scale as IntervalScale).setInterval(interval); + //If interval is set by user, mark it as true + (scale as IntervalScale).intervalSetByUser(); } } diff --git a/src/scale/Interval.ts b/src/scale/Interval.ts index 1f4a7f98e8..a3b74ab443 100644 --- a/src/scale/Interval.ts +++ b/src/scale/Interval.ts @@ -35,6 +35,7 @@ class IntervalScale = Dictionary> e protected _interval: number = 0; protected _niceExtent: [number, number]; private _intervalPrecision: number = 2; + protected _isIntervalSetByUser: boolean = false; parse(val: number): number { @@ -85,6 +86,10 @@ class IntervalScale = Dictionary> e this._intervalPrecision = helper.getIntervalPrecision(interval); } + + intervalSetByUser(): void { + this._isIntervalSetByUser = true; + } /** * @param expandToNicedExtent Whether expand the ticks to niced extent. @@ -214,8 +219,9 @@ class IntervalScale = Dictionary> e /** * @param splitNumber By default `5`. + * @param interval Interval Set by user, not used here but inheritated by TimeScale */ - calcNiceTicks(splitNumber?: number, minInterval?: number, maxInterval?: number): void { + calcNiceTicks(splitNumber?: number, minInterval?: number, maxInterval?: number, interval?: number): void { splitNumber = splitNumber || 5; const extent = this._extent; let span = extent[1] - extent[0]; diff --git a/src/scale/Scale.ts b/src/scale/Scale.ts index 143f4c9b74..5d47b5000b 100644 --- a/src/scale/Scale.ts +++ b/src/scale/Scale.ts @@ -153,11 +153,13 @@ abstract class Scale = Dictionary> // FIXME:TS make them in a "opt", the same with `niceExtent`? splitNumber?: number, minInterval?: number, - maxInterval?: number + maxInterval?: number, + interval?: number ): void; abstract calcNiceExtent( opt?: { + interval?: number, splitNumber?: number, fixMin?: boolean, fixMax?: boolean, diff --git a/src/scale/Time.ts b/src/scale/Time.ts index 5b097953e3..4cd266e23d 100644 --- a/src/scale/Time.ts +++ b/src/scale/Time.ts @@ -166,7 +166,8 @@ class TimeScale extends IntervalScale { this._minLevelUnit, this._approxInterval, useUTC, - extent + extent, + this._isIntervalSetByUser ); ticks = ticks.concat(innerTicks); @@ -185,7 +186,8 @@ class TimeScale extends IntervalScale { fixMin?: boolean, fixMax?: boolean, minInterval?: number, - maxInterval?: number + maxInterval?: number, + interval?: number } ): void { const extent = this._extent; @@ -202,15 +204,16 @@ class TimeScale extends IntervalScale { extent[0] = extent[1] - ONE_DAY; } - this.calcNiceTicks(opt.splitNumber, opt.minInterval, opt.maxInterval); + this.calcNiceTicks(opt.splitNumber, opt.minInterval, opt.maxInterval, opt.interval); } - calcNiceTicks(approxTickNum: number, minInterval: number, maxInterval: number): void { + calcNiceTicks(approxTickNum: number, minInterval: number, maxInterval: number, interval: number): void { approxTickNum = approxTickNum || 10; const extent = this._extent; const span = extent[1] - extent[0]; - this._approxInterval = span / approxTickNum; + //Use set interval if specified by user + this._approxInterval = interval || (span / approxTickNum); if (minInterval != null && this._approxInterval < minInterval) { this._approxInterval = minInterval; @@ -430,7 +433,8 @@ function getIntervalTicks( bottomUnitName: TimeUnit, approxInterval: number, isUTC: boolean, - extent: number[] + extent: number[], + isIntervalSetByUser: boolean ): TimeScaleTick[] { const safeLimit = 10000; const unitNames = timeUnits; @@ -478,7 +482,8 @@ function getIntervalTicks( function addLevelTicks( unitName: TimeUnit, lastLevelTicks: InnerTimeTick[], - levelTicks: InnerTimeTick[] + levelTicks: InnerTimeTick[], + isIntervalSetByUser: boolean ) { const newAddedTicks: ScaleTick[] = []; const isFirstLevel = !lastLevelTicks.length; @@ -517,14 +522,15 @@ function getIntervalTicks( case 'half-year': case 'quarter': case 'month': - interval = getMonthInterval(approxInterval); + //Use interval set by user if specified + interval = isIntervalSetByUser ? Math.max(1, Math.round(approxInterval / ONE_DAY / 30)) : getMonthInterval(approxInterval); getterName = monthGetterName(isUTC); setterName = monthSetterName(isUTC); break; case 'week': // PENDING If week is added. Ignore day. case 'half-week': case 'day': - interval = getDateInterval(approxInterval, 31); // Use 32 days and let interval been 16 + interval = isIntervalSetByUser ? Math.max(1, Math.round(approxInterval / ONE_DAY)) : getDateInterval(approxInterval, 31); // Use 32 days and let interval been 16 getterName = dateGetterName(isUTC); setterName = dateSetterName(isUTC); isDate = true; @@ -532,17 +538,17 @@ function getIntervalTicks( case 'half-day': case 'quarter-day': case 'hour': - interval = getHourInterval(approxInterval); + interval = isIntervalSetByUser ? Math.max(1, Math.round(approxInterval / ONE_HOUR)) : getHourInterval(approxInterval); getterName = hoursGetterName(isUTC); setterName = hoursSetterName(isUTC); break; case 'minute': - interval = getMinutesAndSecondsInterval(approxInterval, true); + interval = isIntervalSetByUser ? Math.max(1, Math.round(approxInterval / ONE_MINUTE)) : getMinutesAndSecondsInterval(approxInterval, true); getterName = minutesGetterName(isUTC); setterName = minutesSetterName(isUTC); break; case 'second': - interval = getMinutesAndSecondsInterval(approxInterval, false); + interval = isIntervalSetByUser ? Math.max(1, Math.round(approxInterval / ONE_SECOND)) : getMinutesAndSecondsInterval(approxInterval, false); getterName = secondsGetterName(isUTC); setterName = secondsSetterName(isUTC); break; @@ -582,7 +588,7 @@ function getIntervalTicks( if (!isPrimaryTimeUnit(unitNames[i])) { // TODO continue; } - addLevelTicks(unitNames[i], levelsTicks[levelsTicks.length - 1] || [], currentLevelTicks); + addLevelTicks(unitNames[i], levelsTicks[levelsTicks.length - 1] || [], currentLevelTicks, isIntervalSetByUser); const nextPrimaryTimeUnit: PrimaryTimeUnit = unitNames[i + 1] ? getPrimaryTimeUnit(unitNames[i + 1]) : null; if (primaryTimeUnit !== nextPrimaryTimeUnit) { From 10d74d43196d824091f3797b42a61abae1114015 Mon Sep 17 00:00:00 2001 From: jiawulin001 Date: Tue, 17 May 2022 14:14:13 +0800 Subject: [PATCH 2/3] test case added --- test/axis-interval.html | 145 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) diff --git a/test/axis-interval.html b/test/axis-interval.html index b84c3c8ba7..c0ddaeb61d 100644 --- a/test/axis-interval.html +++ b/test/axis-interval.html @@ -69,6 +69,8 @@

Test xAxis.axisTick.interval

+
+
+ + + From dc485a8f2fd156235a91c75e35a1be1520f2928d Mon Sep 17 00:00:00 2001 From: jiawulin001 Date: Tue, 17 May 2022 14:46:14 +0800 Subject: [PATCH 3/3] fix lint error --- src/scale/Interval.ts | 2 +- src/scale/Time.ts | 20 +++++++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/scale/Interval.ts b/src/scale/Interval.ts index a3b74ab443..8dddddc18b 100644 --- a/src/scale/Interval.ts +++ b/src/scale/Interval.ts @@ -86,7 +86,7 @@ class IntervalScale = Dictionary> e this._intervalPrecision = helper.getIntervalPrecision(interval); } - + intervalSetByUser(): void { this._isIntervalSetByUser = true; } diff --git a/src/scale/Time.ts b/src/scale/Time.ts index 4cd266e23d..d33211b97a 100644 --- a/src/scale/Time.ts +++ b/src/scale/Time.ts @@ -523,14 +523,18 @@ function getIntervalTicks( case 'quarter': case 'month': //Use interval set by user if specified - interval = isIntervalSetByUser ? Math.max(1, Math.round(approxInterval / ONE_DAY / 30)) : getMonthInterval(approxInterval); + interval = isIntervalSetByUser + ? Math.max(1, Math.round(approxInterval / ONE_DAY / 30)) + : getMonthInterval(approxInterval); getterName = monthGetterName(isUTC); setterName = monthSetterName(isUTC); break; case 'week': // PENDING If week is added. Ignore day. case 'half-week': case 'day': - interval = isIntervalSetByUser ? Math.max(1, Math.round(approxInterval / ONE_DAY)) : getDateInterval(approxInterval, 31); // Use 32 days and let interval been 16 + interval = isIntervalSetByUser + ? Math.max(1, Math.round(approxInterval / ONE_DAY)) + : getDateInterval(approxInterval, 31); // Use 32 days and let interval been 16 getterName = dateGetterName(isUTC); setterName = dateSetterName(isUTC); isDate = true; @@ -538,17 +542,23 @@ function getIntervalTicks( case 'half-day': case 'quarter-day': case 'hour': - interval = isIntervalSetByUser ? Math.max(1, Math.round(approxInterval / ONE_HOUR)) : getHourInterval(approxInterval); + interval = isIntervalSetByUser + ? Math.max(1, Math.round(approxInterval / ONE_HOUR)) + : getHourInterval(approxInterval); getterName = hoursGetterName(isUTC); setterName = hoursSetterName(isUTC); break; case 'minute': - interval = isIntervalSetByUser ? Math.max(1, Math.round(approxInterval / ONE_MINUTE)) : getMinutesAndSecondsInterval(approxInterval, true); + interval = isIntervalSetByUser + ? Math.max(1, Math.round(approxInterval / ONE_MINUTE)) + : getMinutesAndSecondsInterval(approxInterval, true); getterName = minutesGetterName(isUTC); setterName = minutesSetterName(isUTC); break; case 'second': - interval = isIntervalSetByUser ? Math.max(1, Math.round(approxInterval / ONE_SECOND)) : getMinutesAndSecondsInterval(approxInterval, false); + interval = isIntervalSetByUser + ? Math.max(1, Math.round(approxInterval / ONE_SECOND)) + : getMinutesAndSecondsInterval(approxInterval, false); getterName = secondsGetterName(isUTC); setterName = secondsSetterName(isUTC); break;