From 41f8128c2b3ab82a1846f00171d1c153abb1afd3 Mon Sep 17 00:00:00 2001 From: Jacco van den Berg Date: Wed, 14 Dec 2022 21:43:41 +0100 Subject: [PATCH] Allow dynamic datasets to be colored (#10964) * Allow dynamic datasets to be colored * revieuw --- docs/general/colors.md | 16 +++++++ src/plugins/plugin.colors.ts | 11 +++-- .../plugin.colors/dynamic-datasets-default.js | 42 +++++++++++++++++ .../dynamic-datasets-default.png | Bin 0 -> 15854 bytes .../dynamic-datasets-force-override.js | 43 ++++++++++++++++++ .../dynamic-datasets-force-override.png | Bin 0 -> 15443 bytes 6 files changed, 107 insertions(+), 5 deletions(-) create mode 100644 test/fixtures/plugin.colors/dynamic-datasets-default.js create mode 100644 test/fixtures/plugin.colors/dynamic-datasets-default.png create mode 100644 test/fixtures/plugin.colors/dynamic-datasets-force-override.js create mode 100644 test/fixtures/plugin.colors/dynamic-datasets-force-override.png diff --git a/docs/general/colors.md b/docs/general/colors.md index 20d2459f3..f2b4c8d78 100644 --- a/docs/general/colors.md +++ b/docs/general/colors.md @@ -84,6 +84,22 @@ const options = { ::: +### Dynamic datasets at runtime + +By default the colors plugin only works when you initialize the chart without any colors for the border or background specified. +If you want to force the colors plugin to always color your datasets, for example when using dynamic datasets at runtime you will need to set the `forceOverride` option to true: + +```js +const options = { + plugins: { + colors: { + forceOverride: true + } + } +}; +``` + + ### Advanced color palettes See the [awesome list](https://github.com/chartjs/awesome#plugins) for plugins that would give you more flexibility defining color palettes. diff --git a/src/plugins/plugin.colors.ts b/src/plugins/plugin.colors.ts index 14292ca6c..b2817c85a 100644 --- a/src/plugins/plugin.colors.ts +++ b/src/plugins/plugin.colors.ts @@ -1,8 +1,9 @@ import {DoughnutController, PolarAreaController} from '../index.js'; -import type {Chart, ChartConfiguration, ChartDataset} from '../types.js'; +import type {Chart, ChartDataset} from '../types.js'; export interface ColorsPluginOptions { enabled?: boolean; + forceOverride?: boolean; } interface ColorsDescriptor { @@ -85,7 +86,8 @@ export default { defaults: { enabled: true, - }, + forceOverride: false + } as ColorsPluginOptions, beforeLayout(chart: Chart, _args, options: ColorsPluginOptions) { if (!options.enabled) { @@ -93,12 +95,11 @@ export default { } const { - type, options: {elements}, data: {datasets} - } = chart.config as ChartConfiguration; + } = chart.config; - if (containsColorsDefinitions(datasets) || elements && containsColorsDefinitions(elements)) { + if (!options.forceOverride && (containsColorsDefinitions(datasets) || elements && containsColorsDefinitions(elements))) { return; } diff --git a/test/fixtures/plugin.colors/dynamic-datasets-default.js b/test/fixtures/plugin.colors/dynamic-datasets-default.js new file mode 100644 index 000000000..9969d3e2a --- /dev/null +++ b/test/fixtures/plugin.colors/dynamic-datasets-default.js @@ -0,0 +1,42 @@ +module.exports = { + config: { + type: 'bar', + data: { + labels: [0, 1, 2, 3, 4, 5], + datasets: [ + { + data: [5, 5, 5, 5, 5, 5] + } + ] + }, + options: { + scales: { + x: { + ticks: { + display: false, + } + }, + y: { + ticks: { + display: false, + } + } + }, + plugins: { + legend: false, + colors: { + enabled: true + } + } + } + }, + options: { + run(chart) { + chart.data.datasets.push({ + data: [5, 5, 5, 5, 5, 5] + }); + + chart.update(); + } + } +}; diff --git a/test/fixtures/plugin.colors/dynamic-datasets-default.png b/test/fixtures/plugin.colors/dynamic-datasets-default.png new file mode 100644 index 0000000000000000000000000000000000000000..38f281077b377953362548010225510526f738e2 GIT binary patch literal 15854 zc-rloZBSEJ8pltP1{9iN6-zZLsS8EySfsRI?KKH5NI^>qIJMR`q0%;OMUes5gqI{> zTSZY=M1e|gSWv;$ii(w$w}fg1Dtc8AOfe)XCTM_QE=hpA?LlD1eklE7r+&E1WS(bk zIQO34|NPH$=1Cyy{m3wy%Ul-#04@C8kZ1tNVC*%`35Fp-`zQ>gr0B4f;N;bL4*+0* z@Q~oO0&f3rr~iADpNihW7EnWvh0JY?|AwJ{y=&IOvm^!W=EK`Z+XE{ivl$EbvVRCJ zS^3`Fcd{-lEQ?s#nRsD?K%HD0*hYseGnt&x zs`{`L+s;m%(e1dUR_3@bv-Yd3{jv?pHl9P}7{VMznWNn7z%OX+UGTT`Qu~5IVS+lz zD}A`Qy3v@U3&2~Gl+AZ^N-fFt210s}+ar``=C7cGlIhcThy{sX0qa{|qg#`AdSR58 z4hzXQUTMK4RNvGNtzXCcld0YgW91#6|-)4!$7xsDUb+ zIV()~#_Vq=W1j*rusQw$O6*60U{|mEHmT3aIoh|gB7;$wRPo{UXt|muLBiFF3QH@_ zp^na$SM7XsS{Mk>5nS(gi$727$Vc!#=Z>nNTs|tE@g+c#+->rdOQ%VLC*n|{{fNBD zyWR?GtK73do*avJX>(kL=J$!^SY}n<=Z=7VGzot`-irHCndii( zO_>qSS6Df7LC@R&aMDZ4pNe^TBqa4^&qI9pNS4E%nSSY!nbQ)0LARz-pbE|zPV#`T z>u|~DL3=OP6lr-bY4MJY{nP_5d@o+`7HCdd^?WypbGe$q*?4ym=VY~PZSg$q=ALYLzUXBO_zj`r7^i<3EXCd2i=znC=AX_LEu9s zZjH$hQ3v}zO^b(C;@hnjSJRv(70Vk#EE&c=T2GPI^SQYIn->a~ED_pUR|wbDckr}r z&rcp}mw#y&wvX>yXJm;g6UoXdLyC6)JP}ty^2ZY;EnPwfA<4UIuvwkicyUNMV=RH& zZ0Qo;*g+>Y>NObOo~{`wC)-@qe^r4Q2?X6aIo7+z6x*4G{sNVC&{(@&ns%OXSp6>_fF)rMX>%lab9`1=UKlmV8;~UZ410&qD z>}A_8z)ibXQ3;xRXKs`JelR6AE}~IQ19$qUl6>SLQyK9q654VIQAR{S&8BI$K+R71 zr;-?DtJ~ALXa99b8(8Bmgvn*NN_%~&(DvU{d4Om`g(dklU)7lJn9aeG2<#1yxUSX(Dviu)|mXd78v2ymTVpP4sLBa zyzd(|AxdrNrfT7qveo|{OQ3CT6-Gnbu$RF}dFRw{s`K99L>XR%F%P=`=ks*v{`gid z0ZYIVumtS01*>wBTOMWc>bRA>j_o$XAGfqAG?Y# zFPAx|b<>9{uhn}Cw^Sh2*N-&gr9X8|CL2tB)G=}P9QXJWbu0;ljR;r*mVhN-pHWzC z7Z9+R`aPXGbuhoiifCuG=U{@C^41D*tQe14H;9??L%e>mP&EVuBrCI zXa^>-pWv?t@oRhqiAFM`*yb|T$uJwt`2==}zdKgq#|Fc<8O8M=H!npuel@0vD4}6xKRfFy6*n;0)Rj_a@f!dz(KLQ&m$yO7Y9kF1Wbc^@rXlc)T z=oW8psO&dMK~ULSh48-Dy&p3DKB~QvME_(r0+Y{S2YM+#6Keaj!WH-m+tX_f}2y6mHZ5yuh<5qV1=~6`_SKN5ARC5decO1yQ%r-%eB0ZYIVuzwru|~uZ>FxFc#N&p;k%D#|vpo5+Q0CY_By{mg#6~gi1=_itp=Nn&QKS(jd#Pg$^Ysx4$ou1EN(wna2y5jCpM%+ C;H8!T literal 0 Hc-jL100001 diff --git a/test/fixtures/plugin.colors/dynamic-datasets-force-override.js b/test/fixtures/plugin.colors/dynamic-datasets-force-override.js new file mode 100644 index 000000000..404d63068 --- /dev/null +++ b/test/fixtures/plugin.colors/dynamic-datasets-force-override.js @@ -0,0 +1,43 @@ +module.exports = { + config: { + type: 'bar', + data: { + labels: [0, 1, 2, 3, 4, 5], + datasets: [ + { + data: [5, 5, 5, 5, 5, 5] + } + ] + }, + options: { + scales: { + x: { + ticks: { + display: false + } + }, + y: { + ticks: { + display: false + } + } + }, + plugins: { + legend: false, + colors: { + enabled: true, + forceOverride: true + } + } + } + }, + options: { + run(chart) { + chart.data.datasets.push({ + data: [5, 5, 5, 5, 5, 5] + }); + + chart.update(); + } + } +}; diff --git a/test/fixtures/plugin.colors/dynamic-datasets-force-override.png b/test/fixtures/plugin.colors/dynamic-datasets-force-override.png new file mode 100644 index 0000000000000000000000000000000000000000..58121e43f69963b8648ae458c9f7e1420d3d16ac GIT binary patch literal 15443 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