From 15d1056b537a07b613f6dfe56fc920390c1dd267 Mon Sep 17 00:00:00 2001 From: Simon Brunel Date: Sat, 2 Dec 2017 12:38:36 +0100 Subject: [PATCH] Implement equally sized bars (#4994) When `barThickness: undefined|null` (default), we compute an optimal sample size based on the smallest tick interval reduced to prevent any bar to overlap (bar equally sized). Also added support for a special `barThickness: 'flex'` value (previous default) that globally arranges bars side by side to prevent any gap when percentage options are 1 (variable bar sizes). --- .gitignore | 1 + src/controllers/controller.bar.js | 150 +++++++++++++----- test/.eslintrc | 1 + .../bar-thickness-absolute.json | 42 +++++ .../controller.bar/bar-thickness-absolute.png | Bin 0 -> 5055 bytes .../bar-thickness-flex-offset.json | 42 +++++ .../bar-thickness-flex-offset.png | Bin 0 -> 4583 bytes .../controller.bar/bar-thickness-flex.json | 41 +++++ .../controller.bar/bar-thickness-flex.png | Bin 0 -> 5095 bytes .../controller.bar/bar-thickness-max.json | 41 +++++ .../controller.bar/bar-thickness-max.png | Bin 0 -> 4421 bytes .../bar-thickness-min-interval.json | 40 +++++ .../bar-thickness-min-interval.png | Bin 0 -> 5180 bytes .../bar-thickness-multiple.json | 46 ++++++ .../controller.bar/bar-thickness-multiple.png | Bin 0 -> 5847 bytes .../bar-thickness-no-overlap.json | 46 ++++++ .../bar-thickness-no-overlap.png | Bin 0 -> 4211 bytes .../controller.bar/bar-thickness-offset.json | 47 ++++++ .../controller.bar/bar-thickness-offset.png | Bin 0 -> 6577 bytes .../bar-thickness-single-xy.json | 40 +++++ .../bar-thickness-single-xy.png | Bin 0 -> 4514 bytes .../controller.bar/bar-thickness-single.json | 43 +++++ .../controller.bar/bar-thickness-single.png | Bin 0 -> 4374 bytes .../controller.bar/bar-thickness-stacked.json | 48 ++++++ .../controller.bar/bar-thickness-stacked.png | Bin 0 -> 5586 bytes test/jasmine.utils.js | 3 - test/specs/controller.bar.tests.js | 82 +--------- 27 files changed, 586 insertions(+), 127 deletions(-) create mode 100644 test/fixtures/controller.bar/bar-thickness-absolute.json create mode 100644 test/fixtures/controller.bar/bar-thickness-absolute.png create mode 100644 test/fixtures/controller.bar/bar-thickness-flex-offset.json create mode 100644 test/fixtures/controller.bar/bar-thickness-flex-offset.png create mode 100644 test/fixtures/controller.bar/bar-thickness-flex.json create mode 100644 test/fixtures/controller.bar/bar-thickness-flex.png create mode 100644 test/fixtures/controller.bar/bar-thickness-max.json create mode 100644 test/fixtures/controller.bar/bar-thickness-max.png create mode 100644 test/fixtures/controller.bar/bar-thickness-min-interval.json create mode 100644 test/fixtures/controller.bar/bar-thickness-min-interval.png create mode 100644 test/fixtures/controller.bar/bar-thickness-multiple.json create mode 100644 test/fixtures/controller.bar/bar-thickness-multiple.png create mode 100644 test/fixtures/controller.bar/bar-thickness-no-overlap.json create mode 100644 test/fixtures/controller.bar/bar-thickness-no-overlap.png create mode 100644 test/fixtures/controller.bar/bar-thickness-offset.json create mode 100644 test/fixtures/controller.bar/bar-thickness-offset.png create mode 100644 test/fixtures/controller.bar/bar-thickness-single-xy.json create mode 100644 test/fixtures/controller.bar/bar-thickness-single-xy.png create mode 100644 test/fixtures/controller.bar/bar-thickness-single.json create mode 100644 test/fixtures/controller.bar/bar-thickness-single.png create mode 100644 test/fixtures/controller.bar/bar-thickness-stacked.json create mode 100644 test/fixtures/controller.bar/bar-thickness-stacked.png diff --git a/.gitignore b/.gitignore index 53ce8fedb..cfb878a6d 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ bower.json *.log *.swp +*.stackdump diff --git a/src/controllers/controller.bar.js b/src/controllers/controller.bar.js index b811c6f05..ff2b56ae5 100644 --- a/src/controllers/controller.bar.js +++ b/src/controllers/controller.bar.js @@ -95,6 +95,93 @@ defaults._set('horizontalBar', { } }); +/** + * Computes the "optimal" sample size to maintain bars equally sized while preventing overlap. + * @private + */ +function computeMinSampleSize(scale, pixels) { + var min = scale.isHorizontal() ? scale.width : scale.height; + var ticks = scale.getTicks(); + var prev, curr, i, ilen; + + for (i = 1, ilen = pixels.length; i < ilen; ++i) { + min = Math.min(min, pixels[i] - pixels[i - 1]); + } + + for (i = 0, ilen = ticks.length; i < ilen; ++i) { + curr = scale.getPixelForTick(i); + min = i > 0 ? Math.min(min, curr - prev) : min; + prev = curr; + } + + return min; +} + +/** + * Computes an "ideal" category based on the absolute bar thickness or, if undefined or null, + * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This + * mode currently always generates bars equally sized (until we introduce scriptable options?). + * @private + */ +function computeFitCategoryTraits(index, ruler, options) { + var thickness = options.barThickness; + var count = ruler.stackCount; + var curr = ruler.pixels[index]; + var size, ratio; + + if (helpers.isNullOrUndef(thickness)) { + size = ruler.min * options.categoryPercentage; + ratio = options.barPercentage; + } else { + // When bar thickness is enforced, category and bar percentages are ignored. + // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%') + // and deprecate barPercentage since this value is ignored when thickness is absolute. + size = thickness * count; + ratio = 1; + } + + return { + chunk: size / count, + ratio: ratio, + start: curr - (size / 2) + }; +} + +/** + * Computes an "optimal" category that globally arranges bars side by side (no gap when + * percentage options are 1), based on the previous and following categories. This mode + * generates bars with different widths when data are not evenly spaced. + * @private + */ +function computeFlexCategoryTraits(index, ruler, options) { + var pixels = ruler.pixels; + var curr = pixels[index]; + var prev = index > 0 ? pixels[index - 1] : null; + var next = index < pixels.length - 1 ? pixels[index + 1] : null; + var percent = options.categoryPercentage; + var start, size; + + if (prev === null) { + // first data: its size is double based on the next point or, + // if it's also the last data, we use the scale end extremity. + prev = curr - (next === null ? ruler.end - curr : next - curr); + } + + if (next === null) { + // last data: its size is also double based on the previous point. + next = curr + curr - prev; + } + + start = curr - ((curr - prev) / 2) * percent; + size = ((next - prev) / 2) * percent; + + return { + chunk: size / ruler.stackCount, + ratio: options.barPercentage, + start: start + }; +} + module.exports = function(Chart) { Chart.controllers.bar = Chart.DatasetController.extend({ @@ -262,17 +349,22 @@ module.exports = function(Chart) { var scale = me.getIndexScale(); var stackCount = me.getStackCount(); var datasetIndex = me.index; - var pixels = []; var isHorizontal = scale.isHorizontal(); var start = isHorizontal ? scale.left : scale.top; var end = start + (isHorizontal ? scale.width : scale.height); - var i, ilen; + var pixels = []; + var i, ilen, min; for (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) { pixels.push(scale.getPixelForValue(null, i, datasetIndex)); } + min = helpers.isNullOrUndef(scale.options.barThickness) + ? computeMinSampleSize(scale, pixels) + : -1; + return { + min: min, pixels: pixels, start: start, end: end, @@ -332,51 +424,21 @@ module.exports = function(Chart) { calculateBarIndexPixels: function(datasetIndex, index, ruler) { var me = this; var options = ruler.scale.options; - var meta = me.getMeta(); - var stackIndex = me.getStackIndex(datasetIndex, meta.stack); - var pixels = ruler.pixels; - var base = pixels[index]; - var length = pixels.length; - var start = ruler.start; - var end = ruler.end; - var leftSampleSize, rightSampleSize, leftCategorySize, rightCategorySize, fullBarSize, size; - - if (length === 1) { - leftSampleSize = base > start ? base - start : end - base; - rightSampleSize = base < end ? end - base : base - start; - } else { - if (index > 0) { - leftSampleSize = (base - pixels[index - 1]) / 2; - if (index === length - 1) { - rightSampleSize = leftSampleSize; - } - } - if (index < length - 1) { - rightSampleSize = (pixels[index + 1] - base) / 2; - if (index === 0) { - leftSampleSize = rightSampleSize; - } - } - } - - leftCategorySize = leftSampleSize * options.categoryPercentage; - rightCategorySize = rightSampleSize * options.categoryPercentage; - fullBarSize = (leftCategorySize + rightCategorySize) / ruler.stackCount; - size = fullBarSize * options.barPercentage; + var range = options.barThickness === 'flex' + ? computeFlexCategoryTraits(index, ruler, options) + : computeFitCategoryTraits(index, ruler, options); - size = Math.min( - helpers.valueOrDefault(options.barThickness, size), - helpers.valueOrDefault(options.maxBarThickness, Infinity)); - - base -= leftCategorySize; - base += fullBarSize * stackIndex; - base += (fullBarSize - size) / 2; + var stackIndex = me.getStackIndex(datasetIndex, me.getMeta().stack); + var center = range.start + (range.chunk * stackIndex) + (range.chunk / 2); + var size = Math.min( + helpers.valueOrDefault(options.maxBarThickness, Infinity), + range.chunk * range.ratio); return { - size: size, - base: base, - head: base + size, - center: base + size / 2 + base: center - size / 2, + head: center + size / 2, + center: center, + size: size }; }, diff --git a/test/.eslintrc b/test/.eslintrc index 8e8f899bf..9d98c4528 100644 --- a/test/.eslintrc +++ b/test/.eslintrc @@ -11,3 +11,4 @@ globals: rules: # Best Practices complexity: 0 + max-statements: 0 diff --git a/test/fixtures/controller.bar/bar-thickness-absolute.json b/test/fixtures/controller.bar/bar-thickness-absolute.json new file mode 100644 index 000000000..599b090d6 --- /dev/null +++ b/test/fixtures/controller.bar/bar-thickness-absolute.json @@ -0,0 +1,42 @@ +{ + "config": { + "type": "bar", + "data": { + "labels": ["2017", "2018", "2019", "2024", "2025"], + "datasets": [{ + "backgroundColor": "rgba(255, 99, 132, 0.5)", + "data": [1, null, 3, 4, 5] + }] + }, + "options": { + "responsive": false, + "legend": false, + "title": false, + "scales": { + "xAxes": [{ + "type": "time", + "offset": true, + "display": false, + "barPercentage": 1, + "categoryPercentage": 1, + "barThickness": 128, + "ticks": { + "source": "labels" + } + }], + "yAxes": [{ + "display": false, + "ticks": { + "beginAtZero": true + } + }] + } + } + }, + "options": { + "canvas": { + "height": 256, + "width": 512 + } + } +} diff --git a/test/fixtures/controller.bar/bar-thickness-absolute.png b/test/fixtures/controller.bar/bar-thickness-absolute.png new file mode 100644 index 0000000000000000000000000000000000000000..40172b39241f2a6e13d201f7a47509137acc468e GIT binary patch literal 5055 zc-rk&e^6BA8h+2=AO{It*fC5Q*kxrg>AGm9IPv2Y+b&A2*4(0dySg|{kympwlU;;` zkFr+8Kyz?Yi(PF-Zc?C9NU|+ERs!K=n@}m2Wfv$BVcj2y%L2RGx79df`DfEV?wR@K zoOhn*ectE&X5RCC73(D8$l3E}13={J9N{wnB>p6To`qlE?CUN7V863k_}D)c8*HYG zs#goA$gm6jE@n)UwPEH1hB=&JJ^1SHLI9H3}MA4hSF zeL@P8%l$kCTs0ghy2?)sFj(lTM;VB!HefQ2_3#r8T^F7b26P>vR!0*@QE;+@$i;cN)b|zKx{vzXYEY zh9U#(=P~=a1AeF3H~S7c4)5S&ln9{p82zs+fEESN9T?RSTj6|!)kAYqa}it+*=OC6 ziopc|@Z=fRn}rY*xeQD63w>TvV#V%lY%VPl)8 z$2RhnEJfXPaVUJ|dRrM6s@u1mtCpg+$*Crj?UuK#*E{UF)oB~K)wv^KvP%60p$OB3 z%`74maPeX98uGQ{pGn&41yEP*P|o3ieMoNC@bT2`JZ%w!2)fljR;=Vha+E#3o{fsv=`3~*xL+*#)*=MS1Ezne`B3oG4M{N@JzB2o zY2<>OEV?YshVH|C54!nKx7Svh%SO|ubnP-ckQR{h_6^IT?~8#`;HNP%&F+vGW3Ur?6dY{z+`UV9hAe8iT?ZWqad7up{}~ z2}zKb<6JJ|KwZW4rIj(L{WayNED2;u^8Fef#D=@#j2sy57}@wj3{o9c_6YbOJ6HH& zLL&5bx+nn`lIfBCDKSX=z0zyvLt{bV#~Kc(_cVEzQre88VRkXZ-#1y)RtvhAA1?XQ zh?ajJyJY9WC1-l+D$=1i-*||D4cVh_mK}uuq+aY#jz;}k5|2b9`fBVPE(k->nLRhVuCkDN+u1QqBB``^2 z!xgU)!Q}{RBOVC`P7HPkvhm5JN{>4)0t>I!S2-2d;@I&YoiBJYt>j`V|vKPx%s@ky2eL%Z4TKj`mtHWQrDf@!7ZBd7>y#yB;^w zQ0ox)i{Z*_2Cl?Z+{nJ&2@5sjooN;xn`WU!Hzqa)u49z;Q=qi}*ncha_6`E^N(x@N x3(w9Wb`Ney5aH__6O;?e1?B#Jx%3?Hg+0#Nd|ZF|y=MSFtDlev8y?Sp^B4S!qmuvt literal 0 Hc-jL100001 diff --git a/test/fixtures/controller.bar/bar-thickness-flex-offset.json b/test/fixtures/controller.bar/bar-thickness-flex-offset.json new file mode 100644 index 000000000..1776b07be --- /dev/null +++ b/test/fixtures/controller.bar/bar-thickness-flex-offset.json @@ -0,0 +1,42 @@ +{ + "config": { + "type": "bar", + "data": { + "labels": ["2017", "2018", "2020", "2024", "2038"], + "datasets": [{ + "backgroundColor": "#FF6384", + "data": [1, null, 3, 4, 5] + }] + }, + "options": { + "responsive": false, + "legend": false, + "title": false, + "scales": { + "xAxes": [{ + "type": "time", + "offset": true, + "display": false, + "barPercentage": 1, + "categoryPercentage": 1, + "barThickness": "flex", + "ticks": { + "source": "labels" + } + }], + "yAxes": [{ + "display": false, + "ticks": { + "beginAtZero": true + } + }] + } + } + }, + "options": { + "canvas": { + "height": 256, + "width": 512 + } + } +} diff --git a/test/fixtures/controller.bar/bar-thickness-flex-offset.png b/test/fixtures/controller.bar/bar-thickness-flex-offset.png new file mode 100644 index 0000000000000000000000000000000000000000..e20cc4eb450c8f90b94da145252619ba60cec024 GIT binary patch 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 literal 0 Hc-jL100001 diff --git a/test/fixtures/controller.bar/bar-thickness-flex.json b/test/fixtures/controller.bar/bar-thickness-flex.json new file mode 100644 index 000000000..0bef9db18 --- /dev/null +++ b/test/fixtures/controller.bar/bar-thickness-flex.json @@ -0,0 +1,41 @@ +{ + "config": { + "type": "bar", + "data": { + "labels": ["2017", "2018", "2020", "2024", "2038"], + "datasets": [{ + "backgroundColor": "#FF6384", + "data": [1, null, 3, 4, 5] + }] + }, + "options": { + "responsive": false, + "legend": false, + "title": false, + "scales": { + "xAxes": [{ + "type": "time", + "display": false, + "barPercentage": 1, + "categoryPercentage": 1, + "barThickness": "flex", + "ticks": { + "source": "labels" + } + }], + "yAxes": [{ + "display": false, + "ticks": { + "beginAtZero": true + } + }] + } + } + }, + "options": { + "canvas": { + "height": 256, + "width": 512 + } + } +} diff --git a/test/fixtures/controller.bar/bar-thickness-flex.png b/test/fixtures/controller.bar/bar-thickness-flex.png new file mode 100644 index 0000000000000000000000000000000000000000..791a29d25d380f64f8c33fc3a928cebc531348cb GIT binary patch literal 5095 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 aTTGZUY*gBQ-pLAj0DYOeq~exzRpsB%ez~;( literal 0 Hc-jL100001 diff --git a/test/fixtures/controller.bar/bar-thickness-min-interval.json b/test/fixtures/controller.bar/bar-thickness-min-interval.json new file mode 100644 index 000000000..e5861685c --- /dev/null +++ b/test/fixtures/controller.bar/bar-thickness-min-interval.json @@ -0,0 +1,40 @@ +{ + "config": { + "type": "bar", + "data": { + "labels": ["2016", "2018", "2020", "2024", "2030"], + "datasets": [{ + "backgroundColor": "#FF6384", + "data": [1, null, 3, 4, 5] + }] + }, + "options": { + "responsive": false, + "legend": false, + "title": false, + "scales": { + "xAxes": [{ + "type": "time", + "display": false, + "barPercentage": 1, + "categoryPercentage": 1, + "ticks": { + "source": "labels" + } + }], + "yAxes": [{ + "display": false, + "ticks": { + "beginAtZero": true + } + }] + } + } + }, + "options": { + "canvas": { + "height": 256, + "width": 512 + } + } +} diff --git a/test/fixtures/controller.bar/bar-thickness-min-interval.png b/test/fixtures/controller.bar/bar-thickness-min-interval.png new file mode 100644 index 0000000000000000000000000000000000000000..ae01a9b945c4ef691bd0a861cdce518f6c23e872 GIT binary patch literal 5180 zc-rljZ%7ky7{{OAZ#tHTERs5>(xzrZ0xN1+Nq^q7QBY!Yo%Y8H zvZ-MTCH4o3f{dt)LY+lrOp5Bof-RjXR)n?GmThk9c9NC!rWd^k?%v!Te4fwu`@DOO z>2p^qfCpPu>riu$N5N;c(D zp}XcNB;2GmULtSD$@a2oT>NCs^-6gi@zip#0%hzHGI5tw8bnr$(I-O zjiyE*WO|T46d}qzdJa;F#fc)9LXvz;%lQ;ql$T@dj;mcNrrt^8z~!0RTq?>_qiKk2 z>!8F`g@7Gte5a6B`p;J~Roa{>U4g;#Z_V|WMm#-6Ln!z*WUfEpYV{d}750C7(W!IK ziz@Q>Ihz`LR|mcYJ7RfplSp zshf|`^+PU-UNV;f+ytaHA)ABwar-b)A*^m&0J!Rjl7{T|vru{gW5zU5(nuOfGhVYA z8)IAiU+i|L@#XN$lZF)~Bd?cPEX8+$%=xLVwuNNw{{GmVBbJpROCZ>j)b(l5X`jHE zlz^TTQY5eHttSX>ixNt8K(L6m=G5@8R`XHE0h@s6T7u&wR6-?GLM2o}B~(KH8Z}oU zkGDIib^U?i_x=x;Rs=o_87-??6XAv9*J0b~>Ck2N-wt{%e04Zln=QVc*ot6ZzIQ8T zN|MKA553$7IVzNV%rZl`lvv?X8atnm{*d7hy>J6b@fUkT5G|BDCAb!?!?=K=_;?no zsz5EAO={}LeWip%aJ2R?rcK`qY literal 0 Hc-jL100001 diff --git a/test/fixtures/controller.bar/bar-thickness-multiple.json b/test/fixtures/controller.bar/bar-thickness-multiple.json new file mode 100644 index 000000000..fc39849ae --- /dev/null +++ b/test/fixtures/controller.bar/bar-thickness-multiple.json @@ -0,0 +1,46 @@ +{ + "config": { + "type": "bar", + "data": { + "labels": ["2016", "2018", "2020", "2024", "2030"], + "datasets": [{ + "backgroundColor": "#FF6384", + "data": [1, null, 3, 4, 5] + }, { + "backgroundColor": "#36A2EB", + "data": [5, 4, 3, null, 1] + }, { + "backgroundColor": "#FFCE56", + "data": [3, 5, 2, null, 4] + }] + }, + "options": { + "responsive": false, + "legend": false, + "title": false, + "scales": { + "xAxes": [{ + "type": "time", + "display": false, + "barPercentage": 1, + "categoryPercentage": 1, + "ticks": { + "source": "labels" + } + }], + "yAxes": [{ + "display": false, + "ticks": { + "beginAtZero": true + } + }] + } + } + }, + "options": { + "canvas": { + "height": 256, + "width": 512 + } + } +} diff --git a/test/fixtures/controller.bar/bar-thickness-multiple.png b/test/fixtures/controller.bar/bar-thickness-multiple.png new file mode 100644 index 0000000000000000000000000000000000000000..d38405292c3b496ae1414813c6bfd120f83ffc8a GIT binary patch literal 5847 zc-rlkT~HHO7>3WTOI-*^00&UiL_}y6LF`ym3`rsKCy?lLr~)-$sZcuzBMKtjZ>2Qt6@=E$D$Ue@&?_3oCbq+=P2 zG_{+MHMT*%cG7couLH6Kqor)=;*8g$OYMJ;sql%Ggur_fSKi&3`OI|Pp)qH-{1DG7 z_IC5{vL1w7dD0$GvnHT|X=Qb@Q&Fr)=}@P2s0&m{e1%qATr_ye>!nOEH?}V&r*X!U zu6fKcbdzLt&Hm>d#Hs3>+6^=$PN0erv?{on0D_TF_r&SG3d7Th;bHY@ZM)9jGC?(Y zLJWHJ%RDFfQ#VD@iK99fgWASK;>(M3nTIp;$ca8n4$BmS4i3=XZvXqC8*(C2J@! z9Cen0LY1vo#Lk4bPr3~vNtwxA!FP^S&>zlON#d*T?}o@eOI9&3i6fyd@TC|GkkTLI z%(zfaSG*?C-oa8RT4y0Imn)DgrT(&SroNw!+&Pbl}HkTnL*Q z!X~2gN1-z)rJZU<$<*~s1~8AN*sH_ryUxcKXl7y zqlK%K9N5!x4}DZd5=q;IV-y-Ue^dH%6GY-fhtw3hX!G!zihka^8(>puWo*Lg#A*5M z61}*xZ@k<@687T##UxuY$d6=!;DhK-=5}Pz#EMGah7jc^Z9)FB`%9Y$E2Yh@C@TnB z-*#n^&Yw9hJy1*U-l9k4yKWVWZeyS)ylWbrOZ+HcWr7QX8j%;))%2p)ZEfLLoxT`RLNqU^~>zU%ut7_jHVBv(f&QC4lVGuj#L z{)3&J6%fp3({;l*1wUzdI<*QHCvZnDbkcP|(<0=is5@F3dBG(zjaF7aE%u^Mb^6bp zRvTt!Cn%ID?TY1uDQH8}Ef6W!BT>aE>6Gre4XBgY%j<9^KkoyK_$+Q#K!mSOmlO~K1 z-9Q3B7~?Tl7n8y2vk+WFL}u&&T|q7=#u1FnzNFIxiUZ=u(Kh@Ai5L31h1MV<=je)b z3h~`}LUV|{))eb)WjaxTqq8s43&Yfvi^1(YaQ##;li2Ltz`VSU3aovMLZi?q{6vM% zh~J9}y++2HwiL{`_ut^mD6{cSd`L*qk8Je*0(9T0s$J$z9C!y53m<`DIf=rXEpr!) zy%UzrYoF)i1HwIT^5LjcUTKe}2-~`JaJ>Lw#8>x;Ya5RqbYBvg>IeSd@+SE~5OgMv zgoOu!EKfWhb-G-k^wsbJj&{&tQZU<*LO)#8`D%X{=!%3de`O7_&w{LT=2mY>%e;VI zRYyrR6beS}mFcCfU^WHku#TuEB3PW%f$_pz*LVs3eC&6CJ`5|2z;Rg z3VWgRx0G#_CwcqGuObNJU}z&WKc@ygi2xa324$ijOc2K2&%yrH5Zl2Ndk|oRMreee z5IpiLxDyz*`OxrlQ38!ObfT8y{b71YfiMEAZT=k-DE5H;&poEI@sL<2*Ltbk7KU;M zN?47mp7vfNR}gz(MSXIYegAm!{Dg>n*(0*iu;o3Fav){yeg$_V ztY>~ejZy$7ZAvB0p=kAG4TE7#@a5sz{@n3ofhzlGxyMSd^hoT79Z;fQ%dOGfL=S^p zJ2DU`zvM{qUKSqmzUE{*inYcIR526_x2;aV*1O?b`VGl1kaAMmx+K24el8ghPvEvt KX1Pz)vA+R))v_=E literal 0 Hc-jL100001 diff --git a/test/fixtures/controller.bar/bar-thickness-no-overlap.json b/test/fixtures/controller.bar/bar-thickness-no-overlap.json new file mode 100644 index 000000000..3e9f1f5f5 --- /dev/null +++ b/test/fixtures/controller.bar/bar-thickness-no-overlap.json @@ -0,0 +1,46 @@ +{ + "config": { + "type": "bar", + "data": { + "labels": ["2016", "2018", "2020", "2024", "2030"], + "datasets": [{ + "backgroundColor": "#FF6384", + "data": [ + {"y": "1", "t": "2016"}, + {"y": "2", "t": "2017"}, + {"y": "3", "t": "2017-08"}, + {"y": "4", "t": "2024"}, + {"y": "5", "t": "2030"} + ] + }] + }, + "options": { + "responsive": false, + "legend": false, + "title": false, + "scales": { + "xAxes": [{ + "type": "time", + "display": false, + "barPercentage": 1, + "categoryPercentage": 1, + "ticks": { + "source": "labels" + } + }], + "yAxes": [{ + "display": false, + "ticks": { + "beginAtZero": true + } + }] + } + } + }, + "options": { + "canvas": { + "height": 256, + "width": 512 + } + } +} diff --git a/test/fixtures/controller.bar/bar-thickness-no-overlap.png b/test/fixtures/controller.bar/bar-thickness-no-overlap.png new file mode 100644 index 0000000000000000000000000000000000000000..1385a0853e80aa539570bff905d0f11e9d924150 GIT binary patch literal 4211 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 literal 0 Hc-jL100001 diff --git a/test/fixtures/controller.bar/bar-thickness-stacked.json b/test/fixtures/controller.bar/bar-thickness-stacked.json new file mode 100644 index 000000000..aa2d82553 --- /dev/null +++ b/test/fixtures/controller.bar/bar-thickness-stacked.json @@ -0,0 +1,48 @@ +{ + "config": { + "type": "bar", + "data": { + "labels": ["2016", "2018", "2020", "2024", "2030"], + "datasets": [{ + "backgroundColor": "#FF6384", + "data": [1, null, 3, 4, 5] + }, { + "backgroundColor": "#36A2EB", + "data": [5, 4, 3, null, 1] + }, { + "backgroundColor": "#FFCE56", + "data": [3, 5, 2, null, 4] + }] + }, + "options": { + "responsive": false, + "legend": false, + "title": false, + "scales": { + "xAxes": [{ + "type": "time", + "stacked": true, + "display": false, + "barPercentage": 1, + "categoryPercentage": 1, + "ticks": { + "source": "labels" + } + }], + "yAxes": [{ + "display": false, + "stacked": true, + "ticks": { + "beginAtZero": true + } + }] + } + } + }, + "options": { + "canvas": { + "height": 256, + "width": 512 + } + } +} diff --git a/test/fixtures/controller.bar/bar-thickness-stacked.png b/test/fixtures/controller.bar/bar-thickness-stacked.png new file mode 100644 index 0000000000000000000000000000000000000000..696829ee39b400f7bd77dbc1b930784d3cf42542 GIT binary patch literal 5586 zc-rk(eNa4N3cMPvjzwVqI~EK+ASpy1WX_`wC?Cu-3BYOEW51fYGL~wfEpkq*+ZNvZU5arc00*T zCNKB=?zzA7d-tAmZfWZ3Rdd~5a07t35^=(703<#VK)d2khx%d$z;ho-65@W7^TzPa z_Rk-_6L)TOTjiY4v)*e{58spojL&Px(y>c^uRFh<_g=skSy9xczWCqGdEgNX4smFE2XTKahWFnf#*O^0#4Y%s}nPkfo-0`9N&8kKI$i zazK!Z&$U*$^-))~#Zqnfc6swy$H)+vxsXJ>JHihOU0wiCa_BMsudIU~)&j-f(EFbY@nc(yQqL+d4c{0!+fMz}(K9S}Q2yvyk81|L~7OHkIkSM{G{E(WygaaoLB(mZD zGu7SUqOHxnUoLFP>F#NWh%tZcGJhYaYG!;aqO@zLG>~($SoZGdDaiT8JYu4@B;(v6 zoGXE>gI$S_Bl!S1oLvkjE8uz(S?7yH-xA}i{{wM!H>Hi{L&sM|pjwHcu&axAACG$zgVy?^Zgno&wS2fGhIxTV=~*7lkxQJEoRof{l=SH^ebJ}Qc5UT=OfkM~ z#AeJDO}c9)*%w4Q-MUtDdz? z&Nck2v1#g)k$rZ(pLw1Av&K=6Jk!fc^I%xp#JPypGR5cz%KIXFcSgPSwy5CljhAc! z#Q0Vf|f7-jP80b1uAovL7!lXfE z_Cl5rr3jxrMjS17NZ9^WA*eQ!q#)IuD|1LlCk3N~UJR(#Kb}XikxNm+Jsi+i$+SR+ zgxkw`1bGf6tn&sxhlI>dDM}bD0P+M}7ds?OOONNYQ3Sz!>Y`0@NJs^GVba34$}WLu z$6FQn&QOvfr9V0;{g{$o`Cv_i+&Cit^`oNOWk$zN*_53X0MRF$%KaZwvW|-$^(fAm zyyW)A$o%7#$_bmyeibu@KH}xqxvi$tT|;t<$+9o(%AqsO_8wXO_n{imUh69Ros{hQ zynoBT`L;xB_s5pv;9s)sgZ(yR$I|@2*I2r&f6A^togsTTeP2%sqI#5fE6te`RjYdK zmo&|m>4mN1RlHj3ZOoFsZro==2-bDf!**T&R!?Y`041yp62OO-YeYVjP6w9M9LmDQ&G%5DqP zoY5RS6w83j%F9W)sI=>3EqTpt%KJ;+Io5bD(UGDWANp{xXPxD&UvI(imENhbh8Od0 z{BF90iJ77yxA!F+fRfk96eCF^J&_puP%DuGU(DT<2; z;wS<=`5?h7LNLK#lg}=Fog~wEJT5>86?jjOk^=1Xx%A_BIpkx9F9soA7WPnVDj$f> zbUffe*jcDSj5mfz9#RYI^$wZGTN30VT z`GmI9oOh_D+g*`oIU!RHbzL%KYAmLKe5-NU0;SQE+j_^a8VbX_esH3{DF>z1pvix@ zdBOArAD{2m*qTAy7y;y!!&du(*s;k{SfQ}dy{|%H%5#qLf3OS7==&A3g9)$R@k1Yw z{`TzZss=jV$4*CvPP+b7R|<7iPrE(IbF+sj_Dw#he&mG|`181bBCztQ+)Ux)vW&ps zr*aEW?m{8(5h$G{H^T>>1cV6OGfQp(0xLj_z{pv0$D!OpLXE(*S^HxZ#2 dstt2EyXytxy=vy!K_1{olDInINPOD%{{RATU#kEB literal 0 Hc-jL100001 diff --git a/test/jasmine.utils.js b/test/jasmine.utils.js index 7db35642e..2c2006a2c 100644 --- a/test/jasmine.utils.js +++ b/test/jasmine.utils.js @@ -118,9 +118,6 @@ function specFromFixture(description, inputs) { var chart = acquireChart(json.config, json.options); if (!inputs.png) { fail('Missing PNG comparison file for ' + inputs.json); - if (!json.debug) { - releaseChart(chart); - } done(); } diff --git a/test/specs/controller.bar.tests.js b/test/specs/controller.bar.tests.js index 315bdbd34..096b2e8e1 100644 --- a/test/specs/controller.bar.tests.js +++ b/test/specs/controller.bar.tests.js @@ -1,4 +1,6 @@ describe('Chart.controllers.bar', function() { + describe('auto', jasmine.specsFromFixtures('controller.bar')); + it('should be constructed', function() { var chart = window.acquireChart({ type: 'bar', @@ -1630,84 +1632,4 @@ describe('Chart.controllers.bar', function() { }); }); }); - - describe('Bar thickness with a time scale', function() { - ['auto', 'data', 'labels'].forEach(function(source) { - ['series', 'linear'].forEach(function(distribution) { - describe('When ticks.source is "' + source + '", distribution is "' + distribution + '"', function() { - beforeEach(function() { - this.chart = window.acquireChart({ - type: 'bar', - data: { - datasets: [{ - data: [1, 2, 3] - }, { - data: [1, 2, 3] - }], - labels: ['2017', '2018', '2020'] - }, - options: { - legend: false, - title: false, - scales: { - xAxes: [{ - id: 'x', - type: 'time', - time: { - unit: 'year', - parser: 'YYYY' - }, - ticks: { - source: source - }, - offset: true, - distribution: distribution - }], - yAxes: [{ - type: 'linear' - }] - } - } - }); - }); - - it('should correctly set bar width', function() { - var chart = this.chart; - var scale = chart.scales.x; - var options = chart.options.scales.xAxes[0]; - var categoryPercentage = options.categoryPercentage; - var barPercentage = options.barPercentage; - var firstInterval = scale.getPixelForValue('2018') - scale.getPixelForValue('2017'); - var firstExpected = firstInterval * categoryPercentage / 2 * barPercentage; - var lastInterval = scale.getPixelForValue('2020') - scale.getPixelForValue('2018'); - var lastExpected = lastInterval * categoryPercentage / 2 * barPercentage; - var i, ilen, meta; - - for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) { - meta = chart.getDatasetMeta(i); - expect(meta.data[0]._model.width).toBeCloseToPixel(firstExpected); - expect(meta.data[1]._model.width).toBeCloseToPixel((firstExpected + lastExpected) / 2); - expect(meta.data[2]._model.width).toBeCloseToPixel(lastExpected); - } - }); - - it('should correctly set bar width if maxBarThickness is specified', function() { - var chart = this.chart; - var options = chart.options.scales.xAxes[0]; - var i, ilen, meta; - - options.maxBarThickness = 10; - chart.update(); - - for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) { - meta = chart.getDatasetMeta(i); - expect(meta.data[0]._model.width).toBeCloseToPixel(10); - expect(meta.data[1]._model.width).toBeCloseToPixel(10); - expect(meta.data[2]._model.width).toBeCloseToPixel(10); - } - }); - }); - }); - }); - }); }); -- 2.47.3