@dynatrace/strato-geo 3.2.0 → 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.
Files changed (105) hide show
  1. package/esm/map/MapView.js +5 -3
  2. package/esm/map/MapView.js.map +2 -2
  3. package/esm/map/components/BubbleLayer/BubbleLayerTooltip.js +25 -57
  4. package/esm/map/components/BubbleLayer/BubbleLayerTooltip.js.map +2 -2
  5. package/esm/map/components/ChoroplethLayer/ChoroplethLayerTooltip.js +18 -41
  6. package/esm/map/components/ChoroplethLayer/ChoroplethLayerTooltip.js.map +2 -2
  7. package/esm/map/components/ConnectionLayer/ConnectionLayerTooltip.js +22 -47
  8. package/esm/map/components/ConnectionLayer/ConnectionLayerTooltip.js.map +2 -2
  9. package/esm/map/components/DefaultTooltip/DefaultTooltip.js +70 -29
  10. package/esm/map/components/DefaultTooltip/DefaultTooltip.js.map +2 -2
  11. package/esm/map/components/DotLayer/DotLayerTooltip.js +18 -45
  12. package/esm/map/components/DotLayer/DotLayerTooltip.js.map +2 -2
  13. package/esm/map/components/toolbar/MapToolbar.js +10 -8
  14. package/esm/map/components/toolbar/MapToolbar.js.map +2 -2
  15. package/esm/map/hooks/use-geo-layer-tooltip.js +23 -0
  16. package/esm/map/hooks/use-geo-layer-tooltip.js.map +7 -0
  17. package/esm/map/hooks/use-geo-tooltip-sync.js +79 -0
  18. package/esm/map/hooks/use-geo-tooltip-sync.js.map +7 -0
  19. package/esm/map/hooks/use-overlay-events.js +98 -29
  20. package/esm/map/hooks/use-overlay-events.js.map +2 -2
  21. package/esm/map/hooks/use-tooltip-event-listeners.js +6 -5
  22. package/esm/map/hooks/use-tooltip-event-listeners.js.map +2 -2
  23. package/esm/map/hooks/use-tooltip-template.js +22 -2
  24. package/esm/map/hooks/use-tooltip-template.js.map +2 -2
  25. package/esm/map/store/map-store.context.js +1 -5
  26. package/esm/map/store/map-store.context.js.map +2 -2
  27. package/esm/map/store/selectors.js +0 -10
  28. package/esm/map/store/selectors.js.map +2 -2
  29. package/esm/map/store/store.js +1 -67
  30. package/esm/map/store/store.js.map +2 -2
  31. package/esm/map/utils/build-geo-tooltip-state.js +28 -0
  32. package/esm/map/utils/build-geo-tooltip-state.js.map +7 -0
  33. package/esm/map/utils/tooltip-type-guards.js +2 -0
  34. package/esm/map/utils/tooltip-type-guards.js.map +2 -2
  35. package/map/MapView.d.ts +2 -2
  36. package/map/MapView.js +2 -2
  37. package/map/components/BubbleLayer/BubbleCircleLayer.d.ts +1 -1
  38. package/map/components/BubbleLayer/BubbleLayer.d.ts +1 -1
  39. package/map/components/BubbleLayer/BubbleLayerTooltip.d.ts +1 -1
  40. package/map/components/BubbleLayer/BubbleLayerTooltip.js +24 -50
  41. package/map/components/BubbleLayer/BubbleOutlineLayer.d.ts +1 -1
  42. package/map/components/ChoroplethLayer/ChoroplethLayer.d.ts +1 -1
  43. package/map/components/ChoroplethLayer/ChoroplethLayerTooltip.d.ts +1 -1
  44. package/map/components/ChoroplethLayer/ChoroplethLayerTooltip.js +17 -34
  45. package/map/components/ChoroplethLayer/ChoroplethOutlineLayer.d.ts +1 -1
  46. package/map/components/ConnectionLayer/ConnectionLayer.d.ts +1 -1
  47. package/map/components/ConnectionLayer/ConnectionLayerDirection.d.ts +1 -1
  48. package/map/components/ConnectionLayer/ConnectionLayerLine.d.ts +1 -1
  49. package/map/components/ConnectionLayer/ConnectionLayerTooltip.d.ts +1 -1
  50. package/map/components/ConnectionLayer/ConnectionLayerTooltip.js +21 -40
  51. package/map/components/DefaultTooltip/DefaultTooltip.d.ts +7 -2
  52. package/map/components/DefaultTooltip/DefaultTooltip.js +74 -27
  53. package/map/components/DotLayer/BackgroundLayer.d.ts +1 -1
  54. package/map/components/DotLayer/BackgroundSymbolLayer.d.ts +1 -1
  55. package/map/components/DotLayer/DotLayer.d.ts +1 -1
  56. package/map/components/DotLayer/DotLayerTooltip.d.ts +1 -1
  57. package/map/components/DotLayer/DotLayerTooltip.js +17 -38
  58. package/map/components/MapUnavailable.d.ts +1 -1
  59. package/map/components/TooltipWrapper.d.ts +1 -1
  60. package/map/components/legend/CategoricalLegendRenderer.d.ts +1 -1
  61. package/map/components/legend/MapLegendRenderer.d.ts +1 -1
  62. package/map/components/legend/SequentialLegendRenderer.d.ts +1 -1
  63. package/map/components/legend/ThresholdLegendRenderer.d.ts +1 -1
  64. package/map/components/toolbar/MapToolbar.d.ts +1 -1
  65. package/map/components/toolbar/MapToolbar.js +9 -7
  66. package/map/components/toolbar/buttons/MapDownloadDataButton.d.ts +1 -1
  67. package/map/components/toolbar/buttons/MapResetButton.d.ts +1 -1
  68. package/map/components/toolbar/buttons/MapZoomInOutButtons.d.ts +1 -1
  69. package/map/components/toolbar/buttons/MapZoomToFitButton.d.ts +1 -1
  70. package/map/hooks/use-geo-layer-tooltip.d.ts +10 -0
  71. package/map/hooks/use-geo-layer-tooltip.js +38 -0
  72. package/map/hooks/use-geo-tooltip-sync.d.ts +24 -0
  73. package/map/hooks/use-geo-tooltip-sync.js +95 -0
  74. package/map/hooks/use-overlay-events.js +94 -25
  75. package/map/hooks/use-tooltip-event-listeners.js +6 -5
  76. package/map/hooks/use-tooltip-template.d.ts +6 -1
  77. package/map/hooks/use-tooltip-template.js +22 -2
  78. package/map/providers/color-scale.provider.d.ts +1 -1
  79. package/map/providers/layer-color-strategy.provider.d.ts +1 -1
  80. package/map/providers/map-initial-view.provider.d.ts +1 -1
  81. package/map/slots/BubbleLayer.d.ts +1 -1
  82. package/map/slots/BubbleLayerTooltip.d.ts +1 -1
  83. package/map/slots/DotLayer.d.ts +1 -1
  84. package/map/slots/DotLayerTooltip.d.ts +1 -1
  85. package/map/store/map-store.context.d.ts +1 -1
  86. package/map/store/map-store.context.js +1 -5
  87. package/map/store/map-store.provider.d.ts +1 -1
  88. package/map/store/selectors.d.ts +6 -15
  89. package/map/store/selectors.js +0 -10
  90. package/map/store/store.d.ts +2 -6
  91. package/map/store/store.js +1 -67
  92. package/map/types/state.d.ts +3 -7
  93. package/map/types/tooltip.d.ts +11 -1
  94. package/map/utils/build-geo-tooltip-state.d.ts +17 -0
  95. package/map/{components/DefaultTooltip/utils/handle-copy-to-clipboard.js → utils/build-geo-tooltip-state.js} +27 -11
  96. package/map/utils/tooltip-type-guards.d.ts +6 -4
  97. package/map/utils/tooltip-type-guards.js +2 -0
  98. package/package.json +4 -4
  99. package/esm/map/components/DefaultTooltip/utils/get-default-actions.js +0 -21
  100. package/esm/map/components/DefaultTooltip/utils/get-default-actions.js.map +0 -7
  101. package/esm/map/components/DefaultTooltip/utils/handle-copy-to-clipboard.js +0 -12
  102. package/esm/map/components/DefaultTooltip/utils/handle-copy-to-clipboard.js.map +0 -7
  103. package/map/components/DefaultTooltip/utils/get-default-actions.d.ts +0 -2
  104. package/map/components/DefaultTooltip/utils/get-default-actions.js +0 -40
  105. 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 { useRef } from "react";
3
- import {
4
- _ChartTooltip as ChartTooltip,
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
- selectedItem: selectedItemId,
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?.[0]) {
29
- const { __color: color, __bearing: bearing, data: customData } = data[0];
30
- dotData.current = {
31
- color,
32
- bearing,
33
- data: customData
34
- };
11
+ if (!data || !data[0]) {
12
+ return null;
35
13
  }
36
- const template = dotData.current && tooltipTemplate(dotData.current);
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
- return /* @__PURE__ */ jsx(
41
- ChartTooltip,
42
- {
43
- updatePositionWhenPinned: true,
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 { useRef } from 'react';\n\nimport {\n _ChartTooltip as ChartTooltip,\n _useChartActionsMenu as useChartActionsMenu,\n} from '@dynatrace/strato-components/charts';\n\nimport { useGetPosition } from '../../hooks/use-get-position.js';\nimport {\n useMapTooltipPinnedState,\n useMapTooltipState,\n} from '../../store/selectors.js';\nimport type { Location } from '../../types/location.js';\nimport type {\n DotLayerTooltipData,\n DotLayerTooltipHandler,\n} from '../../types/tooltip.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 const {\n selectedItem: selectedItemId,\n actionsMenuRef,\n updateSelectedItem,\n onLeave,\n } = useChartActionsMenu();\n\n const { data, visible, enabled } =\n useMapTooltipState<DotTooltipStatePayload>();\n const pinned = useMapTooltipPinnedState();\n\n const dotData = useRef<DotLayerTooltipData | null>(null);\n\n const forceHideTooltip = !pinned && (!visible || !enabled);\n const position = useGetPosition(pinned, !forceHideTooltip);\n if (!tooltipTemplate || forceHideTooltip || !position) {\n return null;\n }\n\n if (data?.[0]) {\n const { __color: color, __bearing: bearing, data: customData } = data[0];\n\n dotData.current = {\n color,\n bearing,\n data: customData,\n };\n }\n\n const template = dotData.current && tooltipTemplate(dotData.current);\n\n if (!template) {\n return null;\n }\n\n return (\n <ChartTooltip\n updatePositionWhenPinned\n position={position}\n pinned={pinned}\n onMouseLeave={onLeave}\n actionSelectionValue={{\n selectedItemId,\n actionsMenuRef,\n updateSelectedItem,\n }}\n >\n {template}\n </ChartTooltip>\n );\n};\n\nDotLayerTooltip['displayName'] = 'DotLayerTooltip';\n"],
5
- "mappings": "AAmEI;AAnEJ,SAAS,cAAc;AAEvB;AAAA,EACE,iBAAiB;AAAA,EACjB,wBAAwB;AAAA,OACnB;AAEP,SAAS,sBAAsB;AAC/B;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAkBA,MAAM,kBAAkB,CAAC,UAAgC;AAC9D,QAAM,EAAE,gBAAgB,IAAI;AAC5B,QAAM;AAAA,IACJ,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,oBAAoB;AAExB,QAAM,EAAE,MAAM,SAAS,QAAQ,IAC7B,mBAA2C;AAC7C,QAAM,SAAS,yBAAyB;AAExC,QAAM,UAAU,OAAmC,IAAI;AAEvD,QAAM,mBAAmB,CAAC,WAAW,CAAC,WAAW,CAAC;AAClD,QAAM,WAAW,eAAe,QAAQ,CAAC,gBAAgB;AACzD,MAAI,CAAC,mBAAmB,oBAAoB,CAAC,UAAU;AACrD,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,CAAC,GAAG;AACb,UAAM,EAAE,SAAS,OAAO,WAAW,SAAS,MAAM,WAAW,IAAI,KAAK,CAAC;AAEvE,YAAQ,UAAU;AAAA,MAChB;AAAA,MACA;AAAA,MACA,MAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,WAAW,QAAQ,WAAW,gBAAgB,QAAQ,OAAO;AAEnE,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,0BAAwB;AAAA,MACxB;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd,sBAAsB;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;AAEA,gBAAgB,aAAa,IAAI;",
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 { useSetStateTooltip } from "../../store/store.js";
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 setTooltipState = useSetStateTooltip();
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
- setTooltipState({
28
- enabled: false
29
- });
27
+ setState((prev) => ({
28
+ ...prev,
29
+ tooltip: { ...prev.tooltip, enabled: false }
30
+ }));
30
31
  };
31
32
  const handleMouseLeave = () => {
32
- setTooltipState({
33
- enabled: true
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 { useSetStateTooltip } 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 setTooltipState = useSetStateTooltip();\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 setTooltipState({\n enabled: false,\n });\n };\n\n const handleMouseLeave = () => {\n setTooltipState({\n 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": "AAqDM,SAYoB,KAZpB;AArDN,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,0BAA0B;AACnC,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,kBAAkB,mBAAmB;AAC3C,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,oBAAgB;AAAA,MACd,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,QAAM,mBAAmB,MAAM;AAC7B,oBAAgB;AAAA,MACd,SAAS;AAAA,IACX,CAAC;AAAA,EACH;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;",
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
- useTooltipPinnedState,
3
- useSetStateOverlay,
4
- useSetStateTooltip
5
- } from "../store/store.js";
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 setTooltipState = useSetStateTooltip();
10
- const setTooltipPinnedState = useTooltipPinnedState();
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
- setTooltipState({ visible: false });
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
- setTooltipState({
23
- data,
24
- hoveredLayerId,
25
- visible: true,
26
- location: event.lngLat
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
- hideTooltip();
72
+ const currentState = store.getState();
73
+ if (!currentState.pinned) {
74
+ hideTooltip();
75
+ }
30
76
  }
31
77
  };
32
78
  const handleMouseLeave = () => {
33
- setOverlayState({
34
- mouseInBounds: false
35
- });
36
- hideTooltip();
79
+ setOverlayState({ mouseInBounds: false });
80
+ const currentState = store.getState();
81
+ if (!currentState.pinned) {
82
+ hideTooltip();
83
+ }
37
84
  };
38
85
  const handleMouseClick = (event) => {
39
- setTooltipPinnedState(event);
40
- };
41
- const handleDrag = () => {
42
- hideTooltip();
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 handleZoom = () => {
45
- hideTooltip();
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 useTooltipPinnedState,\n useSetStateOverlay,\n useSetStateTooltip,\n} from '../store/store.js';\nimport { extractDataFromEvent } from '../utils/parse-tooltip-data.js';\n\nexport const useOverlayEvents = () => {\n const setOverlayState = useSetStateOverlay();\n const setTooltipState = useSetStateTooltip();\n const setTooltipPinnedState = useTooltipPinnedState();\n\n const hideTooltip = () => {\n setTooltipState({ visible: false });\n };\n\n const handleMouseEnter = () => {\n setOverlayState({\n mouseInBounds: true,\n });\n };\n\n const handleMouseMove = (event: MapLayerMouseEvent) => {\n if (event.features?.length) {\n const { data, hoveredLayerId } = extractDataFromEvent(event);\n\n setTooltipState({\n data,\n hoveredLayerId,\n visible: true,\n location: event.lngLat,\n });\n } else {\n hideTooltip();\n }\n };\n\n const handleMouseLeave = () => {\n setOverlayState({\n mouseInBounds: false,\n });\n hideTooltip();\n };\n\n const handleMouseClick = (event: MapLayerMouseEvent) => {\n setTooltipPinnedState(event);\n };\n\n const handleDrag = () => {\n hideTooltip();\n };\n const handleZoom = () => {\n hideTooltip();\n };\n\n return {\n handleMouseEnter,\n handleMouseMove,\n handleMouseLeave,\n handleMouseClick,\n handleZoom,\n handleDrag,\n };\n};\n"],
5
- "mappings": "AAEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,4BAA4B;AAE9B,MAAM,mBAAmB,MAAM;AACpC,QAAM,kBAAkB,mBAAmB;AAC3C,QAAM,kBAAkB,mBAAmB;AAC3C,QAAM,wBAAwB,sBAAsB;AAEpD,QAAM,cAAc,MAAM;AACxB,oBAAgB,EAAE,SAAS,MAAM,CAAC;AAAA,EACpC;AAEA,QAAM,mBAAmB,MAAM;AAC7B,oBAAgB;AAAA,MACd,eAAe;AAAA,IACjB,CAAC;AAAA,EACH;AAEA,QAAM,kBAAkB,CAAC,UAA8B;AACrD,QAAI,MAAM,UAAU,QAAQ;AAC1B,YAAM,EAAE,MAAM,eAAe,IAAI,qBAAqB,KAAK;AAE3D,sBAAgB;AAAA,QACd;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,UAAU,MAAM;AAAA,MAClB,CAAC;AAAA,IACH,OAAO;AACL,kBAAY;AAAA,IACd;AAAA,EACF;AAEA,QAAM,mBAAmB,MAAM;AAC7B,oBAAgB;AAAA,MACd,eAAe;AAAA,IACjB,CAAC;AACD,gBAAY;AAAA,EACd;AAEA,QAAM,mBAAmB,CAAC,UAA8B;AACtD,0BAAsB,KAAK;AAAA,EAC7B;AAEA,QAAM,aAAa,MAAM;AACvB,gBAAY;AAAA,EACd;AACA,QAAM,aAAa,MAAM;AACvB,gBAAY;AAAA,EACd;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;",
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": "AAEA;AAAA,EACE,6BAA6B;AAAA,EAC7B,2BAA2B;AAAA,EAC3B,oBAAoB;AAAA,OAEf;AAEP,SAAS,oBAAoB,mBAAmB;AAChD,SAAS,4BAA4B;AACrC,SAAS,4BAA4B;AAErC,MAAM,oBAAoB,CAAC,YAA+C;AACxE,MAAI,SAAS,SAAS,QAAQ,GAAG;AAC/B,WAAO;AAAA,EACT;AACA,MAAI,SAAS,SAAS,YAAY,GAAG;AACnC,WAAO;AAAA,EACT;AACA,MAAI,SAAS,SAAS,YAAY,GAAG;AACnC,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,MAAM,mBAAmB,MAAM;AACpC,QAAM,kBAAkB,mBAAmB;AAC3C,QAAM,WAAW,YAAY;AAC7B,QAAM,WAAW,kBAAkB;AACnC,QAAM,QAAQ,uBAAuB;AACrC,QAAM,UAAU,gBAAgB;AAEhC,QAAM,sBAAsB,CAAC,UAA8B;AACzD,WAAO;AAAA,MACL,GAAG,KAAK,MAAM,MAAM,cAAc,OAAO;AAAA,MACzC,GAAG,KAAK,MAAM,MAAM,cAAc,OAAO;AAAA,IAC3C;AAAA,EACF;AAEA,QAAM,mBAAmB,CACvB,gBACA,aACG;AACH,aAAS,CAAC,UAAU;AAAA,MAClB,GAAG;AAAA,MACH,SAAS;AAAA,QACP,GAAG,KAAK;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF,EAAE;AAAA,EACJ;AAEA,QAAM,cAAc,MAAM;AACxB,aAAS,EAAE,MAAM,gBAAgB,CAAC,EAAE;AACpC,qBAAiB,QAAW,MAAS;AAAA,EACvC;AAEA,QAAM,mBAAmB,MAAM;AAC7B,oBAAgB,EAAE,eAAe,KAAK,CAAC;AAAA,EACzC;AAEA,QAAM,kBAAkB,CAAC,UAA8B;AACrD,QAAI,MAAM,UAAU,QAAQ;AAC1B,YAAM,eAAe,MAAM,SAAS;AAEpC,UAAI,aAAa,QAAQ;AACvB;AAAA,MACF;AAEA,YAAM,EAAE,MAAM,eAAe,IAAI,qBAAqB,KAAK;AAE3D,cAAQ,MAAM;AAEd,uBAAiB,gBAAgB,MAAM,MAAM;AAE7C,YAAM,MAAM,oBAAoB,KAAK;AACrC,YAAM;AAAA,QACJ,qBAAqB;AAAA,UACnB,WAAW,IAAI;AAAA,UACf,WAAW,IAAI;AAAA,UACf,WAAW,KAAK,MAAM,MAAM,MAAM,CAAC;AAAA,UACnC,WAAW,KAAK,MAAM,MAAM,MAAM,CAAC;AAAA,UACnC,QAAQ;AAAA,UACR,UAAU,kBAAkB,cAAc;AAAA,UAC1C,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF,OAAO;AACL,YAAM,eAAe,MAAM,SAAS;AACpC,UAAI,CAAC,aAAa,QAAQ;AACxB,oBAAY;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAEA,QAAM,mBAAmB,MAAM;AAC7B,oBAAgB,EAAE,eAAe,MAAM,CAAC;AACxC,UAAM,eAAe,MAAM,SAAS;AACpC,QAAI,CAAC,aAAa,QAAQ;AACxB,kBAAY;AAAA,IACd;AAAA,EACF;AAEA,QAAM,mBAAmB,CAAC,UAA8B;AACtD,UAAM,EAAE,MAAM,WAAW,eAAe,IAAI,qBAAqB,KAAK;AAEtE,QAAI,CAAC,WAAW;AACd,kBAAY;AACZ;AAAA,IACF;AAEA,QAAI,CAAC,gBAAgB;AACnB,kBAAY;AACZ;AAAA,IACF;AAEA,YAAQ,MAAM;AAEd,qBAAiB,gBAAgB,MAAM,MAAM;AAE7C,UAAM,MAAM,oBAAoB,KAAK;AACrC,UAAM;AAAA,MACJ,qBAAqB;AAAA,QACnB,WAAW,IAAI;AAAA,QACf,WAAW,IAAI;AAAA,QACf,WAAW,KAAK,MAAM,MAAM,MAAM,CAAC;AAAA,QACnC,WAAW,KAAK,MAAM,MAAM,MAAM,CAAC;AAAA,QACnC,QAAQ;AAAA,QACR,UAAU,kBAAkB,cAAc;AAAA,QAC1C,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,yBAAyB,MAAM;AACnC,UAAM,eAAe,MAAM,SAAS;AACpC,QAAI,CAAC,aAAa,QAAQ;AACxB,kBAAY;AAAA,IACd;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ,YAAY;AAAA,EACd;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,15 +1,16 @@
1
1
  import { useCallback, useEffect } from "react";
2
- import { useClearTooltip, useMapTooltipPinnedState } from "../store/store.js";
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 setClearTooltip = useClearTooltip();
5
- const pinned = useMapTooltipPinnedState();
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
- setClearTooltip();
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 { useClearTooltip, useMapTooltipPinnedState } from '../store/store.js';\n\nexport const useTooltipEventListeners = () => {\n const setClearTooltip = useClearTooltip();\n\n const pinned = useMapTooltipPinnedState();\n\n const onEscapeKeyPressedHandler = useCallback(\n (event: KeyboardEvent) => {\n if (pinned && event.key === 'Escape') {\n setClearTooltip();\n }\n },\n [pinned],\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,iBAAiB,gCAAgC;AAEnD,MAAM,2BAA2B,MAAM;AAC5C,QAAM,kBAAkB,gBAAgB;AAExC,QAAM,SAAS,yBAAyB;AAExC,QAAM,4BAA4B;AAAA,IAChC,CAAC,UAAyB;AACxB,UAAI,UAAU,MAAM,QAAQ,UAAU;AACpC,wBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,CAAC,MAAM;AAAA,EACT;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;",
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
- const defaultTooltipHandler = (closestPoint, layerData) => /* @__PURE__ */ jsx(DefaultTooltip, { closestPoint, layerData });
13
- template = isNil(child.props.children) ? defaultTooltipHandler : child.props.children;
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 * The template will be the custom one if provided, the default template otherwise.\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<{ children: LayerTooltipHandler }>(child) &&\n child.type === layerType\n ) {\n const defaultTooltipHandler: LayerTooltipHandler = (\n closestPoint: LayerTooltipData,\n layerData?: LayerTooltipData[],\n ) => <DefaultTooltip closestPoint={closestPoint} layerData={layerData} />;\n\n template = isNil(child.props.children)\n ? defaultTooltipHandler\n : child.props.children;\n }\n });\n\n return template;\n}\n"],
5
- "mappings": "AAmCW;AAnCX,SAAS,aAAa;AACtB;AAAA,EACE;AAAA,EAGA;AAAA,OACK;AAEP,SAAS,sBAAsB;AAaxB,SAAS,mBACd,UACA,WACiC;AACjC,MAAI,WAA4C;AAEhD,WAAS,QAAQ,UAAU,CAAC,UAAU;AACpC,QACE,eAAkD,KAAK,KACvD,MAAM,SAAS,WACf;AACA,YAAM,wBAA6C,CACjD,cACA,cACG,oBAAC,kBAAe,cAA4B,WAAsB;AAEvE,iBAAW,MAAM,MAAM,MAAM,QAAQ,IACjC,wBACA,MAAM,MAAM;AAAA,IAClB;AAAA,EACF,CAAC;AAED,SAAO;AACT;",
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
- data: void 0
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 pinned: false,\n visible: false,\n enabled: true,\n pinnedId: undefined,\n location: undefined,\n hoveredLayerId: undefined,\n data: 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,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,MAAM;AAAA,EACR;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;",
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
  }