From 08b76b0efd6088d865e14b8a7edee07a4332c97a Mon Sep 17 00:00:00 2001 From: Jukka Kurkela Date: Wed, 3 Mar 2021 00:00:03 +0200 Subject: [PATCH] Time: limit offset to sane values, gen >= 2 ticks (#8560) --- src/scales/scale.time.js | 10 ++- .../bar-thickness-flex-offset.png | Bin 4583 -> 4561 bytes .../scale.time/offset-with-no-ticks.js | 81 ++++++++++++++++++ .../scale.time/offset-with-no-ticks.png | Bin 0 -> 1506 bytes 4 files changed, 87 insertions(+), 4 deletions(-) create mode 100644 test/fixtures/scale.time/offset-with-no-ticks.js create mode 100644 test/fixtures/scale.time/offset-with-no-ticks.png diff --git a/src/scales/scale.time.js b/src/scales/scale.time.js index 04df0ae1d20..8e400db3f09 100644 --- a/src/scales/scale.time.js +++ b/src/scales/scale.time.js @@ -1,6 +1,6 @@ import adapters from '../core/core.adapters'; import {isFinite, isNullOrUndef, mergeIf, valueOrDefault} from '../helpers/helpers.core'; -import {toRadians, isNumber} from '../helpers/helpers.math'; +import {toRadians, isNumber, _limitValue} from '../helpers/helpers.math'; import Scale from '../core/core.scale'; import {_arrayUnique, _filterBetween, _lookup} from '../helpers/helpers.collection'; @@ -379,6 +379,8 @@ export default class TimeScale extends Scale { end = (last - me.getDecimalForValue(timestamps[timestamps.length - 2])) / 2; } } + start = _limitValue(start, 0, 0.25); + end = _limitValue(end, 0, 0.25); me._offsets = {start, end, factor: 1 / (start + 1 + end)}; } @@ -404,7 +406,7 @@ export default class TimeScale extends Scale { const hasWeekday = isNumber(weekday) || weekday === true; const ticks = {}; let first = min; - let time; + let time, count; // For 'week' unit, handle the first day of week option if (hasWeekday) { @@ -420,11 +422,11 @@ export default class TimeScale extends Scale { } const timestamps = options.ticks.source === 'data' && me.getDataTimestamps(); - for (time = first; time < max; time = +adapter.add(time, stepSize, minor)) { + for (time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++) { addTick(ticks, time, timestamps); } - if (time === max || options.bounds === 'ticks') { + if (time === max || options.bounds === 'ticks' || count === 1) { addTick(ticks, time, timestamps); } diff --git a/test/fixtures/controller.bar/bar-thickness-flex-offset.png b/test/fixtures/controller.bar/bar-thickness-flex-offset.png index e20cc4eb450c8f90b94da145252619ba60cec024..59171e08cf33886b432f5122c94d9c573d1b697c 100644 GIT binary patch literal 4561 zcmeAS@N?(olHy`uVBq!ia0y~yU;;83893O0)X@p&(is>8XL!0ehE&A8y=mB&nl9@4 zu)5n(Kv?-Sr(oc7m7awKhXgn#1Z{6HWsbC#KzUOr1_jnY(NKe(T*` z|9I8kZ~MOmX1}~z`JiZ#0reB~5qc%8pQk?Fsh1H&CgCXOB<1%|~It%@7m8W`3r6zw@+3sh14?%h>e zCYA-;XCC8-nFTcBi_Iy;4_*xn7Hlj65~>aiZiQUV3B3%A5zg8YjnzOSzTdgKx|)T< zA>X)HaEA#aQ^Cv1Db5GxGu#0>?u~!~gLTYOB?I3B<_wozo+=g;GqF5)#{S@^Bom8* z@zg~eCL96{$NZvzjs&S6b<$`k4NO{M>3jI`&pZ9&mH&(aLS0$<9)J9Cyl~$BRwhQ4 zb-oP@G1c?`Z>hGa|9SnfO`YtDRZ2|9KYpsHx0##2z=5GLTUdeN`n`4rmT!R{|8od1 zs5d$^F)(tRc_Q6#z(ea_KLcX{FNX>+r62HNQ81X)#d3gGK|tAofvH&#q(F$lyuqOd zsDa0gfk}C#2Pi8T0`rG~1S3b!5+%k0W{x8u%?YELM+0oIB$7(mkzhCGHw z5s-pzkb;Q}I~ZAlfK^VS9#cSsr#sUFHUSSo1%}q0Kp|CG&IV}*1y`WvXQP@&18g*r zjAo3{!e9`Wo)+@)d#a7E{kZ-9Us>JP<@J3}YZYF6{PXSe z*}mz(>BoORmYn;$|C6BTA1)@2ni&Uv{GM4z@ZujPgg&ebxsLQ095CZ A1ONa4 literal 4583 zcmeHK>r)d~6hC{j;0A-)Xtj!nOAwV7LA2JOJQfI`#p3(XN`)#dK1oEyAWC*)%R_C{ zX~$@dQroe9utht>X2%I@XKM#PQNCD%Izl(dEc>tQKnfjy!re&S2G0tx`jY@xf;Lg5h ziy|8?{d8f}X(nc^n5?a6xNyVo^736ZpG?nDSG(R_d3l|&Ew{9+tJ|)gaQ?@xVrRYX z%ouk`x0*1VE0Gu~`|h1^w6xq8I6>-Bww_45o=mf*Xo_+zo0m`~^(q;mdwMm9HVq5W zDSzx__mAV?_o1<@*ugMD#}ZFCU6N0TeE&_^tr@Q6pfp$KCsytk;CTh**+M(@JlL=7 zTdFZx1u$7F`-8*`G-bQ7N=5o@0=RgVmj@6ct>C{%;bCLe(j8I?+6&c==H*E=Eq$;c z$Rc&4(5>30AbFu2IG0~N#02v^1jFsw+{9!ac9k3b$w1Vx_)X=EDvC0y^6D*81V%W2 zWx*H{jk}gvuG=_cAes&e`IeXCQM-72uZn00;k3WZqVpXG!KM0-1oI*u+JG=yXYpWC zGaH%bLj>!Z42@|94{`dt3MQ*mfYZC)N?}ch5!J&-47?nP3B5Dx%n(t5St~e?l1@WG zqjB;%q5w-y%Ko$!VX*%8a51a%Lx=+2w(8|@+?6r$ufcRx5)WDDzZ%Nam7zs-cx4iY z!0Pn}D}?$1(nub}-AV?!C~**FCe7>DMG!SoqpW-@h)pckbM7jJTpPl|waHHd8T-cq z=ypbI)*1mFL2jZbF%&gXdu{|1iOK_qwF*)UdXBMs1IRIsgUlmW_A+%Jp=V`UwndtP zk*_gT6VZ*@T}SRtX7spHzH+k0P$Vq7SIrqmV1XyS z7MLU#p-@!%10|k98+kGJGU-9+Xpr!596KCwNYm>Sq8}kS4VICt4&l_5p2|*=U%{v% z-iRG6+HhBN!-EX=v_Ga0xO)-j3PFqUpKbLQF&9>|ZY=2w0RvEU!dMRK2GG;!7fQad z<|q?4hJz686N-*PLT9BN4Q1kHW8JPbBR7YkjmWQCD+US{-28L>qaAoWXs&;#HP$MHLyI{m%-R^Of%n||?qd^a6pD}wchMGUe$I$ytn>iO= zJ%wW;Un(6Za*O9y_KQ2rY9cdNOTsdE$h|qTEer>n-IEQ|qt4nGp{lrP1723G1=Puo zFN-VS!C6OKIu8%Wzv@%);qd?BgS?P3)?zn#nJtFOZM|1I@rD@ucxj1345p|(^Ye{1 Z$qf1fHLEYRwyyyEW~OH9tCDjpe*@UW)UW^m diff --git a/test/fixtures/scale.time/offset-with-no-ticks.js b/test/fixtures/scale.time/offset-with-no-ticks.js new file mode 100644 index 00000000000..010dd519b52 --- /dev/null +++ b/test/fixtures/scale.time/offset-with-no-ticks.js @@ -0,0 +1,81 @@ +const data = { + datasets: [ + { + data: [ + { + x: moment('15/10/2020', 'DD/MM/YYYY').valueOf(), + y: 55 + }, + { + x: moment('18/10/2020', 'DD/MM/YYYY').valueOf(), + y: 10 + }, + { + x: moment('19/10/2020', 'DD/MM/YYYY').valueOf(), + y: 15 + } + ], + backgroundColor: 'blue' + }, + { + data: [ + { + x: moment('15/10/2020', 'DD/MM/YYYY').valueOf(), + y: 6 + }, + { + x: moment('18/10/2020', 'DD/MM/YYYY').valueOf(), + y: 11 + }, + { + x: moment('19/10/2020', 'DD/MM/YYYY').valueOf(), + y: 16 + } + ], + backgroundColor: 'green', + }, + { + data: [ + { + x: moment('15/10/2020', 'DD/MM/YYYY').valueOf(), + y: 7 + }, + { + x: moment('18/10/2020', 'DD/MM/YYYY').valueOf(), + y: 12 + }, + { + x: moment('19/10/2020', 'DD/MM/YYYY').valueOf(), + y: 17 + } + ], + backgroundColor: 'red', + } + ] +}; + +module.exports = { + description: 'https://github.com/chartjs/Chart.js/issues/7991', + config: { + type: 'bar', + data, + options: { + scales: { + x: { + type: 'time', + // offset: false, + time: { + unit: 'month', + }, + }, + y: { + display: false + } + } + } + }, + options: { + spriteText: true, + canvas: {width: 256, height: 128} + } +}; diff --git a/test/fixtures/scale.time/offset-with-no-ticks.png b/test/fixtures/scale.time/offset-with-no-ticks.png new file mode 100644 index 0000000000000000000000000000000000000000..9bea4ec59ad1688c3789d35b15a93336a2ec2a4e GIT binary patch literal 1506 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58aUX1 z|1V}ItjMZh)JWiPROZxgSoxgIImpEJxKM#gNJ1rxPQ-;f7nU?FIMBdsyToMSsyVgk zXYZ7q{kiJ9)!ol)jrRxaNcAeRKAHcqo1t;D@C=p*Z_3^^a{f_QVA#jQaxTJw;atT} zxw#DtKllVJk{KB-9zU%vVPbkX`jkWtc7eo3~82;LKf> z?f!O;r@VjW|9Kk2oGGVLjchGy&u}v7Hylv3SE+pd#CKVZ(f#xHnF@lu82p4SH_km! zqkYo7dH(-MzRTa443?P2tL`)|xMI)9qhPsd>VZF5ljgJA{|)22yd5a1%HZt7XPeH* zcq4<6X@lUJ{@73lhOnnKzY>vnA`QJ3wQt;*m^O&6sps4=@r`Bun>jHmKa(yzuu$Fq z|9>Q-#Fjnp4C`5Ttef$9IqS10PgUyY*!_Ipd41WFg$y>LA0{_6-7SyQK0mf! zzTe2;Q)%Dj*-Q`gnR#o%WnL;9{GamVYvb>@XBM#>4GcVBF$IQyMicgPUwB>{`*#_W z0t3^AU)fimGqXA{uq-(Ld)F^tAj^#7z??l(o_vfyDf6?m+^bI3^2M23OhCoASrVSk zXNmsZ{r>Yj4xo`eY!3|nPJQyYG5mR!-IIH}>^Y1+?6%tE05mMYgyH&@4Kj6f|nUf;I; z5Cf7m_^{~B*A51tjc>lbm8;ML$x2iNeyeg}0BZU6tBl`fI>Vk5j1mzGlvz05_ ! zzkEUU;?FiLzkp@af7vP~rfyc21jD(GOn+Hf7X0V4Wo$eOjH(&u6dL~l3#0n>c?}1W z7#Smc(kD37Gcvx|@9gi8un`#S%Zxo1>_1>X=f&L