From 17b9391422e6638e11b6244a0a96f007dc38ae7f Mon Sep 17 00:00:00 2001 From: Vijayan Balasubramanian Date: Thu, 9 Mar 2023 17:51:44 -0800 Subject: [PATCH] Add tooltip to draw shape filter (#330) * Add tooltip to draw filter shape 1. Changes cursor 2. Add instruction on how to proceed. 3. Revert once cancel is selected. Signed-off-by: Vijayan Balasubramanian (cherry picked from commit 3a20e81a4056f9dcf6ff9c62321d28bf6a62a069) --- .../map_container/map_container.tsx | 11 ++- .../toolbar/spatial_filter/draw_tooltip.tsx | 80 +++++++++++++++++++ .../spatial_filter/filter_input_panel.tsx | 2 +- 3 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 public/components/toolbar/spatial_filter/draw_tooltip.tsx diff --git a/public/components/map_container/map_container.tsx b/public/components/map_container/map_container.tsx index 8d510124..a9349296 100644 --- a/public/components/map_container/map_container.tsx +++ b/public/components/map_container/map_container.tsx @@ -8,7 +8,12 @@ import { Map as Maplibre, NavigationControl } from 'maplibre-gl'; import { debounce, throttle } from 'lodash'; import { LayerControlPanel } from '../layer_control_panel'; import './map_container.scss'; -import { DASHBOARDS_MAPS_LAYER_TYPE, DrawFilterProperties, FILTER_DRAW_MODE, MAP_INITIAL_STATE } from '../../../common'; +import { + DASHBOARDS_MAPS_LAYER_TYPE, + DrawFilterProperties, + FILTER_DRAW_MODE, + MAP_INITIAL_STATE, +} from '../../../common'; import { MapLayerSpecification } from '../../model/mapLayerType'; import { Filter, @@ -36,6 +41,7 @@ import { MapsFooter } from './maps_footer'; import { DisplayFeatures } from '../tooltip/display_features'; import { TOOLTIP_STATE } from '../../../common'; import { SpatialFilterToolbar } from '../toolbar/spatial_filter/filter_toolbar'; +import { DrawTooltip } from '../toolbar/spatial_filter/draw_tooltip'; interface MapContainerProps { setLayers: (layers: MapLayerSpecification[]) => void; @@ -265,6 +271,9 @@ export const MapContainer = ({ {mounted && tooltipState === TOOLTIP_STATE.DISPLAY_FEATURES && ( )} + {mounted && Boolean(maplibreRef.current) && ( + + )}
{mounted && ( { + switch (mode) { + case FILTER_DRAW_MODE.POLYGON: + return i18n.translate('maps.drawFilterPolygon.tooltipContent', { + defaultMessage: 'Click to start shape. Click for vertex. Double click to finish.', + }); + default: + return i18n.translate('maps.drawFilterDefault.tooltipContent', { + defaultMessage: 'Click to start shape. Double click to finish.', + }); + } +}; + +export const DrawTooltip = ({ map, mode }: Props) => { + const hoverPopupRef = useRef( + new maplibregl.Popup({ + closeButton: false, + closeOnClick: false, + anchor: 'right', + maxWidth: 'max-content', + }) + ); + + useEffect(() => { + // remove previous popup + function onMouseMoveMap(e: MapEventType['mousemove']) { + map.getCanvas().style.cursor = 'crosshair'; // Changes cursor to '+' + hoverPopupRef.current + .setLngLat(e.lngLat) + .setOffset([X_AXIS_GAP_BETWEEN_CURSOR_AND_POPUP, Y_AXIS_GAP_BETWEEN_CURSOR_AND_POPUP]) // add some gap between cursor and pop up + .setText(getTooltipContent(mode)) + .addTo(map); + } + + function onMouseMoveOut() { + hoverPopupRef.current.remove(); + } + + function resetAction() { + map.getCanvas().style.cursor = ''; + hoverPopupRef.current.remove(); + // remove tooltip when users mouse move over a point + map.off('mousemove', onMouseMoveMap); + map.off('mouseout', onMouseMoveOut); + } + + if (map && mode === FILTER_DRAW_MODE.NONE) { + resetAction(); + } else { + // add tooltip when users mouse move over a point + map.on('mousemove', onMouseMoveMap); + map.on('mouseout', onMouseMoveOut); + } + return () => { + // remove tooltip when users mouse move over a point + // when component is unmounted + resetAction(); + }; + }, [mode]); + + return ; +}; diff --git a/public/components/toolbar/spatial_filter/filter_input_panel.tsx b/public/components/toolbar/spatial_filter/filter_input_panel.tsx index 1842bf87..68a4bbb5 100644 --- a/public/components/toolbar/spatial_filter/filter_input_panel.tsx +++ b/public/components/toolbar/spatial_filter/filter_input_panel.tsx @@ -53,7 +53,7 @@ export const FilterInputPanel = ({ }; return ( - +