From 053f169e3c6c45f1b1440fc5163b33df1ba727a6 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Tue, 21 Apr 2020 15:04:19 +0200 Subject: [PATCH 1/7] fix(annotations): fix alignment at the edges This commit fixed the alignment of rect and line annotations near the edge of a data domain. It aligns the x/y position specified by the dataValues of the annotation to the domain of the chart. BREAKING CHANGE: In the rectangular annotation, the `y0` parameter of the coordinates now refers to the minimum value and the `y1` value refers to the maximum value of the y domain. Previously, this was the opposite. fix #586 --- .gitignore | 1 + .playground/index.html | 3 + .playground/playground.tsx | 258 +++++++++++++++--- .../annotations/annotation_marker.test.tsx | 6 +- .../annotations/annotation_utils.test.ts | 99 +++---- .../xy_chart/annotations/annotation_utils.ts | 35 ++- .../annotations/line_annotation.test.ts | 115 ++++++++ .../annotations/line_annotation_tooltip.ts | 51 ++-- .../annotations/rect_annotation.test.ts | 249 +++++++++++++++++ .../annotations/rect_annotation_tooltip.ts | 38 ++- .../xy_chart/utils/axis_utils.test.ts | 6 +- src/chart_types/xy_chart/utils/specs.ts | 2 +- src/mocks/specs/specs.ts | 61 +++++ src/mocks/store/index.ts | 20 ++ src/mocks/store/store.ts | 54 ++++ 15 files changed, 845 insertions(+), 153 deletions(-) create mode 100644 src/chart_types/xy_chart/annotations/line_annotation.test.ts create mode 100644 src/chart_types/xy_chart/annotations/rect_annotation.test.ts create mode 100644 src/mocks/store/index.ts create mode 100644 src/mocks/store/store.ts diff --git a/.gitignore b/.gitignore index 53a06febdd..36759fa78d 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ test/failure-screenshots/**/*.png reports/ tmp/ +.temp/ dist/ coverage/ .out/ diff --git a/.playground/index.html b/.playground/index.html index 3973665311..9ce5896129 100644 --- a/.playground/index.html +++ b/.playground/index.html @@ -33,6 +33,9 @@ height: 300px; margin: 20px; } + label { + display: block; + } diff --git a/.playground/playground.tsx b/.playground/playground.tsx index 3a170dc677..8a8dd21c01 100644 --- a/.playground/playground.tsx +++ b/.playground/playground.tsx @@ -17,43 +17,235 @@ * under the License. */ import React from 'react'; -import { Chart, Partition, Settings, PartitionLayout, XYChartElementEvent, PartitionElementEvent } from '../src'; +import { + Chart, + ScaleType, + Settings, + RectAnnotation, + LineAnnotation, + TooltipType, + BarSeries, + LineSeries, + Axis, + Position, +} from '../src'; -export class Playground extends React.Component { - onElementClick = (elements: (XYChartElementEvent | PartitionElementEvent)[]) => { - // eslint-disable-next-line no-console - console.log(elements); +// const data = [ +// { x: 0, min: 0, max: 1 }, +// { x: 10, min: 0, max: 2 }, +// // { x: 2, min: 0, max: 3 }, +// ]; + +const data = new Array(11).fill(0).map((d, i) => { + return { + x: i, + max: Math.random() * 10, + }; +}); +interface State { + showRectAnnotation: boolean; + showLineXAnnotation: boolean; + showLineYAnnotation: boolean; + totalBars: number; + useLinearBar: boolean; + useOrdinalBar: boolean; + useHistogramBar: boolean; + totalLines: number; + useLinearLine: boolean; + useOrdinalLine: boolean; +} +export class Playground extends React.Component<{}, State> { + state: State = { + showRectAnnotation: false, + showLineXAnnotation: false, + showLineYAnnotation: false, + totalBars: 1, + totalLines: 1, + useLinearBar: true, + useOrdinalBar: false, + useHistogramBar: false, + useLinearLine: false, + useOrdinalLine: false, + }; + handleInputChange = (stateParam: keyof State) => (event: React.ChangeEvent) => { + const updatedValue = stateParam === 'totalBars' || stateParam === 'totalLines' ? Number(event.target.value) : 1; + this.setState((prevState: State) => { + return { + ...prevState, + [stateParam]: stateParam === 'totalBars' || stateParam === 'totalLines' ? updatedValue : !prevState[stateParam], + }; + }); }; render() { + const keys: Array = [ + 'showRectAnnotation', + 'showLineXAnnotation', + 'showLineYAnnotation', + 'useLinearBar', + 'useOrdinalBar', + 'useHistogramBar', + 'useLinearLine', + 'useOrdinalLine', + 'totalBars', + 'totalLines', + ]; return ( -
- - - { - return d.v; - }} - data={[ - { g1: 'a', g2: 'a', v: 1 }, - { g1: 'a', g2: 'b', v: 1 }, - { g1: 'b', g2: 'a', v: 1 }, - { g1: 'b', g2: 'b', v: 1 }, - ]} - layers={[ - { - groupByRollup: (datum: { g1: string }) => datum.g1, - }, - { - groupByRollup: (datum: { g2: string }) => datum.g2, - }, - ]} - /> - -
+ <> +
+
+ {keys.map((key) => { + return ( + + ); + })} +
+
+
+ + + + + {this.state.showRectAnnotation && ( + + )} + {this.state.showLineYAnnotation && ( +
} + /> + )} + {this.state.showLineXAnnotation && ( + } + /> + )} + {this.state.useLinearBar && + new Array(this.state.totalBars) + .fill(0) + .map((d, i) => ( + + ))} + + {this.state.useOrdinalBar && + new Array(this.state.totalBars) + .fill(0) + .map((d, i) => ( + + ))} + + {this.state.useHistogramBar && + new Array(this.state.totalBars) + .fill(0) + .map((d, i) => ( + + ))} + + {this.state.useOrdinalLine && + new Array(this.state.totalLines) + .fill(0) + .map((d, i) => ( + + ))} + + {this.state.useLinearLine && + new Array(this.state.totalLines) + .fill(0) + .map((d, i) => ( + + ))} + + + ); } } diff --git a/src/chart_types/xy_chart/annotations/annotation_marker.test.tsx b/src/chart_types/xy_chart/annotations/annotation_marker.test.tsx index cbfd81d4b9..17b813236a 100644 --- a/src/chart_types/xy_chart/annotations/annotation_marker.test.tsx +++ b/src/chart_types/xy_chart/annotations/annotation_marker.test.tsx @@ -76,7 +76,7 @@ describe('annotation marker', () => { xScale, Position.Left, 0, - false, + 0, ); const expectedDimensions: AnnotationLineProps[] = [ { @@ -131,7 +131,7 @@ describe('annotation marker', () => { xScale, Position.Left, 0, - false, + 0, ); const expectedDimensions: AnnotationLineProps[] = [ { @@ -185,7 +185,7 @@ describe('annotation marker', () => { xScale, Position.Bottom, 0, - false, + 0, ); const expectedDimensions: AnnotationLineProps[] = [ { diff --git a/src/chart_types/xy_chart/annotations/annotation_utils.test.ts b/src/chart_types/xy_chart/annotations/annotation_utils.test.ts index 4d885075ca..dda358f9c9 100644 --- a/src/chart_types/xy_chart/annotations/annotation_utils.test.ts +++ b/src/chart_types/xy_chart/annotations/annotation_utils.test.ts @@ -116,7 +116,7 @@ describe('annotation utils', () => { axesSpecs.push(verticalAxisSpec); - test('should compute annotation dimensions', () => { + test('should compute rect annotation in x ordinal scale', () => { const chartRotation: Rotation = 0; const yScales: Map = new Map(); yScales.set(groupId, continuousScale); @@ -171,15 +171,16 @@ describe('annotation utils', () => { start: { x1: 0, y1: 20 }, end: { x2: 10, y2: 20 }, }, + marker: undefined, details: { detailsText: 'foo', headerText: '2' }, }, ]); - expectedDimensions.set(rectAnnotationId, [{ rect: { x: 0, y: 30, width: 25, height: 20 } }]); + expectedDimensions.set(rectAnnotationId, [{ rect: { x: 0, y: 30, width: 50, height: 20 } }]); expect(dimensions).toEqual(expectedDimensions); }); - test('should not compute annotation dimensions if a corresponding axis does not exist', () => { + test('should compute annotation dimensions also with missing axis', () => { const chartRotation: Rotation = 0; const yScales: Map = new Map(); yScales.set(groupId, continuousScale); @@ -211,8 +212,7 @@ describe('annotation utils', () => { 1, false, ); - const expectedDimensions = new Map(); - expect(dimensions).toEqual(expectedDimensions); + expect(dimensions.size).toEqual(1); }); test('should compute line annotation dimensions for yDomain on a yScale (chartRotation 0, left axis)', () => { @@ -242,7 +242,6 @@ describe('annotation utils', () => { xScale, Position.Left, 0, - false, ); const expectedDimensions: AnnotationLineProps[] = [ { @@ -288,7 +287,6 @@ describe('annotation utils', () => { xScale, Position.Right, 0, - false, ); const expectedDimensions: AnnotationLineProps[] = [ { @@ -334,7 +332,6 @@ describe('annotation utils', () => { xScale, Position.Left, 0, - false, ); const expectedDimensions: AnnotationLineProps[] = [ { @@ -379,7 +376,6 @@ describe('annotation utils', () => { xScale, Position.Left, 0, - false, ); expect(dimensions).toEqual(null); }); @@ -409,7 +405,6 @@ describe('annotation utils', () => { xScale, Position.Left, 0, - false, ); const expectedDimensions: AnnotationLineProps[] = [ { @@ -453,7 +448,6 @@ describe('annotation utils', () => { xScale, Position.Top, 0, - false, ); const expectedDimensions: AnnotationLineProps[] = [ { @@ -498,7 +492,6 @@ describe('annotation utils', () => { xScale, Position.Bottom, 0, - false, ); const expectedDimensions: AnnotationLineProps[] = [ { @@ -543,7 +536,7 @@ describe('annotation utils', () => { xScale, Position.Bottom, 0, - true, + 1, ); const expectedDimensions: AnnotationLineProps[] = [ { @@ -589,7 +582,6 @@ describe('annotation utils', () => { xScale, Position.Left, 0, - false, ); const expectedDimensions: AnnotationLineProps[] = [ { @@ -635,7 +627,6 @@ describe('annotation utils', () => { xScale, Position.Left, 0, - false, ); const expectedDimensions: AnnotationLineProps[] = [ { @@ -681,7 +672,6 @@ describe('annotation utils', () => { xScale, Position.Left, 0, - false, ); const expectedDimensions: AnnotationLineProps[] = [ { @@ -727,7 +717,6 @@ describe('annotation utils', () => { xScale, Position.Top, 0, - false, ); const expectedDimensions: AnnotationLineProps[] = [ { @@ -772,7 +761,6 @@ describe('annotation utils', () => { xScale, Position.Bottom, 0, - false, ); const expectedDimensions: AnnotationLineProps[] = [ { @@ -792,7 +780,7 @@ describe('annotation utils', () => { expect(dimensions).toEqual(expectedDimensions); }); - test('should not compute annotation line values for values outside of domain or AnnotationSpec.hideLines', () => { + test('should not compute annotation line values for invalid data values or AnnotationSpec.hideLines', () => { const chartRotation: Rotation = 0; const yScales: Map = new Map(); yScales.set(groupId, continuousScale); @@ -819,7 +807,6 @@ describe('annotation utils', () => { xScale, Position.Right, 0, - false, ); expect(emptyXDimensions).toEqual([]); @@ -843,7 +830,6 @@ describe('annotation utils', () => { continuousScale, Position.Right, 0, - false, ); expect(invalidStringXDimensions).toEqual([]); @@ -859,7 +845,7 @@ describe('annotation utils', () => { style: DEFAULT_ANNOTATION_LINE_STYLE, }; - const emptyOutOfBoundsXDimensions = computeLineAnnotationDimensions( + const cappedToMinX = computeLineAnnotationDimensions( outOfBoundsXLineAnnotation, chartDimensions, chartRotation, @@ -867,10 +853,8 @@ describe('annotation utils', () => { continuousScale, Position.Right, 0, - false, ); - - expect(emptyOutOfBoundsXDimensions).toEqual([]); + expect(cappedToMinX).toHaveLength(1); const invalidYLineAnnotation: AnnotationSpec = { chartType: ChartTypes.XYAxis, @@ -891,7 +875,6 @@ describe('annotation utils', () => { xScale, Position.Right, 0, - false, ); expect(emptyYDimensions).toEqual([]); @@ -907,7 +890,7 @@ describe('annotation utils', () => { style: DEFAULT_ANNOTATION_LINE_STYLE, }; - const emptyOutOfBoundsYDimensions = computeLineAnnotationDimensions( + const cappedToMinY = computeLineAnnotationDimensions( outOfBoundsYLineAnnotation, chartDimensions, chartRotation, @@ -915,10 +898,9 @@ describe('annotation utils', () => { xScale, Position.Right, 0, - false, ); - expect(emptyOutOfBoundsYDimensions).toEqual([]); + expect(cappedToMinY).toHaveLength(1); const invalidStringYLineAnnotation: AnnotationSpec = { chartType: ChartTypes.XYAxis, @@ -939,7 +921,6 @@ describe('annotation utils', () => { continuousScale, Position.Right, 0, - false, ); expect(invalidStringYDimensions).toEqual([]); @@ -964,7 +945,6 @@ describe('annotation utils', () => { continuousScale, Position.Right, 0, - false, ); expect(hiddenAnnotationDimensions).toEqual(null); @@ -1379,7 +1359,7 @@ describe('annotation utils', () => { dataValues: [{ coordinates: { x0: 1, x1: 2, y0: 3, y1: 5 } }], }; - const noYScale = computeRectAnnotationDimensions(annotationRectangle, yScales, xScale, false, 0); + const noYScale = computeRectAnnotationDimensions(annotationRectangle, yScales, xScale, false, 0, 1); expect(noYScale).toBe(null); }); @@ -1401,9 +1381,9 @@ describe('annotation utils', () => { ], }; - const skippedInvalid = computeRectAnnotationDimensions(annotationRectangle, yScales, xScale, false, 0); + const skippedInvalid = computeRectAnnotationDimensions(annotationRectangle, yScales, xScale, false, 0, 1); - expect(skippedInvalid).toEqual([]); + expect(skippedInvalid).toHaveLength(1); }); test('should compute rectangle dimensions shifted for histogram mode', () => { const yScales: Map = new Map(); @@ -1411,7 +1391,7 @@ describe('annotation utils', () => { const xScale: Scale = new ScaleContinuous( { type: ScaleType.Linear, domain: continuousData, range: [minRange, maxRange] }, - { bandwidth: 1, minInterval: 1 }, + { bandwidth: 72, minInterval: 1 }, ); const annotationRectangle: RectAnnotationSpec = { @@ -1428,7 +1408,7 @@ describe('annotation utils', () => { ], }; - const dimensions = computeRectAnnotationDimensions(annotationRectangle, yScales, xScale, true, 0); + const dimensions = computeRectAnnotationDimensions(annotationRectangle, yScales, xScale, true, 0, 1); const [dims1, dims2, dims3, dims4] = dimensions; expect(dims1.rect.x).toBe(10); @@ -1438,18 +1418,18 @@ describe('annotation utils', () => { expect(dims2.rect.x).toBe(0); expect(dims2.rect.y).toBe(0); - expect(dims2.rect.width).toBe(10); + expect(dims2.rect.width).toBe(20); expect(dims2.rect.height).toBe(100); expect(dims3.rect.x).toBe(0); - expect(dims3.rect.y).toBe(0); + expect(dims3.rect.y).toBe(10); expect(dims3.rect.width).toBeCloseTo(110); - expect(dims3.rect.height).toBe(10); + expect(dims3.rect.height).toBe(90); expect(dims4.rect.x).toBe(0); - expect(dims4.rect.y).toBe(10); + expect(dims4.rect.y).toBe(0); expect(dims4.rect.width).toBeCloseTo(110); - expect(dims4.rect.height).toBe(90); + expect(dims4.rect.height).toBe(10); }); test('should compute rectangle dimensions when only a single coordinate defined', () => { const yScales: Map = new Map(); @@ -1471,13 +1451,13 @@ describe('annotation utils', () => { ], }; - const dimensions = computeRectAnnotationDimensions(annotationRectangle, yScales, xScale, false, 0); + const dimensions = computeRectAnnotationDimensions(annotationRectangle, yScales, xScale, false, 0, 0); const expectedDimensions = [ - { rect: { x: 10, y: 0, width: 90, height: 100 } }, - { rect: { x: 0, y: 0, width: 10, height: 100 } }, - { rect: { x: 0, y: 0, width: 100, height: 10 } }, - { rect: { x: 0, y: 10, width: 100, height: 90 } }, + { rect: { x: 10, y: 0, width: 90, height: 100 }, details: undefined }, + { rect: { x: 0, y: 0, width: 10, height: 100 }, details: undefined }, + { rect: { x: 0, y: 10, width: 100, height: 90 }, details: undefined }, + { rect: { x: 0, y: 0, width: 100, height: 10 }, details: undefined }, ]; expect(dimensions).toEqual(expectedDimensions); @@ -1497,7 +1477,7 @@ describe('annotation utils', () => { dataValues: [{ coordinates: { x0: 1, x1: 2, y0: 3, y1: 5 } }], }; - const unrotated = computeRectAnnotationDimensions(annotationRectangle, yScales, xScale, false, 0); + const unrotated = computeRectAnnotationDimensions(annotationRectangle, yScales, xScale, false, 0, 0); expect(unrotated).toEqual([{ rect: { x: 10, y: 30, width: 10, height: 20 } }]); }); @@ -1507,6 +1487,7 @@ describe('annotation utils', () => { const xScale: Scale = ordinalScale; + // will render a rectangle that inclused both a and b const annotationRectangle: RectAnnotationSpec = { chartType: ChartTypes.XYAxis, specType: SpecTypes.Annotation, @@ -1516,26 +1497,28 @@ describe('annotation utils', () => { dataValues: [{ coordinates: { x0: 'a', x1: 'b', y0: 0, y1: 2 } }], }; - const unrotated = computeRectAnnotationDimensions(annotationRectangle, yScales, xScale, false, 0); + const unrotated = computeRectAnnotationDimensions(annotationRectangle, yScales, xScale, false, 0, 1); - expect(unrotated).toEqual([{ rect: { x: 0, y: 0, width: 25, height: 20 } }]); + expect(unrotated).toEqual([{ rect: { x: 0, y: 0, width: 50, height: 20 } }]); }); test('should validate scaled dataValues', () => { // not aligned with tick - expect(scaleAndValidateDatum('', ordinalScale, false)).toBe(null); - expect(scaleAndValidateDatum('a', continuousScale, false)).toBe(null); - expect(scaleAndValidateDatum(-10, continuousScale, false)).toBe(null); - expect(scaleAndValidateDatum(20, continuousScale, false)).toBe(null); + expect(scaleAndValidateDatum('', ordinalScale, 0)).toBe(null); + expect(scaleAndValidateDatum('a', continuousScale, 0)).toBe(null); + + // valid value limited to min/max + expect(scaleAndValidateDatum(-10, continuousScale, 0)).toBe(0); + expect(scaleAndValidateDatum(20, continuousScale, 0)).toBe(100); // allow values within domainEnd + minInterval when not alignWithTick - expect(scaleAndValidateDatum(10.25, continuousScale, false)).toBeCloseTo(102.5); - expect(scaleAndValidateDatum(10.25, continuousScale, true)).toBe(null); + expect(scaleAndValidateDatum(10.25, continuousScale, 1)).toBeCloseTo(102.5); + expect(scaleAndValidateDatum(10.25, continuousScale, 0)).toBe(100); - expect(scaleAndValidateDatum('a', ordinalScale, false)).toBe(0); - expect(scaleAndValidateDatum(0, continuousScale, false)).toBe(0); + expect(scaleAndValidateDatum('a', ordinalScale, 0)).toBe(0); + expect(scaleAndValidateDatum(0, continuousScale, 0)).toBe(0); // aligned with tick - expect(scaleAndValidateDatum(1.25, continuousScale, true)).toBe(12.5); + expect(scaleAndValidateDatum(1.25, continuousScale, 0)).toBe(12.5); }); test('should determine if a point is within a rectangle annotation', () => { const cursorPosition = { x: 3, y: 4 }; diff --git a/src/chart_types/xy_chart/annotations/annotation_utils.ts b/src/chart_types/xy_chart/annotations/annotation_utils.ts index 8cf152eeae..17c2061ee2 100644 --- a/src/chart_types/xy_chart/annotations/annotation_utils.ts +++ b/src/chart_types/xy_chart/annotations/annotation_utils.ts @@ -87,25 +87,36 @@ export type AnnotationDimensions = AnnotationLineProps[] | AnnotationRectProps[] export type Bounds = { startX: number; endX: number; startY: number; endY: number }; /** @internal */ -export function scaleAndValidateDatum(dataValue: any, scale: Scale, alignWithTick: boolean): number | null { +export function scaleAndValidateDatum( + value: any, + scale: Scale, + totalBarsInCluster: number, + lastValue?: boolean, +): number | null { const isContinuous = scale.type !== ScaleType.Ordinal; - const scaledValue = scale.scale(dataValue); + const scaledValue = scale.scale(value); // d3.scale will return 0 for '', rendering the line incorrectly at 0 - if (scaledValue === null || (isContinuous && dataValue === '')) { + if (scaledValue === null || (isContinuous && value === '')) { return null; } if (isContinuous) { const [domainStart, domainEnd] = scale.domain; + const adjustedDomainEnd = domainEnd + (totalBarsInCluster > 0 ? scale.minInterval : 0); - // if we're not aligning the ticks, we need to extend the domain by one more tick for histograms - const domainEndOffset = alignWithTick ? 0 : scale.minInterval; - - if (domainStart > dataValue || domainEnd + domainEndOffset < dataValue) { - return null; + // limit the value to min or max of the domain + if (value < domainStart) { + return scale.scale(domainStart); } + if (value > adjustedDomainEnd) { + return scale.scale(adjustedDomainEnd); + } + return scaledValue; + } + // is ordinal scale + if (lastValue) { + return scaledValue + scale.bandwidth * totalBarsInCluster; } - return scaledValue; } @@ -187,9 +198,6 @@ export function computeAnnotationDimensions( const { groupId, domainType } = annotationSpec; const annotationAxisPosition = getAnnotationAxis(axesSpecs, groupId, domainType, chartRotation); - if (!annotationAxisPosition) { - return; - } const dimensions = computeLineAnnotationDimensions( annotationSpec, chartDimensions, @@ -198,7 +206,7 @@ export function computeAnnotationDimensions( xScale, annotationAxisPosition, xScaleOffset - clusterOffset, - enableHistogramMode, + totalBarsInCluster, ); if (dimensions) { @@ -211,6 +219,7 @@ export function computeAnnotationDimensions( xScale, enableHistogramMode, barsPadding, + totalBarsInCluster, ); if (dimensions) { diff --git a/src/chart_types/xy_chart/annotations/line_annotation.test.ts b/src/chart_types/xy_chart/annotations/line_annotation.test.ts new file mode 100644 index 0000000000..f81140bedb --- /dev/null +++ b/src/chart_types/xy_chart/annotations/line_annotation.test.ts @@ -0,0 +1,115 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ + +import { MockStore } from '../../../mocks/store'; +import { MockSeriesSpec, MockAnnotationSpec, MockGlobalSpec } from '../../../mocks/specs'; +import { computeAnnotationDimensionsSelector } from '../state/selectors/compute_annotations'; +import { ScaleType } from '../../../scales'; + +function expectAnnotationAtPosition( + data: Array<{ x: number; y: number }>, + type: 'line' | 'bar', + indexPosition: number, + expectedLinePosition: number, + numOfSpecs = 1, + xScaleType: typeof ScaleType.Ordinal | typeof ScaleType.Linear | typeof ScaleType.Time = ScaleType.Linear, +) { + const store = MockStore.default(); + const settings = MockGlobalSpec.settingsNoMargins(); + const specs = new Array(numOfSpecs).fill(0).map((d, i) => { + return MockSeriesSpec.byTypePartial(type)({ + id: `spec_${i}`, + xScaleType, + data, + }); + }); + const annotation = MockAnnotationSpec.line({ + dataValues: [ + { + dataValue: indexPosition, + }, + ], + }); + + MockStore.addSpecs([settings, ...specs, annotation], store); + const annotations = computeAnnotationDimensionsSelector(store.getState()); + expect(annotations.get(annotation.id)).toEqual([ + { + anchor: { left: expectedLinePosition, position: 'bottom', top: 100 }, + details: { detailsText: undefined, headerText: `${indexPosition}` }, + linePathPoints: { + start: { x1: expectedLinePosition, y1: 100 }, + end: { x2: expectedLinePosition, y2: 0 }, + }, + marker: undefined, + }, + ]); +} + +describe('Render vertical line annotation within', () => { + it.each([ + [0, 1, 12.5], // middle of 1st bar + [1, 1, 37.5], // middle of 2nd bar + [2, 1, 62.5], // middle of 3rd bar + [3, 1, 87.5], // middle of 4th bar + [1, 2, 37.5], // middle of 2nd bar + [1, 3, 37.5], // middle of 2nd bar + ])('a bar at position %i, %i specs, all scales', (dataValue, numOfSpecs, linePosition) => { + const data = [ + { x: 0, y: 4 }, + { x: 1, y: 1 }, + { x: 2, y: 3 }, + { x: 3, y: 2 }, + ]; + expectAnnotationAtPosition(data, 'bar', dataValue, linePosition, numOfSpecs); + expectAnnotationAtPosition(data, 'bar', dataValue, linePosition, numOfSpecs, ScaleType.Ordinal); + expectAnnotationAtPosition(data, 'bar', dataValue, linePosition, numOfSpecs, ScaleType.Time); + }); + + it.each([ + [0, 1, 0], // the start of the chart + [1, 1, 50], // the middle of the chart + [2, 1, 100], // the end of the chart + [1, 2, 50], // the middle of the chart + [1, 3, 50], // the middle of the chart + ])('line point at position %i, %i specs, linear scale', (dataValue, numOfSpecs, linePosition) => { + const data = [ + { x: 0, y: 1 }, + { x: 1, y: 1 }, + { x: 2, y: 2 }, + ]; + expectAnnotationAtPosition(data, 'line', dataValue, linePosition, numOfSpecs); + }); + + it.each([ + [0, 1, 12.5], // 1st ordinal line point + [1, 1, 37.5], // 2nd ordinal line point + [2, 1, 62.5], // 3rd ordinal line point + [3, 1, 87.5], // 4th ordinal line point + [1, 2, 37.5], // 2nd ordinal line point + [1, 3, 37.5], // 2nd ordinal line point + ])('line point at position %i, %i specs, Ordinal scale', (dataValue, numOfSpecs, linePosition) => { + const data = [ + { x: 0, y: 4 }, + { x: 1, y: 1 }, + { x: 2, y: 3 }, + { x: 3, y: 2 }, + ]; + expectAnnotationAtPosition(data, 'line', dataValue, linePosition, numOfSpecs, ScaleType.Ordinal); + }); +}); diff --git a/src/chart_types/xy_chart/annotations/line_annotation_tooltip.ts b/src/chart_types/xy_chart/annotations/line_annotation_tooltip.ts index e9c72a1b35..2e819cfa6c 100644 --- a/src/chart_types/xy_chart/annotations/line_annotation_tooltip.ts +++ b/src/chart_types/xy_chart/annotations/line_annotation_tooltip.ts @@ -38,7 +38,6 @@ import { isHorizontalAxis } from '../utils/axis_utils'; import { Dimensions } from '../../../utils/dimensions'; import { Scale } from '../../../scales'; import { GroupId } from '../../../utils/ids'; -import { LineAnnotationStyle } from '../../../utils/themes/theme'; import { Point } from '../../../utils/point'; import { isWithinRectBounds } from './rect_annotation_tooltip'; @@ -85,7 +84,7 @@ function computeYDomainLineAnnotationDimensions( dataValues: LineAnnotationDatum[], yScale: Scale, chartRotation: Rotation, - axisPosition: Position, + axisPosition: Position | null, chartDimensions: Dimensions, lineColor: string, marker?: JSX.Element, @@ -94,11 +93,14 @@ function computeYDomainLineAnnotationDimensions( const chartHeight = chartDimensions.height; const chartWidth = chartDimensions.width; const isHorizontalChartRotation = isHorizontalRotation(chartRotation); - + // let's use a default Bottom-X/Left-Y axis orientation if we are not showing an axis + // but we are displaying a line annotation + const anchorPosition = + axisPosition === null ? (isHorizontalChartRotation ? Position.Bottom : Position.Left) : axisPosition; const lineProps: AnnotationLineProps[] = []; dataValues.forEach((datum: LineAnnotationDatum) => { - const { dataValue } = datum; + let { dataValue } = datum; // avoid rendering invalid annotation value if (dataValue === null || dataValue === undefined || dataValue === '') { @@ -113,11 +115,15 @@ function computeYDomainLineAnnotationDimensions( const [domainStart, domainEnd] = yScale.domain; // avoid rendering annotation with values outside the scale domain - if (domainStart > dataValue || domainEnd < dataValue) { - return; + if (dataValue < domainStart) { + dataValue = domainStart; } + if (dataValue > domainEnd) { + dataValue = domainEnd; + } + const anchor = { - position: axisPosition, + position: anchorPosition, top: 0, left: 0, }; @@ -129,7 +135,7 @@ function computeYDomainLineAnnotationDimensions( // the Y axis is vertical, X axis is horizontal y|--x--|y if (isHorizontalChartRotation) { // y|__x__ - if (axisPosition === Position.Left) { + if (anchorPosition === Position.Left) { anchor.left = 0; markerPosition.left = -markerDimension.width; linePathPoints.start.x1 = 0; @@ -155,7 +161,7 @@ function computeYDomainLineAnnotationDimensions( // the Y axis is horizontal, X axis is vertical x|--y--|x } else { // ¯¯y¯¯ - if (axisPosition === Position.Top) { + if (anchorPosition === Position.Top) { anchor.top = 0; markerPosition.top = -markerDimension.height; linePathPoints.start.x1 = 0; @@ -208,11 +214,11 @@ function computeXDomainLineAnnotationDimensions( dataValues: LineAnnotationDatum[], xScale: Scale, chartRotation: Rotation, - axisPosition: Position, + axisPosition: Position | null, chartDimensions: Dimensions, lineColor: string, xScaleOffset: number, - enableHistogramMode: boolean, + totalBarsInCluster: number, marker?: JSX.Element, markerDimension = { width: 0, height: 0 }, ): AnnotationLineProps[] { @@ -220,12 +226,15 @@ function computeXDomainLineAnnotationDimensions( const chartWidth = chartDimensions.width; const lineProps: AnnotationLineProps[] = []; const isHorizontalChartRotation = isHorizontalRotation(chartRotation); + // let's use a default Bottom-X/Left-Y axis orientation if we are not showing an axis + // but we are displaying a line annotation + const anchorPosition = + axisPosition === null ? (isHorizontalChartRotation ? Position.Bottom : Position.Left) : axisPosition; - const alignWithTick = xScale.bandwidth > 0 && !enableHistogramMode; dataValues.forEach((datum: LineAnnotationDatum) => { const { dataValue } = datum; - const scaledXValue = scaleAndValidateDatum(dataValue, xScale, alignWithTick); + const scaledXValue = scaleAndValidateDatum(dataValue, xScale, totalBarsInCluster, false); if (scaledXValue == null) { return; @@ -240,14 +249,14 @@ function computeXDomainLineAnnotationDimensions( end: { x2: 0, y2: 0 }, }; const anchor = { - position: axisPosition, + position: anchorPosition, top: 0, left: 0, }; // the Y axis is vertical, X axis is horizontal y|--x--|y if (isHorizontalChartRotation) { // __x__ - if (axisPosition === Position.Bottom) { + if (anchorPosition === Position.Bottom) { linePathPoints.start.y1 = chartHeight; linePathPoints.end.y2 = 0; anchor.top = chartHeight; @@ -273,7 +282,7 @@ function computeXDomainLineAnnotationDimensions( // the Y axis is horizontal, X axis is vertical x|--y--|x } else { // x|--y-- - if (axisPosition === Position.Left) { + if (anchorPosition === Position.Left) { anchor.left = 0; markerPosition.left = -markerDimension.width; linePathPoints.start.x1 = annotationValueXposition; @@ -330,9 +339,9 @@ export function computeLineAnnotationDimensions( chartRotation: Rotation, yScales: Map, xScale: Scale, - axisPosition: Position, + axisPosition: Position | null, xScaleOffset: number, - enableHistogramMode: boolean, + totalBarsInCluster: number = 0, ): AnnotationLineProps[] | null { const { domainType, dataValues, marker, markerDimensions, hideLines } = annotationSpec; @@ -341,8 +350,8 @@ export function computeLineAnnotationDimensions( } // this type is guaranteed as this has been merged with default - const lineStyle = annotationSpec.style as LineAnnotationStyle; - const lineColor = lineStyle.line.stroke; + const lineStyle = annotationSpec.style; + const lineColor = lineStyle?.line?.stroke ?? 'red'; if (domainType === AnnotationDomainTypes.XDomain) { return computeXDomainLineAnnotationDimensions( @@ -353,7 +362,7 @@ export function computeLineAnnotationDimensions( chartDimensions, lineColor, xScaleOffset, - enableHistogramMode, + totalBarsInCluster, marker, markerDimensions, ); diff --git a/src/chart_types/xy_chart/annotations/rect_annotation.test.ts b/src/chart_types/xy_chart/annotations/rect_annotation.test.ts new file mode 100644 index 0000000000..e4838b25e1 --- /dev/null +++ b/src/chart_types/xy_chart/annotations/rect_annotation.test.ts @@ -0,0 +1,249 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ +import { MockStore } from '../../../mocks/store'; +import { MockSeriesSpec, MockAnnotationSpec, MockGlobalSpec } from '../../../mocks/specs'; +import { computeAnnotationDimensionsSelector } from '../state/selectors/compute_annotations'; +import { ScaleType } from '../../../scales'; +import { RectAnnotationDatum } from '../utils/specs'; +import { AnnotationRectProps } from './rect_annotation_tooltip'; + +function expectAnnotationAtPosition( + data: Array<{ x: number; y: number }>, + type: 'line' | 'bar', + dataValues: RectAnnotationDatum[], + expectedRect: { + x: number; + y: number; + width: number; + height: number; + }, + numOfSpecs = 1, + xScaleType: typeof ScaleType.Ordinal | typeof ScaleType.Linear | typeof ScaleType.Time = ScaleType.Linear, +) { + const store = MockStore.default(); + const settings = MockGlobalSpec.settingsNoMargins(); + const specs = new Array(numOfSpecs).fill(0).map((d, i) => { + return MockSeriesSpec.byTypePartial(type)({ + id: `spec_${i}`, + xScaleType, + data, + }); + }); + const annotation = MockAnnotationSpec.rect({ + dataValues, + }); + + MockStore.addSpecs([settings, ...specs, annotation], store); + const annotations = computeAnnotationDimensionsSelector(store.getState()); + const renderedAnnotations = annotations.get(annotation.id)!; + expect(renderedAnnotations.length).toBe(1); + const { rect } = renderedAnnotations[0] as AnnotationRectProps; + expect(rect.x).toBeCloseTo(expectedRect.x, 3); + expect(rect.y).toBeCloseTo(expectedRect.y, 3); + expect(rect.width).toBeCloseTo(expectedRect.width, 3); + expect(rect.height).toBeCloseTo(expectedRect.height, 3); +} + +describe('Render rect annotation within', () => { + it.each([ + // x0, numOfSpecs, x, width + [0, 1, 0, 100], + [1, 1, 25, 75], + [2, 1, 50, 50], + [3, 1, 75, 25], + [1, 2, 25, 75], + [2, 3, 50, 50], + ])('bars starting from %i, %i specs, all scales', (x0, numOfSpecs, x, width) => { + const data = [ + { x: 0, y: 4 }, + { x: 1, y: 1 }, + { x: 2, y: 3 }, + { x: 3, y: 2 }, + ]; + const dataValues: RectAnnotationDatum[] = [ + { + coordinates: { x0 }, + }, + ]; + const rect = { x, width, y: 0, height: 100 }; + expectAnnotationAtPosition(data, 'bar', dataValues, rect, numOfSpecs); + expectAnnotationAtPosition(data, 'bar', dataValues, rect, numOfSpecs, ScaleType.Ordinal); + expectAnnotationAtPosition(data, 'bar', dataValues, rect, numOfSpecs, ScaleType.Time); + }); + + it.each([ + // x1, numOfSpecs, x, width + [0, 1, 0, 25], + [1, 1, 0, 50], + [2, 1, 0, 75], + [3, 1, 0, 100], + [1, 2, 0, 50], + [2, 2, 0, 75], + ])('bars starting ending at %i, %i specs, all scales', (x1, numOfSpecs, x, width) => { + const data = [ + { x: 0, y: 4 }, + { x: 1, y: 1 }, + { x: 2, y: 3 }, + { x: 3, y: 2 }, + ]; + const dataValues: RectAnnotationDatum[] = [ + { + coordinates: { x1 }, + }, + ]; + const rect = { x, width, y: 0, height: 100 }; + expectAnnotationAtPosition(data, 'bar', dataValues, rect, numOfSpecs); + expectAnnotationAtPosition(data, 'bar', dataValues, rect, numOfSpecs, ScaleType.Ordinal); + expectAnnotationAtPosition(data, 'bar', dataValues, rect, numOfSpecs, ScaleType.Time); + }); + + it.each([ + // x0, x1, numOfSpecs, x, width + [0, 0, 1, 0, 25], + [0, 1, 1, 0, 50], + [1, 3, 1, 25, 75], + [0, 1, 2, 0, 50], + [1, 3, 3, 25, 75], + ])('bars starting starting at %i, ending at %i, %i specs, all scales', (x0, x1, numOfSpecs, x, width) => { + const data = [ + { x: 0, y: 4 }, + { x: 1, y: 1 }, + { x: 2, y: 3 }, + { x: 3, y: 2 }, + ]; + const dataValues: RectAnnotationDatum[] = [ + { + coordinates: { x0, x1 }, + }, + ]; + const rect = { x, width, y: 0, height: 100 }; + expectAnnotationAtPosition(data, 'bar', dataValues, rect, numOfSpecs); + expectAnnotationAtPosition(data, 'bar', dataValues, rect, numOfSpecs, ScaleType.Ordinal); + expectAnnotationAtPosition(data, 'bar', dataValues, rect, numOfSpecs, ScaleType.Time); + }); + + it.each([ + // x0, x1, numOfSpecs, x, width + [0, 0, 1, 0, 25], + [0, 1, 1, 0, 50], + [1, 3, 1, 25, 75], + [0, 1, 2, 0, 50], + [1, 3, 3, 25, 75], + ])('lines starting starting at %i, ending at %i, %i specs, ordinal scale', (x0, x1, numOfSpecs, x, width) => { + const data = [ + { x: 0, y: 4 }, + { x: 1, y: 1 }, + { x: 2, y: 3 }, + { x: 3, y: 2 }, + ]; + const dataValues: RectAnnotationDatum[] = [ + { + coordinates: { x0, x1 }, + }, + ]; + const rect = { x, width, y: 0, height: 100 }; + expectAnnotationAtPosition(data, 'line', dataValues, rect, numOfSpecs, ScaleType.Ordinal); + }); + + it.each([ + // x0, x1, numOfSpecs, x, width + [0, 0, 1, 0, 0], + [0, 1, 1, 0, 50], + [1, 2, 1, 50, 50], + [0, 2, 1, 0, 100], + [0, 1, 2, 0, 50], + [1, 2, 3, 50, 50], + ])('lines starting starting at %i, ending at %i, %i specs, continuous scale', (x0, x1, numOfSpecs, x, width) => { + const data = [ + { x: 0, y: 4 }, + { x: 1, y: 1 }, + { x: 2, y: 3 }, + ]; + const dataValues: RectAnnotationDatum[] = [ + { + coordinates: { x0, x1 }, + }, + ]; + const rect = { x, width, y: 0, height: 100 }; + expectAnnotationAtPosition(data, 'line', dataValues, rect, numOfSpecs, ScaleType.Linear); + }); + + it('out of bound annotations upper y', () => { + const data = [ + { x: 0, y: 4 }, + { x: 1, y: 1 }, + { x: 2, y: 3 }, + ]; + const dataValues: RectAnnotationDatum[] = [ + { + coordinates: { y1: 10 }, + }, + ]; + const rect = { x: 0, width: 100, y: 0, height: 100 }; + expectAnnotationAtPosition(data, 'line', dataValues, rect, 1, ScaleType.Linear); + expectAnnotationAtPosition(data, 'bar', dataValues, rect, 1, ScaleType.Linear); + }); + + it('out of bound annotations lower y', () => { + const data = [ + { x: 0, y: 4 }, + { x: 1, y: 1 }, + { x: 2, y: 3 }, + ]; + const dataValues: RectAnnotationDatum[] = [ + { + coordinates: { y0: -4 }, + }, + ]; + const rect = { x: 0, width: 100, y: 0, height: 100 }; + expectAnnotationAtPosition(data, 'bar', dataValues, rect, 1, ScaleType.Linear); + expectAnnotationAtPosition(data, 'line', dataValues, rect, 1, ScaleType.Linear); + }); + + it('out of bound annotations lower x', () => { + const data = [ + { x: 0, y: 4 }, + { x: 1, y: 1 }, + { x: 2, y: 3 }, + ]; + const dataValues: RectAnnotationDatum[] = [ + { + coordinates: { x0: -4 }, + }, + ]; + const rect = { x: 0, width: 100, y: 0, height: 100 }; + expectAnnotationAtPosition(data, 'bar', dataValues, rect, 1, ScaleType.Linear); + expectAnnotationAtPosition(data, 'line', dataValues, rect, 1, ScaleType.Linear); + }); + + it('out of bound annotations upper x', () => { + const data = [ + { x: 0, y: 4 }, + { x: 1, y: 1 }, + { x: 2, y: 3 }, + ]; + const dataValues: RectAnnotationDatum[] = [ + { + coordinates: { x1: 5 }, + }, + ]; + const rect = { x: 0, width: 100, y: 0, height: 100 }; + expectAnnotationAtPosition(data, 'bar', dataValues, rect, 1, ScaleType.Linear); + expectAnnotationAtPosition(data, 'line', dataValues, rect, 1, ScaleType.Linear); + }); +}); diff --git a/src/chart_types/xy_chart/annotations/rect_annotation_tooltip.ts b/src/chart_types/xy_chart/annotations/rect_annotation_tooltip.ts index b62a4210c9..dbbf667f62 100644 --- a/src/chart_types/xy_chart/annotations/rect_annotation_tooltip.ts +++ b/src/chart_types/xy_chart/annotations/rect_annotation_tooltip.ts @@ -20,7 +20,7 @@ import { AnnotationTypes, RectAnnotationDatum, RectAnnotationSpec } from '../uti import { Rotation } from '../../../utils/commons'; import { Dimensions } from '../../../utils/dimensions'; import { GroupId } from '../../../utils/ids'; -import { Scale } from '../../../scales'; +import { Scale, ScaleType } from '../../../scales'; import { Point } from '../../../utils/point'; import { AnnotationTooltipFormatter, @@ -98,14 +98,15 @@ export function computeRectAnnotationDimensions( xScale: Scale, enableHistogramMode: boolean, barsPadding: number, + totalBarsInCluster: number, ): AnnotationRectProps[] | null { const { dataValues } = annotationSpec; - const groupId = annotationSpec.groupId; const yScale = yScales.get(groupId); if (!yScale) { return null; } + const hasBars = totalBarsInCluster > 0; const xDomain = xScale.domain; const yDomain = yScale.domain; @@ -115,16 +116,14 @@ export function computeRectAnnotationDimensions( dataValues.forEach((dataValue: RectAnnotationDatum) => { let { x0, x1, y0, y1 } = dataValue.coordinates; - // if everything is null, return; otherwise we coerce the other coordinates if (x0 == null && x1 == null && y0 == null && y1 == null) { return; } - - if (x1 == null) { - // if x1 is defined, we want the rect to draw to the end of the scale - // if we're in histogram mode, extend domain end by min interval - x1 = enableHistogramMode && !xScale.isSingleValue() ? lastX + xMinInterval : lastX; + x1 = x1 == null ? lastX : x1; + if (hasBars && xScale.type !== ScaleType.Ordinal) { + // if bar chart cover fully the last bar + x1 = x1 + xMinInterval; } if (x0 == null) { @@ -133,22 +132,20 @@ export function computeRectAnnotationDimensions( } if (y0 == null) { - // if y0 is defined, we want the rect to draw to the end of the scale - y0 = yDomain[yDomain.length - 1]; + // if y0 is not defined, start from the beginning of the yScale + y0 = yDomain[0]; } if (y1 == null) { - // if y1 is defined, we want the rect to draw to the start of the scale - y1 = yDomain[0]; + // if y1 is not defined, end the annotation at the end of the yScale + y1 = yDomain[yDomain.length - 1]; } - - const alignWithTick = xScale.bandwidth > 0 && !enableHistogramMode; - - let x0Scaled = scaleAndValidateDatum(x0, xScale, alignWithTick); - let x1Scaled = scaleAndValidateDatum(x1, xScale, alignWithTick); - const y0Scaled = scaleAndValidateDatum(y0, yScale, false); - const y1Scaled = scaleAndValidateDatum(y1, yScale, false); - + const barSpaces = totalBarsInCluster > 0 ? totalBarsInCluster : xScale.type === ScaleType.Ordinal ? 1 : 0; + let x0Scaled = scaleAndValidateDatum(x0, xScale, barSpaces); + let x1Scaled = scaleAndValidateDatum(x1, xScale, barSpaces, true); + // we don't consider bars in y scale + const y0Scaled = scaleAndValidateDatum(y0, yScale, 0); + const y1Scaled = scaleAndValidateDatum(y1, yScale, 0, true); // TODO: surface this as a warning if (x0Scaled === null || x1Scaled === null || y0Scaled === null || y1Scaled === null) { return; @@ -187,6 +184,5 @@ export function computeRectAnnotationDimensions( details: dataValue.details, }); }); - return rectsProps; } diff --git a/src/chart_types/xy_chart/utils/axis_utils.test.ts b/src/chart_types/xy_chart/utils/axis_utils.test.ts index 60beaf4710..5526381cc7 100644 --- a/src/chart_types/xy_chart/utils/axis_utils.test.ts +++ b/src/chart_types/xy_chart/utils/axis_utils.test.ts @@ -18,7 +18,7 @@ import { XDomain } from '../domains/x_domain'; import { YDomain } from '../domains/y_domain'; -import { AxisSpec, DomainRange, AxisStyle } from './specs'; +import { AxisSpec, DomainRange, AxisStyle, DEFAULT_GLOBAL_ID } from './specs'; import { Position } from '../../../utils/commons'; import { LIGHT_THEME } from '../../../utils/themes/light_theme'; import { AxisId, GroupId } from '../../../utils/ids'; @@ -1452,7 +1452,7 @@ describe('Axis computational utils', () => { showDuplicatedTicks: false, chartType: 'xy_axis', specType: 'axis', - groupId: '__global__', + groupId: DEFAULT_GLOBAL_ID, hide: false, showOverlappingLabels: false, showOverlappingTicks: false, @@ -1492,7 +1492,7 @@ describe('Axis computational utils', () => { showDuplicatedTicks: true, chartType: 'xy_axis', specType: 'axis', - groupId: '__global__', + groupId: DEFAULT_GLOBAL_ID, hide: false, showOverlappingLabels: false, showOverlappingTicks: false, diff --git a/src/chart_types/xy_chart/utils/specs.ts b/src/chart_types/xy_chart/utils/specs.ts index e320aba0f2..6f8cf2b91b 100644 --- a/src/chart_types/xy_chart/utils/specs.ts +++ b/src/chart_types/xy_chart/utils/specs.ts @@ -668,7 +668,7 @@ export interface BaseAnnotationSpec< D extends RectAnnotationDatum | LineAnnotationDatum, S extends RectAnnotationStyle | LineAnnotationStyle > extends Spec { - chartType: ChartTypes; + chartType: typeof ChartTypes.XYAxis; specType: typeof SpecTypes.Annotation; /** * Annotation type: line, rectangle, text diff --git a/src/mocks/specs/specs.ts b/src/mocks/specs/specs.ts index 06d830f329..e033aa2127 100644 --- a/src/mocks/specs/specs.ts +++ b/src/mocks/specs/specs.ts @@ -28,6 +28,10 @@ import { BasicSeriesSpec, SeriesTypes, BubbleSeriesSpec, + LineAnnotationSpec, + RectAnnotationSpec, + AnnotationTypes, + AnnotationDomainTypes, } from '../../chart_types/xy_chart/utils/specs'; import { ScaleType } from '../../scales'; import { ChartTypes } from '../../chart_types'; @@ -221,6 +225,17 @@ export class MockSeriesSpec { return MockSeriesSpec.barBase; } } + static byTypePartial(type?: 'line' | 'bar' | 'area') { + switch (type) { + case 'line': + return MockSeriesSpec.line; + case 'area': + return MockSeriesSpec.area; + case 'bar': + default: + return MockSeriesSpec.bar; + } + } } export class MockSeriesSpecs { @@ -264,7 +279,53 @@ export class MockGlobalSpec { theme: LIGHT_THEME, }; + private static readonly settingsBaseNoMargings: SettingsSpec = { + ...MockGlobalSpec.settingsBase, + theme: { + ...LIGHT_THEME, + chartMargins: { top: 0, left: 0, right: 0, bottom: 0 }, + chartPaddings: { top: 0, left: 0, right: 0, bottom: 0 }, + scales: { + barsPadding: 0, + }, + }, + }; + static settings(partial?: Partial): SettingsSpec { return mergePartial(MockGlobalSpec.settingsBase, partial, { mergeOptionalPartialValues: true }); } + static settingsNoMargins(partial?: Partial): SettingsSpec { + return mergePartial(MockGlobalSpec.settingsBaseNoMargings, partial, { + mergeOptionalPartialValues: true, + }); + } +} + +/** @internal */ +export class MockAnnotationSpec { + private static readonly lineBase: LineAnnotationSpec = { + id: 'line_annotation_1', + groupId: DEFAULT_GLOBAL_ID, + chartType: ChartTypes.XYAxis, + specType: SpecTypes.Annotation, + annotationType: AnnotationTypes.Line, + dataValues: [], + domainType: AnnotationDomainTypes.XDomain, + }; + + private static readonly rectBase: RectAnnotationSpec = { + id: 'rect_annotation_1', + groupId: DEFAULT_GLOBAL_ID, + chartType: ChartTypes.XYAxis, + specType: SpecTypes.Annotation, + annotationType: AnnotationTypes.Rectangle, + dataValues: [], + }; + + static line(partial?: Partial): LineAnnotationSpec { + return mergePartial(MockAnnotationSpec.lineBase, partial, { mergeOptionalPartialValues: true }); + } + static rect(partial?: Partial): RectAnnotationSpec { + return mergePartial(MockAnnotationSpec.rectBase, partial, { mergeOptionalPartialValues: true }); + } } diff --git a/src/mocks/store/index.ts b/src/mocks/store/index.ts new file mode 100644 index 0000000000..4702768221 --- /dev/null +++ b/src/mocks/store/index.ts @@ -0,0 +1,20 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ + +/** @internal */ +export * from './store'; diff --git a/src/mocks/store/store.ts b/src/mocks/store/store.ts new file mode 100644 index 0000000000..14110e9398 --- /dev/null +++ b/src/mocks/store/store.ts @@ -0,0 +1,54 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ + +import { chartStoreReducer, GlobalChartState } from '../../state/chart_state'; +import { createStore, Store } from 'redux'; +import { specParsing, upsertSpec, specParsed } from '../../state/actions/specs'; +import { Spec } from '../../specs'; +import { updateParentDimensions } from '../../state/actions/chart_settings'; + +/** @internal */ +export class MockStore { + static default( + { width, height, top, left } = { width: 100, height: 100, top: 0, left: 0 }, + chartId = 'chartId', + ): Store { + const storeReducer = chartStoreReducer(chartId); + const store = createStore(storeReducer); + store.dispatch(updateParentDimensions({ width, height, top, left })); + return store; + } + + static addSpecs(specs: Spec | Array, store: Store) { + store.dispatch(specParsing()); + if (Array.isArray(specs)) { + const actions = specs.map(upsertSpec); + actions.forEach(store.dispatch); + } else { + store.dispatch(upsertSpec(specs)); + } + store.dispatch(specParsed()); + } + + static updateDimensions( + { width, height, top, left } = { width: 100, height: 100, top: 0, left: 0 }, + store: Store, + ) { + store.dispatch(updateParentDimensions({ width, height, top, left })); + } +} From ff44a8d445c1f3d8e50ec1bb0ecef46f667db1ff Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Fri, 24 Apr 2020 15:38:52 +0200 Subject: [PATCH 2/7] fix: annotation extent cover fully the expressed range --- .playground/index.html | 2 +- .playground/playground.tsx | 54 ++- .../annotations/annotation_marker.test.tsx | 14 +- .../annotations/annotation_tooltip.ts | 54 --- .../xy_chart/annotations/annotation_utils.ts | 283 ------------- .../dimensions.integration.test.ts} | 56 ++- .../dimensions.ts} | 218 ++-------- .../xy_chart/annotations/line/marker.test.tsx | 216 ++++++++++ .../xy_chart/annotations/line/tooltip.ts | 78 ++++ .../xy_chart/annotations/line/types.ts | 53 +++ .../dimensions.integration.test.ts} | 213 +++++----- .../xy_chart/annotations/rect/dimensions.ts | 194 +++++++++ .../xy_chart/annotations/rect/tooltip.ts | 64 +++ .../xy_chart/annotations/rect/types.ts | 28 ++ .../annotations/rect_annotation_tooltip.ts | 188 --------- .../xy_chart/annotations/tooltip.ts | 117 ++++++ src/chart_types/xy_chart/annotations/types.ts | 83 ++++ ...annotation_utils.test.ts => utils.test.ts} | 384 ++++-------------- src/chart_types/xy_chart/annotations/utils.ts | 128 ++++++ .../renderer/canvas/annotations/index.ts | 6 +- .../renderer/canvas/annotations/lines.ts | 2 +- .../renderer/canvas/annotations/rect.ts | 2 +- .../renderer/canvas/primitives/rect.ts | 2 - .../xy_chart/renderer/canvas/xy_chart.tsx | 2 +- .../renderer/dom/annotation_tooltips.tsx | 10 +- .../xy_chart/rendering/rendering.ts | 3 +- .../state/selectors/compute_annotations.ts | 10 +- .../selectors/get_annotation_tooltip_state.ts | 7 +- src/chart_types/xy_chart/utils/specs.ts | 11 +- src/index.ts | 2 +- src/mocks/specs/specs.ts | 28 +- src/scales/index.ts | 8 - src/scales/scale_band.ts | 6 + src/scales/scale_continuous.test.ts | 3 +- src/scales/types.ts | 45 ++ .../annotations/rects/1_linear_bar_chart.tsx | 4 +- .../annotations/rects/2_ordinal_bar_chart.tsx | 4 +- .../annotations/rects/3_linear_line_chart.tsx | 10 +- tsconfig.json | 3 +- 39 files changed, 1402 insertions(+), 1193 deletions(-) delete mode 100644 src/chart_types/xy_chart/annotations/annotation_tooltip.ts delete mode 100644 src/chart_types/xy_chart/annotations/annotation_utils.ts rename src/chart_types/xy_chart/annotations/{line_annotation.test.ts => line/dimensions.integration.test.ts} (72%) rename src/chart_types/xy_chart/annotations/{line_annotation_tooltip.ts => line/dimensions.ts} (66%) create mode 100644 src/chart_types/xy_chart/annotations/line/marker.test.tsx create mode 100644 src/chart_types/xy_chart/annotations/line/tooltip.ts create mode 100644 src/chart_types/xy_chart/annotations/line/types.ts rename src/chart_types/xy_chart/annotations/{rect_annotation.test.ts => rect/dimensions.integration.test.ts} (52%) create mode 100644 src/chart_types/xy_chart/annotations/rect/dimensions.ts create mode 100644 src/chart_types/xy_chart/annotations/rect/tooltip.ts create mode 100644 src/chart_types/xy_chart/annotations/rect/types.ts delete mode 100644 src/chart_types/xy_chart/annotations/rect_annotation_tooltip.ts create mode 100644 src/chart_types/xy_chart/annotations/tooltip.ts create mode 100644 src/chart_types/xy_chart/annotations/types.ts rename src/chart_types/xy_chart/annotations/{annotation_utils.test.ts => utils.test.ts} (78%) create mode 100644 src/chart_types/xy_chart/annotations/utils.ts create mode 100644 src/scales/types.ts diff --git a/.playground/index.html b/.playground/index.html index 9ce5896129..1648214bcc 100644 --- a/.playground/index.html +++ b/.playground/index.html @@ -29,7 +29,7 @@ /*display: inline-block; position: relative; */ - width: 300px; + width: 500px; height: 300px; margin: 20px; } diff --git a/.playground/playground.tsx b/.playground/playground.tsx index 8a8dd21c01..0b8ff9f24a 100644 --- a/.playground/playground.tsx +++ b/.playground/playground.tsx @@ -36,12 +36,19 @@ import { // // { x: 2, min: 0, max: 3 }, // ]; -const data = new Array(11).fill(0).map((d, i) => { +const data = new Array(10).fill(0).map((d, i) => { return { x: i, - max: Math.random() * 10, + y: Math.random() * 10, }; }); + +// data = [ +// { x: 0, y: 4 }, +// { x: 1, y: 1 }, +// { x: 10, y: 3 }, +// // { x: 3, y: 2 }, +// ]; interface State { showRectAnnotation: boolean; showLineXAnnotation: boolean; @@ -56,14 +63,14 @@ interface State { } export class Playground extends React.Component<{}, State> { state: State = { - showRectAnnotation: false, - showLineXAnnotation: false, + showRectAnnotation: true, + showLineXAnnotation: true, showLineYAnnotation: false, totalBars: 1, totalLines: 1, - useLinearBar: true, + useLinearBar: false, useOrdinalBar: false, - useHistogramBar: false, + useHistogramBar: true, useLinearLine: false, useOrdinalLine: false, }; @@ -111,6 +118,7 @@ export class Playground extends React.Component<{}, State> { { {this.state.showRectAnnotation && ( { } @@ -159,13 +173,13 @@ export class Playground extends React.Component<{}, State> { id="lineanx" dataValues={[ { - dataValue: 10, + dataValue: 9.5, details: 'aaa', header: 'aaa', }, ]} domainType="xDomain" - marker={
} + marker={
} /> )} {this.state.useLinearBar && @@ -178,7 +192,7 @@ export class Playground extends React.Component<{}, State> { xScaleType={ScaleType.Linear} yScaleType={ScaleType.Linear} xAccessor="x" - yAccessors={['max']} + yAccessors={['y']} data={data} /> ))} @@ -193,7 +207,7 @@ export class Playground extends React.Component<{}, State> { xScaleType={ScaleType.Ordinal} yScaleType={ScaleType.Linear} xAccessor="x" - yAccessors={['max']} + yAccessors={['y']} data={data} /> ))} @@ -206,10 +220,10 @@ export class Playground extends React.Component<{}, State> { key={`histoBar${i}`} id={`histoBar${i}`} enableHistogramMode - xScaleType={ScaleType.Ordinal} + xScaleType={ScaleType.Linear} yScaleType={ScaleType.Linear} xAccessor="x" - yAccessors={['max']} + yAccessors={['y']} data={data} /> ))} @@ -224,7 +238,7 @@ export class Playground extends React.Component<{}, State> { xScaleType={ScaleType.Ordinal} yScaleType={ScaleType.Linear} xAccessor="x" - yAccessors={['max']} + yAccessors={['y']} data={data} /> ))} @@ -239,7 +253,7 @@ export class Playground extends React.Component<{}, State> { xScaleType={ScaleType.Linear} yScaleType={ScaleType.Linear} xAccessor="x" - yAccessors={['max']} + yAccessors={['y']} data={data} /> ))} diff --git a/src/chart_types/xy_chart/annotations/annotation_marker.test.tsx b/src/chart_types/xy_chart/annotations/annotation_marker.test.tsx index 17b813236a..fcac29db13 100644 --- a/src/chart_types/xy_chart/annotations/annotation_marker.test.tsx +++ b/src/chart_types/xy_chart/annotations/annotation_marker.test.tsx @@ -23,9 +23,10 @@ import { DEFAULT_ANNOTATION_LINE_STYLE } from '../../../utils/themes/theme'; import { Dimensions } from '../../../utils/dimensions'; import { GroupId } from '../../../utils/ids'; import { Scale, ScaleType, ScaleContinuous } from '../../../scales'; -import { computeLineAnnotationDimensions, AnnotationLineProps } from './line_annotation_tooltip'; -import { ChartTypes } from '../..'; import { SpecTypes } from '../../../specs/settings'; +import { computeLineAnnotationDimensions } from './line/dimensions'; +import { AnnotationLineProps } from './line/types'; +import { ChartTypes } from '../../../index'; describe('annotation marker', () => { const groupId = 'foo-group'; @@ -75,8 +76,7 @@ describe('annotation marker', () => { yScales, xScale, Position.Left, - 0, - 0, + false, ); const expectedDimensions: AnnotationLineProps[] = [ { @@ -130,8 +130,7 @@ describe('annotation marker', () => { yScales, xScale, Position.Left, - 0, - 0, + false, ); const expectedDimensions: AnnotationLineProps[] = [ { @@ -184,8 +183,7 @@ describe('annotation marker', () => { yScales, xScale, Position.Bottom, - 0, - 0, + false, ); const expectedDimensions: AnnotationLineProps[] = [ { diff --git a/src/chart_types/xy_chart/annotations/annotation_tooltip.ts b/src/chart_types/xy_chart/annotations/annotation_tooltip.ts deleted file mode 100644 index 1df2745586..0000000000 --- a/src/chart_types/xy_chart/annotations/annotation_tooltip.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. */ - -import { Dimensions } from '../../../utils/dimensions'; - -/** @internal */ -export function getFinalAnnotationTooltipPosition( - /** the dimensions of the chart parent container */ - container: Dimensions, - chartDimensions: Dimensions, - /** the dimensions of the tooltip container */ - tooltip: Dimensions, - /** the tooltip computed position not adjusted within chart bounds */ - tooltipAnchor: { top: number; left: number }, - padding = 10, -): { - left: string | null; - top: string | null; -} { - let left = 0; - - const annotationXOffset = window.pageXOffset + container.left + chartDimensions.left + tooltipAnchor.left; - if (chartDimensions.left + tooltipAnchor.left + tooltip.width + padding >= container.width) { - left = annotationXOffset - tooltip.width - padding; - } else { - left = annotationXOffset + padding; - } - let top = window.pageYOffset + container.top + chartDimensions.top + tooltipAnchor.top; - if (chartDimensions.top + tooltipAnchor.top + tooltip.height + padding >= container.height) { - top -= tooltip.height + padding; - } else { - top += padding; - } - - return { - left: `${Math.round(left)}px`, - top: `${Math.round(top)}px`, - }; -} diff --git a/src/chart_types/xy_chart/annotations/annotation_utils.ts b/src/chart_types/xy_chart/annotations/annotation_utils.ts deleted file mode 100644 index 17c2061ee2..0000000000 --- a/src/chart_types/xy_chart/annotations/annotation_utils.ts +++ /dev/null @@ -1,283 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. */ - -import { - AnnotationDomainType, - AnnotationDomainTypes, - AnnotationSpec, - AnnotationType, - AxisSpec, - HistogramModeAlignments, - isLineAnnotation, - isRectAnnotation, -} from '../utils/specs'; -import { Dimensions } from '../../../utils/dimensions'; -import { AnnotationId, GroupId } from '../../../utils/ids'; -import { Scale, ScaleType } from '../../../scales'; -import { computeXScaleOffset, getAxesSpecForSpecId, isHorizontalRotation, getSpecsById } from '../state/utils'; -import { Point } from '../../../utils/point'; -import { - computeLineAnnotationTooltipState, - AnnotationLineProps, - computeLineAnnotationDimensions, -} from './line_annotation_tooltip'; -import { - computeRectAnnotationTooltipState, - AnnotationRectProps, - computeRectAnnotationDimensions, -} from './rect_annotation_tooltip'; -import { Rotation, Position, Color } from '../../../utils/commons'; - -export type AnnotationTooltipFormatter = (details?: string) => JSX.Element | null; - -/** @internal */ -export type AnnotationTooltipState = AnnotationTooltipVisibleState | AnnotationTooltipHiddenState; - -/** @internal */ -export interface AnnotationTooltipVisibleState { - isVisible: true; - annotationType: AnnotationType; - header?: string; - details?: string; - anchor: { position?: Position; top: number; left: number }; - renderTooltip?: AnnotationTooltipFormatter; -} - -/** @internal */ -export interface AnnotationTooltipHiddenState { - isVisible: false; -} -/** - * The header and description strings for an Annotation - */ -export interface AnnotationDetails { - headerText?: string; - detailsText?: string; -} - -/** - * The marker for an Annotation. Usually a JSX element - */ -export interface AnnotationMarker { - icon: JSX.Element; - position: { top: number; left: number }; - dimension: { width: number; height: number }; - color: Color; -} - -/** @internal */ -export type AnnotationDimensions = AnnotationLineProps[] | AnnotationRectProps[]; - -/** @internal */ -export type Bounds = { startX: number; endX: number; startY: number; endY: number }; - -/** @internal */ -export function scaleAndValidateDatum( - value: any, - scale: Scale, - totalBarsInCluster: number, - lastValue?: boolean, -): number | null { - const isContinuous = scale.type !== ScaleType.Ordinal; - const scaledValue = scale.scale(value); - // d3.scale will return 0 for '', rendering the line incorrectly at 0 - if (scaledValue === null || (isContinuous && value === '')) { - return null; - } - - if (isContinuous) { - const [domainStart, domainEnd] = scale.domain; - const adjustedDomainEnd = domainEnd + (totalBarsInCluster > 0 ? scale.minInterval : 0); - - // limit the value to min or max of the domain - if (value < domainStart) { - return scale.scale(domainStart); - } - if (value > adjustedDomainEnd) { - return scale.scale(adjustedDomainEnd); - } - return scaledValue; - } - // is ordinal scale - if (lastValue) { - return scaledValue + scale.bandwidth * totalBarsInCluster; - } - return scaledValue; -} - -/** @internal */ -export function getAnnotationAxis( - axesSpecs: AxisSpec[], - groupId: GroupId, - domainType: AnnotationDomainType, - chartRotation: Rotation, -): Position | null { - const { xAxis, yAxis } = getAxesSpecForSpecId(axesSpecs, groupId); - const isHorizontalRotated = isHorizontalRotation(chartRotation); - const isXDomainAnnotation = isXDomain(domainType); - const annotationAxis = isXDomainAnnotation ? xAxis : yAxis; - const rotatedAnnotation = isHorizontalRotated ? annotationAxis : isXDomainAnnotation ? yAxis : xAxis; - return rotatedAnnotation ? rotatedAnnotation.position : null; -} - -/** @internal */ -export function computeClusterOffset(totalBarsInCluster: number, barsShift: number, bandwidth: number): number { - if (totalBarsInCluster > 1) { - return barsShift - bandwidth / 2; - } - - return 0; -} - -/** @internal */ -export function isXDomain(domainType: AnnotationDomainType): boolean { - return domainType === AnnotationDomainTypes.XDomain; -} - -/** @internal */ -export function getRotatedCursor( - /** the cursor position relative to the projection area */ - cursorPosition: Point, - chartDimensions: Dimensions, - chartRotation: Rotation, -): Point { - const { x, y } = cursorPosition; - const { height, width } = chartDimensions; - switch (chartRotation) { - case 0: - return { x, y }; - case 90: - return { x: y, y: width - x }; - case -90: - return { x: height - y, y: x }; - case 180: - return { x: width - x, y: height - y }; - } -} - -/** @internal */ -export function computeAnnotationDimensions( - annotations: AnnotationSpec[], - chartDimensions: Dimensions, - chartRotation: Rotation, - yScales: Map, - xScale: Scale, - axesSpecs: AxisSpec[], - totalBarsInCluster: number, - enableHistogramMode: boolean, -): Map { - const annotationDimensions = new Map(); - - const barsShift = (totalBarsInCluster * xScale.bandwidth) / 2; - - const band = xScale.bandwidth / (1 - xScale.barsPadding); - const halfPadding = (band - xScale.bandwidth) / 2; - const barsPadding = halfPadding * totalBarsInCluster; - const clusterOffset = computeClusterOffset(totalBarsInCluster, barsShift, xScale.bandwidth); - - // Annotations should always align with the axis line in histogram mode - const xScaleOffset = computeXScaleOffset(xScale, enableHistogramMode, HistogramModeAlignments.Start); - annotations.forEach((annotationSpec) => { - const { id } = annotationSpec; - if (isLineAnnotation(annotationSpec)) { - const { groupId, domainType } = annotationSpec; - const annotationAxisPosition = getAnnotationAxis(axesSpecs, groupId, domainType, chartRotation); - - const dimensions = computeLineAnnotationDimensions( - annotationSpec, - chartDimensions, - chartRotation, - yScales, - xScale, - annotationAxisPosition, - xScaleOffset - clusterOffset, - totalBarsInCluster, - ); - - if (dimensions) { - annotationDimensions.set(id, dimensions); - } - } else if (isRectAnnotation(annotationSpec)) { - const dimensions = computeRectAnnotationDimensions( - annotationSpec, - yScales, - xScale, - enableHistogramMode, - barsPadding, - totalBarsInCluster, - ); - - if (dimensions) { - annotationDimensions.set(id, dimensions); - } - } - }); - - return annotationDimensions; -} - -/** @internal */ -export function computeAnnotationTooltipState( - cursorPosition: Point, - annotationDimensions: Map, - annotationSpecs: AnnotationSpec[], - chartRotation: Rotation, - axesSpecs: AxisSpec[], - chartDimensions: Dimensions, -): AnnotationTooltipState | null { - for (const [annotationId, annotationDimension] of annotationDimensions) { - const spec = getSpecsById(annotationSpecs, annotationId); - - if (!spec || spec.hideTooltips) { - continue; - } - - const groupId = spec.groupId; - - if (isLineAnnotation(spec)) { - if (spec.hideLines) { - continue; - } - const lineAnnotationTooltipState = computeLineAnnotationTooltipState( - cursorPosition, - annotationDimension as AnnotationLineProps[], - groupId, - spec.domainType, - axesSpecs, - ); - - if (lineAnnotationTooltipState.isVisible) { - return lineAnnotationTooltipState; - } - } else if (isRectAnnotation(spec)) { - const rectAnnotationTooltipState = computeRectAnnotationTooltipState( - cursorPosition, - annotationDimension as AnnotationRectProps[], - chartRotation, - chartDimensions, - spec.renderTooltip, - ); - - if (rectAnnotationTooltipState.isVisible) { - return rectAnnotationTooltipState; - } - } - } - - return null; -} diff --git a/src/chart_types/xy_chart/annotations/line_annotation.test.ts b/src/chart_types/xy_chart/annotations/line/dimensions.integration.test.ts similarity index 72% rename from src/chart_types/xy_chart/annotations/line_annotation.test.ts rename to src/chart_types/xy_chart/annotations/line/dimensions.integration.test.ts index f81140bedb..fbe6622adc 100644 --- a/src/chart_types/xy_chart/annotations/line_annotation.test.ts +++ b/src/chart_types/xy_chart/annotations/line/dimensions.integration.test.ts @@ -16,10 +16,12 @@ * specific language governing permissions and limitations * under the License. */ -import { MockStore } from '../../../mocks/store'; -import { MockSeriesSpec, MockAnnotationSpec, MockGlobalSpec } from '../../../mocks/specs'; -import { computeAnnotationDimensionsSelector } from '../state/selectors/compute_annotations'; -import { ScaleType } from '../../../scales'; +import { MockStore } from '../../../../mocks/store'; +import { MockSeriesSpec, MockAnnotationSpec, MockGlobalSpec } from '../../../../mocks/specs'; +import { computeAnnotationDimensionsSelector } from '../../state/selectors/compute_annotations'; +import { ScaleType } from '../../../../scales'; +import { AnnotationDomainTypes } from '../../utils/specs'; +import { Position } from '../../../../utils/commons'; function expectAnnotationAtPosition( data: Array<{ x: number; y: number }>, @@ -112,4 +114,50 @@ describe('Render vertical line annotation within', () => { ]; expectAnnotationAtPosition(data, 'line', dataValue, linePosition, numOfSpecs, ScaleType.Ordinal); }); + + it('histogramMode with line after the max value but before the max + minInterval ', () => { + const store = MockStore.default(); + const settings = MockGlobalSpec.settingsNoMargins({ + xDomain: { + min: 0, + max: 9, + minInterval: 1, + }, + }); + const spec = MockSeriesSpec.histogramBar({ + xScaleType: ScaleType.Linear, + data: [ + { + x: 0, + y: 1, + }, + { + x: 9, + y: 20, + }, + ], + }); + const annotation = MockAnnotationSpec.line({ + domainType: AnnotationDomainTypes.XDomain, + dataValues: [{ dataValue: 9.5, details: 'foo' }], + }); + + MockStore.addSpecs([settings, spec, annotation], store); + const annotations = computeAnnotationDimensionsSelector(store.getState()); + expect(annotations.get(annotation.id)).toEqual([ + { + anchor: { + top: 100, + left: 95, + position: Position.Bottom, + }, + linePathPoints: { + start: { x1: 95, y1: 100 }, + end: { x2: 95, y2: 0 }, + }, + details: { detailsText: 'foo', headerText: '9.5' }, + marker: undefined, + }, + ]); + }); }); diff --git a/src/chart_types/xy_chart/annotations/line_annotation_tooltip.ts b/src/chart_types/xy_chart/annotations/line/dimensions.ts similarity index 66% rename from src/chart_types/xy_chart/annotations/line_annotation_tooltip.ts rename to src/chart_types/xy_chart/annotations/line/dimensions.ts index 2e819cfa6c..58c0eaa21d 100644 --- a/src/chart_types/xy_chart/annotations/line_annotation_tooltip.ts +++ b/src/chart_types/xy_chart/annotations/line/dimensions.ts @@ -16,66 +16,16 @@ * specific language governing permissions and limitations * under the License. */ -import { - AnnotationDomainType, - AnnotationDomainTypes, - AnnotationTypes, - LineAnnotationSpec, - LineAnnotationDatum, - AxisSpec, -} from '../utils/specs'; -import { Position, Rotation } from '../../../utils/commons'; -import { - AnnotationTooltipState, - AnnotationDetails, - AnnotationMarker, - scaleAndValidateDatum, - isXDomain, - Bounds, -} from './annotation_utils'; -import { isHorizontalRotation, getAxesSpecForSpecId } from '../state/utils'; -import { isHorizontalAxis } from '../utils/axis_utils'; -import { Dimensions } from '../../../utils/dimensions'; -import { Scale } from '../../../scales'; -import { GroupId } from '../../../utils/ids'; -import { Point } from '../../../utils/point'; -import { isWithinRectBounds } from './rect_annotation_tooltip'; - -/** @internal */ -export type AnnotationLinePosition = [number, number, number, number]; - -/** - * Start and end points of a line annotation - * @internal - */ -export interface AnnotationLinePathPoints { - /** x1,y1 the start point anchored to the linked axis */ - start: { - x1: number; - y1: number; - }; - /** x2,y2 the end point */ - end: { - x2: number; - y2: number; - }; -} - -/** @internal */ -export interface AnnotationLineProps { - /** the position of the start point relative to the Chart */ - anchor: { - position: Position; - top: number; - left: number; - }; - /** - * The path points of a line annotation - */ - linePathPoints: AnnotationLinePathPoints; - details: AnnotationDetails; - marker?: AnnotationMarker; -} +import { AnnotationDomainTypes, LineAnnotationSpec, LineAnnotationDatum } from '../../utils/specs'; +import { Position, Rotation } from '../../../../utils/commons'; +import { AnnotationMarker } from '../types'; +import { isHorizontalRotation } from '../../state/utils'; +import { Dimensions } from '../../../../utils/dimensions'; +import { Scale } from '../../../../scales'; +import { GroupId } from '../../../../utils/ids'; +import { AnnotationLineProps, AnnotationLinePathPoints } from './types'; +import { isContinuousScale, isBandScale } from '../../../../scales/types'; +import { computeXScaleOffset } from '../../state/utils'; /** @internal */ export const DEFAULT_LINE_OVERFLOW = 0; @@ -96,11 +46,11 @@ function computeYDomainLineAnnotationDimensions( // let's use a default Bottom-X/Left-Y axis orientation if we are not showing an axis // but we are displaying a line annotation const anchorPosition = - axisPosition === null ? (isHorizontalChartRotation ? Position.Bottom : Position.Left) : axisPosition; + axisPosition === null ? (isHorizontalChartRotation ? Position.Left : Position.Bottom) : axisPosition; const lineProps: AnnotationLineProps[] = []; dataValues.forEach((datum: LineAnnotationDatum) => { - let { dataValue } = datum; + const { dataValue } = datum; // avoid rendering invalid annotation value if (dataValue === null || dataValue === undefined || dataValue === '') { @@ -115,11 +65,8 @@ function computeYDomainLineAnnotationDimensions( const [domainStart, domainEnd] = yScale.domain; // avoid rendering annotation with values outside the scale domain - if (dataValue < domainStart) { - dataValue = domainStart; - } - if (dataValue > domainEnd) { - dataValue = domainEnd; + if (dataValue < domainStart || dataValue > domainEnd) { + return; } const anchor = { @@ -217,8 +164,7 @@ function computeXDomainLineAnnotationDimensions( axisPosition: Position | null, chartDimensions: Dimensions, lineColor: string, - xScaleOffset: number, - totalBarsInCluster: number, + isHistogramMode: boolean, marker?: JSX.Element, markerDimension = { width: 0, height: 0 }, ): AnnotationLineProps[] { @@ -233,15 +179,32 @@ function computeXDomainLineAnnotationDimensions( dataValues.forEach((datum: LineAnnotationDatum) => { const { dataValue } = datum; - - const scaledXValue = scaleAndValidateDatum(dataValue, xScale, totalBarsInCluster, false); - - if (scaledXValue == null) { + let annotationValueXposition = xScale.scale(dataValue); + if (isContinuousScale(xScale) && typeof dataValue === 'number') { + const minDomain = xScale.domain[0]; + const maxDomain = isHistogramMode ? xScale.domain[1] + xScale.minInterval : xScale.domain[1]; + if (dataValue < minDomain || dataValue > maxDomain) { + return; + } + if (isHistogramMode) { + const offset = computeXScaleOffset(xScale, true); + annotationValueXposition = xScale.pureScale(dataValue) - offset; + } else { + annotationValueXposition = xScale.scale(dataValue) + (xScale.bandwidth * xScale.totalBarsInCluster) / 2; + } + } else if (isBandScale(xScale)) { + if (isHistogramMode) { + const padding = (xScale.step - xScale.originalBandwidth) / 2; + annotationValueXposition = xScale.scale(dataValue) - padding; + } else { + annotationValueXposition = xScale.scale(dataValue) + xScale.originalBandwidth / 2; + } + } else { + return; + } + if (isNaN(annotationValueXposition) || annotationValueXposition == null) { return; } - - const offset = xScale.bandwidth / 2 - xScaleOffset; - const annotationValueXposition = scaledXValue + offset; const markerPosition = { top: 0, left: 0 }; const linePathPoints: AnnotationLinePathPoints = { @@ -340,8 +303,7 @@ export function computeLineAnnotationDimensions( yScales: Map, xScale: Scale, axisPosition: Position | null, - xScaleOffset: number, - totalBarsInCluster: number = 0, + isHistogramMode: boolean, ): AnnotationLineProps[] | null { const { domainType, dataValues, marker, markerDimensions, hideLines } = annotationSpec; @@ -361,8 +323,7 @@ export function computeLineAnnotationDimensions( axisPosition, chartDimensions, lineColor, - xScaleOffset, - totalBarsInCluster, + isHistogramMode, marker, markerDimensions, ); @@ -385,100 +346,3 @@ export function computeLineAnnotationDimensions( markerDimensions, ); } - -/** @internal */ -export function getAnnotationLineTooltipXOffset(chartRotation: Rotation, axisPosition: Position): number { - let xOffset = 0; - const isChartHorizontalRotation = isHorizontalRotation(chartRotation); - - if (isHorizontalAxis(axisPosition)) { - xOffset = isChartHorizontalRotation ? 50 : 0; - } else { - if (isChartHorizontalRotation) { - xOffset = axisPosition === Position.Right ? 100 : 0; - } else { - xOffset = 50; - } - } - - return xOffset; -} - -/** @internal */ -export function getAnnotationLineTooltipYOffset(chartRotation: Rotation, axisPosition: Position): number { - let yOffset = 0; - const isChartHorizontalRotation = isHorizontalRotation(chartRotation); - - if (isHorizontalAxis(axisPosition)) { - if (isChartHorizontalRotation) { - yOffset = axisPosition === Position.Top ? 0 : 100; - } else { - yOffset = 50; - } - } else { - yOffset = isChartHorizontalRotation ? 50 : 100; - } - - return yOffset; -} - -/** @internal */ -export function isVerticalAnnotationLine(isXDomainAnnotation: boolean, isHorizontalChartRotation: boolean): boolean { - if (isXDomainAnnotation) { - return isHorizontalChartRotation; - } - - return !isHorizontalChartRotation; -} - -/** - * Checks if the cursorPosition is within the line annotation marker - * @param cursorPosition the cursor position relative to the projected area - * @param marker the line annotation marker - */ -function isWithinLineMarkerBounds(cursorPosition: Point, marker: AnnotationMarker): boolean { - const { top, left } = marker.position; - const { width, height } = marker.dimension; - const markerRect: Bounds = { startX: left, startY: top, endX: left + width, endY: top + height }; - return isWithinRectBounds(cursorPosition, markerRect); -} - -/** @internal */ -export function computeLineAnnotationTooltipState( - cursorPosition: Point, - annotationLines: AnnotationLineProps[], - groupId: GroupId, - domainType: AnnotationDomainType, - axesSpecs: AxisSpec[], -): AnnotationTooltipState { - const { xAxis, yAxis } = getAxesSpecForSpecId(axesSpecs, groupId); - const isXDomainAnnotation = isXDomain(domainType); - const annotationAxis = isXDomainAnnotation ? xAxis : yAxis; - - if (!annotationAxis) { - return { - isVisible: false, - }; - } - - const totalAnnotationLines = annotationLines.length; - for (let i = 0; i < totalAnnotationLines; i++) { - const line = annotationLines[i]; - const isWithinBounds = line.marker && isWithinLineMarkerBounds(cursorPosition, line.marker); - - if (isWithinBounds) { - return { - annotationType: AnnotationTypes.Line, - isVisible: true, - anchor: { - ...line.anchor, - }, - ...(line.details && { header: line.details.headerText }), - ...(line.details && { details: line.details.detailsText }), - }; - } - } - return { - isVisible: false, - }; -} diff --git a/src/chart_types/xy_chart/annotations/line/marker.test.tsx b/src/chart_types/xy_chart/annotations/line/marker.test.tsx new file mode 100644 index 0000000000..5ba827f24a --- /dev/null +++ b/src/chart_types/xy_chart/annotations/line/marker.test.tsx @@ -0,0 +1,216 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ + +import React from 'react'; +import { AnnotationDomainTypes, AnnotationSpec, AnnotationTypes } from '../../utils/specs'; +import { Position, Rotation } from '../../../../utils/commons'; +import { DEFAULT_ANNOTATION_LINE_STYLE } from '../../../../utils/themes/theme'; +import { Dimensions } from '../../../../utils/dimensions'; +import { GroupId } from '../../../../utils/ids'; +import { Scale, ScaleType, ScaleContinuous } from '../../../../scales'; +import { computeLineAnnotationDimensions } from './dimensions'; +import { AnnotationLineProps } from './types'; +import { ChartTypes } from '../../..'; +import { SpecTypes } from '../../../../specs/settings'; + +describe('annotation marker', () => { + const groupId = 'foo-group'; + + const minRange = 0; + const maxRange = 100; + + const continuousData = [0, 10]; + const continuousScale = new ScaleContinuous({ + type: ScaleType.Linear, + domain: continuousData, + range: [minRange, maxRange], + }); + + const chartDimensions: Dimensions = { + width: 10, + height: 20, + top: 5, + left: 15, + }; + + const yScales: Map = new Map(); + yScales.set(groupId, continuousScale); + + const xScale: Scale = continuousScale; + + test('should compute line annotation dimensions with marker if defined (y domain)', () => { + const chartRotation: Rotation = 0; + + const id = 'foo-line'; + const lineAnnotation: AnnotationSpec = { + chartType: ChartTypes.XYAxis, + specType: SpecTypes.Annotation, + annotationType: AnnotationTypes.Line, + id, + domainType: AnnotationDomainTypes.YDomain, + dataValues: [{ dataValue: 2, details: 'foo' }], + groupId, + style: DEFAULT_ANNOTATION_LINE_STYLE, + marker:
, + }; + + const dimensions = computeLineAnnotationDimensions( + lineAnnotation, + chartDimensions, + chartRotation, + yScales, + xScale, + Position.Left, + false, + ); + const expectedDimensions: AnnotationLineProps[] = [ + { + anchor: { + position: Position.Left, + top: 20, + left: 0, + }, + linePathPoints: { + start: { + x1: 0, + y1: 20, + }, + end: { + x2: 10, + y2: 20, + }, + }, + details: { detailsText: 'foo', headerText: '2' }, + + marker: { + icon:
, + color: '#777', + dimension: { width: 0, height: 0 }, + position: { left: -0, top: 20 }, + }, + }, + ]; + expect(dimensions).toEqual(expectedDimensions); + }); + + test('should compute line annotation dimensions with marker if defined (y domain: 180 deg rotation)', () => { + const chartRotation: Rotation = 180; + + const lineAnnotation: AnnotationSpec = { + chartType: ChartTypes.XYAxis, + specType: SpecTypes.Annotation, + annotationType: AnnotationTypes.Line, + id: 'foo-line', + domainType: AnnotationDomainTypes.YDomain, + dataValues: [{ dataValue: 2, details: 'foo' }], + groupId, + style: DEFAULT_ANNOTATION_LINE_STYLE, + marker:
, + }; + + const dimensions = computeLineAnnotationDimensions( + lineAnnotation, + chartDimensions, + chartRotation, + yScales, + xScale, + Position.Left, + false, + ); + const expectedDimensions: AnnotationLineProps[] = [ + { + anchor: { + position: Position.Left, + top: 0, + left: 0, + }, + linePathPoints: { + start: { + x1: 0, + y1: 20, + }, + end: { + x2: 10, + y2: 20, + }, + }, + details: { detailsText: 'foo', headerText: '2' }, + marker: { + icon:
, + color: '#777', + dimension: { width: 0, height: 0 }, + position: { left: -0, top: 0 }, + }, + }, + ]; + expect(dimensions).toEqual(expectedDimensions); + }); + + test('should compute line annotation dimensions with marker if defined (x domain)', () => { + const chartRotation: Rotation = 0; + + const lineAnnotation: AnnotationSpec = { + chartType: ChartTypes.XYAxis, + specType: SpecTypes.Annotation, + annotationType: AnnotationTypes.Line, + id: 'foo-line', + domainType: AnnotationDomainTypes.XDomain, + dataValues: [{ dataValue: 2, details: 'foo' }], + groupId, + style: DEFAULT_ANNOTATION_LINE_STYLE, + marker:
, + }; + + const dimensions = computeLineAnnotationDimensions( + lineAnnotation, + chartDimensions, + chartRotation, + yScales, + xScale, + Position.Bottom, + false, + ); + const expectedDimensions: AnnotationLineProps[] = [ + { + anchor: { + position: Position.Bottom, + top: 20, + left: 20, + }, + details: { detailsText: 'foo', headerText: '2' }, + linePathPoints: { + start: { + x1: 20, + y1: 20, + }, + end: { + x2: 20, + y2: 0, + }, + }, + marker: { + icon:
, + color: '#777', + dimension: { width: 0, height: 0 }, + position: { top: 20, left: 20 }, + }, + }, + ]; + expect(dimensions).toEqual(expectedDimensions); + }); +}); diff --git a/src/chart_types/xy_chart/annotations/line/tooltip.ts b/src/chart_types/xy_chart/annotations/line/tooltip.ts new file mode 100644 index 0000000000..e91fb5c123 --- /dev/null +++ b/src/chart_types/xy_chart/annotations/line/tooltip.ts @@ -0,0 +1,78 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ + +import { AnnotationLineProps } from './types'; +import { isWithinRectBounds } from '../rect/dimensions'; +import { isXDomain } from '../utils'; +import { AnnotationTooltipState, AnnotationMarker, Bounds } from '../types'; +import { getAxesSpecForSpecId } from '../../state/utils'; +import { AnnotationDomainType, AnnotationTypes, AxisSpec } from '../../utils/specs'; +import { GroupId } from '../../../../utils/ids'; +import { Point } from '../../../../utils/point'; + +/** @internal */ +export function computeLineAnnotationTooltipState( + cursorPosition: Point, + annotationLines: AnnotationLineProps[], + groupId: GroupId, + domainType: AnnotationDomainType, + axesSpecs: AxisSpec[], +): AnnotationTooltipState { + const { xAxis, yAxis } = getAxesSpecForSpecId(axesSpecs, groupId); + const isXDomainAnnotation = isXDomain(domainType); + const annotationAxis = isXDomainAnnotation ? xAxis : yAxis; + + if (!annotationAxis) { + return { + isVisible: false, + }; + } + + const totalAnnotationLines = annotationLines.length; + for (let i = 0; i < totalAnnotationLines; i++) { + const line = annotationLines[i]; + const isWithinBounds = line.marker && isWithinLineMarkerBounds(cursorPosition, line.marker); + + if (isWithinBounds) { + return { + annotationType: AnnotationTypes.Line, + isVisible: true, + anchor: { + ...line.anchor, + }, + ...(line.details && { header: line.details.headerText }), + ...(line.details && { details: line.details.detailsText }), + }; + } + } + return { + isVisible: false, + }; +} + +/** + * Checks if the cursorPosition is within the line annotation marker + * @param cursorPosition the cursor position relative to the projected area + * @param marker the line annotation marker + */ +function isWithinLineMarkerBounds(cursorPosition: Point, marker: AnnotationMarker): boolean { + const { top, left } = marker.position; + const { width, height } = marker.dimension; + const markerRect: Bounds = { startX: left, startY: top, endX: left + width, endY: top + height }; + return isWithinRectBounds(cursorPosition, markerRect); +} diff --git a/src/chart_types/xy_chart/annotations/line/types.ts b/src/chart_types/xy_chart/annotations/line/types.ts new file mode 100644 index 0000000000..1955d57aad --- /dev/null +++ b/src/chart_types/xy_chart/annotations/line/types.ts @@ -0,0 +1,53 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ + +import { Position } from '../../../../utils/commons'; +import { AnnotationDetails, AnnotationMarker } from '../types'; + +/** + * Start and end points of a line annotation + * @internal + */ +export interface AnnotationLinePathPoints { + /** x1,y1 the start point anchored to the linked axis */ + start: { + x1: number; + y1: number; + }; + /** x2,y2 the end point */ + end: { + x2: number; + y2: number; + }; +} + +/** @internal */ +export interface AnnotationLineProps { + /** the position of the start point relative to the Chart */ + anchor: { + position: Position; + top: number; + left: number; + }; + /** + * The path points of a line annotation + */ + linePathPoints: AnnotationLinePathPoints; + details: AnnotationDetails; + marker?: AnnotationMarker; +} diff --git a/src/chart_types/xy_chart/annotations/rect_annotation.test.ts b/src/chart_types/xy_chart/annotations/rect/dimensions.integration.test.ts similarity index 52% rename from src/chart_types/xy_chart/annotations/rect_annotation.test.ts rename to src/chart_types/xy_chart/annotations/rect/dimensions.integration.test.ts index e4838b25e1..7a2d9dd9c4 100644 --- a/src/chart_types/xy_chart/annotations/rect_annotation.test.ts +++ b/src/chart_types/xy_chart/annotations/rect/dimensions.integration.test.ts @@ -15,16 +15,17 @@ * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ -import { MockStore } from '../../../mocks/store'; -import { MockSeriesSpec, MockAnnotationSpec, MockGlobalSpec } from '../../../mocks/specs'; -import { computeAnnotationDimensionsSelector } from '../state/selectors/compute_annotations'; -import { ScaleType } from '../../../scales'; -import { RectAnnotationDatum } from '../utils/specs'; -import { AnnotationRectProps } from './rect_annotation_tooltip'; + +import { MockStore } from '../../../../mocks/store'; +import { MockSeriesSpec, MockAnnotationSpec, MockGlobalSpec } from '../../../../mocks/specs'; +import { computeAnnotationDimensionsSelector } from '../../state/selectors/compute_annotations'; +import { ScaleType } from '../../../../scales'; +import { RectAnnotationDatum } from '../../utils/specs'; +import { AnnotationRectProps } from './types'; function expectAnnotationAtPosition( data: Array<{ x: number; y: number }>, - type: 'line' | 'bar', + type: 'line' | 'bar' | 'histogram', dataValues: RectAnnotationDatum[], expectedRect: { x: number; @@ -60,15 +61,15 @@ function expectAnnotationAtPosition( } describe('Render rect annotation within', () => { - it.each([ - // x0, numOfSpecs, x, width - [0, 1, 0, 100], - [1, 1, 25, 75], - [2, 1, 50, 50], - [3, 1, 75, 25], - [1, 2, 25, 75], - [2, 3, 50, 50], - ])('bars starting from %i, %i specs, all scales', (x0, numOfSpecs, x, width) => { + it.each` + x0 | numOfSpecs | x | width + ${0} | ${1} | ${0} | ${100} + ${1} | ${1} | ${25} | ${75} + ${2} | ${1} | ${50} | ${50} + ${3} | ${1} | ${75} | ${25} + ${1} | ${2} | ${25} | ${75} + ${2} | ${3} | ${50} | ${50} + `('bars starting from $x0, $numOfSpecs specs, all scales', ({ x0, numOfSpecs, x, width }) => { const data = [ { x: 0, y: 4 }, { x: 1, y: 1 }, @@ -86,15 +87,15 @@ describe('Render rect annotation within', () => { expectAnnotationAtPosition(data, 'bar', dataValues, rect, numOfSpecs, ScaleType.Time); }); - it.each([ - // x1, numOfSpecs, x, width - [0, 1, 0, 25], - [1, 1, 0, 50], - [2, 1, 0, 75], - [3, 1, 0, 100], - [1, 2, 0, 50], - [2, 2, 0, 75], - ])('bars starting ending at %i, %i specs, all scales', (x1, numOfSpecs, x, width) => { + it.each` + x1 | numOfSpecs | x | width + ${0} | ${1} | ${0} | ${25} + ${1} | ${1} | ${0} | ${50} + ${2} | ${1} | ${0} | ${75} + ${3} | ${1} | ${0} | ${100} + ${1} | ${2} | ${0} | ${50} + ${2} | ${2} | ${0} | ${75} + `('bars starting ending at $x1, $numOfSpecs specs, all scales', ({ x1, numOfSpecs, x, width }) => { const data = [ { x: 0, y: 4 }, { x: 1, y: 1 }, @@ -112,14 +113,14 @@ describe('Render rect annotation within', () => { expectAnnotationAtPosition(data, 'bar', dataValues, rect, numOfSpecs, ScaleType.Time); }); - it.each([ - // x0, x1, numOfSpecs, x, width - [0, 0, 1, 0, 25], - [0, 1, 1, 0, 50], - [1, 3, 1, 25, 75], - [0, 1, 2, 0, 50], - [1, 3, 3, 25, 75], - ])('bars starting starting at %i, ending at %i, %i specs, all scales', (x0, x1, numOfSpecs, x, width) => { + it.each` + x0 | x1 | numOfSpecs | x | width + ${0} | ${0} | ${1} | ${0} | ${25} + ${0} | ${1} | ${1} | ${0} | ${50} + ${1} | ${3} | ${1} | ${25} | ${75} + ${0} | ${1} | ${2} | ${0} | ${50} + ${1} | ${3} | ${3} | ${25} | ${75} + `('bars starting at $x0, ending at $x1, $numOfSpecs specs, all scales', ({ x0, x1, numOfSpecs, x, width }) => { const data = [ { x: 0, y: 4 }, { x: 1, y: 1 }, @@ -137,14 +138,14 @@ describe('Render rect annotation within', () => { expectAnnotationAtPosition(data, 'bar', dataValues, rect, numOfSpecs, ScaleType.Time); }); - it.each([ - // x0, x1, numOfSpecs, x, width - [0, 0, 1, 0, 25], - [0, 1, 1, 0, 50], - [1, 3, 1, 25, 75], - [0, 1, 2, 0, 50], - [1, 3, 3, 25, 75], - ])('lines starting starting at %i, ending at %i, %i specs, ordinal scale', (x0, x1, numOfSpecs, x, width) => { + it.each` + x0 | x1 | numOfSpecs | x | width + ${0} | ${0} | ${1} | ${0} | ${25} + ${0} | ${1} | ${1} | ${0} | ${50} + ${1} | ${3} | ${1} | ${25} | ${75} + ${0} | ${1} | ${2} | ${0} | ${50} + ${1} | ${3} | ${3} | ${25} | ${75} + `('lines starting at $x0, ending at $x1, $numOfSpecs specs, ordinal scale', ({ x0, x1, numOfSpecs, x, width }) => { const data = [ { x: 0, y: 4 }, { x: 1, y: 1 }, @@ -160,62 +161,86 @@ describe('Render rect annotation within', () => { expectAnnotationAtPosition(data, 'line', dataValues, rect, numOfSpecs, ScaleType.Ordinal); }); - it.each([ - // x0, x1, numOfSpecs, x, width - [0, 0, 1, 0, 0], - [0, 1, 1, 0, 50], - [1, 2, 1, 50, 50], - [0, 2, 1, 0, 100], - [0, 1, 2, 0, 50], - [1, 2, 3, 50, 50], - ])('lines starting starting at %i, ending at %i, %i specs, continuous scale', (x0, x1, numOfSpecs, x, width) => { - const data = [ - { x: 0, y: 4 }, - { x: 1, y: 1 }, - { x: 2, y: 3 }, - ]; - const dataValues: RectAnnotationDatum[] = [ - { - coordinates: { x0, x1 }, - }, - ]; - const rect = { x, width, y: 0, height: 100 }; - expectAnnotationAtPosition(data, 'line', dataValues, rect, numOfSpecs, ScaleType.Linear); - }); - - it('out of bound annotations upper y', () => { - const data = [ - { x: 0, y: 4 }, - { x: 1, y: 1 }, - { x: 2, y: 3 }, - ]; - const dataValues: RectAnnotationDatum[] = [ - { - coordinates: { y1: 10 }, - }, - ]; - const rect = { x: 0, width: 100, y: 0, height: 100 }; - expectAnnotationAtPosition(data, 'line', dataValues, rect, 1, ScaleType.Linear); - expectAnnotationAtPosition(data, 'bar', dataValues, rect, 1, ScaleType.Linear); - }); + it.each` + x0 | x1 | numOfSpecs | x | width + ${0} | ${0} | ${1} | ${0} | ${0} + ${0} | ${1} | ${1} | ${0} | ${50} + ${1} | ${2} | ${1} | ${50} | ${50} + ${0} | ${2} | ${1} | ${0} | ${100} + ${0} | ${1} | ${2} | ${0} | ${50} + ${1} | ${2} | ${3} | ${50} | ${50} + `( + 'on line starting at $x0, ending at $x1, $numOfSpecs specs, continuous scale', + ({ x0, x1, numOfSpecs, x, width }) => { + const data = [ + { x: 0, y: 4 }, + { x: 1, y: 1 }, + { x: 2, y: 3 }, + ]; + const dataValues: RectAnnotationDatum[] = [ + { + coordinates: { x0, x1 }, + }, + ]; + const rect = { x, width, y: 0, height: 100 }; + expectAnnotationAtPosition(data, 'line', dataValues, rect, numOfSpecs, ScaleType.Linear); + }, + ); + it.each` + x0 | x1 | numOfSpecs | x | width + ${0} | ${0} | ${1} | ${0} | ${0} + ${0} | ${1} | ${1} | ${0} | ${25} + ${1} | ${2} | ${1} | ${25} | ${25} + ${0} | ${2} | ${1} | ${0} | ${50} + ${0} | ${1} | ${2} | ${0} | ${25} + ${1} | ${2} | ${3} | ${25} | ${25} + `( + 'on histogram starting at $x0, ending at $x1, $numOfSpecs specs, continuous scale', + ({ x0, x1, numOfSpecs, x, width }) => { + const data = [ + { x: 0, y: 4 }, + { x: 1, y: 1 }, + { x: 2, y: 3 }, + { x: 3, y: 3 }, + ]; + const dataValues: RectAnnotationDatum[] = [ + { + coordinates: { x0, x1 }, + }, + ]; + const rect = { x, width, y: 0, height: 100 }; + expectAnnotationAtPosition(data, 'histogram', dataValues, rect, numOfSpecs, ScaleType.Linear); + }, + ); - it('out of bound annotations lower y', () => { + it.each` + prop | x | y | width | height + ${'x0'} | ${50} | ${0} | ${50} | ${100} + ${'x1'} | ${0} | ${0} | ${50} | ${100} + ${'y0'} | ${0} | ${0} | ${100} | ${75} + ${'y1'} | ${0} | ${75} | ${100} | ${25} + `('expand annotation with only one prop configured: $prop', ({ prop, x, y, width, height }) => { const data = [ { x: 0, y: 4 }, { x: 1, y: 1 }, - { x: 2, y: 3 }, + { x: 2, y: 2 }, ]; const dataValues: RectAnnotationDatum[] = [ { - coordinates: { y0: -4 }, + coordinates: { [prop]: 1 }, }, ]; - const rect = { x: 0, width: 100, y: 0, height: 100 }; - expectAnnotationAtPosition(data, 'bar', dataValues, rect, 1, ScaleType.Linear); + const rect = { x, width, y, height }; expectAnnotationAtPosition(data, 'line', dataValues, rect, 1, ScaleType.Linear); }); - it('out of bound annotations lower x', () => { + it.each` + value | prop + ${10} | ${'y1'} + ${-4} | ${'y0'} + ${-4} | ${'x0'} + ${5} | ${'x1'} + `('out of bound annotations for $prop', ({ prop, value }) => { const data = [ { x: 0, y: 4 }, { x: 1, y: 1 }, @@ -223,27 +248,11 @@ describe('Render rect annotation within', () => { ]; const dataValues: RectAnnotationDatum[] = [ { - coordinates: { x0: -4 }, + coordinates: { [prop]: value }, }, ]; const rect = { x: 0, width: 100, y: 0, height: 100 }; - expectAnnotationAtPosition(data, 'bar', dataValues, rect, 1, ScaleType.Linear); expectAnnotationAtPosition(data, 'line', dataValues, rect, 1, ScaleType.Linear); - }); - - it('out of bound annotations upper x', () => { - const data = [ - { x: 0, y: 4 }, - { x: 1, y: 1 }, - { x: 2, y: 3 }, - ]; - const dataValues: RectAnnotationDatum[] = [ - { - coordinates: { x1: 5 }, - }, - ]; - const rect = { x: 0, width: 100, y: 0, height: 100 }; expectAnnotationAtPosition(data, 'bar', dataValues, rect, 1, ScaleType.Linear); - expectAnnotationAtPosition(data, 'line', dataValues, rect, 1, ScaleType.Linear); }); }); diff --git a/src/chart_types/xy_chart/annotations/rect/dimensions.ts b/src/chart_types/xy_chart/annotations/rect/dimensions.ts new file mode 100644 index 0000000000..83011eedda --- /dev/null +++ b/src/chart_types/xy_chart/annotations/rect/dimensions.ts @@ -0,0 +1,194 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ + +import { RectAnnotationDatum, RectAnnotationSpec } from '../../utils/specs'; +import { GroupId } from '../../../../utils/ids'; +import { Scale, ScaleBand, ScaleContinuous } from '../../../../scales'; +import { Point } from '../../../../utils/point'; +import { Bounds } from '../types'; +import { AnnotationRectProps } from './types'; +import { isBandScale, isContinuousScale } from '../../../../scales/types'; +import { PrimitiveValue } from '../../../partition_chart/layout/utils/group_by_rollup'; + +/** @internal */ +export function isWithinRectBounds({ x, y }: Point, { startX, endX, startY, endY }: Bounds): boolean { + const withinXBounds = x >= startX && x <= endX; + const withinYBounds = y >= startY && y <= endY; + + return withinXBounds && withinYBounds; +} + +/** @internal */ +export function computeRectAnnotationDimensions( + annotationSpec: RectAnnotationSpec, + yScales: Map, + xScale: Scale, + isHistogram: boolean = false, +): AnnotationRectProps[] | null { + const { dataValues } = annotationSpec; + const groupId = annotationSpec.groupId; + const yScale = yScales.get(groupId); + if (!yScale) { + return null; + } + + const rectsProps: AnnotationRectProps[] = []; + + dataValues.forEach((dataValue: RectAnnotationDatum) => { + let { x0, x1, y0, y1 } = dataValue.coordinates; + + // if everything is null, return; otherwise we coerce the other coordinates + if (x0 == null && x1 == null && y0 == null && y1 == null) { + return; + } + [x0, x1] = limitValueToDomainRange(xScale, x0, x1, isHistogram); + [y0, y1] = limitValueToDomainRange(yScale, y0, y1); + + // something is wrong with the data types, don't draw this annotation + if (x0 == null || x1 == null || y0 == null || y1 == null) { + return; + } + + let xAndWidth: { x: number; width: number } | null = null; + if (isBandScale(xScale)) { + xAndWidth = scaleXonBandScale(xScale, x0, x1); + } else if (isContinuousScale(xScale)) { + xAndWidth = scaleXonContinuousScale(xScale, x0, x1, isHistogram); + } + + // something is wrong with scales, don't draw + if (!xAndWidth) { + return; + } + const y = yScale.pureScale(y1); + const height = Math.abs(yScale.pureScale(y0) - y); + + const rectDimensions = { + ...xAndWidth, + y, + height, + }; + + rectsProps.push({ + rect: rectDimensions, + details: dataValue.details, + }); + }); + return rectsProps; +} + +function scaleXonBandScale( + xScale: ScaleBand, + x0: PrimitiveValue, + x1: PrimitiveValue, +): { x: number; width: number } | null { + // the band scale return the start of the band, we need to cover + // also the inner padding of the bar + const padding = (xScale.step - xScale.originalBandwidth) / 2; + + // extend the x1 scaled value to fully cover the last bar + let x1Scaled: number = xScale.scale(x1) + xScale.originalBandwidth + padding; + // give the x1 value a maximum of the chart range + if (x1Scaled > xScale.range[1]) { + x1Scaled = xScale.range[1]; + } + + let x0Scaled = xScale.scale(x0) - padding; + if (x0Scaled < xScale.range[0]) { + x0Scaled = xScale.range[0]; + } + const width = Math.abs(x1Scaled - x0Scaled); + return { + x: x0Scaled, + width, + }; +} + +function scaleXonContinuousScale( + xScale: ScaleContinuous, + x0: PrimitiveValue, + x1: PrimitiveValue, + isHistogramModeEnabled: boolean = false, +): { x: number; width: number } | null { + let x1Scaled: number; + if (typeof x1 !== 'number' || typeof x0 !== 'number') { + return null; + } + if (xScale.totalBarsInCluster > 0 && !isHistogramModeEnabled) { + x1Scaled = xScale.scale(x1 + xScale.minInterval); + } else { + x1Scaled = xScale.scale(x1); + } + const x0Scaled = xScale.scale(x0); + // the width needs to be computed before adjusting the x anchor + const width = Math.abs(x1Scaled - x0Scaled); + return { + x: x0Scaled - (xScale.bandwidthPadding / 2) * xScale.totalBarsInCluster, + width, + }; +} + +/** + * This function extend and limits the values in a scale domain + * @param scale the scale + * @param minValue a min value + * @param maxValue a max value + */ +function limitValueToDomainRange( + scale: Scale, + minValue?: PrimitiveValue, + maxValue?: PrimitiveValue, + isHistogram: boolean = false, +): [PrimitiveValue, PrimitiveValue] { + const domainStartValue = scale.domain[0]; + // this fix the case where rendering on categorical scale and we have only one element + const domainEndValue = scale.domain.length > 0 ? scale.domain[scale.domain.length - 1] : scale.domain[0]; + + // extend to edge values if values are null/undefined + let min = minValue == null ? domainStartValue : minValue; + let max = maxValue == null ? domainEndValue : maxValue; + + if (isContinuousScale(scale)) { + if (minValue == null) { + // we expand null/undefined values to the edge + min = domainStartValue; + } else if (typeof minValue !== 'number') { + // we need to restrict to number only for continuous scales + min = null; + } else if (minValue < domainStartValue) { + // we limit values to the edge + min = domainStartValue; + } else { + min = minValue; + } + + if (maxValue == null) { + // we expand null/undefined values to the edge + max = isHistogram ? domainEndValue + scale.minInterval : domainEndValue; + } else if (typeof maxValue !== 'number') { + // we need to restrict to number only for continuous scales + max = null; + } else if (maxValue > domainEndValue) { + // we limit values to the edge + max = domainEndValue; + } else { + max = maxValue; + } + } + return [min, max]; +} diff --git a/src/chart_types/xy_chart/annotations/rect/tooltip.ts b/src/chart_types/xy_chart/annotations/rect/tooltip.ts new file mode 100644 index 0000000000..e411786e84 --- /dev/null +++ b/src/chart_types/xy_chart/annotations/rect/tooltip.ts @@ -0,0 +1,64 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ + +import { AnnotationTypes } from '../../utils/specs'; +import { Rotation } from '../../../../utils/commons'; +import { Dimensions } from '../../../../utils/dimensions'; +import { Point } from '../../../../utils/point'; +import { getRotatedCursor } from '../utils'; +import { AnnotationTooltipFormatter, AnnotationTooltipState, Bounds } from '../types'; +import { AnnotationRectProps } from './types'; +import { isWithinRectBounds } from './dimensions'; + +/** @internal */ +export function computeRectAnnotationTooltipState( + /** the cursor position relative to the projection area */ + cursorPosition: Point, + annotationRects: AnnotationRectProps[], + chartRotation: Rotation, + chartDimensions: Dimensions, + renderTooltip?: AnnotationTooltipFormatter, +): AnnotationTooltipState { + const rotatedCursorPosition = getRotatedCursor(cursorPosition, chartDimensions, chartRotation); + const totalAnnotationRect = annotationRects.length; + for (let i = 0; i < totalAnnotationRect; i++) { + const rectProps = annotationRects[i]; + const { rect, details } = rectProps; + const startX = rect.x; + const endX = startX + rect.width; + const startY = rect.y; + const endY = startY + rect.height; + const bounds: Bounds = { startX, endX, startY, endY }; + const isWithinBounds = isWithinRectBounds(rotatedCursorPosition, bounds); + if (isWithinBounds) { + return { + isVisible: true, + annotationType: AnnotationTypes.Rectangle, + anchor: { + left: rotatedCursorPosition.x, + top: rotatedCursorPosition.y, + }, + ...(details && { details }), + ...(renderTooltip && { renderTooltip }), + }; + } + } + return { + isVisible: false, + }; +} diff --git a/src/chart_types/xy_chart/annotations/rect/types.ts b/src/chart_types/xy_chart/annotations/rect/types.ts new file mode 100644 index 0000000000..24e4d7c263 --- /dev/null +++ b/src/chart_types/xy_chart/annotations/rect/types.ts @@ -0,0 +1,28 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ + +/** @internal */ +export interface AnnotationRectProps { + rect: { + x: number; + y: number; + width: number; + height: number; + }; + details?: string; +} diff --git a/src/chart_types/xy_chart/annotations/rect_annotation_tooltip.ts b/src/chart_types/xy_chart/annotations/rect_annotation_tooltip.ts deleted file mode 100644 index dbbf667f62..0000000000 --- a/src/chart_types/xy_chart/annotations/rect_annotation_tooltip.ts +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. */ - -import { AnnotationTypes, RectAnnotationDatum, RectAnnotationSpec } from '../utils/specs'; -import { Rotation } from '../../../utils/commons'; -import { Dimensions } from '../../../utils/dimensions'; -import { GroupId } from '../../../utils/ids'; -import { Scale, ScaleType } from '../../../scales'; -import { Point } from '../../../utils/point'; -import { - AnnotationTooltipFormatter, - AnnotationTooltipState, - getRotatedCursor, - scaleAndValidateDatum, - Bounds, -} from './annotation_utils'; - -/** @internal */ -export interface AnnotationRectProps { - rect: { - x: number; - y: number; - width: number; - height: number; - }; - details?: string; -} - -/** @internal */ -export function computeRectAnnotationTooltipState( - /** the cursor position relative to the projection area */ - cursorPosition: Point, - annotationRects: AnnotationRectProps[], - chartRotation: Rotation, - chartDimensions: Dimensions, - renderTooltip?: AnnotationTooltipFormatter, -): AnnotationTooltipState { - const rotatedCursorPosition = getRotatedCursor(cursorPosition, chartDimensions, chartRotation); - - const totalAnnotationRect = annotationRects.length; - for (let i = 0; i < totalAnnotationRect; i++) { - const rectProps = annotationRects[i]; - const { rect, details } = rectProps; - const startX = rect.x; - const endX = startX + rect.width; - - const startY = rect.y; - const endY = startY + rect.height; - - const bounds: Bounds = { startX, endX, startY, endY }; - - const isWithinBounds = isWithinRectBounds(rotatedCursorPosition, bounds); - if (isWithinBounds) { - return { - isVisible: true, - annotationType: AnnotationTypes.Rectangle, - anchor: { - left: rotatedCursorPosition.x, - top: rotatedCursorPosition.y, - }, - ...(details && { details }), - ...(renderTooltip && { renderTooltip }), - }; - } - } - return { - isVisible: false, - }; -} - -/** @internal */ -export function isWithinRectBounds({ x, y }: Point, { startX, endX, startY, endY }: Bounds): boolean { - const withinXBounds = x >= startX && x <= endX; - const withinYBounds = y >= startY && y <= endY; - - return withinXBounds && withinYBounds; -} - -/** @internal */ -export function computeRectAnnotationDimensions( - annotationSpec: RectAnnotationSpec, - yScales: Map, - xScale: Scale, - enableHistogramMode: boolean, - barsPadding: number, - totalBarsInCluster: number, -): AnnotationRectProps[] | null { - const { dataValues } = annotationSpec; - const groupId = annotationSpec.groupId; - const yScale = yScales.get(groupId); - if (!yScale) { - return null; - } - const hasBars = totalBarsInCluster > 0; - - const xDomain = xScale.domain; - const yDomain = yScale.domain; - const lastX = xDomain[xDomain.length - 1]; - const xMinInterval = xScale.minInterval; - const rectsProps: AnnotationRectProps[] = []; - - dataValues.forEach((dataValue: RectAnnotationDatum) => { - let { x0, x1, y0, y1 } = dataValue.coordinates; - // if everything is null, return; otherwise we coerce the other coordinates - if (x0 == null && x1 == null && y0 == null && y1 == null) { - return; - } - x1 = x1 == null ? lastX : x1; - if (hasBars && xScale.type !== ScaleType.Ordinal) { - // if bar chart cover fully the last bar - x1 = x1 + xMinInterval; - } - - if (x0 == null) { - // if x0 is defined, we want the rect to draw to the start of the scale - x0 = xDomain[0]; - } - - if (y0 == null) { - // if y0 is not defined, start from the beginning of the yScale - y0 = yDomain[0]; - } - - if (y1 == null) { - // if y1 is not defined, end the annotation at the end of the yScale - y1 = yDomain[yDomain.length - 1]; - } - const barSpaces = totalBarsInCluster > 0 ? totalBarsInCluster : xScale.type === ScaleType.Ordinal ? 1 : 0; - let x0Scaled = scaleAndValidateDatum(x0, xScale, barSpaces); - let x1Scaled = scaleAndValidateDatum(x1, xScale, barSpaces, true); - // we don't consider bars in y scale - const y0Scaled = scaleAndValidateDatum(y0, yScale, 0); - const y1Scaled = scaleAndValidateDatum(y1, yScale, 0, true); - // TODO: surface this as a warning - if (x0Scaled === null || x1Scaled === null || y0Scaled === null || y1Scaled === null) { - return; - } - - let xOffset = 0; - if (xScale.bandwidth > 0) { - const xBand = xScale.bandwidth / (1 - xScale.barsPadding); - xOffset = enableHistogramMode ? (xBand - xScale.bandwidth) / 2 : barsPadding; - } - - x0Scaled = x0Scaled - xOffset; - x1Scaled = x1Scaled - xOffset; - - const minX = Math.min(x0Scaled, x1Scaled); - const minY = Math.min(y0Scaled, y1Scaled); - - const deltaX = Math.abs(x0Scaled - x1Scaled); - const deltaY = Math.abs(y0Scaled - y1Scaled); - - const xOrigin = minX; - const yOrigin = minY; - - const width = deltaX; - const height = deltaY; - - const rectDimensions = { - x: xOrigin, - y: yOrigin, - width, - height, - }; - - rectsProps.push({ - rect: rectDimensions, - details: dataValue.details, - }); - }); - return rectsProps; -} diff --git a/src/chart_types/xy_chart/annotations/tooltip.ts b/src/chart_types/xy_chart/annotations/tooltip.ts new file mode 100644 index 0000000000..1f669856cf --- /dev/null +++ b/src/chart_types/xy_chart/annotations/tooltip.ts @@ -0,0 +1,117 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ + +import { AnnotationId } from '../../../utils/ids'; +import { AnnotationSpec, AxisSpec, isLineAnnotation, isRectAnnotation } from '../utils/specs'; +import { Rotation } from '../../../utils/commons'; +import { AnnotationDimensions, AnnotationTooltipState } from './types'; +import { Dimensions } from '../../../utils/dimensions'; +import { computeLineAnnotationTooltipState } from './line/tooltip'; +import { computeRectAnnotationTooltipState } from './rect/tooltip'; +import { AnnotationRectProps } from './rect/types'; +import { Point } from '../../../utils/point'; +import { AnnotationLineProps } from './line/types'; + +/** @internal */ +export function computeAnnotationTooltipState( + cursorPosition: Point, + annotationDimensions: Map, + annotationSpecs: AnnotationSpec[], + chartRotation: Rotation, + axesSpecs: AxisSpec[], + chartDimensions: Dimensions, +): AnnotationTooltipState | null { + // allow picking up the last spec added as the top most or use it's zIndex value + const zIndexSortedSpecs = annotationSpecs + .slice() + .reverse() + .sort(({ zIndex: a = Number.MIN_SAFE_INTEGER }, { zIndex: b = Number.MIN_SAFE_INTEGER }) => b - a); + for (const spec of zIndexSortedSpecs) { + const annotationDimension = annotationDimensions.get(spec.id); + if (spec.hideTooltips || !annotationDimension) { + continue; + } + const groupId = spec.groupId; + + if (isLineAnnotation(spec)) { + if (spec.hideLines) { + continue; + } + const lineAnnotationTooltipState = computeLineAnnotationTooltipState( + cursorPosition, + annotationDimension as AnnotationLineProps[], + groupId, + spec.domainType, + axesSpecs, + ); + + if (lineAnnotationTooltipState.isVisible) { + return lineAnnotationTooltipState; + } + } else if (isRectAnnotation(spec)) { + const rectAnnotationTooltipState = computeRectAnnotationTooltipState( + cursorPosition, + annotationDimension as AnnotationRectProps[], + chartRotation, + chartDimensions, + spec.renderTooltip, + ); + + if (rectAnnotationTooltipState.isVisible) { + return rectAnnotationTooltipState; + } + } + } + + return null; +} + +/** @internal */ +export function getFinalAnnotationTooltipPosition( + /** the dimensions of the chart parent container */ + container: Dimensions, + chartDimensions: Dimensions, + /** the dimensions of the tooltip container */ + tooltip: Dimensions, + /** the tooltip computed position not adjusted within chart bounds */ + tooltipAnchor: { top: number; left: number }, + padding = 10, +): { + left: string | null; + top: string | null; +} { + let left = 0; + + const annotationXOffset = window.pageXOffset + container.left + chartDimensions.left + tooltipAnchor.left; + if (chartDimensions.left + tooltipAnchor.left + tooltip.width + padding >= container.width) { + left = annotationXOffset - tooltip.width - padding; + } else { + left = annotationXOffset + padding; + } + let top = window.pageYOffset + container.top + chartDimensions.top + tooltipAnchor.top; + if (chartDimensions.top + tooltipAnchor.top + tooltip.height + padding >= container.height) { + top -= tooltip.height + padding; + } else { + top += padding; + } + + return { + left: `${Math.round(left)}px`, + top: `${Math.round(top)}px`, + }; +} diff --git a/src/chart_types/xy_chart/annotations/types.ts b/src/chart_types/xy_chart/annotations/types.ts new file mode 100644 index 0000000000..1039bd3c59 --- /dev/null +++ b/src/chart_types/xy_chart/annotations/types.ts @@ -0,0 +1,83 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ + +import { AnnotationType } from '../utils/specs'; +import { AnnotationLineProps } from './line/types'; +import { AnnotationRectProps } from './rect/types'; +import { Position, Color } from '../../../utils/commons'; + +export type AnnotationTooltipFormatter = (details?: string) => JSX.Element | null; + +/** + * The header and description strings for an Annotation + * @internal + */ +export interface AnnotationDetails { + headerText?: string; + detailsText?: string; +} + +/** + * The marker for an Annotation. Usually a JSX element + * @internal + */ +export interface AnnotationMarker { + icon: JSX.Element; + position: { + top: number; + left: number; + }; + dimension: { + width: number; + height: number; + }; + color: Color; +} + +/** @internal */ +export type AnnotationTooltipState = AnnotationTooltipVisibleState | AnnotationTooltipHiddenState; + +/** @internal */ +export interface AnnotationTooltipVisibleState { + isVisible: true; + annotationType: AnnotationType; + header?: string; + details?: string; + anchor: { + position?: Position; + top: number; + left: number; + }; + renderTooltip?: AnnotationTooltipFormatter; +} + +/** @internal */ +export interface AnnotationTooltipHiddenState { + isVisible: false; +} + +/** @internal */ +export type AnnotationDimensions = AnnotationLineProps[] | AnnotationRectProps[]; + +/** @internal */ +export type Bounds = { + startX: number; + endX: number; + startY: number; + endY: number; +}; diff --git a/src/chart_types/xy_chart/annotations/annotation_utils.test.ts b/src/chart_types/xy_chart/annotations/utils.test.ts similarity index 78% rename from src/chart_types/xy_chart/annotations/annotation_utils.test.ts rename to src/chart_types/xy_chart/annotations/utils.test.ts index dda358f9c9..55b1eb660b 100644 --- a/src/chart_types/xy_chart/annotations/annotation_utils.test.ts +++ b/src/chart_types/xy_chart/annotations/utils.test.ts @@ -30,33 +30,20 @@ import { DEFAULT_ANNOTATION_LINE_STYLE } from '../../../utils/themes/theme'; import { Dimensions } from '../../../utils/dimensions'; import { GroupId, AnnotationId } from '../../../utils/ids'; import { Scale, ScaleType, ScaleBand, ScaleContinuous } from '../../../scales'; -import { - computeAnnotationDimensions, - computeAnnotationTooltipState, - computeClusterOffset, - getAnnotationAxis, - getRotatedCursor, - scaleAndValidateDatum, - AnnotationDimensions, - AnnotationTooltipState, - Bounds, -} from './annotation_utils'; -import { - AnnotationLineProps, - computeLineAnnotationDimensions, - computeLineAnnotationTooltipState, - isVerticalAnnotationLine, - getAnnotationLineTooltipXOffset, - getAnnotationLineTooltipYOffset, -} from './line_annotation_tooltip'; -import { - computeRectAnnotationDimensions, - isWithinRectBounds, - computeRectAnnotationTooltipState, -} from './rect_annotation_tooltip'; +import { computeAnnotationDimensions, computeClusterOffset, getAnnotationAxis, getRotatedCursor } from './utils'; +import { AnnotationDimensions, AnnotationTooltipState, Bounds } from './types'; +import { computeLineAnnotationDimensions } from './line/dimensions'; +import { AnnotationLineProps } from './line/types'; +import { computeRectAnnotationDimensions, isWithinRectBounds } from './rect/dimensions'; +import { computeRectAnnotationTooltipState } from './rect/tooltip'; import { Point } from '../../../utils/point'; import { ChartTypes } from '../..'; import { SpecTypes } from '../../../specs/settings'; +import { computeLineAnnotationTooltipState } from './line/tooltip'; +import { computeAnnotationTooltipState } from './tooltip'; +import { MockStore } from '../../../mocks/store'; +import { MockGlobalSpec, MockSeriesSpec, MockAnnotationSpec } from '../../../mocks/specs'; +import { computeAnnotationDimensionsSelector } from '../state/selectors/compute_annotations'; describe('annotation utils', () => { const minRange = 0; @@ -117,65 +104,52 @@ describe('annotation utils', () => { axesSpecs.push(verticalAxisSpec); test('should compute rect annotation in x ordinal scale', () => { - const chartRotation: Rotation = 0; - const yScales: Map = new Map(); - yScales.set(groupId, continuousScale); - - const xScale: Scale = ordinalScale; + const store = MockStore.default(); + const settings = MockGlobalSpec.settingsNoMargins(); + const spec = MockSeriesSpec.bar({ + xScaleType: ScaleType.Ordinal, + groupId, + data: [ + { x: 'a', y: 1 }, + { x: 'b', y: 0 }, + { x: 'c', y: 10 }, + { x: 'd', y: 5 }, + ], + }); - const annotations: AnnotationSpec[] = []; - const annotationId = 'foo'; - const lineAnnotation: LineAnnotationSpec = { - chartType: ChartTypes.XYAxis, - specType: SpecTypes.Annotation, - annotationType: AnnotationTypes.Line, - id: annotationId, + const lineAnnotation = MockAnnotationSpec.line({ + id: 'foo', + groupId, domainType: AnnotationDomainTypes.YDomain, dataValues: [{ dataValue: 2, details: 'foo' }], - groupId, - style: DEFAULT_ANNOTATION_LINE_STYLE, - }; + }); - const rectAnnotationId = 'rect'; - const rectAnnotation: AnnotationSpec = { - chartType: ChartTypes.XYAxis, - specType: SpecTypes.Annotation, - id: rectAnnotationId, + const rectAnnotation = MockAnnotationSpec.rect({ + id: 'rect', groupId, - annotationType: AnnotationTypes.Rectangle, dataValues: [{ coordinates: { x0: 'a', x1: 'b', y0: 3, y1: 5 } }], - }; + }); - annotations.push(lineAnnotation); - annotations.push(rectAnnotation); + MockStore.addSpecs([settings, spec, lineAnnotation, rectAnnotation], store); + const dimensions = computeAnnotationDimensionsSelector(store.getState()); - const dimensions = computeAnnotationDimensions( - annotations, - chartDimensions, - chartRotation, - yScales, - xScale, - axesSpecs, - 1, - false, - ); const expectedDimensions = new Map(); - expectedDimensions.set(annotationId, [ + expectedDimensions.set('foo', [ { anchor: { - top: 20, + top: 80, left: 0, position: Position.Left, }, linePathPoints: { - start: { x1: 0, y1: 20 }, - end: { x2: 10, y2: 20 }, + start: { x1: 0, y1: 80 }, + end: { x2: 100, y2: 80 }, }, marker: undefined, details: { detailsText: 'foo', headerText: '2' }, }, ]); - expectedDimensions.set(rectAnnotationId, [{ rect: { x: 0, y: 30, width: 50, height: 20 } }]); + expectedDimensions.set('rect', [{ details: undefined, rect: { x: 0, y: 50, width: 50, height: 20 } }]); expect(dimensions).toEqual(expectedDimensions); }); @@ -209,7 +183,6 @@ describe('annotation utils', () => { yScales, xScale, [], // empty axesSpecs - 1, false, ); expect(dimensions.size).toEqual(1); @@ -241,7 +214,7 @@ describe('annotation utils', () => { yScales, xScale, Position.Left, - 0, + false, ); const expectedDimensions: AnnotationLineProps[] = [ { @@ -286,7 +259,7 @@ describe('annotation utils', () => { yScales, xScale, Position.Right, - 0, + false, ); const expectedDimensions: AnnotationLineProps[] = [ { @@ -331,7 +304,7 @@ describe('annotation utils', () => { yScales, xScale, Position.Left, - 0, + false, ); const expectedDimensions: AnnotationLineProps[] = [ { @@ -375,7 +348,7 @@ describe('annotation utils', () => { yScales, xScale, Position.Left, - 0, + false, ); expect(dimensions).toEqual(null); }); @@ -404,7 +377,7 @@ describe('annotation utils', () => { yScales, xScale, Position.Left, - 0, + false, ); const expectedDimensions: AnnotationLineProps[] = [ { @@ -447,7 +420,7 @@ describe('annotation utils', () => { yScales, xScale, Position.Top, - 0, + false, ); const expectedDimensions: AnnotationLineProps[] = [ { @@ -491,7 +464,7 @@ describe('annotation utils', () => { yScales, xScale, Position.Bottom, - 0, + false, ); const expectedDimensions: AnnotationLineProps[] = [ { @@ -511,51 +484,6 @@ describe('annotation utils', () => { expect(dimensions).toEqual(expectedDimensions); }); - test('should compute line annotation dimensions for xDomain in histogramMode with extended upper bound', () => { - const chartRotation: Rotation = 0; - const yScales: Map = new Map(); - const xScale: Scale = continuousScale; - - const annotationId = 'foo-line'; - const lineAnnotation: LineAnnotationSpec = { - chartType: ChartTypes.XYAxis, - specType: SpecTypes.Annotation, - annotationType: AnnotationTypes.Line, - id: annotationId, - domainType: AnnotationDomainTypes.XDomain, - dataValues: [{ dataValue: 10.5, details: 'foo' }], - groupId, - style: DEFAULT_ANNOTATION_LINE_STYLE, - }; - - const dimensions = computeLineAnnotationDimensions( - lineAnnotation, - chartDimensions, - chartRotation, - yScales, - xScale, - Position.Bottom, - 0, - 1, - ); - const expectedDimensions: AnnotationLineProps[] = [ - { - anchor: { - top: 20, - left: 110, - position: Position.Bottom, - }, - linePathPoints: { - start: { x1: 110, y1: 20 }, - end: { x2: 110, y2: 0 }, - }, - details: { detailsText: 'foo', headerText: '10.5' }, - marker: undefined, - }, - ]; - expect(dimensions).toEqual(expectedDimensions); - }); - test('should compute line annotation dimensions for xDomain on a xScale (chartRotation 90, ordinal scale)', () => { const chartRotation: Rotation = 90; const yScales: Map = new Map(); @@ -581,7 +509,7 @@ describe('annotation utils', () => { yScales, xScale, Position.Left, - 0, + false, ); const expectedDimensions: AnnotationLineProps[] = [ { @@ -626,7 +554,7 @@ describe('annotation utils', () => { yScales, xScale, Position.Left, - 0, + false, ); const expectedDimensions: AnnotationLineProps[] = [ { @@ -671,7 +599,7 @@ describe('annotation utils', () => { yScales, xScale, Position.Left, - 0, + false, ); const expectedDimensions: AnnotationLineProps[] = [ { @@ -716,7 +644,7 @@ describe('annotation utils', () => { yScales, xScale, Position.Top, - 0, + false, ); const expectedDimensions: AnnotationLineProps[] = [ { @@ -760,7 +688,7 @@ describe('annotation utils', () => { yScales, xScale, Position.Bottom, - 0, + false, ); const expectedDimensions: AnnotationLineProps[] = [ { @@ -806,7 +734,7 @@ describe('annotation utils', () => { yScales, xScale, Position.Right, - 0, + false, ); expect(emptyXDimensions).toEqual([]); @@ -829,7 +757,7 @@ describe('annotation utils', () => { yScales, continuousScale, Position.Right, - 0, + false, ); expect(invalidStringXDimensions).toEqual([]); @@ -845,16 +773,16 @@ describe('annotation utils', () => { style: DEFAULT_ANNOTATION_LINE_STYLE, }; - const cappedToMinX = computeLineAnnotationDimensions( + const emptyOutOfBoundsXDimensions = computeLineAnnotationDimensions( outOfBoundsXLineAnnotation, chartDimensions, chartRotation, yScales, continuousScale, Position.Right, - 0, + false, ); - expect(cappedToMinX).toHaveLength(1); + expect(emptyOutOfBoundsXDimensions).toHaveLength(0); const invalidYLineAnnotation: AnnotationSpec = { chartType: ChartTypes.XYAxis, @@ -867,17 +795,17 @@ describe('annotation utils', () => { style: DEFAULT_ANNOTATION_LINE_STYLE, }; - const emptyYDimensions = computeLineAnnotationDimensions( + const emptyOutOfBoundsYDimensions = computeLineAnnotationDimensions( invalidYLineAnnotation, chartDimensions, chartRotation, yScales, xScale, Position.Right, - 0, + false, ); - expect(emptyYDimensions).toEqual([]); + expect(emptyOutOfBoundsYDimensions).toHaveLength(0); const outOfBoundsYLineAnnotation: AnnotationSpec = { chartType: ChartTypes.XYAxis, @@ -890,17 +818,17 @@ describe('annotation utils', () => { style: DEFAULT_ANNOTATION_LINE_STYLE, }; - const cappedToMinY = computeLineAnnotationDimensions( + const outOfBoundsYAnn = computeLineAnnotationDimensions( outOfBoundsYLineAnnotation, chartDimensions, chartRotation, yScales, xScale, Position.Right, - 0, + false, ); - expect(cappedToMinY).toHaveLength(1); + expect(outOfBoundsYAnn).toHaveLength(0); const invalidStringYLineAnnotation: AnnotationSpec = { chartType: ChartTypes.XYAxis, @@ -920,7 +848,7 @@ describe('annotation utils', () => { yScales, continuousScale, Position.Right, - 0, + false, ); expect(invalidStringYDimensions).toEqual([]); @@ -944,78 +872,12 @@ describe('annotation utils', () => { yScales, continuousScale, Position.Right, - 0, + false, ); expect(hiddenAnnotationDimensions).toEqual(null); }); - test('should determine if an annotation line is vertical dependent on domain type & chart rotation', () => { - const isHorizontal = true; - const isXDomain = true; - const xDomainHorizontalRotation = isVerticalAnnotationLine(isXDomain, isHorizontal); - expect(xDomainHorizontalRotation).toBe(true); - - const xDomainVerticalRotation = isVerticalAnnotationLine(isXDomain, !isHorizontal); - expect(xDomainVerticalRotation).toBe(false); - - const yDomainHorizontalRotation = isVerticalAnnotationLine(!isXDomain, isHorizontal); - expect(yDomainHorizontalRotation).toBe(false); - - const yDomainVerticalRotation = isVerticalAnnotationLine(isXDomain, !isHorizontal); - expect(yDomainVerticalRotation).toBe(false); - }); - test('should get the x offset for an annotation line tooltip', () => { - const bottomHorizontalRotationOffset = getAnnotationLineTooltipXOffset(0, Position.Bottom); - expect(bottomHorizontalRotationOffset).toBe(50); - - const topHorizontalRotationOffset = getAnnotationLineTooltipXOffset(0, Position.Top); - expect(topHorizontalRotationOffset).toBe(50); - - const bottomVerticalRotationOffset = getAnnotationLineTooltipXOffset(90, Position.Bottom); - expect(bottomVerticalRotationOffset).toBe(0); - - const topVerticalRotationOffset = getAnnotationLineTooltipXOffset(90, Position.Top); - expect(topVerticalRotationOffset).toBe(0); - - const leftHorizontalRotationOffset = getAnnotationLineTooltipXOffset(0, Position.Left); - expect(leftHorizontalRotationOffset).toBe(0); - - const rightHorizontalRotationOffset = getAnnotationLineTooltipXOffset(0, Position.Right); - expect(rightHorizontalRotationOffset).toBe(100); - - const leftVerticalRotationOffset = getAnnotationLineTooltipXOffset(90, Position.Left); - expect(leftVerticalRotationOffset).toBe(50); - - const rightVerticalRotationOffset = getAnnotationLineTooltipXOffset(90, Position.Right); - expect(rightVerticalRotationOffset).toBe(50); - }); - test('should get the y offset for an annotation line tooltip', () => { - const bottomHorizontalRotationOffset = getAnnotationLineTooltipYOffset(0, Position.Bottom); - expect(bottomHorizontalRotationOffset).toBe(100); - - const topHorizontalRotationOffset = getAnnotationLineTooltipYOffset(0, Position.Top); - expect(topHorizontalRotationOffset).toBe(0); - - const bottomVerticalRotationOffset = getAnnotationLineTooltipYOffset(90, Position.Bottom); - expect(bottomVerticalRotationOffset).toBe(50); - - const topVerticalRotationOffset = getAnnotationLineTooltipYOffset(90, Position.Top); - expect(topVerticalRotationOffset).toBe(50); - - const leftHorizontalRotationOffset = getAnnotationLineTooltipYOffset(0, Position.Left); - expect(leftHorizontalRotationOffset).toBe(50); - - const rightHorizontalRotationOffset = getAnnotationLineTooltipYOffset(0, Position.Right); - expect(rightHorizontalRotationOffset).toBe(50); - - const leftVerticalRotationOffset = getAnnotationLineTooltipYOffset(90, Position.Left); - expect(leftVerticalRotationOffset).toBe(100); - - const rightVerticalRotationOffset = getAnnotationLineTooltipYOffset(90, Position.Right); - expect(rightVerticalRotationOffset).toBe(100); - }); - test('should compute the tooltip state for an annotation line', () => { const cursorPosition: Point = { x: 1, y: 2 }; const annotationLines: AnnotationLineProps[] = [ @@ -1359,7 +1221,7 @@ describe('annotation utils', () => { dataValues: [{ coordinates: { x0: 1, x1: 2, y0: 3, y1: 5 } }], }; - const noYScale = computeRectAnnotationDimensions(annotationRectangle, yScales, xScale, false, 0, 1); + const noYScale = computeRectAnnotationDimensions(annotationRectangle, yScales, xScale); expect(noYScale).toBe(null); }); @@ -1381,13 +1243,23 @@ describe('annotation utils', () => { ], }; - const skippedInvalid = computeRectAnnotationDimensions(annotationRectangle, yScales, xScale, false, 0, 1); + const skippedInvalid = computeRectAnnotationDimensions(annotationRectangle, yScales, xScale); expect(skippedInvalid).toHaveLength(1); }); test('should compute rectangle dimensions shifted for histogram mode', () => { const yScales: Map = new Map(); - yScales.set(groupId, continuousScale); + yScales.set( + groupId, + new ScaleContinuous( + { + type: ScaleType.Linear, + domain: continuousData, + range: [minRange, maxRange], + }, + { bandwidth: 0, minInterval: 1 }, + ), + ); const xScale: Scale = new ScaleContinuous( { type: ScaleType.Linear, domain: continuousData, range: [minRange, maxRange] }, @@ -1408,118 +1280,30 @@ describe('annotation utils', () => { ], }; - const dimensions = computeRectAnnotationDimensions(annotationRectangle, yScales, xScale, true, 0, 1); + const dimensions = computeRectAnnotationDimensions(annotationRectangle, yScales, xScale); const [dims1, dims2, dims3, dims4] = dimensions; expect(dims1.rect.x).toBe(10); - expect(dims1.rect.y).toBe(0); - expect(dims1.rect.width).toBeCloseTo(100); + expect(dims1.rect.y).toBe(100); expect(dims1.rect.height).toBe(100); + expect(dims1.rect.width).toBeCloseTo(100); expect(dims2.rect.x).toBe(0); - expect(dims2.rect.y).toBe(0); + expect(dims2.rect.y).toBe(100); expect(dims2.rect.width).toBe(20); expect(dims2.rect.height).toBe(100); expect(dims3.rect.x).toBe(0); - expect(dims3.rect.y).toBe(10); + expect(dims3.rect.y).toBe(100); expect(dims3.rect.width).toBeCloseTo(110); expect(dims3.rect.height).toBe(90); expect(dims4.rect.x).toBe(0); - expect(dims4.rect.y).toBe(0); + expect(dims4.rect.y).toBe(10); expect(dims4.rect.width).toBeCloseTo(110); expect(dims4.rect.height).toBe(10); }); - test('should compute rectangle dimensions when only a single coordinate defined', () => { - const yScales: Map = new Map(); - yScales.set(groupId, continuousScale); - - const xScale: Scale = continuousScale; - - const annotationRectangle: RectAnnotationSpec = { - chartType: ChartTypes.XYAxis, - specType: SpecTypes.Annotation, - id: 'rect', - groupId, - annotationType: AnnotationTypes.Rectangle, - dataValues: [ - { coordinates: { x0: 1, x1: null, y0: null, y1: null } }, - { coordinates: { x0: null, x1: 1, y0: null, y1: null } }, - { coordinates: { x0: null, x1: null, y0: 1, y1: null } }, - { coordinates: { x0: null, x1: null, y0: null, y1: 1 } }, - ], - }; - - const dimensions = computeRectAnnotationDimensions(annotationRectangle, yScales, xScale, false, 0, 0); - - const expectedDimensions = [ - { rect: { x: 10, y: 0, width: 90, height: 100 }, details: undefined }, - { rect: { x: 0, y: 0, width: 10, height: 100 }, details: undefined }, - { rect: { x: 0, y: 10, width: 100, height: 90 }, details: undefined }, - { rect: { x: 0, y: 0, width: 100, height: 10 }, details: undefined }, - ]; - - expect(dimensions).toEqual(expectedDimensions); - }); - test('should compute rectangle annotation dimensions continuous (0 deg rotation)', () => { - const yScales: Map = new Map(); - yScales.set(groupId, continuousScale); - - const xScale: Scale = continuousScale; - - const annotationRectangle: RectAnnotationSpec = { - chartType: ChartTypes.XYAxis, - specType: SpecTypes.Annotation, - id: 'rect', - groupId, - annotationType: AnnotationTypes.Rectangle, - dataValues: [{ coordinates: { x0: 1, x1: 2, y0: 3, y1: 5 } }], - }; - - const unrotated = computeRectAnnotationDimensions(annotationRectangle, yScales, xScale, false, 0, 0); - - expect(unrotated).toEqual([{ rect: { x: 10, y: 30, width: 10, height: 20 } }]); - }); - test('should compute rectangle annotation dimensions ordinal (0 deg rotation)', () => { - const yScales: Map = new Map(); - yScales.set(groupId, continuousScale); - - const xScale: Scale = ordinalScale; - // will render a rectangle that inclused both a and b - const annotationRectangle: RectAnnotationSpec = { - chartType: ChartTypes.XYAxis, - specType: SpecTypes.Annotation, - id: 'rect', - groupId, - annotationType: AnnotationTypes.Rectangle, - dataValues: [{ coordinates: { x0: 'a', x1: 'b', y0: 0, y1: 2 } }], - }; - - const unrotated = computeRectAnnotationDimensions(annotationRectangle, yScales, xScale, false, 0, 1); - - expect(unrotated).toEqual([{ rect: { x: 0, y: 0, width: 50, height: 20 } }]); - }); - test('should validate scaled dataValues', () => { - // not aligned with tick - expect(scaleAndValidateDatum('', ordinalScale, 0)).toBe(null); - expect(scaleAndValidateDatum('a', continuousScale, 0)).toBe(null); - - // valid value limited to min/max - expect(scaleAndValidateDatum(-10, continuousScale, 0)).toBe(0); - expect(scaleAndValidateDatum(20, continuousScale, 0)).toBe(100); - - // allow values within domainEnd + minInterval when not alignWithTick - expect(scaleAndValidateDatum(10.25, continuousScale, 1)).toBeCloseTo(102.5); - expect(scaleAndValidateDatum(10.25, continuousScale, 0)).toBe(100); - - expect(scaleAndValidateDatum('a', ordinalScale, 0)).toBe(0); - expect(scaleAndValidateDatum(0, continuousScale, 0)).toBe(0); - - // aligned with tick - expect(scaleAndValidateDatum(1.25, continuousScale, 0)).toBe(12.5); - }); test('should determine if a point is within a rectangle annotation', () => { const cursorPosition = { x: 3, y: 4 }; @@ -1573,12 +1357,6 @@ describe('annotation utils', () => { expect(visibleTooltip).toEqual(expectedVisibleTooltipState); }); - test('should determine if line is vertical annotation', () => { - expect(isVerticalAnnotationLine(true, true)).toBe(true); - expect(isVerticalAnnotationLine(true, false)).toBe(false); - expect(isVerticalAnnotationLine(false, true)).toBe(false); - expect(isVerticalAnnotationLine(false, false)).toBe(true); - }); test('should get rotated cursor position', () => { const cursorPosition = { x: 1, y: 2 }; diff --git a/src/chart_types/xy_chart/annotations/utils.ts b/src/chart_types/xy_chart/annotations/utils.ts new file mode 100644 index 0000000000..4de9cd8ed0 --- /dev/null +++ b/src/chart_types/xy_chart/annotations/utils.ts @@ -0,0 +1,128 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ + +import { + AnnotationDomainType, + AnnotationDomainTypes, + AnnotationSpec, + AxisSpec, + isLineAnnotation, + isRectAnnotation, +} from '../utils/specs'; +import { Dimensions } from '../../../utils/dimensions'; +import { AnnotationId, GroupId } from '../../../utils/ids'; +import { Scale } from '../../../scales'; +import { getAxesSpecForSpecId, isHorizontalRotation } from '../state/utils'; +import { Point } from '../../../utils/point'; +import { computeLineAnnotationDimensions } from './line/dimensions'; +import { computeRectAnnotationDimensions } from './rect/dimensions'; +import { Rotation, Position } from '../../../utils/commons'; +import { AnnotationDimensions } from './types'; + +/** @internal */ +export function getAnnotationAxis( + axesSpecs: AxisSpec[], + groupId: GroupId, + domainType: AnnotationDomainType, + chartRotation: Rotation, +): Position | null { + const { xAxis, yAxis } = getAxesSpecForSpecId(axesSpecs, groupId); + const isHorizontalRotated = isHorizontalRotation(chartRotation); + const isXDomainAnnotation = isXDomain(domainType); + const annotationAxis = isXDomainAnnotation ? xAxis : yAxis; + const rotatedAnnotation = isHorizontalRotated ? annotationAxis : isXDomainAnnotation ? yAxis : xAxis; + return rotatedAnnotation ? rotatedAnnotation.position : null; +} + +/** @internal */ +export function computeClusterOffset(totalBarsInCluster: number, barsShift: number, bandwidth: number): number { + if (totalBarsInCluster > 1) { + return barsShift - bandwidth / 2; + } + + return 0; +} + +/** @internal */ +export function isXDomain(domainType: AnnotationDomainType): boolean { + return domainType === AnnotationDomainTypes.XDomain; +} + +/** @internal */ +export function getRotatedCursor( + /** the cursor position relative to the projection area */ + cursorPosition: Point, + chartDimensions: Dimensions, + chartRotation: Rotation, +): Point { + const { x, y } = cursorPosition; + const { height, width } = chartDimensions; + switch (chartRotation) { + case 0: + return { x, y }; + case 90: + return { x: y, y: width - x }; + case -90: + return { x: height - y, y: x }; + case 180: + return { x: width - x, y: height - y }; + } +} + +/** @internal */ +export function computeAnnotationDimensions( + annotations: AnnotationSpec[], + chartDimensions: Dimensions, + chartRotation: Rotation, + yScales: Map, + xScale: Scale, + axesSpecs: AxisSpec[], + isHistogramModeEnabled: boolean, +): Map { + const annotationDimensions = new Map(); + + annotations.forEach((annotationSpec) => { + const { id } = annotationSpec; + if (isLineAnnotation(annotationSpec)) { + const { groupId, domainType } = annotationSpec; + const annotationAxisPosition = getAnnotationAxis(axesSpecs, groupId, domainType, chartRotation); + + const dimensions = computeLineAnnotationDimensions( + annotationSpec, + chartDimensions, + chartRotation, + yScales, + xScale, + annotationAxisPosition, + isHistogramModeEnabled, + ); + + if (dimensions) { + annotationDimensions.set(id, dimensions); + } + } else if (isRectAnnotation(annotationSpec)) { + const dimensions = computeRectAnnotationDimensions(annotationSpec, yScales, xScale, isHistogramModeEnabled); + + if (dimensions) { + annotationDimensions.set(id, dimensions); + } + } + }); + + return annotationDimensions; +} diff --git a/src/chart_types/xy_chart/renderer/canvas/annotations/index.ts b/src/chart_types/xy_chart/renderer/canvas/annotations/index.ts index 18ab7398be..a3c0c6bc68 100644 --- a/src/chart_types/xy_chart/renderer/canvas/annotations/index.ts +++ b/src/chart_types/xy_chart/renderer/canvas/annotations/index.ts @@ -16,15 +16,15 @@ * specific language governing permissions and limitations * under the License. */ -import { AnnotationDimensions } from '../../../annotations/annotation_utils'; +import { AnnotationDimensions } from '../../../annotations/types'; import { AnnotationSpec, isLineAnnotation, isRectAnnotation } from '../../../utils/specs'; import { getSpecsById } from '../../../state/utils'; import { AnnotationId } from '../../../../../utils/ids'; import { mergeWithDefaultAnnotationLine, mergeWithDefaultAnnotationRect } from '../../../../../utils/themes/theme'; import { renderLineAnnotations } from './lines'; -import { AnnotationLineProps } from '../../../annotations/line_annotation_tooltip'; +import { AnnotationLineProps } from '../../../annotations/line/types'; import { renderRectAnnotations } from './rect'; -import { AnnotationRectProps } from '../../../annotations/rect_annotation_tooltip'; +import { AnnotationRectProps } from '../../../annotations/rect/types'; interface AnnotationProps { annotationDimensions: Map; diff --git a/src/chart_types/xy_chart/renderer/canvas/annotations/lines.ts b/src/chart_types/xy_chart/renderer/canvas/annotations/lines.ts index 8d6e6fae62..216787f21b 100644 --- a/src/chart_types/xy_chart/renderer/canvas/annotations/lines.ts +++ b/src/chart_types/xy_chart/renderer/canvas/annotations/lines.ts @@ -18,7 +18,7 @@ import { Stroke, Line } from '../../../../../geoms/types'; import { stringToRGB } from '../../../../partition_chart/layout/utils/d3_utils'; -import { AnnotationLineProps } from '../../../annotations/line_annotation_tooltip'; +import { AnnotationLineProps } from '../../../annotations/line/types'; import { LineAnnotationStyle } from '../../../../../utils/themes/theme'; import { renderMultiLine } from '../primitives/line'; diff --git a/src/chart_types/xy_chart/renderer/canvas/annotations/rect.ts b/src/chart_types/xy_chart/renderer/canvas/annotations/rect.ts index 78e77c62da..914a54cc03 100644 --- a/src/chart_types/xy_chart/renderer/canvas/annotations/rect.ts +++ b/src/chart_types/xy_chart/renderer/canvas/annotations/rect.ts @@ -18,7 +18,7 @@ import { renderRect } from '../primitives/rect'; import { Rect, Fill, Stroke } from '../../../../../geoms/types'; -import { AnnotationRectProps } from '../../../annotations/rect_annotation_tooltip'; +import { AnnotationRectProps } from '../../../annotations/rect/types'; import { RectAnnotationStyle } from '../../../../../utils/themes/theme'; import { stringToRGB } from '../../../../partition_chart/layout/utils/d3_utils'; import { withContext } from '../../../../../renderers/canvas'; diff --git a/src/chart_types/xy_chart/renderer/canvas/primitives/rect.ts b/src/chart_types/xy_chart/renderer/canvas/primitives/rect.ts index ce09ed5426..35a54abf5f 100644 --- a/src/chart_types/xy_chart/renderer/canvas/primitives/rect.ts +++ b/src/chart_types/xy_chart/renderer/canvas/primitives/rect.ts @@ -33,7 +33,6 @@ export function renderRect( if (fill) { const borderOffset = !disableBoardOffset && stroke && stroke.width > 0.001 ? stroke.width : 0; - // console.log(stroke, borderOffset); const x = rect.x + borderOffset; const y = rect.y + borderOffset; const width = rect.width - borderOffset * 2; @@ -45,7 +44,6 @@ export function renderRect( if (stroke && stroke.width > 0.001) { const borderOffset = !disableBoardOffset && stroke && stroke.width > 0.001 ? stroke.width / 2 : 0; - // console.log(stroke, borderOffset); const x = rect.x + borderOffset; const y = rect.y + borderOffset; const width = rect.width - borderOffset * 2; diff --git a/src/chart_types/xy_chart/renderer/canvas/xy_chart.tsx b/src/chart_types/xy_chart/renderer/canvas/xy_chart.tsx index e20876f73e..07c04b81d5 100644 --- a/src/chart_types/xy_chart/renderer/canvas/xy_chart.tsx +++ b/src/chart_types/xy_chart/renderer/canvas/xy_chart.tsx @@ -30,7 +30,7 @@ import { Dimensions } from '../../../../utils/dimensions'; import { AnnotationId, AxisId } from '../../../../utils/ids'; import { LIGHT_THEME } from '../../../../utils/themes/light_theme'; import { Theme } from '../../../../utils/themes/theme'; -import { AnnotationDimensions } from '../../annotations/annotation_utils'; +import { AnnotationDimensions } from '../../annotations/types'; import { LegendItem } from '../../../../commons/legend'; import { computeAnnotationDimensionsSelector } from '../../state/selectors/compute_annotations'; import { computeAxisTicksDimensionsSelector } from '../../state/selectors/compute_axis_ticks_dimensions'; diff --git a/src/chart_types/xy_chart/renderer/dom/annotation_tooltips.tsx b/src/chart_types/xy_chart/renderer/dom/annotation_tooltips.tsx index 921efaf451..f0ccea3f8d 100644 --- a/src/chart_types/xy_chart/renderer/dom/annotation_tooltips.tsx +++ b/src/chart_types/xy_chart/renderer/dom/annotation_tooltips.tsx @@ -19,11 +19,7 @@ import React from 'react'; import { isLineAnnotation, AnnotationSpec, AnnotationTypes } from '../../utils/specs'; import { AnnotationId } from '../../../../utils/ids'; -import { - AnnotationDimensions, - AnnotationTooltipState, - AnnotationTooltipFormatter, -} from '../../annotations/annotation_utils'; +import { AnnotationDimensions, AnnotationTooltipState, AnnotationTooltipFormatter } from '../../annotations/types'; import { connect } from 'react-redux'; import { Dimensions } from '../../../../utils/dimensions'; import { GlobalChartState, BackwardRef } from '../../../../state/chart_state'; @@ -32,10 +28,10 @@ import { computeAnnotationDimensionsSelector } from '../../state/selectors/compu import { getAnnotationSpecsSelector } from '../../state/selectors/get_specs'; import { getAnnotationTooltipStateSelector } from '../../state/selectors/get_annotation_tooltip_state'; import { isChartEmptySelector } from '../../state/selectors/is_chart_empty'; -import { AnnotationLineProps } from '../../annotations/line_annotation_tooltip'; +import { AnnotationLineProps } from '../../annotations/line/types'; import { computeChartDimensionsSelector } from '../../state/selectors/compute_chart_dimensions'; import { createPortal } from 'react-dom'; -import { getFinalAnnotationTooltipPosition } from '../../annotations/annotation_tooltip'; +import { getFinalAnnotationTooltipPosition } from '../../annotations/tooltip'; import { getSpecsById } from '../../state/utils'; interface AnnotationTooltipStateProps { diff --git a/src/chart_types/xy_chart/rendering/rendering.ts b/src/chart_types/xy_chart/rendering/rendering.ts index 90c604b160..bbd27f2f0d 100644 --- a/src/chart_types/xy_chart/rendering/rendering.ts +++ b/src/chart_types/xy_chart/rendering/rendering.ts @@ -28,7 +28,7 @@ import { LineStyle, BubbleSeriesStyle, } from '../../../utils/themes/theme'; -import { Scale, ScaleType, isLogarithmicScale } from '../../../scales'; +import { Scale, ScaleType } from '../../../scales'; import { CurveType, getCurveFactory } from '../../../utils/curves'; import { DataSeriesDatum, DataSeries, XYChartSeriesIdentifier } from '../utils/series'; import { DisplayValueSpec, PointStyleAccessor, BarStyleAccessor } from '../utils/specs'; @@ -47,6 +47,7 @@ import { LegendItem } from '../../../commons/legend'; import { IndexedGeometryMap, GeometryType } from '../utils/indexed_geometry_map'; import { getDistance } from '../state/utils'; import { MarkBuffer } from '../../../specs'; +import { isLogarithmicScale } from '../../../scales/types'; export const DEFAULT_HIGHLIGHT_PADDING = 10; diff --git a/src/chart_types/xy_chart/state/selectors/compute_annotations.ts b/src/chart_types/xy_chart/state/selectors/compute_annotations.ts index 51d9a243d9..3e9003a7b4 100644 --- a/src/chart_types/xy_chart/state/selectors/compute_annotations.ts +++ b/src/chart_types/xy_chart/state/selectors/compute_annotations.ts @@ -20,9 +20,9 @@ import createCachedSelector from 're-reselect'; import { getSettingsSpecSelector } from '../../../../state/selectors/get_settings_specs'; import { getAxisSpecsSelector, getAnnotationSpecsSelector } from './get_specs'; import { computeChartDimensionsSelector } from './compute_chart_dimensions'; -import { countBarsInClusterSelector } from './count_bars_in_cluster'; import { isHistogramModeEnabledSelector } from './is_histogram_mode_enabled'; -import { computeAnnotationDimensions, AnnotationDimensions } from '../../annotations/annotation_utils'; +import { computeAnnotationDimensions } from '../../annotations/utils'; +import { AnnotationDimensions } from '../../annotations/types'; import { computeSeriesGeometriesSelector } from './compute_series_geometries'; import { AnnotationId } from '../../../../utils/ids'; import { getChartIdSelector } from '../../../../state/selectors/get_chart_id'; @@ -35,7 +35,6 @@ export const computeAnnotationDimensionsSelector = createCachedSelector( getSettingsSpecSelector, computeSeriesGeometriesSelector, getAxisSpecsSelector, - countBarsInClusterSelector, isHistogramModeEnabledSelector, getAxisSpecsSelector, ], @@ -43,12 +42,10 @@ export const computeAnnotationDimensionsSelector = createCachedSelector( annotationSpecs, chartDimensions, settingsSpec, - seriesGeometries, + { scales: { yScales, xScale } }, axesSpecs, - totalBarsInCluster, isHistogramMode, ): Map => { - const { yScales, xScale } = seriesGeometries.scales; return computeAnnotationDimensions( annotationSpecs, chartDimensions.chartDimensions, @@ -56,7 +53,6 @@ export const computeAnnotationDimensionsSelector = createCachedSelector( yScales, xScale, axesSpecs, - totalBarsInCluster, isHistogramMode, ); }, diff --git a/src/chart_types/xy_chart/state/selectors/get_annotation_tooltip_state.ts b/src/chart_types/xy_chart/state/selectors/get_annotation_tooltip_state.ts index 0dab98fa53..c653258f19 100644 --- a/src/chart_types/xy_chart/state/selectors/get_annotation_tooltip_state.ts +++ b/src/chart_types/xy_chart/state/selectors/get_annotation_tooltip_state.ts @@ -23,11 +23,8 @@ import { computeChartDimensionsSelector } from './compute_chart_dimensions'; import { getAxisSpecsSelector, getAnnotationSpecsSelector } from './get_specs'; import { AxisSpec, AnnotationSpec, AnnotationTypes } from '../../utils/specs'; import { Rotation } from '../../../../utils/commons'; -import { - computeAnnotationTooltipState, - AnnotationTooltipState, - AnnotationDimensions, -} from '../../annotations/annotation_utils'; +import { computeAnnotationTooltipState } from '../../annotations/tooltip'; +import { AnnotationTooltipState, AnnotationDimensions } from '../../annotations/types'; import { computeAnnotationDimensionsSelector } from './compute_annotations'; import { getChartRotationSelector } from '../../../../state/selectors/get_chart_rotation'; import { AnnotationId } from '../../../../utils/ids'; diff --git a/src/chart_types/xy_chart/utils/specs.ts b/src/chart_types/xy_chart/utils/specs.ts index 6f8cf2b91b..30e98914bd 100644 --- a/src/chart_types/xy_chart/utils/specs.ts +++ b/src/chart_types/xy_chart/utils/specs.ts @@ -33,9 +33,10 @@ import { AxisId, GroupId } from '../../../utils/ids'; import { ScaleContinuousType, ScaleType } from '../../../scales'; import { CurveType } from '../../../utils/curves'; import { RawDataSeriesDatum, XYChartSeriesIdentifier } from './series'; -import { AnnotationTooltipFormatter } from '../annotations/annotation_utils'; +import { AnnotationTooltipFormatter } from '../annotations/types'; import { SpecTypes, Spec } from '../../../specs'; import { ChartTypes } from '../..'; +import { PrimitiveValue } from '../../partition_chart/layout/utils/group_by_rollup'; export type BarStyleOverride = RecursivePartial | Color | null; export type PointStyleOverride = RecursivePartial | Color | null; @@ -630,19 +631,19 @@ export interface RectAnnotationDatum { /** * The minuimum value on the x axis. If undefined, the minuimum value of the x domain will be used. */ - x0?: any; + x0?: PrimitiveValue; /** * The maximum value on the x axis. If undefined, the maximum value of the x domain will be used. */ - x1?: any; + x1?: PrimitiveValue; /** * The minimum value on the y axis. If undefined, the minimum value of the y domain will be used. */ - y0?: any; + y0?: PrimitiveValue; /** * The maximum value on the y axis. If undefined, the maximum value of the y domain will be used. */ - y1?: any; + y1?: PrimitiveValue; }; /** * A textual description of the annotation diff --git a/src/index.ts b/src/index.ts index 3d187a7ee2..b3a3b0c30f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -32,7 +32,7 @@ export { timeFormatter, niceTimeFormatter, niceTimeFormatByDay } from './utils/d export { Datum, Position, Rendering, Rotation } from './utils/commons'; export { SeriesIdentifier } from './commons/series_id'; export { XYChartSeriesIdentifier } from './chart_types/xy_chart/utils/series'; -export { AnnotationTooltipFormatter } from './chart_types/xy_chart/annotations/annotation_utils'; +export { AnnotationTooltipFormatter } from './chart_types/xy_chart/annotations/types'; export { GeometryValue } from './utils/geometry'; export { Config as PartitionConfig, diff --git a/src/mocks/specs/specs.ts b/src/mocks/specs/specs.ts index e033aa2127..d25386618b 100644 --- a/src/mocks/specs/specs.ts +++ b/src/mocks/specs/specs.ts @@ -32,6 +32,7 @@ import { RectAnnotationSpec, AnnotationTypes, AnnotationDomainTypes, + AxisSpec, } from '../../chart_types/xy_chart/utils/specs'; import { ScaleType } from '../../scales'; import { ChartTypes } from '../../chart_types'; @@ -212,7 +213,7 @@ export class MockSeriesSpec { }); } - static byType(type?: SeriesTypes): BasicSeriesSpec { + static byType(type?: SeriesTypes | 'histogram'): BasicSeriesSpec { switch (type) { case SeriesTypes.Line: return MockSeriesSpec.lineBase; @@ -220,17 +221,21 @@ export class MockSeriesSpec { return MockSeriesSpec.areaBase; case SeriesTypes.Bubble: return MockSeriesSpec.bubbleBase; + case 'histogram': + return MockSeriesSpec.histogramBarBase; case SeriesTypes.Bar: default: return MockSeriesSpec.barBase; } } - static byTypePartial(type?: 'line' | 'bar' | 'area') { + static byTypePartial(type?: 'line' | 'bar' | 'area' | 'histogram') { switch (type) { case 'line': return MockSeriesSpec.line; case 'area': return MockSeriesSpec.area; + case 'histogram': + return MockSeriesSpec.histogramBar; case 'bar': default: return MockSeriesSpec.bar; @@ -279,6 +284,21 @@ export class MockGlobalSpec { theme: LIGHT_THEME, }; + private static readonly axisBase: AxisSpec = { + id: 'yAxis', + chartType: ChartTypes.XYAxis, + specType: SpecTypes.Axis, + groupId: DEFAULT_GLOBAL_ID, + hide: false, + showOverlappingTicks: false, + showOverlappingLabels: false, + position: Position.Left, + tickSize: 10, + tickPadding: 10, + tickFormat: (tick: any) => `${tick}`, + tickLabelRotation: 0, + }; + private static readonly settingsBaseNoMargings: SettingsSpec = { ...MockGlobalSpec.settingsBase, theme: { @@ -287,6 +307,7 @@ export class MockGlobalSpec { chartPaddings: { top: 0, left: 0, right: 0, bottom: 0 }, scales: { barsPadding: 0, + histogramPadding: 0, }, }, }; @@ -299,6 +320,9 @@ export class MockGlobalSpec { mergeOptionalPartialValues: true, }); } + static axis(partial?: Partial): AxisSpec { + return mergePartial(MockGlobalSpec.axisBase, partial, { mergeOptionalPartialValues: true }); + } } /** @internal */ diff --git a/src/scales/index.ts b/src/scales/index.ts index 12c30a5626..99bffc752a 100644 --- a/src/scales/index.ts +++ b/src/scales/index.ts @@ -79,11 +79,3 @@ export { ScaleBand } from './scale_band'; /** @internal */ export { ScaleContinuous } from './scale_continuous'; - -/** - * Check if a scale is logaritmic - * @internal - */ -export function isLogarithmicScale(scale: Scale) { - return scale.type === ScaleType.Log; -} diff --git a/src/scales/scale_band.ts b/src/scales/scale_band.ts index ed8efa41e1..86a4eace8b 100644 --- a/src/scales/scale_band.ts +++ b/src/scales/scale_band.ts @@ -31,6 +31,9 @@ export class ScaleBand implements Scale { readonly bandwidth: number; readonly bandwidthPadding: number; readonly step: number; + readonly outerPadding: number; + readonly innerPadding: number; + readonly originalBandwidth: number; readonly type: ScaleType; readonly domain: any[]; readonly range: number[]; @@ -59,7 +62,10 @@ export class ScaleBand implements Scale { this.barsPadding = safeBarPadding; this.d3Scale.paddingInner(safeBarPadding); this.d3Scale.paddingOuter(safeBarPadding / 2); + this.outerPadding = this.d3Scale.paddingOuter(); + this.innerPadding = this.d3Scale.paddingInner(); this.bandwidth = this.d3Scale.bandwidth() || 0; + this.originalBandwidth = this.d3Scale.bandwidth() || 0; this.step = this.d3Scale.step(); this.domain = this.d3Scale.domain(); this.range = range.slice(); diff --git a/src/scales/scale_continuous.test.ts b/src/scales/scale_continuous.test.ts index 8501da4c21..fa9a8a2045 100644 --- a/src/scales/scale_continuous.test.ts +++ b/src/scales/scale_continuous.test.ts @@ -20,7 +20,8 @@ import { XDomain } from '../chart_types/xy_chart/domains/x_domain'; import { computeXScale } from '../chart_types/xy_chart/utils/scales'; import { Domain } from '../utils/domain'; import { DateTime, Settings } from 'luxon'; -import { ScaleContinuous, ScaleType, ScaleBand, isLogarithmicScale } from '.'; +import { ScaleContinuous, ScaleType, ScaleBand } from '.'; +import { isLogarithmicScale } from './types'; describe('Scale Continuous', () => { test('shall invert on continuous scale linear', () => { diff --git a/src/scales/types.ts b/src/scales/types.ts new file mode 100644 index 0000000000..23cc8dbe9b --- /dev/null +++ b/src/scales/types.ts @@ -0,0 +1,45 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ + +import { ScaleContinuous } from './scale_continuous'; +import { Scale, ScaleType } from '.'; +import { ScaleBand } from './scale_band'; + +/** + * Check if a scale is logaritmic + * @internal + */ +export function isLogarithmicScale(scale: Scale): scale is ScaleContinuous { + return scale.type === ScaleType.Log; +} + +/** + * Check if a scale is Band + * @internal + */ +export function isBandScale(scale: Scale): scale is ScaleBand { + return scale.type === ScaleType.Ordinal; +} + +/** + * Check if a scale is continuous + * @internal + */ +export function isContinuousScale(scale: Scale): scale is ScaleContinuous { + return scale.type !== ScaleType.Ordinal; +} diff --git a/stories/annotations/rects/1_linear_bar_chart.tsx b/stories/annotations/rects/1_linear_bar_chart.tsx index 57256aaf27..6c43fa37a1 100644 --- a/stories/annotations/rects/1_linear_bar_chart.tsx +++ b/stories/annotations/rects/1_linear_bar_chart.tsx @@ -41,7 +41,7 @@ export const example = () => { return ( - + { yAccessors={['y']} data={[ { x: 0, y: 2 }, - { x: 1, y: 7 }, + { x: 1, y: 3 }, { x: 3, y: 6 }, ]} /> diff --git a/stories/annotations/rects/2_ordinal_bar_chart.tsx b/stories/annotations/rects/2_ordinal_bar_chart.tsx index 359e4cdde6..4b88761297 100644 --- a/stories/annotations/rects/2_ordinal_bar_chart.tsx +++ b/stories/annotations/rects/2_ordinal_bar_chart.tsx @@ -39,7 +39,7 @@ export const example = () => { return ( - + { yAccessors={['y']} data={[ { x: 'a', y: 2 }, - { x: 'b', y: 7 }, + { x: 'b', y: 3 }, { x: 'c', y: 0 }, { x: 'd', y: 6 }, ]} diff --git a/stories/annotations/rects/3_linear_line_chart.tsx b/stories/annotations/rects/3_linear_line_chart.tsx index 7de9e38c02..ae2f969187 100644 --- a/stories/annotations/rects/3_linear_line_chart.tsx +++ b/stories/annotations/rects/3_linear_line_chart.tsx @@ -38,7 +38,7 @@ export const example = () => { 'x0', ); - const dataValues: RectAnnotationDatum[] = [ + const dataValues1: RectAnnotationDatum[] = [ { coordinates: { x0: 1, @@ -48,6 +48,8 @@ export const example = () => { }, details: 'details about this annotation', }, + ]; + const dataValues2: RectAnnotationDatum[] = [ { coordinates: { x0: 2.0, @@ -57,6 +59,8 @@ export const example = () => { }, details: 'details about this annotation', }, + ]; + const dataValues3: RectAnnotationDatum[] = [ { coordinates: { x0: definedCoordinate === 'x0' ? 0.25 : null, @@ -79,7 +83,9 @@ export const example = () => { return ( - + + + Date: Fri, 24 Apr 2020 17:55:02 +0200 Subject: [PATCH 3/7] fix: align with new scale types --- .../annotations/annotation_marker.test.tsx | 2 +- .../xy_chart/annotations/line/dimensions.ts | 15 ++++-- .../xy_chart/annotations/rect/dimensions.ts | 47 ++++++++++++------- 3 files changed, 41 insertions(+), 23 deletions(-) diff --git a/src/chart_types/xy_chart/annotations/annotation_marker.test.tsx b/src/chart_types/xy_chart/annotations/annotation_marker.test.tsx index fcac29db13..1a468a794f 100644 --- a/src/chart_types/xy_chart/annotations/annotation_marker.test.tsx +++ b/src/chart_types/xy_chart/annotations/annotation_marker.test.tsx @@ -26,7 +26,7 @@ import { Scale, ScaleType, ScaleContinuous } from '../../../scales'; import { SpecTypes } from '../../../specs/settings'; import { computeLineAnnotationDimensions } from './line/dimensions'; import { AnnotationLineProps } from './line/types'; -import { ChartTypes } from '../../../index'; +import { ChartTypes } from '../..'; describe('annotation marker', () => { const groupId = 'foo-group'; diff --git a/src/chart_types/xy_chart/annotations/line/dimensions.ts b/src/chart_types/xy_chart/annotations/line/dimensions.ts index 58c0eaa21d..28f56de25a 100644 --- a/src/chart_types/xy_chart/annotations/line/dimensions.ts +++ b/src/chart_types/xy_chart/annotations/line/dimensions.ts @@ -180,6 +180,9 @@ function computeXDomainLineAnnotationDimensions( dataValues.forEach((datum: LineAnnotationDatum) => { const { dataValue } = datum; let annotationValueXposition = xScale.scale(dataValue); + if (annotationValueXposition == null) { + return; + } if (isContinuousScale(xScale) && typeof dataValue === 'number') { const minDomain = xScale.domain[0]; const maxDomain = isHistogramMode ? xScale.domain[1] + xScale.minInterval : xScale.domain[1]; @@ -188,16 +191,20 @@ function computeXDomainLineAnnotationDimensions( } if (isHistogramMode) { const offset = computeXScaleOffset(xScale, true); - annotationValueXposition = xScale.pureScale(dataValue) - offset; + const pureScaledValue = xScale.pureScale(dataValue); + if (pureScaledValue == null) { + return; + } + annotationValueXposition = pureScaledValue - offset; } else { - annotationValueXposition = xScale.scale(dataValue) + (xScale.bandwidth * xScale.totalBarsInCluster) / 2; + annotationValueXposition = annotationValueXposition + (xScale.bandwidth * xScale.totalBarsInCluster) / 2; } } else if (isBandScale(xScale)) { if (isHistogramMode) { const padding = (xScale.step - xScale.originalBandwidth) / 2; - annotationValueXposition = xScale.scale(dataValue) - padding; + annotationValueXposition = annotationValueXposition - padding; } else { - annotationValueXposition = xScale.scale(dataValue) + xScale.originalBandwidth / 2; + annotationValueXposition = annotationValueXposition + xScale.originalBandwidth / 2; } } else { return; diff --git a/src/chart_types/xy_chart/annotations/rect/dimensions.ts b/src/chart_types/xy_chart/annotations/rect/dimensions.ts index 83011eedda..079341bc35 100644 --- a/src/chart_types/xy_chart/annotations/rect/dimensions.ts +++ b/src/chart_types/xy_chart/annotations/rect/dimensions.ts @@ -75,12 +75,16 @@ export function computeRectAnnotationDimensions( if (!xAndWidth) { return; } - const y = yScale.pureScale(y1); - const height = Math.abs(yScale.pureScale(y0) - y); + const scaledY1 = yScale.pureScale(y1); + const scaledY0 = yScale.pureScale(y0); + if (scaledY1 == null || scaledY0 == null) { + return; + } + const height = Math.abs(scaledY0 - scaledY1); const rectDimensions = { ...xAndWidth, - y, + y: scaledY1, height, }; @@ -100,21 +104,25 @@ function scaleXonBandScale( // the band scale return the start of the band, we need to cover // also the inner padding of the bar const padding = (xScale.step - xScale.originalBandwidth) / 2; - + let scaledX1 = xScale.scale(x1); + let scaledX0 = xScale.scale(x0); + if (scaledX1 == null || scaledX0 == null) { + return null; + } // extend the x1 scaled value to fully cover the last bar - let x1Scaled: number = xScale.scale(x1) + xScale.originalBandwidth + padding; + scaledX1 += xScale.originalBandwidth + padding; // give the x1 value a maximum of the chart range - if (x1Scaled > xScale.range[1]) { - x1Scaled = xScale.range[1]; + if (scaledX1 > xScale.range[1]) { + scaledX1 = xScale.range[1]; } - let x0Scaled = xScale.scale(x0) - padding; - if (x0Scaled < xScale.range[0]) { - x0Scaled = xScale.range[0]; + scaledX0 -= padding; + if (scaledX0 < xScale.range[0]) { + scaledX0 = xScale.range[0]; } - const width = Math.abs(x1Scaled - x0Scaled); + const width = Math.abs(scaledX1 - scaledX0); return { - x: x0Scaled, + x: scaledX0, width, }; } @@ -125,20 +133,23 @@ function scaleXonContinuousScale( x1: PrimitiveValue, isHistogramModeEnabled: boolean = false, ): { x: number; width: number } | null { - let x1Scaled: number; if (typeof x1 !== 'number' || typeof x0 !== 'number') { return null; } + const scaledX0 = xScale.scale(x0); + let scaledX1: number | null; if (xScale.totalBarsInCluster > 0 && !isHistogramModeEnabled) { - x1Scaled = xScale.scale(x1 + xScale.minInterval); + scaledX1 = xScale.scale(x1 + xScale.minInterval); } else { - x1Scaled = xScale.scale(x1); + scaledX1 = xScale.scale(x1); + } + if (scaledX1 == null || scaledX0 == null) { + return null; } - const x0Scaled = xScale.scale(x0); // the width needs to be computed before adjusting the x anchor - const width = Math.abs(x1Scaled - x0Scaled); + const width = Math.abs(scaledX1 - scaledX0); return { - x: x0Scaled - (xScale.bandwidthPadding / 2) * xScale.totalBarsInCluster, + x: scaledX0 - (xScale.bandwidthPadding / 2) * xScale.totalBarsInCluster, width, }; } From 4aa0882454fa962dbd9f456e8849e078750596c8 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Fri, 24 Apr 2020 19:08:46 +0200 Subject: [PATCH 4/7] fix: wrongly removed stripInternal config --- tsconfig.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index 7d9dda5dda..6e86d4fe32 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -17,6 +17,7 @@ "allowJs": false, "skipLibCheck": true, "downlevelIteration": true, - "typeRoots": ["./node_modules/@types/", "./global.d.ts"] + "typeRoots": ["./node_modules/@types/", "./global.d.ts"], + "stripInternal": true } } From 76d22f425d1aa2bc3c2578fd1a6a1325260bcd8f Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Fri, 24 Apr 2020 19:15:11 +0200 Subject: [PATCH 5/7] refactor: remove unused code --- src/chart_types/xy_chart/annotations/utils.test.ts | 13 +------------ src/chart_types/xy_chart/annotations/utils.ts | 9 --------- src/chart_types/xy_chart/legend/legend.ts | 3 +-- 3 files changed, 2 insertions(+), 23 deletions(-) diff --git a/src/chart_types/xy_chart/annotations/utils.test.ts b/src/chart_types/xy_chart/annotations/utils.test.ts index 55b1eb660b..1cea87c840 100644 --- a/src/chart_types/xy_chart/annotations/utils.test.ts +++ b/src/chart_types/xy_chart/annotations/utils.test.ts @@ -30,7 +30,7 @@ import { DEFAULT_ANNOTATION_LINE_STYLE } from '../../../utils/themes/theme'; import { Dimensions } from '../../../utils/dimensions'; import { GroupId, AnnotationId } from '../../../utils/ids'; import { Scale, ScaleType, ScaleBand, ScaleContinuous } from '../../../scales'; -import { computeAnnotationDimensions, computeClusterOffset, getAnnotationAxis, getRotatedCursor } from './utils'; +import { computeAnnotationDimensions, getAnnotationAxis, getRotatedCursor } from './utils'; import { AnnotationDimensions, AnnotationTooltipState, Bounds } from './types'; import { computeLineAnnotationDimensions } from './line/dimensions'; import { AnnotationLineProps } from './line/types'; @@ -1366,15 +1366,4 @@ describe('annotation utils', () => { expect(getRotatedCursor(cursorPosition, chartDimensions, -90)).toEqual({ x: 18, y: 1 }); expect(getRotatedCursor(cursorPosition, chartDimensions, 180)).toEqual({ x: 9, y: 18 }); }); - - test('should compute cluster offset', () => { - const singleBarCluster = 1; - const multiBarCluster = 2; - - const barsShift = 4; - const bandwidth = 2; - - expect(computeClusterOffset(singleBarCluster, barsShift, bandwidth)).toBe(0); - expect(computeClusterOffset(multiBarCluster, barsShift, bandwidth)).toBe(3); - }); }); diff --git a/src/chart_types/xy_chart/annotations/utils.ts b/src/chart_types/xy_chart/annotations/utils.ts index 4de9cd8ed0..1d7487e227 100644 --- a/src/chart_types/xy_chart/annotations/utils.ts +++ b/src/chart_types/xy_chart/annotations/utils.ts @@ -49,15 +49,6 @@ export function getAnnotationAxis( return rotatedAnnotation ? rotatedAnnotation.position : null; } -/** @internal */ -export function computeClusterOffset(totalBarsInCluster: number, barsShift: number, bandwidth: number): number { - if (totalBarsInCluster > 1) { - return barsShift - bandwidth / 2; - } - - return 0; -} - /** @internal */ export function isXDomain(domainType: AnnotationDomainType): boolean { return domainType === AnnotationDomainTypes.XDomain; diff --git a/src/chart_types/xy_chart/legend/legend.ts b/src/chart_types/xy_chart/legend/legend.ts index 13594ce8d2..7ebafd7868 100644 --- a/src/chart_types/xy_chart/legend/legend.ts +++ b/src/chart_types/xy_chart/legend/legend.ts @@ -48,8 +48,7 @@ function getPostfix(spec: BasicSeriesSpec): Postfixes { return {}; } -/** @internal */ -export function getBandedLegendItemLabel(name: string, yAccessor: BandedAccessorType, postfixes: Postfixes) { +function getBandedLegendItemLabel(name: string, yAccessor: BandedAccessorType, postfixes: Postfixes) { return yAccessor === BandedAccessorType.Y1 ? `${name}${postfixes.y1AccessorFormat}` : `${name}${postfixes.y0AccessorFormat}`; From 85917d8d1ce0a1601b540b94f6ec4d657831365c Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Mon, 27 Apr 2020 17:13:04 +0200 Subject: [PATCH 6/7] test: fix VRTs --- ...ar-chart-visually-looks-correct-1-snap.png | Bin 11266 -> 10604 bytes ...ne-chart-visually-looks-correct-1-snap.png | Bin 21533 -> 21246 bytes ...ar-chart-visually-looks-correct-1-snap.png | Bin 11201 -> 10476 bytes ...sibility-visually-looks-correct-1-snap.png | Bin 11266 -> 11169 bytes ...e-linear-visually-looks-correct-1-snap.png | Bin 15578 -> 15417 bytes ...togram-mode-is-false-rotation-0-1-snap.png | Bin 15578 -> 15417 bytes ...gram-mode-is-false-rotation-180-1-snap.png | Bin 15611 -> 15292 bytes ...ogram-mode-is-false-rotation-90-1-snap.png | Bin 16017 -> 15666 bytes ...e-is-false-rotation-negative-90-1-snap.png | Bin 16019 -> 15699 bytes ...stogram-mode-is-true-rotation-0-1-snap.png | Bin 15867 -> 15776 bytes ...ogram-mode-is-true-rotation-180-1-snap.png | Bin 15651 -> 15609 bytes ...togram-mode-is-true-rotation-90-1-snap.png | Bin 14595 -> 14510 bytes ...de-is-true-rotation-negative-90-1-snap.png | Bin 14343 -> 14532 bytes ...e-linear-point-alignment-center-1-snap.png | Bin 12910 -> 12734 bytes ...mode-linear-point-alignment-end-1-snap.png | Bin 12972 -> 12732 bytes ...de-linear-point-alignment-start-1-snap.png | Bin 12904 -> 12618 bytes .../xy_chart/annotations/rect/dimensions.ts | 1 - .../annotations/rects/1_linear_bar_chart.tsx | 73 ++++++++++++++---- .../annotations/rects/2_ordinal_bar_chart.tsx | 35 ++++++--- .../annotations/rects/3_linear_line_chart.tsx | 28 +++---- stories/bar/41_test_histogram_linear.tsx | 17 +++- 21 files changed, 112 insertions(+), 42 deletions(-) diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-annotations-rects-linear-bar-chart-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-annotations-rects-linear-bar-chart-visually-looks-correct-1-snap.png index 63da9acf86091e4e2283d863709f8c3e31613c03..4cba31aca5e06ed140df253f2fe7de981d7a0319 100644 GIT binary patch literal 10604 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 diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-annotations-rects-linear-line-chart-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-annotations-rects-linear-line-chart-visually-looks-correct-1-snap.png index 64468285888e529daf41756072d89a78c0b5c5e0..d9470c9625f27750f6994c3161923bef5783e318 100644 GIT binary patch literal 21246 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 xjbjfh-X!>6wc-Z{|5VysAm8G literal 21533 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 ZMLm*d7MrCn^M`p(xH+A1eB=;#>u-aHx1j(4 diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-annotations-rects-ordinal-bar-chart-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-annotations-rects-ordinal-bar-chart-visually-looks-correct-1-snap.png index 3a79d313797ba5185bfd255282cc64c0f0d026b0..33bfc727be232cba1fd02870bb033c5af5da1608 100644 GIT binary patch literal 10476 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 literal 11201 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 literal 11266 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 diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-bar-chart-test-histogram-mode-linear-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-bar-chart-test-histogram-mode-linear-visually-looks-correct-1-snap.png index 2e045a44d3ab6dc52df491edeb67638918366e11..cd398778ae89ef0a19be2e5ba500a8d92b9255f6 100644 GIT binary patch literal 15417 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 b9-R|$(5sU?U4GIDW{1F~m86QF8^8TOCw40A literal 16017 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 diff --git a/integration/tests/__image_snapshots__/bar-stories-test-ts-bar-series-stories-test-histogram-mode-linear-enable-histogram-mode-is-true-rotation-0-1-snap.png b/integration/tests/__image_snapshots__/bar-stories-test-ts-bar-series-stories-test-histogram-mode-linear-enable-histogram-mode-is-true-rotation-0-1-snap.png index 02a43108d99e1b3484865ba353d95515649278bb..ae5a133d8cedb040140accb4f3e00ddc6f115aaa 100644 GIT binary patch literal 15776 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 diff --git a/integration/tests/__image_snapshots__/bar-stories-test-ts-bar-series-stories-test-histogram-mode-linear-enable-histogram-mode-is-true-rotation-90-1-snap.png b/integration/tests/__image_snapshots__/bar-stories-test-ts-bar-series-stories-test-histogram-mode-linear-enable-histogram-mode-is-true-rotation-90-1-snap.png index a3f4a5370ec260c40c835710fe093a1ff29fd81c..c1ed6c452ebfd96d46bfd5ce80e95680566063ae 100644 GIT binary patch literal 14510 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 literal 14595 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 H`{X|WKD?>a literal 14343 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 diff --git a/integration/tests/__image_snapshots__/bar-stories-test-ts-bar-series-stories-test-histogram-mode-linear-point-alignment-center-1-snap.png b/integration/tests/__image_snapshots__/bar-stories-test-ts-bar-series-stories-test-histogram-mode-linear-point-alignment-center-1-snap.png index 77aabe9da9468f716240ccd3502dd94e600a6fd4..547ec986095e7b7771889c8efda7cc2b7892e42f 100644 GIT binary patch literal 12734 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 QK^X~gLr<+#<<`Uh0jm8(H~;_u literal 12910 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 PI~iPBS*qZPiO+unEq+cg diff --git a/integration/tests/__image_snapshots__/bar-stories-test-ts-bar-series-stories-test-histogram-mode-linear-point-alignment-end-1-snap.png b/integration/tests/__image_snapshots__/bar-stories-test-ts-bar-series-stories-test-histogram-mode-linear-point-alignment-end-1-snap.png index c2946e9e94eceb947b98d6693b462dd00367b0f0..9a87134d139259fbf847f3bd949eaaa1d7e08458 100644 GIT binary patch literal 12732 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 S<14TU4dSlWopL3chyNd(c>d)8 diff --git a/integration/tests/__image_snapshots__/bar-stories-test-ts-bar-series-stories-test-histogram-mode-linear-point-alignment-start-1-snap.png b/integration/tests/__image_snapshots__/bar-stories-test-ts-bar-series-stories-test-histogram-mode-linear-point-alignment-start-1-snap.png index 9203dc59006e8fa794ce534693b9539caaf72554..753571197f2433121cd7d39bdbfcb25f98b153c1 100644 GIT binary patch literal 12618 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 XTQ<0dc1tpo5D|oo%H#Y;Ca?YjhVx)I literal 12904 zcmch7WmJ@FxG1_ex<$aPq9SDg(jbjPDmip_sEBkADP_Ty7-Z<~ZX{$#WfOwb3@~(v z2*VH(1Jd{XhP}^P=lr@z1j?LF{2c zL1%9KO;!AgX}bGqvG=5LUG~Vb)`sEAps|VLOm^)s=O2=~FYSolMM_*L`h>H0vmBmO zp1X4A4cW_;=ebM{Df`&FCM2}y(`iNyM?;PA?pk7T3bT&CN=Qr>Xk%gZJABPSr zSnG||u@8zWaok#B3~^Zekk4XjKEGv00+JjYV9?Q*V2Vtp-l*4PXMt~eOB9utR zxX_-T6gCR{Gsv=AzsIcE=H&Ruxa!$Er;l^No;Qdxw+G64a&vP%?$LoW1Gx^O(Z}^^ zk}o&~1$AO$W9cNkT^h=;X}k1uE`~@$Nx^M!N{Kr}!|m5qftXU|{o|tpaE!GaSA2A^ zYY!lI_w?BB60ulpq<5ms?c43fu&Y-^u1jkc8k*JMX=|VOR6X+vQ|oMf;=n1Mp(JJp zQ+TxPt`K`YA_4i5ci@|fflq)1mfwZ8kLiFWG_S*6iSuUKgyL8;4L5#xczAzmJs{sk zh!emo)XC>$W9vk4vqTLPNpl|V+{N-cv_1HV@Yy`+MNl$ywCx^6c6$vaBBTEFN?jRj zz0{-HDRbkmG!Z#m+NLZ71D_vIuxt~7r~QRm>`%)KQit%!>}AKw8w@rcsqVZ<~s~gf8}K0X_qLXf&`2&C8@t` z`zb2IDLCQ)JJ(!NBm6|xqX#wJxc}Q*Nhav2&$kRXjblHuDOI`4*?)&sd;)?|cxYeG zo!b#uk#;Zs>9{rQ99pL2Q|Ww>elilgW)+Z?V)z<}Yo5Fi#o*@(&l zNW6w;4eSs-s5Ft|XM2WgDAcQi87=Q}9D;Jfg}N)A?SutVhZlYax@AL#p)}n;yR^Fy zl!!B29}FiBQl7%jQ8ORCkt{-v0Em2*6bCF0+|6Q;+xo8#pimDpzrmb#wzsfS6td== zvj4*Bf4so|hS>kJ-}&!A{HS{VS5{S(0FOznYHx3^vWg0Js8C1PX5coq5)cD<5Z0;r zjipeoGEH;yG)_*=YMa5ky@`Ur3c>$p6RPy!e4L!H?|%1bby==N^;i`rfZt`}s~iu^ zS^}ERQPRphR1Ep3E~XYI3T$-3<=J+8Y^p8bujO(?_RtWm5Kyt;X9}_6Z*$)j7Swxb zObOiwszsgelJQ9Y7M9~D>yd!K6_Gf|Azz^9d013bRPDX-)XZzjV|g%Jv7!71^{u_P zIW;wUPQ`Gk^m4(=zy*JO7t9i(Quc51l`I#%M5sCXz`_4v=hVXK-Ti;Lyiyky5*)rVqj32bZ{xip{8W zsF}2C5549~D6NZ0OPj7;9Wim%d;a{}$k4g7XW9c0PxCuBA_L7s^Kb3Fg3pTfC=)-U zO7kppV#4~nhGV>N$;dMdgITvGGZ&EaYMo@wTInej$Nax`^DJq1%cJTRD!%#lbBX|5 z=g(hl$<_(&WCb3rHzz&tcn@}RxCO3&a21=}R{UL0&RP5y%G2x9WktXvhn4ZJ^UHHt%e|v|O$pm+K))`i&mVf;O_uj@=J){|nE4KL~Prj|FdZNR1d( zuKKnMe@4*IK7s;WMbw9<;zGh`dA9zMo(cB4yR9!&U#1ucypXrU#6p`_)?7&Nhz0alw(6kqGR1Acr<`VomadFMFtaf$b6?7>$A zO-=%EWpN&V>lnjA=7DcZ-7OtugYg;XN!KeRAYakM7(=+t(k9Rr4{R^pYnqk#0xq#b zGL|_X9)Gwf{4Szm*-vHZFj3TD^Li*w87 z=n7Wz=39~bYcY`Svp!Nk%&QB(joH z>B{TSD1u(Dx1_b$UZPP$1sqC>ej=by)`lt6G7TurzqYull zOP*($k*r*bVv4-AL1W`2l6nQilS#s-J>O9eD_Wn7y;I4nb# zKCgE_X(u)h&md@K?LEBj9mSbA4RYkCWW~i@PYu||hjz}R@p;KZ#RlbNUBIH=-^VH9 z*iA}(vHYXp3Vls+&iYh?0aK(RAY{D3t2{I`l*PYRTmeoeWTS~=1wlk92=aKxmBu_? z)clO(Vp*QC+hM$DC1!>2fzNL*dJM|n@LydRDKks1cns)%Cm>j>#n!R2EWCIhs}!tT+LNH*TZb*KEJ(i0ig5#kNi$fgzYnCaz=Pz8|%^Zi}m4@2kt|oqwMga zl9C}J&Z3+x&HL`$96$!ykzg2G7FjarUKS1X38@_7^-0WSR;KBApRm7_9Vz6otjlBG zXvo9ELnrEFYVaL++NJkTD*e%dhhCBkQd59O1%R#oUr?;*opJjb=NYNqbZLtyCAr;6 z_sD>Qi5X9MDS)~s{h!hW=i7QXmXv%MdGQB3t2(x}wiErJ>Yx{K(3F*xee@cTkC1Z~ zUKY(XAbxz2g=d$^_xP9-xF|j|m?UhE*vID+@cHQ@@9)TN$G05H3tIQBkTg#*rc__@ zhTp@;kNqGpD*cr`j^6_cP9#{I7_+jn?jNlOmKT>d8+&+oyz2v%r;D7q{I;@7X23V8 zegw_!C$PizK~|Nxf`Wpj!1FHkh#sCgn{RSb#=v$ur|CcWpgSeo5tO$xVWya{(9rRb zT-?YACsSnI(OOQly0VQJAkTSI!6hwVrCDZ!*@8xi6HvI`d{FkhKdtof{a>*&y$Srx zcQPSnYB?rW3Y{VX^Ice+Os+CkF=}ki5 zush|IZtk-Xs~!o|QybfpX)TQND5B#j2mFa&a)F<0V>N_>tBbq?-@imhI+69jzH#tKHenx}Aq#pCCaY5Y_XCCVB|<=vc(HRRCh8D9 zLqqm*99K`3u9;bBcsOOLX?+#;iJw$DNb7FL7q=Ayvy~D3nVueZ^z* zi?gyGWojxJnET{11^jvf$HW?#Cst^h@xV5o*NgkG1rOck5JpzP9QEV!dbU@IwZ+@lKHs3myUEnQ0lI+L(`V;tNty5fs z??(N#Pb9>D)HN$1Ml*(1({lhRtW&!T& zVfeX_Tl!)Q`XHa4S;y@*?@AKarW*Wzt9DQIDVV$JBax=gLQa-JkgF@xUP_ftLOxNs zkVm}8)({{wub@RP-v&Kr6}I2C z`K5Aqhc8>w`x#X5r+no5=H-1O9H@Stk6l(buVa)Tt$}-#;+z8#7CMBPLj{c6=HoXy zZ%IF!K(VSIh{FbK+%!PXUU=^+#55J^Q3UFbFdM~qTx=UITGitLm<{v6Z1~WUkChl}}PkduLrMx2#yAJ>$1KnO>-(5C^Mugs+1A zL#*+pckv%2tG3ssOkSVAw3hS+utD(?MSEAtR2vj`w-~N7QmP!ReGM1r~-)hD6OX7=Yy3b)bqjY;I)?HR07M}Af z1y^ra_-Xkc?C623=Ke%IsO96q3tZD1HYTvs~kP z7(oGn>StfB_-}q;L*)z?8xW2U)=#<@sOtd4R&@#FW}zWm4X>lN85eat~fqP@pL<-)_K5N=(0eCWskHHn9~8qqV7` z?paK^t-^#I9EbqHSUgo-ElCKDqWR-@A-f^=RM(E1W^|Mw=Q7-U&>!3HQ+9Sxx>)Kk zrxAH&FLj0ex95moe`TL+@||QgHcA{Fw45}QHSgQ`Zx1Rai8`l&Yyo#|5Aw@}LW?xS z9bVMLa{2gAW{M8bt9av7Fm(VwnOq(&_5jr!@c1gI&vO;}rN+6XCUtgS6ZkJ&`U6x) zkI?pLj2U*A)~E#i({fXst((Bk&v|ocm4Z)p&fadAI6MtbLAtltSPZ`txyJpvDXjmi|po~E*rj#iy zId zz7+ky1@yXJ?SVp#0+2OSNwZD#yaHjhu`sIY;*!3HUNOF3@&uKGo!Ucgz(LoSWjKOiP9RuDN#)%v?F(DHOYcX|yk$ZY`Y3pqPTVdMuXNgE4!RR&PM5nrC8bxHkegh7 zB*T{a5eIJm4yFIC86*1fKltd1Cl*a_xA2t^j`w7##4|e(+_WQeuWy0`>h{JmouBX1 zPu|zI9WW({^uhrSx%$l(IaQmc*ulqSq(>BrcCDAB174s*_lF7T)=mSz_#0~6)S{$H zzXvHzUFd-baImqqs%7$BQSCkQf2R;Rnw_XqSD>-3fUR^1zaI@X1uSnl_hbDpr59_p z?czfd>1ik*ER2uq6bYwNn!QVeN^O=3R~5dgqt?3WZQ`A7DgXS#MZKP=n<9)C&EA|I zsCsT@v0BupTmDTTw|6vmiMPdgrr)4(*cL{2=_*~+N#Cyh^s z1FUBDD;q8Mp4$p!Lp{-)_jv{fb~C#gdL^Fd>R_Fi3rjnfED1c`aK<=c%@?Tm#qYjz`0n5^!PS&!D{=~X))iC1{t05sFwDD^6K zJ$7{?+Ubplr*_jG6uw$t*u{MX7>;anYC*RXU(cw&0D;7-OX`%Ric zRY687i_dP*D^B;SxYRr%sdeT*{I+n@D8D+eD5lt}7;pINEUDf_7rGeb*#!n+( z+61&|O<7Ou`Vd`i|72lTnGm_bBG>e?5M${Cskb=$XKC@)FdAlY{9%W~UH|PXlMgh; z(dFKM3xE@|Vc9@W#7g4od~HukSwkKAb$<}8Hj%~rjD-^<_RrFj$L$Ut6FRwSMb(Vz z4rS9SYx0_YdhPIzpQXdlx+rME} zkJfMr;lg>AxeTO#!?;Jj4Nb)2mMx_AvISCW(DgqTVf?9yM7dL}3mE@cB;06V!mKd5 z594$)2^X1$H*8JRI+cA%JuZZ?UV)PI-nP~eVv$eiYs*6eVu1E<{#JRGtUM$DSDq^p zE}-iU>wL48XM}jS9L=Wf)AoHmlaR3pv4qP2`zucFTQ*ab{+a51-WoH6EiUq>c;Di+ zN2`~1MHqQFNbQvYD=7z<+N}V$qeeMu1 z9$u+d26Br*uKlY`S|_?_p^SqKD7OBlDJ?d#9@jK1C_J|HTY-MEMAxs7TZvy<{_#1)*%b>ynYfxeosKv%MvpU{GzB^5RgpzEeY(@i(() z_-&&+W|ptCaA|C_<*ys=ERq=m&DvB(buw`^k8Inmza(n0+aB_Nb@fg=OuIneqt7bI z#ic?d5*?*+I2_^Ee5CU(k+8gs^iH%9DpKv&Y6pS~qVo2Q&@8{mq~p?WJY4!h;rLbM z=C;%qM9G_~VYm3Xwh;TRAHAUXD=IF=f@BD^JZ3#Dq$MSf{$eY~O}woGw2*a%)@i)+ z)krK3j(4AM8BRl&E8pxZ=@7k%czAF!D202TZ8t! z?B1MM6)*4t5@i&JMVRuN(=^mNmDovUff|1qJTEkQQVHfh@{pp+U?#>T9<@(1=2^0w z&Sc@vmhSID{YVzwDk4IzJcQGE0#o=*vWWNFBEk_Pw@*M5@!#X+!f|;;j{}JtD`QD!MC#Nh#dwE667X#Z*-8JtL|_9p&mkq2T=$<>XFMxFZ{do3R+E4RS9u z>?R^Hwj{7Q;Ss%-I!^=f|NN!a%euVCAVwP*}mc z-A2F@9H*CJ)LstKz5hEX2md`BI`XjFZTQPN zWdhP|=oH8UlOzpo*DHKJB9{CN8N)HP<3^>bM3U}=e40d}wsty3fx{3Zn+ z9W{zCRAuF5Gh8F_TN@MC3g=YEWJhX~=thYMMW~E>{6kodTCe3$e{{;fNWznoI+w*x zq*Xh`I8Uj_F`O){in{~%+15IJZzTAKE9WNb%)^LNERE=sm52IuoL~weq#*mgO60tP zeMZYyL^$<7yb)Futd`czm`+Qd4DJ+5f>nf8(0`a(B5QP!0CDEk2{>qQ*GhouLqX473fmAcYa`AUq-jb zPzpqKnIzDu4oFnWubLW9ql{yTJxu;6dNxDh6aqa^x}h1%lYfMVpf~v~TX%&kzAZEn zxp^v$CH-2V$f~2`Q=MDV9}$hzsqDp_>ij^dgA-G6^E5EVU;jMG1>|k_e*IRSr5`hi z3+Pyv$1aO5BvDFq@sD7dhz zFUPy^kva*vdF}MJNitn$(WrIH7~&MoQmU65%Y>SLwQ#9cIa#rIH2A#mKPVMZQooQlNgm8zrqv zobR(69(LjV^;ZOxQSapL+BrIc5JcwCU&ZZFT%WRi*sorZIpo7Y&GSW&@y^0_?2y6B z?B)O={{*_313sdv%DOIfdE4?3v87<5HwVl$KQxUnB+`Vn(@?zq_3X|kfbL;H3pbam z#>g5k4aJu^m#&57IQNTYcj+QH8K?v2w`S&C*soi5lrw{)7z_pw!13v^rh0z#V&GZ% zY%Te_mwlSdv0B>7xBt}aPm{bVpkL=#ouBWuW~R+~A*3x-A$yYT!UzVFwY`l{_B{(K z!1^htY0Z0@>@?aEOpANzk6+3J9SD8O8Z2lu=X)#g5|pJZFs&@|vx?HmCsuy0puzJ$ z+Nt?xwyjzx@r@l^eQf;|QmOw~x%uymzDdUNAG55_& zw(6!aip!M`yI$DXXsVvCgF^HQ;|es=rS8q&i;zCTYmC=ACbJY~WXQyu`xXMu(L^W^ zF)Dn}@qiYKcr(vLU*fWrn4_CF=-SrU4RZq4EG#V8{`i^*rq>}L%oCGm4i)ftJSqno zo`Ac;DIyPIVq=88sZm|j2gd-EF~y#wQDEgChl2W=*H01pV?qc!4KsOUvhU+k=C z-KP~o@sCk5!gPTSpoGBmWEh8|SC2UaqoSDjc$}vcEhXobcS@*Qr>UY!%T8sKva+(S zv9TSubrpW1uH4Pd4YI)c`g%@w_V-psAr3QDR$&U^w0FP~)XItjaec-Dvq!`Wrk~G0c$?StTXhP(z1K%q8O! z;)^X9EJ89i<&A%o`JSbQr>Cp0?}wV!s}j?CZTpcDttU@1A&q5{^i4p<4AIfi#iXWA z?YKuWNe&GRJif2B8QT7Ie}ONMBOhCM;p)8#n&N2mvPaDI5vnQIPDVRh+d=n!$$Ya0 z&q5$wfOBQlhY!~%-fnkFA8R?c9Ese*dbWN|6ucJJzCCVVZVS*&5_A1#AXPXU9fmad z@I1oK-X2p#I)3>x5?jU(+J+JI zqUylDotubp=6)OUaki|qk;B2E zH&?4Y2>Jk&l3^UQ6Nf@w(bLz5^o)Tzq$B($cIPtg#tgi3ena;8i0d=J{z0gHxDabl z>z_F`zrnDXI|xKNJT#OLo~TRBAeI3JPc|bZMvfoQ>HUX(%{0Z$&ByP@lo?XN00!tJ z7^N zO$%(Xd4&}fKi|&)izr#GM0>6pr+R;TckgaqOj1%(?O1hMug;%b{3g@uLjU=Q-gMk1Nn2CRG93>}q}M8{)Xtprw;z*LM*(zlxT zJ1}HBM779*btvN<&p(#-O=5GLR`tm9Iw4 zrC%~&;@mX61AntUrZ}CLmJt3(9g{63#;F)+*D|<3OM$f>guiqHx96f={4yZ!h&C|n;8Kw zOzdO{104mfvVXei1#!~7pM#dNd%+DKqoY1JW}WT`)5j2iBOs+Xj|I8CK%qkB@IQ}% z(5713kN)&>pv02DW?$!Jk9PdpnAg+R&T4wG3r6f@3Lt3SCYLz=H4i3|gFrR`T{~Q5 zA0L6Cs_$Z|7bUAWj9C#m^w(u(n7^STnUX%(@E{}mRYiXBdIA#6l8iQ>Qu}u@g!R^9 zKMt!QU3!tPQ8Ug8-zz$!n=a)q^kT;WtQ07rpukvcaio09e>)1~3P|Z=?nfCK9C9Rc%bqY||lueJ?oQiC?W0#9}W zi}Ugnc;i)mJ4ZPHbuj?mX6XU@h0lAFSmC~NZ*PEQ0X|6T&?Ef;JA$cT_lizBpz&#C z0*HWlKxl-*{4@*@y~oelhgQ#?+03@S^!*;C7?YelL4I@gGQv9{g=s}5yA!$D-$ z21x??XlDYlt&tJ^Dew7+{q&Q)TM*{?X}(3!Rs+3rqt-;7GY*JI7_p=Y#{m5#f^AuY z#T0iWZ}YFG3*Wyhp`aSwf45;~_~%?3akGby@ag<5T|K?nX3*J(qtg6$j3l=QWJA7> zHNB{Vkj=`vtEZ=j2T^}$vfdqfm{H6{rsY>VpRSIM`{+cKWhXTh=pattQ%lN$qTgD> z`be|?0SMwH6HX0krKP35OPL|tUj_RMKq7R*+&i;R`sA=YoCsjse0oLR{q-wp>wrTi zuK>8Gmom4byrjuSDM(BRre-VxBr0R9?Z4DHPUL}{Ko+c8fK3J6hYw$-`TV#E>=|qz zDwek#qs;^MtfoA0W}G}c!%!LlRQ1;J&k#q;<5lNC9Y@Df-umxX)KbK>P}^X6K^e97 zah}>A>>!NvrHVr_0$OW86UrLK%Lp!F)sH`&1#VF-Q9vFz7~hr3P9fKCa?o*oph{p$ zSax`LSUwr|!2L(p{095=Fkps7VE9Zg>ZEIHTi7SLYucOgKnKLATBz$)YV<*&$(M)$ zn+KO(v{YADE1^Id4srm*&X_e}XTmw&%IIDF{F&BZP!T`A3f6Wcz8?Z2fXiyGMHz#P zD5TA`%W8LJ3_I7Nqo?Q5MJq2a5BwfTw?o2lAFMSNe*7qc-0(!jlQtIk&6_t-$8|D+ zV_>zRXff@DI*{Z3x1w$^t*qTLF!P9okb+~terIfAqR(ihy7;P4s(asq{ezhk(yloQ zn!d~&@6;{h$}KvbB*<7U#5IrwsezoOF15U%;5`d*d06G`+qbBkRBtT#;V^aS6 zO4=qqCx^S~?yyvgvEx1O^pgnS$~ovFm;};T>P^#o=lxte_O~2oa?ohwOVWoGJF64< z=b5}^ARhn{N0!3U3dOsZC3i+GQ7m;6rR`xiimR$NE9UD>d5<>ZTZWRIn+x~0775{k zeVRaX!A6ts-`r&HOQ03JkKrE5Uy4^r`=I%kVjkO<-|0-H9s zwurcvV?AKR@uqI?SPH$?r%^dA$Ha2LOBiuTM;Hhi4B1VRMV&|119rvze||cj#BUk= zyf39N{p4`b7t9B1p0u5V=7gx6i@YCY#>U1{n;D~&a#sD=X)t+e$-4Ubo?TXH0sFT8 zhZ~(q58x;dr2a;@2cemU9=> zu&wu?Xa7IP6uY;`-71I zG4Ce^%Ppj*JSQAMrj5I*A(08vU^&Z { let { x0, x1, y0, y1 } = dataValue.coordinates; diff --git a/stories/annotations/rects/1_linear_bar_chart.tsx b/stories/annotations/rects/1_linear_bar_chart.tsx index 6c43fa37a1..a466233eff 100644 --- a/stories/annotations/rects/1_linear_bar_chart.tsx +++ b/stories/annotations/rects/1_linear_bar_chart.tsx @@ -26,22 +26,24 @@ export const example = () => { const debug = boolean('debug', false); const rotation = getChartRotationKnob(); - const dataValues = [ - { - coordinates: { - x0: 0, - x1: 1, - y0: 0, - y1: 7, - }, - details: 'details about this annotation', - }, - ]; - return ( - + { ); }; + +example.story = { + parameters: { + info: { + text: `A \`\` can be used to create a rectangular annotation. +As for most chart component, the required props are: \`id\` to uniquely identify the annotation and +a \`dataValues\` prop that describes one or more annotations. + +The \`dataValues\` prop takes an array of objects adhering to the following type: + +\`\`\`ts + +interface RectAnnotationDatum { + coordinates: { + x0?: PrimitiveValue; + x1?: PrimitiveValue; + y0?: PrimitiveValue; + y1?: PrimitiveValue; + }; + details?: string; +} + +type PrimitiveValue = string | number | null; +\`\`\` + +Each coordinate value can be omitted, if omitted then the corresponding min or max value is used instead. +A text can be issued to be shown within the tooltip. If omitted, no tooltip will be shown. + +In the above example, we are using a fixed set of coordinates: +\`\`\` +coordinates: { + x0: 0, + x1: 1, + y0: 0, + y1: 7, +} +\`\`\` + +This annotation will cover the X axis starting from the \`0\` value to the \`1\` value included. The \`y\` is covered from 0 to 7. +In a barchart with linear or ordinal x scale, the interval covered by the annotation fully include the \`x0\` and \`x1\` values. +If one value is out of the relative domain, we will clip the annotation to the max/min value of the chart domain. + `, + }, + }, +}; diff --git a/stories/annotations/rects/2_ordinal_bar_chart.tsx b/stories/annotations/rects/2_ordinal_bar_chart.tsx index 4b88761297..8ab086e9fb 100644 --- a/stories/annotations/rects/2_ordinal_bar_chart.tsx +++ b/stories/annotations/rects/2_ordinal_bar_chart.tsx @@ -26,20 +26,22 @@ export const example = () => { const debug = boolean('debug', false); const rotation = getChartRotationKnob(); - const dataValues = [ - { - coordinates: { - x0: 'a', - x1: 'b', - }, - details: 'details about this annotation', - }, - ]; - return ( - + { ); }; + +example.story = { + parameters: { + info: { + text: `On Ordinal Bar charts, you can draw a rectangular annotation the same way it's done within a linear bar chart. +The annotation will cover fully the extent defined by the \`coordinate\` object, extending to the max/min domain values any +missing/out-of-range parameters. + `, + }, + }, +}; diff --git a/stories/annotations/rects/3_linear_line_chart.tsx b/stories/annotations/rects/3_linear_line_chart.tsx index ae2f969187..48eb2adc9a 100644 --- a/stories/annotations/rects/3_linear_line_chart.tsx +++ b/stories/annotations/rects/3_linear_line_chart.tsx @@ -28,7 +28,7 @@ export const example = () => { const rotation = getChartRotationKnob(); const definedCoordinate = select( - 'defined coordinate', + 'green annotation defined coordinate', { x0: 'x0', x1: 'x1', @@ -38,7 +38,7 @@ export const example = () => { 'x0', ); - const dataValues1: RectAnnotationDatum[] = [ + const dataValuesRed: RectAnnotationDatum[] = [ { coordinates: { x0: 1, @@ -46,10 +46,10 @@ export const example = () => { y0: 0, y1: 7, }, - details: 'details about this annotation', + details: 'red annotation', }, ]; - const dataValues2: RectAnnotationDatum[] = [ + const dataValuesBlue: RectAnnotationDatum[] = [ { coordinates: { x0: 2.0, @@ -57,18 +57,18 @@ export const example = () => { y0: 0, y1: 7, }, - details: 'details about this annotation', + details: 'blue annotation', }, ]; - const dataValues3: RectAnnotationDatum[] = [ + const dataValuesGreen: RectAnnotationDatum[] = [ { coordinates: { - x0: definedCoordinate === 'x0' ? 0.25 : null, - x1: definedCoordinate === 'x1' ? 2.75 : null, - y0: definedCoordinate === BandedAccessorType.Y0 ? 0.25 : null, - y1: definedCoordinate === BandedAccessorType.Y1 ? 6.75 : null, + x0: definedCoordinate === 'x0' ? 0.5 : null, + x1: definedCoordinate === 'x1' ? 2.5 : null, + y0: definedCoordinate === BandedAccessorType.Y0 ? 1.5 : null, + y1: definedCoordinate === BandedAccessorType.Y1 ? 5.5 : null, }, - details: 'can have null values', + details: 'green annotation', }, ]; @@ -83,9 +83,9 @@ export const example = () => { return ( - - - + + + { marker={

} /> + From 32dbf1fcad9cb9478f16a5851a61809679bace05 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Tue, 28 Apr 2020 17:25:59 +0200 Subject: [PATCH 7/7] refactor: rename variable --- src/chart_types/xy_chart/annotations/tooltip.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/chart_types/xy_chart/annotations/tooltip.ts b/src/chart_types/xy_chart/annotations/tooltip.ts index 1f669856cf..350f2a4430 100644 --- a/src/chart_types/xy_chart/annotations/tooltip.ts +++ b/src/chart_types/xy_chart/annotations/tooltip.ts @@ -37,11 +37,11 @@ export function computeAnnotationTooltipState( chartDimensions: Dimensions, ): AnnotationTooltipState | null { // allow picking up the last spec added as the top most or use it's zIndex value - const zIndexSortedSpecs = annotationSpecs + const sortedSpecs = annotationSpecs .slice() .reverse() .sort(({ zIndex: a = Number.MIN_SAFE_INTEGER }, { zIndex: b = Number.MIN_SAFE_INTEGER }) => b - a); - for (const spec of zIndexSortedSpecs) { + for (const spec of sortedSpecs) { const annotationDimension = annotationDimensions.get(spec.id); if (spec.hideTooltips || !annotationDimension) { continue;