]> git.ipfire.org Git - thirdparty/Chart.js.git/commitdiff
Add data/dataset indices to line segment context (#9451)
authorJukka Kurkela <jukka.kurkela@gmail.com>
Wed, 21 Jul 2021 11:00:05 +0000 (14:00 +0300)
committerGitHub <noreply@github.com>
Wed, 21 Jul 2021 11:00:05 +0000 (07:00 -0400)
docs/charts/line.md
src/controllers/controller.line.js
src/elements/element.line.js
src/helpers/helpers.segment.js
types/index.esm.d.ts

index bc5f6ceb78e5328839b09c37cbb545a75de6a4eb..d872dd9d6b1471948089213186402e16a921eb33 100644 (file)
@@ -168,6 +168,9 @@ Context for the scriptable segment contains the following properties:
 * `type`: `'segment'`
 * `p0`: first point element
 * `p1`: second point element
+* `p0DataIndex`: index of first point in the data array
+* `p1DataIndex`: index of second point in the data array
+* `datasetIndex`: dataset index
 
 [Example usage](../samples/line/segments.md)
 
index ab3c5051556223df37df17284cc7826f923b6258..9b6a505fe0b74ac2718f61b3b46d6fc8765e1330 100644 (file)
@@ -27,6 +27,7 @@ export default class LineController extends DatasetController {
     }
 
     // Update Line
+    line._datasetIndex = me.index;
     line._decimated = !!_dataset._decimated;
     line.points = points;
 
index d2aff52c8bc98fb05b9d8c9ae3627ded2e96eb53..c09548c41ce12067d02593d6d108c34e9e3d2fa5 100644 (file)
@@ -251,6 +251,7 @@ export default class LineElement extends Element {
     this._segments = undefined;
     this._decimated = false;
     this._pointsUpdated = false;
+    this._datasetIndex = undefined;
 
     if (cfg) {
       Object.assign(this, cfg);
index 215c73207baa52b6dfd7fe3d8ef41ee2d753e712..dd9f4da9f2cb7e233e84551de6bc11539c818a39 100644 (file)
@@ -244,15 +244,14 @@ export function _computeSegments(line, segmentOptions) {
 
   const loop = !!line._loop;
   const {start, end} = findStartAndEnd(points, count, loop, spanGaps);
-  const baseStyle = readStyle(line.options);
 
   if (spanGaps === true) {
-    return splitByStyles([{start, end, loop}], points, baseStyle, segmentOptions);
+    return splitByStyles(line, [{start, end, loop}], points, segmentOptions);
   }
 
   const max = end < start ? end + count : end;
   const completeLoop = !!line._fullLoop && start === 0 && end === count - 1;
-  return splitByStyles(solidSegments(points, start, max, completeLoop), points, baseStyle, segmentOptions);
+  return splitByStyles(line, solidSegments(points, start, max, completeLoop), points, segmentOptions);
 }
 
 /**
@@ -261,20 +260,22 @@ export function _computeSegments(line, segmentOptions) {
  * @param {object} [segmentOptions]
  * @return {Segment[]}
  */
-function splitByStyles(segments, points, baseStyle, segmentOptions) {
+function splitByStyles(line, segments, points, segmentOptions) {
   if (!segmentOptions || !segmentOptions.setContext || !points) {
     return segments;
   }
-  return doSplitByStyles(segments, points, baseStyle, segmentOptions);
+  return doSplitByStyles(line, segments, points, segmentOptions);
 }
 
 /**
+ * @param {LineElement} line
  * @param {Segment[]} segments
  * @param {PointElement[]} points
  * @param {object} [segmentOptions]
  * @return {Segment[]}
  */
-function doSplitByStyles(segments, points, baseStyle, segmentOptions) {
+function doSplitByStyles(line, segments, points, segmentOptions) {
+  const baseStyle = readStyle(line.options);
   const count = points.length;
   const result = [];
   let start = segments[0].start;
@@ -285,7 +286,14 @@ function doSplitByStyles(segments, points, baseStyle, segmentOptions) {
     let style;
     for (i = start + 1; i <= segment.end; i++) {
       const pt = points[i % count];
-      style = readStyle(segmentOptions.setContext({type: 'segment', p0: prev, p1: pt}));
+      style = readStyle(segmentOptions.setContext({
+        type: 'segment',
+        p0: prev,
+        p1: pt,
+        p0DataIndex: (i - 1) % count,
+        p1DataIndex: i % count,
+        datasetIndex: line._datasetIndex
+      }));
       if (styleChanged(style, prevStyle)) {
         result.push({start: start, end: i - 1, loop: segment.loop, style: prevStyle});
         prevStyle = style;
index 4b1e36e402fc65559b1eca8286688c9af9c6946d..ccd1838cdb9a8c40de69c0500e40ac84b8006286 100644 (file)
@@ -28,7 +28,10 @@ export interface ScriptableContext<TType extends ChartType> {
 export interface ScriptableLineSegmentContext {
   type: 'segment',
   p0: PointElement,
-  p1: PointElement
+  p1: PointElement,
+  p0DataIndex: number,
+  p1DataIndex: number,
+  datasetIndex: number
 }
 
 export type Scriptable<T, TContext> = T | ((ctx: TContext, options: AnyObject) => T);