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 04df0ae1d..8e400db3f 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 zc-rlj?N3uz9Dsl4c!q~YvRhsZn-OnImFN-yF@w1}ZfOgYO;*5dW+StUQDV&25}avM zT5ci4A*JY|vFKKOVcCX@`oTn;CcRlUNan(a8GOmWlvP1D2VBuopf9`qD`v8LzMPYL zp68e6e!00_=Gv+Z#j6Sc$S_qK>H)BHL_pJ|?U$pYO#n*2$)MY5|M;JK#lF2wImSt6 zw~oomznQMAo7Q;G+J0i_QS;S4v|`S@O{c!{AiaoG;Olv~t3tj1x~q11^Teg_U_26x z)E#&{=7=5!Ojl*vwZY|ZbHKVX->BjR>}gRoXfPf30~!*efq7|JypC z!pRLBj3Z3FnJkr`E?9;+`-pyxI7Tx@d<` z3bzaoRkjvPLQ^Y4i?3k9mYg_8w^D{5uKiGoO!0D(ob=x$5#OX3n<*S|B(|8}GZJ4| zjE*!1f}I$Vi#vE|boM8&IJIqycfwlt+V2L{ctm_^Z_|ElJ;QR42Sc*rG3w5FvwQ@;SgA$`p_Zr99`AgjJP*^S`f7 zCyVN>HHdwHA?c7EX%Si%d#xLz;fBT-8Y;ix1)c|CJwouf7|AJ=wcsyt@$VnsrCI=P#7U;?Bgg z-b68;JFir5mH;4s(nFZ+NMhL0&4H5{y-JW^@#Nw<5hoisq?ZcU(ogQ>n6 pgT*8Lk@DN}Ofo5xGWkCsg&;f{Y;ZjJd_yis%VexIT&%FP{|i*-kput$ literal 4583 zc-rk(>r)d~6hC{j;0A-)Xtj!nOAwV7LA2JOJQfI`#p3(XN`)#dK1oEyAWC*)%R_C{ zX~$@dQroe9utht~0-WTpoO1O)&<;LI8Nc>n}W3K)NUUEJf$1JG2>)F&-4E$eKJaelLDRQlrsclJG7 z6xnd;rwgM_Gcjw$WNk&mg&TgCm+z|iWO|Oe+V$?r%j=A7xus=Y-FEea^FMYKJL`34 z#<)wm)r8?(iNsLZckhIwrRBcB2~v-;^+e+JWSTWaQnV73sGL;Nn?c9zck+g8w3ghmBcFcStG77pfi2%adqY`d~qj zMe0VQTeVF=@Mc?PMmT?E z!59*atCm@=+c;w&QU`^6%ggbIE*{^jA{s(C?Ju+Fe8)j>ss1CuyoiT3Ak5ZTJebtX zM&|ht!MY|xW17K3oc^wY$to4#^scv3Skqyw>fs{>UXDbLcV?X#A}UZw!FiN)8X6jn zlg|+aSaMSKr>&@L{q5mmR_BLN1-xz5%i*{xW8z8d0ivd(`sl&LF2Ms;{)5{J3y z^#?12`T^2N9>m>B2D&J55M?IK>(@mPHI7DE`Bo5{SnTKARSdZ{goSI9p9V7aj|I@} zjM%I-0t!KHq9`#GHBozR1QUtifx}t_DF&5e?A`!!jN>5l$d$cJ-AAabOv|=NQ!w&1 zrfMR(5#4p@5tNgL^7%ZU0or?+=b`9I=oX4E-!D>@B?Yvb`N7N3Zv)s5xfp zS=md+ZJ)#E@HzgO!yW}~37#jPwzx<4nPSrohWff+AJx~kMs0Vd;<43aTca^qq*#Sq zt8S0`uBa!`>+US{-28L>qaFBp&|LpeYphiYhZb{Cn6)ul1Mj)_-A9#C_ef4-s(Uci zyvb06$KKC#qkI4#zz6UFd;lNd-vT6Wr`p`t^ZKIp{=Q@8@9z|cY-?=E%PuMKJUTyh zcf#g#=4i+q-&rtjpwJXCg%L-G8O@%j#~q91GiL9_Q1j>b|M7m)X3m9IPvMxzmrBQp z+~T>F{o)R@n#j!6lCTUOa&L}o3&VrW?#YJfQD<$8P*vQt0WYi80_tSPm&FzE;H)Dq zorj0xU-bcefd3ajUPu{haW{FHEr!Z%y;nN%h8X;KX^BD%rl>vh^Nlvi4Eh5#t1q>- QuK;{zre^A^l5;G71K7mWumAu6 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 000000000..010dd519b --- /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 zc-rd>@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%vVPbka8h$LzlzRPNi?w`NUR1oCF;3sUkaqfW{ z?UU}!^Z!TkUH;Bwu*5W8b*FK`6?;Y=1Y3Q}6edET&v_W)DJ?D;zZ!GKI%!yI?nRMZSh3fwQ z|05YCw(NOlSkJO!-Hgx6S)V<5s!~74?&tf?>&u=jWUvwaFu9@mzRdBwfCn?a8$EBH zy#Mi(_-DU=1~K?~*?w+d(AjRhbLs&@pw#Ea{{Mw`Pih$@CR800WQ@p5{}jda`LX@- z{YD0#O8YL)W_qB{%v%#K^HSO1|CA?R8-K?=vxwzrVBi6ZDKPvqny{by!t>hLzsr~u z7??Kv%D(!Xnbm=TWx@I1yMFlsS!Nsu=IojBXXNf;m@<|p4{7I&tddox78*GpkWCn4ClY@XV(9bCoL%; zz`!Wb&?ug|-kk*`wLbs*fnv@E295&a!LkorZ@v~}1ZuhQ`nK(d z7?7;NhedC`b}#^KeDn3KT!kJ;R-z*CTa^m~P|LSpW&AeN8TOoDl!#cM%);@;_W|4g z;Eg4CgvB{bglY@So3?vGFJ{s%D&1X#59Eg!S$78V)2e yGDi5MPjIMbWPGvT+20{yBQV&P8G9_)f53jui@PUg@hEA6if~U?KbLh*2~7YiEn