From 44908f546f25458ca12c9245f6e260b06d57f0f8 Mon Sep 17 00:00:00 2001 From: Josh Kelley Date: Tue, 25 Feb 2025 11:15:48 -0500 Subject: [PATCH 01/16] Update docs (#12037) * Update docs Grammar and style: "TypeScript", add articles, etc. Add docs covering the `Array[]` version of data. Please review and let me know if I've made any mistakes. Fix an apparent mistake in the `parsing: false` description of category axes: I believe it's trying to say that _strings_ would be a mistake. * Reword based on feedback and further testing --- docs/general/data-structures.md | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/docs/general/data-structures.md b/docs/general/data-structures.md index 5c95e560ca6..39074070ab5 100644 --- a/docs/general/data-structures.md +++ b/docs/general/data-structures.md @@ -2,8 +2,8 @@ The `data` property of a dataset can be passed in various formats. By default, that `data` is parsed using the associated chart type and scales. -If the `labels` property of the main `data` property is used, it has to contain the same amount of elements as the dataset with the most values. These labels are used to label the index axis (default x axes). The values for the labels have to be provided in an array. -The provided labels can be of the type string or number to be rendered correctly. In case you want multiline labels you can provide an array with each line as one entry in the array. +If the `labels` property of the main `data` property is used, it has to contain the same amount of elements as the dataset with the most values. These labels are used to label the index axis (default `x` axis). The values for the labels have to be provided in an array. +The provided labels can be of the type string or number to be rendered correctly. If you want multiline labels, you can provide an array with each line as one entry in the array. ## Primitive[] @@ -19,7 +19,22 @@ const cfg = { } ``` -When the `data` is an array of numbers, values from `labels` array at the same index are used for the index axis (`x` for vertical, `y` for horizontal charts). +When `data` is an array of numbers, values from the `labels` array at the same index are used for the index axis (`x` for vertical, `y` for horizontal charts). + +## Array[] + +```javascript +const cfg = { + type: 'line', + data: { + datasets: [{ + data: [[10, 20], [15, null], [20, 10]] + }] + } +} +``` + +When `data` is an array of arrays (or what TypeScript would call tuples), the first element of each tuple is the index (`x` for vertical, `y` for horizontal charts) and the second element is the value (`y` by default). ## Object[] @@ -58,7 +73,9 @@ const cfg = { This is also the internal format used for parsed data. In this mode, parsing can be disabled by specifying `parsing: false` at chart options or dataset. If parsing is disabled, data must be sorted and in the formats the associated chart type and scales use internally. -The values provided must be parsable by the associated scales or in the internal format of the associated scales. A common mistake would be to provide integers for the `category` scale, which uses integers as an internal format, where each integer represents an index in the labels array. `null` can be used for skipped values. +The values provided must be parsable by the associated scales or in the internal format of the associated scales. For example, the `category` scale uses integers as an internal format, where each integer represents an index in the labels array; but, if parsing is enabled, it can also parse string labels. + +`null` can be used for skipped values. ## Object[] using custom properties @@ -117,7 +134,7 @@ const cfg = { ``` :::warning -When using object notation in a radar chart, you still need a labels array with labels for the chart to show correctly. +When using object notation in a radar chart, you still need a `labels` array with labels for the chart to show correctly. ::: ## Object @@ -136,7 +153,7 @@ const cfg = { } ``` -In this mode, property name is used for `index` scale and value for `value` scale. For vertical charts, index scale is `x` and value scale is `y`. +In this mode, the property name is used for the `index` scale and value for the `value` scale. For vertical charts, the index scale is `x` and value scale is `y`. ## Dataset Configuration @@ -180,9 +197,9 @@ const cfg = { }; ``` -## Typescript +## TypeScript -When using typescript, if you want to use a data structure that is not the default data structure, you will need to pass it to the type interface when instantiating the data variable. +When using TypeScript, if you want to use a data structure that is not the default data structure, you will need to pass it to the type interface when instantiating the data variable. ```ts import {ChartData} from 'chart.js'; From a647e0d007ff43e9ddc397603cc9ba1547ca0791 Mon Sep 17 00:00:00 2001 From: Josh Kelley Date: Tue, 25 Feb 2025 11:15:56 -0500 Subject: [PATCH 02/16] Add docs on using from Node.js (#12039) This has come up a couple of times in Discord, so I thought it would be helpful to have official docs. --- docs/.vuepress/config.ts | 1 + docs/getting-started/index.md | 7 ++-- docs/getting-started/using-from-node-js.md | 38 ++++++++++++++++++++++ 3 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 docs/getting-started/using-from-node-js.md diff --git a/docs/.vuepress/config.ts b/docs/.vuepress/config.ts index 645754254c1..ccb310094cf 100644 --- a/docs/.vuepress/config.ts +++ b/docs/.vuepress/config.ts @@ -294,6 +294,7 @@ export default defineConfig({ 'getting-started/installation', 'getting-started/integration', 'getting-started/usage', + 'getting-started/using-from-node-js', ] }, { diff --git a/docs/getting-started/index.md b/docs/getting-started/index.md index 232f3d40d5b..6df4d1f57bf 100644 --- a/docs/getting-started/index.md +++ b/docs/getting-started/index.md @@ -3,8 +3,9 @@ Let's get started with Chart.js! * **[Follow a step-by-step guide](./usage) to get up to speed with Chart.js** -* [Install Chart.js](./installation) from npm or a CDN +* [Install Chart.js](./installation) from npm or a CDN * [Integrate Chart.js](./integration) with bundlers, loaders, and front-end frameworks +* [Use Chart.js from Node.js](./using-from-node-js) Alternatively, see the example below or check [samples](../samples). @@ -63,7 +64,7 @@ Now that we have a canvas, we can include Chart.js from a CDN. ``` -Finally, we can create a chart. We add a script that acquires the `myChart` canvas element and instantiates `new Chart` with desired configuration: `bar` chart type, labels, data points, and options. +Finally, we can create a chart. We add a script that acquires the `myChart` canvas element and instantiates `new Chart` with desired configuration: `bar` chart type, labels, data points, and options. ```html ``` -You can see all the ways to use Chart.js in the [step-by-step guide](./usage). \ No newline at end of file +You can see all the ways to use Chart.js in the [step-by-step guide](./usage). diff --git a/docs/getting-started/using-from-node-js.md b/docs/getting-started/using-from-node-js.md new file mode 100644 index 00000000000..90d8959a7be --- /dev/null +++ b/docs/getting-started/using-from-node-js.md @@ -0,0 +1,38 @@ +# Using from Node.js + +You can use Chart.js in Node.js for server-side generation of plots with help from an NPM package such as [node-canvas](https://github.com/Automattic/node-canvas) or [skia-canvas](https://skia-canvas.org/). + +Sample usage: + +```js +import {CategoryScale, Chart, LinearScale, LineController, LineElement, PointElement} from 'chart.js'; +import {Canvas} from 'skia-canvas'; +import fsp from 'node:fs/promises'; + +Chart.register([ + CategoryScale, + LineController, + LineElement, + LinearScale, + PointElement +]); + +const canvas = new Canvas(400, 300); +const chart = new Chart( + canvas, // TypeScript needs "as any" here + { + type: 'line', + data: { + labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'], + datasets: [{ + label: '# of Votes', + data: [12, 19, 3, 5, 2, 3], + borderColor: 'red' + }] + } + } +); +const pngBuffer = await canvas.toBuffer('png', {matte: 'white'}); +await fsp.writeFile('output.png', pngBuffer); +chart.destroy(); +``` From 3dffb4fb8ebb529c0447d0ed6aa7e08479a591ed Mon Sep 17 00:00:00 2001 From: Adrian Cerbaro Date: Mon, 14 Apr 2025 10:41:14 -0300 Subject: [PATCH 03/16] fix: respect dataset clipping area when filling line charts (#12057) * fix(plugin.filler): respect dataset clipping area when filling line charts The filling area must respect the dataset's clipping area when clipping is enabled. Before this change, the line would be clipped according to the dataset's area but the fill would overlap other datasets. Closes #12052 * chore(plugin.filler): use @ts-expect-error instead of @ts-ignore --- src/core/core.controller.js | 36 ++------ src/helpers/helpers.dataset.ts | 33 ++++++++ src/helpers/index.ts | 1 + src/plugins/plugin.filler/filler.drawing.js | 49 ++++++++--- src/types/index.d.ts | 10 +++ .../line/dataset/clip-bounds-x-off.js | 78 ++++++++++++++++++ .../line/dataset/clip-bounds-x-off.png | Bin 0 -> 37985 bytes .../line/dataset/clip-bounds-x.js | 77 +++++++++++++++++ .../line/dataset/clip-bounds-x.png | Bin 0 -> 31501 bytes .../line/dataset/clip-bounds-y-off.js | 77 +++++++++++++++++ .../line/dataset/clip-bounds-y-off.png | Bin 0 -> 36728 bytes .../line/dataset/clip-bounds-y.js | 76 +++++++++++++++++ .../line/dataset/clip-bounds-y.png | Bin 0 -> 30206 bytes 13 files changed, 395 insertions(+), 42 deletions(-) create mode 100644 src/helpers/helpers.dataset.ts create mode 100644 test/fixtures/plugin.filler/line/dataset/clip-bounds-x-off.js create mode 100644 test/fixtures/plugin.filler/line/dataset/clip-bounds-x-off.png create mode 100644 test/fixtures/plugin.filler/line/dataset/clip-bounds-x.js create mode 100644 test/fixtures/plugin.filler/line/dataset/clip-bounds-x.png create mode 100644 test/fixtures/plugin.filler/line/dataset/clip-bounds-y-off.js create mode 100644 test/fixtures/plugin.filler/line/dataset/clip-bounds-y-off.png create mode 100644 test/fixtures/plugin.filler/line/dataset/clip-bounds-y.js create mode 100644 test/fixtures/plugin.filler/line/dataset/clip-bounds-y.png diff --git a/src/core/core.controller.js b/src/core/core.controller.js index 47b238da8aa..e0408ae212a 100644 --- a/src/core/core.controller.js +++ b/src/core/core.controller.js @@ -6,9 +6,8 @@ import {_detectPlatform} from '../platform/index.js'; import PluginService from './core.plugins.js'; import registry from './core.registry.js'; import Config, {determineAxis, getIndexAxis} from './core.config.js'; -import {retinaScale, _isDomSupported} from '../helpers/helpers.dom.js'; import {each, callback as callCallback, uid, valueOrDefault, _elementsEqual, isNullOrUndef, setsEqual, defined, isFunction, _isClickEvent} from '../helpers/helpers.core.js'; -import {clearCanvas, clipArea, createContext, unclipArea, _isPointInArea} from '../helpers/index.js'; +import {clearCanvas, clipArea, createContext, unclipArea, _isPointInArea, _isDomSupported, retinaScale, getDatasetClipArea} from '../helpers/index.js'; // @ts-ignore import {version} from '../../package.json'; import {debounce} from '../helpers/helpers.extras.js'; @@ -101,23 +100,6 @@ function determineLastEvent(e, lastEvent, inChartArea, isClick) { return e; } -function getSizeForArea(scale, chartArea, field) { - return scale.options.clip ? scale[field] : chartArea[field]; -} - -function getDatasetArea(meta, chartArea) { - const {xScale, yScale} = meta; - if (xScale && yScale) { - return { - left: getSizeForArea(xScale, chartArea, 'left'), - right: getSizeForArea(xScale, chartArea, 'right'), - top: getSizeForArea(yScale, chartArea, 'top'), - bottom: getSizeForArea(yScale, chartArea, 'bottom') - }; - } - return chartArea; -} - class Chart { static defaults = defaults; @@ -800,31 +782,25 @@ class Chart { */ _drawDataset(meta) { const ctx = this.ctx; - const clip = meta._clip; - const useClip = !clip.disabled; - const area = getDatasetArea(meta, this.chartArea); const args = { meta, index: meta.index, cancelable: true }; + // @ts-expect-error + const clip = getDatasetClipArea(this, meta); if (this.notifyPlugins('beforeDatasetDraw', args) === false) { return; } - if (useClip) { - clipArea(ctx, { - left: clip.left === false ? 0 : area.left - clip.left, - right: clip.right === false ? this.width : area.right + clip.right, - top: clip.top === false ? 0 : area.top - clip.top, - bottom: clip.bottom === false ? this.height : area.bottom + clip.bottom - }); + if (clip) { + clipArea(ctx, clip); } meta.controller.draw(); - if (useClip) { + if (clip) { unclipArea(ctx); } diff --git a/src/helpers/helpers.dataset.ts b/src/helpers/helpers.dataset.ts new file mode 100644 index 00000000000..000dcfe1977 --- /dev/null +++ b/src/helpers/helpers.dataset.ts @@ -0,0 +1,33 @@ +import type {Chart, ChartArea, ChartMeta, Scale, TRBL} from '../types/index.js'; + +function getSizeForArea(scale: Scale, chartArea: ChartArea, field: keyof ChartArea) { + return scale.options.clip ? scale[field] : chartArea[field]; +} + +function getDatasetArea(meta: ChartMeta, chartArea: ChartArea): TRBL { + const {xScale, yScale} = meta; + if (xScale && yScale) { + return { + left: getSizeForArea(xScale, chartArea, 'left'), + right: getSizeForArea(xScale, chartArea, 'right'), + top: getSizeForArea(yScale, chartArea, 'top'), + bottom: getSizeForArea(yScale, chartArea, 'bottom') + }; + } + return chartArea; +} + +export function getDatasetClipArea(chart: Chart, meta: ChartMeta): TRBL | false { + const clip = meta._clip; + if (clip.disabled) { + return false; + } + const area = getDatasetArea(meta, chart.chartArea); + + return { + left: clip.left === false ? 0 : area.left - (clip.left === true ? 0 : clip.left), + right: clip.right === false ? chart.width : area.right + (clip.right === true ? 0 : clip.right), + top: clip.top === false ? 0 : area.top - (clip.top === true ? 0 : clip.top), + bottom: clip.bottom === false ? chart.height : area.bottom + (clip.bottom === true ? 0 : clip.bottom) + }; +} diff --git a/src/helpers/index.ts b/src/helpers/index.ts index 1917ce740a1..9fde7b85951 100644 --- a/src/helpers/index.ts +++ b/src/helpers/index.ts @@ -13,3 +13,4 @@ export * from './helpers.options.js'; export * from './helpers.math.js'; export * from './helpers.rtl.js'; export * from './helpers.segment.js'; +export * from './helpers.dataset.js'; diff --git a/src/plugins/plugin.filler/filler.drawing.js b/src/plugins/plugin.filler/filler.drawing.js index 2e2fbd2b99e..9abb513cff0 100644 --- a/src/plugins/plugin.filler/filler.drawing.js +++ b/src/plugins/plugin.filler/filler.drawing.js @@ -1,35 +1,37 @@ -import {clipArea, unclipArea} from '../../helpers/index.js'; +import {clipArea, unclipArea, getDatasetClipArea} from '../../helpers/index.js'; import {_findSegmentEnd, _getBounds, _segments} from './filler.segment.js'; import {_getTarget} from './filler.target.js'; export function _drawfill(ctx, source, area) { const target = _getTarget(source); - const {line, scale, axis} = source; + const {chart, index, line, scale, axis} = source; const lineOpts = line.options; const fillOption = lineOpts.fill; const color = lineOpts.backgroundColor; const {above = color, below = color} = fillOption || {}; + const meta = chart.getDatasetMeta(index); + const clip = getDatasetClipArea(chart, meta); if (target && line.points.length) { clipArea(ctx, area); - doFill(ctx, {line, target, above, below, area, scale, axis}); + doFill(ctx, {line, target, above, below, area, scale, axis, clip}); unclipArea(ctx); } } function doFill(ctx, cfg) { - const {line, target, above, below, area, scale} = cfg; + const {line, target, above, below, area, scale, clip} = cfg; const property = line._loop ? 'angle' : cfg.axis; ctx.save(); if (property === 'x' && below !== above) { clipVertical(ctx, target, area.top); - fill(ctx, {line, target, color: above, scale, property}); + fill(ctx, {line, target, color: above, scale, property, clip}); ctx.restore(); ctx.save(); clipVertical(ctx, target, area.bottom); } - fill(ctx, {line, target, color: below, scale, property}); + fill(ctx, {line, target, color: below, scale, property, clip}); ctx.restore(); } @@ -65,7 +67,7 @@ function clipVertical(ctx, target, clipY) { } function fill(ctx, cfg) { - const {line, target, property, color, scale} = cfg; + const {line, target, property, color, scale, clip} = cfg; const segments = _segments(line, target, property); for (const {source: src, target: tgt, start, end} of segments) { @@ -75,7 +77,7 @@ function fill(ctx, cfg) { ctx.save(); ctx.fillStyle = backgroundColor; - clipBounds(ctx, scale, notShape && _getBounds(property, start, end)); + clipBounds(ctx, scale, clip, notShape && _getBounds(property, start, end)); ctx.beginPath(); @@ -103,12 +105,35 @@ function fill(ctx, cfg) { } } -function clipBounds(ctx, scale, bounds) { - const {top, bottom} = scale.chart.chartArea; +function clipBounds(ctx, scale, clip, bounds) { + const chartArea = scale.chart.chartArea; const {property, start, end} = bounds || {}; - if (property === 'x') { + + if (property === 'x' || property === 'y') { + let left, top, right, bottom; + + if (property === 'x') { + left = start; + top = chartArea.top; + right = end; + bottom = chartArea.bottom; + } else { + left = chartArea.left; + top = start; + right = chartArea.right; + bottom = end; + } + ctx.beginPath(); - ctx.rect(start, top, end - start, bottom - top); + + if (clip) { + left = Math.max(left, clip.left); + right = Math.min(right, clip.right); + top = Math.max(top, clip.top); + bottom = Math.min(bottom, clip.bottom); + } + + ctx.rect(left, top, right - left, bottom - top); ctx.clip(); } } diff --git a/src/types/index.d.ts b/src/types/index.d.ts index 14461328a92..807fe820879 100644 --- a/src/types/index.d.ts +++ b/src/types/index.d.ts @@ -429,6 +429,15 @@ export declare const RadarController: ChartComponent & { prototype: RadarController; new (chart: Chart, datasetIndex: number): RadarController; }; + +interface ChartMetaClip { + left: number | boolean; + top: number | boolean; + right: number | boolean; + bottom: number | boolean; + disabled: boolean; +} + interface ChartMetaCommon { type: string; controller: DatasetController; @@ -462,6 +471,7 @@ interface ChartMetaCommon v - 10), + fill: '1', + borderColor: 'rgb(255, 0, 0)', + backgroundColor: 'rgba(255, 0, 0, 0.25)', + xAxisID: 'x1', + }, + { + data: values, + fill: false, + borderColor: 'rgb(255, 0, 0)', + xAxisID: 'x1', + }, + { + data: values, + fill: false, + borderColor: 'rgb(0, 0, 255)', + xAxisID: 'x2', + }, + { + data: values.map(v => v + 10), + fill: '-1', + borderColor: 'rgb(0, 0, 255)', + backgroundColor: 'rgba(0, 0, 255, 0.25)', + xAxisID: 'x2', + } + ] + }, + options: { + clip: false, + indexAxis: 'y', + animation: false, + responsive: false, + plugins: { + legend: false, + title: false, + tooltip: false + }, + elements: { + point: { + radius: 0 + }, + line: { + cubicInterpolationMode: 'monotone', + borderColor: 'transparent', + tension: 0 + } + }, + scales: { + x2: { + axis: 'x', + stack: 'stack', + max: 80, + display: false, + }, + x1: { + min: 50, + axis: 'x', + stack: 'stack', + display: false, + }, + y: { + display: false, + } + } + } + }, +}; diff --git a/test/fixtures/plugin.filler/line/dataset/clip-bounds-x-off.png b/test/fixtures/plugin.filler/line/dataset/clip-bounds-x-off.png new file mode 100644 index 0000000000000000000000000000000000000000..f050a4759f3f09f467c6f78b649d734e15074e4d GIT binary patch literal 37985 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/plugin.filler/line/dataset/clip-bounds-x.js b/test/fixtures/plugin.filler/line/dataset/clip-bounds-x.js new file mode 100644 index 00000000000..0ba25ac3122 --- /dev/null +++ b/test/fixtures/plugin.filler/line/dataset/clip-bounds-x.js @@ -0,0 +1,77 @@ +const labels = [1, 2, 3, 4, 5, 6, 7]; +const values = [65, 59, 80, 81, 56, 55, 40]; + +module.exports = { + description: 'https://github.com/chartjs/Chart.js/issues/12052', + config: { + type: 'line', + data: { + labels, + datasets: [ + { + data: values.map(v => v - 10), + fill: '1', + borderColor: 'rgb(255, 0, 0)', + backgroundColor: 'rgba(255, 0, 0, 0.25)', + xAxisID: 'x1', + }, + { + data: values, + fill: false, + borderColor: 'rgb(255, 0, 0)', + xAxisID: 'x1', + }, + { + data: values, + fill: false, + borderColor: 'rgb(0, 0, 255)', + xAxisID: 'x2', + }, + { + data: values.map(v => v + 10), + fill: '-1', + borderColor: 'rgb(0, 0, 255)', + backgroundColor: 'rgba(0, 0, 255, 0.25)', + xAxisID: 'x2', + } + ] + }, + options: { + indexAxis: 'y', + animation: false, + responsive: false, + plugins: { + legend: false, + title: false, + tooltip: false + }, + elements: { + point: { + radius: 0 + }, + line: { + cubicInterpolationMode: 'monotone', + borderColor: 'transparent', + tension: 0 + } + }, + scales: { + x2: { + axis: 'x', + stack: 'stack', + max: 80, + display: false, + }, + x1: { + min: 50, + axis: 'x', + stack: 'stack', + display: false, + }, + y: { + display: false, + } + } + } + }, +}; diff --git a/test/fixtures/plugin.filler/line/dataset/clip-bounds-x.png b/test/fixtures/plugin.filler/line/dataset/clip-bounds-x.png new file mode 100644 index 0000000000000000000000000000000000000000..4f1dfdd6cab0f1f18755ef07ef42b94423cee99d GIT binary patch literal 31501 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/plugin.filler/line/dataset/clip-bounds-y-off.js b/test/fixtures/plugin.filler/line/dataset/clip-bounds-y-off.js new file mode 100644 index 00000000000..16a9759bb7d --- /dev/null +++ b/test/fixtures/plugin.filler/line/dataset/clip-bounds-y-off.js @@ -0,0 +1,77 @@ +const labels = [1, 2, 3, 4, 5, 6, 7]; +const values = [65, 59, 80, 81, 56, 55, 40]; + +module.exports = { + description: 'https://github.com/chartjs/Chart.js/issues/12052', + config: { + type: 'line', + data: { + labels, + datasets: [ + { + data: values.map(v => v - 10), + fill: '1', + borderColor: 'rgb(255, 0, 0)', + backgroundColor: 'rgba(255, 0, 0, 0.25)', + yAxisID: 'y1', + }, + { + data: values, + fill: false, + borderColor: 'rgb(255, 0, 0)', + yAxisID: 'y1', + }, + { + data: values, + fill: false, + borderColor: 'rgb(0, 0, 255)', + yAxisID: 'y2', + }, + { + data: values.map(v => v + 10), + fill: '-1', + borderColor: 'rgb(0, 0, 255)', + backgroundColor: 'rgba(0, 0, 255, 0.25)', + yAxisID: 'y2', + } + ] + }, + options: { + clip: false, + animation: false, + responsive: false, + plugins: { + legend: false, + title: false, + tooltip: false + }, + elements: { + point: { + radius: 0 + }, + line: { + cubicInterpolationMode: 'monotone', + borderColor: 'transparent', + tension: 0 + } + }, + scales: { + y2: { + axis: 'y', + stack: 'stack', + max: 80, + display: false, + }, + y1: { + min: 50, + axis: 'y', + stack: 'stack', + display: false, + }, + x: { + display: false, + } + } + } + }, +}; diff --git a/test/fixtures/plugin.filler/line/dataset/clip-bounds-y-off.png b/test/fixtures/plugin.filler/line/dataset/clip-bounds-y-off.png new file mode 100644 index 0000000000000000000000000000000000000000..a2b8766f84d62af6ae178d1b46c2fb7f5b389b72 GIT binary patch literal 36728 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�%WORc5YGPl= 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 J=LkXG{{UVs{fqzr literal 0 HcmV?d00001 diff --git a/test/fixtures/plugin.filler/line/dataset/clip-bounds-y.js b/test/fixtures/plugin.filler/line/dataset/clip-bounds-y.js new file mode 100644 index 00000000000..cbfc6d40381 --- /dev/null +++ b/test/fixtures/plugin.filler/line/dataset/clip-bounds-y.js @@ -0,0 +1,76 @@ +const labels = [1, 2, 3, 4, 5, 6, 7]; +const values = [65, 59, 80, 81, 56, 55, 40]; + +module.exports = { + description: 'https://github.com/chartjs/Chart.js/issues/12052', + config: { + type: 'line', + data: { + labels, + datasets: [ + { + data: values.map(v => v - 10), + fill: '1', + borderColor: 'rgb(255, 0, 0)', + backgroundColor: 'rgba(255, 0, 0, 0.25)', + yAxisID: 'y1', + }, + { + data: values, + fill: false, + borderColor: 'rgb(255, 0, 0)', + yAxisID: 'y1', + }, + { + data: values, + fill: false, + borderColor: 'rgb(0, 0, 255)', + yAxisID: 'y2', + }, + { + data: values.map(v => v + 10), + fill: '-1', + borderColor: 'rgb(0, 0, 255)', + backgroundColor: 'rgba(0, 0, 255, 0.25)', + yAxisID: 'y2', + } + ] + }, + options: { + animation: false, + responsive: false, + plugins: { + legend: false, + title: false, + tooltip: false + }, + elements: { + point: { + radius: 0 + }, + line: { + cubicInterpolationMode: 'monotone', + borderColor: 'transparent', + tension: 0 + } + }, + scales: { + y2: { + axis: 'y', + stack: 'stack', + max: 80, + display: false, + }, + y1: { + min: 50, + axis: 'y', + stack: 'stack', + display: false, + }, + x: { + display: false, + } + } + } + }, +}; diff --git a/test/fixtures/plugin.filler/line/dataset/clip-bounds-y.png b/test/fixtures/plugin.filler/line/dataset/clip-bounds-y.png new file mode 100644 index 0000000000000000000000000000000000000000..137e0315bb205506a6145e2461615ce3870d2c60 GIT binary patch literal 30206 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 XndPRLaI=nX0Q}R@GSI9#j}QMpLs*Zu literal 0 HcmV?d00001 From 817bec0439b0e0666687deef2aefc435ff9710db Mon Sep 17 00:00:00 2001 From: Jacco van den Berg Date: Tue, 15 Apr 2025 15:19:05 +0200 Subject: [PATCH 04/16] Bump version to 4.4.9 (#12062) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 81e031b56d0..c76c9c5c6d4 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "chart.js", "homepage": "https://www.chartjs.org", "description": "Simple HTML5 charts using the canvas element.", - "version": "4.4.8", + "version": "4.4.9", "license": "MIT", "type": "module", "sideEffects": [ From 9b1306ab0a397ac51a256255770da99f2543afcf Mon Sep 17 00:00:00 2001 From: FabTechAT Date: Tue, 15 Apr 2025 15:31:58 +0200 Subject: [PATCH 05/16] feature: make above/below colors in filler plugin work with pivoted line charts (#12058) * adapted filler plugin to make above/below colors work with pivoted line charts resolved conflicts in src/plugins/plugin.filler/filler.drawing.js * fixed doFill; added tests --- src/plugins/plugin.filler/filler.drawing.js | 54 +++++++++++++++--- .../line/above-below-vertical-linechart.js | 46 +++++++++++++++ .../line/above-below-vertical-linechart.png | Bin 0 -> 52026 bytes 3 files changed, 93 insertions(+), 7 deletions(-) create mode 100644 test/fixtures/plugin.filler/line/above-below-vertical-linechart.js create mode 100644 test/fixtures/plugin.filler/line/above-below-vertical-linechart.png diff --git a/src/plugins/plugin.filler/filler.drawing.js b/src/plugins/plugin.filler/filler.drawing.js index 9abb513cff0..0a718355da8 100644 --- a/src/plugins/plugin.filler/filler.drawing.js +++ b/src/plugins/plugin.filler/filler.drawing.js @@ -24,14 +24,24 @@ function doFill(ctx, cfg) { ctx.save(); - if (property === 'x' && below !== above) { - clipVertical(ctx, target, area.top); - fill(ctx, {line, target, color: above, scale, property, clip}); - ctx.restore(); - ctx.save(); - clipVertical(ctx, target, area.bottom); + let fillColor = below; + if (below !== above) { + if (property === 'x') { + clipVertical(ctx, target, area.top); + fill(ctx, {line, target, color: above, scale, property, clip}); + ctx.restore(); + ctx.save(); + clipVertical(ctx, target, area.bottom); + } else if (property === 'y') { + clipHorizontal(ctx, target, area.left); + fill(ctx, {line, target, color: below, scale, property, clip}); + ctx.restore(); + ctx.save(); + clipHorizontal(ctx, target, area.right); + fillColor = above; + } } - fill(ctx, {line, target, color: below, scale, property, clip}); + fill(ctx, {line, target, color: fillColor, scale, property, clip}); ctx.restore(); } @@ -66,6 +76,36 @@ function clipVertical(ctx, target, clipY) { ctx.clip(); } +function clipHorizontal(ctx, target, clipX) { + const {segments, points} = target; + let first = true; + let lineLoop = false; + + ctx.beginPath(); + for (const segment of segments) { + const {start, end} = segment; + const firstPoint = points[start]; + const lastPoint = points[_findSegmentEnd(start, end, points)]; + if (first) { + ctx.moveTo(firstPoint.x, firstPoint.y); + first = false; + } else { + ctx.lineTo(clipX, firstPoint.y); + ctx.lineTo(firstPoint.x, firstPoint.y); + } + lineLoop = !!target.pathSegment(ctx, segment, {move: lineLoop}); + if (lineLoop) { + ctx.closePath(); + } else { + ctx.lineTo(clipX, lastPoint.y); + } + } + + ctx.lineTo(clipX, target.first().y); + ctx.closePath(); + ctx.clip(); +} + function fill(ctx, cfg) { const {line, target, property, color, scale, clip} = cfg; const segments = _segments(line, target, property); diff --git a/test/fixtures/plugin.filler/line/above-below-vertical-linechart.js b/test/fixtures/plugin.filler/line/above-below-vertical-linechart.js new file mode 100644 index 00000000000..82ada178f01 --- /dev/null +++ b/test/fixtures/plugin.filler/line/above-below-vertical-linechart.js @@ -0,0 +1,46 @@ +module.exports = { + config: { + type: 'line', + data: { + labels: [1, 2, 3, 4], + datasets: [ + { + data: [200, 400, 200, 400], + cubicInterpolationMode: 'monotone', + tension: 0.4, + spanGaps: true, + borderColor: 'blue', + pointRadius: 0, + fill: { + target: 1, + below: 'rgba(255, 0, 0, 0.4)', + above: 'rgba(53, 221, 53, 0.4)', + } + }, + { + data: [400, 200, 400, 200], + cubicInterpolationMode: 'monotone', + tension: 0.4, + spanGaps: true, + borderColor: 'orange', + pointRadius: 0, + }, + ] + }, + options: { + indexAxis: 'y', + // maintainAspectRatio: false, + plugins: { + filler: { + propagate: false + }, + datalabels: { + display: false + }, + legend: { + display: false + }, + } + } + } +}; diff --git a/test/fixtures/plugin.filler/line/above-below-vertical-linechart.png b/test/fixtures/plugin.filler/line/above-below-vertical-linechart.png new file mode 100644 index 0000000000000000000000000000000000000000..2052737e792ea1e9e01d95c2ec55b27eb9accf12 GIT binary patch literal 52026 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 literal 0 HcmV?d00001 From 74961d1c868e47429fc1206679f0c9ba09b75ab5 Mon Sep 17 00:00:00 2001 From: Pierre <73789471+R2Jeu-prive@users.noreply.github.com> Date: Tue, 15 Apr 2025 15:32:13 +0200 Subject: [PATCH 06/16] Add selfJoin option for doughnut graphs (#12054) Co-authored-by: Pierre Gueguen --- src/elements/element.arc.ts | 42 +++++++++++++++++- src/types/index.d.ts | 6 +++ .../controller.doughnut/selfJoin/doughnut.js | 25 +++++++++++ .../controller.doughnut/selfJoin/doughnut.png | Bin 0 -> 14751 bytes .../controller.doughnut/selfJoin/pie.js | 26 +++++++++++ .../controller.doughnut/selfJoin/pie.png | Bin 0 -> 11313 bytes 6 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 test/fixtures/controller.doughnut/selfJoin/doughnut.js create mode 100644 test/fixtures/controller.doughnut/selfJoin/doughnut.png create mode 100644 test/fixtures/controller.doughnut/selfJoin/pie.js create mode 100644 test/fixtures/controller.doughnut/selfJoin/pie.png diff --git a/src/elements/element.arc.ts b/src/elements/element.arc.ts index e2bd26f523b..42f41f045b0 100644 --- a/src/elements/element.arc.ts +++ b/src/elements/element.arc.ts @@ -1,9 +1,42 @@ import Element from '../core/core.element.js'; import {_angleBetween, getAngleFromPoint, TAU, HALF_PI, valueOrDefault} from '../helpers/index.js'; -import {PI, _isBetween, _limitValue} from '../helpers/helpers.math.js'; +import {PI, _angleDiff, _normalizeAngle, _isBetween, _limitValue} from '../helpers/helpers.math.js'; import {_readValueToProps} from '../helpers/helpers.options.js'; import type {ArcOptions, Point} from '../types/index.js'; +function clipSelf(ctx: CanvasRenderingContext2D, element: ArcElement, endAngle: number) { + const {startAngle, x, y, outerRadius, innerRadius, options} = element; + const {borderWidth, borderJoinStyle} = options; + const outerAngleClip = Math.min(borderWidth / outerRadius, _normalizeAngle(startAngle - endAngle)); + ctx.beginPath(); + ctx.arc(x, y, outerRadius - borderWidth / 2, startAngle + outerAngleClip / 2, endAngle - outerAngleClip / 2); + + if (innerRadius > 0) { + const innerAngleClip = Math.min(borderWidth / innerRadius, _normalizeAngle(startAngle - endAngle)); + ctx.arc(x, y, innerRadius + borderWidth / 2, endAngle - innerAngleClip / 2, startAngle + innerAngleClip / 2, true); + } else { + const clipWidth = Math.min(borderWidth / 2, outerRadius * _normalizeAngle(startAngle - endAngle)); + + if (borderJoinStyle === 'round') { + ctx.arc(x, y, clipWidth, endAngle - PI / 2, startAngle + PI / 2, true); + } else if (borderJoinStyle === 'bevel') { + const r = 2 * clipWidth * clipWidth; + const endX = -r * Math.cos(endAngle + PI / 2) + x; + const endY = -r * Math.sin(endAngle + PI / 2) + y; + const startX = r * Math.cos(startAngle + PI / 2) + x; + const startY = r * Math.sin(startAngle + PI / 2) + y; + ctx.lineTo(endX, endY); + ctx.lineTo(startX, startY); + } + } + ctx.closePath(); + + ctx.moveTo(0, 0); + ctx.rect(0, 0, ctx.canvas.width, ctx.canvas.height); + + ctx.clip('evenodd'); +} + function clipArc(ctx: CanvasRenderingContext2D, element: ArcElement, endAngle: number) { const {startAngle, pixelMargin, x, y, outerRadius, innerRadius} = element; @@ -213,7 +246,7 @@ function drawBorder( circular: boolean, ) { const {fullCircles, startAngle, circumference, options} = element; - const {borderWidth, borderJoinStyle, borderDash, borderDashOffset} = options; + const {borderWidth, borderJoinStyle, borderDash, borderDashOffset, borderRadius} = options; const inner = options.borderAlign === 'inner'; if (!borderWidth) { @@ -246,6 +279,10 @@ function drawBorder( clipArc(ctx, element, endAngle); } + if (options.selfJoin && endAngle - startAngle >= PI && borderRadius === 0 && borderJoinStyle !== 'miter') { + clipSelf(ctx, element, endAngle); + } + if (!fullCircles) { pathArc(ctx, element, offset, spacing, endAngle, circular); ctx.stroke(); @@ -276,6 +313,7 @@ export default class ArcElement extends Element { spacing: 0, angle: undefined, circular: true, + selfJoin: false, }; static defaultRoutes = { diff --git a/src/types/index.d.ts b/src/types/index.d.ts index 807fe820879..175336ec793 100644 --- a/src/types/index.d.ts +++ b/src/types/index.d.ts @@ -1847,6 +1847,12 @@ export interface ArcBorderRadius { } export interface ArcOptions extends CommonElementOptions { + /** + * If true, Arc can take up 100% of a circular graph without any visual split or cut. This option doesn't support borderRadius and borderJoinStyle miter + * @default true + */ + selfJoin: boolean; + /** * Arc stroke alignment. */ diff --git a/test/fixtures/controller.doughnut/selfJoin/doughnut.js b/test/fixtures/controller.doughnut/selfJoin/doughnut.js new file mode 100644 index 00000000000..f29939cec2a --- /dev/null +++ b/test/fixtures/controller.doughnut/selfJoin/doughnut.js @@ -0,0 +1,25 @@ +module.exports = { + config: { + type: 'doughnut', + data: { + labels: ['Red'], + datasets: [ + { + // option in dataset + data: [100], + borderWidth: 15, + backgroundColor: '#FF0000', + borderColor: '#000000', + borderAlign: 'center', + selfJoin: true + } + ] + } + }, + options: { + canvas: { + height: 256, + width: 512 + } + } +}; diff --git a/test/fixtures/controller.doughnut/selfJoin/doughnut.png b/test/fixtures/controller.doughnut/selfJoin/doughnut.png new file mode 100644 index 0000000000000000000000000000000000000000..af2d4b438736b45f0b08649e41050d3a17cb5da4 GIT binary patch literal 14751 zcmY*=cRbbc+xPbz2M6Jp*?aGiy_IZFQ0Mk>-t>R`x~dPr%p^rM+g7_v8Kj70|0=6zd`^w9{A&X%8�FK+{N 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/controller.doughnut/selfJoin/pie.js b/test/fixtures/controller.doughnut/selfJoin/pie.js new file mode 100644 index 00000000000..d0187db0917 --- /dev/null +++ b/test/fixtures/controller.doughnut/selfJoin/pie.js @@ -0,0 +1,26 @@ +module.exports = { + config: { + type: 'pie', + data: { + labels: ['Red'], + datasets: [ + { + // option in dataset + data: [100], + borderWidth: 15, + backgroundColor: '#FF0000', + borderColor: '#000000', + borderAlign: 'center', + borderJoinStyle: 'round', + selfJoin: true + } + ] + } + }, + options: { + canvas: { + height: 256, + width: 512 + } + } +}; diff --git a/test/fixtures/controller.doughnut/selfJoin/pie.png b/test/fixtures/controller.doughnut/selfJoin/pie.png new file mode 100644 index 0000000000000000000000000000000000000000..17a2e3b195132b5cc05f35a951c352acd0b9b0aa GIT binary patch literal 11313 zcmY*XHGXXMCU z5wgecKJ|HjfA9BSc)0HCb-kX~bv>_f-?7GqT2yCP&p;p$DjjVNQwRhAe}zKeWZ;kX zlpc5DUw)=qYLK!X_9X~}8=|A3dNtT?Et9;#Rr66tWEbu}PXUh(E#uP{j|#a}ZD9=8 z&kMroHRzy>8qBj(j>-UFcF?JmoHVh!!;YL3@5-c4tbS#D{aedt!WYVFG#b zJAD1k;)|lPgWrw2!^)Gkzqu^+@vwA5f-U|-t30L>zn#}ieO&)M4xbHViJWAy&6%H; zMTWBMDf(Lf8uJg_nSv?k5mXe|8cAd^ZgiHA;Dr>?gV@v35!KE<7u2cpugEDy?Em4nLJpcH!E5gbm?JG2ERmKJmVjl`O>&9EAQE3*UwPjL*(@%(HzoN~V$n#nKDYNr z7(HCrI&8WeT0)(mS7Gix^h@&`&IJ{zODoLp0Fay`z#LEnWv>FnqMn`o&Ve;mS_9LR zw4f2tD*70z%(tgL0+F*rvYdwsK%(;3E8l1kc=7Z2XgsCundW56Y-j|@3(6OhF4uu;hLs|Z%$4c8Zj#X3aOY`ugYL{p&8Ls zKGu-xKsL>~MJ}iz)KCOVQFXSC2e~K#9%!2t-jNlL7it$h?ndABJ6oGchnTo_p2Uj3 zp(g>v_y>r_Lw9!rQMXXk!t`N|69JzMO2N-(4?OE4P{0=^W-&7Ac*i=zq zFIHj+#$h?fE+7l(K)a;VDc^wq(gQ*nGY)Pp;WAkt;Su-~yvV#Wz%NF$yhT#q!3AK0 zghtygtgsm8A#7;V&mD6!*z^~-!}J~CL=g^s2UDPnM1{;kCe4DbfoxQK&}GlBIQNbi ze+mkZKmkg{b#Ztl{4Ux^MqEf5X}o|-jmwN3fcQYO1Vi?Uws9we6v01MyfksijK`7Y z(MFNWhsD=^BQ1XCKEp7#&68)g9`gF$sE*&`vKC${EUj#ZDHwo?3ks&*F~eFc!Y(Wx zR@UWGx_YBD$p_E*PHz-C_56qrp*2(?FI4Nb&Dng^Gh@q<&St}qq+K{;)UCPS9Tb1R ze7Hn~e=op4z}cbe2Zg=;iSzQ}Ed26YE3bF0XXIWB{mIk7p;S z>SVGB3Zc0myV3QHH7Dn3i0$z0cgfHo%06-$Z{Q`pFJLTW$HpZFRbC!3o9~SD5+w`c z*fYNU^cJ3-RsLwkQRRcYro=}5I}Kb6GMhAs>&ph`5O_DxNSl_r%PfGx^2wGlnZ=u< zi>c)dw)ZBGa-xBZJ1Qk|RgXsQ7!4be)`{o}ZRZo>^>GN;3y72>cGX!0R#X2|-ytXB zscG5J%!A|iU+X#0OQw|9gW_QRAt=S)HTk&;Fvd76P;;K3dyi3V*LaR-=_PyXaxD7h zZt>4hJ_*m;SYxf-S7k05G!l>S7ah$yZnS?>7Gb<9_=b^&SBSk|{W(e=Jn?DUkVP>c zZYEp+STPr09gnxqS*D+rHD>&v#Who#dw|PonXt{gs8CZOZ+!cwi7lG*H5=?`e<<

Q0Zb{8`W9P+^<9!Lk<*{ znj=!|;U&gy+X}7aZBt0=d8|Cv`$Jwn?6rB<0$NQqNM0~s*esQZXPr z+sDEBh>wq>D)vKY`{q$16fdl^6i;EpR5TnXSHIKNc>zn{P4Xpc9^65cm_NNQ`ZB9E zkX{H{;h&7ghSUffKUSjfg4>ur4$qLrxPb6JrW-@W!nXHIs#?BjwujYtdhV=Zy(@HJ zoK!}D1=&yG-W#bjC+2tOy}$iKy4`mWtCZ{}A8BvW6^3kH9=k?1Isa|&k?N$E*0Y7C zGmKb|7NrjF#!1kSn$U<0*2(Xhk(sL}D{_`g?Icy9-cjbX#^LsvGZ%FR1vk-;y~axr z8g#w@?SpPzKKeeI?d-X_Ru*4r+&O>=$&!eUJ8Wg%vzC8YCpvcZne(KD0nP}t`v5lI zrN_5HN04pQ+5>z+3JGugTsM%FMDY{KZeqlmn{lPy?iFe+ zF4Ajr7LPXA2dNO0O4qb-lRXFpAJ2skx%}yqJP>weRpO2 zCOvM_gCFw-%?Hg~>Jl^}DF$R+Yi^kF_sN3#!+ERK+yDv&fz7Jgt;}M}woJb2Jed&# zplCU7Y#^jtut>LrdSKV(&jZZF2c|dMpCcAoS~_crzxXg+Z(bxX55zDbKWP#gE970T z6V@9k4J-V#Orp8{Zao^&vGx=NpIXZtZ_<*fv)me4xXE-kGPtZL&&JHX(v6p2>;mRl z{JGQT%3m$SN7?eHg!3Ez?s`WSpGT9kx*p6}%g zr|M>Y?`{~s5gvhFPbosUlx_x{uW%ls3syoxsJo`DEbq3{P>#Tgzy<>+)X%8}vk(qE za?i<86A{{U7RRX4$-zdI*9pr8`IpU^kb;?DP3Wf!Mc+dk&Mi%Bg~>l$Ea>0$W2vG- zYM-xg7j(F7oSVqAybE1Nw8PCW;+_6K!>SP`jFTdx*fnaV*Z0_?z1m`RE=3^~7(C{2d^ArAV~&UKE!b40T#14ZZ6sa;Zs2f4WcZbsfcFn(HJfS{P8 z4-7DKIZ(W$mQe8xmHR1cP{gy6K}@UC;~ig#xpzv=6J)|jLyjWaoOW0hNCGJwuc@ec ze07tmyM^M@4` zxEyqG(Ek~I$=K0%(nV>j9z?H{3QMWCCeni%Q;kmSpA1)G7_;j0jv7!6{B{qCzSJ9$ zHTt{D-UyQGI+J^PqXv309n}Ue94QYu;qT1BGb6n%-?o8C>L0u*dB03Lvh-LWw)4gQ zCwqFei?RvmpZk?}!z>=)tvA!EQp-Sw?5jQ7%T^wE?716R!%ptS@#pMI7-#fa|70t> z<;BSa5&uUZOqY5>veE*++b^8txl*GNBf^kZcx#-Z5QVyghTH*HCzdf&Tq!9NaxosQ z5_LLrdc`y=2WU-_LJl`zI?NydoZ7bGA69l?#Z- z_z@?2^0Ke`Rt9`=yX)=}w3Hb;b4gp)nZlNs^Lo{pqQmj(pz*yvw^0>dvMwF=2tE@*cAa9u8r4dG>pik9lcqtm{o@e6 z^8#6kCm_OyldSd3?~sw*Fm5_)y$FCoYMV9}CVm1Ll^mXs$bl6FDqDk-z!iSnZ)xcd zx+%w)a-u$UqCSr*r25dn;UVTnk;D#5qEEX5clrt3{e>ogPW12PX+yq$sEO@$i+l-x=VOby`I*a<#b~Q-&85& z@GV8~`rg^o+k05DTiW7V5@G>y(3Nyl2fP`k|Af;oTAg&sa8xZE?0yT^CkERkIWERs zG7aRe(6T*O$;IEt4NQ@?VCUB(@Rx7!mrS~WTr#Hg=C0El<}{VzK}r0mrR&ObR1AX1 zWlX2a_~QksY_I`MC#AXOeCq0Y%bc*3i!V#wBo@XKwGuyoo(k$nT%}VK9bWy0k8w^dbqDx2_yP9^7GrEL zZ(k>Gkn6r*JAMUZzi~GyBc+aL<*@M&>84z!L#Oq`Ntp+?d(}xfF%QGB8SH$~n+JqN zMDn?8QY28_o_3YFda7N}sskJ+t6;;VmlE8!QM$6ddyb{o-NDnBl@z0Xtxe)ZD%I`j zF6YqJ&P{r%(QgT7|B$m%z8JVU8eOv!M zo$P|T<2xzx5?fKCI%%$ejrsEgqZ_%5;5KP~Px_r<8o8=d|jqM2OKc zS3^1Yn!F8(Zgf^^fLkj5pXf~9c4FaPOK|+a$^h9;s&z-e5u_8wEL!OkqccsoP0v!pSnSpfL&B>kFxYF9$a@|Z2W|rJ&yy5=D zIU2mFe>!n~i52iQSlnsUCEBhA%38ZgC?_oz?9q_;y-N0>AUcDdh0755GB8uiYqP^3 z=Jzj25$d%IA%epnJkdV+mLbEEm=naJvh1tK+8oy9o!3ojSZc883ycwn)LtxxUi*j( zrt$Sl$PEA~?lJuQtvUO%4Kkmh7iF`E)Mn&}h15Zl5-V#ce1rcHT7`Hl+{*VNeZlhD zvldIt$;Yw!lrxI>%i=Ogh<1{?#J@hHhh{dLtpC*Bzhc>V=$2nLWJSD-9>0Wmf*HEo z$;)PL?SuGei8JsSR^wKGrJ3>gV8jff7X!xC;>IiuLiqqr2%i?uA3i4n-gt<WIrbui*EPwObd|q>eZrf$pVNa?73MO9?*pXSRtymwXv$05&?9FusEPeNy1EN48yY z?T?lmPz&Qg8iU3*9bOb57ohTXMT%h<0EOsKjbXpR#M%#$H3U0D`K|6(U>Df8eO7;0rHKsBhd=D^s3!$gX#>oV70qQb=@H=J zzjRSkNxy5Qbyi(D9V2%Dd7Xt4Iy7x59kED)5p6HFt|ktBQsHC+$EVj<%|2M8g9`pe z#v|A*7&d8;G>OsxADDEl-fe)m(>S1fbr>nJVK46X6JUz_>mMedKIY!ZdP04^w~}?o zzg4OzzL-DsO?Xb;X7sSpnV}S1bfrANALEaHVS8XQvHwwep~52JtU2v->A$Ie9eyO~ zKl6h3d;bG`6ERN}h$)@@&i}NW1e+|rrEhhiKaGc|QS3f`Acv_#|CdG?*>|>o<8x}^ z@RdbU6!7_9ATa@=kb!n{V19HE#H)5U*lwV3eGqR z2Hex?O1DXK21c#v!rs3fh}+|UX+$P#T}*ER155^p<@yo3{Ox^34wM!QQbg_hj`ycVAB|<@;fPUfS?}2Q!5?pV8;=A#ggp3l8v?YFQ z>kiSuBqPAZ|2QxC66ukgnBKu&oddv6tAkp9_w8H&CLR;;W2p3-KS*Nfm!pmEde0W}rGflvhS&m{<@V}=i5+WfK`Ts-~z21H%%BWO>6}$W6iOsAD3G4&>V@iZ-}i_&`*IYC+dVPah4MrOPPOSq%d_M?iZGt zZ0F&>W2u#^A}HbcMfA`=A%_m!Xi@pzUylx-`M2$n(ozhEw-TNcS>&JKMBs;iVOs!p z+JC#>o|rs+^{b?-Q}tLzkm2sojVjk{DxLp6Du9{!kIwS5S?BDSoZX}eoh+Kfi@5Mq zDB<49J*pD&H79b{|6TYl=Fr)@f!9G;9_)D(Fdt}qQ-1}YpQNz%5W;*oEO_lWzU~Oi zZS5E`4r85>f+7oF;I|y1kq3Jw=AT19f-bMafG(H$;uJy|NrsIR-$GgORsBr~NMWM8 z8c*2@hLN&roQPiNiNKXevW>4S3?q<>f9pSYEP7|Egw97bCRipJM30TwShfkj>ex_5 zY27=(+C#>4y+FPw#G;(ewys0$%ZHtlEo6yRU4}R6mwPB-F)hbj&G;qkFRSiRZdC8_ z)I*=PS}W*-PW@9DJfT8D!}Y?{6N7(oGevwM_n%Fi80o?9H+R0G#%>)uoLrKTASHxN~;4YSZ`c(_c1^DBLjfpW8h8)Vc zp-mgPBY^jeFY>up_r)cIT^7*$m?qD*=lhpEbKys1qjI`iQ@TQ&h3D>JlZf>Bi_JlM z?s_( z)u(Ax0Mfr#du1Gf@_Z#BpQ5Smm}2c*s&wWHXR((uD4B&Q437Mfm7%G&pQISd*~eUm z1)Vi)=zZ1U>(tBw$;uU~8+@Q#1pLL5x&^o9;-FpiH|%gQj42*0x~} zMW{#jRX2*+*Q1xGTPbQaN4n;tsh*<|lmZ*p1eKXeCFJ4vB(DDS0AkVXsg`7!s_9sa z5?A-!Ld(z*Uto3e;AH3T{(995$i#s`HBJnw@q||$)v^`#CC{H>UjOZ9#e^`=&^P+` z!Vq#|-C#HSzsAZ)c$q%Xwd8ddM%w95-wVotgwwxQLTQsh?D2^+qCxd@QS9RT2sX&V z{8k$lJoF6U84V-E1+xX+y0N%(_ewg#vpx~@ zUtPCHR`7PAu~t$Z=h;iloLn~99W>TplE4c*v5;Fy0@E{*V8c)fminQA42Bm?iMQxH zr@=mzIM;xjW{4uKbJLs2v6xzhc!*wQz8+wP>Hdx(NhFt3-JHTv z$4$Z@(D+?cFN~AoE!1sof0>85g`>Ph$7D{h@ z8b=7l6esq>u7E(}ciW%B6KK}dI}Da`zn&;JRU5CO!8Q;}8>|q{yB3Zgx4PHn_>{H!-7~$T3hLvkPzZa?`mltB?bHav@h22G&ileD^sFXE?)SVa z&VODJ_`g>y3$aG78b*5JzjcFO$n*c%7x2RDx(7@Tozcsu*7^=tL5d0U+twu*I!xP% zaz;#+V-o)aA;&r25W&O4Up2u2fb7BBbeWpk3}PHUar3NbS&p5ZuDn$EbSV$*(_ndT zcm;s|p5~-b%4S-1Z~M$Kv{8|UcR}oJjmm15!vfoJ!3 zKabtG?e4*mGLNp!PzM$J%@p%DZ9PE0N!gL(Cq?(rXC# zv_8lA3{lfd z4Sqg*ITR5bUzz?V%GP6V^xyTE1j`n3jV5PO$Yd6}NLgDuhnfnh|i3^<#-G;Dp@FCW+mF0u>_f`%QQbdq#E(ZkeMHMuzR z_Xz{cz{;yPVK0qFU#YL=l7b7B7r&Ln%Mmu%o1J|3%n(+suVMb{?qih20(V+{gvbw- zp84+VYpI>(c}!o8(sZorb@^ zjLc6T$eFwTXXD7KfpV=}_%c&|lUzBi<7ufsF`di0gHM9Z?|Mx!R9_#aH)XFVLtNE& zcxg<#lDy>X7V>ncbm7-WS9em=7k-hhek^Pwg)3+w1Pe{#(ThE*N+|JqGlY!+bZ*hzVXehWa zyUha4g!c^`d3;ST9HVj@JIk>a!)Sn`1Vl-;9@w8I=d+C@MXnvyr=f@=tRh>Q5%!Q^k;`D0~@5g7}cy;%N|6=<&{fHBtHjwPloq2nBIbeyjs|Zl)+1nV+A_7 zvwIqxG1Mf1UCx~rO@^SeN7m8Jzk1J1Ko_NT{L60qJWpXEg9)JxW?^~Oktz^Z2Q^v{ zcfV*$Y#LXBP$zpq@bHL12|1m4(XsSIohssvSQv8+^8kIg*^sk4{PnK>w>SiG$wBH$ ztNoo;u%M1gB`E1ao8q_>CJyd}c=6P|BpyvOEAD!cUkvPCAX5le+P;CqR)}9dt5KQs zi)Hk01MbJDj{%X4)Po;Y-h#_pHt^oxjK})KfP>mQs?pi;GbNi9Z6<#sq*S=7XB#t3^9x>m>q;Sxn}@th`>CHhbw^w ze^ovKwAba_25ZGRT!-!R549(fn40Hb!GUUH(u5J?+*bbF`wnFt!Z$j(Vit9S?JWH0 zqS6mj#7aWu-3X>Jr!f8~PZ>wx3Ap0I%W9j$YG61n?e$J^+|3-$$89OzX{dA1+8y)w zDg8UvzZOp)=5_n^rASNoMF9quir@bIPbl)Tp#vhHmr zyTopy^+Q;=5LBANbO0xu+f+F2Ug^Ti-^T@2#*DpHNxfkE*3ScTd-mz2&DIRmB@n(l zk7_a_;OsPBL&@)F%O=@IMW2a}i(@$9iw-Rj$L>$F6`yr$54;K?R%`+NmO>b?0IUpl1ef6Y6R;wFLT^`5Y-n>V>=o&tl*daO?O}?K zJ$q?tj{RAj_~%FvvVR3p|iUApzVI7vZN88b9fiPozo~f0|2MlZrzh7!}qBxP29k zINlsVg7it50Oma=XBXcFFQK-1l%b0?)M(7CdV7U-4_RRoVH7YNS^DGkwTP8E4X%*SNn!K!T)R=wnzXlOZg`)Ivh}3*VnW^_ddO;Fz zUhksR^=EC=gHfGZc1E>H7kZmTGEnRw;%V6pG7C#lXS25iZVF2 z;qt5aba?Z{_lAUUk-0|CuKz9dC%;(MhLu;n`<4W!ZpRhfTKD8<4$agi-1FVJI>f6- zpGsq?a%5}%pEt{-Ff8m6rT55!kaLLi2 z6(S!@xs;whrXrpSS{#@6x}dY%(D}=ad!H?$!^ca=F;jr`eVG=c)P)|7cJ-Hsoow&1 z2HZ5@P43E#=}N=gL?5GFyI60L5~NVyqQRH%+ojDHeAOFymQrFl4^=FFiq+i$?t(ad zYWr$Y#4E zlSaX`(15)Z%01qzMhJ1pJDNPavgIvHs1QyXe+X77Fk{>C$~J+3&}vW!W7p0yA=edJ zd#PqH8J`WljGDSOGdAg{hw0h#w2VhcJtkHp!;DPMD-O|4&#!TPdfAn$8T($^#-PG~ z*o+mG7<#o!b>*nuXz54TX~fOSrVahePwHHNArM$&Wxr%gPG~C4@XV<0&d+YE^FYS^ z{`bzE@t?6;+#5H4jk*gEVwd5{*QBui>e;J4;{hOkN9$bAS^YGl`5P% z?M=VQxXNf$dmaa$6$ve4+{BR95gF>cI#w6N;B~Nf7#=1=l0^Edd@T7TIy}BeEJV#= zDH~s%W72!qF}qzB)4E-rrLOLIWKH5eFXqO^Z~VU*c1J)K{FH(ZgUS41&DQq>>dork ziur7`u7`KUM`+f6oRC%L+NpVCpP^ejKIH_Io(GvMbzm8Hg}XvvW6CvvaW%C;h(csd2Sg#?A~7;>^#p zA+cs+iH&diRG3wQJ@b7y_dcq1V;x!sFJ(6pY?2>ZZ883ZN~P}uKNnLVcAW07#xO}J zQ~_*y{LsjW*tgcl`GG{^f2)&Y zLky5)@@y$uvh#c{q9k+8wBqLIP{a9+opXLBLwQA0pNjAWMRLiIAV4-6Npp>{^(R-k zbo)rA84Y3$@zs$e9^wBOHI&Vkd4Cnhrs^P0&}t9z;$`Pto|Tw>Ru{rpa#fhCP^OBW zcwg%iJtiq$qqgxA3hael0TtovqY>L$4m%b5;mm|; ze8b7r@BkgyN9OMAK}Zo#46W`t$7=pQaxmS)@tZIC#S+lV@G$Y3SN88+$kb5E_i9?! z{fv#%da1= zw{D9r+jd_A=Z0-!LY3!-Wg_zF`oz`vNS4LRH`}nX$lxNu!93ApKgv%qeVh$QYn^kR zEBs>g81wi0+tTqLBbUjPJhjAcbhI=9E0rxLWj_VUW4r+p5DW+IQRPB}z8dOn_#kPp zlc|`G-u{HjY?qz=-dMX2IGeK2g2s^m>y8Ev60pHV9}l&Sp6LFA!xYh@F3cNN)|g2d zj0O0uSzqUk0Amqe+|#zMlNrEoSNmHVGa5K*5j9cx bQxd9MpOr03uAc+H0fy*k8fuiOIo$hyfUQq9 literal 0 HcmV?d00001 From f46572e19a039792dae1553007dc7d38030c9eb1 Mon Sep 17 00:00:00 2001 From: Josh Kelley Date: Fri, 18 Apr 2025 07:15:57 -0400 Subject: [PATCH 07/16] Add beforeEvent changed (#12063) --- src/types/index.d.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/types/index.d.ts b/src/types/index.d.ts index 175336ec793..898a2c821cb 100644 --- a/src/types/index.d.ts +++ b/src/types/index.d.ts @@ -1080,9 +1080,10 @@ export interface Plugin exte * @param {ChartEvent} args.event - The event object. * @param {boolean} args.replay - True if this event is replayed from `Chart.update` * @param {boolean} args.inChartArea - The event position is inside chartArea + * @param {boolean} [args.changed] - Set to true if the plugin needs a render. Should only be changed to true, because this args object is passed through all plugins. * @param {object} options - The plugin options. */ - beforeEvent?(chart: Chart, args: { event: ChartEvent, replay: boolean, cancelable: true, inChartArea: boolean }, options: O): boolean | void; + beforeEvent?(chart: Chart, args: { event: ChartEvent, replay: boolean, changed?: boolean; cancelable: true, inChartArea: boolean }, options: O): boolean | void; /** * @desc Called after the `event` has been consumed. Note that this hook * will not be called if the `event` has been previously discarded. From 3361a637052c2e51d5bcf077e727e06a53941a3a Mon Sep 17 00:00:00 2001 From: Josh Kelley Date: Fri, 18 Apr 2025 07:16:34 -0400 Subject: [PATCH 08/16] Require 'this' when calling tick formatters (#12064) The `numeric` and `logarithmic` tick formatters require that `this` be provided. That happens automatically if they're used directly as a tick callback but not if they're invoked manually. Failing to pass `this` results in runtime errors similar to the following: ``` TypeError: Cannot read properties of undefined (reading 'chart') ``` --- src/types/index.d.ts | 4 ++-- test/types/ticks/ticks.ts | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 test/types/ticks/ticks.ts diff --git a/src/types/index.d.ts b/src/types/index.d.ts index 898a2c821cb..69a4cfccbc5 100644 --- a/src/types/index.d.ts +++ b/src/types/index.d.ts @@ -1519,7 +1519,7 @@ export declare const Ticks: { * @param ticks the list of ticks being converted * @return string representation of the tickValue parameter */ - numeric(tickValue: number, index: number, ticks: { value: number }[]): string; + numeric(this: Scale, tickValue: number, index: number, ticks: { value: number }[]): string; /** * Formatter for logarithmic ticks * @param tickValue the value to be formatted @@ -1527,7 +1527,7 @@ export declare const Ticks: { * @param ticks the list of ticks being converted * @return string representation of the tickValue parameter */ - logarithmic(tickValue: number, index: number, ticks: { value: number }[]): string; + logarithmic(this: Scale, tickValue: number, index: number, ticks: { value: number }[]): string; }; }; diff --git a/test/types/ticks/ticks.ts b/test/types/ticks/ticks.ts new file mode 100644 index 00000000000..a5a9e28bef8 --- /dev/null +++ b/test/types/ticks/ticks.ts @@ -0,0 +1,15 @@ +import { Chart, Ticks } from '../../../src/types.js'; + +// @ts-expect-error The 'this' context... is not assignable to method's 'this' of type 'Scale'. +Ticks.formatters.numeric(0, 0, [{ value: 0 }]); + +const chart = new Chart('test', { + type: 'line', + data: { + datasets: [{ + data: [{ x: 1, y: 1 }] + }] + }, +}); + +Ticks.formatters.numeric.call(chart.scales.x, 0, 0, [{ value: 0 }]); From bcc7681ba1cb3c4089332d93903a881ce1b6f396 Mon Sep 17 00:00:00 2001 From: Lucas Leung <66652566+lucasleung8@users.noreply.github.com> Date: Fri, 25 Apr 2025 07:47:44 -0400 Subject: [PATCH 09/16] Fix minor typo (#12068) --- docs/axes/cartesian/linear.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/axes/cartesian/linear.md b/docs/axes/cartesian/linear.md index f534a4d9b82..fae3b98d11b 100644 --- a/docs/axes/cartesian/linear.md +++ b/docs/axes/cartesian/linear.md @@ -97,4 +97,4 @@ module.exports = { ## Internal data format -Internally, the linear scale uses numeric data +Internally, the linear scale uses numeric data. From 8ea47cad19ec894319f74fde340e8bc8d79fc370 Mon Sep 17 00:00:00 2001 From: Xavier Leune Date: Thu, 5 Jun 2025 17:27:56 +0200 Subject: [PATCH 10/16] Fix: display stacked bar with multiple x-Axis (#12070) --- src/controllers/controller.bar.js | 32 +++++++-- .../stacking/stacked-and-multiple-axis.js | 64 ++++++++++++++++++ .../stacking/stacked-and-multiple-axis.png | Bin 0 -> 14649 bytes 3 files changed, 92 insertions(+), 4 deletions(-) create mode 100644 test/fixtures/controller.bar/stacking/stacked-and-multiple-axis.js create mode 100644 test/fixtures/controller.bar/stacking/stacked-and-multiple-axis.png diff --git a/src/controllers/controller.bar.js b/src/controllers/controller.bar.js index 82138f3fb74..554497b3053 100644 --- a/src/controllers/controller.bar.js +++ b/src/controllers/controller.bar.js @@ -486,6 +486,27 @@ export default class BarController extends DatasetController { return this._getStacks(undefined, index).length; } + _getAxisCount() { + return this._getAxis().length; + } + + getFirstScaleIdForIndexAxis() { + const scales = this.chart.scales; + const indexScaleId = this.chart.options.indexAxis; + return Object.keys(scales).filter(key => scales[key].axis === indexScaleId).shift(); + } + + _getAxis() { + const axis = {}; + const firstScaleAxisId = this.getFirstScaleIdForIndexAxis(); + for (const dataset of this.chart.data.datasets) { + axis[valueOrDefault( + this.chart.options.indexAxis === 'x' ? dataset.xAxisID : dataset.yAxisID, firstScaleAxisId + )] = true; + } + return Object.keys(axis); + } + /** * Returns the stack index for the given dataset based on groups and bar visibility. * @param {number} [datasetIndex] - The dataset index @@ -618,13 +639,15 @@ export default class BarController extends DatasetController { const skipNull = options.skipNull; const maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity); let center, size; + const axisCount = this._getAxisCount(); if (ruler.grouped) { const stackCount = skipNull ? this._getStackCount(index) : ruler.stackCount; const range = options.barThickness === 'flex' - ? computeFlexCategoryTraits(index, ruler, options, stackCount) - : computeFitCategoryTraits(index, ruler, options, stackCount); - - const stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : undefined); + ? computeFlexCategoryTraits(index, ruler, options, stackCount * axisCount) + : computeFitCategoryTraits(index, ruler, options, stackCount * axisCount); + const axisID = this.chart.options.indexAxis === 'x' ? this.getDataset().xAxisID : this.getDataset().yAxisID; + const axisNumber = this._getAxis().indexOf(valueOrDefault(axisID, this.getFirstScaleIdForIndexAxis())); + const stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : undefined) + axisNumber; center = range.start + (range.chunk * stackIndex) + (range.chunk / 2); size = Math.min(maxBarThickness, range.chunk * range.ratio); } else { @@ -633,6 +656,7 @@ export default class BarController extends DatasetController { size = Math.min(maxBarThickness, ruler.min * ruler.ratio); } + return { base: center - size / 2, head: center + size / 2, diff --git a/test/fixtures/controller.bar/stacking/stacked-and-multiple-axis.js b/test/fixtures/controller.bar/stacking/stacked-and-multiple-axis.js new file mode 100644 index 00000000000..ca5490a9291 --- /dev/null +++ b/test/fixtures/controller.bar/stacking/stacked-and-multiple-axis.js @@ -0,0 +1,64 @@ +module.exports = { + config: { + type: 'bar', + data: { + labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July'], + datasets: [ + { + label: 'Dataset 1', + data: [100, 90, 100, 50, 99, 87, 34], + backgroundColor: 'rgba(255,99,132,0.8)', + stack: 'a', + xAxisID: 'x' + }, + { + label: 'Dataset 2', + data: [20, 25, 30, 32, 58, 14, 12], + backgroundColor: 'rgba(54,162,235,0.8)', + stack: 'b', + xAxisID: 'x2' + }, + { + label: 'Dataset 3', + data: [80, 30, 40, 60, 70, 80, 47], + backgroundColor: 'rgba(75,192,192,0.8)', + stack: 'a', + xAxisID: 'x3' + }, + { + label: 'Dataset 4', + data: [80, 30, 40, 60, 70, 80, 47], + backgroundColor: 'rgba(54,162,235,0.8)', + stack: 'a', + xAxisID: 'x3' + }, + ] + }, + options: { + plugins: false, + barThickness: 'flex', + scales: { + x: { + stacked: true, + display: false, + }, + x2: { + labels: ['January 2024', 'February 2024', 'March 2024', 'April 2024', 'May 2024', 'June 2024', 'July 2024'], + stacked: true, + display: false, + }, + x3: { + labels: ['January 2025', 'February 2025', 'March 2025', 'April 2025', 'May 2025', 'June 2025', 'July 2025'], + stacked: true, + display: false, + }, + y: { + stacked: true, + display: false, + } + } + } + }, + options: { + } +}; diff --git a/test/fixtures/controller.bar/stacking/stacked-and-multiple-axis.png b/test/fixtures/controller.bar/stacking/stacked-and-multiple-axis.png new file mode 100644 index 0000000000000000000000000000000000000000..ea571109e90cad2295defb015a131c52b009c9a3 GIT binary patch literal 14649 zcmeHNX;_nImwpm90dd2s1r=IUv@W=yhyqE~A}zAC_7a6+P}`zJh-DEGLZTg|s0eCX zRD@tr(9wVtLkb9qbpu5r27$7K)kMUwB_w2@^9HcmUNiH}HS^84@yEQxC-1YIbMAAW z`#g!h-Wx5righ%r1m%(Z?G;{QSUn zaWm~zPjFyMe|H4?^30XT>NAR$5-pE5ez(c<5bg*5<`WGMzgB;{qvNyH2|McAJUq4t z@r&=>IniqK$m%pM-`@4?d)B7y>wGl%;lA_d&0JeQ;}_-~V)nj#aw;PtrrE|u!|qi{ij=nm=S}2t_1T7#TFHgRo|2)imcE;@RrmUB1ZjDySEs&} zrymcFIf^%%pUL%e*r(`M<(2gvHW#o$8AU7;Z;tROnN6)C4f1?StPt8iD7+AWGt&P1 zG(^u2n~nU*Ww;sS1?lcMqaU{+biddS!GElJx@W3yP`(igx_-?Fp&4X5Y{0YtY=HmR zfU$EJ^M`-%xTvqjJ7~E!fwJ;DG-VyzRr@kOLHDALBtM}m6GynKUC@cBg#d)RLND>> z-^en`{iP#1kK`q>hM_L3SRWFt%c9XO_%6?YyOj<2xwO`OO%i@BfWyE&95JjW0=~-> zmBpmuk1s|@5rVUIdg+Wq=t)G&Ezd*u0Da7X}; z!%a@TpJ51OOInON-CgbByMsMx(F<~J%9~7!;dX*?DWQbZ!9$aTVUCLlN+sVY@x}d z0CzkDM z6rC7~LFE9GZvfP5s5Bh=R-ZD)&S5xpj-A8UIRJqf!-rua_m`YQ;yAj(Ml)nyRdGlw z@1^ZfKH(_&5d+t28zRC=dfRhoclbTd(|NH6C}lkb8z%^&mt;JDmsHA)lh(6Y&(u+k z@}gFDHY5H~?_S+ZpRGB-9Q}bH=y~i;5~|EQ$Uh_-^wHgQc7Bp2e#TEs;~enLFhZga zcCkg38j5Q3SIg_Cv&;~&$_N!r9wx8cWK{gh8bwyb3AW>rGnRQ? zGmxJt=*e73Ol-w`be0s`?Zh_srWMiP+)vyhL6t!O3^pnBEmyMR9#wsKmveU` zBA%Rx`NdQ#O{D>^Xdguxlu>Cp@l{~>^VE}@CZ>l@0m+F{?R*x|BPR7b^iM`99R|cO zLv#dO#?Dn#s9F-QbaD}Az!bAbC7|aYTc$xx<@G43-x-z5(eMN~;z`IR)gG2;>C@2b zv}vgPF<1;wUk3&~1y5Fc@W{P5X^;oZVT8h0VD6Op1YB?qJh`7o^iyHGGzGw~jQ@hoxZ}BT z8YYk8vn}v@pIP%}H>=tsA24Y*1|y8)5E_4A0U2A#qStd=x`_5k>jOhWQiYon5@UL^ zyM`LQLp2w0HV7GPe`p0;ooW96y@|h#MUwDz#Y%$q@cs`~r{dZjmua+-YN3ti=5BQ? zDrYS*`Lhiz4Cr;Gns=B?!8xA`^RiVrjV;QDj;tz<3H=K=v@BzE#KRy7afzwV|8sS2&wiQ2aQtcCuwa%VbC{ncRAD_uJk*%)or{3Q?(|8JqCUa;;jfZqL({nmfb| zrN@Np5=�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 literal 0 HcmV?d00001 From 4bd8cf4ad203dde4f3954fd11e5d04ce1d3f3a19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=84=EC=84=B1=ED=98=B8?= Date: Fri, 6 Jun 2025 20:54:37 +0900 Subject: [PATCH 11/16] Update docs for Developers API (#12082) - .update(): add documentation for function argument support - isDatasetVisible(): add missing method documentation with example - getDataVisibility(): fix anchor link for toggleDataVisibility - Static: unregister(): add example --- docs/developers/api.md | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/docs/developers/api.md b/docs/developers/api.md index 11ece0128a6..2662f68f8a5 100644 --- a/docs/developers/api.md +++ b/docs/developers/api.md @@ -25,13 +25,19 @@ Triggers an update of the chart. This can be safely called after updating the da myLineChart.data.datasets[0].data[2] = 50; // Would update the first dataset's value of 'March' to be 50 myLineChart.update(); // Calling update now animates the position of March from 90 to 50. ``` +A `mode` can be provided to indicate transition configuration should be used. This can be either: -A `mode` string can be provided to indicate transition configuration should be used. Core calls this method using any of `'active'`, `'hide'`, `'reset'`, `'resize'`, `'show'` or `undefined`. `'none'` is also a supported mode for skipping animations for single update. Please see [animations](../configuration/animations.md) docs for more details. +- **string value**: Core calls this method using any of `'active'`, `'hide'`, `'reset'`, `'resize'`, `'show'` or `undefined`. `'none'` is also supported for skipping animations for single update. Please see [animations](../configuration/animations.md) docs for more details. -Example: +- **function**: that receives a context object `{ datasetIndex: number }` and returns a mode string, allowing different modes per dataset. +Examples: ```javascript +// Using string mode myChart.update('active'); + +// Using function mode for dataset-specific animations +myChart.update(ctx => ctx.datasetIndex === 0 ? 'active' : 'none'); ``` See [Updating Charts](updates.md) for more details. @@ -141,6 +147,15 @@ Returns the number of datasets that are currently not hidden. ```javascript const numberOfVisibleDatasets = chart.getVisibleDatasetCount(); ``` +## isDatasetVisible(datasetIndex) + +Returns a boolean if a dataset at the given index is currently visible. + +The visibility is determined by first checking the hidden property in the dataset metadata (set via [`setDatasetVisibility()`](#setdatasetvisibility-datasetindex-visibility) and accessible through [`getDatasetMeta()`](#getdatasetmeta-index)). If this is not set, the hidden property of the dataset object itself (`chart.data.datasets[n].hidden`) is returned. + +```javascript +chart.isDatasetVisible(1); +``` ## setDatasetVisibility(datasetIndex, visibility) @@ -162,7 +177,7 @@ chart.update(); // chart now renders with item hidden ## getDataVisibility(index) -Returns the stored visibility state of a data index for all datasets. Set by [toggleDataVisibility](#toggleDataVisibility). A dataset controller should use this method to determine if an item should not be visible. +Returns the stored visibility state of a data index for all datasets. Set by [toggleDataVisibility](#toggledatavisibility-index). A dataset controller should use this method to determine if an item should not be visible. ```javascript const visible = chart.getDataVisibility(2); @@ -229,3 +244,9 @@ Chart.register(Tooltip, LinearScale, PointElement, BubbleController); ## Static: unregister(chartComponentLike) Used to unregister plugins, axis types or chart types globally from all your charts. + +```javascript +import { Chart, Tooltip, LinearScale, PointElement, BubbleController } from 'chart.js'; + +Chart.unregister(Tooltip, LinearScale, PointElement, BubbleController); +``` From c86116dbca6887a4c89125e7f5edd85869118cfd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 Jun 2025 13:55:10 +0200 Subject: [PATCH 12/16] Bump pnpm/action-setup from 4.0.0 to 4.1.0 (#12025) Bumps [pnpm/action-setup](https://github.com/pnpm/action-setup) from 4.0.0 to 4.1.0. - [Release notes](https://github.com/pnpm/action-setup/releases) - [Commits](https://github.com/pnpm/action-setup/compare/v4.0.0...v4.1.0) --- updated-dependencies: - dependency-name: pnpm/action-setup dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 2 +- .github/workflows/compressed-size.yml | 2 +- .github/workflows/deploy-docs.yml | 2 +- .github/workflows/release.yml | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2432e914909..c1264017cd3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -31,7 +31,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v4.0.0 + - uses: pnpm/action-setup@v4.1.0 - name: Use Node.js uses: actions/setup-node@v4 with: diff --git a/.github/workflows/compressed-size.yml b/.github/workflows/compressed-size.yml index 24cc40e3310..a79a28f8d25 100644 --- a/.github/workflows/compressed-size.yml +++ b/.github/workflows/compressed-size.yml @@ -17,7 +17,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v4.0.0 + - uses: pnpm/action-setup@v4.1.0 - uses: preactjs/compressed-size-action@v2 with: repo-token: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 0a6486d5697..949a4ec2118 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -24,7 +24,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v4.0.0 + - uses: pnpm/action-setup@v4.1.0 - name: Use Node.js uses: actions/setup-node@v4 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 802c749c6b0..93699285c06 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -27,7 +27,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v4.0.0 + - uses: pnpm/action-setup@v4.1.0 - uses: actions/setup-node@v4 with: registry-url: https://registry.npmjs.org/ @@ -72,7 +72,7 @@ jobs: if: "!github.event.release.prerelease" steps: - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v4.0.0 + - uses: pnpm/action-setup@v4.1.0 - uses: actions/setup-node@v4 with: registry-url: https://registry.npmjs.org/ From 14d66be764d422e6c6711bc2479f25646c70a8e0 Mon Sep 17 00:00:00 2001 From: nakanoh Date: Tue, 10 Jun 2025 19:17:06 +0900 Subject: [PATCH 13/16] fix: correct grammar in segment comments (#12084) --- src/plugins/plugin.filler/filler.target.stack.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/plugins/plugin.filler/filler.target.stack.js b/src/plugins/plugin.filler/filler.target.stack.js index 006c5737fea..8c6d0532c12 100644 --- a/src/plugins/plugin.filler/filler.target.stack.js +++ b/src/plugins/plugin.filler/filler.target.stack.js @@ -65,13 +65,12 @@ function addPointsBelow(points, sourcePoint, linesBelow) { continue; } if (first) { - // First point of an segment -> need to add another point before this, - // from next line below. + // First point of a segment -> need to add another point before this, postponed.unshift(point); } else { points.push(point); if (!last) { - // In the middle of an segment, no need to add more points. + // In the middle of a segment, no need to add more points. break; } } From debdf07c1ddb13099b21d7f2bc0f1e902922de28 Mon Sep 17 00:00:00 2001 From: William Entriken Date: Tue, 10 Jun 2025 08:31:41 -0400 Subject: [PATCH 14/16] Fix min js two renames (#11470) * Name artifact chart.umd.js, fixes #11455 * Add (.min)? to karma filter --- .github/ISSUE_TEMPLATE/bug.yml | 2 +- docs/developers/contributing.md | 2 +- docs/getting-started/integration.md | 6 +++--- docs/migration/v4-migration.md | 2 +- karma.conf.cjs | 2 +- package.json | 5 +++-- rollup.config.js | 16 +++++++++++++++- test/BasicChartWebWorker.js | 2 +- 8 files changed, 26 insertions(+), 11 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml index b04b9fa33b8..ffccce5de0b 100644 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -45,7 +45,7 @@ body: For typescript issues you can make use of [this TS Playground](https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBAbzgYQBYENZwL5wGZQQhwDkAxhrAHQBWAziQNwCwAUGwG6ZxkwAecALxwAJhDIBXEAFMAdjCoBzaTACiAG2kz5AIQCeASREAKAEQg9aTDFMBKOOjpwAEgBUAsgBlk6WVzoaWnIwLKxcUHAWVljCstIA7iiUMMa8fAA0iGxwOXAwemDSAFyk6sBxJOnZuSLoMOglCNW5ueroAEbS6nQlANqmAErSIqaZpjrqEtKjcKYAml3qEPEzpgDiUNJyqwAKElBgmqsA8lC+yqYAulWsLS219XQqPXC9Tbd3n22d6iUkAMRwCB4OAANQgMGkDBun0+DwarwAjAAmTKIgCcmQAzJkAKyZVFwLHXZp3bCXUnYGG5CBgGDACCyF7vT50MjoTTM0ktPiNbl3fk5KmCuB6PkfWFwEXYfkyiU4NjYWyMIA) to make a reproducible sample. If filing a bug against `master`, you may reference the latest code via - https://www.chartjs.org/dist/master/chart.umd.js (changing the filename to + https://www.chartjs.org/dist/master/chart.umd.min.js (changing the filename to point at the file you need as appropriate). Do not rely on these files for production purposes as they may be removed at any time. validations: diff --git a/docs/developers/contributing.md b/docs/developers/contributing.md index 96c3d05d800..a5bb44566c0 100644 --- a/docs/developers/contributing.md +++ b/docs/developers/contributing.md @@ -74,6 +74,6 @@ Guidelines for reporting bugs: - Check the issue search to see if it has already been reported - Isolate the problem to a simple test case -- Please include a demonstration of the bug on a website such as [JS Bin](https://jsbin.com/), [JS Fiddle](https://jsfiddle.net/), or [Codepen](https://codepen.io/pen/). ([Template](https://codepen.io/pen?template=wvezeOq)). If filing a bug against `master`, you may reference the latest code via (changing the filename to point at the file you need as appropriate). Do not rely on these files for production purposes as they may be removed at any time. +- Please include a demonstration of the bug on a website such as [JS Bin](https://jsbin.com/), [JS Fiddle](https://jsfiddle.net/), or [Codepen](https://codepen.io/pen/). ([Template](https://codepen.io/pen?template=wvezeOq)). If filing a bug against `master`, you may reference the latest code via (changing the filename to point at the file you need as appropriate). Do not rely on these files for production purposes as they may be removed at any time. Please provide any additional details associated with the bug, if it's browser or screen density specific, or only happens with a certain configuration or data. diff --git a/docs/getting-started/integration.md b/docs/getting-started/integration.md index a83e49574e8..3d0c92c4530 100644 --- a/docs/getting-started/integration.md +++ b/docs/getting-started/integration.md @@ -7,7 +7,7 @@ If you're using a front-end framework (e.g., React, Angular, or Vue), please see ## Script Tag ```html - + @@ -122,10 +122,10 @@ const { Chart } = await import('chart.js'); ## RequireJS -**Important:** RequireJS can load only [AMD modules](https://requirejs.org/docs/whyamd.html), so be sure to require one of the UMD builds instead (i.e. `dist/chart.umd.js`). +**Important:** RequireJS can load only [AMD modules](https://requirejs.org/docs/whyamd.html), so be sure to require one of the UMD builds instead (i.e. `dist/chart.umd.min.js`). ```javascript -require(['path/to/chartjs/dist/chart.umd.js'], function(Chart){ +require(['path/to/chartjs/dist/chart.umd.min.js'], function(Chart){ const myChart = new Chart(ctx, {...}); }); ``` diff --git a/docs/migration/v4-migration.md b/docs/migration/v4-migration.md index 8e014bb8982..8048c5cae93 100644 --- a/docs/migration/v4-migration.md +++ b/docs/migration/v4-migration.md @@ -30,7 +30,7 @@ A number of changes were made to the configuration options passed to the `Chart` * Time and timeseries scales use `ticks.stepSize` instead of `time.stepSize`, which has been removed. * `maxTickslimit` won't be used for the ticks in `autoSkip` if the determined max ticks is less then the `maxTicksLimit`. * `dist/chart.js` has been removed. -* `dist/chart.min.js` has been renamed to `dist/chart.umd.js`. +* `dist/chart.min.js` has been renamed to `dist/chart.umd.min.js` (and before 4.5.0 `dist/chart.umd.js`). * `dist/chart.esm.js` has been renamed to `dist/chart.js`. #### Type changes diff --git a/karma.conf.cjs b/karma.conf.cjs index 61122bd97e5..1306c412e24 100644 --- a/karma.conf.cjs +++ b/karma.conf.cjs @@ -20,7 +20,7 @@ module.exports = async function(karma) { // we will prefer the unminified build which is easier to browse and works // better with source mapping. In other cases, pick the minified build to // make sure that the minification process (terser) doesn't break anything. - const regex = /chart\.umd\.js$/; + const regex = /chart\.umd(\.min)?\.js$/; const build = builds.filter(v => v.output.file && v.output.file.match(regex))[0]; if (karma.autoWatch) { diff --git a/package.json b/package.json index c76c9c5c6d4..c762573b067 100644 --- a/package.json +++ b/package.json @@ -8,10 +8,11 @@ "sideEffects": [ "./auto/auto.js", "./auto/auto.cjs", + "./dist/chart.umd.min.js", "./dist/chart.umd.js" ], - "jsdelivr": "./dist/chart.umd.js", - "unpkg": "./dist/chart.umd.js", + "jsdelivr": "./dist/chart.umd.min.js", + "unpkg": "./dist/chart.umd.min.js", "main": "./dist/chart.cjs", "module": "./dist/chart.js", "exports": { diff --git a/rollup.config.js b/rollup.config.js index c6a77531048..b396488c148 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -45,7 +45,21 @@ const plugins = (minify) => export default [ // UMD build - // dist/chart.umd.js + // dist/chart.umd.min.js + { + input: 'src/index.umd.ts', + plugins: plugins(true), + output: { + name: 'Chart', + file: 'dist/chart.umd.min.js', + format: 'umd', + indent: false, + sourcemap: true, + }, + }, + + // UMD build + // dist/chart.umd.js (old filename) { input: 'src/index.umd.ts', plugins: plugins(true), diff --git a/test/BasicChartWebWorker.js b/test/BasicChartWebWorker.js index 900084ffe2a..7a7bd1dc4da 100644 --- a/test/BasicChartWebWorker.js +++ b/test/BasicChartWebWorker.js @@ -6,7 +6,7 @@ // Sends messages with data of types: { type: 'success' } | { type: 'error', errorMessage: string } // eslint-disable-next-line no-undef -importScripts('../src/chart.umd.js'); +importScripts('../src/chart.umd.min.js'); onmessage = function(event) { try { From 59ffa84202428a1f8dac6cacbecfb5e268e8f0f9 Mon Sep 17 00:00:00 2001 From: Jacco van den Berg Date: Wed, 11 Jun 2025 21:21:55 +0200 Subject: [PATCH 15/16] Fix minified url for development builds (#12087) --- docs/developers/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/developers/index.md b/docs/developers/index.md index d1e78e97a45..b48290f4fbf 100644 --- a/docs/developers/index.md +++ b/docs/developers/index.md @@ -14,7 +14,7 @@ The latest documentation and samples, including unreleased features, are availab Latest builds are available for testing at: - -- +- :::warning Warning From e106aa93423a5d509108a5a5b39ef20f2343f04f Mon Sep 17 00:00:00 2001 From: Finn Moore <85089563+ffdm@users.noreply.github.com> Date: Wed, 11 Jun 2025 15:22:48 -0400 Subject: [PATCH 16/16] Fix grammar typo: '... and only draw line.' -> '... and only draw lines.' (#12088) --- docs/general/performance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/performance.md b/docs/general/performance.md index 9262630e9c0..1fedf4d62ba 100644 --- a/docs/general/performance.md +++ b/docs/general/performance.md @@ -161,7 +161,7 @@ new Chart(ctx, { ### Disable Point Drawing -If you have a lot of data points, it can be more performant to disable rendering of the points for a dataset and only draw line. Doing this means that there is less to draw on the canvas which will improve render performance. +If you have a lot of data points, it can be more performant to disable rendering of the points for a dataset and only draw lines. Doing this means that there is less to draw on the canvas which will improve render performance. To disable point drawing: