From 28fa957f086564d53de7eb5d40b1f815a73ad9dc Mon Sep 17 00:00:00 2001 From: stockiNail Date: Wed, 1 Jun 2022 17:44:13 +0200 Subject: [PATCH 01/18] Enable initial animation on annotations --- src/elements.js | 10 ++++-- src/helpers/helpers.canvas.js | 4 +-- src/helpers/helpers.chart.js | 2 ++ src/helpers/helpers.options.js | 66 ++++++++++++++++++++++++++++++++++ src/types/box.js | 9 ++--- src/types/ellipse.js | 8 +++-- src/types/label.js | 4 ++- src/types/line.js | 7 ++-- src/types/point.js | 8 +++-- src/types/polygon.js | 9 ++--- 10 files changed, 106 insertions(+), 21 deletions(-) diff --git a/src/elements.js b/src/elements.js index 5d296f7ab..176b1719c 100644 --- a/src/elements.js +++ b/src/elements.js @@ -47,7 +47,7 @@ export function updateElements(chart, state, options, mode) { properties.skip = toSkip(properties); if ('elements' in properties) { - updateSubElements(element, properties, resolver, animations); + updateSubElements(element, properties.elements, resolver, animations); // Remove the sub-element definitions from properties, so the actual elements // are not overwritten by their definitions delete properties.elements; @@ -61,6 +61,10 @@ export function updateElements(chart, state, options, mode) { Object.assign(element, properties); } + const initProperties = properties.initProperties; + if (isObject(initProperties)) { + Object.assign(element, initProperties); + } properties.options = resolveAnnotationOptions(resolver); animations.update(element, properties); @@ -78,13 +82,13 @@ function resolveAnimations(chart, animOpts, mode) { return new Animations(chart, animOpts); } -function updateSubElements(mainElement, {elements, initProperties}, resolver, animations) { +function updateSubElements(mainElement, elements, resolver, animations) { const subElements = mainElement.elements || (mainElement.elements = []); subElements.length = elements.length; for (let i = 0; i < elements.length; i++) { const definition = elements[i]; const properties = definition.properties; - const subElement = getOrCreateElement(subElements, i, definition.type, initProperties); + const subElement = getOrCreateElement(subElements, i, definition.type, definition.initProperties); const subResolver = resolver[definition.optionScope].override(definition); properties.options = resolveAnnotationOptions(subResolver); animations.update(subElement, properties); diff --git a/src/helpers/helpers.canvas.js b/src/helpers/helpers.canvas.js index 5d81d9ede..043a3d53f 100644 --- a/src/helpers/helpers.canvas.js +++ b/src/helpers/helpers.canvas.js @@ -143,10 +143,10 @@ export function drawLabel(ctx, rect, options) { ctx.textBaseline = 'middle'; ctx.textAlign = options.textAlign; if (setTextStrokeStyle(ctx, options)) { - labels.forEach((l, i) => ctx.strokeText(l, x, y + (i * lh))); + labels.forEach((l, i) => ctx.strokeText(l, x, y + (i * lh), rect.width)); } ctx.fillStyle = options.color; - labels.forEach((l, i) => ctx.fillText(l, x, y + (i * lh))); + labels.forEach((l, i) => ctx.fillText(l, x, y + (i * lh), rect.width)); ctx.restore(); } diff --git a/src/helpers/helpers.chart.js b/src/helpers/helpers.chart.js index f29086f08..f8299a366 100644 --- a/src/helpers/helpers.chart.js +++ b/src/helpers/helpers.chart.js @@ -137,6 +137,7 @@ export function resolvePointProperties(chart, options) { y2: box.y + size + options.yAdjust, centerX: box.centerX + options.xAdjust, centerY: box.centerY + options.yAdjust, + radius, width: size, height: size }; @@ -154,6 +155,7 @@ function getChartCircle(chart, options) { y2: point.y + options.radius + options.yAdjust, centerX: point.x + options.xAdjust, centerY: point.y + options.yAdjust, + radius: options.radius, width: size, height: size }; diff --git a/src/helpers/helpers.options.js b/src/helpers/helpers.options.js index b800d02e0..e049a84f0 100644 --- a/src/helpers/helpers.options.js +++ b/src/helpers/helpers.options.js @@ -1,10 +1,36 @@ import {isObject, valueOrDefault, defined} from 'chart.js/helpers'; import {clamp} from './helpers.core'; +const animationModes = { + fade: (area, {centerX, centerY}) => ({x: centerX, y: centerY, x2: centerX, y2: centerY, width: 0, height: 0}), + left: () => ({x: 0, x2: 0}), + top: () => ({y: 0, y2: 0}), + right: (area) => ({x: area.right, x2: area.right}), + bottom: (area) => ({y: area.bottom, y2: area.bottom}), + topLeft: () => ({x: 0, x2: 0, y: 0, y2: 0}), + topRight: (area) => ({x: area.right, x2: area.right, y: 0, y2: 0}), + bottomLeft: (area) => ({x: 0, x2: 0, y: area.bottom, y2: area.bottom}), + bottomRight: (area) => ({x: area.right, x2: area.right, y: area.bottom, y2: area.bottom}), +}; + +const pointAnimationModes = { + fade: (area, {centerX, centerY}) => ({centerX, centerY, radius: 0, width: 0, height: 0}), + left: () => ({centerX: 0}), + top: () => ({centerY: 0}), + right: (area) => ({centerX: area.right}), + bottom: (area) => ({centerY: area.bottom}), + topLeft: () => ({centerX: 0, centerY: 0}), + topRight: (area) => ({centerX: area.right, centerY: 0}), + bottomLeft: (area) => ({centerX: 0, centerY: area.bottom}), + bottomRight: (area) => ({centerX: area.right, centerY: area.bottom}), +}; + const isPercentString = (s) => typeof s === 'string' && s.endsWith('%'); const toPercent = (s) => clamp(parseFloat(s) / 100, 0, 1); /** + * @typedef { import("chart.js").Chart } Chart + * @typedef { import('../../types/element').AnnotationBoxModel } AnnotationBoxModel * @typedef { import('../../types/options').AnnotationPointCoordinates } AnnotationPointCoordinates * @typedef { import('../../types/label').CoreLabelOptions } CoreLabelOptions * @typedef { import('../../types/label').LabelPositionObject } LabelPositionObject @@ -85,3 +111,43 @@ export function toPosition(value) { export function isBoundToPoint(options) { return options && (defined(options.xValue) || defined(options.yValue)); } + +/** + * @param {Chart} chart + * @param {AnnotationBoxModel} properties + * @param {CoreAnnotationOptions} options + * @param {boolean} [centerBased=false] + * @param {boolean} [useRadius=false] + * @returns {AnnotationBoxModel} + */ +export function initAnimationProperties(chart, properties, options, centerBased = false, useRadius = false) { + const {mode, fade} = toAnimationMode(options.initAnimation); + if (mode) { + const modes = centerBased ? pointAnimationModes : animationModes; + const modeImpl = modes[mode]; + if (modeImpl) { + const animProps = modeImpl(chart.chartArea, properties); + if (fade) { + if (useRadius) { + animProps.radius = 0; + } else { + animProps.width = 0; + animProps.height = 0; + } + } + return animProps; + } + } +} + +function toAnimationMode(value) { + if (isObject(value)) { + return { + mode: value.mode, + fade: value.fade === true, + }; + } + return { + mode: value + }; +} diff --git a/src/types/box.js b/src/types/box.js index 32a726e74..82b167869 100644 --- a/src/types/box.js +++ b/src/types/box.js @@ -1,6 +1,6 @@ import {Element} from 'chart.js'; import {toPadding, toRadians} from 'chart.js/helpers'; -import {drawBox, getRelativePosition, measureLabelSize, resolveBoxProperties, toPosition, inBoxRange, rotated, translate, getElementCenterPoint} from '../helpers'; +import {drawBox, getRelativePosition, measureLabelSize, resolveBoxProperties, toPosition, inBoxRange, rotated, translate, getElementCenterPoint, initAnimationProperties} from '../helpers'; export default class BoxAnnotation extends Element { @@ -40,13 +40,13 @@ export default class BoxAnnotation extends Element { resolveElementProperties(chart, options) { const properties = resolveBoxProperties(chart, options); - const {x, y} = properties; + properties.initProperties = initAnimationProperties(chart, properties, options); properties.elements = [{ type: 'label', optionScope: 'label', - properties: resolveLabelElementProperties(chart, properties, options) + properties: resolveLabelElementProperties(chart, properties, options), + initProperties: properties.initProperties }]; - properties.initProperties = {x, y}; return properties; } } @@ -64,6 +64,7 @@ BoxAnnotation.defaults = { borderShadowColor: 'transparent', borderWidth: 1, display: true, + initAnimation: undefined, label: { backgroundColor: 'transparent', borderWidth: 0, diff --git a/src/types/ellipse.js b/src/types/ellipse.js index e6a4783fb..b3ea45e64 100644 --- a/src/types/ellipse.js +++ b/src/types/ellipse.js @@ -1,6 +1,6 @@ import {Element} from 'chart.js'; import {PI, toRadians} from 'chart.js/helpers'; -import {EPSILON, resolveBoxProperties, setBorderStyle, setShadowStyle, rotated, translate, getElementCenterPoint} from '../helpers'; +import {EPSILON, resolveBoxProperties, setBorderStyle, setShadowStyle, rotated, translate, getElementCenterPoint, initAnimationProperties} from '../helpers'; export default class EllipseAnnotation extends Element { @@ -23,7 +23,6 @@ export default class EllipseAnnotation extends Element { draw(ctx) { const {width, height, centerX, centerY, options} = this; - ctx.save(); translate(ctx, this.getCenterPoint(), options.rotation); setShadowStyle(ctx, this.options); @@ -40,7 +39,9 @@ export default class EllipseAnnotation extends Element { } resolveElementProperties(chart, options) { - return resolveBoxProperties(chart, options); + const properties = resolveBoxProperties(chart, options); + properties.initProperties = initAnimationProperties(chart, properties, options, true); + return properties; } } @@ -55,6 +56,7 @@ EllipseAnnotation.defaults = { borderShadowColor: 'transparent', borderWidth: 1, display: true, + initAnimation: undefined, rotation: 0, shadowBlur: 0, shadowOffsetX: 0, diff --git a/src/types/label.js b/src/types/label.js index 169f43d2e..60f0aabb3 100644 --- a/src/types/label.js +++ b/src/types/label.js @@ -1,5 +1,5 @@ import {Element} from 'chart.js'; -import {drawBox, drawLabel, measureLabelSize, getChartPoint, toPosition, setBorderStyle, getSize, inBoxRange, isBoundToPoint, resolveBoxProperties, getRelativePosition, translate, rotated, getElementCenterPoint} from '../helpers'; +import {drawBox, drawLabel, measureLabelSize, getChartPoint, toPosition, setBorderStyle, getSize, inBoxRange, isBoundToPoint, resolveBoxProperties, getRelativePosition, translate, rotated, getElementCenterPoint, initAnimationProperties} from '../helpers'; import {toPadding, toRadians, distanceBetweenPoints} from 'chart.js/helpers'; const positions = ['left', 'bottom', 'top', 'right']; @@ -46,6 +46,7 @@ export default class LabelAnnotation extends Element { const labelSize = measureLabelSize(chart.ctx, options); const boxSize = measureRect(point, labelSize, options, padding); return { + initProperties: initAnimationProperties(chart, boxSize, options), pointX: point.x, pointY: point.y, ...boxSize, @@ -91,6 +92,7 @@ LabelAnnotation.defaults = { weight: undefined }, height: undefined, + initAnimation: undefined, padding: 6, position: 'center', rotation: 0, diff --git a/src/types/line.js b/src/types/line.js index 78504d45f..8e4b5d6f7 100644 --- a/src/types/line.js +++ b/src/types/line.js @@ -1,6 +1,6 @@ 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 {EPSILON, clamp, scaleValue, measureLabelSize, getRelativePosition, setBorderStyle, setShadowStyle, getElementCenterPoint, retrieveScaleID, getDimensionByScale, initAnimationProperties} from '../helpers'; 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; @@ -92,10 +92,12 @@ export default class LineAnnotation extends Element { if (!inside) { options.label.display = false; } + properties.initProperties = initAnimationProperties(chart, properties, options); properties.elements = [{ type: 'label', optionScope: 'label', - properties: resolveLabelElementProperties(chart, properties, options.label) + properties: resolveLabelElementProperties(chart, properties, options.label), + initProperties: properties.initProperties }]; return properties; } @@ -136,6 +138,7 @@ LineAnnotation.defaults = { borderWidth: 2, display: true, endValue: undefined, + initAnimation: undefined, label: { backgroundColor: 'rgba(0,0,0,0.8)', backgroundShadowColor: 'transparent', diff --git a/src/types/point.js b/src/types/point.js index 97c0dd039..18285eab5 100644 --- a/src/types/point.js +++ b/src/types/point.js @@ -1,6 +1,6 @@ import {Element} from 'chart.js'; import {drawPoint} from 'chart.js/helpers'; -import {inPointRange, getElementCenterPoint, resolvePointProperties, setBorderStyle, setShadowStyle, isImageOrCanvas} from '../helpers'; +import {inPointRange, getElementCenterPoint, resolvePointProperties, setBorderStyle, setShadowStyle, isImageOrCanvas, initAnimationProperties} from '../helpers'; export default class PointAnnotation extends Element { @@ -30,6 +30,7 @@ export default class PointAnnotation extends Element { setShadowStyle(ctx, options); const stroke = setBorderStyle(ctx, options); options.borderWidth = 0; + options.radius = this.radius; drawPoint(ctx, options, this.centerX, this.centerY); if (stroke && !isImageOrCanvas(options.pointStyle)) { ctx.shadowColor = options.borderShadowColor; @@ -40,7 +41,9 @@ export default class PointAnnotation extends Element { } resolveElementProperties(chart, options) { - return resolvePointProperties(chart, options); + const properties = resolvePointProperties(chart, options); + properties.initProperties = initAnimationProperties(chart, properties, options, true, true); + return properties; } } @@ -54,6 +57,7 @@ PointAnnotation.defaults = { borderShadowColor: 'transparent', borderWidth: 1, display: true, + initAnimation: undefined, pointStyle: 'circle', radius: 10, rotation: 0, diff --git a/src/types/polygon.js b/src/types/polygon.js index bcf08e92f..18fee19b9 100644 --- a/src/types/polygon.js +++ b/src/types/polygon.js @@ -1,6 +1,6 @@ import {Element} from 'chart.js'; import {PI, RAD_PER_DEG, toRadians} from 'chart.js/helpers'; -import {setBorderStyle, resolvePointProperties, getElementCenterPoint, setShadowStyle, rotated} from '../helpers'; +import {setBorderStyle, resolvePointProperties, getElementCenterPoint, setShadowStyle, rotated, initAnimationProperties} from '../helpers'; export default class PolygonAnnotation extends Element { @@ -47,16 +47,16 @@ export default class PolygonAnnotation extends Element { resolveElementProperties(chart, options) { const properties = resolvePointProperties(chart, options); - const {x, y} = properties; const {sides, rotation} = options; const elements = []; const angle = (2 * PI) / sides; let rad = rotation * RAD_PER_DEG; for (let i = 0; i < sides; i++, rad += angle) { - elements.push(buildPointElement(properties, options, rad)); + const elProps = buildPointElement(properties, options, rad); + elProps.initProperties = initAnimationProperties(chart, properties, options); + elements.push(elProps); } properties.elements = elements; - properties.initProperties = {x, y}; return properties; } } @@ -73,6 +73,7 @@ PolygonAnnotation.defaults = { borderShadowColor: 'transparent', borderWidth: 1, display: true, + initAnimation: 'fade', point: { radius: 0 }, From 172eb5be25be0d4ed17d6c144272c854a0e4a072 Mon Sep 17 00:00:00 2001 From: stockiNail Date: Wed, 1 Jun 2022 18:52:52 +0200 Subject: [PATCH 02/18] fixes some CC issues --- src/elements.js | 15 +++++++------ src/helpers/helpers.options.js | 41 +++++++++++++++++++--------------- src/types/ellipse.js | 2 +- src/types/point.js | 4 +++- 4 files changed, 35 insertions(+), 27 deletions(-) diff --git a/src/elements.js b/src/elements.js index 176b1719c..b6b530b17 100644 --- a/src/elements.js +++ b/src/elements.js @@ -61,10 +61,7 @@ export function updateElements(chart, state, options, mode) { Object.assign(element, properties); } - const initProperties = properties.initProperties; - if (isObject(initProperties)) { - Object.assign(element, initProperties); - } + applyInitProperties(element, properties.initProperties); properties.options = resolveAnnotationOptions(resolver); animations.update(element, properties); @@ -100,9 +97,7 @@ function getOrCreateElement(elements, index, type, initProperties) { let element = elements[index]; if (!element || !(element instanceof elementClass)) { element = elements[index] = new elementClass(); - if (isObject(initProperties)) { - Object.assign(element, initProperties); - } + applyInitProperties(element, initProperties); } return element; } @@ -152,3 +147,9 @@ function resyncElements(elements, annotations) { } return elements; } + +function applyInitProperties(element, initProperties) { + if (isObject(initProperties)) { + Object.assign(element, initProperties); + } +} diff --git a/src/helpers/helpers.options.js b/src/helpers/helpers.options.js index e049a84f0..6734da0a2 100644 --- a/src/helpers/helpers.options.js +++ b/src/helpers/helpers.options.js @@ -116,27 +116,21 @@ export function isBoundToPoint(options) { * @param {Chart} chart * @param {AnnotationBoxModel} properties * @param {CoreAnnotationOptions} options - * @param {boolean} [centerBased=false] - * @param {boolean} [useRadius=false] + * @param {{centerBased: boolean, useRadius: boolean}} [animOpts={centerBased: false, useRadius: false}] * @returns {AnnotationBoxModel} */ -export function initAnimationProperties(chart, properties, options, centerBased = false, useRadius = false) { +export function initAnimationProperties(chart, properties, options, animOpts = {centerBased: false, useRadius: false}) { + if (!options.initAnimation) { + return; + } + const {centerBased, useRadius} = animOpts; const {mode, fade} = toAnimationMode(options.initAnimation); - if (mode) { - const modes = centerBased ? pointAnimationModes : animationModes; - const modeImpl = modes[mode]; - if (modeImpl) { - const animProps = modeImpl(chart.chartArea, properties); - if (fade) { - if (useRadius) { - animProps.radius = 0; - } else { - animProps.width = 0; - animProps.height = 0; - } - } - return animProps; - } + const modes = centerBased ? pointAnimationModes : animationModes; + const modeImpl = modes[mode]; + if (modeImpl) { + const animProps = modeImpl(chart.chartArea, properties); + applyFading(animProps, fade, useRadius); + return animProps; } } @@ -151,3 +145,14 @@ function toAnimationMode(value) { mode: value }; } + +function applyFading(properties, fade, useRadius) { + if (fade) { + if (useRadius) { + properties.radius = 0; + } else { + properties.width = 0; + properties.height = 0; + } + } +} diff --git a/src/types/ellipse.js b/src/types/ellipse.js index b3ea45e64..f836a67be 100644 --- a/src/types/ellipse.js +++ b/src/types/ellipse.js @@ -40,7 +40,7 @@ export default class EllipseAnnotation extends Element { resolveElementProperties(chart, options) { const properties = resolveBoxProperties(chart, options); - properties.initProperties = initAnimationProperties(chart, properties, options, true); + properties.initProperties = initAnimationProperties(chart, properties, options, {centerBased: true}); return properties; } diff --git a/src/types/point.js b/src/types/point.js index 18285eab5..e95d0543a 100644 --- a/src/types/point.js +++ b/src/types/point.js @@ -29,7 +29,9 @@ export default class PointAnnotation extends Element { ctx.fillStyle = options.backgroundColor; setShadowStyle(ctx, options); const stroke = setBorderStyle(ctx, options); + // REMINDER: Sets to 0 in order to avoid that Chart.js function will perform stroking options.borderWidth = 0; + // for animation on radius, the element property must be used options.radius = this.radius; drawPoint(ctx, options, this.centerX, this.centerY); if (stroke && !isImageOrCanvas(options.pointStyle)) { @@ -42,7 +44,7 @@ export default class PointAnnotation extends Element { resolveElementProperties(chart, options) { const properties = resolvePointProperties(chart, options); - properties.initProperties = initAnimationProperties(chart, properties, options, true, true); + properties.initProperties = initAnimationProperties(chart, properties, options, {centerBased: true, useRadius: true}); return properties; } } From 2e357e10d24e968ffb90f338ca8b0ba1a0c54a20 Mon Sep 17 00:00:00 2001 From: stockiNail Date: Wed, 1 Jun 2022 22:59:20 +0200 Subject: [PATCH 03/18] apply review 1 --- src/annotation.js | 3 +- src/helpers/helpers.canvas.js | 119 ++++++++++++++++++++++++++++++++- src/helpers/helpers.options.js | 72 ++++++-------------- src/types/ellipse.js | 2 +- src/types/point.js | 11 +-- src/types/polygon.js | 2 +- 6 files changed, 145 insertions(+), 64 deletions(-) diff --git a/src/annotation.js b/src/annotation.js index 070b3f044..25e9b8a22 100644 --- a/src/annotation.js +++ b/src/annotation.js @@ -115,6 +115,7 @@ export default { }, common: { drawTime: 'afterDatasetsDraw', + initAnimation: false, label: { } } @@ -122,7 +123,7 @@ export default { descriptors: { _indexable: false, - _scriptable: (prop) => !hooks.includes(prop), + _scriptable: (prop) => !hooks.includes(prop) && prop !== 'initAnimation', annotations: { _allKeys: false, _fallback: (prop, opts) => `elements.${annotationTypes[resolveType(opts.type)].id}` diff --git a/src/helpers/helpers.canvas.js b/src/helpers/helpers.canvas.js index 043a3d53f..7325aeda6 100644 --- a/src/helpers/helpers.canvas.js +++ b/src/helpers/helpers.canvas.js @@ -1,4 +1,4 @@ -import {addRoundedRectPath, isArray, toFont, toTRBLCorners, toRadians} from 'chart.js/helpers'; +import {addRoundedRectPath, isArray, toFont, toTRBLCorners, toRadians, PI, TAU, HALF_PI, QUARTER_PI, TWO_THIRDS_PI, RAD_PER_DEG} from 'chart.js/helpers'; import {clampAll} from './helpers.core'; import {calculateTextAlignment, getSize} from './helpers.options'; @@ -160,3 +160,120 @@ function setTextStrokeStyle(ctx, options) { return true; } } + +export function drawPoint(ctx, element, x, y) { + const {radius, options} = element; + const style = options.pointStyle; + const rotation = options.rotation; + let rad = (rotation || 0) * RAD_PER_DEG; + + if (style && typeof style === 'object') { + const type = style.toString(); + if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') { + ctx.save(); + ctx.translate(x, y); + ctx.rotate(rad); + ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height); + ctx.restore(); + return; + } + } + if (isNaN(radius) || radius <= 0) { + return; + } + drawPointStyle(ctx, {x, y, radius, rotation, style, rad}); +} + +function drawPointStyle(ctx, {x, y, radius, rotation, style, rad}) { + let xOffset, yOffset, size, cornerRadius; + ctx.beginPath(); + + switch (style) { + // Default includes circle + default: + ctx.arc(x, y, radius, 0, TAU); + ctx.closePath(); + break; + case 'triangle': + ctx.moveTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); + rad += TWO_THIRDS_PI; + ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); + rad += TWO_THIRDS_PI; + ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); + ctx.closePath(); + break; + case 'rectRounded': + // NOTE: the rounded rect implementation changed to use `arc` instead of + // `quadraticCurveTo` since it generates better results when rect is + // almost a circle. 0.516 (instead of 0.5) produces results with visually + // closer proportion to the previous impl and it is inscribed in the + // circle with `radius`. For more details, see the following PRs: + // https://github.com/chartjs/Chart.js/issues/5597 + // https://github.com/chartjs/Chart.js/issues/5858 + cornerRadius = radius * 0.516; + size = radius - cornerRadius; + xOffset = Math.cos(rad + QUARTER_PI) * size; + yOffset = Math.sin(rad + QUARTER_PI) * size; + ctx.arc(x - xOffset, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI); + ctx.arc(x + yOffset, y - xOffset, cornerRadius, rad - HALF_PI, rad); + ctx.arc(x + xOffset, y + yOffset, cornerRadius, rad, rad + HALF_PI); + ctx.arc(x - yOffset, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI); + ctx.closePath(); + break; + case 'rect': + if (!rotation) { + size = Math.SQRT1_2 * radius; + ctx.rect(x - size, y - size, 2 * size, 2 * size); + break; + } + rad += QUARTER_PI; + /* falls through */ + case 'rectRot': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + yOffset, y - xOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.lineTo(x - yOffset, y + xOffset); + ctx.closePath(); + break; + case 'crossRot': + rad += QUARTER_PI; + /* falls through */ + case 'cross': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.moveTo(x + yOffset, y - xOffset); + ctx.lineTo(x - yOffset, y + xOffset); + break; + case 'star': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.moveTo(x + yOffset, y - xOffset); + ctx.lineTo(x - yOffset, y + xOffset); + rad += QUARTER_PI; + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.moveTo(x + yOffset, y - xOffset); + ctx.lineTo(x - yOffset, y + xOffset); + break; + case 'line': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + break; + case 'dash': + ctx.moveTo(x, y); + ctx.lineTo(x + Math.cos(rad) * radius, y + Math.sin(rad) * radius); + break; + } + + ctx.fill(); +} diff --git a/src/helpers/helpers.options.js b/src/helpers/helpers.options.js index 6734da0a2..29f90f92a 100644 --- a/src/helpers/helpers.options.js +++ b/src/helpers/helpers.options.js @@ -1,28 +1,9 @@ -import {isObject, valueOrDefault, defined} from 'chart.js/helpers'; +import {isObject, valueOrDefault, defined, callback} from 'chart.js/helpers'; import {clamp} from './helpers.core'; -const animationModes = { - fade: (area, {centerX, centerY}) => ({x: centerX, y: centerY, x2: centerX, y2: centerY, width: 0, height: 0}), - left: () => ({x: 0, x2: 0}), - top: () => ({y: 0, y2: 0}), - right: (area) => ({x: area.right, x2: area.right}), - bottom: (area) => ({y: area.bottom, y2: area.bottom}), - topLeft: () => ({x: 0, x2: 0, y: 0, y2: 0}), - topRight: (area) => ({x: area.right, x2: area.right, y: 0, y2: 0}), - bottomLeft: (area) => ({x: 0, x2: 0, y: area.bottom, y2: area.bottom}), - bottomRight: (area) => ({x: area.right, x2: area.right, y: area.bottom, y2: area.bottom}), -}; - -const pointAnimationModes = { - fade: (area, {centerX, centerY}) => ({centerX, centerY, radius: 0, width: 0, height: 0}), - left: () => ({centerX: 0}), - top: () => ({centerY: 0}), - right: (area) => ({centerX: area.right}), - bottom: (area) => ({centerY: area.bottom}), - topLeft: () => ({centerX: 0, centerY: 0}), - topRight: (area) => ({centerX: area.right, centerY: 0}), - bottomLeft: (area) => ({centerX: 0, centerY: area.bottom}), - bottomRight: (area) => ({centerX: area.right, centerY: area.bottom}), +const animationTypes = { + xy: (area, {centerX, centerY}) => ({x: centerX, y: centerY, x2: centerX, y2: centerY, width: 0, height: 0}), + center: (area, {centerX, centerY}) => ({centerX, centerY, radius: 0, width: 0, height: 0}), }; const isPercentString = (s) => typeof s === 'string' && s.endsWith('%'); @@ -116,43 +97,30 @@ export function isBoundToPoint(options) { * @param {Chart} chart * @param {AnnotationBoxModel} properties * @param {CoreAnnotationOptions} options - * @param {{centerBased: boolean, useRadius: boolean}} [animOpts={centerBased: false, useRadius: false}] + * @param {string} [type='xy'] * @returns {AnnotationBoxModel} */ -export function initAnimationProperties(chart, properties, options, animOpts = {centerBased: false, useRadius: false}) { - if (!options.initAnimation) { +export function initAnimationProperties(chart, properties, options, type = 'xy') { + const initAnim = options.initAnimation; + if (!initAnim) { return; + } else if (initAnim === true) { + return applyDefault(chart, properties, type); } - const {centerBased, useRadius} = animOpts; - const {mode, fade} = toAnimationMode(options.initAnimation); - const modes = centerBased ? pointAnimationModes : animationModes; - const modeImpl = modes[mode]; - if (modeImpl) { - const animProps = modeImpl(chart.chartArea, properties); - applyFading(animProps, fade, useRadius); - return animProps; - } + return checkCallbackResult(chart, properties, type, callback(initAnim, [{chart, properties, options}])); } -function toAnimationMode(value) { - if (isObject(value)) { - return { - mode: value.mode, - fade: value.fade === true, - }; +function applyDefault(chart, properties, type) { + const typeImpl = animationTypes[type]; + if (typeImpl) { + return typeImpl(chart.chartArea, properties); } - return { - mode: value - }; } -function applyFading(properties, fade, useRadius) { - if (fade) { - if (useRadius) { - properties.radius = 0; - } else { - properties.width = 0; - properties.height = 0; - } +function checkCallbackResult(chart, properties, type, result) { + if (result === true) { + return applyDefault(chart, properties, type); + } else if (isObject(result)) { + return result; } } diff --git a/src/types/ellipse.js b/src/types/ellipse.js index f836a67be..1be5ab536 100644 --- a/src/types/ellipse.js +++ b/src/types/ellipse.js @@ -40,7 +40,7 @@ export default class EllipseAnnotation extends Element { resolveElementProperties(chart, options) { const properties = resolveBoxProperties(chart, options); - properties.initProperties = initAnimationProperties(chart, properties, options, {centerBased: true}); + properties.initProperties = initAnimationProperties(chart, properties, options, 'center'); return properties; } diff --git a/src/types/point.js b/src/types/point.js index e95d0543a..ae7b81729 100644 --- a/src/types/point.js +++ b/src/types/point.js @@ -1,6 +1,5 @@ import {Element} from 'chart.js'; -import {drawPoint} from 'chart.js/helpers'; -import {inPointRange, getElementCenterPoint, resolvePointProperties, setBorderStyle, setShadowStyle, isImageOrCanvas, initAnimationProperties} from '../helpers'; +import {inPointRange, getElementCenterPoint, resolvePointProperties, setBorderStyle, setShadowStyle, isImageOrCanvas, initAnimationProperties, drawPoint} from '../helpers'; export default class PointAnnotation extends Element { @@ -29,11 +28,7 @@ export default class PointAnnotation extends Element { ctx.fillStyle = options.backgroundColor; setShadowStyle(ctx, options); const stroke = setBorderStyle(ctx, options); - // REMINDER: Sets to 0 in order to avoid that Chart.js function will perform stroking - options.borderWidth = 0; - // for animation on radius, the element property must be used - options.radius = this.radius; - drawPoint(ctx, options, this.centerX, this.centerY); + drawPoint(ctx, this, this.centerX, this.centerY); if (stroke && !isImageOrCanvas(options.pointStyle)) { ctx.shadowColor = options.borderShadowColor; ctx.stroke(); @@ -44,7 +39,7 @@ export default class PointAnnotation extends Element { resolveElementProperties(chart, options) { const properties = resolvePointProperties(chart, options); - properties.initProperties = initAnimationProperties(chart, properties, options, {centerBased: true, useRadius: true}); + properties.initProperties = initAnimationProperties(chart, properties, options, 'center'); return properties; } } diff --git a/src/types/polygon.js b/src/types/polygon.js index 18fee19b9..03dcda210 100644 --- a/src/types/polygon.js +++ b/src/types/polygon.js @@ -73,7 +73,7 @@ PolygonAnnotation.defaults = { borderShadowColor: 'transparent', borderWidth: 1, display: true, - initAnimation: 'fade', + initAnimation: undefined, point: { radius: 0 }, From 980f3b600aace9ad21116f25bdd86561875ffc8f Mon Sep 17 00:00:00 2001 From: stockiNail Date: Wed, 1 Jun 2022 23:35:07 +0200 Subject: [PATCH 04/18] adds fixtures --- test/fixtures/box/initAnimation.js | 90 ++++++++++++++++++++++++ test/fixtures/box/initAnimation.png | Bin 0 -> 15152 bytes test/fixtures/ellipse/initAnimation.js | 74 +++++++++++++++++++ test/fixtures/ellipse/initAnimation.png | Bin 0 -> 20315 bytes test/fixtures/label/initAnimation.js | 78 ++++++++++++++++++++ test/fixtures/label/initAnimation.png | Bin 0 -> 13753 bytes test/fixtures/line/initAnimation.js | 82 +++++++++++++++++++++ test/fixtures/line/initAnimation.png | Bin 0 -> 21787 bytes test/fixtures/point/initAnimation.js | 74 +++++++++++++++++++ test/fixtures/point/initAnimation.png | Bin 0 -> 9172 bytes test/fixtures/polygon/initAnimation.js | 82 +++++++++++++++++++++ test/fixtures/polygon/initAnimation.png | Bin 0 -> 13217 bytes 12 files changed, 480 insertions(+) create mode 100644 test/fixtures/box/initAnimation.js create mode 100644 test/fixtures/box/initAnimation.png create mode 100644 test/fixtures/ellipse/initAnimation.js create mode 100644 test/fixtures/ellipse/initAnimation.png create mode 100644 test/fixtures/label/initAnimation.js create mode 100644 test/fixtures/label/initAnimation.png create mode 100644 test/fixtures/line/initAnimation.js create mode 100644 test/fixtures/line/initAnimation.png create mode 100644 test/fixtures/point/initAnimation.js create mode 100644 test/fixtures/point/initAnimation.png create mode 100644 test/fixtures/polygon/initAnimation.js create mode 100644 test/fixtures/polygon/initAnimation.png diff --git a/test/fixtures/box/initAnimation.js b/test/fixtures/box/initAnimation.js new file mode 100644 index 000000000..6d9999a40 --- /dev/null +++ b/test/fixtures/box/initAnimation.js @@ -0,0 +1,90 @@ +module.exports = { + tolerance: 0.0075, + config: { + type: 'bar', + options: { + scales: { + x: { + display: false, + labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July'] + }, + y: { + display: false, + min: 0, + max: 25 + } + }, + plugins: { + annotation: { + common: { + initAnimation: () => true, + }, + annotations: { + box1: { + type: 'box', + initAnimation: true, + xMin: 0.5, + xMax: 2.5, + yMin: 8, + yMax: 13, + backgroundColor: 'rgba(255, 99, 132, 0.5)', + borderColor: 'rgb(255, 99, 132)', + borderWidth: 1, + label: { + display: true, + content: 'initAnimation: true' + } + }, + box2: { + type: 'box', + xMin: 'May', + xMax: 'July', + yMin: 11, + yMax: 15, + initAnimation: false, + backgroundColor: 'rgba(255, 99, 132, 0.5)', + borderColor: 'rgba(255, 99, 132)', + borderWidth: 1, + label: { + display: true, + content: 'initAnimation: false' + } + }, + box3: { + type: 'box', + xMin: 0.5, + xMax: 'May', + yMin: 16, + yMax: 20, + initAnimation: () => true, + backgroundColor: 'rgba(255, 99, 132, 0.5)', + borderColor: 'rgba(255, 99, 132)', + borderWidth: 1, + label: { + display: true, + content: 'initAnimation: callback' + } + }, + box4: { + type: 'box', + xMin: 'April', + xMax: 'July', + yMin: 5, + yMax: 9, + backgroundColor: 'rgba(255, 99, 132, 0.5)', + borderColor: 'rgba(255, 99, 132)', + borderWidth: 1, + label: { + display: true, + content: 'initAnimation: fallback' + } + } + } + } + } + } + }, + options: { + spriteText: true + } +}; diff --git a/test/fixtures/box/initAnimation.png b/test/fixtures/box/initAnimation.png new file mode 100644 index 0000000000000000000000000000000000000000..0bd966de1a9980b322520df06a66bb49b24c6456 GIT binary patch literal 15152 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 true, + }, + annotations: { + ellipse1: { + type: 'ellipse', + initAnimation: true, + xMin: 0.5, + xMax: 2.5, + yMin: 8, + yMax: 13, + backgroundColor: 'rgba(255, 99, 132, 0.5)', + borderColor: 'rgb(255, 99, 132)', + borderWidth: 1 + }, + ellipse2: { + type: 'ellipse', + xMin: 'May', + xMax: 'July', + yMin: 11, + yMax: 15, + initAnimation: false, + backgroundColor: 'rgba(255, 99, 132, 0.5)', + borderColor: 'rgba(255, 99, 132)', + borderWidth: 1 + }, + ellipse3: { + type: 'ellipse', + xMin: 0.5, + xMax: 'May', + yMin: 16, + yMax: 20, + initAnimation: () => true, + backgroundColor: 'rgba(255, 99, 132, 0.5)', + borderColor: 'rgba(255, 99, 132)', + borderWidth: 1 + }, + ellipse4: { + type: 'ellipse', + xMin: 'April', + xMax: 'July', + yMin: 5, + yMax: 9, + backgroundColor: 'rgba(255, 99, 132, 0.5)', + borderColor: 'rgba(255, 99, 132)', + borderWidth: 1 + } + } + } + } + } + }, + options: { + spriteText: true + } +}; diff --git a/test/fixtures/ellipse/initAnimation.png b/test/fixtures/ellipse/initAnimation.png new file mode 100644 index 0000000000000000000000000000000000000000..74f1344f67ba18df9977ae2237aa6729a2dff04c GIT binary patch literal 20315 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

2)WhW5imN#GP5VS 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 true, + }, + annotations: { + label1: { + type: 'label', + initAnimation: true, + xMin: 0.5, + xMax: 2.5, + yMin: 8, + yMax: 13, + backgroundColor: 'rgba(255, 99, 132, 0.5)', + borderColor: 'rgb(255, 99, 132)', + borderWidth: 1, + content: 'initAnimation: true' + }, + label2: { + type: 'label', + xMin: 'May', + xMax: 'July', + yMin: 11, + yMax: 15, + initAnimation: false, + backgroundColor: 'rgba(255, 99, 132, 0.5)', + borderColor: 'rgba(255, 99, 132)', + borderWidth: 1, + content: 'initAnimation: false' + }, + label3: { + type: 'label', + xMin: 0.5, + xMax: 'May', + yMin: 16, + yMax: 20, + initAnimation: () => true, + backgroundColor: 'rgba(255, 99, 132, 0.5)', + borderColor: 'rgba(255, 99, 132)', + borderWidth: 1, + content: 'initAnimation: callback' + }, + label4: { + type: 'label', + xMin: 'April', + xMax: 'July', + yMin: 5, + yMax: 9, + backgroundColor: 'rgba(255, 99, 132, 0.5)', + borderColor: 'rgba(255, 99, 132)', + borderWidth: 1, + content: 'initAnimation: fallback' + } + } + } + } + } + }, + options: { + spriteText: true + } +}; diff --git a/test/fixtures/label/initAnimation.png b/test/fixtures/label/initAnimation.png new file mode 100644 index 0000000000000000000000000000000000000000..b81249e9f4f2fa385df494ca08aa9057f3216828 GIT binary patch literal 13753 zcmeI3c|6o@-}iqr$X1ppB1<_-$aV@v7;TibgrY&FGerg&`!eHnmC9D97FnXQWEqlu z7!*;-l09P(g~1rI&zPC}__?m@xu5&Ko`0VE{_B38{_y%W+wVAj$MXHYKcDZ>U0Z9j zZ9+0a5Cm;IZGPe$1R=pck&wU^a9IlOVS)?7|D4$|sHlB64T2P*(C3KjzoZ?tY9AO%bOtK?ZHjL|A2X)^`A&|TR zVv4qDsFzi{Qnmj6N(@Oji6TJYg^;8eBy@wMBB2PsMl{H5UXgr40uY}b^`W2`cuj!Z zw!v2@3dzSyK&E0p!FNQVpx0aAD*+XSM53as^#9mwNfElhv-x=@3W3OM$VvTuvrRFm z@E<+NBtW)q-BwTG<^=?xzRj!H0b3Mw;59ABao%)kCKu3$-~7{G_~tY@|ivJcw`YI`C1Yrkdz^!9eB4~ zXL|3b5K7Ps1peo(Xah4uriJXwgGekwvSbS{VejBjdJ_0rsb>CO(13U>_}Ys$>XFlk zOheWSRgiLadAa2y+&1>aJbv!>__*rpR`D3CKrXW3{u|1XC~MxMyaRWKwL*#^ElU~Q zv{p&zw*P96%PWw5P~$VmhLFj0sg9$ImNzP?f!ZVCi@o>CY9jn=${GV#sk>{b+McoA z{?Rlem()M30!#axX6hJM3j0>Aznq4oEw8fnYN2^~3AA@vuwGO>#j);^0=! zS@r!9 zj$Q4Y;UVS`(^n|3$|s)7`(!R#d9&a~6+V?H)1CjdN#EI$mgez96L}WB()D2N{JZk^ z6vf|pyrWqc8XU~-fgSrYRknT0XbMM&B!jF z$Q_7Puebo3*zu_KQ?AXDm>YuoIN9AtPyizLc6@Bl(SR&zgqt7tJ!ulwtQGUfhzKmK znIo07$cHtB4KF^clp}PRP9$Rz?t+i>DyV^!X;iufm+`t$WMN~mqvd*T`cCC^+_{Yj z{rbB)9Y=MHnO_ne_PjW96%2@XDkYcAWi#-J3_O?hKm?VFC0*AIWHK_=KYO?@O?~M# zUCK$t-phR!s)_{@I=#$d)SDQyX*MkyHM83#_FD#nq)S$gM1}>p8PC3M94pOW-}tOYxskM@-KpKR z;#F93Dtt^LhkhnNo!99}!Vpc* zJk&)A-S&#Y?eX-QGkiK6zS!1lpAG___QVj&8Hqx7ldUsbL0r`E`e6G|#|YfJ^B^_W zW_8kJK1#GHPN)5Xl?vD@yL?DJ>Be%lL0hP_nYQQ)Ox!W%m3O(u%Xw8Gj!;A(l~=oc z8xXyvTWDMLjhd35?HRyx*#-Q9Gt&huGLmK|ZnoR+#PaOB{DLAGE_;M4C#+HB7Vti+ zdoZ;e9r*Q+g_6XG!okTiYQ*z=FK+F0dKJjED-RJwLWKc+b}PfHZ-fNqb) z^cxFqeNKS1{#HeOGxJ;o;+MnOF8AOKN-ae{WG6~Q&Nz?c&!y&u&C}E(Qrup~>*c?D z`^8KF9R?8%8~Vu4<}kS_UC{xwdyUV+<}S(=ra0;{`_tOpoL5&rC?z)O*RQutCyCPZ zjv3gE1oWc|_-S3ri0NjZ2y%dWmd(zrg1t&+35Cd$q2|BKt#wD=4k)iQ3>0#vMYZB6 zd+C)VN0XVta(Jz>TdXrQ%sWnJ*+_?vf4s;`z^+F*@<-_bO{Vw!_Ttq5MCNi-c~m5K zsoTa;v^1Ob&cDMbXxR|aWweBwNEh*?siBQ+YnIEfj4?y4N2n&K+FQ6c4t*`T8jpun9=2H{y#U!C#mN++k(3Kq*4R<^Ii0FXa z2h=4W?jrm+XVh2geXD}UjyLSP8!Pg2f$IL{RsvRm}n;b@CkL| zl_!?S=ii05mBjMOlw3Y^s%T;tL1X&vIf0D~f-}T-@K#+%BFnRO*UJ~;KL2E?u(9l~ zt2Zu{b$I=qrF{ARDXsSjRUvKN``b44?>+Fy_gsNl0CaTb380soic)o8T`UP6TC$!O z+SJ!~0qopG>wCcZ`hW}Iph!VzQ;%;4bHBX?+rFvrYr&{)Y=<@l@;;#7_XSeZVEvvM z4DP$O584#eXMo;6GfO%G>wVM$xbK1mv?;(J0-^nIAiy6M+EHWRzGF`yXtTkypuv)v ziA`btURVHnuZe&*8+-v8{PiHeX5@d$(!%}LS=s$f;coNRMO>ML&m20cUVrXJ8h&(< zYHW(gq!?xyBY8<@G8v2G#*#j|MR%scN(+SSEGq>*OU75_YDa!PMLpN~a9Ru^k&jO+ zp)w12nWq%$JP)1PP<+9tEmF1ArtazNuk<}6qo%(?i zX-}W3bLS<@&D^~Qw!D@!64~H(U}fHzmmrTV$`e<#EdzTB$C^>rgnDGZ{t0$wBiMe@ z3Fy=WU16wOoMH=hUUCAmd{g&Wx7^(N$jy+aLHnC+XNN{a9^6Du>=4zG8X@# zxr!Rb#3()Ctn-ajSxd%(OBlVp3TT$`S1%LpnQ#^o7rrOiSeJL17T7@7{7(+VftHOF zwR#Yv3fwibp)dy7K6v1AjGSsozboEozjc~)s&~c3Wj4Rb+S@ATbOEO1{Z20nT&GB| zoiq{FJjLa4CV*+RLzkw4zul7BqKoSt6N1W5=)sYyL!gI`Fg3rY;iKHq3_NEY;GfPI zWrPzLC!?#XL0;-Q%wFoou$TK8LjAOe2A}jLRExsYirtBw5Xqgb0uN;O$xIEXY#4b> z{szcoPuJ#x>Sad&kYl3wcHSwDTrMbC>auY3C}jH}4#{wte8e^jcAL(SBrky2vVm(a zhz zmy=Rfq-~wy9jF#_iYplY1z5hycom9UXjEST+5AYadJM60*kENijB$8vGjGw_jxZ$7CeAuVf``_TyL zYh-8da{D1bbPxVKodTL_|=0sI4`{%*S!6GDBV*Ug>hPJ%IsB^K$^zJ`Z?}`dXckN!?7Gw)*+qZaSA06- zov(0ak?v*-3<1!>{9*>T)?mPT&g<(RPlzH;iN?$+%3O87oNeyvOgBrY0X6yLMz?q3 z5-s+sw0Xyc@E>ZfPno&GyoBNPw|Wv_zxTi$y+5~_5jvgcxA0!71xP)|M^EOyx&jTW z9XLBMt=9lVn{E~uPnDxaVnMz3j_-kvk~N&G!cZKc!H6xHRA(Wgk*Cq9XxT72h^mVv z(Q-UpXlE=!AuS{BeRt8x;-@B(aBBXAM83AV1^N6ynPN1x=kSHit&i%QiY+$JZH~+U}8N0 z2zf*rErY4f9lZWK93Jyg-q5IH11* zkb3D)sI!fFRu)iO4jKg|2iEKzR)HkHTuu57^^X#W=#@{%22|M%3-GgVN+3FCxcrfK z9{TVOYYQf8Yc*;_!z@CPIb5qMqfNOldX?}^xl>B%rFg%7v%;HzN-4&k1}x(~6YOh) zD8QQN-#ACQXVH$yf0B-mw(U~zN~;-Bqn`czu;8DW2}Zr+il8AxK6*QdpHLJQfac$` z*8iWM8O+*_43sF1z5RNX=BqzEER0lg4Jq|o8R!qYtU3Xf00WS%+)9gwu5f_~5&T{0K0oETxo3t~8jXLH@bd@TXc?z|k!3N+rB6pvTlI~KM1MOU}jYfX{y z3z#B#j-56Sk~b8rhN;($NK_1gyc~$gtYlu-;|+C!-z5Jx-?ZBXjf);BYovyS=?l%? zY`ScBzyg|Tj?B9YMSTS5FQ>5;k$Jq~+gc#P?Qoz~8?Qha&_Z$=g8%7V0Vuj=3o!aX zRF~^_3G+@19=lrtc45EB@Z3rpy-S2b4f3B4Yc&o{1E7f~ zs6lcSFEpSVz)td8|M8^dk0IGN0|eo8BE8U|MN|JYvSB7gvqlO9n}+c5N)S1pGPj&n*S~{HVNX zeex@W`(6S8ccEF}nnoL#_=Z&Cd6cX}P1)nQw4ZOY8VsTVl5-?4}x5M39NGB$oI0>7WW z*943;2}VdqSWX^?qi%_@y1rqhPd&8L>Du!FkkdvchDI{E^oNI9lB^9>IKVD#o&*jm zzIRFp6=R}1Y)wGv!$TbS{2$MqAu^D$@m*PoFY44w@sYJ=efL{C9D*r7z&yJe2M&i! zR?U%S#{MQ@{Yu1%_LGaPq3ooNPrnKW_#q{L_8Qpx+Hm&>GT@`I~IE`KK zAuqeb1|2Y>&W~qDvtUACM6TA1-#;#rhdr64wq2*~klkm%RGSF$z)XIZPWxd@Ihyq8 zi<5tWsgRM%frFJpH%nlD4EPPQvfgE9ckG=2-V36Cr2dvlt>yI%OrnvVG3#qb^LC4a z3keiOqAmx}UTg`br5Vtcb8iUfz5Sk7`F&B}OGYsIXyCJqw6? z(GiEi;xFL2ny+p2A=zcbw{e>i6=UOwcm}fZ^v)AP%Cs{ml+1nuyE&jQr=oAYn@ zjW^rlyVAP9;)NttP+2_KMYp5b%o(hTr3x;a*%f{&VfV$Eq1sP>9c$d5dgI)!g44Rs ze4j#{-#X$eB^2+w!eNEKTLuDNr8Uh>H@m;Xm^C}?X=)&A!{5GC{^PN;gU2Y1Fvx`r zh?t(lNEzP;r7O|P>5O&~BV ztqi*B!7|;f02FyKQ8BlU?3HdR7E@IJ+Pt;_?H((`0{-#BTWDndvIm8#(dqmQ7e(&)B+D_9N zgrd=ava6R3hH&LEFD7D4tst>LHty*X}yjFOClgRKaXZepNXxar#yzV8$)VxPCMNn)?1b|ed zG0%jR>=UXk*QNhH=cC0*BLh(6mCYaTh&qY4>ra%rzsT`VEhb ziQSy_4!lFgQS&0&+h$IE@t#`*+`LWHAJ0N2@{Ds11I5#F2c3xH%lr>Jb{ed?n$;Do zgOkZ}a{!>uwfHk~{e*8Cc^Z)VZ5r&C1NB2IybLWY{(4$Jxpr})|`opub)WfWq zdg(d4vnB{6Y;)oU#_Oofb;`riC6O^T3oFmWq}MIS!}x7x@8%`*0=|Z=(C}ER`+)Cw z1#0cU5ggTDM{xe1IXM({5E)?@&psBHe7XNlu$l#8i@N0~F=p>@xdrAOM{|eXf{L{x z^m@C1*oVEH`pi2uO2eUAGD^?d&Jj$7C8nG;UzCJk-tDQ}spp44HG*xd5monPd@k

;q|(3)cq8Zp)O2w(So5Aq*iKUOSfw?e9!Q{sTqzJ-i)`YiyR_Bex>J z7k~D80Q-1QTnrjK`=*Tm4CRWCM|nE+9&Hm8leR=4+_ZG*UVniNx#AAKlJjN{0vWAh zD+RTKv=zMeEd~R-E$^jVYXheOD}As}0te>mQll#kPkEPkW3|XFtQl9X3;+R(4bEzP zVsQlBtK7b#&v7+^F2eu%t)w?-ZwDWtBJYMdp}|cEM6&WeC$%C_b*}<^tHdVH6$G%J zxJDk451)Uldi1ky|0PhN2UrO^J!1ga3hO{YvUQX9c6p?g{O1aNad};=2I&Co4Xt&? z7@ueRP#wJ@0!I4jK8nRQUrs^SQqO|FPq%@-%K=WC^wd|MnH5mN_1u{CFxf;A5QJSH z0rgthGWF#p=Ju|uuim|V9wRRUYw%hYm4Ws0{NK+6fEMYMBgPul-~U?6;I3y}7eWJ3 zY4|KC453(D|3y$zO{)`_6VjkY|9AmpcQeu@GVJUD1`>yvYRTk+3qY6NC@z4iJdt@? z`4S*+57U}cp8cNH?05c)}q!juP$Ue0}Jx8mddDz-Ag&FNG zoOMdN&ZxaFENwTiT3&Sxzh3B2n%A3Jl+q(NpIXcXfO`)Vr`4~5sGmPPvEwNyBQcpB zLBI-$$8%Tli9q;sy)l|#>NlN@a~A45ytt#MGLY96U3VZdtq!D$D{55%@$Ytq{|RiY z^&%JmvkOIvTsc3V6!2W*(z{D}i2S9vb^IzdC=ssMCjc}xe^R3iTuN|S!g6_-!(SHI zY|glz5W=M8wt%{r+z5Lv2($9lBav7!s5%@vLsV5PtYc0u+|mr+vlBRBYrVyhJAlP^ zX((tU0_OTAA24955XhSHer>w_wJ#?eqU$$)X!?Cp$!+@ZK&jyMgJUO1FG>bI3*G|^ z_&x7g;7qYFWLFRb+)u0_^c&;*&Bkr|n^+GYqSzrYy^v@>b@1Cj5bOy6ap84n1@B;n}K57VK%yo|Fo{(k@X z81Sj{MLrkTF+BtHs^J4VKu4`56bP_8=5qr+_sMka3L`DwFLKLj9f0k}b{7g2FQg`Q z$=4J<2hxksVut`Br_2{;kVFy@2_z>KC>w=+*?KfU-Y#ta^J<1%X7X8A;ym=wMmru@ZU(#leG0iz*2s&!Bs+bVaP;E*cpLBx8kfp@iZv{379Tv!$c_ zIe{u*1%o0xeHfX1E>n6+onSpf#|yhr1N!4}tbInlU&H6$V7W;(d|Kdq)Ol=ML@osh zpKSV31vEv|7AdX+bZybh9=ay+=_&|sMGdz6go&?zkj&ELFBnc`M(67=aDCKpPYx)P z6X#y$vKDEVOG!MzxyAY>9`(&KUgta1cZ0ACi$F^ui0uXJ2lB{S8*U6V3C_?=AGwXQ z^^OpDO;r;j%6X@|qRI5oG+fu|N9zD5(MGQvsRbF{71O4lzZ>sMoH$OP>6tNKT_yE% z6}Sruy-y>#CEYvHuN-02E;irQY*&NI)?cdruXzDQfF8C(HE?X%KXAn%b?Xxa^1Cf; z(tLn5yWqoJ@#(c&0+s%)>PE8nMXYIva#BPfGjvg(p3TqgGV6f4g?nbdnN;xP2P3aBwmo;q@tmJ z=F_OWErhqbKhz1FN5<2Y+|R=lfL!N-1JjRyx3v?2P!tY(8!ZG8+oT{Nj-OTl@(9St zY0P~I>JX?D7lrxn@4N-no0ML5uElnUm+;JGbibL~8cYGXj^wj>FavVJcz6{`Tj+fW-#i5^HW&eH>{ECDa^yZ6f@+R7T2QPko@@ou!tpi?x pUt{oV3}CtcYaRSo$6yVABfzkX?lc$%{x24E`lR)VqGN7<{u? true, + }, + annotations: { + line1: { + type: 'line', + initAnimation: true, + xMin: 0.5, + xMax: 2.5, + yMin: 8, + yMax: 13, + borderColor: 'rgb(255, 99, 132)', + label: { + display: true, + content: 'initAnimation: true' + } + }, + line2: { + type: 'line', + xMin: 'May', + xMax: 'July', + yMin: 11, + yMax: 15, + initAnimation: false, + borderColor: 'rgba(255, 99, 132)', + label: { + display: true, + content: 'initAnimation: false' + } + }, + line3: { + type: 'line', + xMin: 0.5, + xMax: 'May', + yMin: 16, + yMax: 20, + initAnimation: () => true, + borderColor: 'rgba(255, 99, 132)', + label: { + display: true, + content: 'initAnimation: callback' + } + }, + line4: { + type: 'line', + xMin: 'April', + xMax: 'July', + yMin: 5, + yMax: 9, + borderColor: 'rgba(255, 99, 132)', + label: { + display: true, + content: 'initAnimation: fallback' + } + } + } + } + } + } + }, + options: { + spriteText: true + } +}; diff --git a/test/fixtures/line/initAnimation.png b/test/fixtures/line/initAnimation.png new file mode 100644 index 0000000000000000000000000000000000000000..1a24412cfdff0773f41da0dbc9262d564f5e5288 GIT binary patch literal 21787 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 true, + }, + annotations: { + point1: { + type: 'point', + initAnimation: true, + xMin: 0.5, + xMax: 2.5, + yMin: 8, + yMax: 13, + backgroundColor: 'rgba(255, 99, 132, 0.5)', + borderColor: 'rgb(255, 99, 132)', + borderWidth: 1 + }, + point2: { + type: 'point', + xMin: 'May', + xMax: 'July', + yMin: 11, + yMax: 15, + initAnimation: false, + backgroundColor: 'rgba(255, 99, 132, 0.5)', + borderColor: 'rgba(255, 99, 132)', + borderWidth: 1 + }, + point3: { + type: 'point', + xMin: 0.5, + xMax: 'May', + yMin: 16, + yMax: 20, + initAnimation: () => true, + backgroundColor: 'rgba(255, 99, 132, 0.5)', + borderColor: 'rgba(255, 99, 132)', + borderWidth: 1 + }, + point4: { + type: 'point', + xMin: 'April', + xMax: 'July', + yMin: 5, + yMax: 9, + backgroundColor: 'rgba(255, 99, 132, 0.5)', + borderColor: 'rgba(255, 99, 132)', + borderWidth: 1 + } + } + } + } + } + }, + options: { + spriteText: true + } +}; diff --git a/test/fixtures/point/initAnimation.png b/test/fixtures/point/initAnimation.png new file mode 100644 index 0000000000000000000000000000000000000000..ce0c742f150cf3ffab31d414c1b29f8307c20d52 GIT binary patch literal 9172 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 true, + }, + annotations: { + polygon1: { + type: 'polygon', + initAnimation: true, + xMin: 0.5, + xMax: 2.5, + yMin: 8, + yMax: 13, + backgroundColor: 'rgba(255, 99, 132, 0.5)', + borderColor: 'rgb(255, 99, 132)', + borderWidth: 1, + sides: 5, + radius: 40 + }, + polygon2: { + type: 'polygon', + xMin: 'May', + xMax: 'July', + yMin: 11, + yMax: 15, + initAnimation: false, + backgroundColor: 'rgba(255, 99, 132, 0.5)', + borderColor: 'rgba(255, 99, 132)', + borderWidth: 1, + sides: 6, + radius: 40 + }, + polygon3: { + type: 'polygon', + xMin: 0.5, + xMax: 'May', + yMin: 16, + yMax: 20, + initAnimation: () => true, + backgroundColor: 'rgba(255, 99, 132, 0.5)', + borderColor: 'rgba(255, 99, 132)', + borderWidth: 1, + sides: 7, + radius: 40 + }, + polygon4: { + type: 'polygon', + xMin: 'April', + xMax: 'July', + yMin: 5, + yMax: 9, + backgroundColor: 'rgba(255, 99, 132, 0.5)', + borderColor: 'rgba(255, 99, 132)', + borderWidth: 1, + sides: 4, + radius: 40 + } + } + } + } + } + }, + options: { + spriteText: true + } +}; diff --git a/test/fixtures/polygon/initAnimation.png b/test/fixtures/polygon/initAnimation.png new file mode 100644 index 0000000000000000000000000000000000000000..5ac3f26751f49eb5c1561bb987299a941c636ba3 GIT binary patch literal 13217 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 KYnG|o-T7aaySj-0 literal 0 HcmV?d00001 From 91c3ab71810b3a64e4f159c6412a3da4ef740c21 Mon Sep 17 00:00:00 2001 From: stockiNail Date: Wed, 1 Jun 2022 23:54:32 +0200 Subject: [PATCH 05/18] adds test cases with callback --- src/helpers/helpers.options.js | 4 +--- test/fixtures/box/initAnimation.js | 15 +++++++++++++++ test/fixtures/box/initAnimation.png | Bin 15152 -> 17582 bytes test/fixtures/ellipse/initAnimation.js | 11 +++++++++++ test/fixtures/ellipse/initAnimation.png | Bin 20315 -> 23946 bytes test/fixtures/label/initAnimation.js | 12 ++++++++++++ test/fixtures/label/initAnimation.png | Bin 13753 -> 16092 bytes test/fixtures/line/initAnimation.js | 13 +++++++++++++ test/fixtures/line/initAnimation.png | Bin 21787 -> 25958 bytes 9 files changed, 52 insertions(+), 3 deletions(-) diff --git a/src/helpers/helpers.options.js b/src/helpers/helpers.options.js index 29f90f92a..11460f616 100644 --- a/src/helpers/helpers.options.js +++ b/src/helpers/helpers.options.js @@ -112,9 +112,7 @@ export function initAnimationProperties(chart, properties, options, type = 'xy') function applyDefault(chart, properties, type) { const typeImpl = animationTypes[type]; - if (typeImpl) { - return typeImpl(chart.chartArea, properties); - } + return typeImpl(chart.chartArea, properties); } function checkCallbackResult(chart, properties, type, result) { diff --git a/test/fixtures/box/initAnimation.js b/test/fixtures/box/initAnimation.js index 6d9999a40..299f0b473 100644 --- a/test/fixtures/box/initAnimation.js +++ b/test/fixtures/box/initAnimation.js @@ -66,6 +66,21 @@ module.exports = { } }, box4: { + type: 'box', + xMin: 0.5, + xMax: 'May', + yMin: 0.5, + yMax: 4, + initAnimation: () => ({y: 0, y2: 0}), + backgroundColor: 'rgba(255, 99, 132, 0.5)', + borderColor: 'rgba(255, 99, 132)', + borderWidth: 1, + label: { + display: true, + content: 'initAnimation: callback object' + } + }, + box5: { type: 'box', xMin: 'April', xMax: 'July', diff --git a/test/fixtures/box/initAnimation.png b/test/fixtures/box/initAnimation.png index 0bd966de1a9980b322520df06a66bb49b24c6456..a97779ade2e1c124e653a96c754e4c35d121eabd 100644 GIT binary patch literal 17582 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 literal 15152 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 ({y: 0, y2: 0}), + backgroundColor: 'rgba(255, 99, 132, 0.5)', + borderColor: 'rgba(255, 99, 132)', + borderWidth: 1 + }, + ellipse5: { type: 'ellipse', xMin: 'April', xMax: 'July', diff --git a/test/fixtures/ellipse/initAnimation.png b/test/fixtures/ellipse/initAnimation.png index 74f1344f67ba18df9977ae2237aa6729a2dff04c..b3df65d29ed2d2a07faf815fae7ff8c9f7329941 100644 GIT binary patch delta 5686 zcmZvAc_5T+)c(vcwh=RyAxj2jDO;rsS!Ogc*|+RlC~KjJD37saOGJ{;$WE5AXKTEM zNFlOkc&Y4^Y@vM5y#0QEeV;$w*F5(*_qon>mdPAwd^5C)h=YmB)#%}ftU#;o_>~cN zk;6aR&w8@$*^fu*^Ps*YoenO+c(h(A1FQpc!ws)nr2p=ncutfONyRUleHJsc9ZIPKW;qQ>|V8`eRfB6e#N~qaBMzne1B?v z|L$}ZFh8{(rqY0F%4Sk*ngZT@e_Nk|g$UX?72Sj)49MXMW%X70UkjofVHC~)C@q1F z3$sdCIWg;*@4(zFrBr4ZvVct*V3%=dcIV3dg_M@ei8=^N`yCa(hN+z5b-2Am$l9mQfMR@WREU)3eBjea zP8~H$|Iw=FTqUPoyk;`jR3!LF5t%mEq7O7rO49|FD~#sOw-{7~GljEPK*Z=Ubg>w; zHE5N`OHRBuUAv8MkyE18{j}22;8H=KVm>)S=H)e|+(>G>%K<+BG~1Ug^OvYEgws!) zSv*)=SWrXZmy>spK#IX&S71XkR%n4O zUXocCle9VAN>+ZUq4*~U#<`KjcEnWtq8pK4qFnNK5C=eWqq%9P?oZFl6GmWO@MPRKzh#V#UGLTJCT%)PaUuP~_Rsa>2~G*mf7z-@^J{t+p*rF~2a;8?ZN~ zFZR4*`AE!XJLiqZ2rNYAE|cF6d1olXnw$j#xFGLr))ngDa^OGG?5R*(k8pT`FL+3W zedY6mnDm7NmHY*NfpJ0f=n(sRj5D-M5%>bPMw<0+{D(au0Ae>-W@hccvnre_Tm+I< zLwE4{i+v4ZAFDtFroppt_&eDd2svwO%?!i>Ah?GCZha%|ZKBm!}Hq|HJ+-Xa5gh0bCy1 zX}$64N%Q7;i4Xbb3iEu_ay`kO%tOc_5@{#Xw8dDl(@{Ht-4k{`X`1g?yaEo6QUhZb?0E+zUPw1(Paa1!yL~oP$TX4ru1HCm;qmyjGot^auzS9)PcM(}6<-jWdAe zz|AmKVxD5C(4H;M_G5g_xMuboO#k-4KS|cWs=48~lD!PV+Sve%R-&x$Yu?djEzJid zza+Yi3)8a+1$Ttr8J)1U$XXb>tm$%WR;C@AABlW`e;^(be$2%9hvO!43BS01poChC zqGu(zc%g9W4MupNy;Acmf5997w8Utp_5r#4Px=&LVmtND47>KD6nEptlt|m@`bJ7q zjcU97N$`3s$ikSsZ}&N%t%omcKMv`4d+YbuX!~)|7MT-BI-b0=Ic9!~tWPiGjW))q zO}klQK1->;g6sHG6mI8_`V(x69C<#-C_F$eZs^(?DF6|X7Sao*GtgLF%=AAg_sSHt z60NTN!lH}0L27N8atCH3%6E5NZ1?&K(;XmnorHQ3Y_#+F{F|QJ+Iw3@Kv3Xb*8G0= zEYU&W)xBrEdx}LKT!hkQRWhGae(%W=X{oK!1D;LEfg!4KiJw-&2J1^(!>1Qpz!Wk( z4l)~vJ9#@_=VN@G;_+D@i9YEKgm|BJ3mHo(;?>ZT-VsHz#@=)KkwDi!%WfbGi~4jM zB8|!?CH};qBXXjGksF~2RI=sx`&{}5N=ZoVGl)GJk#-r(f@fa)qwh-jN1ce#Uz45U zT~yln>;UJRht&5AVi|GYwpm#Y@;#&nx#Jom^`;#t z6`5;c-(8@HPmJtUt0aHy&Y7sxdaC{=c7`XmR#SLWpQey@>7(}r5^L;3mOJBv$eILv zcF9|^78VPqqz+7d`OM3H$5gpx7_}=tj)Gmz7__Uy+&3( zb0EuiAtCktp^U#GT2L6Ovm}l!VdJRI;LeKQoR+CaeKw%)Of^z66;9oygu|sws8A~N z?4yy~VfwF=1Iwl@Bxh9@MEm($H%<(aD`vy)D55j4B>SH|)hDQ)ou|e~yPCPrONPT{ z!kuSJyL1&QL5Emg?a%IM+y|bTmDqE&hy=%~2hP29CBGG}BKF-HXQr_e@{b-BAf-#> z9PfW~DSZmee*_L?|z8MK2z+lgxRc2qv`BZ__ zC3Vh?)u2FI-@XwUHn2eT2{u~zaq01*DeSw~0|F0R_>yLhgF4Ol`8lS#Ku7$7mqlVR zT{kD}-?xhKuNPab$%(Ld^Y8*Uwbn+%bMs}j+ku@;OF3t5HNHm+%7cW?JE0m8Q0wyH zgxmNq^Ha$%7NALN>`cV*)-rgeIcDlAvMD+CXYv~U$0LgW@Ec|Ks}3g-iRIvPQMP_( zmz0%<@VwK+5rk2mLQ|~WKVP8!b=u>#kk<6+V9!dL6{&V{OsIUhyT4!?Xw~uLpQH6u zW_GZ(aSwL5`}>TPr{N**kFkUR-;cxVoiMau4o>JS4hS)d{+8Tnkme-jQ06P-=tA#> zeMR{}l#Bw)>+32XG*%qS-fiL~P8~Rc>i?0SXsm9}by{HKkUp>wy-RT3yr zmkYpPBy)4uf{D=x487|BbKyaGR=;|hcMwVO-%@k6p~8NHq`ma|#Da#{b6x#%1Qs#d z%=Gj7qYcxnEV!H!fs`0K3cbD1J305W3{a;1ZhZ~UGy>@eK)}ZN3)1R(XuZQtK8LuaS5f~Hirh^IdjPt*=5{g#gS|ZWMv!lQZ z>S6P^EYfbqJW9~cqsZ|M!y0Q9FT0;c-G7cQ!0z^Kph7}|5Q$|t+GJ0lx6jJ%OyjXp z)*75B$WlT4iQ@aKS{MbEKR1|rf~`RLbb&kKX)R+_UcYG9J9HbUz%JuK3L7Ry@4-6H zP$T1FJQt?qOmtyIu-*mRtyyY~|A=WT_LQp(_{f5dUh4-^s#8(NM7q}KU<`}(Ng136 zHUZ_CSDudFE|gPx$53as()zwFs?Wgvi=T&|gF)C*AS-A4ZKs2`dbYX`|Ei%9!5YGe zH@V?m1|WM`uWt(flSBUmLwg89J;hP(x>j#b97%O|{{-tmf=nPPm$!r+eRflOZx9po z<2qP3J2+@%;dXi6!*7M^+4>scN#dY!$%cegZ(qqrx@;QfyB%7d!Q}=9U=+0`%WFp* znBD2HH@aY0Fqv%Oz;KY|d_Ytx)zc!i59{V;1Sb;pG&{*6EIKjU4;@oFVCwNRT_mu5(Kl zG7E_cu?#mWjxZYV8Ls^PBR9EyuR#&YDO7J#zpj;T=GtTe0MFE;YCzr=8`S}uACes+ z8|zBE=+U6cCCOv5jolbtI*Ek3`d%e<@%Taf-b0)}oD!c5PwRpPgCM;VNCDnGf1ib2 zVoCh!Kk1;fP${tRQ>AC0eXbVWEHSHP6Bq=U9Y|`});iNTw|t#~t6}6M;bG~GRW6zp zz|O_#a@!Y_dF2G$cTF#Qw8|az&vH7qROP;B{r48|y1=j)P)mc|kk3PT!KP7_xe(=l z*~fY-{+mpa{#DX6*d{8)f+@9R?=c>+IsX6O3>m9(@lVf!?R|4|zPHg}>M`zhOEs~Z zFER~7qqL5FQJ}vEz^Ge5DdgR)>AIz?OY#vvZ;-&Y2!c%?piT$c)I}G_Yi$KkBbk3* zM|-%D2E4oTgoH1&jdpkX(dEDIGlLJDdw=0wo%x@VfpH= zip?t)b=3i-gO&vNk~zlF(8JDWp|Mo+=e)g*a{wc-L*`aj`mdSwe)zJ-)Bf?Q)Z7%v zr#)n_m6%<-tQBuWYV0FQ<*S78l9*ZfCq%=)5O! zSsaZqtEAFR4d|dI0We8{;Bzz{i%=(@mbFPq<33qyvOlB6!%um3PN+Oi`NlB@J8gZ7QL|D%> z!1;Q+gH;!%RsFuPx(r?LzEm9!-(!6KqQ1#wCN~Nge~@wv|M_B-w+PqrMaD$p!qcup zu(y3bF)kqXNbyxjb(SDFo`f}kWc2qD^;&L;7^p+Ge)+7k5a+Mn!hMbO4c-0BuuDI- z5xHS(qWXiEvbIG3rckTzPWl&|b_Cm|s&*_UCq|i0kw!7+nY1LwR92W<^Wg7Jl8cc| z0CH9*d9CfE%F8lI!{Jp>)37n%P3%4rO-oJYo+Ym^)jK?Dv74B8VMavW40*8$*p_1Q zZ8e*g0}c%5=hrs?SvrQwg4*mpX--8^J3-Eg@Nc7TK_IPJ( zB5>-CE$XpVB(Fi6-vFrWwgxnpe2#V=zC(PWA*F5Zx;|LMT%|#=UGaIVe9ggBl?t7Qy`AZM6mPSqOEm5RPCDmwoEK6u%#(%K`UZ zYWDbmwzDR!#3b>`>*p$Jjf(71t1?_rXN(dMhzbBYUtu6M?!zhWX&6`b%wAI zxZCeiiEj2VzHruB`>G;9u>NNWd0lwC`n3DIJjcIMxXOIA27MDLut|wI$ zS%WGma@N9!tl_y)8bns{oaow-n&c34_w!>u`SAD8w3T?VNtoYWT3i_%nR>K<{AWyW zRzgkvrMs`k7O`n?Qs9&)3zIy;rTvM@r|96S!NUL~$U__7BTv0^$*XyYp6cjNF5>Ol z-2(Wp$`LxrnrFGOKo|ysjS9$+VL5*6(k7oPa!~EQ)I;6a%_Wv$Tx+LmI#5^P`tpzT zSl#2M={QT`dfpR*q1cT0!OK}CGKD;u6M(*SD(lEl{CYuiPkibhqx@AuzS9q5%pJbU z_&WnulPDES?omoq&GrA5d!Vw=c5+`hkrxazCN!SPy#VxU-=8S^K#~h|>eqRHF$-t; zYF>ORrL!kFL})OMg0(4hdaIj~w8@H8ilD!@N@)L{KJseFUH11r zu@$8omto(MFx#xm0wY-Z@OD1<0}iGkYSmbjGP_4~Mxyd-YptgZ62*5b1dhX1)Z-Q; z$C&iY>A;!-%hf{tlY@?F8s;q_kJNdcDvtS0f~|#|k{P3P@o)YKlqK^I%UWbyQhL~O z=KhQsP1)ul~?;^*63dN1v zh4=nlL=`X=QSZEha{n%(RzU1KI?O)o?{cXC)N3=#X2jn`)HTK;Y8ySX@plm=%Si6( z2?vkA*k%x0-2i#|cM+v0J98XDP8(j+{tF(5|KT24@ejT?D^vji|1Rqo5h}EuBmM_4 Cl`|v& delta 2026 zcmc(e>ra|z7>8e&P70~uG%;jGO=|0bMg`hNY^~V2cxbDpb?Lf#j6^fnmMNY%=nERx ztun3PiU=ZG){riXhnZF_2D&&oSdd0H)LPLM5f=qTrW8>e^e2vL<-YIx zQplnRGMGt(1|AM)6Eg$A!zU{0!%{#lTDYq3=|1(-x%*%bZ03VoKQ=3yg3|J~KWSKL z7CDd8Rzlb3w#DHg>AwWPV_}s&AL)N>J!7?A*txQozWsBibhb#&BJnhw#)0L=i2}T9 zTI#%`U|=Kz<0iCQDUE_ZS8i;8(Zm(F{~EFbN!i*CK-*nvupx!Nd|81(6SP7kp2ER~ zS4?N1sWq+l_R)uWBLZ#5@HZ+PV_d9U$R4OzBdhm1_<|8iBFM8$ZYjy_g@`x72B`l^ z@P`fy3^ht)Il0A+81%AMI8eU2t8spzcowxudoX3x3^kcuvl=R=ldGxXVEc*=JGYjC zz}q+_twc`wvi`))1e3Xq$78rF%iUd_watbIj^#X|;h$ccLZ_#GeD}s_F;HLw7<8!L zUPg)gU!J47lfH1<8olV^+s~sn?Bl}K7&TqWJ#LOeloe)KC)mz34zkW1!LALw^wh;& zKT6^dic~5s$)M3_**0g?92d0AvWKqdhn=C^gR>NwfSnpGMG#U{^A}Xy;Q*u7X!`r9 z1PXsH3RIK^MGh82?HO`eXN$zawS6D9X{eXwD@;RciA_) z*Bn+B<%iZ`5?#b@BVBwEro-)=M(ad!dTBrY)riz}<9Ah^0K~3kpUZL@jf?7CDPeq6aObW?6x;E7O4G)RAfGhWadtPU zOCX3TD|!(&g0JpAnCojH_0N1Q;(rzvkK5sq7<5N1J|Iiqa=6bRks6nh`Bp}K^^%Yr zZFHLm$XwjHT-?aU2-f|TgM3ro9V ({y: 0, y2: 0}), + backgroundColor: 'rgba(255, 99, 132, 0.5)', + borderColor: 'rgba(255, 99, 132)', + borderWidth: 1, + content: 'initAnimation: callback object' + }, + label5: { type: 'label', xMin: 'April', xMax: 'July', diff --git a/test/fixtures/label/initAnimation.png b/test/fixtures/label/initAnimation.png index b81249e9f4f2fa385df494ca08aa9057f3216828..3d1f7407d1b34a9f21aa9c917cef777b7f670d9a 100644 GIT binary patch literal 16092 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 Xj=2{xu{~-K_@j6Bl5UZX!-M|@Ukvlz literal 13753 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 ({y: 0, y2: 0}), + borderColor: 'rgba(255, 99, 132)', + label: { + display: true, + content: 'initAnimation: callback object' + } + }, + line5: { type: 'line', xMin: 'April', xMax: 'July', diff --git a/test/fixtures/line/initAnimation.png b/test/fixtures/line/initAnimation.png index 1a24412cfdff0773f41da0dbc9262d564f5e5288..3648ec72927cc7e944d3332bf70409168eabc95d 100644 GIT binary patch literal 25958 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 Date: Thu, 2 Jun 2022 00:19:25 +0200 Subject: [PATCH 06/18] improves code on default application and drawPoint function --- src/helpers/helpers.canvas.js | 27 ++++++++++++++++----------- src/helpers/helpers.options.js | 25 +++++++++++-------------- src/types/ellipse.js | 2 +- src/types/point.js | 2 +- 4 files changed, 29 insertions(+), 27 deletions(-) diff --git a/src/helpers/helpers.canvas.js b/src/helpers/helpers.canvas.js index 7325aeda6..048966df9 100644 --- a/src/helpers/helpers.canvas.js +++ b/src/helpers/helpers.canvas.js @@ -3,10 +3,12 @@ import {clampAll} from './helpers.core'; import {calculateTextAlignment, getSize} from './helpers.options'; const widthCache = new Map(); +const notRadius = (radius) => isNaN(radius) || radius <= 0; /** * @typedef { import('chart.js').Point } Point * @typedef { import('../../types/label').CoreLabelOptions } CoreLabelOptions + * @typedef { import('../../types/options').PointAnnotationOptions } PointAnnotationOptions */ /** @@ -161,24 +163,27 @@ function setTextStrokeStyle(ctx, options) { } } +/** + * @param {CanvasRenderingContext2D} ctx + * @param {{radius: number, options: PointAnnotationOptions}} element + * @param {number} x + * @param {number} y + */ export function drawPoint(ctx, element, x, y) { const {radius, options} = element; const style = options.pointStyle; const rotation = options.rotation; let rad = (rotation || 0) * RAD_PER_DEG; - if (style && typeof style === 'object') { - const type = style.toString(); - if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') { - ctx.save(); - ctx.translate(x, y); - ctx.rotate(rad); - ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height); - ctx.restore(); - return; - } + if (isImageOrCanvas(style)) { + ctx.save(); + ctx.translate(x, y); + ctx.rotate(rad); + ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height); + ctx.restore(); + return; } - if (isNaN(radius) || radius <= 0) { + if (notRadius(radius)) { return; } drawPointStyle(ctx, {x, y, radius, rotation, style, rad}); diff --git a/src/helpers/helpers.options.js b/src/helpers/helpers.options.js index 11460f616..915ed0a11 100644 --- a/src/helpers/helpers.options.js +++ b/src/helpers/helpers.options.js @@ -1,11 +1,6 @@ import {isObject, valueOrDefault, defined, callback} from 'chart.js/helpers'; import {clamp} from './helpers.core'; -const animationTypes = { - xy: (area, {centerX, centerY}) => ({x: centerX, y: centerY, x2: centerX, y2: centerY, width: 0, height: 0}), - center: (area, {centerX, centerY}) => ({centerX, centerY, radius: 0, width: 0, height: 0}), -}; - const isPercentString = (s) => typeof s === 'string' && s.endsWith('%'); const toPercent = (s) => clamp(parseFloat(s) / 100, 0, 1); @@ -97,27 +92,29 @@ export function isBoundToPoint(options) { * @param {Chart} chart * @param {AnnotationBoxModel} properties * @param {CoreAnnotationOptions} options - * @param {string} [type='xy'] + * @param {boolean} [centerBased=false] * @returns {AnnotationBoxModel} */ -export function initAnimationProperties(chart, properties, options, type = 'xy') { +export function initAnimationProperties(chart, properties, options, centerBased = false) { const initAnim = options.initAnimation; if (!initAnim) { return; } else if (initAnim === true) { - return applyDefault(chart, properties, type); + return applyDefault(properties, centerBased); } - return checkCallbackResult(chart, properties, type, callback(initAnim, [{chart, properties, options}])); + return checkCallbackResult(properties, centerBased, callback(initAnim, [{chart, properties, options}])); } -function applyDefault(chart, properties, type) { - const typeImpl = animationTypes[type]; - return typeImpl(chart.chartArea, properties); +function applyDefault({centerX, centerY}, centerBased) { + if (centerBased) { + return {centerX, centerY, radius: 0, width: 0, height: 0}; + } + return {x: centerX, y: centerY, x2: centerX, y2: centerY, width: 0, height: 0}; } -function checkCallbackResult(chart, properties, type, result) { +function checkCallbackResult(properties, centerBased, result) { if (result === true) { - return applyDefault(chart, properties, type); + return applyDefault(properties, centerBased); } else if (isObject(result)) { return result; } diff --git a/src/types/ellipse.js b/src/types/ellipse.js index 1be5ab536..b3ea45e64 100644 --- a/src/types/ellipse.js +++ b/src/types/ellipse.js @@ -40,7 +40,7 @@ export default class EllipseAnnotation extends Element { resolveElementProperties(chart, options) { const properties = resolveBoxProperties(chart, options); - properties.initProperties = initAnimationProperties(chart, properties, options, 'center'); + properties.initProperties = initAnimationProperties(chart, properties, options, true); return properties; } diff --git a/src/types/point.js b/src/types/point.js index ae7b81729..712d53c5f 100644 --- a/src/types/point.js +++ b/src/types/point.js @@ -39,7 +39,7 @@ export default class PointAnnotation extends Element { resolveElementProperties(chart, options) { const properties = resolvePointProperties(chart, options); - properties.initProperties = initAnimationProperties(chart, properties, options, 'center'); + properties.initProperties = initAnimationProperties(chart, properties, options, true); return properties; } } From 05aa1b518a80ba871b39fa9c673321e1986ff82f Mon Sep 17 00:00:00 2001 From: stockiNail Date: Thu, 2 Jun 2022 00:37:09 +0200 Subject: [PATCH 07/18] adds test case on callback which returns undef --- test/fixtures/box/initAnimation.js | 12 ++++++------ test/fixtures/box/initAnimation.png | Bin 17582 -> 14596 bytes test/fixtures/ellipse/initAnimation.js | 2 +- test/fixtures/label/initAnimation.js | 12 ++++++------ test/fixtures/label/initAnimation.png | Bin 16092 -> 12722 bytes test/fixtures/line/initAnimation.js | 12 ++++++------ test/fixtures/line/initAnimation.png | Bin 25958 -> 22302 bytes test/fixtures/point/initAnimation.js | 2 +- test/fixtures/polygon/initAnimation.js | 2 +- 9 files changed, 21 insertions(+), 21 deletions(-) diff --git a/test/fixtures/box/initAnimation.js b/test/fixtures/box/initAnimation.js index 299f0b473..3f0185d58 100644 --- a/test/fixtures/box/initAnimation.js +++ b/test/fixtures/box/initAnimation.js @@ -32,7 +32,7 @@ module.exports = { borderWidth: 1, label: { display: true, - content: 'initAnimation: true' + content: 'true' } }, box2: { @@ -41,13 +41,13 @@ module.exports = { xMax: 'July', yMin: 11, yMax: 15, - initAnimation: false, + initAnimation: () => undefined, backgroundColor: 'rgba(255, 99, 132, 0.5)', borderColor: 'rgba(255, 99, 132)', borderWidth: 1, label: { display: true, - content: 'initAnimation: false' + content: 'callback undef' } }, box3: { @@ -62,7 +62,7 @@ module.exports = { borderWidth: 1, label: { display: true, - content: 'initAnimation: callback' + content: 'callback' } }, box4: { @@ -77,7 +77,7 @@ module.exports = { borderWidth: 1, label: { display: true, - content: 'initAnimation: callback object' + content: 'callback object' } }, box5: { @@ -91,7 +91,7 @@ module.exports = { borderWidth: 1, label: { display: true, - content: 'initAnimation: fallback' + content: 'fallback' } } } diff --git a/test/fixtures/box/initAnimation.png b/test/fixtures/box/initAnimation.png index a97779ade2e1c124e653a96c754e4c35d121eabd..29a78587db169cdf925aa449ea5dc016f4ea9c66 100644 GIT binary patch literal 14596 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 diff --git a/test/fixtures/ellipse/initAnimation.js b/test/fixtures/ellipse/initAnimation.js index 4b3468e2c..b3614cb6b 100644 --- a/test/fixtures/ellipse/initAnimation.js +++ b/test/fixtures/ellipse/initAnimation.js @@ -37,7 +37,7 @@ module.exports = { xMax: 'July', yMin: 11, yMax: 15, - initAnimation: false, + initAnimation: () => undefined, backgroundColor: 'rgba(255, 99, 132, 0.5)', borderColor: 'rgba(255, 99, 132)', borderWidth: 1 diff --git a/test/fixtures/label/initAnimation.js b/test/fixtures/label/initAnimation.js index 359b30644..5b81d2360 100644 --- a/test/fixtures/label/initAnimation.js +++ b/test/fixtures/label/initAnimation.js @@ -30,7 +30,7 @@ module.exports = { backgroundColor: 'rgba(255, 99, 132, 0.5)', borderColor: 'rgb(255, 99, 132)', borderWidth: 1, - content: 'initAnimation: true' + content: 'true' }, label2: { type: 'label', @@ -38,11 +38,11 @@ module.exports = { xMax: 'July', yMin: 11, yMax: 15, - initAnimation: false, + initAnimation: () => undefined, backgroundColor: 'rgba(255, 99, 132, 0.5)', borderColor: 'rgba(255, 99, 132)', borderWidth: 1, - content: 'initAnimation: false' + content: 'callback undef' }, label3: { type: 'label', @@ -54,7 +54,7 @@ module.exports = { backgroundColor: 'rgba(255, 99, 132, 0.5)', borderColor: 'rgba(255, 99, 132)', borderWidth: 1, - content: 'initAnimation: callback' + content: 'callback' }, label4: { type: 'label', @@ -66,7 +66,7 @@ module.exports = { backgroundColor: 'rgba(255, 99, 132, 0.5)', borderColor: 'rgba(255, 99, 132)', borderWidth: 1, - content: 'initAnimation: callback object' + content: 'callback object' }, label5: { type: 'label', @@ -77,7 +77,7 @@ module.exports = { backgroundColor: 'rgba(255, 99, 132, 0.5)', borderColor: 'rgba(255, 99, 132)', borderWidth: 1, - content: 'initAnimation: fallback' + content: 'fallback' } } } diff --git a/test/fixtures/label/initAnimation.png b/test/fixtures/label/initAnimation.png index 3d1f7407d1b34a9f21aa9c917cef777b7f670d9a..13b88efdad34e9b23d1cbea785da5feb26edd264 100644 GIT binary patch literal 12722 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 WD)m0Z83cg;jvJpknt#~k`hNgZ{n#M@ literal 16092 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 Xj=2{xu{~-K_@j6Bl5UZX!-M|@Ukvlz diff --git a/test/fixtures/line/initAnimation.js b/test/fixtures/line/initAnimation.js index 6014b19fe..782f168ff 100644 --- a/test/fixtures/line/initAnimation.js +++ b/test/fixtures/line/initAnimation.js @@ -30,7 +30,7 @@ module.exports = { borderColor: 'rgb(255, 99, 132)', label: { display: true, - content: 'initAnimation: true' + content: 'true' } }, line2: { @@ -39,11 +39,11 @@ module.exports = { xMax: 'July', yMin: 11, yMax: 15, - initAnimation: false, + initAnimation: () => undefined, borderColor: 'rgba(255, 99, 132)', label: { display: true, - content: 'initAnimation: false' + content: 'callback undef' } }, line3: { @@ -56,7 +56,7 @@ module.exports = { borderColor: 'rgba(255, 99, 132)', label: { display: true, - content: 'initAnimation: callback' + content: 'callback' } }, line4: { @@ -69,7 +69,7 @@ module.exports = { borderColor: 'rgba(255, 99, 132)', label: { display: true, - content: 'initAnimation: callback object' + content: 'callback object' } }, line5: { @@ -81,7 +81,7 @@ module.exports = { borderColor: 'rgba(255, 99, 132)', label: { display: true, - content: 'initAnimation: fallback' + content: 'fallback' } } } diff --git a/test/fixtures/line/initAnimation.png b/test/fixtures/line/initAnimation.png index 3648ec72927cc7e944d3332bf70409168eabc95d..5b2d1051291e4e0eb865a67b889c9276eed96679 100644 GIT binary patch literal 22302 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%0A0@4iIuR7$1sEyEE87`N)Dlfmn; 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 Q@arhMV<(Q59zGNQKllcT6aWAK literal 25958 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 undefined, backgroundColor: 'rgba(255, 99, 132, 0.5)', borderColor: 'rgba(255, 99, 132)', borderWidth: 1 diff --git a/test/fixtures/polygon/initAnimation.js b/test/fixtures/polygon/initAnimation.js index f29abdf2a..ddc732c59 100644 --- a/test/fixtures/polygon/initAnimation.js +++ b/test/fixtures/polygon/initAnimation.js @@ -39,7 +39,7 @@ module.exports = { xMax: 'July', yMin: 11, yMax: 15, - initAnimation: false, + initAnimation: () => undefined, backgroundColor: 'rgba(255, 99, 132, 0.5)', borderColor: 'rgba(255, 99, 132)', borderWidth: 1, From 2247bc19b642742273ac2873fd26bc4fbf618d35 Mon Sep 17 00:00:00 2001 From: stockiNail Date: Fri, 3 Jun 2022 13:41:35 +0200 Subject: [PATCH 08/18] adds animation spec to test that the annotation is really animating --- test/specs/animation.spec.js | 71 ++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 test/specs/animation.spec.js diff --git a/test/specs/animation.spec.js b/test/specs/animation.spec.js new file mode 100644 index 000000000..b1a0c0dd9 --- /dev/null +++ b/test/specs/animation.spec.js @@ -0,0 +1,71 @@ +describe('Animation', function() { + + for (const type of ['box', 'ellipse', 'label', 'line', 'point', 'polygon']) { + let count = 0; + + const plugin = { + id: 'initAnim', + afterInit() { + count = 0; + }, + afterDraw(chart) { + const element = window.getAnnotationElements(chart)[0]; + const {width} = element.getProps(['width'], true); + if (element.width === width) { + count++; + } + expect(count).toBeLessThanOrEqual(1); + } + }; + + const chartConfig = { + type: 'scatter', + plugins: [plugin], + options: { + scales: { + x: { + display: false, + min: 0, + max: 10 + }, + y: { + display: false, + min: 0, + max: 10 + } + }, + plugins: { + legend: false, + annotation: { + common: { + } + } + } + } + }; + + const options = { + type, + xMin: 2, + yMin: 4, + xMax: 8, + yMax: 6, + borderWidth: 0 + }; + + const pluginOpts = chartConfig.options.plugins.annotation; + const commonOpts = pluginOpts.common; + + it(`should reach the final position once in ${type} annotation`, function() { + + [commonOpts, options].forEach(function(targetOptions) { + targetOptions.initAnimation = true; + pluginOpts.annotations = [options]; + window.acquireChart(chartConfig); + delete targetOptions.initAnimation; + }); + + }); + } + +}); From 99100620087bf7a2cd8f18555f1ca80b2da6a37c Mon Sep 17 00:00:00 2001 From: stockiNail Date: Fri, 3 Jun 2022 13:55:42 +0200 Subject: [PATCH 09/18] adds types --- types/element.d.ts | 3 ++- types/options.d.ts | 7 +++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/types/element.d.ts b/types/element.d.ts index 557aa4aa4..8ed43be07 100644 --- a/types/element.d.ts +++ b/types/element.d.ts @@ -8,7 +8,8 @@ export interface AnnotationBoxModel { centerX: number, centerY: number, height: number, - width: number + width: number, + radius?: number } export interface AnnotationElement extends AnnotationBoxModel { diff --git a/types/options.d.ts b/types/options.d.ts index fc55257d7..a0487d13b 100644 --- a/types/options.d.ts +++ b/types/options.d.ts @@ -1,6 +1,7 @@ -import { Color, PointStyle, BorderRadius, CoreInteractionOptions } from 'chart.js'; +import { Chart, Color, PointStyle, BorderRadius, CoreInteractionOptions } from 'chart.js'; import { AnnotationEvents, PartialEventContext } from './events'; import { LabelOptions, BoxLabelOptions, LabelTypeOptions } from './label'; +import { AnnotationBoxModel } from './element'; export type DrawTime = 'afterDraw' | 'afterDatasetsDraw' | 'beforeDraw' | 'beforeDatasetsDraw'; @@ -36,6 +37,7 @@ export interface CoreAnnotationOptions extends AnnotationEvents, ShadowOptions { borderDashOffset?: Scriptable, drawTime?: Scriptable, endValue?: Scriptable, + initAnimation: boolean | ((chart: Chart, properties: AnnotationBoxModel, options: AnnotationOptions) => void | boolean | AnnotationBoxModel), scaleID?: Scriptable, value?: Scriptable, xScaleID?: Scriptable, @@ -154,7 +156,8 @@ interface PolygonAnnotationOptions extends CoreAnnotationOptions, AnnotationPoin } export interface AnnotationPluginCommonOptions { - drawTime?: Scriptable + drawTime?: Scriptable, + initAnimation: boolean | ((chart: Chart, properties: AnnotationBoxModel, options: AnnotationOptions) => void | boolean | AnnotationBoxModel) } export interface AnnotationPluginOptions extends AnnotationEvents { From 92dfb510639dfce65c15d4c0953b2bc3480d08c7 Mon Sep 17 00:00:00 2001 From: stockiNail Date: Fri, 3 Jun 2022 15:26:03 +0200 Subject: [PATCH 10/18] adds doc --- docs/guide/configuration.md | 31 +++++++++++++++++++++++++++++- docs/guide/types/_commonOptions.md | 1 + 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/docs/guide/configuration.md b/docs/guide/configuration.md index 7ef439717..bd878d345 100644 --- a/docs/guide/configuration.md +++ b/docs/guide/configuration.md @@ -54,7 +54,7 @@ const options = { | Name | Option | Value | ---- | ---- | ---- -| `numbers` | `properties` | `['x', 'y', 'x2', 'y2', 'width', 'height', 'centerX', 'centerY', 'pointX', 'pointY', 'labelX', 'labelY', 'labelWidth', 'labelHeight', 'radius']` +| `numbers` | `properties` | `['x', 'y', 'x2', 'y2', 'width', 'height', 'centerX', 'centerY', 'pointX', 'pointY', 'radius']` | `numbers` | `type` | `number` ## Common @@ -64,6 +64,35 @@ The following options apply to all annotations unless they are overwritten on a | Name | Type | [Scriptable](options#scriptable-options) | Default | Notes | ---- | ---- | :----: | ---- | ---- | `drawTime` | `string` | Yes | `'afterDatasetsDraw'` | See [drawTime](options#draw-time). +| `initAnimation` | `boolean` | [See initial animation](#initial-animation) | `false` | Enable the animation to the annotations when they are drawing at chart initialization + +### Initial animation + +The `initAnimation` option is scriptable but it doesn't get the [options context](./options#option-context) as argument but a specific context because the element has not been initialized yet, when the callback is invoked. + +This is the signature of the scriptable option: + +```javascript +({chart, properties, options}) => void | boolean | AnnotationBoxModel +``` + +where the properties is the element model + +```javascript +{ + x: number, + y: number, + x2: number, + y2: number, + centerX: number, + centerY: number, + width: number, + height: number, + radius?: number +} +``` + +which can be used in the callback to return an object with the initial values of the element, to provide own initial animation. ## Events diff --git a/docs/guide/types/_commonOptions.md b/docs/guide/types/_commonOptions.md index d4df88196..f45fc817b 100644 --- a/docs/guide/types/_commonOptions.md +++ b/docs/guide/types/_commonOptions.md @@ -12,6 +12,7 @@ The following options are available for all annotations. | [`borderShadowColor`](#styling) | [`Color`](../options#color) | Yes | `'transparent'` | [`display`](#general) | `boolean` | Yes | `true` | [`drawTime`](#general) | `string` | Yes | `'afterDatasetsDraw'` +| [`initAnimation`](../configuration.html#common) | `boolean` | [See initial animation](../configuration.html#initial-animation) | `undefined` | [`shadowBlur`](#styling) | `number` | Yes | `0` | [`shadowOffsetX`](#styling) | `number` | Yes | `0` | [`shadowOffsetY`](#styling) | `number` | Yes | `0` From 781a2f6cf23a7e8ad36bf64f931bdc4b379325a6 Mon Sep 17 00:00:00 2001 From: stockiNail Date: Fri, 3 Jun 2022 16:11:22 +0200 Subject: [PATCH 11/18] adds samples --- docs/.vuepress/config.js | 2 + docs/samples/box/initAnim.md | 120 +++++++++++++++++++++++++ docs/samples/point/initAnim.md | 156 +++++++++++++++++++++++++++++++++ 3 files changed, 278 insertions(+) create mode 100644 docs/samples/box/initAnim.md create mode 100644 docs/samples/point/initAnim.md diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index e5c0e310d..df4d87fc4 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -117,6 +117,7 @@ module.exports = { 'box/disclosure', 'box/canvas', 'box/image', + 'box/initAnim', ] }, { @@ -161,6 +162,7 @@ module.exports = { 'point/combined', 'point/outsideChartArea', 'point/shadow', + 'point/initAnim', ] }, { diff --git a/docs/samples/box/initAnim.md b/docs/samples/box/initAnim.md new file mode 100644 index 000000000..9a0282c69 --- /dev/null +++ b/docs/samples/box/initAnim.md @@ -0,0 +1,120 @@ +# Initial animations + +```js chart-editor +// +const DATA_COUNT = 12; +const MIN = 10; +const MAX = 100; + +const numberCfg = {count: DATA_COUNT, min: MIN, max: MAX}; + +const data = { + labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], + datasets: [{ + data: Utils.numbers(numberCfg) + }] +}; +// + +// +const annotation1 = { + type: 'box', + backgroundColor: 'rgba(0, 150, 0, 0.2)', + borderColor: 'rgba(0, 150, 0)', + borderRadius: 4, + borderWidth: 1, + initAnimation: true, + label: { + display: true, + content: 'Fade' + }, + xMax: 6.5, + xMin: 4.5, + yMax: 60, + yMin: 40 +}; +// + +// +const annotation2 = { + type: 'box', + backgroundColor: 'rgba(0, 150, 0, 0.2)', + borderColor: 'rgba(0, 150, 0)', + borderRadius: 4, + borderWidth: 1, + initAnimation: () => ({y: 0, y2: 0}), + label: { + display: true, + content: 'Flyin from top' + }, + xMax: 2.5, + xMin: 0.5, + yMax: 30, + yMin: 10 +}; +// + +// +const annotation3 = { + type: 'box', + backgroundColor: 'rgba(0, 150, 0, 0.2)', + borderColor: 'rgba(0, 150, 0)', + borderRadius: 4, + borderWidth: 1, + initAnimation: () => ({x: 0, x2: 0}), + label: { + display: true, + content: 'Flyin from left' + }, + xMax: 10.5, + xMin: 8.5, + yMax: 90, + yMin: 70 +}; +// + +/* */ +const config = { + type: 'line', + data, + options: { + scales: { + y: { + beginAtZero: true, + max: 100, + min: 0 + } + }, + plugins: { + annotation: { + common: { + drawTime: 'afterDraw' + }, + annotations: { + annotation1, + annotation2, + annotation3 + } + } + } + } +}; +/* */ + +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(); + } + } +]; + +module.exports = { + actions: actions, + config: config, +}; +``` diff --git a/docs/samples/point/initAnim.md b/docs/samples/point/initAnim.md new file mode 100644 index 000000000..6390c020f --- /dev/null +++ b/docs/samples/point/initAnim.md @@ -0,0 +1,156 @@ +# Initial animations + +```js chart-editor +// +const DATA_COUNT = 12; +const MIN = 10; +const MAX = 100; + +const numberCfg = {count: DATA_COUNT, min: MIN, max: MAX}; + +const data = { + labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], + datasets: [{ + data: Utils.numbers(numberCfg) + }] +}; +// + +// +const annotation1 = { + type: 'point', + backgroundColor: 'rgba(0, 150, 0, 0.2)', + borderColor: 'rgba(0, 150, 0)', + borderRadius: 4, + borderWidth: 1, + initAnimation: true, + label: { + display: true, + content: 'Fade', + textAlign: 'center' + }, + radius: 40, + xMax: 6.5, + xMin: 4.5, + yMax: 60, + yMin: 40 +}; +const labelAnnotation1 = { + type: 'label', + initAnimation: true, + content: 'Fade', + xMax: 6.5, + xMin: 4.5, + yMax: 60, + yMin: 40 +}; +// + +// +const annotation2 = { + type: 'point', + backgroundColor: 'rgba(0, 150, 0, 0.2)', + borderColor: 'rgba(0, 150, 0)', + borderRadius: 4, + borderWidth: 1, + initAnimation: () => ({centerY: 0}), + label: { + display: true, + content: 'Flyin from top', + textAlign: 'center' + }, + radius: 40, + xMax: 2.5, + xMin: 0.5, + yMax: 30, + yMin: 10 +}; +const labelAnnotation2 = { + type: 'label', + initAnimation: () => ({y: 0, y2: 0, width: 0, height: 0}), + content: 'Flyin from top', + xMax: 2.5, + xMin: 0.5, + yMax: 30, + yMin: 10 +}; +// + +// +const annotation3 = { + type: 'point', + backgroundColor: 'rgba(0, 150, 0, 0.2)', + borderColor: 'rgba(0, 150, 0)', + borderRadius: 4, + borderWidth: 1, + initAnimation: () => ({centerX: 0}), + label: { + display: true, + content: 'Flyin from left', + textAlign: 'center' + }, + radius: 40, + xMax: 10.5, + xMin: 8.5, + yMax: 90, + yMin: 70 +}; +const labelAnnotation3 = { + type: 'label', + initAnimation: () => ({x: 0, x2: 0, width: 0, height: 0}), + content: 'Flyin from left', + xMax: 10.5, + xMin: 8.5, + yMax: 90, + yMin: 70 +}; +// + +/* */ +const config = { + type: 'line', + data, + options: { + scales: { + y: { + beginAtZero: true, + max: 100, + min: 0 + } + }, + plugins: { + annotation: { + common: { + drawTime: 'afterDraw' + }, + annotations: { + annotation1, + labelAnnotation1, + annotation2, + labelAnnotation2, + annotation3, + labelAnnotation3 + } + } + } + } +}; +/* */ + +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(); + } + } +]; + +module.exports = { + actions: actions, + config: config, +}; +``` From 6ca8aeccdb57e719153f4a9ccc553e95fdfa1113 Mon Sep 17 00:00:00 2001 From: stockiNail Date: Fri, 3 Jun 2022 22:02:11 +0200 Subject: [PATCH 12/18] fixes and improves test case on init animation --- test/specs/animation.spec.js | 144 ++++++++++++++++++++++++++++------- 1 file changed, 118 insertions(+), 26 deletions(-) diff --git a/test/specs/animation.spec.js b/test/specs/animation.spec.js index b1a0c0dd9..7d5380b18 100644 --- a/test/specs/animation.spec.js +++ b/test/specs/animation.spec.js @@ -1,27 +1,21 @@ -describe('Animation', function() { - - for (const type of ['box', 'ellipse', 'label', 'line', 'point', 'polygon']) { - let count = 0; - - const plugin = { - id: 'initAnim', - afterInit() { - count = 0; - }, - afterDraw(chart) { - const element = window.getAnnotationElements(chart)[0]; - const {width} = element.getProps(['width'], true); - if (element.width === width) { - count++; - } - expect(count).toBeLessThanOrEqual(1); - } - }; +describe('Initial animation', function() { + const types = { + box: 'x', + ellipse: 'width', + label: 'x', + line: 'x', + point: 'radius', + polygon: 'y' + }; + + for (const type of Object.keys(types)) { const chartConfig = { type: 'scatter', - plugins: [plugin], options: { + animation: { + duration: 500 + }, scales: { x: { display: false, @@ -46,26 +40,124 @@ describe('Animation', function() { const options = { type, - xMin: 2, + xMin: 4, yMin: 4, - xMax: 8, + xMax: 6, yMax: 6, + radius: 40, borderWidth: 0 }; - const pluginOpts = chartConfig.options.plugins.annotation; - const commonOpts = pluginOpts.common; + it(`should reach the final position once in ${type} annotation`, function(done) { - it(`should reach the final position once in ${type} annotation`, function() { + const pluginOpts = chartConfig.options.plugins.annotation; + const commonOpts = pluginOpts.common; + const property = types[type]; + let cycles = 0; + + chartConfig.plugins = [{ + id: 'initAnimEnabled', + afterInit(chart) { + chart.annotationCount = 0; + }, + afterDraw(chart) { + let element = window.getAnnotationElements(chart)[0]; + chart.initAnimation = element.options.initAnimation; + if (type === 'polygon') { + element = element.elements[0]; + } + const opts = element.getProps([property], true); + const valueFinal = opts[property]; + const value = element[property]; + if (value === valueFinal) { + chart.annotationCount++; + } + }, + afterRender(chart) { + cycles++; + if (cycles === 2) { + expect(chart.annotationCount <= 1 && chart.initAnimation).withContext(`with count ${chart.annotationCount}, initAnimation ${chart.initAnimation}`).toEqual(true); + done(); + } + } + }]; [commonOpts, options].forEach(function(targetOptions) { + delete commonOpts.initAnimation; + delete options.initAnimation; targetOptions.initAnimation = true; pluginOpts.annotations = [options]; window.acquireChart(chartConfig); - delete targetOptions.initAnimation; }); }); + + it(`should not update the position in ${type} annotation`, function(done) { + + const pluginOpts = chartConfig.options.plugins.annotation; + const commonOpts = pluginOpts.common; + const property = types[type]; + let cycles = 0; + + chartConfig.plugins = [{ + id: 'initAnimDisabled', + afterInit(chart) { + chart.annotationCount = 0; + }, + afterDraw(chart) { + let element = window.getAnnotationElements(chart)[0]; + chart.initAnimation = element.options.initAnimation; + if (type === 'polygon') { + element = element.elements[0]; + } + const opts = element.getProps([property], true); + const valueFinal = opts[property]; + const value = element[property]; + if (value !== valueFinal) { + chart.annotationCount++; + } + }, + afterRender(chart) { + expect(chart.annotationCount === 0 && !chart.initAnimation).withContext(`with count ${chart.annotationCount}, initAnimation ${chart.initAnimation}`).toEqual(true); + cycles++; + if (cycles === 2) { + done(); + } + } + }]; + + [commonOpts, options].forEach(function(targetOptions) { + delete commonOpts.initAnimation; + delete options.initAnimation; + targetOptions.initAnimation = false; + pluginOpts.annotations = [options]; + window.acquireChart(chartConfig); + }); + + }); + + it(` callback should not receive the element properties in ${type} annotation`, function(done) { + + const pluginOpts = chartConfig.options.plugins.annotation; + const commonOpts = pluginOpts.common; + let cycles = 0; + + [commonOpts, options].forEach(function(targetOptions) { + delete commonOpts.initAnimation; + delete options.initAnimation; + targetOptions.initAnimation = function({chart, properties, options}) { + expect(typeof properties === 'object').toEqual(true); + cycles++; + if (cycles === 2) { + done(); + } + }; + pluginOpts.annotations = [options]; + window.acquireChart(chartConfig); + }); + + }); + } }); From 983f197d2eb1fec967cb2b6a6e81093a1816d6c0 Mon Sep 17 00:00:00 2001 From: stockiNail Date: Fri, 3 Jun 2022 22:07:02 +0200 Subject: [PATCH 13/18] fixes lint --- test/specs/animation.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/specs/animation.spec.js b/test/specs/animation.spec.js index 7d5380b18..992d6ea40 100644 --- a/test/specs/animation.spec.js +++ b/test/specs/animation.spec.js @@ -141,11 +141,11 @@ describe('Initial animation', function() { const pluginOpts = chartConfig.options.plugins.annotation; const commonOpts = pluginOpts.common; let cycles = 0; - + [commonOpts, options].forEach(function(targetOptions) { delete commonOpts.initAnimation; delete options.initAnimation; - targetOptions.initAnimation = function({chart, properties, options}) { + targetOptions.initAnimation = function({properties}) { expect(typeof properties === 'object').toEqual(true); cycles++; if (cycles === 2) { From 3e70704e3a0a8d0ee951d0be8d6f0956997c0cd8 Mon Sep 17 00:00:00 2001 From: stockiNail Date: Fri, 3 Jun 2022 22:13:47 +0200 Subject: [PATCH 14/18] fixes multiple access to cart config in test case --- test/specs/animation.spec.js | 147 ++++++++++++++++++++++++++--------- 1 file changed, 112 insertions(+), 35 deletions(-) diff --git a/test/specs/animation.spec.js b/test/specs/animation.spec.js index 992d6ea40..1f01936e4 100644 --- a/test/specs/animation.spec.js +++ b/test/specs/animation.spec.js @@ -10,45 +10,46 @@ describe('Initial animation', function() { }; for (const type of Object.keys(types)) { - const chartConfig = { - type: 'scatter', - options: { - animation: { - duration: 500 - }, - scales: { - x: { - display: false, - min: 0, - max: 10 + + it(`should reach the final position once in ${type} annotation`, function(done) { + + const chartConfig = { + type: 'scatter', + options: { + animation: { + duration: 500 }, - y: { - display: false, - min: 0, - max: 10 - } - }, - plugins: { - legend: false, - annotation: { - common: { + scales: { + x: { + display: false, + min: 0, + max: 10 + }, + y: { + display: false, + min: 0, + max: 10 + } + }, + plugins: { + legend: false, + annotation: { + common: { + } } } } - } - }; - - const options = { - type, - xMin: 4, - yMin: 4, - xMax: 6, - yMax: 6, - radius: 40, - borderWidth: 0 - }; - - it(`should reach the final position once in ${type} annotation`, function(done) { + }; + + const options = { + type, + xMin: 4, + yMin: 4, + xMax: 6, + yMax: 6, + radius: 40, + borderWidth: 0 + }; const pluginOpts = chartConfig.options.plugins.annotation; const commonOpts = pluginOpts.common; @@ -94,6 +95,44 @@ describe('Initial animation', function() { it(`should not update the position in ${type} annotation`, function(done) { + const chartConfig = { + type: 'scatter', + options: { + animation: { + duration: 500 + }, + scales: { + x: { + display: false, + min: 0, + max: 10 + }, + y: { + display: false, + min: 0, + max: 10 + } + }, + plugins: { + legend: false, + annotation: { + common: { + } + } + } + } + }; + + const options = { + type, + xMin: 4, + yMin: 4, + xMax: 6, + yMax: 6, + radius: 40, + borderWidth: 0 + }; + const pluginOpts = chartConfig.options.plugins.annotation; const commonOpts = pluginOpts.common; const property = types[type]; @@ -138,6 +177,44 @@ describe('Initial animation', function() { it(` callback should not receive the element properties in ${type} annotation`, function(done) { + const chartConfig = { + type: 'scatter', + options: { + animation: { + duration: 500 + }, + scales: { + x: { + display: false, + min: 0, + max: 10 + }, + y: { + display: false, + min: 0, + max: 10 + } + }, + plugins: { + legend: false, + annotation: { + common: { + } + } + } + } + }; + + const options = { + type, + xMin: 4, + yMin: 4, + xMax: 6, + yMax: 6, + radius: 40, + borderWidth: 0 + }; + const pluginOpts = chartConfig.options.plugins.annotation; const commonOpts = pluginOpts.common; let cycles = 0; From 962ee4be6485b9964677f981d89a276f7aed0de7 Mon Sep 17 00:00:00 2001 From: stockiNail Date: Mon, 6 Jun 2022 12:07:18 +0200 Subject: [PATCH 15/18] 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 8aea0ad2ea7c10b19eb9a96d4c24254d26fa04dc Mon Sep 17 00:00:00 2001 From: stockiNail Date: Thu, 29 Sep 2022 00:02:33 +0200 Subject: [PATCH 16/18] apply review --- src/elements.js | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/elements.js b/src/elements.js index b6b530b17..55cd976bf 100644 --- a/src/elements.js +++ b/src/elements.js @@ -61,7 +61,7 @@ export function updateElements(chart, state, options, mode) { Object.assign(element, properties); } - applyInitProperties(element, properties.initProperties); + Object.assign(element, properties.initProperties); properties.options = resolveAnnotationOptions(resolver); animations.update(element, properties); @@ -97,7 +97,7 @@ function getOrCreateElement(elements, index, type, initProperties) { let element = elements[index]; if (!element || !(element instanceof elementClass)) { element = elements[index] = new elementClass(); - applyInitProperties(element, initProperties); + Object.assign(element, initProperties); } return element; } @@ -147,9 +147,3 @@ function resyncElements(elements, annotations) { } return elements; } - -function applyInitProperties(element, initProperties) { - if (isObject(initProperties)) { - Object.assign(element, initProperties); - } -} From 7f2e7474de150e3c5ed059a4973abc42f388704a Mon Sep 17 00:00:00 2001 From: stockiNail Date: Fri, 27 Jan 2023 18:03:07 +0100 Subject: [PATCH 17/18] changes initAnimation options name to init --- docs/guide/configuration.md | 4 ++-- docs/guide/types/_commonOptions.md | 2 +- docs/samples/box/initAnim.md | 6 +++--- docs/samples/point/initAnim.md | 12 ++++++------ src/annotation.js | 4 ++-- src/helpers/helpers.options.js | 2 +- src/types/box.js | 2 +- src/types/ellipse.js | 2 +- src/types/label.js | 2 +- src/types/line.js | 2 +- src/types/point.js | 2 +- src/types/polygon.js | 2 +- test/fixtures/box/initAnimation.js | 10 +++++----- test/fixtures/ellipse/initAnimation.js | 10 +++++----- test/fixtures/label/initAnimation.js | 10 +++++----- test/fixtures/line/initAnimation.js | 10 +++++----- test/fixtures/point/initAnimation.js | 8 ++++---- test/fixtures/polygon/initAnimation.js | 8 ++++---- test/specs/animation.spec.js | 26 +++++++++++++------------- types/options.d.ts | 2 +- 20 files changed, 63 insertions(+), 63 deletions(-) diff --git a/docs/guide/configuration.md b/docs/guide/configuration.md index bd878d345..8125f4273 100644 --- a/docs/guide/configuration.md +++ b/docs/guide/configuration.md @@ -64,11 +64,11 @@ The following options apply to all annotations unless they are overwritten on a | Name | Type | [Scriptable](options#scriptable-options) | Default | Notes | ---- | ---- | :----: | ---- | ---- | `drawTime` | `string` | Yes | `'afterDatasetsDraw'` | See [drawTime](options#draw-time). -| `initAnimation` | `boolean` | [See initial animation](#initial-animation) | `false` | Enable the animation to the annotations when they are drawing at chart initialization +| `init` | `boolean` | [See initial animation](#initial-animation) | `false` | Enable the animation to the annotations when they are drawing at chart initialization ### Initial animation -The `initAnimation` option is scriptable but it doesn't get the [options context](./options#option-context) as argument but a specific context because the element has not been initialized yet, when the callback is invoked. +The `init` option is scriptable but it doesn't get the [options context](./options#option-context) as argument but a specific context because the element has not been initialized yet, when the callback is invoked. This is the signature of the scriptable option: diff --git a/docs/guide/types/_commonOptions.md b/docs/guide/types/_commonOptions.md index 7c4eb103b..0bf966050 100644 --- a/docs/guide/types/_commonOptions.md +++ b/docs/guide/types/_commonOptions.md @@ -12,7 +12,7 @@ The following options are available for all annotations. | [`borderShadowColor`](#styling) | [`Color`](../options#color) | Yes | `'transparent'` | [`display`](#general) | `boolean` | Yes | `true` | [`drawTime`](#general) | `string` | Yes | `'afterDatasetsDraw'` -| [`initAnimation`](../configuration.html#common) | `boolean` | [See initial animation](../configuration.html#initial-animation) | `undefined` +| [`init`](../configuration.html#common) | `boolean` | [See initial animation](../configuration.html#initial-animation) | `undefined` | [`id`](#general) | `string` | No | `undefined` | [`shadowBlur`](#styling) | `number` | Yes | `0` | [`shadowOffsetX`](#styling) | `number` | Yes | `0` diff --git a/docs/samples/box/initAnim.md b/docs/samples/box/initAnim.md index 9a0282c69..965894815 100644 --- a/docs/samples/box/initAnim.md +++ b/docs/samples/box/initAnim.md @@ -23,7 +23,7 @@ const annotation1 = { borderColor: 'rgba(0, 150, 0)', borderRadius: 4, borderWidth: 1, - initAnimation: true, + init: true, label: { display: true, content: 'Fade' @@ -42,7 +42,7 @@ const annotation2 = { borderColor: 'rgba(0, 150, 0)', borderRadius: 4, borderWidth: 1, - initAnimation: () => ({y: 0, y2: 0}), + init: () => ({y: 0, y2: 0}), label: { display: true, content: 'Flyin from top' @@ -61,7 +61,7 @@ const annotation3 = { borderColor: 'rgba(0, 150, 0)', borderRadius: 4, borderWidth: 1, - initAnimation: () => ({x: 0, x2: 0}), + init: () => ({x: 0, x2: 0}), label: { display: true, content: 'Flyin from left' diff --git a/docs/samples/point/initAnim.md b/docs/samples/point/initAnim.md index 6390c020f..262c1d45d 100644 --- a/docs/samples/point/initAnim.md +++ b/docs/samples/point/initAnim.md @@ -23,7 +23,7 @@ const annotation1 = { borderColor: 'rgba(0, 150, 0)', borderRadius: 4, borderWidth: 1, - initAnimation: true, + init: true, label: { display: true, content: 'Fade', @@ -37,7 +37,7 @@ const annotation1 = { }; const labelAnnotation1 = { type: 'label', - initAnimation: true, + init: true, content: 'Fade', xMax: 6.5, xMin: 4.5, @@ -53,7 +53,7 @@ const annotation2 = { borderColor: 'rgba(0, 150, 0)', borderRadius: 4, borderWidth: 1, - initAnimation: () => ({centerY: 0}), + init: () => ({centerY: 0}), label: { display: true, content: 'Flyin from top', @@ -67,7 +67,7 @@ const annotation2 = { }; const labelAnnotation2 = { type: 'label', - initAnimation: () => ({y: 0, y2: 0, width: 0, height: 0}), + init: () => ({y: 0, y2: 0, width: 0, height: 0}), content: 'Flyin from top', xMax: 2.5, xMin: 0.5, @@ -83,7 +83,7 @@ const annotation3 = { borderColor: 'rgba(0, 150, 0)', borderRadius: 4, borderWidth: 1, - initAnimation: () => ({centerX: 0}), + init: () => ({centerX: 0}), label: { display: true, content: 'Flyin from left', @@ -97,7 +97,7 @@ const annotation3 = { }; const labelAnnotation3 = { type: 'label', - initAnimation: () => ({x: 0, x2: 0, width: 0, height: 0}), + init: () => ({x: 0, x2: 0, width: 0, height: 0}), content: 'Flyin from left', xMax: 10.5, xMin: 8.5, diff --git a/src/annotation.js b/src/annotation.js index 387b0932d..a88407aae 100644 --- a/src/annotation.js +++ b/src/annotation.js @@ -115,7 +115,7 @@ export default { }, common: { drawTime: 'afterDatasetsDraw', - initAnimation: false, + init: false, label: { } } @@ -123,7 +123,7 @@ export default { descriptors: { _indexable: false, - _scriptable: (prop) => !hooks.includes(prop) && prop !== 'initAnimation', + _scriptable: (prop) => !hooks.includes(prop) && prop !== 'init', annotations: { _allKeys: false, _fallback: (prop, opts) => `elements.${annotationTypes[resolveType(opts.type)].id}` diff --git a/src/helpers/helpers.options.js b/src/helpers/helpers.options.js index 915ed0a11..87a0b259c 100644 --- a/src/helpers/helpers.options.js +++ b/src/helpers/helpers.options.js @@ -96,7 +96,7 @@ export function isBoundToPoint(options) { * @returns {AnnotationBoxModel} */ export function initAnimationProperties(chart, properties, options, centerBased = false) { - const initAnim = options.initAnimation; + const initAnim = options.init; if (!initAnim) { return; } else if (initAnim === true) { diff --git a/src/types/box.js b/src/types/box.js index 008cd5512..ef751025c 100644 --- a/src/types/box.js +++ b/src/types/box.js @@ -42,7 +42,7 @@ BoxAnnotation.defaults = { borderShadowColor: 'transparent', borderWidth: 1, display: true, - initAnimation: undefined, + init: undefined, label: { backgroundColor: 'transparent', borderWidth: 0, diff --git a/src/types/ellipse.js b/src/types/ellipse.js index 42188a4f0..0721f1ee2 100644 --- a/src/types/ellipse.js +++ b/src/types/ellipse.js @@ -59,7 +59,7 @@ EllipseAnnotation.defaults = { borderShadowColor: 'transparent', borderWidth: 1, display: true, - initAnimation: undefined, + init: undefined, label: Object.assign({}, BoxAnnotation.defaults.label), rotation: 0, shadowBlur: 0, diff --git a/src/types/label.js b/src/types/label.js index 88392f969..d9cb10031 100644 --- a/src/types/label.js +++ b/src/types/label.js @@ -87,7 +87,7 @@ LabelAnnotation.defaults = { weight: undefined }, height: undefined, - initAnimation: undefined, + init: undefined, padding: 6, position: 'center', rotation: 0, diff --git a/src/types/line.js b/src/types/line.js index 995cd7bdb..6747dc82d 100644 --- a/src/types/line.js +++ b/src/types/line.js @@ -140,7 +140,7 @@ LineAnnotation.defaults = { borderWidth: 2, display: true, endValue: undefined, - initAnimation: undefined, + init: undefined, label: { backgroundColor: 'rgba(0,0,0,0.8)', backgroundShadowColor: 'transparent', diff --git a/src/types/point.js b/src/types/point.js index 712d53c5f..696ddf4d8 100644 --- a/src/types/point.js +++ b/src/types/point.js @@ -54,7 +54,7 @@ PointAnnotation.defaults = { borderShadowColor: 'transparent', borderWidth: 1, display: true, - initAnimation: undefined, + init: undefined, pointStyle: 'circle', radius: 10, rotation: 0, diff --git a/src/types/polygon.js b/src/types/polygon.js index 03dcda210..2d622a7c5 100644 --- a/src/types/polygon.js +++ b/src/types/polygon.js @@ -73,7 +73,7 @@ PolygonAnnotation.defaults = { borderShadowColor: 'transparent', borderWidth: 1, display: true, - initAnimation: undefined, + init: undefined, point: { radius: 0 }, diff --git a/test/fixtures/box/initAnimation.js b/test/fixtures/box/initAnimation.js index 3f0185d58..19ac0721a 100644 --- a/test/fixtures/box/initAnimation.js +++ b/test/fixtures/box/initAnimation.js @@ -17,12 +17,12 @@ module.exports = { plugins: { annotation: { common: { - initAnimation: () => true, + init: () => true, }, annotations: { box1: { type: 'box', - initAnimation: true, + init: true, xMin: 0.5, xMax: 2.5, yMin: 8, @@ -41,7 +41,7 @@ module.exports = { xMax: 'July', yMin: 11, yMax: 15, - initAnimation: () => undefined, + init: () => undefined, backgroundColor: 'rgba(255, 99, 132, 0.5)', borderColor: 'rgba(255, 99, 132)', borderWidth: 1, @@ -56,7 +56,7 @@ module.exports = { xMax: 'May', yMin: 16, yMax: 20, - initAnimation: () => true, + init: () => true, backgroundColor: 'rgba(255, 99, 132, 0.5)', borderColor: 'rgba(255, 99, 132)', borderWidth: 1, @@ -71,7 +71,7 @@ module.exports = { xMax: 'May', yMin: 0.5, yMax: 4, - initAnimation: () => ({y: 0, y2: 0}), + init: () => ({y: 0, y2: 0}), backgroundColor: 'rgba(255, 99, 132, 0.5)', borderColor: 'rgba(255, 99, 132)', borderWidth: 1, diff --git a/test/fixtures/ellipse/initAnimation.js b/test/fixtures/ellipse/initAnimation.js index b3614cb6b..d7f0b9a0a 100644 --- a/test/fixtures/ellipse/initAnimation.js +++ b/test/fixtures/ellipse/initAnimation.js @@ -17,12 +17,12 @@ module.exports = { plugins: { annotation: { common: { - initAnimation: () => true, + init: () => true, }, annotations: { ellipse1: { type: 'ellipse', - initAnimation: true, + init: true, xMin: 0.5, xMax: 2.5, yMin: 8, @@ -37,7 +37,7 @@ module.exports = { xMax: 'July', yMin: 11, yMax: 15, - initAnimation: () => undefined, + init: () => undefined, backgroundColor: 'rgba(255, 99, 132, 0.5)', borderColor: 'rgba(255, 99, 132)', borderWidth: 1 @@ -48,7 +48,7 @@ module.exports = { xMax: 'May', yMin: 16, yMax: 20, - initAnimation: () => true, + init: () => true, backgroundColor: 'rgba(255, 99, 132, 0.5)', borderColor: 'rgba(255, 99, 132)', borderWidth: 1 @@ -59,7 +59,7 @@ module.exports = { xMax: 'May', yMin: 0.5, yMax: 4, - initAnimation: () => ({y: 0, y2: 0}), + init: () => ({y: 0, y2: 0}), backgroundColor: 'rgba(255, 99, 132, 0.5)', borderColor: 'rgba(255, 99, 132)', borderWidth: 1 diff --git a/test/fixtures/label/initAnimation.js b/test/fixtures/label/initAnimation.js index 5b81d2360..c4e2d9a02 100644 --- a/test/fixtures/label/initAnimation.js +++ b/test/fixtures/label/initAnimation.js @@ -17,12 +17,12 @@ module.exports = { plugins: { annotation: { common: { - initAnimation: () => true, + init: () => true, }, annotations: { label1: { type: 'label', - initAnimation: true, + init: true, xMin: 0.5, xMax: 2.5, yMin: 8, @@ -38,7 +38,7 @@ module.exports = { xMax: 'July', yMin: 11, yMax: 15, - initAnimation: () => undefined, + init: () => undefined, backgroundColor: 'rgba(255, 99, 132, 0.5)', borderColor: 'rgba(255, 99, 132)', borderWidth: 1, @@ -50,7 +50,7 @@ module.exports = { xMax: 'May', yMin: 16, yMax: 20, - initAnimation: () => true, + init: () => true, backgroundColor: 'rgba(255, 99, 132, 0.5)', borderColor: 'rgba(255, 99, 132)', borderWidth: 1, @@ -62,7 +62,7 @@ module.exports = { xMax: 'May', yMin: 0.5, yMax: 4, - initAnimation: () => ({y: 0, y2: 0}), + init: () => ({y: 0, y2: 0}), backgroundColor: 'rgba(255, 99, 132, 0.5)', borderColor: 'rgba(255, 99, 132)', borderWidth: 1, diff --git a/test/fixtures/line/initAnimation.js b/test/fixtures/line/initAnimation.js index 782f168ff..8d33e43ad 100644 --- a/test/fixtures/line/initAnimation.js +++ b/test/fixtures/line/initAnimation.js @@ -17,12 +17,12 @@ module.exports = { plugins: { annotation: { common: { - initAnimation: () => true, + init: () => true, }, annotations: { line1: { type: 'line', - initAnimation: true, + init: true, xMin: 0.5, xMax: 2.5, yMin: 8, @@ -39,7 +39,7 @@ module.exports = { xMax: 'July', yMin: 11, yMax: 15, - initAnimation: () => undefined, + init: () => undefined, borderColor: 'rgba(255, 99, 132)', label: { display: true, @@ -52,7 +52,7 @@ module.exports = { xMax: 'May', yMin: 16, yMax: 20, - initAnimation: () => true, + init: () => true, borderColor: 'rgba(255, 99, 132)', label: { display: true, @@ -65,7 +65,7 @@ module.exports = { xMax: 'May', yMin: 0.5, yMax: 4, - initAnimation: () => ({y: 0, y2: 0}), + init: () => ({y: 0, y2: 0}), borderColor: 'rgba(255, 99, 132)', label: { display: true, diff --git a/test/fixtures/point/initAnimation.js b/test/fixtures/point/initAnimation.js index d136f1eee..653b23302 100644 --- a/test/fixtures/point/initAnimation.js +++ b/test/fixtures/point/initAnimation.js @@ -17,12 +17,12 @@ module.exports = { plugins: { annotation: { common: { - initAnimation: () => true, + init: () => true, }, annotations: { point1: { type: 'point', - initAnimation: true, + init: true, xMin: 0.5, xMax: 2.5, yMin: 8, @@ -37,7 +37,7 @@ module.exports = { xMax: 'July', yMin: 11, yMax: 15, - initAnimation: () => undefined, + init: () => undefined, backgroundColor: 'rgba(255, 99, 132, 0.5)', borderColor: 'rgba(255, 99, 132)', borderWidth: 1 @@ -48,7 +48,7 @@ module.exports = { xMax: 'May', yMin: 16, yMax: 20, - initAnimation: () => true, + init: () => true, backgroundColor: 'rgba(255, 99, 132, 0.5)', borderColor: 'rgba(255, 99, 132)', borderWidth: 1 diff --git a/test/fixtures/polygon/initAnimation.js b/test/fixtures/polygon/initAnimation.js index ddc732c59..25262f7a1 100644 --- a/test/fixtures/polygon/initAnimation.js +++ b/test/fixtures/polygon/initAnimation.js @@ -17,12 +17,12 @@ module.exports = { plugins: { annotation: { common: { - initAnimation: () => true, + init: () => true, }, annotations: { polygon1: { type: 'polygon', - initAnimation: true, + init: true, xMin: 0.5, xMax: 2.5, yMin: 8, @@ -39,7 +39,7 @@ module.exports = { xMax: 'July', yMin: 11, yMax: 15, - initAnimation: () => undefined, + init: () => undefined, backgroundColor: 'rgba(255, 99, 132, 0.5)', borderColor: 'rgba(255, 99, 132)', borderWidth: 1, @@ -52,7 +52,7 @@ module.exports = { xMax: 'May', yMin: 16, yMax: 20, - initAnimation: () => true, + init: () => true, backgroundColor: 'rgba(255, 99, 132, 0.5)', borderColor: 'rgba(255, 99, 132)', borderWidth: 1, diff --git a/test/specs/animation.spec.js b/test/specs/animation.spec.js index 1f01936e4..7d2bb4e0c 100644 --- a/test/specs/animation.spec.js +++ b/test/specs/animation.spec.js @@ -63,7 +63,7 @@ describe('Initial animation', function() { }, afterDraw(chart) { let element = window.getAnnotationElements(chart)[0]; - chart.initAnimation = element.options.initAnimation; + chart.init = element.options.init; if (type === 'polygon') { element = element.elements[0]; } @@ -77,16 +77,16 @@ describe('Initial animation', function() { afterRender(chart) { cycles++; if (cycles === 2) { - expect(chart.annotationCount <= 1 && chart.initAnimation).withContext(`with count ${chart.annotationCount}, initAnimation ${chart.initAnimation}`).toEqual(true); + expect(chart.annotationCount <= 1 && chart.init).withContext(`with count ${chart.annotationCount}, init ${chart.init}`).toEqual(true); done(); } } }]; [commonOpts, options].forEach(function(targetOptions) { - delete commonOpts.initAnimation; - delete options.initAnimation; - targetOptions.initAnimation = true; + delete commonOpts.init; + delete options.init; + targetOptions.init = true; pluginOpts.annotations = [options]; window.acquireChart(chartConfig); }); @@ -145,7 +145,7 @@ describe('Initial animation', function() { }, afterDraw(chart) { let element = window.getAnnotationElements(chart)[0]; - chart.initAnimation = element.options.initAnimation; + chart.init = element.options.init; if (type === 'polygon') { element = element.elements[0]; } @@ -157,7 +157,7 @@ describe('Initial animation', function() { } }, afterRender(chart) { - expect(chart.annotationCount === 0 && !chart.initAnimation).withContext(`with count ${chart.annotationCount}, initAnimation ${chart.initAnimation}`).toEqual(true); + expect(chart.annotationCount === 0 && !chart.init).withContext(`with count ${chart.annotationCount}, init ${chart.init}`).toEqual(true); cycles++; if (cycles === 2) { done(); @@ -166,9 +166,9 @@ describe('Initial animation', function() { }]; [commonOpts, options].forEach(function(targetOptions) { - delete commonOpts.initAnimation; - delete options.initAnimation; - targetOptions.initAnimation = false; + delete commonOpts.init; + delete options.init; + targetOptions.init = false; pluginOpts.annotations = [options]; window.acquireChart(chartConfig); }); @@ -220,9 +220,9 @@ describe('Initial animation', function() { let cycles = 0; [commonOpts, options].forEach(function(targetOptions) { - delete commonOpts.initAnimation; - delete options.initAnimation; - targetOptions.initAnimation = function({properties}) { + delete commonOpts.init; + delete options.init; + targetOptions.init = function({properties}) { expect(typeof properties === 'object').toEqual(true); cycles++; if (cycles === 2) { diff --git a/types/options.d.ts b/types/options.d.ts index 1434b4fdf..867518b17 100644 --- a/types/options.d.ts +++ b/types/options.d.ts @@ -37,7 +37,7 @@ export interface CoreAnnotationOptions extends AnnotationEvents, ShadowOptions{ borderWidth?: Scriptable, display?: Scriptable, drawTime?: Scriptable, - initAnimation: boolean | ((chart: Chart, properties: AnnotationBoxModel, options: AnnotationOptions) => void | boolean | AnnotationBoxModel), + init: boolean | ((chart: Chart, properties: AnnotationBoxModel, options: AnnotationOptions) => void | boolean | AnnotationBoxModel), id?: string, xMax?: Scriptable, xMin?: Scriptable, From e0797538d91a42db77dab92554287c4aff26b4a5 Mon Sep 17 00:00:00 2001 From: stockiNail Date: Sat, 25 Feb 2023 18:46:50 +0100 Subject: [PATCH 18/18] Merge remote-tracking branch 'origin/master' into initAnimation --- src/helpers/helpers.chart.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/helpers/helpers.chart.js b/src/helpers/helpers.chart.js index 0e4ab3b7f..0d976604d 100644 --- a/src/helpers/helpers.chart.js +++ b/src/helpers/helpers.chart.js @@ -147,7 +147,8 @@ export function resolvePointProperties(chart, options) { centerX: adjustCenterX, centerY: adjustCenterY, width: size, - height: size + height: size, + radius }; } return getChartCircle(chart, options);