From fd6b7dfcc922d66a7aba5f782bdbc3f66b480566 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Tue, 9 Jun 2020 23:21:20 +0200 Subject: [PATCH 01/15] feat: show external tooltip --- .playground/index.html | 25 +-- .playground/playground.tsx | 154 ++++++++++++++++-- .../state/selectors/get_cursor_band.ts | 4 +- .../state/selectors/is_tooltip_visible.ts | 14 +- src/components/chart.tsx | 2 +- src/components/legend/legend.tsx | 85 +++++----- src/components/portal/tooltip_portal.tsx | 6 +- src/components/tooltip/tooltip.tsx | 10 +- src/mocks/specs/specs.ts | 2 + src/specs/settings.tsx | 40 ++++- src/state/selectors/get_tooltip_settings.ts | 45 +++++ .../selectors/has_external_pointer_event.ts | 25 +++ .../selectors/is_external_tooltip_visible.ts | 30 ++++ 13 files changed, 355 insertions(+), 87 deletions(-) create mode 100644 src/state/selectors/get_tooltip_settings.ts create mode 100644 src/state/selectors/has_external_pointer_event.ts create mode 100644 src/state/selectors/is_external_tooltip_visible.ts diff --git a/.playground/index.html b/.playground/index.html index 4ac6cbb760..1d04c65d57 100644 --- a/.playground/index.html +++ b/.playground/index.html @@ -9,28 +9,15 @@ html, body { background: blanchedalmond !important; - /*margin-left: 8px !important;*/ - /*padding: 8px !important;*/ - /*height: 100%;*/ - /*width: 2000px; - } - #root { - position: absolute; - /* - top: 0; - left: 0; -*/ - /* width: 100%; - height: 100%;*/ - /* overflow-x: hidden; */ } + .chart { background: white; /*display: inline-block; position: relative; */ - width: 100%; - height: 500px; + width: 500px; + height: 200px; overflow: auto; } @@ -40,14 +27,18 @@ width: 100%; overflow: auto; } + .page { - padding: 100px; + padding: 10px; + padding-top: 300px; } + label { display: block; } +
diff --git a/.playground/playground.tsx b/.playground/playground.tsx index d123c98912..45b0689ee0 100644 --- a/.playground/playground.tsx +++ b/.playground/playground.tsx @@ -17,16 +17,150 @@ * under the License. */ -import React from 'react'; +import React, { useState } from 'react'; -import { Example } from '../stories/treemap/6_custom_style'; +import { Chart, Settings, Axis, Position, BarSeries, ScaleType, PointerEvent, LineSeries } from '../src'; +import { KIBANA_METRICS } from '../src/utils/data_samples/test_dataset_kibana'; -export class Playground extends React.Component { - render() { - return ( -
-
{Example()}
+export const Playground = () => { + const ref1 = React.createRef(); + const ref2 = React.createRef(); + const ref3 = React.createRef(); + const ref4 = React.createRef(); + + const pointerUpdate = (event: PointerEvent) => { + if (ref1.current) { + ref1.current.dispatchExternalPointerEvent(event); + } + if (ref2.current) { + ref2.current.dispatchExternalPointerEvent(event); + } + if (ref3.current) { + ref3.current.dispatchExternalPointerEvent(event); + } + if (ref4.current) { + ref4.current.dispatchExternalPointerEvent(event); + } + }; + const [show, toggleVisibility] = useState(true); + return ( +
+ + +
+ + + + Number(d).toFixed(2)} /> + + + + +
+ + { + show && ( +
+ + + + Number(d).toFixed(2)} /> + + + + +
+ ) + } + +
+ + + + Number(d).toFixed(2)} /> + + + + +
+ +
+ + + + Number(d).toFixed(2)} /> + + + +
- ); - } -} +
+ ); +}; diff --git a/src/chart_types/xy_chart/state/selectors/get_cursor_band.ts b/src/chart_types/xy_chart/state/selectors/get_cursor_band.ts index f456717597..47d83f5878 100644 --- a/src/chart_types/xy_chart/state/selectors/get_cursor_band.ts +++ b/src/chart_types/xy_chart/state/selectors/get_cursor_band.ts @@ -96,8 +96,7 @@ function getCursorBand( let xValue; if (isValidPointerOverEvent(xScale, externalPointerEvent)) { const x = xScale.pureScale(externalPointerEvent.value); - - if (x == null || x > chartDimensions.width + chartDimensions.left) { + if (x == null || x > chartDimensions.width || x < 0) { return; } pointerPosition = { x, y: 0 }; @@ -111,6 +110,7 @@ function getCursorBand( return; } } + return getCursorBandPosition( settingsSpec.rotation, chartDimensions, diff --git a/src/chart_types/xy_chart/state/selectors/is_tooltip_visible.ts b/src/chart_types/xy_chart/state/selectors/is_tooltip_visible.ts index 173bfa280b..e45502df54 100644 --- a/src/chart_types/xy_chart/state/selectors/is_tooltip_visible.ts +++ b/src/chart_types/xy_chart/state/selectors/is_tooltip_visible.ts @@ -24,35 +24,39 @@ import { TooltipType, getTooltipType } from '../../../../specs'; import { GlobalChartState, PointerStates } from '../../../../state/chart_state'; import { getChartIdSelector } from '../../../../state/selectors/get_chart_id'; import { getSettingsSpecSelector } from '../../../../state/selectors/get_settings_specs'; +import { isExternalTooltipVisibleSelector } from '../../../../state/selectors/is_external_tooltip_visible'; import { Point } from '../../../../utils/point'; import { getProjectedPointerPositionSelector } from './get_projected_pointer_position'; import { getTooltipInfoSelector } from './get_tooltip_values_highlighted_geoms'; import { isAnnotationTooltipVisibleSelector } from './is_annotation_tooltip_visible'; -const hasTooltipTypeDefinedSelector = (state: GlobalChartState): TooltipType | undefined => getTooltipType(getSettingsSpecSelector(state)); +const getTooltipTypeSelector = (state: GlobalChartState): TooltipType => getTooltipType(getSettingsSpecSelector(state)); const getPointerSelector = (state: GlobalChartState) => state.interactions.pointer; + /** @internal */ export const isTooltipVisibleSelector = createCachedSelector( [ - hasTooltipTypeDefinedSelector, + getTooltipTypeSelector, getPointerSelector, getProjectedPointerPositionSelector, getTooltipInfoSelector, isAnnotationTooltipVisibleSelector, + isExternalTooltipVisibleSelector, ], isTooltipVisible, )(getChartIdSelector); function isTooltipVisible( - tooltipType: TooltipType | undefined, + tooltipType: TooltipType, pointer: PointerStates, projectedPointerPosition: Point, tooltip: TooltipInfo, isAnnotationTooltipVisible: boolean, + externalTooltipVisible: boolean, ) { - return ( + const isLocalTooltop = ( tooltipType !== TooltipType.None && pointer.down === null && projectedPointerPosition.x > -1 @@ -60,4 +64,6 @@ function isTooltipVisible( && tooltip.values.length > 0 && !isAnnotationTooltipVisible ); + + return isLocalTooltop || externalTooltipVisible; } diff --git a/src/components/chart.tsx b/src/components/chart.tsx index 7fe2ae72ff..abebd6df9d 100644 --- a/src/components/chart.tsx +++ b/src/components/chart.tsx @@ -68,7 +68,7 @@ export class Chart extends React.Component { this.chartContainerRef = createRef(); this.chartStageRef = createRef(); - const id = uuid.v4(); + const id = props.id ?? uuid.v4(); const storeReducer = chartStoreReducer(id); const enhancers = typeof window !== 'undefined' && (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ trace: true, name: `@elastic/charts (id: ${id})` })() diff --git a/src/components/legend/legend.tsx b/src/components/legend/legend.tsx index 364655b795..4a8b320470 100644 --- a/src/components/legend/legend.tsx +++ b/src/components/legend/legend.tsx @@ -68,57 +68,52 @@ interface LegendDispatchProps { setTemporaryColor: typeof setTemporaryColor; setPersistedColor: typeof setPersistedColor; } -type LegendProps = LegendStateProps & LegendDispatchProps; /** * @internal */ -export class LegendComponent extends React.Component { - static displayName = 'Legend'; - - render() { - const { - items, - position, - size, - debug, - chartTheme: { chartMargins, legend }, - } = this.props; - if (items.length === 0) { - return null; - } - const legendContainerStyle = getLegendStyle(position, size); - const legendListStyle = getLegendListStyle(position, chartMargins, legend); - const legendClasses = classNames('echLegend', `echLegend--${position}`, { - 'echLegend--debug': debug, - }); +export function LegendComponent(props: LegendStateProps & LegendDispatchProps) { + const { + items, + position, + size, + debug, + chartTheme: { chartMargins, legend }, + } = props; + if (items.length === 0) { + return null; + } + const legendContainerStyle = getLegendStyle(position, size); + const legendListStyle = getLegendListStyle(position, chartMargins, legend); + const legendClasses = classNames('echLegend', `echLegend--${position}`, { + 'echLegend--debug': debug, + }); - const itemProps: Omit = { - position, - totalItems: items.length, - extraValues: this.props.extraValues, - showExtra: this.props.showExtra, - onMouseOut: this.props.onItemOut, - onMouseOver: this.props.onItemOver, - onClick: this.props.onItemClick, - clearTemporaryColorsAction: this.props.clearTemporaryColors, - setPersistedColorAction: this.props.setPersistedColor, - setTemporaryColorAction: this.props.setTemporaryColor, - mouseOutAction: this.props.onItemOutAction, - mouseOverAction: this.props.onItemOverAction, - toggleDeselectSeriesAction: this.props.onToggleDeselectSeriesAction, - colorPicker: this.props.colorPicker, - }; - return ( -
-
-
    - {items.map((item, index) => renderLegendItem(item, itemProps, items.length, index))} -
-
+ const itemProps: Omit = { + position, + totalItems: items.length, + extraValues: props.extraValues, + showExtra: props.showExtra, + onMouseOut: props.onItemOut, + onMouseOver: props.onItemOver, + onClick: props.onItemClick, + clearTemporaryColorsAction: props.clearTemporaryColors, + setPersistedColorAction: props.setPersistedColor, + setTemporaryColorAction: props.setTemporaryColor, + mouseOutAction: props.onItemOutAction, + mouseOverAction: props.onItemOverAction, + toggleDeselectSeriesAction: props.onToggleDeselectSeriesAction, + colorPicker: props.colorPicker, + }; + return ( +
+
+
    + {items.map((item, index) => renderLegendItem(item, itemProps, items.length, index))} +
- ); - } +
+ ); } const mapDispatchToProps = (dispatch: Dispatch): LegendDispatchProps => diff --git a/src/components/portal/tooltip_portal.tsx b/src/components/portal/tooltip_portal.tsx index 3a98b0f48e..ffe9e5999d 100644 --- a/src/components/portal/tooltip_portal.tsx +++ b/src/components/portal/tooltip_portal.tsx @@ -73,7 +73,7 @@ const TooltipPortalComponent = ({ anchor, scope, settings, children, visible, ch * This must not be removed from DOM throughout life of this component. * Otherwise the portal will loose reference to the correct node. */ - const portalNode = useRef(getOrCreateNode(`echTooltipPortal${scope}`)); + const portalNode = useRef(getOrCreateNode(`echTooltipPortal${scope}__${chartId}`)); /** * Popper instance used to manage position of tooltip. @@ -200,7 +200,9 @@ const TooltipPortalComponent = ({ anchor, scope, settings, children, visible, ch } }, [updateAnchorDimensions, popper]); - return createPortal(
{children}
, portalNode.current); + const className = classNames({ invisible }); + + return createPortal(
{children}
, portalNode.current); }; TooltipPortalComponent.displayName = 'TooltipPortal'; diff --git a/src/components/tooltip/tooltip.tsx b/src/components/tooltip/tooltip.tsx index 8b776b6dbd..1f4456a1db 100644 --- a/src/components/tooltip/tooltip.tsx +++ b/src/components/tooltip/tooltip.tsx @@ -23,21 +23,21 @@ import { connect } from 'react-redux'; import { bindActionCreators, Dispatch } from 'redux'; import { TooltipValueFormatter, TooltipSettings, TooltipValue } from '../../specs'; -import { onPointerMove } from '../../state/actions/mouse'; +import { onPointerMove as onPointerMoveAction } from '../../state/actions/mouse'; import { GlobalChartState, BackwardRef } from '../../state/chart_state'; import { getChartRotationSelector } from '../../state/selectors/get_chart_rotation'; import { getInternalIsInitializedSelector } from '../../state/selectors/get_internal_is_intialized'; import { getInternalIsTooltipVisibleSelector } from '../../state/selectors/get_internal_is_tooltip_visible'; import { getInternalTooltipAnchorPositionSelector } from '../../state/selectors/get_internal_tooltip_anchor_position'; import { getInternalTooltipInfoSelector } from '../../state/selectors/get_internal_tooltip_info'; -import { getSettingsSpecSelector } from '../../state/selectors/get_settings_specs'; import { getTooltipHeaderFormatterSelector } from '../../state/selectors/get_tooltip_header_formatter'; +import { getTooltipSettings } from '../../state/selectors/get_tooltip_settings'; import { Rotation } from '../../utils/commons'; import { TooltipPortal, PopperSettings, AnchorPosition, Placement } from '../portal'; import { TooltipInfo, TooltipAnchorPosition } from './types'; interface TooltipDispatchProps { - onPointerMove: typeof onPointerMove; + onPointerMove: typeof onPointerMoveAction; } interface TooltipStateProps { @@ -207,7 +207,7 @@ const HIDDEN_TOOLTIP_PROPS = { }; const mapDispatchToProps = (dispatch: Dispatch): TooltipDispatchProps => - bindActionCreators({ onPointerMove }, dispatch); + bindActionCreators({ onPointerMove: onPointerMoveAction }, dispatch); const mapStateToProps = (state: GlobalChartState): TooltipStateProps => { if (!getInternalIsInitializedSelector(state)) { @@ -218,7 +218,7 @@ const mapStateToProps = (state: GlobalChartState): TooltipStateProps => { info: getInternalTooltipInfoSelector(state), position: getInternalTooltipAnchorPositionSelector(state), headerFormatter: getTooltipHeaderFormatterSelector(state), - settings: getSettingsSpecSelector(state).tooltip, + settings: getTooltipSettings(state), rotation: getChartRotationSelector(state), chartId: state.chartId, }; diff --git a/src/mocks/specs/specs.ts b/src/mocks/specs/specs.ts index ed6da43eca..15bb4fcb9b 100644 --- a/src/mocks/specs/specs.ts +++ b/src/mocks/specs/specs.ts @@ -281,6 +281,8 @@ export class MockGlobalSpec { type: TooltipType.VerticalCursor, snap: true, }, + externalPointerEvents: { + }, legendPosition: Position.Right, showLegendExtra: true, hideDuplicateAxes: false, diff --git a/src/specs/settings.tsx b/src/specs/settings.tsx index 27f3d9e825..0f3a0df47d 100644 --- a/src/specs/settings.tsx +++ b/src/specs/settings.tsx @@ -230,6 +230,34 @@ export interface TooltipProps { */ export type TooltipSettings = TooltipType | TooltipProps; +/** + * The settings for handling external events. + * @alpha + */ +export interface ExternalPointerEventsSettings { + tooltip?: { + /** + * `true` to show the tooltip when the chart receive an + * external pointer event, 'false' to hide the tooltip. + * @defaultValue `false` + */ + visible?: boolean; + /** + * {@inheritDoc TooltipProps.placement} + */ + placement?: Placement; + /** + * {@inheritDoc TooltipProps.fallbackPlacements} + */ + fallbackPlacements?: Placement[]; + /** + * {@inheritDoc TooltipProps.boundary} + */ + boundary?: HTMLElement | 'chart'; + } + +} + export interface LegendColorPickerProps { /** * Anchor used to position picker @@ -285,6 +313,10 @@ export interface SettingsSpec extends Spec { * The tooltip configuration forr the chart {@link TooltipSettings} */ tooltip: TooltipSettings; + /** + * + */ + externalPointerEvents: ExternalPointerEventsSettings; debug: boolean; legendPosition: Position; /** @@ -350,7 +382,8 @@ export type DefaultSettingsProps = | 'legendPosition' | 'hideDuplicateAxes' | 'brushAxis' - | 'minBrushDelta'; + | 'minBrushDelta' + | 'externalPointerEvents'; /** * Default value for the tooltip type @@ -389,6 +422,11 @@ export const DEFAULT_SETTINGS_SPEC: SettingsSpec = { type: DEFAULT_TOOLTIP_TYPE, snap: DEFAULT_TOOLTIP_SNAP, }, + externalPointerEvents: { + tooltip: { + visible: false, + }, + }, legendPosition: Position.Right, showLegendExtra: false, hideDuplicateAxes: false, diff --git a/src/state/selectors/get_tooltip_settings.ts b/src/state/selectors/get_tooltip_settings.ts new file mode 100644 index 0000000000..25591afb41 --- /dev/null +++ b/src/state/selectors/get_tooltip_settings.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 createCachedSelector from 're-reselect'; + +import { TooltipSettings, isTooltipType } from '../../specs/settings'; +import { getChartIdSelector } from './get_chart_id'; +import { getSettingsSpecSelector } from './get_settings_specs'; +import { isExternalTooltipVisibleSelector } from './is_external_tooltip_visible'; + +/** @internal */ +export const getTooltipSettings = createCachedSelector( + [getSettingsSpecSelector, isExternalTooltipVisibleSelector], + (settings, isExternalTooltipVisible): TooltipSettings => { + if (!isExternalTooltipVisible) { + return settings.tooltip; + } + if (isTooltipType(settings.tooltip)) { + return { + type: settings.tooltip, + ...settings.externalPointerEvents.tooltip, + }; + } + return { + ...settings.tooltip, + ...settings.externalPointerEvents.tooltip, + }; + } +)(getChartIdSelector); diff --git a/src/state/selectors/has_external_pointer_event.ts b/src/state/selectors/has_external_pointer_event.ts new file mode 100644 index 0000000000..8fa0478d08 --- /dev/null +++ b/src/state/selectors/has_external_pointer_event.ts @@ -0,0 +1,25 @@ +/* + * 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 { PointerEventType } from '../../specs/settings'; +import { GlobalChartState } from '../chart_state'; + +/** @internal */ +export const hasExternalEventSelector = ({ externalEvents: { pointer } }: GlobalChartState) => + pointer !== null && pointer.type !== PointerEventType.Out; diff --git a/src/state/selectors/is_external_tooltip_visible.ts b/src/state/selectors/is_external_tooltip_visible.ts new file mode 100644 index 0000000000..a71eb03ff3 --- /dev/null +++ b/src/state/selectors/is_external_tooltip_visible.ts @@ -0,0 +1,30 @@ +/* + * 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 createCachedSelector from 're-reselect'; + +import { getChartIdSelector } from './get_chart_id'; +import { getSettingsSpecSelector } from './get_settings_specs'; +import { hasExternalEventSelector } from './has_external_pointer_event'; + +/** @internal */ +export const isExternalTooltipVisibleSelector = createCachedSelector( + [getSettingsSpecSelector, hasExternalEventSelector], + (settings, hasExternalEvent): boolean => hasExternalEvent && settings.externalPointerEvents.tooltip?.visible === true, +)(getChartIdSelector); From 2c4723ecdb04b8d2a6ec22a0e06b4653a4496b92 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Wed, 10 Jun 2020 00:16:27 +0200 Subject: [PATCH 02/15] test: add test for synched tooltips --- .playground/index.html | 1 - ...e-action-visually-looks-correct-1-snap.png | Bin 15242 -> 12814 bytes ...oltip-sync-show-synced-tooltips-1-snap.png | Bin 0 -> 38758 bytes integration/tests/interactions.test.ts | 12 +++ .../interactions/16_cursor_update_action.tsx | 94 ++++++++++++++---- 5 files changed, 84 insertions(+), 23 deletions(-) create mode 100644 integration/tests/__image_snapshots__/interactions-test-ts-interactions-tooltip-sync-show-synced-tooltips-1-snap.png diff --git a/.playground/index.html b/.playground/index.html index 1d04c65d57..2403a54bfc 100644 --- a/.playground/index.html +++ b/.playground/index.html @@ -30,7 +30,6 @@ .page { padding: 10px; - padding-top: 300px; } label { diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-interactions-cursor-update-action-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-interactions-cursor-update-action-visually-looks-correct-1-snap.png index b0923cea76104f2084c0a61dd587a5f672049e3d..5112f10000b620eba834a82639f36eb3f0568d56 100644 GIT binary patch literal 12814 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 NRZ&x+;L5Fs{{hzAVD|t3 literal 15242 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 { ); }); }); + + describe('Tooltip sync', () => { + it('show synced tooltips', async() => { + await common.expectChartWithMouseAtUrlToMatchScreenshot( + 'http://localhost:9001/?path=/story/interactions--cursor-update-action', + { left: 180, top: 80 }, + { + screenshotSelector: '#story-root', + } + ); + }); + }); }); diff --git a/stories/interactions/16_cursor_update_action.tsx b/stories/interactions/16_cursor_update_action.tsx index ea7c934800..2309457b54 100644 --- a/stories/interactions/16_cursor_update_action.tsx +++ b/stories/interactions/16_cursor_update_action.tsx @@ -20,31 +20,81 @@ import { action } from '@storybook/addon-actions'; import React from 'react'; -import { Axis, BarSeries, Chart, Position, ScaleType, Settings } from '../../src'; +import { Axis, BarSeries, Chart, Position, ScaleType, Settings, PointerEvent, Placement, niceTimeFormatter } from '../../src'; +import { KIBANA_METRICS } from '../../src/utils/data_samples/test_dataset_kibana'; +import { palettes } from '../../src/utils/themes/colors'; -const onPointerUpdate = action('onPointerUpdate'); +export const Example = () => { + const ref1 = React.createRef(); + const ref2 = React.createRef(); + const pointerUpdate = (event: PointerEvent) => { + action('onPointerUpdate')(event); + if (ref1.current) { + ref1.current.dispatchExternalPointerEvent(event); + } + if (ref2.current) { + ref2.current.dispatchExternalPointerEvent(event); + } + }; + const { data } = KIBANA_METRICS.metrics.kibana_os_load[0]; + const data1 = KIBANA_METRICS.metrics.kibana_os_load[0].data; + const data2 = KIBANA_METRICS.metrics.kibana_os_load[1].data; + return ( + <> + + + + Number(d).toFixed(2)} /> -export const Example = () => ( - - - - Number(d).toFixed(2)} /> + + + + + - -); + /> + Number(d).toFixed(2)} + domain={{ min: 5, max: 20 }} + /> + + + + + ); +}; Example.story = { parameters: { info: { From 7f89b92e1adb3c69e58a64c0523a85ac54f8f0c5 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Wed, 10 Jun 2020 00:26:49 +0200 Subject: [PATCH 03/15] docs: update API docs --- api/charts.api.md | 17 ++++++++++++++++- src/specs/settings.tsx | 10 ++++++---- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/api/charts.api.md b/api/charts.api.md index 31e3e09cd8..5ad98de46a 100644 --- a/api/charts.api.md +++ b/api/charts.api.md @@ -511,7 +511,7 @@ export const DEFAULT_TOOLTIP_TYPE: "vertical"; // Warning: (ae-missing-release-tag) "DefaultSettingsProps" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export type DefaultSettingsProps = 'id' | 'chartType' | 'specType' | 'rendering' | 'rotation' | 'resizeDebounce' | 'animateData' | 'showLegend' | 'debug' | 'tooltip' | 'showLegendExtra' | 'theme' | 'legendPosition' | 'hideDuplicateAxes' | 'brushAxis' | 'minBrushDelta'; +export type DefaultSettingsProps = 'id' | 'chartType' | 'specType' | 'rendering' | 'rotation' | 'resizeDebounce' | 'animateData' | 'showLegend' | 'debug' | 'tooltip' | 'showLegendExtra' | 'theme' | 'legendPosition' | 'hideDuplicateAxes' | 'brushAxis' | 'minBrushDelta' | 'externalPointerEvents'; // Warning: (ae-missing-release-tag) "DisplayValueSpec" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -547,6 +547,17 @@ export type ElementClickListener = (elements: Array) => void; +// @alpha +export interface ExternalPointerEventsSettings { + // (undocumented) + tooltip?: { + visible?: boolean; + placement?: Placement; + fallbackPlacements?: Placement[]; + boundary?: HTMLElement | 'chart'; + }; +} + // Warning: (ae-missing-release-tag) "FillStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -1278,6 +1289,10 @@ export interface SettingsSpec extends Spec { brushAxis?: BrushAxis; // (undocumented) debug: boolean; + // Warning: (ae-incompatible-release-tags) The symbol "externalPointerEvents" is marked as @public, but its signature references "ExternalPointerEventsSettings" which is marked as @alpha + // + // (undocumented) + externalPointerEvents: ExternalPointerEventsSettings; flatLegend?: boolean; hideDuplicateAxes: boolean; // (undocumented) diff --git a/src/specs/settings.tsx b/src/specs/settings.tsx index 0f3a0df47d..927371f5db 100644 --- a/src/specs/settings.tsx +++ b/src/specs/settings.tsx @@ -232,9 +232,11 @@ export type TooltipSettings = TooltipType | TooltipProps; /** * The settings for handling external events. - * @alpha */ export interface ExternalPointerEventsSettings { + /** + * Tooltip settings used for external events + */ tooltip?: { /** * `true` to show the tooltip when the chart receive an @@ -243,8 +245,8 @@ export interface ExternalPointerEventsSettings { */ visible?: boolean; /** - * {@inheritDoc TooltipProps.placement} - */ + * {@inheritDoc TooltipProps.placement} + */ placement?: Placement; /** * {@inheritDoc TooltipProps.fallbackPlacements} @@ -314,7 +316,7 @@ export interface SettingsSpec extends Spec { */ tooltip: TooltipSettings; /** - * + * {@inheritDoc ExternalPointerEventsSettings} */ externalPointerEvents: ExternalPointerEventsSettings; debug: boolean; From 3dc246c17df5deee5b5119179e04714b8c8d92c2 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Wed, 10 Jun 2020 02:19:06 +0200 Subject: [PATCH 04/15] docs: update API descriptions --- api/charts.api.md | 9 ++------- src/specs/settings.tsx | 6 ++++++ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/api/charts.api.md b/api/charts.api.md index 5ad98de46a..c9431eb5ad 100644 --- a/api/charts.api.md +++ b/api/charts.api.md @@ -549,7 +549,6 @@ export type ElementOverListener = (elements: Array; // @public (undocumented) export const Settings: React.FunctionComponent; -// Warning: (ae-missing-release-tag) "SettingsSpec" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @public export interface SettingsSpec extends Spec { // (undocumented) animateData: boolean; @@ -1289,9 +1286,7 @@ export interface SettingsSpec extends Spec { brushAxis?: BrushAxis; // (undocumented) debug: boolean; - // Warning: (ae-incompatible-release-tags) The symbol "externalPointerEvents" is marked as @public, but its signature references "ExternalPointerEventsSettings" which is marked as @alpha - // - // (undocumented) + // @alpha externalPointerEvents: ExternalPointerEventsSettings; flatLegend?: boolean; hideDuplicateAxes: boolean; diff --git a/src/specs/settings.tsx b/src/specs/settings.tsx index 927371f5db..71c25d78c3 100644 --- a/src/specs/settings.tsx +++ b/src/specs/settings.tsx @@ -232,6 +232,7 @@ export type TooltipSettings = TooltipType | TooltipProps; /** * The settings for handling external events. + * @alpha */ export interface ExternalPointerEventsSettings { /** @@ -289,6 +290,10 @@ export type LegendColorPicker = React.ComponentType; */ export type MarkBuffer = number | ((radius: number) => number); +/** + * The Spec used for Chart settings + * @public + */ export interface SettingsSpec extends Spec { /** * Partial theme to be merged with base @@ -317,6 +322,7 @@ export interface SettingsSpec extends Spec { tooltip: TooltipSettings; /** * {@inheritDoc ExternalPointerEventsSettings} + * @alpha */ externalPointerEvents: ExternalPointerEventsSettings; debug: boolean; From c1da1421588ea405a1aa0b0c8d4f13443cdafbb1 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Wed, 10 Jun 2020 16:10:35 +0200 Subject: [PATCH 05/15] refactor: remove export from legendComponent --- .playground/playground.tsx | 27 +++++++++++++++++++++++++-- src/components/legend/legend.tsx | 6 ++---- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/.playground/playground.tsx b/.playground/playground.tsx index 45b0689ee0..6b5cfe5adc 100644 --- a/.playground/playground.tsx +++ b/.playground/playground.tsx @@ -19,9 +19,26 @@ import React, { useState } from 'react'; -import { Chart, Settings, Axis, Position, BarSeries, ScaleType, PointerEvent, LineSeries } from '../src'; +import { Chart, Settings, Axis, Position, BarSeries, ScaleType, PointerEvent, LineSeries, CustomTooltip } from '../src'; import { KIBANA_METRICS } from '../src/utils/data_samples/test_dataset_kibana'; + +const TestCustomTooltip: CustomTooltip = (props) => ( +
+

Testing a custom tooltip

+
    + { + props.values.map((value) => ( +
  • + {value.label} + {' - '} + {value.value} +
  • + )) + } +
+
+); export const Playground = () => { const ref1 = React.createRef(); const ref2 = React.createRef(); @@ -106,7 +123,13 @@ export const Playground = () => {
- + { if (!getInternalIsInitializedSelector(state)) { return EMPTY_DEFAULT_STATE; From b25e01fc4d3fd1aa43e1f5351bba6fd631400d88 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Thu, 11 Jun 2020 18:00:43 +0200 Subject: [PATCH 06/15] fix: hide external tooltip if it's out of scale --- .playground/playground.tsx | 2 +- .../selectors/get_elements_at_cursor_pos.ts | 2 +- .../selectors/is_external_tooltip_visible.ts | 20 +++++++++++++++++-- .../interactions/16_cursor_update_action.tsx | 6 +++--- 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/.playground/playground.tsx b/.playground/playground.tsx index 6b5cfe5adc..75fab72070 100644 --- a/.playground/playground.tsx +++ b/.playground/playground.tsx @@ -98,7 +98,7 @@ export const Playground = () => { { show && (
- + chartDimensions.width + chartDimensions.left) { + if (x == null || x > chartDimensions.width + chartDimensions.left || x < 0) { return []; } // TODO: Handle external event with spatial points diff --git a/src/state/selectors/is_external_tooltip_visible.ts b/src/state/selectors/is_external_tooltip_visible.ts index a71eb03ff3..be96e16054 100644 --- a/src/state/selectors/is_external_tooltip_visible.ts +++ b/src/state/selectors/is_external_tooltip_visible.ts @@ -19,12 +19,28 @@ import createCachedSelector from 're-reselect'; +import { computeChartDimensionsSelector } from '../../chart_types/xy_chart/state/selectors/compute_chart_dimensions'; +import { getComputedScalesSelector } from '../../chart_types/xy_chart/state/selectors/get_computed_scales'; +import { PointerEventType } from '../../specs'; +import { GlobalChartState } from '../chart_state'; import { getChartIdSelector } from './get_chart_id'; import { getSettingsSpecSelector } from './get_settings_specs'; import { hasExternalEventSelector } from './has_external_pointer_event'; +const getExternalEventPointer = ({ externalEvents: { pointer } }: GlobalChartState) => pointer; + /** @internal */ export const isExternalTooltipVisibleSelector = createCachedSelector( - [getSettingsSpecSelector, hasExternalEventSelector], - (settings, hasExternalEvent): boolean => hasExternalEvent && settings.externalPointerEvents.tooltip?.visible === true, + [getSettingsSpecSelector, hasExternalEventSelector, getExternalEventPointer, getComputedScalesSelector, computeChartDimensionsSelector], + ({ externalPointerEvents }, hasExternalEvent, pointer, { xScale }, { chartDimensions }): boolean => { + if (!pointer || pointer.type !== PointerEventType.Over || externalPointerEvents.tooltip?.visible === false) { + return false; + } + const x = xScale.pureScale(pointer.value); + + if (x == null || x > chartDimensions.width + chartDimensions.left || x < 0) { + return false; + } + return hasExternalEvent && externalPointerEvents.tooltip?.visible === true; + } )(getChartIdSelector); diff --git a/stories/interactions/16_cursor_update_action.tsx b/stories/interactions/16_cursor_update_action.tsx index 2309457b54..9cf2d820b5 100644 --- a/stories/interactions/16_cursor_update_action.tsx +++ b/stories/interactions/16_cursor_update_action.tsx @@ -41,7 +41,7 @@ export const Example = () => { const data2 = KIBANA_METRICS.metrics.kibana_os_load[1].data; return ( <> - + { data={data1.slice(3, 60)} /> - + Date: Mon, 15 Jun 2020 20:09:06 +0200 Subject: [PATCH 07/15] fix: change external tooltiptype --- .playground/index.html | 78 +++++++++---------- .playground/playground.tsx | 65 +++++++++------- .../xy_chart/renderer/dom/crosshair.tsx | 11 ++- .../state/selectors/get_cursor_band.ts | 11 ++- .../get_tooltip_values_highlighted_geoms.ts | 14 ++-- src/chart_types/xy_chart/state/utils/utils.ts | 5 +- src/components/portal/tooltip_portal.tsx | 1 - src/mocks/specs/specs.ts | 24 +----- src/specs/constants.ts | 9 +++ src/specs/settings.tsx | 31 ++++++-- .../selectors/has_external_pointer_event.ts | 2 +- 11 files changed, 134 insertions(+), 117 deletions(-) diff --git a/.playground/index.html b/.playground/index.html index e89203995e..2403a54bfc 100644 --- a/.playground/index.html +++ b/.playground/index.html @@ -1,49 +1,47 @@ + + + Elastic-Charts Playground + + + - + .page { + padding: 10px; + } - -
-
-
- - + label { + display: block; + } + + - \ No newline at end of file + +
+
+
+ + + diff --git a/.playground/playground.tsx b/.playground/playground.tsx index 75fab72070..e7062af547 100644 --- a/.playground/playground.tsx +++ b/.playground/playground.tsx @@ -17,9 +17,9 @@ * under the License. */ -import React, { useState } from 'react'; +import React from 'react'; -import { Chart, Settings, Axis, Position, BarSeries, ScaleType, PointerEvent, LineSeries, CustomTooltip } from '../src'; +import { Chart, Settings, Axis, Position, BarSeries, ScaleType, PointerEvent, LineSeries, CustomTooltip, TooltipType } from '../src'; import { KIBANA_METRICS } from '../src/utils/data_samples/test_dataset_kibana'; @@ -59,16 +59,23 @@ export const Playground = () => { ref4.current.dispatchExternalPointerEvent(event); } }; - const [show, toggleVisibility] = useState(true); + return (
@@ -95,31 +102,28 @@ export const Playground = () => {
- { - show && ( -
- - - - Number(d).toFixed(2)} /> - - - - -
- ) - } +
+ + + + Number(d).toFixed(2)} /> + + + + +
+
@@ -127,6 +131,7 @@ export const Playground = () => { onPointerUpdate={pointerUpdate} externalPointerEvents={{ tooltip: { visible: true, boundary: 'chart' } }} tooltip={{ + type: TooltipType.Follow, customTooltip: TestCustomTooltip, }} /> diff --git a/src/chart_types/xy_chart/renderer/dom/crosshair.tsx b/src/chart_types/xy_chart/renderer/dom/crosshair.tsx index d22c9345e8..3a10f5f840 100644 --- a/src/chart_types/xy_chart/renderer/dom/crosshair.tsx +++ b/src/chart_types/xy_chart/renderer/dom/crosshair.tsx @@ -20,18 +20,19 @@ import React, { CSSProperties } from 'react'; import { connect } from 'react-redux'; +import { getTooltipType } from '../../../../specs'; import { TooltipType } from '../../../../specs/constants'; import { GlobalChartState } from '../../../../state/chart_state'; import { getChartRotationSelector } from '../../../../state/selectors/get_chart_rotation'; import { getChartThemeSelector } from '../../../../state/selectors/get_chart_theme'; import { getInternalIsInitializedSelector, InitStatus } from '../../../../state/selectors/get_internal_is_intialized'; +import { getSettingsSpecSelector } from '../../../../state/selectors/get_settings_specs'; import { Rotation } from '../../../../utils/commons'; import { Dimensions } from '../../../../utils/dimensions'; import { LIGHT_THEME } from '../../../../utils/themes/light_theme'; import { Theme } from '../../../../utils/themes/theme'; import { getCursorBandPositionSelector } from '../../state/selectors/get_cursor_band'; import { getCursorLinePositionSelector } from '../../state/selectors/get_cursor_line'; -import { getTooltipTypeSelector } from '../../state/selectors/get_tooltip_type'; import { isHorizontalRotation } from '../../state/utils/common'; interface CrosshairProps { @@ -123,12 +124,16 @@ const mapStateToProps = (state: GlobalChartState): CrosshairProps => { tooltipType: TooltipType.None, }; } + const settings = getSettingsSpecSelector(state); + const cursorBandPosition = getCursorBandPositionSelector(state); + + const tooltipType = getTooltipType(settings, cursorBandPosition?.fromExternalEvent); return { theme: getChartThemeSelector(state), chartRotation: getChartRotationSelector(state), - cursorBandPosition: getCursorBandPositionSelector(state), + cursorBandPosition, cursorLinePosition: getCursorLinePositionSelector(state), - tooltipType: getTooltipTypeSelector(state), + tooltipType, }; }; diff --git a/src/chart_types/xy_chart/state/selectors/get_cursor_band.ts b/src/chart_types/xy_chart/state/selectors/get_cursor_band.ts index 5333951be3..6c7cfdc26f 100644 --- a/src/chart_types/xy_chart/state/selectors/get_cursor_band.ts +++ b/src/chart_types/xy_chart/state/selectors/get_cursor_band.ts @@ -86,7 +86,7 @@ function getCursorBand( totalBarsInCluster: number, isTooltipSnapEnabled: boolean, geometriesIndexKeys: (string | number)[], -): (Dimensions & { visible: boolean }) | undefined { +): (Dimensions & { visible: boolean, fromExternalEvent: boolean }) | undefined { // update che cursorBandPosition based on chart configuration const isLineAreaOnly = isLineAreaOnlyChart(seriesSpecs); if (!xScale) { @@ -94,7 +94,10 @@ function getCursorBand( } let pointerPosition = orientedProjectedPoinerPosition; let xValue; + let fromExternalEvent = false; + // external pointer events takes precendence over the current mouse pointer if (isValidPointerOverEvent(xScale, externalPointerEvent)) { + fromExternalEvent = true; const x = xScale.pureScale(externalPointerEvent.value); if (x == null || x > chartDimensions.width || x < 0) { return; @@ -111,7 +114,7 @@ function getCursorBand( } } - return getCursorBandPosition( + const cursorBand = getCursorBandPosition( settingsSpec.rotation, chartDimensions, pointerPosition, @@ -123,4 +126,8 @@ function getCursorBand( xScale, isLineAreaOnly ? 1 : totalBarsInCluster, ); + return { + ...cursorBand, + fromExternalEvent, + }; } diff --git a/src/chart_types/xy_chart/state/selectors/get_tooltip_values_highlighted_geoms.ts b/src/chart_types/xy_chart/state/selectors/get_tooltip_values_highlighted_geoms.ts index c7863a33ce..1b0f1b9a7f 100644 --- a/src/chart_types/xy_chart/state/selectors/get_tooltip_values_highlighted_geoms.ts +++ b/src/chart_types/xy_chart/state/selectors/get_tooltip_values_highlighted_geoms.ts @@ -27,6 +27,7 @@ import { TooltipValueFormatter, isFollowTooltipType, SettingsSpec, + getTooltipType, } from '../../../../specs'; import { TooltipType } from '../../../../specs/constants'; import { GlobalChartState } from '../../../../state/chart_state'; @@ -48,7 +49,6 @@ import { getElementAtCursorPositionSelector } from './get_elements_at_cursor_pos import { getOrientedProjectedPointerPositionSelector } from './get_oriented_projected_pointer_position'; import { getProjectedPointerPositionSelector } from './get_projected_pointer_position'; import { getSeriesSpecsSelector, getAxisSpecsSelector } from './get_specs'; -import { getTooltipTypeSelector } from './get_tooltip_type'; import { hasSingleSeriesSelector } from './has_single_series'; const EMPTY_VALUES = Object.freeze({ @@ -79,7 +79,6 @@ export const getTooltipInfoAndGeometriesSelector = createCachedSelector( hasSingleSeriesSelector, getComputedScalesSelector, getElementAtCursorPositionSelector, - getTooltipTypeSelector, getExternalPointerEventStateSelector, getTooltipHeaderFormatterSelector, ], @@ -96,18 +95,17 @@ function getTooltipAndHighlightFromValue( hasSingleSeries: boolean, scales: ComputedScales, matchingGeoms: IndexedGeometry[], - tooltipType: TooltipType, externalPointerEvent: PointerEvent | null, tooltipHeaderFormatter?: TooltipValueFormatter, ): TooltipAndHighlightedGeoms { if (!scales.xScale || !scales.yScales) { return EMPTY_VALUES; } - if (tooltipType === TooltipType.None) { - return EMPTY_VALUES; - } + let { x, y } = orientedProjectedPointerPosition; + let tooltipType = getTooltipType(settings); if (isValidPointerOverEvent(scales.xScale, externalPointerEvent)) { + tooltipType = getTooltipType(settings, true); const scaledX = scales.xScale.pureScale(externalPointerEvent.value); if (scaledX === null) { @@ -120,6 +118,10 @@ function getTooltipAndHighlightFromValue( return EMPTY_VALUES; } + if (tooltipType === TooltipType.None) { + return EMPTY_VALUES; + } + if (matchingGeoms.length === 0) { return EMPTY_VALUES; } diff --git a/src/chart_types/xy_chart/state/utils/utils.ts b/src/chart_types/xy_chart/state/utils/utils.ts index 12df423235..3092230cf1 100644 --- a/src/chart_types/xy_chart/state/utils/utils.ts +++ b/src/chart_types/xy_chart/state/utils/utils.ts @@ -480,10 +480,7 @@ function renderGeometries( const valueFormatter = yAxis && yAxis.tickFormat ? yAxis.tickFormat : identity; const displayValueSettings = spec.displayValueSettings - ? { - valueFormatter, - ...spec.displayValueSettings, - } + ? { valueFormatter, ...spec.displayValueSettings } : undefined; const renderedBars = renderBars( diff --git a/src/components/portal/tooltip_portal.tsx b/src/components/portal/tooltip_portal.tsx index 611adfa222..4c2050e8dc 100644 --- a/src/components/portal/tooltip_portal.tsx +++ b/src/components/portal/tooltip_portal.tsx @@ -200,7 +200,6 @@ const TooltipPortalComponent = ({ anchor, scope, settings, children, visible, ch }, [updateAnchorDimensions, popper]); const className = classNames({ invisible }); - return createPortal(
{children}
, portalNode.current); }; diff --git a/src/mocks/specs/specs.ts b/src/mocks/specs/specs.ts index e6d6b0168d..0f330876ba 100644 --- a/src/mocks/specs/specs.ts +++ b/src/mocks/specs/specs.ts @@ -41,7 +41,7 @@ import { AxisSpec, } from '../../chart_types/xy_chart/utils/specs'; import { ScaleType } from '../../scales/constants'; -import { SettingsSpec, SpecTypes, TooltipType } from '../../specs'; +import { SettingsSpec, SpecTypes, DEFAULT_SETTINGS_SPEC } from '../../specs'; import { Datum, mergePartial, Position, RecursivePartial } from '../../utils/commons'; import { LIGHT_THEME } from '../../utils/themes/light_theme'; @@ -267,27 +267,7 @@ export class MockSeriesSpecs { /** @internal */ export class MockGlobalSpec { - private static readonly settingsBase: SettingsSpec = { - id: '__global__settings___', - chartType: ChartTypes.Global, - specType: SpecTypes.Settings, - rendering: 'canvas' as const, - rotation: 0 as const, - animateData: true, - showLegend: false, - resizeDebounce: 10, - debug: false, - tooltip: { - type: TooltipType.VerticalCursor, - snap: true, - }, - externalPointerEvents: { - }, - legendPosition: Position.Right, - showLegendExtra: true, - hideDuplicateAxes: false, - theme: LIGHT_THEME, - }; + private static readonly settingsBase: SettingsSpec = DEFAULT_SETTINGS_SPEC; private static readonly axisBase: AxisSpec = { id: 'yAxis', diff --git a/src/specs/constants.ts b/src/specs/constants.ts index f045db411f..e12f03c6fe 100644 --- a/src/specs/constants.ts +++ b/src/specs/constants.ts @@ -20,6 +20,7 @@ import { $Values } from 'utility-types'; import { ChartTypes } from '../chart_types'; +import { Placement } from '../components/portal/types'; import { Position } from '../utils/commons'; import { LIGHT_THEME } from '../utils/themes/light_theme'; import { SettingsSpec } from './settings'; @@ -93,6 +94,14 @@ export const DEFAULT_SETTINGS_SPEC: SettingsSpec = { type: DEFAULT_TOOLTIP_TYPE, snap: DEFAULT_TOOLTIP_SNAP, }, + externalPointerEvents: { + tooltip: { + visible: false, + boundary: 'chart', + fallbackPlacements: [Placement.Right, Placement.Left, Placement.Top, Placement.Bottom], + placement: Placement.Right, + }, + }, legendPosition: Position.Right, showLegendExtra: false, hideDuplicateAxes: false, diff --git a/src/specs/settings.tsx b/src/specs/settings.tsx index 58e665837b..c89f107a21 100644 --- a/src/specs/settings.tsx +++ b/src/specs/settings.tsx @@ -29,7 +29,7 @@ import { CustomTooltip } from '../components/tooltip/types'; import { ScaleContinuousType, ScaleOrdinalType } from '../scales'; import { getConnect, specComponentFactory } from '../state/spec_factory'; import { Accessor } from '../utils/accessor'; -import { Position, Rendering, Rotation, Color } from '../utils/commons'; +import { Position, Rendering, Rotation, Color, RecursivePartial } from '../utils/commons'; import { Domain } from '../utils/domain'; import { GeometryValue } from '../utils/geometry'; import { GroupId } from '../utils/ids'; @@ -200,25 +200,26 @@ export interface ExternalPointerEventsSettings { /** * Tooltip settings used for external events */ - tooltip?: { + tooltip: { /** * `true` to show the tooltip when the chart receive an * external pointer event, 'false' to hide the tooltip. * @defaultValue `false` */ - visible?: boolean; + visible: boolean; /** * {@inheritDoc TooltipProps.placement} */ - placement?: Placement; + placement: Placement; /** * {@inheritDoc TooltipProps.fallbackPlacements} */ - fallbackPlacements?: Placement[]; + fallbackPlacements: Placement[]; /** * {@inheritDoc TooltipProps.boundary} + * @defaultValue `chart` */ - boundary?: HTMLElement | 'chart'; + boundary: HTMLElement | 'chart'; } } @@ -355,7 +356,9 @@ export type DefaultSettingsProps = | 'minBrushDelta' | 'externalPointerEvents'; -export type SettingsSpecProps = Partial>; +export type SettingsSpecProps = Partial> & { + externalPointerEvents?: RecursivePartial +}; export const Settings: React.FunctionComponent = getConnect()( specComponentFactory(DEFAULT_SETTINGS_SPEC), @@ -392,8 +395,11 @@ export function isFollowTooltipType(type: TooltipType) { } /** @internal */ -export function getTooltipType(settings: SettingsSpec): TooltipType { +export function getTooltipType(settings: SettingsSpec, externalTooltip = false): TooltipType { const defaultType = TooltipType.VerticalCursor; + if (externalTooltip) { + return getExternalTooltipType(settings); + } const { tooltip } = settings; if (tooltip === undefined || tooltip === null) { return defaultType; @@ -406,3 +412,12 @@ export function getTooltipType(settings: SettingsSpec): TooltipType { } return defaultType; } + + +/** + * Always return a Vertical Cursor for external pointer events or None if hidden + * @param settings SettingsSpec + */ +export function getExternalTooltipType({ externalPointerEvents: { tooltip: { visible } } }: SettingsSpec): TooltipType { + return visible ? TooltipType.VerticalCursor : TooltipType.None; +} diff --git a/src/state/selectors/has_external_pointer_event.ts b/src/state/selectors/has_external_pointer_event.ts index 8fa0478d08..5fb6e4b701 100644 --- a/src/state/selectors/has_external_pointer_event.ts +++ b/src/state/selectors/has_external_pointer_event.ts @@ -17,7 +17,7 @@ * under the License. */ -import { PointerEventType } from '../../specs/settings'; +import { PointerEventType } from '../../specs'; import { GlobalChartState } from '../chart_state'; /** @internal */ From 0b4b9b511c4080a4d53bff3eeaa52d287c8952bf Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Tue, 16 Jun 2020 13:15:31 +0200 Subject: [PATCH 08/15] fix: move tooltip settings as util function --- .../goal_chart/state/chart_state.tsx | 2 +- .../partition_chart/state/chart_state.tsx | 2 +- .../state/selectors/is_tooltip_visible.ts | 6 ++-- .../tooltip}/get_tooltip_settings.ts | 32 +++++++------------ src/components/tooltip/tooltip.tsx | 25 +++++++++------ src/state/chart_state.ts | 4 +-- .../get_internal_is_tooltip_visible.ts | 4 +-- .../interactions/16_cursor_update_action.tsx | 2 ++ 8 files changed, 39 insertions(+), 38 deletions(-) rename src/{state/selectors => components/tooltip}/get_tooltip_settings.ts (53%) diff --git a/src/chart_types/goal_chart/state/chart_state.tsx b/src/chart_types/goal_chart/state/chart_state.tsx index 85306023a9..3c4f1be200 100644 --- a/src/chart_types/goal_chart/state/chart_state.tsx +++ b/src/chart_types/goal_chart/state/chart_state.tsx @@ -93,7 +93,7 @@ export class GoalState implements InternalChartState { } isTooltipVisible(globalState: GlobalChartState) { - return isTooltipVisibleSelector(globalState); + return { visible: isTooltipVisibleSelector(globalState), isExternal: false }; } getTooltipInfo(globalState: GlobalChartState) { diff --git a/src/chart_types/partition_chart/state/chart_state.tsx b/src/chart_types/partition_chart/state/chart_state.tsx index cd2c2a5006..a5045bc2f3 100644 --- a/src/chart_types/partition_chart/state/chart_state.tsx +++ b/src/chart_types/partition_chart/state/chart_state.tsx @@ -95,7 +95,7 @@ export class PartitionState implements InternalChartState { } isTooltipVisible(globalState: GlobalChartState) { - return isTooltipVisibleSelector(globalState); + return { visible: isTooltipVisibleSelector(globalState), isExternal: false }; } getTooltipInfo(globalState: GlobalChartState) { diff --git a/src/chart_types/xy_chart/state/selectors/is_tooltip_visible.ts b/src/chart_types/xy_chart/state/selectors/is_tooltip_visible.ts index afa151f3a3..cdaf4a5c61 100644 --- a/src/chart_types/xy_chart/state/selectors/is_tooltip_visible.ts +++ b/src/chart_types/xy_chart/state/selectors/is_tooltip_visible.ts @@ -65,6 +65,8 @@ function isTooltipVisible( && tooltip.values.length > 0 && !isAnnotationTooltipVisible ); - - return isLocalTooltop || externalTooltipVisible; + return { + visible: isLocalTooltop || externalTooltipVisible, + isExternal: externalTooltipVisible, + }; } diff --git a/src/state/selectors/get_tooltip_settings.ts b/src/components/tooltip/get_tooltip_settings.ts similarity index 53% rename from src/state/selectors/get_tooltip_settings.ts rename to src/components/tooltip/get_tooltip_settings.ts index 25591afb41..6b134e80e3 100644 --- a/src/state/selectors/get_tooltip_settings.ts +++ b/src/components/tooltip/get_tooltip_settings.ts @@ -17,29 +17,21 @@ * under the License. */ -import createCachedSelector from 're-reselect'; - -import { TooltipSettings, isTooltipType } from '../../specs/settings'; -import { getChartIdSelector } from './get_chart_id'; -import { getSettingsSpecSelector } from './get_settings_specs'; -import { isExternalTooltipVisibleSelector } from './is_external_tooltip_visible'; +import { TooltipSettings, isTooltipType, SettingsSpec } from '../../specs/settings'; /** @internal */ -export const getTooltipSettings = createCachedSelector( - [getSettingsSpecSelector, isExternalTooltipVisibleSelector], - (settings, isExternalTooltipVisible): TooltipSettings => { - if (!isExternalTooltipVisible) { - return settings.tooltip; - } - if (isTooltipType(settings.tooltip)) { - return { - type: settings.tooltip, - ...settings.externalPointerEvents.tooltip, - }; - } +export function getTooltipSettings(settings: SettingsSpec, isExternalTooltipVisible: boolean): TooltipSettings { + if (!isExternalTooltipVisible) { + return settings.tooltip; + } + if (isTooltipType(settings.tooltip)) { return { - ...settings.tooltip, + type: settings.tooltip, ...settings.externalPointerEvents.tooltip, }; } -)(getChartIdSelector); + return { + ...settings.tooltip, + ...settings.externalPointerEvents.tooltip, + }; +} diff --git a/src/components/tooltip/tooltip.tsx b/src/components/tooltip/tooltip.tsx index 2322edb69d..6b6db5ac0a 100644 --- a/src/components/tooltip/tooltip.tsx +++ b/src/components/tooltip/tooltip.tsx @@ -31,18 +31,20 @@ import { getInternalIsInitializedSelector, InitStatus } from '../../state/select import { getInternalIsTooltipVisibleSelector } from '../../state/selectors/get_internal_is_tooltip_visible'; import { getInternalTooltipAnchorPositionSelector } from '../../state/selectors/get_internal_tooltip_anchor_position'; import { getInternalTooltipInfoSelector } from '../../state/selectors/get_internal_tooltip_info'; +import { getSettingsSpecSelector } from '../../state/selectors/get_settings_specs'; import { getTooltipHeaderFormatterSelector } from '../../state/selectors/get_tooltip_header_formatter'; -import { getTooltipSettings } from '../../state/selectors/get_tooltip_settings'; import { Rotation } from '../../utils/commons'; import { TooltipPortal, PopperSettings, AnchorPosition, Placement } from '../portal'; +import { getTooltipSettings } from './get_tooltip_settings'; import { TooltipInfo, TooltipAnchorPosition } from './types'; + interface TooltipDispatchProps { onPointerMove: typeof onPointerMoveAction; } interface TooltipStateProps { - isVisible: boolean; + visible: boolean; position: TooltipAnchorPosition | null; info?: TooltipInfo; headerFormatter?: TooltipValueFormatter; @@ -64,7 +66,7 @@ const TooltipComponent = ({ position, getChartContainerRef, settings, - isVisible, + visible, rotation, chartId, onPointerMove, @@ -138,7 +140,7 @@ const TooltipComponent = ({ ); const renderTooltip = () => { - if (!info || !isVisible) { + if (!info || !visible) { return null; } @@ -156,7 +158,7 @@ const TooltipComponent = ({ }; const anchorPosition = useMemo((): AnchorPosition | null => { - if (!position || !isVisible) { + if (!position || !visible) { return null; } @@ -169,7 +171,7 @@ const TooltipComponent = ({ top: y1 - height, height, }; - }, [isVisible, position?.x0, position?.x1, position?.y0, position?.y1]); // eslint-disable-line react-hooks/exhaustive-deps + }, [visible, position?.x0, position?.x1, position?.y0, position?.y1]); // eslint-disable-line react-hooks/exhaustive-deps const popperSettings = useMemo((): Partial | undefined => { if (typeof settings === 'string') { @@ -199,7 +201,7 @@ const TooltipComponent = ({ }} settings={popperSettings} chartId={chartId} - visible={isVisible} + visible={visible} > {renderTooltip()} @@ -209,7 +211,7 @@ const TooltipComponent = ({ TooltipComponent.displayName = 'Tooltip'; const HIDDEN_TOOLTIP_PROPS = { - isVisible: false, + visible: false, info: undefined, position: null, headerFormatter: undefined, @@ -226,12 +228,15 @@ const mapStateToProps = (state: GlobalChartState): TooltipStateProps => { if (getInternalIsInitializedSelector(state) !== InitStatus.Initialized) { return HIDDEN_TOOLTIP_PROPS; } + const { visible, isExternal } = getInternalIsTooltipVisibleSelector(state); + const settings = getSettingsSpecSelector(state); + return { - isVisible: getInternalIsTooltipVisibleSelector(state), + visible, info: getInternalTooltipInfoSelector(state), position: getInternalTooltipAnchorPositionSelector(state), headerFormatter: getTooltipHeaderFormatterSelector(state), - settings: getTooltipSettings(state), + settings: getTooltipSettings(settings, isExternal), rotation: getChartRotationSelector(state), chartId: state.chartId, backgroundColor: getChartThemeSelector(state).background.color, diff --git a/src/state/chart_state.ts b/src/state/chart_state.ts index 603eeb33ad..7b4469395d 100644 --- a/src/state/chart_state.ts +++ b/src/state/chart_state.ts @@ -100,10 +100,10 @@ export interface InternalChartState { */ getPointerCursor(globalState: GlobalChartState): string; /** - * `true` if the tooltip is visible, `false` otherwise + * Describe if the tooltip is visible and comes from an external source * @param globalState */ - isTooltipVisible(globalState: GlobalChartState): boolean; + isTooltipVisible(globalState: GlobalChartState): { visible: boolean, isExternal: boolean }; /** * Get the tooltip information to display * @param globalState the GlobalChartState diff --git a/src/state/selectors/get_internal_is_tooltip_visible.ts b/src/state/selectors/get_internal_is_tooltip_visible.ts index dfb76c0011..659ac4aef8 100644 --- a/src/state/selectors/get_internal_is_tooltip_visible.ts +++ b/src/state/selectors/get_internal_is_tooltip_visible.ts @@ -20,9 +20,9 @@ import { GlobalChartState } from '../chart_state'; /** @internal */ -export const getInternalIsTooltipVisibleSelector = (state: GlobalChartState): boolean => { +export const getInternalIsTooltipVisibleSelector = (state: GlobalChartState): { visible: boolean, isExternal: boolean } => { if (state.internalChartState) { return state.internalChartState.isTooltipVisible(state); } - return false; + return { visible: false, isExternal: false }; }; diff --git a/stories/interactions/16_cursor_update_action.tsx b/stories/interactions/16_cursor_update_action.tsx index 9cf2d820b5..74705e7c72 100644 --- a/stories/interactions/16_cursor_update_action.tsx +++ b/stories/interactions/16_cursor_update_action.tsx @@ -23,6 +23,7 @@ import React from 'react'; import { Axis, BarSeries, Chart, Position, ScaleType, Settings, PointerEvent, Placement, niceTimeFormatter } from '../../src'; import { KIBANA_METRICS } from '../../src/utils/data_samples/test_dataset_kibana'; import { palettes } from '../../src/utils/themes/colors'; +import { SB_SOURCE_PANEL } from '../utils/storybook'; export const Example = () => { const ref1 = React.createRef(); @@ -100,5 +101,6 @@ Example.story = { info: { text: 'Sends an event every time the cursor changes. This is provided to sync cursors between multiple charts.', }, + options: { selectedPanel: SB_SOURCE_PANEL }, }, }; From e49bb06e4ccd7d142ca5596a2907c9dda0cec4c5 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Tue, 16 Jun 2020 18:03:15 +0200 Subject: [PATCH 09/15] test: fix new isTooltipVisible return value --- .../state/chart_state.interactions.test.ts | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/chart_types/xy_chart/state/chart_state.interactions.test.ts b/src/chart_types/xy_chart/state/chart_state.interactions.test.ts index c461cbd466..c7d81e0199 100644 --- a/src/chart_types/xy_chart/state/chart_state.interactions.test.ts +++ b/src/chart_types/xy_chart/state/chart_state.interactions.test.ts @@ -245,7 +245,7 @@ describe('Chart state pointer interactions', () => { // no tooltip values exist if we have a TooltipType === None expect(tooltipInfo.tooltip.values.length).toBe(0); let isTooltipVisible = isTooltipVisibleSelector(store.getState()); - expect(isTooltipVisible).toBe(false); + expect(isTooltipVisible.visible).toBe(false); updatedSettings = { ...settingSpec, @@ -261,7 +261,7 @@ describe('Chart state pointer interactions', () => { const highlightedGeometries = getHighlightedGeomsSelector(store.getState()); expect(highlightedGeometries.length).toBe(1); isTooltipVisible = isTooltipVisibleSelector(store.getState()); - expect(isTooltipVisible).toBe(true); + expect(isTooltipVisible.visible).toBe(true); }); describe('mouse over with Ordinal scale', () => { @@ -415,7 +415,7 @@ function mouseOverTestSuite(scaleType: ScaleType) { expect(cursorBandPosition?.left).toBe(chartLeft + 0); expect(cursorBandPosition?.width).toBe(45); let isTooltipVisible = isTooltipVisibleSelector(store.getState()); - expect(isTooltipVisible).toBe(true); + expect(isTooltipVisible.visible).toBe(true); tooltipInfo = getTooltipInfoAndGeometriesSelector(store.getState()); expect(tooltipInfo.tooltip.values.length).toBe(1); expect(tooltipInfo.highlightedGeometries.length).toBe(1); @@ -443,7 +443,7 @@ function mouseOverTestSuite(scaleType: ScaleType) { projectedPointerPosition = getProjectedPointerPositionSelector(store.getState()); expect(projectedPointerPosition).toEqual({ x: -1, y: -1 }); isTooltipVisible = isTooltipVisibleSelector(store.getState()); - expect(isTooltipVisible).toBe(false); + expect(isTooltipVisible.visible).toBe(false); tooltipInfo = getTooltipInfoAndGeometriesSelector(store.getState()); expect(tooltipInfo.tooltip.values.length).toBe(0); expect(tooltipInfo.highlightedGeometries.length).toBe(0); @@ -460,7 +460,7 @@ function mouseOverTestSuite(scaleType: ScaleType) { expect(cursorBandPosition?.left).toBe(chartLeft + 0); expect(cursorBandPosition?.width).toBe(45); let isTooltipVisible = isTooltipVisibleSelector(store.getState()); - expect(isTooltipVisible).toBe(true); + expect(isTooltipVisible.visible).toBe(true); let tooltipInfo = getTooltipInfoAndGeometriesSelector(store.getState()); expect(tooltipInfo.highlightedGeometries.length).toBe(1); expect(tooltipInfo.tooltip.values.length).toBe(1); @@ -487,7 +487,7 @@ function mouseOverTestSuite(scaleType: ScaleType) { projectedPointerPosition = getProjectedPointerPositionSelector(store.getState()); expect(projectedPointerPosition).toEqual({ x: -1, y: 89 }); isTooltipVisible = isTooltipVisibleSelector(store.getState()); - expect(isTooltipVisible).toBe(false); + expect(isTooltipVisible.visible).toBe(false); tooltipInfo = getTooltipInfoAndGeometriesSelector(store.getState()); expect(tooltipInfo.tooltip.values.length).toBe(0); expect(tooltipInfo.highlightedGeometries.length).toBe(0); @@ -508,7 +508,7 @@ function mouseOverTestSuite(scaleType: ScaleType) { expect(cursorBandPosition?.left).toBe(chartLeft + 0); expect(cursorBandPosition?.width).toBe(45); let isTooltipVisible = isTooltipVisibleSelector(store.getState()); - expect(isTooltipVisible).toBe(true); + expect(isTooltipVisible.visible).toBe(true); let tooltipInfo = getTooltipInfoAndGeometriesSelector(store.getState()); expect(tooltipInfo.highlightedGeometries.length).toBe(1); expect(tooltipInfo.tooltip.values.length).toBe(1); @@ -540,7 +540,7 @@ function mouseOverTestSuite(scaleType: ScaleType) { expect(cursorBandPosition?.left).toBe(chartLeft + 45); expect(cursorBandPosition?.width).toBe(45); isTooltipVisible = isTooltipVisibleSelector(store.getState()); - expect(isTooltipVisible).toBe(true); + expect(isTooltipVisible.visible).toBe(true); tooltipInfo = getTooltipInfoAndGeometriesSelector(store.getState()); expect(tooltipInfo.tooltip.values.length).toBe(1); expect(tooltipInfo.highlightedGeometries.length).toBe(0); @@ -561,7 +561,7 @@ function mouseOverTestSuite(scaleType: ScaleType) { expect(cursorBandPosition?.left).toBe(chartLeft + 0); expect(cursorBandPosition?.width).toBe(45); let isTooltipVisible = isTooltipVisibleSelector(store.getState()); - expect(isTooltipVisible).toBe(true); + expect(isTooltipVisible.visible).toBe(true); let tooltipInfo = getTooltipInfoAndGeometriesSelector(store.getState()); expect(tooltipInfo.highlightedGeometries.length).toBe(1); expect(tooltipInfo.tooltip.values.length).toBe(1); @@ -593,7 +593,7 @@ function mouseOverTestSuite(scaleType: ScaleType) { expect(cursorBandPosition?.left).toBe(chartLeft + 45); expect(cursorBandPosition?.width).toBe(45); isTooltipVisible = isTooltipVisibleSelector(store.getState()); - expect(isTooltipVisible).toBe(true); + expect(isTooltipVisible.visible).toBe(true); tooltipInfo = getTooltipInfoAndGeometriesSelector(store.getState()); expect(tooltipInfo.tooltip.values.length).toBe(1); // we are over the second bar here @@ -638,7 +638,7 @@ function mouseOverTestSuite(scaleType: ScaleType) { expect(cursorBandPosition?.width).toBe(45); const isTooltipVisible = isTooltipVisibleSelector(store.getState()); - expect(isTooltipVisible).toBe(true); + expect(isTooltipVisible.visible).toBe(true); tooltipInfo = getTooltipInfoAndGeometriesSelector(store.getState()); expect(tooltipInfo.highlightedGeometries.length).toBe(0); expect(tooltipInfo.tooltip.values.length).toBe(1); @@ -690,7 +690,7 @@ function mouseOverTestSuite(scaleType: ScaleType) { expect(cursorBandPosition?.left).toBe(chartLeft + 45); expect(cursorBandPosition?.width).toBe(45); const isTooltipVisible = isTooltipVisibleSelector(store.getState()); - expect(isTooltipVisible).toBe(true); + expect(isTooltipVisible.visible).toBe(true); const tooltipInfo = getTooltipInfoAndGeometriesSelector(store.getState()); expect(tooltipInfo.highlightedGeometries.length).toBe(1); expect(tooltipInfo.tooltip.values.length).toBe(1); From 413c474b8984f02bb9e4a19a45a193661205b7a7 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Wed, 17 Jun 2020 12:49:48 +0200 Subject: [PATCH 10/15] refactor: make external tooltip config optional --- src/specs/constants.ts | 4 ---- src/specs/settings.tsx | 19 +++++++++++-------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/specs/constants.ts b/src/specs/constants.ts index e12f03c6fe..4ec732533f 100644 --- a/src/specs/constants.ts +++ b/src/specs/constants.ts @@ -20,7 +20,6 @@ import { $Values } from 'utility-types'; import { ChartTypes } from '../chart_types'; -import { Placement } from '../components/portal/types'; import { Position } from '../utils/commons'; import { LIGHT_THEME } from '../utils/themes/light_theme'; import { SettingsSpec } from './settings'; @@ -97,9 +96,6 @@ export const DEFAULT_SETTINGS_SPEC: SettingsSpec = { externalPointerEvents: { tooltip: { visible: false, - boundary: 'chart', - fallbackPlacements: [Placement.Right, Placement.Left, Placement.Top, Placement.Bottom], - placement: Placement.Right, }, }, legendPosition: Position.Right, diff --git a/src/specs/settings.tsx b/src/specs/settings.tsx index c89f107a21..57b8347854 100644 --- a/src/specs/settings.tsx +++ b/src/specs/settings.tsx @@ -171,7 +171,7 @@ export interface TooltipProps { * * `'chart'` will use the chart container as the boundary * - * @defaultValue parent scroll container + * @defaultValue undefined - parent scroll container */ boundary?: HTMLElement | 'chart'; /** @@ -208,18 +208,21 @@ export interface ExternalPointerEventsSettings { */ visible: boolean; /** - * {@inheritDoc TooltipProps.placement} + * {@inheritDoc TooltipProps.placement} + * Fallbacks to tooltip placement */ - placement: Placement; + placement?: Placement; /** - * {@inheritDoc TooltipProps.fallbackPlacements} + * {@inheritDoc TooltipProps.fallbackPlacements} + * Fallbacks to tooltip fallbackPlacements */ - fallbackPlacements: Placement[]; + fallbackPlacements?: Placement[]; /** - * {@inheritDoc TooltipProps.boundary} - * @defaultValue `chart` + * {@inheritDoc TooltipProps.boundary} + * @defaultValue undefined + * Fallbacks to tooltip boundary default */ - boundary: HTMLElement | 'chart'; + boundary?: HTMLElement | 'chart'; } } From e62e1babadd7e82aca587358712c9305e80e76e1 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Wed, 17 Jun 2020 14:42:19 +0200 Subject: [PATCH 11/15] fix: hiding portal with no tooltip values --- .playground/playground.tsx | 33 ++++++++++++++----- .../state/selectors/is_tooltip_visible.ts | 3 +- src/components/portal/_portal.scss | 2 ++ src/components/portal/tooltip_portal.tsx | 22 ++++--------- src/components/tooltip/tooltip.tsx | 6 ++-- 5 files changed, 37 insertions(+), 29 deletions(-) diff --git a/.playground/playground.tsx b/.playground/playground.tsx index e7062af547..667871ee83 100644 --- a/.playground/playground.tsx +++ b/.playground/playground.tsx @@ -65,22 +65,37 @@ export const Playground = () => { + +
- + {
- + 0 && !isAnnotationTooltipVisible ); + const isExternalTooltip = externalTooltipVisible && tooltip.values.length > 0; return { - visible: isLocalTooltop || externalTooltipVisible, + visible: isLocalTooltop || isExternalTooltip, isExternal: externalTooltipVisible, }; } diff --git a/src/components/portal/_portal.scss b/src/components/portal/_portal.scss index 90e6ecdc71..aa799d9276 100644 --- a/src/components/portal/_portal.scss +++ b/src/components/portal/_portal.scss @@ -11,4 +11,6 @@ .echTooltipPortal__invisible { position: fixed; visibility: hidden; + width: 0; + height: 0; } diff --git a/src/components/portal/tooltip_portal.tsx b/src/components/portal/tooltip_portal.tsx index 7c7cad00fd..c539ecc062 100644 --- a/src/components/portal/tooltip_portal.tsx +++ b/src/components/portal/tooltip_portal.tsx @@ -18,8 +18,7 @@ */ import { createPopper, Instance } from '@popperjs/core'; -import classNames from 'classnames'; -import React, { useRef, useEffect, useCallback, ReactNode, useMemo, useState } from 'react'; +import { useRef, useEffect, useCallback, ReactNode, useMemo } from 'react'; import { createPortal } from 'react-dom'; import { mergePartial, isDefined } from '../../utils/commons'; @@ -57,10 +56,6 @@ type PortalTooltipProps = { }; const TooltipPortalComponent = ({ anchor, scope, settings, children, visible, chartId }: PortalTooltipProps) => { - /** - * Used to skip first render for new position, which is used for capture initial position - */ - const [invisible, setInvisible] = useState(!(visible ?? false)); /** * Anchor element used to position tooltip */ @@ -185,11 +180,11 @@ const TooltipPortalComponent = ({ anchor, scope, settings, children, visible, ch }, [visible, anchorNode, position?.left, position?.top, position?.width, position?.height]); useEffect(() => { - if (position === null) { - setInvisible(true); - } else { - setInvisible(false); + if (!position) { + portalNode.current.classList.add('echTooltipPortal__invisible'); + return; } + portalNode.current.classList.remove('echTooltipPortal__invisible'); }, [position]); useEffect(() => { @@ -199,12 +194,7 @@ const TooltipPortalComponent = ({ anchor, scope, settings, children, visible, ch } }, [updateAnchorDimensions, popper]); - return createPortal( -
- {children} -
, - portalNode.current, - ); + return createPortal(children, portalNode.current); }; TooltipPortalComponent.displayName = 'TooltipPortal'; diff --git a/src/components/tooltip/tooltip.tsx b/src/components/tooltip/tooltip.tsx index 6b6db5ac0a..411e90668a 100644 --- a/src/components/tooltip/tooltip.tsx +++ b/src/components/tooltip/tooltip.tsx @@ -229,14 +229,14 @@ const mapStateToProps = (state: GlobalChartState): TooltipStateProps => { return HIDDEN_TOOLTIP_PROPS; } const { visible, isExternal } = getInternalIsTooltipVisibleSelector(state); - const settings = getSettingsSpecSelector(state); - + const settingsSpec = getSettingsSpecSelector(state); + const settings = getTooltipSettings(settingsSpec, isExternal); return { visible, info: getInternalTooltipInfoSelector(state), position: getInternalTooltipAnchorPositionSelector(state), headerFormatter: getTooltipHeaderFormatterSelector(state), - settings: getTooltipSettings(settings, isExternal), + settings, rotation: getChartRotationSelector(state), chartId: state.chartId, backgroundColor: getChartThemeSelector(state).background.color, From 40cef6a8e88ef0ce957d96c1b6ff9dafd9619117 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Wed, 17 Jun 2020 16:26:34 +0200 Subject: [PATCH 12/15] docs: fix docs --- api/charts.api.md | 6 ++++-- src/specs/settings.tsx | 13 +++++-------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/api/charts.api.md b/api/charts.api.md index 2d02fb6191..b919712ea9 100644 --- a/api/charts.api.md +++ b/api/charts.api.md @@ -572,7 +572,7 @@ export type ElementOverListener = (elements: Array>; +export type SettingsSpecProps = Partial> & { + externalPointerEvents?: RecursivePartial; +}; // Warning: (ae-missing-release-tag) "SharedGeometryStateStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // diff --git a/src/specs/settings.tsx b/src/specs/settings.tsx index 57b8347854..b5b568dea1 100644 --- a/src/specs/settings.tsx +++ b/src/specs/settings.tsx @@ -187,7 +187,7 @@ export interface TooltipProps { } /** - * Either a TooltipType or an object with configuration of type, snap, and/or headerFormatter + * Either a {@link (TooltipType:type)} or an {@link (TooltipProps:interface)} configuration * @public */ export type TooltipSettings = TooltipType | TooltipProps; @@ -206,21 +206,17 @@ export interface ExternalPointerEventsSettings { * external pointer event, 'false' to hide the tooltip. * @defaultValue `false` */ - visible: boolean; + visible?: boolean; /** * {@inheritDoc TooltipProps.placement} - * Fallbacks to tooltip placement */ placement?: Placement; /** * {@inheritDoc TooltipProps.fallbackPlacements} - * Fallbacks to tooltip fallbackPlacements */ fallbackPlacements?: Placement[]; /** * {@inheritDoc TooltipProps.boundary} - * @defaultValue undefined - * Fallbacks to tooltip boundary default */ boundary?: HTMLElement | 'chart'; } @@ -283,7 +279,7 @@ export interface SettingsSpec extends Spec { animateData: boolean; showLegend: boolean; /** - * The tooltip configuration forr the chart {@link TooltipSettings} + * The tooltip configuration {@link TooltipSettings} */ tooltip: TooltipSettings; /** @@ -419,7 +415,8 @@ export function getTooltipType(settings: SettingsSpec, externalTooltip = false): /** * Always return a Vertical Cursor for external pointer events or None if hidden - * @param settings SettingsSpec + * @internal + * @param settings - the SettingsSpec */ export function getExternalTooltipType({ externalPointerEvents: { tooltip: { visible } } }: SettingsSpec): TooltipType { return visible ? TooltipType.VerticalCursor : TooltipType.None; From 239bdb4beec5b3df396a0d08c10605e32e955322 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Thu, 18 Jun 2020 11:29:28 +0200 Subject: [PATCH 13/15] refactor: hide/remove portal when not visible --- .playground/playground.tsx | 25 ++++++++++++++++--- .../dom/annotations/annotation_tooltip.tsx | 4 ++- src/components/portal/tooltip_portal.tsx | 10 +++++--- src/components/portal/utils.ts | 5 +++- src/components/tooltip/tooltip.tsx | 7 +++++- 5 files changed, 41 insertions(+), 10 deletions(-) diff --git a/.playground/playground.tsx b/.playground/playground.tsx index 667871ee83..40ad254eee 100644 --- a/.playground/playground.tsx +++ b/.playground/playground.tsx @@ -19,7 +19,19 @@ import React from 'react'; -import { Chart, Settings, Axis, Position, BarSeries, ScaleType, PointerEvent, LineSeries, CustomTooltip, TooltipType } from '../src'; +import { + Chart, + Settings, + Axis, + Position, + BarSeries, + ScaleType, + PointerEvent, + LineSeries, + CustomTooltip, + TooltipType, + LineAnnotation, AnnotationDomainTypes, +} from '../src'; import { KIBANA_METRICS } from '../src/utils/data_samples/test_dataset_kibana'; @@ -104,7 +116,12 @@ export const Playground = () => { /> Number(d).toFixed(2)} /> - + Hello
} + dataValues={[{ dataValue: KIBANA_METRICS.metrics.kibana_os_load[0].data[10][0], details: 'hello' }]} + id="test" + domainType={AnnotationDomainTypes.XDomain} + /> {
- - + + state?.anchor ?? null, [state?.anchor]); const placement = useMemo(() => state?.anchor?.position ?? Placement.Right, [state?.anchor?.position]); - + if (!state?.isVisible) { + return null; + } return ( mergePartial(DEFAULT_POPPER_SETTINGS, settings, { mergeOptionalPartialValues: true }), + [settings], ); diff --git a/src/components/portal/utils.ts b/src/components/portal/utils.ts index 7d5dc87dc3..f46b653dae 100644 --- a/src/components/portal/utils.ts +++ b/src/components/portal/utils.ts @@ -31,7 +31,7 @@ export const DEFAULT_POPPER_SETTINGS: PopperSettings = { * * @internal */ -export function getOrCreateNode(id: string, parent: HTMLElement = document.body): HTMLDivElement { +export function getOrCreateNode(id: string, className?: string, parent: HTMLElement = document.body): HTMLDivElement { // eslint-disable-next-line unicorn/prefer-query-selector const node = document.getElementById(id); if (node) { @@ -40,6 +40,9 @@ export function getOrCreateNode(id: string, parent: HTMLElement = document.body) const newNode = document.createElement('div'); newNode.id = id; + if (className) { + newNode.classList.add(className); + } parent.appendChild(newNode); return newNode; } diff --git a/src/components/tooltip/tooltip.tsx b/src/components/tooltip/tooltip.tsx index 411e90668a..37b2ca7449 100644 --- a/src/components/tooltip/tooltip.tsx +++ b/src/components/tooltip/tooltip.tsx @@ -191,7 +191,9 @@ const TooltipComponent = ({ boundary: boundary === 'chart' && chartRef.current ? chartRef.current : undefined, }; }, [settings, chartRef, rotation]); - + if (!visible) { + return null; + } return ( { return HIDDEN_TOOLTIP_PROPS; } const { visible, isExternal } = getInternalIsTooltipVisibleSelector(state); + if (state.chartId === 'chart4') { + // console.log(visible, isExternal); + } const settingsSpec = getSettingsSpecSelector(state); const settings = getTooltipSettings(settingsSpec, isExternal); return { From 7a80225e87366e682ae6b01567cda69f2c5c8551 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Thu, 18 Jun 2020 11:36:42 +0200 Subject: [PATCH 14/15] test: update snapshot without annotation portal --- src/components/__snapshots__/chart.test.tsx.snap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/__snapshots__/chart.test.tsx.snap b/src/components/__snapshots__/chart.test.tsx.snap index 00df8cd9ad..7b12935f4f 100644 --- a/src/components/__snapshots__/chart.test.tsx.snap +++ b/src/components/__snapshots__/chart.test.tsx.snap @@ -1,3 +1,3 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`Chart should render the legend name test 1`] = `"
  • test
"`; +exports[`Chart should render the legend name test 1`] = `"
  • test
"`; From a202dbf6d06b44abf6afd798a9bc1b815f655862 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Thu, 18 Jun 2020 13:20:27 +0200 Subject: [PATCH 15/15] test: update snapshot --- ...oltip-sync-show-synced-tooltips-1-snap.png | Bin 38758 -> 41340 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/integration/tests/__image_snapshots__/interactions-test-ts-interactions-tooltip-sync-show-synced-tooltips-1-snap.png b/integration/tests/__image_snapshots__/interactions-test-ts-interactions-tooltip-sync-show-synced-tooltips-1-snap.png index cc2f917cc7636a2716921303190d918de26e4149..14c30a26dd521849d4f9bb6630dd4e8febe84bc2 100644 GIT binary patch literal 41340 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