@dynatrace/strato-geo 3.2.1 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm/map/MapView.js +5 -3
- package/esm/map/MapView.js.map +2 -2
- package/esm/map/components/BubbleLayer/BubbleLayerTooltip.js +25 -57
- package/esm/map/components/BubbleLayer/BubbleLayerTooltip.js.map +2 -2
- package/esm/map/components/ChoroplethLayer/ChoroplethLayerTooltip.js +18 -41
- package/esm/map/components/ChoroplethLayer/ChoroplethLayerTooltip.js.map +2 -2
- package/esm/map/components/ConnectionLayer/ConnectionLayerTooltip.js +22 -47
- package/esm/map/components/ConnectionLayer/ConnectionLayerTooltip.js.map +2 -2
- package/esm/map/components/DefaultTooltip/DefaultTooltip.js +70 -29
- package/esm/map/components/DefaultTooltip/DefaultTooltip.js.map +2 -2
- package/esm/map/components/DotLayer/DotLayerTooltip.js +18 -45
- package/esm/map/components/DotLayer/DotLayerTooltip.js.map +2 -2
- package/esm/map/components/toolbar/MapToolbar.js +10 -8
- package/esm/map/components/toolbar/MapToolbar.js.map +2 -2
- package/esm/map/hooks/use-geo-layer-tooltip.js +23 -0
- package/esm/map/hooks/use-geo-layer-tooltip.js.map +7 -0
- package/esm/map/hooks/use-geo-tooltip-sync.js +79 -0
- package/esm/map/hooks/use-geo-tooltip-sync.js.map +7 -0
- package/esm/map/hooks/use-overlay-events.js +98 -29
- package/esm/map/hooks/use-overlay-events.js.map +2 -2
- package/esm/map/hooks/use-tooltip-event-listeners.js +6 -5
- package/esm/map/hooks/use-tooltip-event-listeners.js.map +2 -2
- package/esm/map/hooks/use-tooltip-template.js +22 -2
- package/esm/map/hooks/use-tooltip-template.js.map +2 -2
- package/esm/map/store/map-store.context.js +1 -5
- package/esm/map/store/map-store.context.js.map +2 -2
- package/esm/map/store/selectors.js +0 -10
- package/esm/map/store/selectors.js.map +2 -2
- package/esm/map/store/store.js +1 -67
- package/esm/map/store/store.js.map +2 -2
- package/esm/map/utils/build-geo-tooltip-state.js +28 -0
- package/esm/map/utils/build-geo-tooltip-state.js.map +7 -0
- package/esm/map/utils/tooltip-type-guards.js +2 -0
- package/esm/map/utils/tooltip-type-guards.js.map +2 -2
- package/map/MapView.d.ts +2 -2
- package/map/MapView.js +2 -2
- package/map/components/BubbleLayer/BubbleCircleLayer.d.ts +1 -1
- package/map/components/BubbleLayer/BubbleLayer.d.ts +1 -1
- package/map/components/BubbleLayer/BubbleLayerTooltip.d.ts +1 -1
- package/map/components/BubbleLayer/BubbleLayerTooltip.js +24 -50
- package/map/components/BubbleLayer/BubbleOutlineLayer.d.ts +1 -1
- package/map/components/ChoroplethLayer/ChoroplethLayer.d.ts +1 -1
- package/map/components/ChoroplethLayer/ChoroplethLayerTooltip.d.ts +1 -1
- package/map/components/ChoroplethLayer/ChoroplethLayerTooltip.js +17 -34
- package/map/components/ChoroplethLayer/ChoroplethOutlineLayer.d.ts +1 -1
- package/map/components/ConnectionLayer/ConnectionLayer.d.ts +1 -1
- package/map/components/ConnectionLayer/ConnectionLayerDirection.d.ts +1 -1
- package/map/components/ConnectionLayer/ConnectionLayerLine.d.ts +1 -1
- package/map/components/ConnectionLayer/ConnectionLayerTooltip.d.ts +1 -1
- package/map/components/ConnectionLayer/ConnectionLayerTooltip.js +21 -40
- package/map/components/DefaultTooltip/DefaultTooltip.d.ts +7 -2
- package/map/components/DefaultTooltip/DefaultTooltip.js +74 -27
- package/map/components/DotLayer/BackgroundLayer.d.ts +1 -1
- package/map/components/DotLayer/BackgroundSymbolLayer.d.ts +1 -1
- package/map/components/DotLayer/DotLayer.d.ts +1 -1
- package/map/components/DotLayer/DotLayerTooltip.d.ts +1 -1
- package/map/components/DotLayer/DotLayerTooltip.js +17 -38
- package/map/components/MapUnavailable.d.ts +1 -1
- package/map/components/TooltipWrapper.d.ts +1 -1
- package/map/components/legend/CategoricalLegendRenderer.d.ts +1 -1
- package/map/components/legend/MapLegendRenderer.d.ts +1 -1
- package/map/components/legend/SequentialLegendRenderer.d.ts +1 -1
- package/map/components/legend/ThresholdLegendRenderer.d.ts +1 -1
- package/map/components/toolbar/MapToolbar.d.ts +1 -1
- package/map/components/toolbar/MapToolbar.js +9 -7
- package/map/components/toolbar/buttons/MapDownloadDataButton.d.ts +1 -1
- package/map/components/toolbar/buttons/MapResetButton.d.ts +1 -1
- package/map/components/toolbar/buttons/MapZoomInOutButtons.d.ts +1 -1
- package/map/components/toolbar/buttons/MapZoomToFitButton.d.ts +1 -1
- package/map/hooks/use-geo-layer-tooltip.d.ts +10 -0
- package/map/hooks/use-geo-layer-tooltip.js +38 -0
- package/map/hooks/use-geo-tooltip-sync.d.ts +24 -0
- package/map/hooks/use-geo-tooltip-sync.js +95 -0
- package/map/hooks/use-overlay-events.js +94 -25
- package/map/hooks/use-tooltip-event-listeners.js +6 -5
- package/map/hooks/use-tooltip-template.d.ts +6 -1
- package/map/hooks/use-tooltip-template.js +22 -2
- package/map/providers/color-scale.provider.d.ts +1 -1
- package/map/providers/layer-color-strategy.provider.d.ts +1 -1
- package/map/providers/map-initial-view.provider.d.ts +1 -1
- package/map/slots/BubbleLayer.d.ts +1 -1
- package/map/slots/BubbleLayerTooltip.d.ts +1 -1
- package/map/slots/DotLayer.d.ts +1 -1
- package/map/slots/DotLayerTooltip.d.ts +1 -1
- package/map/store/map-store.context.d.ts +1 -1
- package/map/store/map-store.context.js +1 -5
- package/map/store/map-store.provider.d.ts +1 -1
- package/map/store/selectors.d.ts +6 -15
- package/map/store/selectors.js +0 -10
- package/map/store/store.d.ts +2 -6
- package/map/store/store.js +1 -67
- package/map/types/state.d.ts +3 -7
- package/map/types/tooltip.d.ts +11 -1
- package/map/utils/build-geo-tooltip-state.d.ts +17 -0
- package/map/{components/DefaultTooltip/utils/handle-copy-to-clipboard.js → utils/build-geo-tooltip-state.js} +27 -11
- package/map/utils/tooltip-type-guards.d.ts +6 -4
- package/map/utils/tooltip-type-guards.js +2 -0
- package/package.json +4 -4
- package/esm/map/components/DefaultTooltip/utils/get-default-actions.js +0 -21
- package/esm/map/components/DefaultTooltip/utils/get-default-actions.js.map +0 -7
- package/esm/map/components/DefaultTooltip/utils/handle-copy-to-clipboard.js +0 -12
- package/esm/map/components/DefaultTooltip/utils/handle-copy-to-clipboard.js.map +0 -7
- package/map/components/DefaultTooltip/utils/get-default-actions.d.ts +0 -2
- package/map/components/DefaultTooltip/utils/get-default-actions.js +0 -40
- package/map/components/DefaultTooltip/utils/handle-copy-to-clipboard.d.ts +0 -2
|
@@ -1,57 +1,30 @@
|
|
|
1
1
|
import { jsx } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
_useChartActionsMenu as useChartActionsMenu
|
|
6
|
-
} from "@dynatrace/strato-components/charts";
|
|
7
|
-
import { useGetPosition } from "../../hooks/use-get-position.js";
|
|
8
|
-
import {
|
|
9
|
-
useMapTooltipPinnedState,
|
|
10
|
-
useMapTooltipState
|
|
11
|
-
} from "../../store/selectors.js";
|
|
2
|
+
import { _OverlayTooltip as OverlayTooltip } from "@dynatrace/strato-components/charts";
|
|
3
|
+
import { useGeoLayerTooltip } from "../../hooks/use-geo-layer-tooltip.js";
|
|
4
|
+
import { isDefaultTooltipHandler } from "../../utils/tooltip-type-guards.js";
|
|
12
5
|
const DotLayerTooltip = (props) => {
|
|
13
6
|
const { tooltipTemplate } = props;
|
|
14
|
-
const {
|
|
15
|
-
|
|
16
|
-
actionsMenuRef,
|
|
17
|
-
updateSelectedItem,
|
|
18
|
-
onLeave
|
|
19
|
-
} = useChartActionsMenu();
|
|
20
|
-
const { data, visible, enabled } = useMapTooltipState();
|
|
21
|
-
const pinned = useMapTooltipPinnedState();
|
|
22
|
-
const dotData = useRef(null);
|
|
23
|
-
const forceHideTooltip = !pinned && (!visible || !enabled);
|
|
24
|
-
const position = useGetPosition(pinned, !forceHideTooltip);
|
|
25
|
-
if (!tooltipTemplate || forceHideTooltip || !position) {
|
|
7
|
+
const { data, inBounds, position } = useGeoLayerTooltip("geoDot");
|
|
8
|
+
if (!tooltipTemplate || !inBounds || !position) {
|
|
26
9
|
return null;
|
|
27
10
|
}
|
|
28
|
-
if (data
|
|
29
|
-
|
|
30
|
-
dotData.current = {
|
|
31
|
-
color,
|
|
32
|
-
bearing,
|
|
33
|
-
data: customData
|
|
34
|
-
};
|
|
11
|
+
if (!data || !data[0]) {
|
|
12
|
+
return null;
|
|
35
13
|
}
|
|
36
|
-
const
|
|
14
|
+
const { __color: color, __bearing: bearing, data: customData } = data[0];
|
|
15
|
+
const dotData = {
|
|
16
|
+
color,
|
|
17
|
+
bearing,
|
|
18
|
+
data: customData
|
|
19
|
+
};
|
|
20
|
+
const template = tooltipTemplate(dotData);
|
|
37
21
|
if (!template) {
|
|
38
22
|
return null;
|
|
39
23
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
position,
|
|
45
|
-
pinned,
|
|
46
|
-
onMouseLeave: onLeave,
|
|
47
|
-
actionSelectionValue: {
|
|
48
|
-
selectedItemId,
|
|
49
|
-
actionsMenuRef,
|
|
50
|
-
updateSelectedItem
|
|
51
|
-
},
|
|
52
|
-
children: template
|
|
53
|
-
}
|
|
54
|
-
);
|
|
24
|
+
if (isDefaultTooltipHandler(tooltipTemplate)) {
|
|
25
|
+
return template;
|
|
26
|
+
}
|
|
27
|
+
return /* @__PURE__ */ jsx(OverlayTooltip, { legacyTemplate: template });
|
|
55
28
|
};
|
|
56
29
|
DotLayerTooltip["displayName"] = "DotLayerTooltip";
|
|
57
30
|
export {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/map/components/DotLayer/DotLayerTooltip.tsx"],
|
|
4
|
-
"sourcesContent": ["import {
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["import { _OverlayTooltip as OverlayTooltip } from '@dynatrace/strato-components/charts';\n\nimport { useGeoLayerTooltip } from '../../hooks/use-geo-layer-tooltip.js';\nimport type { Location } from '../../types/location.js';\nimport type {\n DotLayerTooltipData,\n DotLayerTooltipHandler,\n} from '../../types/tooltip.js';\nimport { isDefaultTooltipHandler } from '../../utils/tooltip-type-guards.js';\n\ninterface DotTooltipStatePayload {\n __color: string;\n __hoveredColor: string;\n __bearing: number;\n data: Location;\n}\n\nexport interface DotLayerTooltipProps {\n tooltipTemplate?: DotLayerTooltipHandler;\n}\n\nexport const DotLayerTooltip = (props: DotLayerTooltipProps) => {\n const { tooltipTemplate } = props;\n\n const { data, inBounds, position } =\n useGeoLayerTooltip<DotTooltipStatePayload>('geoDot');\n\n if (!tooltipTemplate || !inBounds || !position) {\n return null;\n }\n\n if (!data || !data[0]) {\n return null;\n }\n\n const { __color: color, __bearing: bearing, data: customData } = data[0];\n const dotData: DotLayerTooltipData = {\n color,\n bearing,\n data: customData,\n };\n\n const template = tooltipTemplate(dotData);\n\n if (!template) {\n return null;\n }\n\n if (isDefaultTooltipHandler(tooltipTemplate)) {\n return template;\n }\n\n return <OverlayTooltip legacyTemplate={template} />;\n};\n\nDotLayerTooltip['displayName'] = 'DotLayerTooltip';\n"],
|
|
5
|
+
"mappings": "AAoDS;AApDT,SAAS,mBAAmB,sBAAsB;AAElD,SAAS,0BAA0B;AAMnC,SAAS,+BAA+B;AAajC,MAAM,kBAAkB,CAAC,UAAgC;AAC9D,QAAM,EAAE,gBAAgB,IAAI;AAE5B,QAAM,EAAE,MAAM,UAAU,SAAS,IAC/B,mBAA2C,QAAQ;AAErD,MAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,UAAU;AAC9C,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,SAAS,OAAO,WAAW,SAAS,MAAM,WAAW,IAAI,KAAK,CAAC;AACvE,QAAM,UAA+B;AAAA,IACnC;AAAA,IACA;AAAA,IACA,MAAM;AAAA,EACR;AAEA,QAAM,WAAW,gBAAgB,OAAO;AAExC,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,MAAI,wBAAwB,eAAe,GAAG;AAC5C,WAAO;AAAA,EACT;AAEA,SAAO,oBAAC,kBAAe,gBAAgB,UAAU;AACnD;AAEA,gBAAgB,aAAa,IAAI;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -9,14 +9,14 @@ import { useMapConfig } from "../../hooks/use-map-config.js";
|
|
|
9
9
|
import { useMapRawData } from "../../hooks/use-map-raw-data.js";
|
|
10
10
|
import { MapInitialViewProvider } from "../../providers/map-initial-view.provider.js";
|
|
11
11
|
import { useMapOverlayState } from "../../store/selectors.js";
|
|
12
|
-
import {
|
|
12
|
+
import { useSetState } from "../../store/store.js";
|
|
13
13
|
import { buildAndDownloadCsv } from "../../utils/build-and-download-csv.js";
|
|
14
14
|
const defaultToolbarPlacement = "top-right";
|
|
15
15
|
const MapToolbar = () => {
|
|
16
16
|
const { toolbar: toolbarConfig, interactions: interactionsConfig } = useMapConfig();
|
|
17
17
|
const data = useMapRawData();
|
|
18
18
|
const { mouseInBounds } = useMapOverlayState();
|
|
19
|
-
const
|
|
19
|
+
const setState = useSetState();
|
|
20
20
|
const isZoomEnabled = toolbarConfig?.zoom?.enabled ?? interactionsConfig?.zoom?.enabled ?? false;
|
|
21
21
|
const isZoomToFitEnabled = toolbarConfig?.zoom?.enabled ?? interactionsConfig?.zoomToFit?.enabled ?? false;
|
|
22
22
|
const isDownloadDataEnabled = toolbarConfig?.downloadCSV?.enabled ?? false;
|
|
@@ -24,14 +24,16 @@ const MapToolbar = () => {
|
|
|
24
24
|
const hasControls = hasZoomControls || isDownloadDataEnabled;
|
|
25
25
|
const hasOnlyDownloadCSV = isDownloadDataEnabled && !hasZoomControls;
|
|
26
26
|
const handleMouseEnter = () => {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
setState((prev) => ({
|
|
28
|
+
...prev,
|
|
29
|
+
tooltip: { ...prev.tooltip, enabled: false }
|
|
30
|
+
}));
|
|
30
31
|
};
|
|
31
32
|
const handleMouseLeave = () => {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
setState((prev) => ({
|
|
34
|
+
...prev,
|
|
35
|
+
tooltip: { ...prev.tooltip, enabled: true }
|
|
36
|
+
}));
|
|
35
37
|
};
|
|
36
38
|
const handleDownloadDataToolbar = () => {
|
|
37
39
|
buildAndDownloadCsv(data);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/map/components/toolbar/MapToolbar.tsx"],
|
|
4
|
-
"sourcesContent": ["import { _ChartToolbarRenderer as ChartToolbarRenderer } from '@dynatrace/strato-components/charts';\n\nimport { MapDownloadDataButton } from './buttons/MapDownloadDataButton.js';\nimport { MapResetButton } from './buttons/MapResetButton.js';\nimport { MapZoomInOutButtons } from './buttons/MapZoomInOutButtons.js';\nimport { MapZoomToFitButton } from './buttons/MapZoomToFitButton.js';\nimport { initialA11yToolbarTabIndexContext } from './constants.js';\nimport { useMapConfig } from '../../hooks/use-map-config.js';\nimport { useMapRawData } from '../../hooks/use-map-raw-data.js';\nimport { MapInitialViewProvider } from '../../providers/map-initial-view.provider.js';\nimport { useMapOverlayState } from '../../store/selectors.js';\nimport {
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["import { _ChartToolbarRenderer as ChartToolbarRenderer } from '@dynatrace/strato-components/charts';\n\nimport { MapDownloadDataButton } from './buttons/MapDownloadDataButton.js';\nimport { MapResetButton } from './buttons/MapResetButton.js';\nimport { MapZoomInOutButtons } from './buttons/MapZoomInOutButtons.js';\nimport { MapZoomToFitButton } from './buttons/MapZoomToFitButton.js';\nimport { initialA11yToolbarTabIndexContext } from './constants.js';\nimport { useMapConfig } from '../../hooks/use-map-config.js';\nimport { useMapRawData } from '../../hooks/use-map-raw-data.js';\nimport { MapInitialViewProvider } from '../../providers/map-initial-view.provider.js';\nimport { useMapOverlayState } from '../../store/selectors.js';\nimport { useSetState } from '../../store/store.js';\nimport { buildAndDownloadCsv } from '../../utils/build-and-download-csv.js';\n\nconst defaultToolbarPlacement = 'top-right';\n\nexport const MapToolbar = () => {\n const { toolbar: toolbarConfig, interactions: interactionsConfig } =\n useMapConfig();\n const data = useMapRawData();\n\n const { mouseInBounds } = useMapOverlayState();\n const setState = useSetState();\n const isZoomEnabled =\n toolbarConfig?.zoom?.enabled ?? interactionsConfig?.zoom?.enabled ?? false;\n const isZoomToFitEnabled =\n toolbarConfig?.zoom?.enabled ??\n interactionsConfig?.zoomToFit?.enabled ??\n false;\n const isDownloadDataEnabled = toolbarConfig?.downloadCSV?.enabled ?? false;\n\n const hasZoomControls = isZoomEnabled || isZoomToFitEnabled;\n const hasControls = hasZoomControls || isDownloadDataEnabled;\n const hasOnlyDownloadCSV = isDownloadDataEnabled && !hasZoomControls;\n\n const handleMouseEnter = () => {\n setState((prev) => ({\n ...prev,\n tooltip: { ...prev.tooltip, enabled: false },\n }));\n };\n\n const handleMouseLeave = () => {\n setState((prev) => ({\n ...prev,\n tooltip: { ...prev.tooltip, enabled: true },\n }));\n };\n\n const handleDownloadDataToolbar = () => {\n buildAndDownloadCsv(data);\n };\n\n return hasControls ? (\n <MapInitialViewProvider>\n <ChartToolbarRenderer\n visible={mouseInBounds}\n collapsed={toolbarConfig?.collapsed}\n draggable={toolbarConfig?.draggable}\n placement={toolbarConfig?.placement ?? defaultToolbarPlacement}\n handleDownloadDataToolbar={handleDownloadDataToolbar}\n isDownloadEnabled={!hasOnlyDownloadCSV && isDownloadDataEnabled}\n initialA11yState={initialA11yToolbarTabIndexContext}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n menuDisplayMode=\"never\"\n >\n {isZoomEnabled && <MapZoomInOutButtons />}\n {isZoomEnabled && <MapResetButton />}\n {isZoomToFitEnabled && <MapZoomToFitButton />}\n {isDownloadDataEnabled && <MapDownloadDataButton />}\n </ChartToolbarRenderer>\n </MapInitialViewProvider>\n ) : null;\n};\n\nMapToolbar['displayName'] = 'MapToolbar';\n"],
|
|
5
|
+
"mappings": "AAuDM,SAYoB,KAZpB;AAvDN,SAAS,yBAAyB,4BAA4B;AAE9D,SAAS,6BAA6B;AACtC,SAAS,sBAAsB;AAC/B,SAAS,2BAA2B;AACpC,SAAS,0BAA0B;AACnC,SAAS,yCAAyC;AAClD,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,8BAA8B;AACvC,SAAS,0BAA0B;AACnC,SAAS,mBAAmB;AAC5B,SAAS,2BAA2B;AAEpC,MAAM,0BAA0B;AAEzB,MAAM,aAAa,MAAM;AAC9B,QAAM,EAAE,SAAS,eAAe,cAAc,mBAAmB,IAC/D,aAAa;AACf,QAAM,OAAO,cAAc;AAE3B,QAAM,EAAE,cAAc,IAAI,mBAAmB;AAC7C,QAAM,WAAW,YAAY;AAC7B,QAAM,gBACJ,eAAe,MAAM,WAAW,oBAAoB,MAAM,WAAW;AACvE,QAAM,qBACJ,eAAe,MAAM,WACrB,oBAAoB,WAAW,WAC/B;AACF,QAAM,wBAAwB,eAAe,aAAa,WAAW;AAErE,QAAM,kBAAkB,iBAAiB;AACzC,QAAM,cAAc,mBAAmB;AACvC,QAAM,qBAAqB,yBAAyB,CAAC;AAErD,QAAM,mBAAmB,MAAM;AAC7B,aAAS,CAAC,UAAU;AAAA,MAClB,GAAG;AAAA,MACH,SAAS,EAAE,GAAG,KAAK,SAAS,SAAS,MAAM;AAAA,IAC7C,EAAE;AAAA,EACJ;AAEA,QAAM,mBAAmB,MAAM;AAC7B,aAAS,CAAC,UAAU;AAAA,MAClB,GAAG;AAAA,MACH,SAAS,EAAE,GAAG,KAAK,SAAS,SAAS,KAAK;AAAA,IAC5C,EAAE;AAAA,EACJ;AAEA,QAAM,4BAA4B,MAAM;AACtC,wBAAoB,IAAI;AAAA,EAC1B;AAEA,SAAO,cACL,oBAAC,0BACC;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,MACT,WAAW,eAAe;AAAA,MAC1B,WAAW,eAAe;AAAA,MAC1B,WAAW,eAAe,aAAa;AAAA,MACvC;AAAA,MACA,mBAAmB,CAAC,sBAAsB;AAAA,MAC1C,kBAAkB;AAAA,MAClB,cAAc;AAAA,MACd,cAAc;AAAA,MACd,iBAAgB;AAAA,MAEf;AAAA,yBAAiB,oBAAC,uBAAoB;AAAA,QACtC,iBAAiB,oBAAC,kBAAe;AAAA,QACjC,sBAAsB,oBAAC,sBAAmB;AAAA,QAC1C,yBAAyB,oBAAC,yBAAsB;AAAA;AAAA;AAAA,EACnD,GACF,IACE;AACN;AAEA,WAAW,aAAa,IAAI;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import {
|
|
2
|
+
useGeoOverlayTooltipState,
|
|
3
|
+
useGeoTooltipSync,
|
|
4
|
+
useOverlayTooltipSelector
|
|
5
|
+
} from "./use-geo-tooltip-sync.js";
|
|
6
|
+
import { useGetPosition } from "./use-get-position.js";
|
|
7
|
+
import { useSelector } from "../store/selectors.js";
|
|
8
|
+
const useGeoLayerTooltip = (geometryType) => {
|
|
9
|
+
const enabled = useSelector(({ tooltip }) => tooltip.enabled);
|
|
10
|
+
const { data, pinned, inBounds } = useGeoOverlayTooltipState();
|
|
11
|
+
const forceHideTooltip = !pinned && (!inBounds || !enabled);
|
|
12
|
+
const markerPosition = useGetPosition(pinned, !forceHideTooltip);
|
|
13
|
+
const storePosition = useOverlayTooltipSelector(
|
|
14
|
+
(state) => state.inBounds && typeof state.absoluteX === "number" && typeof state.absoluteY === "number" ? { x: state.absoluteX, y: state.absoluteY } : null
|
|
15
|
+
);
|
|
16
|
+
const position = pinned ? markerPosition : storePosition;
|
|
17
|
+
useGeoTooltipSync(position, pinned, geometryType, data ?? void 0);
|
|
18
|
+
return { data, pinned, inBounds, position };
|
|
19
|
+
};
|
|
20
|
+
export {
|
|
21
|
+
useGeoLayerTooltip
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=use-geo-layer-tooltip.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/map/hooks/use-geo-layer-tooltip.ts"],
|
|
4
|
+
"sourcesContent": ["import type { _OverlayTooltipGeometryTypes as GeometryTypes } from '@dynatrace/strato-components/charts';\n\nimport {\n useGeoOverlayTooltipState,\n useGeoTooltipSync,\n useOverlayTooltipSelector,\n} from './use-geo-tooltip-sync.js';\nimport { useGetPosition } from './use-get-position.js';\nimport { useSelector } from '../store/selectors.js';\n\nexport const useGeoLayerTooltip = <T>(geometryType: GeometryTypes) => {\n const enabled = useSelector(({ tooltip }) => tooltip.enabled);\n\n const { data, pinned, inBounds } = useGeoOverlayTooltipState<T>();\n\n const forceHideTooltip = !pinned && (!inBounds || !enabled);\n const markerPosition = useGetPosition(pinned, !forceHideTooltip);\n\n const storePosition = useOverlayTooltipSelector((state) =>\n state.inBounds &&\n typeof state.absoluteX === 'number' &&\n typeof state.absoluteY === 'number'\n ? { x: state.absoluteX, y: state.absoluteY }\n : null,\n );\n\n const position = pinned ? markerPosition : storePosition;\n\n useGeoTooltipSync(position, pinned, geometryType, data ?? undefined);\n\n return { data, pinned, inBounds, position };\n};\n"],
|
|
5
|
+
"mappings": "AAEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,sBAAsB;AAC/B,SAAS,mBAAmB;AAErB,MAAM,qBAAqB,CAAI,iBAAgC;AACpE,QAAM,UAAU,YAAY,CAAC,EAAE,QAAQ,MAAM,QAAQ,OAAO;AAE5D,QAAM,EAAE,MAAM,QAAQ,SAAS,IAAI,0BAA6B;AAEhE,QAAM,mBAAmB,CAAC,WAAW,CAAC,YAAY,CAAC;AACnD,QAAM,iBAAiB,eAAe,QAAQ,CAAC,gBAAgB;AAE/D,QAAM,gBAAgB;AAAA,IAA0B,CAAC,UAC/C,MAAM,YACN,OAAO,MAAM,cAAc,YAC3B,OAAO,MAAM,cAAc,WACvB,EAAE,GAAG,MAAM,WAAW,GAAG,MAAM,UAAU,IACzC;AAAA,EACN;AAEA,QAAM,WAAW,SAAS,iBAAiB;AAE3C,oBAAkB,UAAU,QAAQ,cAAc,QAAQ,MAAS;AAEnE,SAAO,EAAE,MAAM,QAAQ,UAAU,SAAS;AAC5C;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { isEqual } from "lodash-es";
|
|
2
|
+
import { useCallback, useEffect, useRef, useSyncExternalStore } from "react";
|
|
3
|
+
import {
|
|
4
|
+
_useOverlayTooltipStore as useOverlayTooltipStore,
|
|
5
|
+
_useOverlayTooltipReducer as useTooltipReducer
|
|
6
|
+
} from "@dynatrace/strato-components/charts";
|
|
7
|
+
import { buildGeoTooltipState } from "../utils/build-geo-tooltip-state.js";
|
|
8
|
+
const useOverlayTooltipSelector = (selector) => {
|
|
9
|
+
const store = useOverlayTooltipStore();
|
|
10
|
+
const prevRef = useRef(void 0);
|
|
11
|
+
const getSnapshot = useCallback(() => {
|
|
12
|
+
const next = selector(store.getState());
|
|
13
|
+
if (prevRef.current !== void 0 && isEqual(prevRef.current, next)) {
|
|
14
|
+
return prevRef.current;
|
|
15
|
+
}
|
|
16
|
+
prevRef.current = next;
|
|
17
|
+
return next;
|
|
18
|
+
}, [store, selector]);
|
|
19
|
+
return useSyncExternalStore(store.subscribe, getSnapshot);
|
|
20
|
+
};
|
|
21
|
+
const useGeoOverlayTooltipState = () => {
|
|
22
|
+
const metadata = useOverlayTooltipSelector(
|
|
23
|
+
(state) => state.data?.metadata
|
|
24
|
+
);
|
|
25
|
+
const pinned = useOverlayTooltipSelector((state) => state.pinned);
|
|
26
|
+
const inBounds = useOverlayTooltipSelector((state) => state.inBounds);
|
|
27
|
+
return { data: metadata, pinned, inBounds };
|
|
28
|
+
};
|
|
29
|
+
const useGeoTooltipSync = (position, pinned, geometryType, geoData) => {
|
|
30
|
+
const store = useOverlayTooltipStore();
|
|
31
|
+
const dispatch = useTooltipReducer();
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
const onScroll = () => {
|
|
34
|
+
if (store.getState().pinned) {
|
|
35
|
+
dispatch({ type: "TOOLTIP_MOUSE_LEAVE" })();
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
document.body.addEventListener("scroll", onScroll, true);
|
|
39
|
+
return () => {
|
|
40
|
+
document.body.removeEventListener("scroll", onScroll, true);
|
|
41
|
+
};
|
|
42
|
+
}, [store, dispatch]);
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
if (position) {
|
|
45
|
+
const nextState = buildGeoTooltipState({
|
|
46
|
+
absoluteX: position.x,
|
|
47
|
+
absoluteY: position.y,
|
|
48
|
+
relativeX: position.x,
|
|
49
|
+
relativeY: position.y,
|
|
50
|
+
pinned,
|
|
51
|
+
geometry: geometryType,
|
|
52
|
+
metadata: geoData
|
|
53
|
+
});
|
|
54
|
+
const current = store.getState();
|
|
55
|
+
if (current.absoluteX !== nextState.absoluteX || current.absoluteY !== nextState.absoluteY || current.inBounds !== nextState.inBounds || current.pinned !== nextState.pinned || !isEqual(current.data?.metadata, nextState.data.metadata)) {
|
|
56
|
+
store.setState(nextState);
|
|
57
|
+
}
|
|
58
|
+
} else {
|
|
59
|
+
const currentState = store.getState();
|
|
60
|
+
if (currentState.inBounds || currentState.pinned) {
|
|
61
|
+
dispatch({ type: "SET_OUT_BOUNDS" })();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}, [
|
|
65
|
+
position?.x,
|
|
66
|
+
position?.y,
|
|
67
|
+
pinned,
|
|
68
|
+
geometryType,
|
|
69
|
+
geoData,
|
|
70
|
+
store,
|
|
71
|
+
dispatch
|
|
72
|
+
]);
|
|
73
|
+
};
|
|
74
|
+
export {
|
|
75
|
+
useGeoOverlayTooltipState,
|
|
76
|
+
useGeoTooltipSync,
|
|
77
|
+
useOverlayTooltipSelector
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=use-geo-tooltip-sync.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/map/hooks/use-geo-tooltip-sync.ts"],
|
|
4
|
+
"sourcesContent": ["import { isEqual } from 'lodash-es';\nimport { useCallback, useEffect, useRef, useSyncExternalStore } from 'react';\n\nimport {\n _useOverlayTooltipStore as useOverlayTooltipStore,\n _useOverlayTooltipReducer as useTooltipReducer,\n type _OverlayTooltipGeometryTypes as GeometryTypes,\n type _OverlayTooltipState as TooltipState,\n} from '@dynatrace/strato-components/charts';\n\nimport { buildGeoTooltipState } from '../utils/build-geo-tooltip-state.js';\n\ntype Position = { x: number; y: number } | null | undefined;\n\nexport const useOverlayTooltipSelector = <S>(\n selector: (state: TooltipState) => S,\n): S => {\n const store = useOverlayTooltipStore();\n const prevRef = useRef<S | undefined>(undefined);\n\n const getSnapshot = useCallback(() => {\n const next = selector(store.getState());\n\n if (prevRef.current !== undefined && isEqual(prevRef.current, next)) {\n return prevRef.current;\n }\n\n prevRef.current = next;\n return next;\n }, [store, selector]);\n\n return useSyncExternalStore(store.subscribe, getSnapshot);\n};\n\nexport const useGeoOverlayTooltipState = <T>() => {\n const metadata = useOverlayTooltipSelector(\n (state) => state.data?.metadata as T[] | undefined,\n );\n const pinned = useOverlayTooltipSelector((state) => state.pinned);\n const inBounds = useOverlayTooltipSelector((state) => state.inBounds);\n\n return { data: metadata, pinned, inBounds };\n};\n\n/**\n * Syncs position, pinned state, and layer-specific data from the geo map\n * into the OverlayTooltip store.\n *\n * Position updates set the store state directly because the reducer's\n * SET_POSITION / SET_PINNED rely on `overlay.getBounds()`, which is\n * always `undefined` in the geo context (the overlay ref is never\n * attached to a DOM element).\n *\n * @internal\n */\nexport const useGeoTooltipSync = (\n position: Position,\n pinned: boolean,\n geometryType: GeometryTypes,\n geoData?: unknown[] | undefined,\n) => {\n const store = useOverlayTooltipStore();\n const dispatch = useTooltipReducer();\n\n useEffect(() => {\n const onScroll = () => {\n if (store.getState().pinned) {\n dispatch({ type: 'TOOLTIP_MOUSE_LEAVE' })();\n }\n };\n\n document.body.addEventListener('scroll', onScroll, true);\n return () => {\n document.body.removeEventListener('scroll', onScroll, true);\n };\n }, [store, dispatch]);\n\n useEffect(() => {\n if (position) {\n const nextState = buildGeoTooltipState({\n absoluteX: position.x,\n absoluteY: position.y,\n relativeX: position.x,\n relativeY: position.y,\n pinned,\n geometry: geometryType,\n metadata: geoData,\n });\n\n const current = store.getState();\n if (\n current.absoluteX !== nextState.absoluteX ||\n current.absoluteY !== nextState.absoluteY ||\n current.inBounds !== nextState.inBounds ||\n current.pinned !== nextState.pinned ||\n !isEqual(current.data?.metadata, nextState.data.metadata)\n ) {\n store.setState(nextState);\n }\n } else {\n const currentState = store.getState();\n\n // Only dispatch if the store isn't already in the \"hidden\" state.\n if (currentState.inBounds || currentState.pinned) {\n dispatch({ type: 'SET_OUT_BOUNDS' })();\n }\n }\n }, [\n position?.x,\n position?.y,\n pinned,\n geometryType,\n geoData,\n store,\n dispatch,\n ]);\n};\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,eAAe;AACxB,SAAS,aAAa,WAAW,QAAQ,4BAA4B;AAErE;AAAA,EACE,2BAA2B;AAAA,EAC3B,6BAA6B;AAAA,OAGxB;AAEP,SAAS,4BAA4B;AAI9B,MAAM,4BAA4B,CACvC,aACM;AACN,QAAM,QAAQ,uBAAuB;AACrC,QAAM,UAAU,OAAsB,MAAS;AAE/C,QAAM,cAAc,YAAY,MAAM;AACpC,UAAM,OAAO,SAAS,MAAM,SAAS,CAAC;AAEtC,QAAI,QAAQ,YAAY,UAAa,QAAQ,QAAQ,SAAS,IAAI,GAAG;AACnE,aAAO,QAAQ;AAAA,IACjB;AAEA,YAAQ,UAAU;AAClB,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,QAAQ,CAAC;AAEpB,SAAO,qBAAqB,MAAM,WAAW,WAAW;AAC1D;AAEO,MAAM,4BAA4B,MAAS;AAChD,QAAM,WAAW;AAAA,IACf,CAAC,UAAU,MAAM,MAAM;AAAA,EACzB;AACA,QAAM,SAAS,0BAA0B,CAAC,UAAU,MAAM,MAAM;AAChE,QAAM,WAAW,0BAA0B,CAAC,UAAU,MAAM,QAAQ;AAEpE,SAAO,EAAE,MAAM,UAAU,QAAQ,SAAS;AAC5C;AAaO,MAAM,oBAAoB,CAC/B,UACA,QACA,cACA,YACG;AACH,QAAM,QAAQ,uBAAuB;AACrC,QAAM,WAAW,kBAAkB;AAEnC,YAAU,MAAM;AACd,UAAM,WAAW,MAAM;AACrB,UAAI,MAAM,SAAS,EAAE,QAAQ;AAC3B,iBAAS,EAAE,MAAM,sBAAsB,CAAC,EAAE;AAAA,MAC5C;AAAA,IACF;AAEA,aAAS,KAAK,iBAAiB,UAAU,UAAU,IAAI;AACvD,WAAO,MAAM;AACX,eAAS,KAAK,oBAAoB,UAAU,UAAU,IAAI;AAAA,IAC5D;AAAA,EACF,GAAG,CAAC,OAAO,QAAQ,CAAC;AAEpB,YAAU,MAAM;AACd,QAAI,UAAU;AACZ,YAAM,YAAY,qBAAqB;AAAA,QACrC,WAAW,SAAS;AAAA,QACpB,WAAW,SAAS;AAAA,QACpB,WAAW,SAAS;AAAA,QACpB,WAAW,SAAS;AAAA,QACpB;AAAA,QACA,UAAU;AAAA,QACV,UAAU;AAAA,MACZ,CAAC;AAED,YAAM,UAAU,MAAM,SAAS;AAC/B,UACE,QAAQ,cAAc,UAAU,aAChC,QAAQ,cAAc,UAAU,aAChC,QAAQ,aAAa,UAAU,YAC/B,QAAQ,WAAW,UAAU,UAC7B,CAAC,QAAQ,QAAQ,MAAM,UAAU,UAAU,KAAK,QAAQ,GACxD;AACA,cAAM,SAAS,SAAS;AAAA,MAC1B;AAAA,IACF,OAAO;AACL,YAAM,eAAe,MAAM,SAAS;AAGpC,UAAI,aAAa,YAAY,aAAa,QAAQ;AAChD,iBAAS,EAAE,MAAM,iBAAiB,CAAC,EAAE;AAAA,MACvC;AAAA,IACF;AAAA,EACF,GAAG;AAAA,IACD,UAAU;AAAA,IACV,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,56 +1,125 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
} from "
|
|
2
|
+
_useOverlayTooltipReducer as useTooltipReducer,
|
|
3
|
+
_useOverlayTooltipStore as useOverlayTooltipStore,
|
|
4
|
+
_useOverlayChart as useOverlayChart
|
|
5
|
+
} from "@dynatrace/strato-components/charts";
|
|
6
|
+
import { useSetStateOverlay, useSetState } from "../store/store.js";
|
|
7
|
+
import { buildGeoTooltipState } from "../utils/build-geo-tooltip-state.js";
|
|
6
8
|
import { extractDataFromEvent } from "../utils/parse-tooltip-data.js";
|
|
9
|
+
const layerIdToGeometry = (layerId) => {
|
|
10
|
+
if (layerId?.includes("bubble")) {
|
|
11
|
+
return "geoBubble";
|
|
12
|
+
}
|
|
13
|
+
if (layerId?.includes("choropleth")) {
|
|
14
|
+
return "geoChoropleth";
|
|
15
|
+
}
|
|
16
|
+
if (layerId?.includes("connection")) {
|
|
17
|
+
return "geoConnection";
|
|
18
|
+
}
|
|
19
|
+
return "geoDot";
|
|
20
|
+
};
|
|
7
21
|
const useOverlayEvents = () => {
|
|
8
22
|
const setOverlayState = useSetStateOverlay();
|
|
9
|
-
const
|
|
10
|
-
const
|
|
23
|
+
const setState = useSetState();
|
|
24
|
+
const dispatch = useTooltipReducer();
|
|
25
|
+
const store = useOverlayTooltipStore();
|
|
26
|
+
const overlay = useOverlayChart();
|
|
27
|
+
const getAbsolutePosition = (event) => {
|
|
28
|
+
return {
|
|
29
|
+
x: Math.round(event.originalEvent.clientX),
|
|
30
|
+
y: Math.round(event.originalEvent.clientY)
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
const setTooltipMarker = (hoveredLayerId, location) => {
|
|
34
|
+
setState((prev) => ({
|
|
35
|
+
...prev,
|
|
36
|
+
tooltip: {
|
|
37
|
+
...prev.tooltip,
|
|
38
|
+
hoveredLayerId,
|
|
39
|
+
location
|
|
40
|
+
}
|
|
41
|
+
}));
|
|
42
|
+
};
|
|
11
43
|
const hideTooltip = () => {
|
|
12
|
-
|
|
44
|
+
dispatch({ type: "RESET_TOOLTIP" })();
|
|
45
|
+
setTooltipMarker(void 0, void 0);
|
|
13
46
|
};
|
|
14
47
|
const handleMouseEnter = () => {
|
|
15
|
-
setOverlayState({
|
|
16
|
-
mouseInBounds: true
|
|
17
|
-
});
|
|
48
|
+
setOverlayState({ mouseInBounds: true });
|
|
18
49
|
};
|
|
19
50
|
const handleMouseMove = (event) => {
|
|
20
51
|
if (event.features?.length) {
|
|
52
|
+
const currentState = store.getState();
|
|
53
|
+
if (currentState.pinned) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
21
56
|
const { data, hoveredLayerId } = extractDataFromEvent(event);
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
57
|
+
overlay.clear();
|
|
58
|
+
setTooltipMarker(hoveredLayerId, event.lngLat);
|
|
59
|
+
const pos = getAbsolutePosition(event);
|
|
60
|
+
store.setState(
|
|
61
|
+
buildGeoTooltipState({
|
|
62
|
+
absoluteX: pos.x,
|
|
63
|
+
absoluteY: pos.y,
|
|
64
|
+
relativeX: Math.round(event.point.x),
|
|
65
|
+
relativeY: Math.round(event.point.y),
|
|
66
|
+
pinned: false,
|
|
67
|
+
geometry: layerIdToGeometry(hoveredLayerId),
|
|
68
|
+
metadata: data
|
|
69
|
+
})
|
|
70
|
+
);
|
|
28
71
|
} else {
|
|
29
|
-
|
|
72
|
+
const currentState = store.getState();
|
|
73
|
+
if (!currentState.pinned) {
|
|
74
|
+
hideTooltip();
|
|
75
|
+
}
|
|
30
76
|
}
|
|
31
77
|
};
|
|
32
78
|
const handleMouseLeave = () => {
|
|
33
|
-
setOverlayState({
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
79
|
+
setOverlayState({ mouseInBounds: false });
|
|
80
|
+
const currentState = store.getState();
|
|
81
|
+
if (!currentState.pinned) {
|
|
82
|
+
hideTooltip();
|
|
83
|
+
}
|
|
37
84
|
};
|
|
38
85
|
const handleMouseClick = (event) => {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
86
|
+
const { data, featureId, hoveredLayerId } = extractDataFromEvent(event);
|
|
87
|
+
if (!featureId) {
|
|
88
|
+
hideTooltip();
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (!hoveredLayerId) {
|
|
92
|
+
hideTooltip();
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
overlay.clear();
|
|
96
|
+
setTooltipMarker(hoveredLayerId, event.lngLat);
|
|
97
|
+
const pos = getAbsolutePosition(event);
|
|
98
|
+
store.setState(
|
|
99
|
+
buildGeoTooltipState({
|
|
100
|
+
absoluteX: pos.x,
|
|
101
|
+
absoluteY: pos.y,
|
|
102
|
+
relativeX: Math.round(event.point.x),
|
|
103
|
+
relativeY: Math.round(event.point.y),
|
|
104
|
+
pinned: true,
|
|
105
|
+
geometry: layerIdToGeometry(hoveredLayerId),
|
|
106
|
+
metadata: data
|
|
107
|
+
})
|
|
108
|
+
);
|
|
43
109
|
};
|
|
44
|
-
const
|
|
45
|
-
|
|
110
|
+
const hideTooltipIfNotPinned = () => {
|
|
111
|
+
const currentState = store.getState();
|
|
112
|
+
if (!currentState.pinned) {
|
|
113
|
+
hideTooltip();
|
|
114
|
+
}
|
|
46
115
|
};
|
|
47
116
|
return {
|
|
48
117
|
handleMouseEnter,
|
|
49
118
|
handleMouseMove,
|
|
50
119
|
handleMouseLeave,
|
|
51
120
|
handleMouseClick,
|
|
52
|
-
handleZoom,
|
|
53
|
-
handleDrag
|
|
121
|
+
handleZoom: hideTooltipIfNotPinned,
|
|
122
|
+
handleDrag: hideTooltipIfNotPinned
|
|
54
123
|
};
|
|
55
124
|
};
|
|
56
125
|
export {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/map/hooks/use-overlay-events.ts"],
|
|
4
|
-
"sourcesContent": ["import type { MapLayerMouseEvent } from 'maplibre-gl';\n\nimport {\n
|
|
5
|
-
"mappings": "AAEA;AAAA,EACE;AAAA,
|
|
4
|
+
"sourcesContent": ["import type { MapLayerMouseEvent } from 'maplibre-gl';\n\nimport {\n _useOverlayTooltipReducer as useTooltipReducer,\n _useOverlayTooltipStore as useOverlayTooltipStore,\n _useOverlayChart as useOverlayChart,\n type _OverlayTooltipGeometryTypes as GeometryTypes,\n} from '@dynatrace/strato-components/charts';\n\nimport { useSetStateOverlay, useSetState } from '../store/store.js';\nimport { buildGeoTooltipState } from '../utils/build-geo-tooltip-state.js';\nimport { extractDataFromEvent } from '../utils/parse-tooltip-data.js';\n\nconst layerIdToGeometry = (layerId: string | undefined): GeometryTypes => {\n if (layerId?.includes('bubble')) {\n return 'geoBubble';\n }\n if (layerId?.includes('choropleth')) {\n return 'geoChoropleth';\n }\n if (layerId?.includes('connection')) {\n return 'geoConnection';\n }\n return 'geoDot';\n};\n\nexport const useOverlayEvents = () => {\n const setOverlayState = useSetStateOverlay();\n const setState = useSetState();\n const dispatch = useTooltipReducer();\n const store = useOverlayTooltipStore();\n const overlay = useOverlayChart();\n\n const getAbsolutePosition = (event: MapLayerMouseEvent) => {\n return {\n x: Math.round(event.originalEvent.clientX),\n y: Math.round(event.originalEvent.clientY),\n };\n };\n\n const setTooltipMarker = (\n hoveredLayerId: string | undefined,\n location: { lng: number; lat: number } | undefined,\n ) => {\n setState((prev) => ({\n ...prev,\n tooltip: {\n ...prev.tooltip,\n hoveredLayerId,\n location: location as typeof prev.tooltip.location,\n },\n }));\n };\n\n const hideTooltip = () => {\n dispatch({ type: 'RESET_TOOLTIP' })();\n setTooltipMarker(undefined, undefined);\n };\n\n const handleMouseEnter = () => {\n setOverlayState({ mouseInBounds: true });\n };\n\n const handleMouseMove = (event: MapLayerMouseEvent) => {\n if (event.features?.length) {\n const currentState = store.getState();\n\n if (currentState.pinned) {\n return;\n }\n\n const { data, hoveredLayerId } = extractDataFromEvent(event);\n\n overlay.clear();\n\n setTooltipMarker(hoveredLayerId, event.lngLat);\n\n const pos = getAbsolutePosition(event);\n store.setState(\n buildGeoTooltipState({\n absoluteX: pos.x,\n absoluteY: pos.y,\n relativeX: Math.round(event.point.x),\n relativeY: Math.round(event.point.y),\n pinned: false,\n geometry: layerIdToGeometry(hoveredLayerId),\n metadata: data,\n }),\n );\n } else {\n const currentState = store.getState();\n if (!currentState.pinned) {\n hideTooltip();\n }\n }\n };\n\n const handleMouseLeave = () => {\n setOverlayState({ mouseInBounds: false });\n const currentState = store.getState();\n if (!currentState.pinned) {\n hideTooltip();\n }\n };\n\n const handleMouseClick = (event: MapLayerMouseEvent) => {\n const { data, featureId, hoveredLayerId } = extractDataFromEvent(event);\n\n if (!featureId) {\n hideTooltip();\n return;\n }\n\n if (!hoveredLayerId) {\n hideTooltip();\n return;\n }\n\n overlay.clear();\n\n setTooltipMarker(hoveredLayerId, event.lngLat);\n\n const pos = getAbsolutePosition(event);\n store.setState(\n buildGeoTooltipState({\n absoluteX: pos.x,\n absoluteY: pos.y,\n relativeX: Math.round(event.point.x),\n relativeY: Math.round(event.point.y),\n pinned: true,\n geometry: layerIdToGeometry(hoveredLayerId),\n metadata: data,\n }),\n );\n };\n\n const hideTooltipIfNotPinned = () => {\n const currentState = store.getState();\n if (!currentState.pinned) {\n hideTooltip();\n }\n };\n\n return {\n handleMouseEnter,\n handleMouseMove,\n handleMouseLeave,\n handleMouseClick,\n handleZoom: hideTooltipIfNotPinned,\n handleDrag: hideTooltipIfNotPinned,\n };\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import { useCallback, useEffect } from "react";
|
|
2
|
-
import {
|
|
2
|
+
import { _useOverlayTooltipReducer as useTooltipReducer } from "@dynatrace/strato-components/charts";
|
|
3
|
+
import { useOverlayTooltipSelector } from "./use-geo-tooltip-sync.js";
|
|
3
4
|
const useTooltipEventListeners = () => {
|
|
4
|
-
const
|
|
5
|
-
const pinned =
|
|
5
|
+
const dispatch = useTooltipReducer();
|
|
6
|
+
const pinned = useOverlayTooltipSelector((state) => state.pinned);
|
|
6
7
|
const onEscapeKeyPressedHandler = useCallback(
|
|
7
8
|
(event) => {
|
|
8
9
|
if (pinned && event.key === "Escape") {
|
|
9
|
-
|
|
10
|
+
dispatch({ type: "RESET_TOOLTIP" })();
|
|
10
11
|
}
|
|
11
12
|
},
|
|
12
|
-
[pinned]
|
|
13
|
+
[pinned, dispatch]
|
|
13
14
|
);
|
|
14
15
|
useEffect(() => {
|
|
15
16
|
window.addEventListener("keyup", onEscapeKeyPressedHandler);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/map/hooks/use-tooltip-event-listeners.ts"],
|
|
4
|
-
"sourcesContent": ["import { useCallback, useEffect } from 'react';\n\nimport {
|
|
5
|
-
"mappings": "AAAA,SAAS,aAAa,iBAAiB;AAEvC,SAAS,
|
|
4
|
+
"sourcesContent": ["import { useCallback, useEffect } from 'react';\n\nimport { _useOverlayTooltipReducer as useTooltipReducer } from '@dynatrace/strato-components/charts';\n\nimport { useOverlayTooltipSelector } from './use-geo-tooltip-sync.js';\n\nexport const useTooltipEventListeners = () => {\n const dispatch = useTooltipReducer();\n const pinned = useOverlayTooltipSelector((state) => state.pinned);\n\n const onEscapeKeyPressedHandler = useCallback(\n (event: KeyboardEvent) => {\n if (pinned && event.key === 'Escape') {\n dispatch({ type: 'RESET_TOOLTIP' })();\n }\n },\n [pinned, dispatch],\n );\n\n useEffect(() => {\n window.addEventListener('keyup', onEscapeKeyPressedHandler);\n\n return () => {\n window.removeEventListener('keyup', onEscapeKeyPressedHandler);\n };\n }, [onEscapeKeyPressedHandler]);\n};\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,aAAa,iBAAiB;AAEvC,SAAS,6BAA6B,yBAAyB;AAE/D,SAAS,iCAAiC;AAEnC,MAAM,2BAA2B,MAAM;AAC5C,QAAM,WAAW,kBAAkB;AACnC,QAAM,SAAS,0BAA0B,CAAC,UAAU,MAAM,MAAM;AAEhE,QAAM,4BAA4B;AAAA,IAChC,CAAC,UAAyB;AACxB,UAAI,UAAU,MAAM,QAAQ,UAAU;AACpC,iBAAS,EAAE,MAAM,gBAAgB,CAAC,EAAE;AAAA,MACtC;AAAA,IACF;AAAA,IACA,CAAC,QAAQ,QAAQ;AAAA,EACnB;AAEA,YAAU,MAAM;AACd,WAAO,iBAAiB,SAAS,yBAAyB;AAE1D,WAAO,MAAM;AACX,aAAO,oBAAoB,SAAS,yBAAyB;AAAA,IAC/D;AAAA,EACF,GAAG,CAAC,yBAAyB,CAAC;AAChC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -5,17 +5,37 @@ import {
|
|
|
5
5
|
isValidElement
|
|
6
6
|
} from "react";
|
|
7
7
|
import { DefaultTooltip } from "../components/DefaultTooltip/DefaultTooltip.js";
|
|
8
|
+
const defaultTooltipHandler = (closestPoint, layerData) => /* @__PURE__ */ jsx(DefaultTooltip, { closestPoint, layerData });
|
|
9
|
+
defaultTooltipHandler.__isDefault = true;
|
|
10
|
+
const createDefaultHandlerWithActions = (seriesActions) => {
|
|
11
|
+
const handler = (closestPoint, layerData) => /* @__PURE__ */ jsx(
|
|
12
|
+
DefaultTooltip,
|
|
13
|
+
{
|
|
14
|
+
closestPoint,
|
|
15
|
+
layerData,
|
|
16
|
+
seriesActions
|
|
17
|
+
}
|
|
18
|
+
);
|
|
19
|
+
handler.__isDefault = true;
|
|
20
|
+
return handler;
|
|
21
|
+
};
|
|
22
|
+
const isDefaultTooltipHandler = (handler) => handler.__isDefault ?? false;
|
|
8
23
|
function useTooltipTemplate(children, layerType) {
|
|
9
24
|
let template = void 0;
|
|
10
25
|
Children.forEach(children, (child) => {
|
|
11
26
|
if (isValidElement(child) && child.type === layerType) {
|
|
12
|
-
|
|
13
|
-
|
|
27
|
+
if (isNil(child.props.children)) {
|
|
28
|
+
template = child.props.seriesActions ? createDefaultHandlerWithActions(child.props.seriesActions) : defaultTooltipHandler;
|
|
29
|
+
} else {
|
|
30
|
+
template = child.props.children;
|
|
31
|
+
}
|
|
14
32
|
}
|
|
15
33
|
});
|
|
16
34
|
return template;
|
|
17
35
|
}
|
|
18
36
|
export {
|
|
37
|
+
defaultTooltipHandler,
|
|
38
|
+
isDefaultTooltipHandler,
|
|
19
39
|
useTooltipTemplate
|
|
20
40
|
};
|
|
21
41
|
//# sourceMappingURL=use-tooltip-template.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/map/hooks/use-tooltip-template.tsx"],
|
|
4
|
-
"sourcesContent": ["import { isNil } from 'lodash-es';\nimport {\n Children,\n type ReactNode,\n type JSXElementConstructor,\n isValidElement,\n} from 'react';\n\nimport { DefaultTooltip } from '../components/DefaultTooltip/DefaultTooltip.js';\nimport type {\n LayerTooltipData,\n LayerTooltipHandler,\n} from '../types/tooltip.js';\n\n/**\n * It returns the tooltip template handler or undefined (tooltip disabled).\n *\n *
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["import { isNil } from 'lodash-es';\nimport {\n Children,\n type ReactNode,\n type JSXElementConstructor,\n isValidElement,\n} from 'react';\n\nimport type { SeriesActionsTemplate } from '@dynatrace/strato-components/charts';\n\nimport { DefaultTooltip } from '../components/DefaultTooltip/DefaultTooltip.js';\nimport type { Location } from '../types/location.js';\nimport type {\n ChoroplethLayerTooltipData,\n LayerTooltipData,\n LayerTooltipHandler,\n} from '../types/tooltip.js';\n\nexport const defaultTooltipHandler: LayerTooltipHandler = (\n closestPoint: LayerTooltipData,\n layerData?: LayerTooltipData[],\n) => <DefaultTooltip closestPoint={closestPoint} layerData={layerData} />;\n\n(defaultTooltipHandler as { __isDefault?: boolean }).__isDefault = true;\n\nconst createDefaultHandlerWithActions = (\n seriesActions: (\n data: Location | ChoroplethLayerTooltipData,\n ) => SeriesActionsTemplate,\n): LayerTooltipHandler => {\n const handler: LayerTooltipHandler = (\n closestPoint: LayerTooltipData,\n layerData?: LayerTooltipData[],\n ) => (\n <DefaultTooltip\n closestPoint={closestPoint}\n layerData={layerData}\n seriesActions={seriesActions}\n />\n );\n (handler as { __isDefault?: boolean }).__isDefault = true;\n return handler;\n};\n\nexport const isDefaultTooltipHandler = (\n handler: LayerTooltipHandler,\n): boolean => (handler as { __isDefault?: boolean }).__isDefault ?? false;\n\n/**\n * It returns the tooltip template handler or undefined (tooltip disabled).\n *\n * - No tooltip slot found (undefined) \u2192 default tooltip handler.\n * - Tooltip slot with `null` children \u2192 `null` (tooltip disabled).\n * - Tooltip slot with `undefined` children \u2192 default tooltip handler.\n * - Tooltip slot with a custom handler \u2192 that handler.\n * @param children -\n * @param layerType -\n */\nexport function useTooltipTemplate<T>(\n children: ReactNode | undefined,\n layerType: string | JSXElementConstructor<T>,\n): LayerTooltipHandler | undefined {\n let template: LayerTooltipHandler | undefined = undefined;\n\n Children.forEach(children, (child) => {\n if (\n isValidElement<{\n children: LayerTooltipHandler;\n seriesActions?: (\n data: Location | ChoroplethLayerTooltipData,\n ) => SeriesActionsTemplate;\n }>(child) &&\n child.type === layerType\n ) {\n if (isNil(child.props.children)) {\n template = child.props.seriesActions\n ? createDefaultHandlerWithActions(child.props.seriesActions)\n : defaultTooltipHandler;\n } else {\n template = child.props.children;\n }\n }\n });\n\n return template;\n}\n"],
|
|
5
|
+
"mappings": "AAqBK;AArBL,SAAS,aAAa;AACtB;AAAA,EACE;AAAA,EAGA;AAAA,OACK;AAIP,SAAS,sBAAsB;AAQxB,MAAM,wBAA6C,CACxD,cACA,cACG,oBAAC,kBAAe,cAA4B,WAAsB;AAEtE,sBAAoD,cAAc;AAEnE,MAAM,kCAAkC,CACtC,kBAGwB;AACxB,QAAM,UAA+B,CACnC,cACA,cAEA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF;AAEF,EAAC,QAAsC,cAAc;AACrD,SAAO;AACT;AAEO,MAAM,0BAA0B,CACrC,YACa,QAAsC,eAAe;AAY7D,SAAS,mBACd,UACA,WACiC;AACjC,MAAI,WAA4C;AAEhD,WAAS,QAAQ,UAAU,CAAC,UAAU;AACpC,QACE,eAKG,KAAK,KACR,MAAM,SAAS,WACf;AACA,UAAI,MAAM,MAAM,MAAM,QAAQ,GAAG;AAC/B,mBAAW,MAAM,MAAM,gBACnB,gCAAgC,MAAM,MAAM,aAAa,IACzD;AAAA,MACN,OAAO;AACL,mBAAW,MAAM,MAAM;AAAA,MACzB;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AACT;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -3,13 +3,9 @@ import { createStore } from "@dynatrace/strato-components/core";
|
|
|
3
3
|
const initialSelection = { highlightedSeries: void 0, visible: void 0 };
|
|
4
4
|
const initialState = {
|
|
5
5
|
tooltip: {
|
|
6
|
-
pinned: false,
|
|
7
|
-
visible: false,
|
|
8
6
|
enabled: true,
|
|
9
|
-
pinnedId: void 0,
|
|
10
|
-
location: void 0,
|
|
11
7
|
hoveredLayerId: void 0,
|
|
12
|
-
|
|
8
|
+
location: void 0
|
|
13
9
|
},
|
|
14
10
|
overlay: {
|
|
15
11
|
mouseInBounds: false
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/map/store/map-store.context.ts"],
|
|
4
|
-
"sourcesContent": ["import { createContext } from 'react';\n\nimport { createStore, type Store } from '@dynatrace/strato-components/core';\n\nimport type { MapState } from '../types/state.js';\n\nconst initialSelection = { highlightedSeries: undefined, visible: undefined };\n\nexport const initialState: MapState = {\n tooltip: {\n
|
|
5
|
-
"mappings": "AAAA,SAAS,qBAAqB;AAE9B,SAAS,mBAA+B;AAIxC,MAAM,mBAAmB,EAAE,mBAAmB,QAAW,SAAS,OAAU;AAErE,MAAM,eAAyB;AAAA,EACpC,SAAS;AAAA,IACP,
|
|
4
|
+
"sourcesContent": ["import { createContext } from 'react';\n\nimport { createStore, type Store } from '@dynatrace/strato-components/core';\n\nimport type { MapState } from '../types/state.js';\n\nconst initialSelection = { highlightedSeries: undefined, visible: undefined };\n\nexport const initialState: MapState = {\n tooltip: {\n enabled: true,\n hoveredLayerId: undefined,\n location: undefined,\n },\n overlay: {\n mouseInBounds: false,\n },\n selection: initialSelection,\n zoom: {\n zoomInEnabled: true,\n zoomOutEnabled: true,\n zoomToFitEnabled: true,\n resetEnabled: false,\n },\n};\n\nexport const MapStore = createContext<Store<MapState>>(\n createStore<MapState>(initialState),\n);\n\nMapStore['displayName'] = 'MapStore';\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,qBAAqB;AAE9B,SAAS,mBAA+B;AAIxC,MAAM,mBAAmB,EAAE,mBAAmB,QAAW,SAAS,OAAU;AAErE,MAAM,eAAyB;AAAA,EACpC,SAAS;AAAA,IACP,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,UAAU;AAAA,EACZ;AAAA,EACA,SAAS;AAAA,IACP,eAAe;AAAA,EACjB;AAAA,EACA,WAAW;AAAA,EACX,MAAM;AAAA,IACJ,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AACF;AAEO,MAAM,WAAW;AAAA,EACtB,YAAsB,YAAY;AACpC;AAEA,SAAS,aAAa,IAAI;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|