From ec62c896c6977907c11a703a0ed52b36ba59405d Mon Sep 17 00:00:00 2001 From: nickofthyme Date: Wed, 10 Feb 2021 14:05:12 -0600 Subject: [PATCH] feat: sort values in actions by closest to cursor --- ...d-hovers-visually-looks-correct-1-snap.png | Bin 24383 -> 30516 bytes .../get_elements_at_cursor_pos.test.ts | 98 +++++++++++++++++ .../selectors/get_elements_at_cursor_pos.ts | 15 +-- .../xy_chart/state/utils/common.test.ts | 100 ++++++++++++++++-- .../xy_chart/state/utils/common.ts | 11 +- src/utils/common.ts | 5 +- stories/interactions/3_line_point_clicks.tsx | 15 ++- 7 files changed, 229 insertions(+), 15 deletions(-) create mode 100644 src/chart_types/xy_chart/state/selectors/get_elements_at_cursor_pos.test.ts diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-interactions-line-point-clicks-and-hovers-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-interactions-line-point-clicks-and-hovers-visually-looks-correct-1-snap.png index b49ab72d60331904c6c539d19bccde5ca93afc00..970d228afc9769df496f72da893381200f28fd9b 100644 GIT binary patch literal 30516 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

>#<*%DVNde!C+ybOFdC~Pw%bOen0xF4c1=51 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 APyhe` literal 24383 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

>O}j7AB0lSxcw->k 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%0D8Q(%oBVj%+?)2dTPz2!L;wE{C zoZ0N&insn23Cwkq^P`0tcq6!+)X=G$cm}VzObM-WmF%W$K+}G1Pp`RH2+Ja_M(aj zR*H;IE+`ra<>}_PZ6Ra=N)f#qnDG#6gBE=|)#>qxD`?XgW`;K2ns10Fs$VvWYIoCY(3fc6@o(Gat#d^?K|+L(&s;9Sa(B~zw^(?J8^5*bhn?CtE* zS8u+wcf~5{R${o0j#=oZBO%H-1a*-(S%8rdIp*wvghh&!)KVl%_UBtOkUZxdd1{_h z{V!P=&}mE;f2~6hX6w1%s+}8967=^E;dM1MH-ngzptCts-=p~~2n29Qt6>K{J$QP+ zvo1o0m4OdC3=Hhi%hw*zVwwfi?TtbTw(*7BpozCR;8NBRCri5+C2sYy7?P2LB9r+U zuH+Gjbsjz|?z!|hdXrHaSuxCX+$;gW&+7i}Be+(6ZP zO8j94LJ~w}Rz^i{_;G*)SWQPsie>6-!S&TZ4t31y4X& z$2gQbP@cQ?BtR?K4zz;b2kz#Vdh!Vp1UdukGF_VOBk#r~WZaO-gV64jys#hkb%%)5 zL{i71?CJEka^k^NQlDJzomh@51y#z)&OSs8-a2JZj(TdSEh}(w_B@pbc&19-vSkaw z3aU9A&U|t6PkLs!HQ3DA3vWMc_J&;o=mAHvGC+(GPI3`4mvrH~e4F2k7$TGiodsRt zfN~J3JQr$4<-u#KQmwN}UY|RcNMVNGNc;dkLVO?^5mG?4u)kg65l1dYBk>;25>XEg#h&9RRX>qnY16;U&c8vLc# zg|~NO%FY@+Y&tXTvGzw4xFPevz*&d|+RUFY)j5WCOm!G4zAcS*7u->eis@&?)h_3% z>PIoxwz#;s^uj1jJbsR8Cs`7gh0OSk_i`x@_CThM8P|f}D6E~&#jV&MJ-VGra0dEc z4Lq7R)ri`UcY)L?Dk(YOnL)vKBF{|b>$hJ}M>+~q!B)#~yP!hfkUNAphV+EMzf$;0 zzXeF%8p%NpzM>4qZ#wm28zBQsxy7D~y*)cx(%oObg>ut3i4sdQFHzHhfPj*e@Oe+@ zyry&gcYt(kVadb-$ba>XuJGy9Q#SJdGnGmO0pi0@)u=^9Mae9Asa9PYZy9|OV;pml zL?D7N?uxNAH>j4}t5l0D%>A22Y(v!IM2;6)OWAdQegC^!G#%0S=aI zNJLoz@tP`O!XH2k1=DjvbVhigIgP}{Xl0YnRa6R5(pOz)`aZ!MGC#rHfm8idv8a&g zfU^}Fsd-`+!Ea7KMx_u=|3KshOg%) za`Nq_mP;9*(Fb)j`GmwC$*KQ0%k`h-hkq*7ixi0>+bLGP6w;@Z6!oC>p9}V%xcU#O Cq@gMR diff --git a/src/chart_types/xy_chart/state/selectors/get_elements_at_cursor_pos.test.ts b/src/chart_types/xy_chart/state/selectors/get_elements_at_cursor_pos.test.ts new file mode 100644 index 0000000000..6847e8a1dc --- /dev/null +++ b/src/chart_types/xy_chart/state/selectors/get_elements_at_cursor_pos.test.ts @@ -0,0 +1,98 @@ +/* + * 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 { Store } from 'redux'; + +import { MockGlobalSpec, MockSeriesSpec } from '../../../../mocks/specs/specs'; +import { MockStore } from '../../../../mocks/store/store'; +import { ScaleType } from '../../../../scales/constants'; +import { onPointerMove } from '../../../../state/actions/mouse'; +import { GlobalChartState } from '../../../../state/chart_state'; +import { getElementAtCursorPositionSelector } from './get_elements_at_cursor_pos'; + +const data = [ + { x: 0, y: 2 }, + { x: 0, y: 2.2 }, + { x: 1, y: 2 }, + { x: 2, y: 3 }, +]; + +describe('getElementAtCursorPositionSelector', () => { + let store: Store; + + describe('Area', () => { + beforeEach(() => { + store = MockStore.default({ width: 300, height: 300, top: 0, left: 0 }, 'chartId'); + MockStore.addSpecs( + [ + MockGlobalSpec.settingsNoMargins(), + MockSeriesSpec.area({ + data, + xScaleType: ScaleType.Ordinal, + }), + ], + store, + ); + }); + + it('should correctly sort matched points near y = 2', () => { + store.dispatch(onPointerMove({ x: 0, y: 100 }, 0)); + const elements = getElementAtCursorPositionSelector(store.getState()); + expect(elements).toHaveLength(2); + expect(elements.map(({ value }) => value.datum.y)).toEqual([2, 2.2]); + }); + + it('should correctly sort matched points near y = 2.2', () => { + store.dispatch(onPointerMove({ x: 0, y: 80 }, 0)); + const elements = getElementAtCursorPositionSelector(store.getState()); + expect(elements).toHaveLength(2); + expect(elements.map(({ value }) => value.datum.y)).toEqual([2.2, 2]); + }); + }); + + describe('Bubble', () => { + beforeEach(() => { + store = MockStore.default({ width: 300, height: 300, top: 0, left: 0 }, 'chartId'); + MockStore.addSpecs( + [ + MockGlobalSpec.settingsNoMargins(), + MockSeriesSpec.bubble({ + data, + xScaleType: ScaleType.Ordinal, + }), + ], + store, + ); + }); + + it('should correctly sort matched points near y = 2', () => { + store.dispatch(onPointerMove({ x: 0, y: 100 }, 0)); + const elements = getElementAtCursorPositionSelector(store.getState()); + expect(elements).toHaveLength(3); + expect(elements.map(({ value }) => value.datum.y)).toEqual([2, 2.2, 2]); + }); + + it('should correctly sort matched points near y = 2.2', () => { + store.dispatch(onPointerMove({ x: 0, y: 80 }, 0)); + const elements = getElementAtCursorPositionSelector(store.getState()); + expect(elements).toHaveLength(4); + expect(elements.map(({ value }) => value.datum.y)).toEqual([2.2, 2, 2, 3]); + }); + }); +}); diff --git a/src/chart_types/xy_chart/state/selectors/get_elements_at_cursor_pos.ts b/src/chart_types/xy_chart/state/selectors/get_elements_at_cursor_pos.ts index 4966e32f4c..e2ad8e77a8 100644 --- a/src/chart_types/xy_chart/state/selectors/get_elements_at_cursor_pos.ts +++ b/src/chart_types/xy_chart/state/selectors/get_elements_at_cursor_pos.ts @@ -26,6 +26,7 @@ import { isValidPointerOverEvent } from '../../../../utils/events'; import { IndexedGeometry } from '../../../../utils/geometry'; import { ChartDimensions } from '../../utils/dimensions'; import { IndexedGeometryMap } from '../../utils/indexed_geometry_map'; +import { sortClosestToPoint } from '../utils/common'; import { ComputedScales } from '../utils/types'; import { computeChartDimensionsSelector } from './compute_chart_dimensions'; import { getComputedScalesSelector } from './get_computed_scales'; @@ -71,10 +72,12 @@ function getElementAtCursorPosition( return []; } // get the elements at cursor position - return geometriesIndex.find( - xValue?.value, - orientedProjectedPointerPosition, - orientedProjectedPointerPosition.horizontalPanelValue, - orientedProjectedPointerPosition.verticalPanelValue, - ); + return geometriesIndex + .find( + xValue?.value, + orientedProjectedPointerPosition, + orientedProjectedPointerPosition.horizontalPanelValue, + orientedProjectedPointerPosition.verticalPanelValue, + ) + .sort(sortClosestToPoint(orientedProjectedPointerPosition)); } diff --git a/src/chart_types/xy_chart/state/utils/common.test.ts b/src/chart_types/xy_chart/state/utils/common.test.ts index 9924025159..938498a978 100644 --- a/src/chart_types/xy_chart/state/utils/common.test.ts +++ b/src/chart_types/xy_chart/state/utils/common.test.ts @@ -22,6 +22,7 @@ import { LegendItem } from '../../../../common/legend'; import { ScaleType } from '../../../../scales/constants'; import { SpecTypes } from '../../../../specs'; import { BARCHART_1Y1G } from '../../../../utils/data_samples/test_dataset'; +import { Point } from '../../../../utils/point'; import { AreaSeriesSpec, SeriesTypes, LineSeriesSpec, BarSeriesSpec } from '../../utils/specs'; import { isHorizontalRotation, @@ -29,10 +30,11 @@ import { isLineAreaOnlyChart, isChartAnimatable, isAllSeriesDeselected, + sortClosestToPoint, } from './common'; describe('Type Checks', () => { - test('is horizontal chart rotation', () => { + it('is horizontal chart rotation', () => { expect(isHorizontalRotation(0)).toBe(true); expect(isHorizontalRotation(180)).toBe(true); expect(isHorizontalRotation(-90)).toBe(false); @@ -42,7 +44,7 @@ describe('Type Checks', () => { expect(isVerticalRotation(0)).toBe(false); expect(isVerticalRotation(180)).toBe(false); }); - test('is vertical chart rotation', () => { + it('is vertical chart rotation', () => { expect(isVerticalRotation(-90)).toBe(true); expect(isVerticalRotation(90)).toBe(true); expect(isVerticalRotation(0)).toBe(false); @@ -50,7 +52,7 @@ describe('Type Checks', () => { }); describe('#isLineAreaOnlyChart', () => { - test('is an area or line only map', () => { + it('is an area or line only map', () => { const area: AreaSeriesSpec = { chartType: ChartTypes.XYAxis, specType: SpecTypes.Series, @@ -106,7 +108,7 @@ describe('Type Checks', () => { }); describe('#isChartAnimatable', () => { - test('can enable the chart animation if we have a valid number of elements', () => { + it('can enable the chart animation if we have a valid number of elements', () => { const geometriesCounts = { points: 0, bars: 0, @@ -131,7 +133,7 @@ describe('Type Checks', () => { }); }); - test('displays no data available if chart is empty', () => { + it('displays no data available if chart is empty', () => { const legendItems1: LegendItem[] = [ { color: '#1EA593', @@ -158,7 +160,7 @@ describe('Type Checks', () => { ]; expect(isAllSeriesDeselected(legendItems1)).toBe(true); }); - test('displays data availble if chart is not empty', () => { + it('displays data availble if chart is not empty', () => { const legendItems2: LegendItem[] = [ { color: '#1EA593', @@ -185,4 +187,90 @@ describe('Type Checks', () => { ]; expect(isAllSeriesDeselected(legendItems2)).toBe(false); }); + + describe('#sortClosestToPoint', () => { + describe('positive cursor', () => { + const cursor: Point = { x: 10, y: 10 }; + + it('should sort points with same x', () => { + const points: Point[] = [ + { x: 10, y: -10 }, + { x: 10, y: 12 }, + { x: 10, y: 11 }, + { x: 10, y: 10 }, + { x: 10, y: 5 }, + { x: 10, y: -12 }, + ]; + expect(points.sort(sortClosestToPoint(cursor))).toEqual([ + { x: 10, y: 10 }, + { x: 10, y: 11 }, + { x: 10, y: 12 }, + { x: 10, y: 5 }, + { x: 10, y: -10 }, + { x: 10, y: -12 }, + ]); + }); + + it('should sort points with different x', () => { + const points: Point[] = [ + { x: 9, y: -10 }, + { x: -6, y: 12 }, + { x: 3, y: 11 }, + { x: 9, y: 10 }, + { x: 1, y: 5 }, + { x: -9, y: -12 }, + ]; + expect(points.sort(sortClosestToPoint(cursor))).toEqual([ + { x: 9, y: 10 }, + { x: 3, y: 11 }, + { x: 1, y: 5 }, + { x: -6, y: 12 }, + { x: 9, y: -10 }, + { x: -9, y: -12 }, + ]); + }); + }); + + describe('negative cursor', () => { + const cursor: Point = { x: -10, y: -10 }; + + it('should sort points with same x', () => { + const points: Point[] = [ + { x: 10, y: -10 }, + { x: 10, y: 12 }, + { x: 10, y: 11 }, + { x: 10, y: 10 }, + { x: 10, y: 5 }, + { x: 10, y: -12 }, + ]; + expect(points.sort(sortClosestToPoint(cursor))).toEqual([ + { x: 10, y: -10 }, + { x: 10, y: -12 }, + { x: 10, y: 5 }, + { x: 10, y: 10 }, + { x: 10, y: 11 }, + { x: 10, y: 12 }, + ]); + }); + + it('should sort points with different x', () => { + const points: Point[] = [ + { x: 9, y: -10 }, + { x: -6, y: 12 }, + { x: 3, y: 11 }, + { x: 9, y: 10 }, + { x: 1, y: 5 }, + { x: -9, y: -12 }, + ]; + expect(points.sort(sortClosestToPoint(cursor))).toEqual([ + { x: -9, y: -12 }, + { x: 1, y: 5 }, + { x: 9, y: -10 }, + { x: -6, y: 12 }, + { x: 3, y: 11 }, + { x: 9, y: 10 }, + ]); + }); + }); + }); }); diff --git a/src/chart_types/xy_chart/state/utils/common.ts b/src/chart_types/xy_chart/state/utils/common.ts index a5edb6299b..63a762b420 100644 --- a/src/chart_types/xy_chart/state/utils/common.ts +++ b/src/chart_types/xy_chart/state/utils/common.ts @@ -18,7 +18,8 @@ */ import { LegendItem } from '../../../../common/legend'; -import { Rotation } from '../../../../utils/common'; +import { getDistance, Rotation } from '../../../../utils/common'; +import { Point } from '../../../../utils/point'; import { BasicSeriesSpec, SeriesTypes } from '../../utils/specs'; import { GeometriesCounts } from './types'; @@ -64,3 +65,11 @@ export function isAllSeriesDeselected(legendItems: LegendItem[]): boolean { } return true; } + +/** + * Sorts points in order from closest to farthest from cursor + * @internal + */ +export const sortClosestToPoint = (cursor: Point) => (a: Point, b: Point): number => { + return getDistance(cursor, a) - getDistance(cursor, b); +}; diff --git a/src/utils/common.ts b/src/utils/common.ts index 121a26562b..302f327106 100644 --- a/src/utils/common.ts +++ b/src/utils/common.ts @@ -426,7 +426,10 @@ export type ValueAccessor = (d: Datum) => number; export type LabelAccessor = (value: PrimitiveValue) => string; export type ShowAccessor = (value: PrimitiveValue) => boolean; -/** @internal */ +/** + * Returns planar distance bewtween two points + * @internal + */ export function getDistance(a: Point, b: Point): number { return Math.sqrt(Math.pow(b.x - a.x, 2) + Math.pow(b.y - a.y, 2)); } diff --git a/stories/interactions/3_line_point_clicks.tsx b/stories/interactions/3_line_point_clicks.tsx index 7f0b8abb67..4787ebd0de 100644 --- a/stories/interactions/3_line_point_clicks.tsx +++ b/stories/interactions/3_line_point_clicks.tsx @@ -35,7 +35,7 @@ export const Example = () => ( Number(d).toFixed(2)} /> ( { x: 3, y: 6 }, ]} /> + );