From 65565fb9abdc847c2d098c6f9c5bac635022bdf8 Mon Sep 17 00:00:00 2001 From: Jukka Kurkela Date: Wed, 24 Feb 2021 23:50:55 +0200 Subject: [PATCH] Fix stacking bug when a dataset is removed --- src/core/core.controller.js | 8 +- .../controller.bar/stacking/remove-dataset.js | 102 ++++++++++++++++++ .../stacking/remove-dataset.png | Bin 0 -> 12354 bytes 3 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 test/fixtures/controller.bar/stacking/remove-dataset.js create mode 100644 test/fixtures/controller.bar/stacking/remove-dataset.png diff --git a/src/core/core.controller.js b/src/core/core.controller.js index 7450587dfb9..9dbfdb87350 100644 --- a/src/core/core.controller.js +++ b/src/core/core.controller.js @@ -107,6 +107,7 @@ class Chart { this._options = options; this._layers = []; this._metasets = []; + this._stacks = undefined; this.boxes = []; this.currentDevicePixelRatio = undefined; this.chartArea = undefined; @@ -370,8 +371,11 @@ class Chart { */ _removeUnreferencedMetasets() { const me = this; - const datasets = me.data.datasets; - me._metasets.forEach((meta, index) => { + const {_metasets: metasets, data: {datasets}} = me; + if (metasets.length > datasets.length) { + delete me._stacks; + } + metasets.forEach((meta, index) => { if (datasets.filter(x => x === meta._dataset).length === 0) { me._destroyDatasetMeta(index); } diff --git a/test/fixtures/controller.bar/stacking/remove-dataset.js b/test/fixtures/controller.bar/stacking/remove-dataset.js new file mode 100644 index 00000000000..a0ca8db1c70 --- /dev/null +++ b/test/fixtures/controller.bar/stacking/remove-dataset.js @@ -0,0 +1,102 @@ +var barChartData = { + labels: [0, 1, 2, 3, 4, 5, 6], + datasets: [ + { + backgroundColor: 'red', + data: [ + // { x: 0, y: 0 }, + {x: 1, y: 5}, + {x: 2, y: 5}, + {x: 3, y: 5}, + {x: 4, y: 5}, + {x: 5, y: 5}, + {x: 6, y: 5} + ] + }, + { + backgroundColor: 'blue', + data: [ + {x: 0, y: 5}, + // { x: 1, y: 0 }, + {x: 2, y: 5}, + {x: 3, y: 5}, + {x: 4, y: 5}, + {x: 5, y: 5}, + {x: 6, y: 5} + ] + }, + { + backgroundColor: 'green', + data: [ + {x: 0, y: 5}, + {x: 1, y: 5}, + // { x: 2, y: 0 }, + {x: 3, y: 5}, + {x: 4, y: 5}, + {x: 5, y: 5}, + {x: 6, y: 5} + ] + }, + { + backgroundColor: 'yellow', + data: [ + {x: 0, y: 5}, + {x: 1, y: 5}, + {x: 2, y: 5}, + // {x: 3, y: 0 }, + {x: 4, y: 5}, + {x: 5, y: 5}, + {x: 6, y: 5} + ] + }, + { + backgroundColor: 'purple', + data: [ + {x: 0, y: 5}, + {x: 1, y: 5}, + {x: 2, y: 5}, + {x: 3, y: 5}, + // { x: 4, y: 0 }, + {x: 5, y: 5}, + {x: 6, y: 5} + ] + }, + { + backgroundColor: 'grey', + data: [ + {x: 0, y: 5}, + {x: 1, y: 5}, + {x: 2, y: 5}, + {x: 3, y: 5}, + {x: 4, y: 5}, + // { x: 5, y: 0 }, + {x: 6, y: 5} + ] + } + ] +}; + +module.exports = { + config: { + type: 'bar', + data: barChartData, + options: { + scales: { + x: { + display: false, + stacked: true + }, + y: { + display: false, + stacked: true + } + } + } + }, + options: { + run(chart) { + chart.data.datasets.splice(0, 1); + chart.update(); + } + } +}; diff --git a/test/fixtures/controller.bar/stacking/remove-dataset.png b/test/fixtures/controller.bar/stacking/remove-dataset.png new file mode 100644 index 0000000000000000000000000000000000000000..12c6767c80b799b13d29af16854a983fb63a6541 GIT binary patch literal 12354 zcmeI3{aX`P7RPU5RN_m)bgO8QphVFsg5o16kYuf5Kv&$-wX(Lr?qiF6TnR7IA?9V` z+G?$sh-eiRqM*z6SyxohfI)&-9jQP>EhrEI9R+PnVtC7YW^bZap8W@QyE{J(&&;{^ zoVnb4&L`iK?Ax$@&EyF)CIA2?$MaTw000&KNd-RR;AJT9fgOM#5WniTALgYPI#O>d z1uNUl`i&v?i&p>sbXL%WE%7lM`dCY5d@)PYzzGSi3jG>qBwzGd61eXA;E7$@*iDBM zzFy%!W&7r1Bj0~J`@)#%Q)hjX`)GDy_=JX#(s$Z(n>l#b;%$4cJ9d9O(A7S295;z9 z$J>!_1ssK=F8Y=_L)m!(%c>0zR5x72l%0l}1){(6SzIaD#R=TiX&A9a$YJh!Pd`Z&JAXDD&EQmtZfLWg7Dp)Y zk-n^euyg%knMSjrIu_|ex-*pRay;)Dv>*B;k>eVQ2va);rfKZ5HS)k~*$84eU1<~s zSz=I?mYvh4thN9AkFai?PMy^z_I+G3jj!wsX|aFXo+32Zlsbvye!AA;XRJ}Fgil(_ z)-adrH)mjmB0Q=t(`(<(#|&fAC3m26whS*m<;=F}n>(|FngQQnF!iiCA8egRxf@44 zb%4fwmo8mqSEJSMfYqN;=AFj(WN#h2?5MGamZXf2;>U&sVM*N!? zpv(HtSYTWTdce+!$nD z_7p&}l>E91Hio%>aIoD+Qgexa;^y(_bAwW@QJV^xsHup#Q%D%fFlK-*x34(Sd7gua z`VC(=iYx2z%gj8(Za&f7$;pG9^ixT>j9Kk!GE}CE?-*Q4Q?$D$ZwGwPTcRpAX2>Od zt(xNDP>!QAOpGNZx=aeTzHV=(W-~u_ILU+(8t3C=-N4&eqNq7X=isB}bB@4dhP&nBE-@typTwbma*z#=q)5TaB-nsz6w0j|}?&=zJ8mh&8=lFu* zyy2S;+nmQUkGK%#@h3Gwe2;(YB9>OrIMG;Ik3G(%Q|U>GzC4A(*2Euz(@!6%SHf1$`m z9#~ok{2_9ZK|}T?SDM@&9zrA!BAGqBP(rTBm3=9!a}TDXj?1WX8wY7qI&JN8lQm2cEwOu1 zQp3)1K0vJ}u*8y)P)?SpIr3Vr^QX@(vC{o@=52BXaYQY4J}goUG;<`*1`~1JoSWWl zW0`jLB?hRSsp#W8-N0nz&grn?nwfm4a5jkCy-bm)OV;1wY;rj8VLU2j#bC?$%=QQb z!8~dtymz=LkbXk0p7I(27y$4IcWxls=8HJSjc z0Pso?3BD2hrVz}VMY+3@nzr~7$WNdKL2PBvrE^y}--7+UHQ>M&idPo2P2onFHx*18JUSbE7OUcc7?6=zES8iO?(4&nDL}A zbf79x(EGklA~I@;o+_w%t~S{(N6OH_VB*DtMB9}}N$&$k$77me{XPq{PTni6<>{EE=d{J{vR&{UWbr2O!Ml zrnN@Jav46cUuy}<*y)19GL1*OIIt=HD90o!RbCSWAg1IxE?AhLpH2zqLA~(mG_a2a z4naKKK6IATH9@-P5;)`GOxPKRBKbIoc(dtJmi-?5G8t?tk+&ZdOVpiB37KgUCAJqWRQAC3DqUD^ugKkWHbcfp@7{m}ac$9W(hV)je5_a+aV zIRtpKDR);<$&kraCN~Co{K$+!=4G;!ctxdOVZpW&F~IHnoQL=9D2<&De;WYeSFc}n Jer4KU{{?dl*zN!T literal 0 HcmV?d00001