From 772b87f698e836ece8cfdd371fc5c34e15307d3c Mon Sep 17 00:00:00 2001 From: stockiNail Date: Thu, 19 May 2022 10:54:44 +0200 Subject: [PATCH 1/6] Enable callout in the label of line annotation --- docs/.vuepress/config.js | 1 + docs/guide/types/line.md | 23 +++++ docs/samples/line/callout.md | 179 +++++++++++++++++++++++++++++++++++ src/types/line.js | 22 ++++- types/label.d.ts | 17 ++++ types/options.d.ts | 17 ---- 6 files changed, 237 insertions(+), 22 deletions(-) create mode 100644 docs/samples/line/callout.md diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index 6ab53be47..21595b76c 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -140,6 +140,7 @@ module.exports = { 'line/limited', 'line/average', 'line/standardDeviation', + 'line/callout', 'line/visibility', 'line/labelVisibility', 'line/canvas', diff --git a/docs/guide/types/line.md b/docs/guide/types/line.md index 07037feeb..389ea21f1 100644 --- a/docs/guide/types/line.md +++ b/docs/guide/types/line.md @@ -139,6 +139,7 @@ All of these options can be [Scriptable](../options#scriptable-options) | [`borderRadius`](#borderradius) | `number` \| `object` | `6` | Radius of label box corners in pixels. | `borderShadowColor` | [`Color`](../options#color) | `'transparent'` | The color of border shadow of the box where the label is located. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/shadowColor). | `borderWidth` | `number` | `0` | The border line width (in pixels). +| [`callout`](#callout) | `object` | | Can connect the label to the line. See [callout](#callout). | `color` | [`Color`](../options#color) | `'#fff'` | Text color. | `content` | `string`\|`string[]`\|[`Image`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/Image)\|[`HTMLCanvasElement`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement) | `null` | The content to show in the label. | `display` | `boolean` | `false` | Whether or not the label is shown. @@ -162,6 +163,28 @@ All of these options can be [Scriptable](../options#scriptable-options) If this value is a number, it is applied to all corners of the rectangle (topLeft, topRight, bottomLeft, bottomRight). If this value is an object, the `topLeft` property defines the top-left corners border radius. Similarly, the `topRight`, `bottomLeft`, and `bottomRight` properties can also be specified. Omitted corners have radius of 0. +### Callout + +A callout can connect the label to the line when the label is arbitrarily (by `xAdjust` and `yAdjust` options) moved from its original position. + +Namespace: `options.annotations[annotationID].label.callout`, it defines options for the callout on the label of the line annotation. + +All of these options can be [Scriptable](../options#scriptable-options). + +| Name | Type | Default | Notes +| ---- | ---- | :----: | ---- +| `borderCapStyle` | `string` | `'butt'` | Cap style of the border line of callout. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineCap). +| `borderColor` | [`Color`](../options#color) | `undefined` | Stroke color of the pointer of the callout. +| `borderDash` | `number[]` | `[]` | Length and spacing of dashes of callout. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash). +| `borderDashOffset` | `number` | `0` | Offset for line dashes of callout. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineDashOffset). +| `borderJoinStyle` | `string` | `'miter'` | Border line join style of the callout. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin). +| `borderWidth` | `number` | `1` | Stroke width of the pointer of the callout. +| `display` | `boolean` | `false` | If true, the callout is drawn. +| `margin` | `number` | `5` | Amount of pixels between the label and the callout separator. +| `position` | `string` | `'auto'` | The position of callout, with respect to the label. Could be `left`, `top`, `right`, `bottom` or `auto`. +| `side` | `number` | `5` | Width of the starter line of callout pointer. +| `start` | `number`\|`string` | `'50%'` | The percentage of the separator dimension to use as starting point for callout pointer. Could be set in pixel by a number, or in percentage of the separator dimension by a string. + ## Arrow heads Namespace: `options.annotations[annotationID].arrowHeads`, it defines options for the line annotation arrow heads. diff --git a/docs/samples/line/callout.md b/docs/samples/line/callout.md new file mode 100644 index 000000000..e00face94 --- /dev/null +++ b/docs/samples/line/callout.md @@ -0,0 +1,179 @@ +# Callout + +```js chart-editor +// +const DATA_COUNT = 16; +const MIN = 20; +const MAX = 100; + +Utils.srand(8); + +const labels = []; +for (let i = 0; i < DATA_COUNT; ++i) { + labels.push('' + i); +} + +const numberCfg = {count: DATA_COUNT, min: MIN, max: MAX}; + +const data = { + labels: labels, + datasets: [{ + data: Utils.numbers(numberCfg) + }] +}; +// + +// +const annotation1 = { + type: 'line', + borderColor: 'rgb(100, 149, 237)', + borderDash: [6, 6], + borderDashOffset: 0, + borderWidth: 3, + label: { + display: true, + backgroundColor: 'rgb(100, 149, 237)', + content: (ctx) => 'Average: ' + average(ctx).toFixed(2) + }, + scaleID: 'y', + value: (ctx) => average(ctx) +}; +// + +// +const annotation2 = { + type: 'line', + borderColor: 'rgba(102, 102, 102, 0.5)', + borderDash: [6, 6], + borderDashOffset: 0, + borderWidth: 3, + label: { + display: true, + backgroundColor: 'rgba(102, 102, 102, 0.5)', + borderWidth: 1, + borderColor: 'rgba(102, 102, 102, 0.5)', + callout: { + display: true, + borderColor: 'rgba(102, 102, 102, 0.5)', + borderDash: [6, 6], + borderWidth: 2, + margin: 0 + }, + color: 'black', + content: (ctx) => (average(ctx) + standardDeviation(ctx)).toFixed(2), + position: 'start', + xAdjust: 100, + yAdjust: -50 + }, + scaleID: 'y', + value: (ctx) => average(ctx) + standardDeviation(ctx) +}; +// + +// +const annotation3 = { + type: 'line', + borderColor: 'rgba(102, 102, 102, 0.5)', + borderDash: [6, 6], + borderDashOffset: 0, + borderWidth: 3, + label: { + display: true, + backgroundColor: 'rgba(102, 102, 102, 0.5)', + borderWidth: 1, + borderColor: 'rgba(102, 102, 102, 0.5)', + callout: { + display: true, + borderColor: 'rgba(102, 102, 102, 0.5)', + borderDash: [6, 6], + borderWidth: 2, + margin: 0 + }, + color: 'black', + content: (ctx) => (average(ctx) - standardDeviation(ctx)).toFixed(2), + position: 'end', + xAdjust: -100, + yAdjust: 50 + }, + scaleID: 'y', + value: (ctx) => average(ctx) - standardDeviation(ctx) +}; +// + +/* */ +const config = { + type: 'line', + data, + options: { + scale: { + y: { + beginAtZero: true, + max: 120, + min: 0 + } + }, + plugins: { + annotation: { + annotations: { + annotation1, + annotation2, + annotation3 + } + } + } + } +}; +/* */ + +// +function average(ctx) { + const values = ctx.chart.data.datasets[0].data; + return values.reduce((a, b) => a + b, 0) / values.length; +} + +function standardDeviation(ctx) { + const values = ctx.chart.data.datasets[0].data; + const n = values.length; + const mean = average(ctx); + return Math.sqrt(values.map(x => Math.pow(x - mean, 2)).reduce((a, b) => a + b) / n); +} + +// + +const actions = [ + { + name: 'Randomize', + handler: function(chart) { + chart.data.datasets.forEach(function(dataset, i) { + dataset.data = dataset.data.map(() => Utils.rand(MIN, MAX)); + }); + chart.update(); + } + }, + { + name: 'Add data', + handler: function(chart) { + chart.data.labels.push(chart.data.labels.length); + chart.data.datasets.forEach(function(dataset, i) { + dataset.data.push(Utils.rand(MIN, MAX)); + }); + chart.update(); + } + }, + { + name: 'Remove data', + handler: function(chart) { + chart.data.labels.shift(); + chart.data.datasets.forEach(function(dataset, i) { + dataset.data.shift(); + }); + chart.update(); + } + } +]; + +module.exports = { + actions: actions, + config: config, +}; +``` diff --git a/src/types/line.js b/src/types/line.js index 78b871dca..bc7923304 100644 --- a/src/types/line.js +++ b/src/types/line.js @@ -148,7 +148,17 @@ LineAnnotation.defaults = { borderShadowColor: 'transparent', borderWidth: 0, callout: { - display: false + borderCapStyle: 'butt', + borderColor: undefined, + borderDash: [], + borderDashOffset: 0, + borderJoinStyle: 'miter', + borderWidth: 1, + display: false, + margin: 5, + position: 'auto', + side: 5, + start: '50%', }, color: '#fff', content: null, @@ -272,8 +282,6 @@ function applyScaleValueToDimension(area, scale, options) { } function resolveLabelElementProperties(chart, properties, options) { - // TODO to remove by another PR to enable callout for line label - options.callout.display = false; const borderWidth = options.borderWidth; const padding = toPadding(options.padding); const textSize = measureLabelSize(chart.ctx, options); @@ -300,8 +308,10 @@ function calculateLabelPosition(properties, label, sizes, chartArea) { const pt = pointInLine(p1, p2, t); const xCoordinateSizes = {size: size.w, min: chartArea.left, max: chartArea.right, padding: padding.left}; const yCoordinateSizes = {size: size.h, min: chartArea.top, max: chartArea.bottom, padding: padding.top}; - const centerX = adjustLabelCoordinate(pt.x, xCoordinateSizes) + xAdjust; - const centerY = adjustLabelCoordinate(pt.y, yCoordinateSizes) + yAdjust; + const pointX = adjustLabelCoordinate(pt.x, xCoordinateSizes); + const pointY = adjustLabelCoordinate(pt.y, yCoordinateSizes); + const centerX = pointX + xAdjust; + const centerY = pointY + yAdjust; return { x: centerX - (width / 2), y: centerY - (height / 2), @@ -309,6 +319,8 @@ function calculateLabelPosition(properties, label, sizes, chartArea) { y2: centerY + (height / 2), centerX, centerY, + pointX, + pointY, width, height, rotation: toDegrees(rotation) diff --git a/types/label.d.ts b/types/label.d.ts index ce6e34cfc..5f63ffb80 100644 --- a/types/label.d.ts +++ b/types/label.d.ts @@ -2,6 +2,20 @@ import { Color, FontSpec, BorderRadius } from 'chart.js'; import { PartialEventContext } from './events'; import { DrawTime, Scriptable, ShadowOptions } from './options'; +export interface CalloutOptions { + borderCapStyle?: Scriptable, + borderColor?: Scriptable, + borderDash?: Scriptable, + borderDashOffset?: Scriptable, + borderJoinStyle?: Scriptable, + borderWidth?: Scriptable, + display?: Scriptable, + margin?: Scriptable, + position?: Scriptable, + side?: Scriptable, + start?: Scriptable, +} + export interface CoreLabelOptions { drawTime?: Scriptable, font?: FontSpec @@ -77,6 +91,7 @@ export interface ContainedLabelOptions extends CoreLabelOptions { * @default 6 */ borderRadius?: Scriptable, + callout?: CalloutOptions, } export interface LabelOptions extends ContainedLabelOptions, ShadowOptions { @@ -107,6 +122,8 @@ export interface LabelTypeOptions extends ContainedLabelOptions { position?: Scriptable, } +export type CalloutPosition = 'left' | 'top' | 'bottom' | 'right' | 'auto'; + type percentString = string; export type LabelPosition = 'start' | 'center' | 'end' | percentString; diff --git a/types/options.d.ts b/types/options.d.ts index 3295c04eb..caa75e27a 100644 --- a/types/options.d.ts +++ b/types/options.d.ts @@ -119,24 +119,7 @@ export interface PointAnnotationOptions extends CoreAnnotationOptions, Annotatio yAdjust?: Scriptable, } -export type CalloutPosition = 'left' | 'top' | 'bottom' | 'right' | 'auto'; - -export interface CalloutOptions { - borderCapStyle?: Scriptable, - borderColor?: Scriptable, - borderDash?: Scriptable, - borderDashOffset?: Scriptable, - borderJoinStyle?: Scriptable, - borderWidth?: Scriptable, - display?: Scriptable, - margin?: Scriptable, - position?: Scriptable, - side?: Scriptable, - start?: Scriptable, -} - export interface LabelAnnotationOptions extends CoreAnnotationOptions, LabelTypeOptions, AnnotationPointCoordinates { - callout?: CalloutOptions, rotation?: Scriptable } From 0cbb94fb878530bbcf290329c1354d690e058eb3 Mon Sep 17 00:00:00 2001 From: stockiNail Date: Thu, 19 May 2022 14:28:12 +0200 Subject: [PATCH 2/6] adds test cases --- src/types/line.js | 10 +- test/fixtures/line/labelCallout.js | 106 ++++++++++++++++++ test/fixtures/line/labelCallout.png | Bin 0 -> 19740 bytes test/fixtures/line/labelCalloutRotation.js | 112 ++++++++++++++++++++ test/fixtures/line/labelCalloutRotation.png | Bin 0 -> 23702 bytes 5 files changed, 222 insertions(+), 6 deletions(-) create mode 100644 test/fixtures/line/labelCallout.js create mode 100644 test/fixtures/line/labelCallout.png create mode 100644 test/fixtures/line/labelCalloutRotation.js create mode 100644 test/fixtures/line/labelCalloutRotation.png diff --git a/src/types/line.js b/src/types/line.js index bc7923304..9b461384a 100644 --- a/src/types/line.js +++ b/src/types/line.js @@ -308,10 +308,8 @@ function calculateLabelPosition(properties, label, sizes, chartArea) { const pt = pointInLine(p1, p2, t); const xCoordinateSizes = {size: size.w, min: chartArea.left, max: chartArea.right, padding: padding.left}; const yCoordinateSizes = {size: size.h, min: chartArea.top, max: chartArea.bottom, padding: padding.top}; - const pointX = adjustLabelCoordinate(pt.x, xCoordinateSizes); - const pointY = adjustLabelCoordinate(pt.y, yCoordinateSizes); - const centerX = pointX + xAdjust; - const centerY = pointY + yAdjust; + const centerX = adjustLabelCoordinate(pt.x, xCoordinateSizes) + xAdjust; + const centerY = adjustLabelCoordinate(pt.y, yCoordinateSizes) + yAdjust; return { x: centerX - (width / 2), y: centerY - (height / 2), @@ -319,8 +317,8 @@ function calculateLabelPosition(properties, label, sizes, chartArea) { y2: centerY + (height / 2), centerX, centerY, - pointX, - pointY, + pointX: pt.x, + pointY: pt.y, width, height, rotation: toDegrees(rotation) diff --git a/test/fixtures/line/labelCallout.js b/test/fixtures/line/labelCallout.js new file mode 100644 index 000000000..dd87b33e7 --- /dev/null +++ b/test/fixtures/line/labelCallout.js @@ -0,0 +1,106 @@ +module.exports = { + config: { + type: 'scatter', + options: { + scales: { + x: { + display: false, + min: 0, + max: 10 + }, + y: { + display: false, + min: 0, + max: 10 + } + }, + plugins: { + annotation: { + annotations: { + line1: { + type: 'line', + scaleID: 'y', + value: 8, + borderColor: 'black', + borderWidth: 5, + label: { + display: true, + backgroundColor: '#f5f5f5', + borderColor: 'black', + borderRadius: 0, + borderWidth: 1, + content: 'yAdjust: -40, callout position: auto', + yAdjust: -40, + callout: { + display: true + } + } + }, + line2: { + type: 'line', + scaleID: 'y', + value: 6, + borderColor: 'black', + borderWidth: 5, + label: { + display: true, + backgroundColor: '#f5f5f5', + borderColor: 'black', + borderRadius: 0, + borderWidth: 1, + content: ['yAdjust: -40, xAdjust: -150', 'callout position: auto'], + yAdjust: -40, + xAdjust: -150, + callout: { + display: true + } + } + }, + line3: { + type: 'line', + scaleID: 'y', + value: 4, + borderColor: 'black', + borderWidth: 5, + label: { + display: true, + backgroundColor: '#f5f5f5', + borderColor: 'black', + borderRadius: 0, + borderWidth: 1, + content: ['yAdjust: 40, xAdjust: 150', 'callout position: auto'], + yAdjust: 40, + xAdjust: 150, + callout: { + display: true + } + } + }, + line4: { + type: 'line', + scaleID: 'y', + value: 2, + borderColor: 'black', + borderWidth: 5, + label: { + display: true, + backgroundColor: '#f5f5f5', + borderColor: 'black', + borderRadius: 0, + borderWidth: 1, + content: 'yAdjust: 40, callout position: auto', + yAdjust: 40, + callout: { + display: true + } + } + } + } + } + } + } + }, + options: { + spriteText: true + } +}; diff --git a/test/fixtures/line/labelCallout.png b/test/fixtures/line/labelCallout.png new file mode 100644 index 0000000000000000000000000000000000000000..25c42bde28cf5752b2d368b84113615cb7e4e26c GIT binary patch literal 19740 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 LKb?2VHu!%56?rML literal 0 HcmV?d00001 diff --git a/test/fixtures/line/labelCalloutRotation.js b/test/fixtures/line/labelCalloutRotation.js new file mode 100644 index 000000000..34b972ae0 --- /dev/null +++ b/test/fixtures/line/labelCalloutRotation.js @@ -0,0 +1,112 @@ +module.exports = { + config: { + type: 'scatter', + options: { + scales: { + x: { + display: false, + min: 0, + max: 10 + }, + y: { + display: false, + min: 0, + max: 10 + } + }, + plugins: { + annotation: { + annotations: { + line1: { + type: 'line', + scaleID: 'y', + value: 8, + borderColor: 'black', + borderWidth: 5, + label: { + display: true, + backgroundColor: '#f5f5f5', + borderColor: 'black', + borderRadius: 0, + borderWidth: 1, + content: 'rotation: 45', + rotation: 45, + xAdjust: 40, + yAdjust: -60, + callout: { + display: true + } + } + }, + line2: { + type: 'line', + scaleID: 'y', + value: 6, + borderColor: 'black', + borderWidth: 5, + label: { + display: true, + backgroundColor: '#f5f5f5', + borderColor: 'black', + borderRadius: 0, + borderWidth: 1, + content: 'rotation: -45', + rotation: -45, + xAdjust: 40, + yAdjust: -60, + callout: { + display: true + } + } + }, + line3: { + type: 'line', + scaleID: 'y', + value: 4, + borderColor: 'black', + borderWidth: 5, + label: { + display: true, + backgroundColor: '#f5f5f5', + borderColor: 'black', + borderRadius: 0, + borderWidth: 1, + content: 'rotation: 45', + rotation: 45, + xAdjust: -40, + yAdjust: 60, + callout: { + display: true + } + } + }, + line4: { + type: 'line', + scaleID: 'y', + value: 2, + borderColor: 'black', + borderWidth: 5, + label: { + display: true, + backgroundColor: '#f5f5f5', + borderColor: 'black', + borderRadius: 0, + borderWidth: 1, + content: 'rotation: -45', + rotation: -45, + xAdjust: -40, + yAdjust: 60, + callout: { + display: true + } + } + } + } + } + } + } + }, + options: { + spriteText: true + } +}; diff --git a/test/fixtures/line/labelCalloutRotation.png b/test/fixtures/line/labelCalloutRotation.png new file mode 100644 index 0000000000000000000000000000000000000000..e01d6d59033975ba05cb2d662c6aee227ae912ac GIT binary patch literal 23702 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 P@Uz`v$Cd*71Lyt^e4oOU literal 0 HcmV?d00001 From 5cc29866f4285bf5320ca3228794a0552e6663a1 Mon Sep 17 00:00:00 2001 From: stockiNail Date: Thu, 19 May 2022 21:11:56 +0200 Subject: [PATCH 3/6] adds test case with oblique labels and auto rotation --- .../line/labelCalloutWithAutoRotation.js | 117 ++++++++++++++++++ .../line/labelCalloutWithAutoRotation.png | Bin 0 -> 47524 bytes 2 files changed, 117 insertions(+) create mode 100644 test/fixtures/line/labelCalloutWithAutoRotation.js create mode 100644 test/fixtures/line/labelCalloutWithAutoRotation.png diff --git a/test/fixtures/line/labelCalloutWithAutoRotation.js b/test/fixtures/line/labelCalloutWithAutoRotation.js new file mode 100644 index 000000000..f1768182c --- /dev/null +++ b/test/fixtures/line/labelCalloutWithAutoRotation.js @@ -0,0 +1,117 @@ +module.exports = { + config: { + type: 'scatter', + options: { + scales: { + x: { + display: false, + min: 0, + max: 10 + }, + y: { + display: false, + min: 0, + max: 10 + } + }, + plugins: { + annotation: { + annotations: { + line1: { + type: 'line', + scaleID: 'y', + value: 8, + endValue: 10, + borderColor: 'black', + borderWidth: 5, + label: { + display: true, + backgroundColor: '#f5f5f5', + borderColor: 'black', + borderRadius: 0, + borderWidth: 1, + content: 'position: start', + rotation: 'auto', + position: 'start', + yAdjust: -40, + callout: { + display: true + } + } + }, + line2: { + type: 'line', + scaleID: 'y', + value: 6, + endValue: 8, + borderColor: 'black', + borderWidth: 5, + label: { + display: true, + backgroundColor: '#f5f5f5', + borderColor: 'black', + borderRadius: 0, + borderWidth: 1, + content: 'position: end', + rotation: 'auto', + position: 'end', + yAdjust: -40, + callout: { + display: true, + position: 'bottom' + } + } + }, + line3: { + type: 'line', + scaleID: 'y', + value: 4, + endValue: 6, + borderColor: 'black', + borderWidth: 5, + label: { + display: true, + backgroundColor: '#f5f5f5', + borderColor: 'black', + borderRadius: 0, + borderWidth: 1, + content: ['yAdjust: 40, xAdjust: 150', 'callout position: auto'], + rotation: 'auto', + position: '50%', + yAdjust: -40, + callout: { + display: true + } + } + }, + line4: { + type: 'line', + scaleID: 'y', + value: 2, + endValue: 4, + borderColor: 'black', + borderWidth: 5, + label: { + display: true, + backgroundColor: '#f5f5f5', + borderColor: 'black', + borderRadius: 0, + borderWidth: 1, + content: 'yAdjust: 40, callout position: auto', + rotation: 'auto', + position: '75', + yAdjust: -40, + callout: { + display: true + } + } + } + } + } + } + } + }, + options: { + spriteText: true + } +}; diff --git a/test/fixtures/line/labelCalloutWithAutoRotation.png b/test/fixtures/line/labelCalloutWithAutoRotation.png new file mode 100644 index 0000000000000000000000000000000000000000..8c71e43539c0bef9eea7798aefc18228de494068 GIT binary patch literal 47524 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 literal 0 HcmV?d00001 From 69b9f8a8be68d64fab3d1b01e2de2d4f67e0d4bd Mon Sep 17 00:00:00 2001 From: stockiNail Date: Sun, 22 May 2022 19:06:36 +0200 Subject: [PATCH 4/6] solves CC issue of duplicate code --- src/types/line.js | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/src/types/line.js b/src/types/line.js index 5f8251abf..ef1da849a 100644 --- a/src/types/line.js +++ b/src/types/line.js @@ -1,6 +1,7 @@ import {Element} from 'chart.js'; import {PI, toRadians, toDegrees, toPadding} from 'chart.js/helpers'; import {EPSILON, clamp, scaleValue, measureLabelSize, getRelativePosition, setBorderStyle, setShadowStyle, getElementCenterPoint, retrieveScaleID, getDimensionByScale} from '../helpers'; +import LabelAnnotation from './label'; const pointInLine = (p1, p2, t) => ({x: p1.x + t * (p2.x - p1.x), y: p1.y + t * (p2.y - p1.y)}); const interpolateX = (y, p1, p2) => pointInLine(p1, p2, Math.abs((y - p1.y) / (p2.y - p1.y))).x; @@ -147,19 +148,7 @@ LineAnnotation.defaults = { borderRadius: 6, borderShadowColor: 'transparent', borderWidth: 0, - callout: { - borderCapStyle: 'butt', - borderColor: undefined, - borderDash: [], - borderDashOffset: 0, - borderJoinStyle: 'miter', - borderWidth: 1, - display: false, - margin: 5, - position: 'auto', - side: 5, - start: '50%', - }, + callout: Object.assign({}, LabelAnnotation.defaults.callout), color: '#fff', content: null, display: false, From 962ee4be6485b9964677f981d89a276f7aed0de7 Mon Sep 17 00:00:00 2001 From: stockiNail Date: Mon, 6 Jun 2022 12:07:18 +0200 Subject: [PATCH 5/6] Add element diagrams to the annotation types guide --- docs/guide/types/box.md | 8 ++++++++ docs/guide/types/ellipse.md | 6 ++++++ docs/guide/types/label.md | 6 ++++++ docs/guide/types/line.md | 8 ++++++++ docs/guide/types/point.md | 6 ++++++ docs/guide/types/polygon.md | 6 ++++++ 6 files changed, 40 insertions(+) diff --git a/docs/guide/types/box.md b/docs/guide/types/box.md index 021f88ec2..9c6a16408 100644 --- a/docs/guide/types/box.md +++ b/docs/guide/types/box.md @@ -138,3 +138,11 @@ A position can be set in 2 different values types: If this value is a string (possible options are `'start'`, `'center'`, `'end'` or a string in percentage format), it is applied to vertical and horizontal position in the box. If this value is an object, the `x` property defines the horizontal alignment in the box. Similarly, the `y` property defines the vertical alignment in the box. Possible options for both properties are `'start'`, `'center'`, `'end'`, a string in percentage format. Omitted property have value of the default, `'center'`. + +## Element + +The following diagram is showing the element properties about a `'box'` annotation: + +![box](../../img/elementBoxProps.png) + +The label of a box annotation is described as a [label annotation](./label#element) and accessible by `element.label`. diff --git a/docs/guide/types/ellipse.md b/docs/guide/types/ellipse.md index f78b081a1..4ead77c7c 100644 --- a/docs/guide/types/ellipse.md +++ b/docs/guide/types/ellipse.md @@ -91,3 +91,9 @@ If one of the axes does not match an axis in the chart, the ellipse will take th | `shadowBlur` | The amount of blur applied to shadow. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/shadowBlur). | `shadowOffsetX` | The distance that shadow will be offset horizontally. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/shadowOffsetX). | `shadowOffsetY` | The distance that shadow will be offset vertically. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/shadowOffsetY). + +## Element + +The following diagram is showing the element properties about a `'ellipse'` annotation: + +![ellipse](../../img/elementEllipseProps.png) diff --git a/docs/guide/types/label.md b/docs/guide/types/label.md index 8ab09f698..e02af9ebc 100644 --- a/docs/guide/types/label.md +++ b/docs/guide/types/label.md @@ -217,3 +217,9 @@ All of these options can be [Scriptable](../options#scriptable-options). | `position` | `string` | `'auto'` | The position of callout, with respect to the label. Could be `left`, `top`, `right`, `bottom` or `auto`. | `side` | `number` | `5` | Width of the starter line of callout pointer. | `start` | `number`\|`string` | `'50%'` | The percentage of the separator dimension to use as starting point for callout pointer. Could be set in pixel by a number, or in percentage of the separator dimension by a string. + +## Element + +The following diagram is showing the element properties about a `'label'` annotation: + +![label](../../img/elementLabelProps.png) diff --git a/docs/guide/types/line.md b/docs/guide/types/line.md index 6afb0479d..ea55e8534 100644 --- a/docs/guide/types/line.md +++ b/docs/guide/types/line.md @@ -184,3 +184,11 @@ All of these options can be [Scriptable](../options#scriptable-options) | `shadowOffsetX` | `number` | `lineAnnotation.shadowOffsetX` | The distance that shadow, of the arrow head, will be offset horizontally. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/shadowOffsetX). | `shadowOffsetY` | `number` | `lineAnnotation.shadowOffsetY` | The distance that shadow, of the arrow head, will be offset vertically. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/shadowOffsetY). | `width` | `number` | `6` | The width of the arrow head in pixels. + +## Element + +The following diagram is showing the element properties about a `'line'` annotation: + +![line](../../img/elementLineProps.png) + +The label of a box annotation is described as a [label annotation](./label#element) and accessible by `element.label`. diff --git a/docs/guide/types/point.md b/docs/guide/types/point.md index 84063d2de..9f29a42a0 100644 --- a/docs/guide/types/point.md +++ b/docs/guide/types/point.md @@ -103,3 +103,9 @@ The 4 coordinates, xMin, xMax, yMin, yMax are optional. If not specified, the bo | `shadowBlur` | The amount of blur applied to shadow. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/shadowBlur). | `shadowOffsetX` | The distance that shadow will be offset horizontally. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/shadowOffsetX). | `shadowOffsetY` | The distance that shadow will be offset vertically. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/shadowOffsetY). + +## Element + +The following diagram is showing the element properties about a `'point'` annotation: + +![point](../../img/elementPointProps.png) diff --git a/docs/guide/types/polygon.md b/docs/guide/types/polygon.md index fd9afb368..6476ae141 100644 --- a/docs/guide/types/polygon.md +++ b/docs/guide/types/polygon.md @@ -165,3 +165,9 @@ module.exports = { config }; ``` + +## Element + +The following diagram is showing the element properties about a `'polygon'` annotation: + +![polygon](../../img/elementPolygonProps.png) From aaf1fa74630211980c1de3ff3bf0d57adb8c9866 Mon Sep 17 00:00:00 2001 From: stockiNail Date: Thu, 9 Jun 2022 14:06:05 +0200 Subject: [PATCH 6/6] revert wrong merging --- types/tests/exports.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/types/tests/exports.ts b/types/tests/exports.ts index d146524f0..2f1508689 100644 --- a/types/tests/exports.ts +++ b/types/tests/exports.ts @@ -22,7 +22,11 @@ const chart = new Chart('id', { intersect: true }, common: { - drawTime: 'afterDraw' + drawTime: 'afterDraw', + borderColor: 'red', + label: { + display: true + } }, annotations: [{ type: 'line',