From 509cf4209bfd359c2897e381980ff5e05b09ec27 Mon Sep 17 00:00:00 2001 From: Rachel Shen Date: Fri, 20 Aug 2021 08:47:48 -0600 Subject: [PATCH] fix(heatmap): limit brush tool (#1270) Closes #1216 --- ...ave-brush-tool-extend-into-axes-1-snap.png | Bin 0 -> 42845 bytes integration/tests/heatmap_stories.test.ts | 19 ++++++++ .../heatmap/renderer/dom/highlighter.tsx | 9 +++- .../heatmap/state/selectors/get_brush_area.ts | 27 +++++++++-- .../charts/src/components/brush/brush.tsx | 44 +++++++++--------- storybook/stories/heatmap/1_basic.tsx | 3 ++ 6 files changed, 74 insertions(+), 28 deletions(-) create mode 100644 integration/tests/__image_snapshots__/heatmap-stories-test-ts-heatmap-stories-should-not-have-brush-tool-extend-into-axes-1-snap.png create mode 100644 integration/tests/heatmap_stories.test.ts diff --git a/integration/tests/__image_snapshots__/heatmap-stories-test-ts-heatmap-stories-should-not-have-brush-tool-extend-into-axes-1-snap.png b/integration/tests/__image_snapshots__/heatmap-stories-test-ts-heatmap-stories-should-not-have-brush-tool-extend-into-axes-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..926f57f8f44e6ed3d4b39466b85c5b7f17f469b1 GIT binary patch literal 42845 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 literal 0 HcmV?d00001 diff --git a/integration/tests/heatmap_stories.test.ts b/integration/tests/heatmap_stories.test.ts new file mode 100644 index 0000000000..706b6e2686 --- /dev/null +++ b/integration/tests/heatmap_stories.test.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { common } from '../page_objects'; + +describe('Heatmap stories', () => { + it('should not have brush tool extend into axes', async () => { + await common.expectChartWithDragAtUrlToMatchScreenshot( + 'http://localhost:9001/?path=/story/heatmap-alpha--basic', + { left: 100, top: 100 }, + { left: 300, top: 300 }, + ); + }); +}); diff --git a/packages/charts/src/chart_types/heatmap/renderer/dom/highlighter.tsx b/packages/charts/src/chart_types/heatmap/renderer/dom/highlighter.tsx index 61f3f0a7cb..f2971fdd84 100644 --- a/packages/charts/src/chart_types/heatmap/renderer/dom/highlighter.tsx +++ b/packages/charts/src/chart_types/heatmap/renderer/dom/highlighter.tsx @@ -40,11 +40,11 @@ export const HighlighterCellsComponent: FC = ({ if (!initialized || dragShape === null) return null; const maskId = `echHighlighterMask__${chartId}`; - return ( + {/* the entire chart */} {brushMask.visible && ( = ({ )} {brushArea.visible && ( <> + {/* the rectangle box */} = ({ height={dragShape.height} fill={brushArea.fill} /> + {/* the left axis labels */} = ({ + {/* the entire chart */} {brushMask.visible && ( = ({ )} {brushArea.visible && ( <> + {/* top line for the box */} = ({ stroke={brushArea.stroke} strokeWidth={brushArea.strokeWidth} /> + {/* bottom line */} = ({ stroke={brushArea.stroke} strokeWidth={brushArea.strokeWidth} /> + {/* left line */} = ({ stroke={brushArea.stroke} strokeWidth={brushArea.strokeWidth} /> + {/* right line */} state.interactions.pointer.down; const getIsDragging = (state: GlobalChartState) => state.interactions.pointer.dragging; @@ -24,22 +26,37 @@ export const getBrushAreaSelector = createCustomCachedSelector( getIsDragging, getMouseDownPosition, getCurrentPointerPosition, - getChartRotationSelector, getSettingsSpecSelector, computeChartDimensionsSelector, + getBrushedHighlightedShapesSelector, + getGridHeightParamsSelector, ], - (isDragging, mouseDownPosition, end, chartRotation, { brushAxis }, chartDimensions): Dimensions | null => { - if (!isDragging || !mouseDownPosition) { + (isDragging, mouseDownPosition, end, { brushAxis }, chartDimensions, dragShape, gridParams): Dimensions | null => { + if (!isDragging || !mouseDownPosition || !dragShape) { return null; } const start = { x: mouseDownPosition.position.x - chartDimensions.left, y: mouseDownPosition.position.y, }; + + const clampedEndY = clamp(end.y, 0, gridParams.gridCellHeight * gridParams.pageSize); + switch (brushAxis) { case BrushAxis.Both: + return { + top: start.y, + left: start.x, + width: end.x - start.x - chartDimensions.left, + height: clampedEndY - start.y, + }; default: - return { top: start.y, left: start.x, width: end.x - start.x - chartDimensions.left, height: end.y - start.y }; + return { + top: start.y, + left: start.x, + width: end.x - start.x - chartDimensions.left, + height: clampedEndY - start.y, + }; } }, ); diff --git a/packages/charts/src/components/brush/brush.tsx b/packages/charts/src/components/brush/brush.tsx index 4d3e9aefb5..84cd9011fd 100644 --- a/packages/charts/src/components/brush/brush.tsx +++ b/packages/charts/src/components/brush/brush.tsx @@ -78,6 +78,28 @@ class BrushToolComponent extends React.Component { } } + render() { + const { initialized, isBrushAvailable, isBrushing, projectionContainer, zIndex } = this.props; + if (!initialized || !isBrushAvailable || !isBrushing) { + this.ctx = null; + return null; + } + const { width, height } = projectionContainer; + return ( + + ); + } + private drawCanvas = () => { const { brushArea, mainProjectionArea, fillColor } = this.props; const { ctx } = this; @@ -113,28 +135,6 @@ class BrushToolComponent extends React.Component { const canvas = this.canvasRef.current; this.ctx = canvas && canvas.getContext('2d'); } - - render() { - const { initialized, isBrushAvailable, isBrushing, projectionContainer, zIndex } = this.props; - if (!initialized || !isBrushAvailable || !isBrushing) { - this.ctx = null; - return null; - } - const { width, height } = projectionContainer; - return ( - - ); - } } const mapStateToProps = (state: GlobalChartState): StateProps => { diff --git a/storybook/stories/heatmap/1_basic.tsx b/storybook/stories/heatmap/1_basic.tsx index 2c8ecb7608..ac5bd978df 100644 --- a/storybook/stories/heatmap/1_basic.tsx +++ b/storybook/stories/heatmap/1_basic.tsx @@ -41,6 +41,9 @@ export const Example = () => { const config: RecursivePartial = useMemo( () => ({ + brushTool: { + visible: true, + }, grid: { cellHeight: { min: 20,