From b759a13b4c78abe20a5c7d94c79ed9b375919528 Mon Sep 17 00:00:00 2001 From: Vijayan Balasubramanian Date: Tue, 7 Mar 2023 22:07:17 -0800 Subject: [PATCH] Add tooltip to draw filter shape 1. Changes cursor 2. Add instruction on how to proceed. 3. Revert once cancel is seleted. Signed-off-by: Vijayan Balasubramanian --- .../map_container/map_container.tsx | 2 + .../filter_toolbar.test.tsx.snap | 3 - .../toolbar/spatial_filter/draw_tooltip.tsx | 77 +++++++++++++++++++ .../spatial_filter/filter_input_panel.tsx | 2 +- .../toolbar/spatial_filter/filter_toolbar.tsx | 13 +--- 5 files changed, 84 insertions(+), 13 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..497a60da 100644 --- a/public/components/map_container/map_container.tsx +++ b/public/components/map_container/map_container.tsx @@ -36,6 +36,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 +266,7 @@ export const MapContainer = ({ {mounted && tooltipState === TOOLTIP_STATE.DISPLAY_FEATURES && ( )} + {mounted && }
{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 '+' + if (map) { + hoverPopupRef.current + .setLngLat(e.lngLat) + .setOffset([gapBetweenCursorAndPopupOnXAxis, 0]) // add some gap between cursor and pop up + .setText(getTooltipContent(mode)) + .addTo(map); + } + } + + map.on('mouseout', (ev) => { + hoverPopupRef.current.remove(); + }); + + if (map && mode === FILTER_DRAW_MODE.NONE) { + map.getCanvas().style.cursor = ''; + hoverPopupRef?.current.remove(); + // remove tooltip when users mouse move over a point + map.off('mousemove', onMouseMoveMap); + } else { + // add tooltip when users mouse move over a point + map.on('mousemove', onMouseMoveMap); + } + return () => { + if (map) { + // remove tooltip when users mouse move over a point + // when component is unmounted + map.off('mousemove', onMouseMoveMap); + } + }; + }, [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 ( - + ); - if (isDrawActive) { - return ( - + return ( + + {isDrawActive && ( {'Cancel'} - {filterIconGroups} - - ); - } - return ( - + )} {filterIconGroups} );