@dynatrace/strato-geo 3.5.2 → 3.7.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 (146) hide show
  1. package/esm/map/MapView.js +42 -34
  2. package/esm/map/MapView.js.map +2 -2
  3. package/esm/map/components/BubbleLayer/BubbleCircleLayer.js +2 -0
  4. package/esm/map/components/BubbleLayer/BubbleCircleLayer.js.map +2 -2
  5. package/esm/map/components/BubbleLayer/BubbleLayer.js +14 -3
  6. package/esm/map/components/BubbleLayer/BubbleLayer.js.map +2 -2
  7. package/esm/map/components/BubbleLayer/BubbleLayerTooltip.js +9 -3
  8. package/esm/map/components/BubbleLayer/BubbleLayerTooltip.js.map +2 -2
  9. package/esm/map/components/BubbleLayer/utils/parse-bubble-data-to-geo-json.js +5 -5
  10. package/esm/map/components/BubbleLayer/utils/parse-bubble-data-to-geo-json.js.map +2 -2
  11. package/esm/map/components/ChoroplethLayer/ChoroplethLayer.js +15 -7
  12. package/esm/map/components/ChoroplethLayer/ChoroplethLayer.js.map +2 -2
  13. package/esm/map/components/ChoroplethLayer/ChoroplethLayerTooltip.js +9 -3
  14. package/esm/map/components/ChoroplethLayer/ChoroplethLayerTooltip.js.map +2 -2
  15. package/esm/map/components/ChoroplethLayer/ChoroplethOutlineLayer.js +3 -1
  16. package/esm/map/components/ChoroplethLayer/ChoroplethOutlineLayer.js.map +2 -2
  17. package/esm/map/components/ChoroplethLayer/utils/parse-region-data-to-geo-json.js +6 -5
  18. package/esm/map/components/ChoroplethLayer/utils/parse-region-data-to-geo-json.js.map +2 -2
  19. package/esm/map/components/ConnectionLayer/ConnectionLayer.js +11 -6
  20. package/esm/map/components/ConnectionLayer/ConnectionLayer.js.map +2 -2
  21. package/esm/map/components/ConnectionLayer/ConnectionLayerLine.js +3 -0
  22. package/esm/map/components/ConnectionLayer/ConnectionLayerLine.js.map +2 -2
  23. package/esm/map/components/ConnectionLayer/ConnectionLayerTooltip.js +16 -12
  24. package/esm/map/components/ConnectionLayer/ConnectionLayerTooltip.js.map +2 -2
  25. package/esm/map/components/ConnectionLayer/utils/parse-connection-data-to-geo-json.js +20 -18
  26. package/esm/map/components/ConnectionLayer/utils/parse-connection-data-to-geo-json.js.map +2 -2
  27. package/esm/map/components/DotLayer/DotLayer.js +12 -3
  28. package/esm/map/components/DotLayer/DotLayer.js.map +2 -2
  29. package/esm/map/components/DotLayer/DotLayerTooltip.js +9 -3
  30. package/esm/map/components/DotLayer/DotLayerTooltip.js.map +2 -2
  31. package/esm/map/components/DotLayer/utils/parse-dot-data-to-geo-json.js +5 -5
  32. package/esm/map/components/DotLayer/utils/parse-dot-data-to-geo-json.js.map +2 -2
  33. package/esm/map/components/MapContent.js +22 -12
  34. package/esm/map/components/MapContent.js.map +2 -2
  35. package/esm/map/contexts/geo-data-lookup.context.js +8 -0
  36. package/esm/map/contexts/geo-data-lookup.context.js.map +7 -0
  37. package/esm/map/contexts/map-view-provider.context.js +9 -0
  38. package/esm/map/contexts/map-view-provider.context.js.map +7 -0
  39. package/esm/map/hooks/use-active-interaction.js +59 -43
  40. package/esm/map/hooks/use-active-interaction.js.map +2 -2
  41. package/esm/map/hooks/use-attach-image-from-icon.js +4 -2
  42. package/esm/map/hooks/use-attach-image-from-icon.js.map +2 -2
  43. package/esm/map/hooks/use-hover-interaction.js +59 -41
  44. package/esm/map/hooks/use-hover-interaction.js.map +2 -2
  45. package/esm/map/hooks/use-layer-before-id.js +24 -0
  46. package/esm/map/hooks/use-layer-before-id.js.map +7 -0
  47. package/esm/map/hooks/use-load-map-base-layer.js +13 -3
  48. package/esm/map/hooks/use-load-map-base-layer.js.map +2 -2
  49. package/esm/map/hooks/use-map-runtime-error.js +93 -0
  50. package/esm/map/hooks/use-map-runtime-error.js.map +7 -0
  51. package/esm/map/hooks/use-map-view-provider-context.js +7 -0
  52. package/esm/map/hooks/use-map-view-provider-context.js.map +7 -0
  53. package/esm/map/hooks/use-overlay-events.js +11 -2
  54. package/esm/map/hooks/use-overlay-events.js.map +2 -2
  55. package/esm/map/hooks/use-tooltip-template.js +17 -2
  56. package/esm/map/hooks/use-tooltip-template.js.map +2 -2
  57. package/esm/map/hooks/use-webgl-context-error.js +2 -1
  58. package/esm/map/hooks/use-webgl-context-error.js.map +2 -2
  59. package/esm/map/index.js +2 -0
  60. package/esm/map/index.js.map +2 -2
  61. package/esm/map/providers/map-view.provider.js +18 -0
  62. package/esm/map/providers/map-view.provider.js.map +7 -0
  63. package/esm/map/slots/Tooltip.js.map +2 -2
  64. package/esm/map/types/map-view-provider.js +1 -0
  65. package/esm/map/types/map-view-provider.js.map +7 -0
  66. package/esm/map/utils/attach-image-from-shape.js +4 -2
  67. package/esm/map/utils/attach-image-from-shape.js.map +2 -2
  68. package/esm/map/utils/extract-layers-data.js +24 -15
  69. package/esm/map/utils/extract-layers-data.js.map +2 -2
  70. package/esm/map/utils/fetch-base-layer-features.js +1 -1
  71. package/esm/map/utils/fetch-base-layer-features.js.map +2 -2
  72. package/esm/map/utils/is-browser-firefox.js +7 -0
  73. package/esm/map/utils/is-browser-firefox.js.map +7 -0
  74. package/esm/map/utils/parse-tooltip-data.js +22 -7
  75. package/esm/map/utils/parse-tooltip-data.js.map +2 -2
  76. package/map/MapView.js +42 -34
  77. package/map/components/BubbleLayer/BubbleCircleLayer.d.ts +2 -1
  78. package/map/components/BubbleLayer/BubbleCircleLayer.js +2 -0
  79. package/map/components/BubbleLayer/BubbleLayer.js +14 -3
  80. package/map/components/BubbleLayer/BubbleLayerTooltip.d.ts +2 -0
  81. package/map/components/BubbleLayer/BubbleLayerTooltip.js +9 -3
  82. package/map/components/BubbleLayer/utils/parse-bubble-data-to-geo-json.d.ts +3 -1
  83. package/map/components/BubbleLayer/utils/parse-bubble-data-to-geo-json.js +5 -5
  84. package/map/components/ChoroplethLayer/ChoroplethLayer.js +15 -7
  85. package/map/components/ChoroplethLayer/ChoroplethLayerTooltip.d.ts +2 -0
  86. package/map/components/ChoroplethLayer/ChoroplethLayerTooltip.js +9 -3
  87. package/map/components/ChoroplethLayer/ChoroplethOutlineLayer.d.ts +1 -0
  88. package/map/components/ChoroplethLayer/ChoroplethOutlineLayer.js +3 -1
  89. package/map/components/ChoroplethLayer/utils/parse-region-data-to-geo-json.d.ts +3 -1
  90. package/map/components/ChoroplethLayer/utils/parse-region-data-to-geo-json.js +6 -5
  91. package/map/components/ConnectionLayer/ConnectionLayer.js +11 -6
  92. package/map/components/ConnectionLayer/ConnectionLayerLine.js +3 -0
  93. package/map/components/ConnectionLayer/ConnectionLayerTooltip.d.ts +2 -0
  94. package/map/components/ConnectionLayer/ConnectionLayerTooltip.js +16 -12
  95. package/map/components/ConnectionLayer/utils/parse-connection-data-to-geo-json.d.ts +3 -1
  96. package/map/components/ConnectionLayer/utils/parse-connection-data-to-geo-json.js +20 -18
  97. package/map/components/DotLayer/DotLayer.js +12 -3
  98. package/map/components/DotLayer/DotLayerTooltip.d.ts +2 -0
  99. package/map/components/DotLayer/DotLayerTooltip.js +9 -3
  100. package/map/components/DotLayer/utils/parse-dot-data-to-geo-json.d.ts +3 -1
  101. package/map/components/DotLayer/utils/parse-dot-data-to-geo-json.js +5 -5
  102. package/map/components/MapContent.js +21 -12
  103. package/map/contexts/geo-data-lookup.context.d.ts +9 -0
  104. package/map/contexts/geo-data-lookup.context.js +27 -0
  105. package/map/contexts/map-view-provider.context.d.ts +2 -0
  106. package/map/{components/ConnectionLayer/utils/restore-null-props.js → contexts/map-view-provider.context.js} +8 -8
  107. package/map/hooks/use-active-interaction.d.ts +8 -1
  108. package/map/hooks/use-active-interaction.js +58 -42
  109. package/map/hooks/use-attach-image-from-icon.js +4 -2
  110. package/map/hooks/use-hover-interaction.d.ts +6 -2
  111. package/map/hooks/use-hover-interaction.js +52 -39
  112. package/map/hooks/use-layer-before-id.d.ts +13 -0
  113. package/map/hooks/{use-map-mouse-move.js → use-layer-before-id.js} +20 -15
  114. package/map/hooks/use-load-map-base-layer.js +13 -3
  115. package/map/hooks/use-map-runtime-error.d.ts +34 -0
  116. package/map/hooks/use-map-runtime-error.js +112 -0
  117. package/map/hooks/use-map-view-provider-context.d.ts +1 -0
  118. package/map/hooks/use-map-view-provider-context.js +26 -0
  119. package/map/hooks/use-overlay-events.js +11 -2
  120. package/map/hooks/use-tooltip-template.d.ts +8 -0
  121. package/map/hooks/use-tooltip-template.js +17 -2
  122. package/map/hooks/use-webgl-context-error.js +2 -1
  123. package/map/index.d.ts +2 -0
  124. package/map/index.js +2 -0
  125. package/map/providers/map-view.provider.d.ts +7 -0
  126. package/map/providers/map-view.provider.js +37 -0
  127. package/map/slots/Tooltip.d.ts +2 -0
  128. package/map/types/connection-layer.d.ts +1 -8
  129. package/map/types/map-view-provider.d.ts +10 -0
  130. package/map/types/map-view-provider.js +16 -0
  131. package/map/types/tooltip.d.ts +17 -0
  132. package/map/utils/attach-image-from-shape.js +4 -2
  133. package/map/utils/extract-layers-data.d.ts +2 -0
  134. package/map/utils/extract-layers-data.js +24 -15
  135. package/map/utils/fetch-base-layer-features.js +1 -1
  136. package/map/utils/is-browser-firefox.d.ts +5 -0
  137. package/map/utils/is-browser-firefox.js +26 -0
  138. package/map/utils/parse-tooltip-data.d.ts +11 -3
  139. package/map/utils/parse-tooltip-data.js +22 -7
  140. package/package.json +2 -2
  141. package/esm/map/components/ConnectionLayer/utils/restore-null-props.js +0 -9
  142. package/esm/map/components/ConnectionLayer/utils/restore-null-props.js.map +0 -7
  143. package/esm/map/hooks/use-map-mouse-move.js +0 -19
  144. package/esm/map/hooks/use-map-mouse-move.js.map +0 -7
  145. package/map/components/ConnectionLayer/utils/restore-null-props.d.ts +0 -2
  146. package/map/hooks/use-map-mouse-move.d.ts +0 -2
@@ -3,7 +3,7 @@ import { _accessValue as accessValue } from "@dynatrace/strato-components/core";
3
3
  import { calculateHoveredColor } from "../../../utils/calculate-hovered-color.js";
4
4
  import { defineColor } from "../../../utils/define-color.js";
5
5
  const parseRegionDataToGeoJSON = (mapSource, data, regionAccessor, color) => {
6
- const features = data.reduce((features2, item) => {
6
+ const features = data.reduce((features2, item, index) => {
7
7
  let id = "";
8
8
  if (typeof regionAccessor === "function") {
9
9
  id = regionAccessor(item);
@@ -21,8 +21,7 @@ const parseRegionDataToGeoJSON = (mapSource, data, regionAccessor, color) => {
21
21
  properties: {
22
22
  name,
23
23
  region_type,
24
- data: item,
25
- ...item,
24
+ __dataIndex: index,
26
25
  __color: canvasColor,
27
26
  __hoveredColor: hoveredColor
28
27
  }
@@ -32,8 +31,10 @@ const parseRegionDataToGeoJSON = (mapSource, data, regionAccessor, color) => {
32
31
  return features2;
33
32
  }, []);
34
33
  return {
35
- type: "FeatureCollection",
36
- features
34
+ geoJson: {
35
+ type: "FeatureCollection",
36
+ features
37
+ }
37
38
  };
38
39
  };
39
40
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/map/components/ChoroplethLayer/utils/parse-region-data-to-geo-json.ts"],
4
- "sourcesContent": ["import type GeoJSON from 'geojson';\n\nimport { _getCanvasColor as getCanvasColor } from '@dynatrace/strato-components/charts';\nimport { _accessValue as accessValue } from '@dynatrace/strato-components/core';\n\nimport { calculateHoveredColor } from '../../../utils/calculate-hovered-color.js';\nimport { defineColor } from '../../../utils/define-color.js';\n\nexport const parseRegionDataToGeoJSON = <T extends Record<string, unknown>>(\n mapSource: GeoJSON.FeatureCollection,\n data: T[],\n regionAccessor: string | ((i: T) => string),\n color: string | ((i: T) => string),\n): GeoJSON.FeatureCollection => {\n const features = data.reduce((features: GeoJSON.Feature[], item) => {\n let id: string | undefined = '';\n\n if (typeof regionAccessor === 'function') {\n id = regionAccessor(item);\n } else {\n id = accessValue<string>(item, regionAccessor);\n }\n\n const feature = mapSource.features.find((region) => region.id === id);\n if (feature !== undefined) {\n const regionColor = defineColor(color, item);\n const canvasColor = getCanvasColor(regionColor);\n const hoveredColor = calculateHoveredColor(canvasColor);\n const { name, region_type } = feature.properties as {\n name: string;\n region_type: string;\n };\n const feat = {\n ...feature,\n properties: {\n name,\n region_type,\n data: item,\n ...item,\n __color: canvasColor,\n __hoveredColor: hoveredColor,\n },\n };\n\n features.push(feat);\n }\n\n return features;\n }, []);\n\n return {\n type: 'FeatureCollection',\n features,\n };\n};\n"],
5
- "mappings": "AAEA,SAAS,mBAAmB,sBAAsB;AAClD,SAAS,gBAAgB,mBAAmB;AAE5C,SAAS,6BAA6B;AACtC,SAAS,mBAAmB;AAErB,MAAM,2BAA2B,CACtC,WACA,MACA,gBACA,UAC8B;AAC9B,QAAM,WAAW,KAAK,OAAO,CAACA,WAA6B,SAAS;AAClE,QAAI,KAAyB;AAE7B,QAAI,OAAO,mBAAmB,YAAY;AACxC,WAAK,eAAe,IAAI;AAAA,IAC1B,OAAO;AACL,WAAK,YAAoB,MAAM,cAAc;AAAA,IAC/C;AAEA,UAAM,UAAU,UAAU,SAAS,KAAK,CAAC,WAAW,OAAO,OAAO,EAAE;AACpE,QAAI,YAAY,QAAW;AACzB,YAAM,cAAc,YAAY,OAAO,IAAI;AAC3C,YAAM,cAAc,eAAe,WAAW;AAC9C,YAAM,eAAe,sBAAsB,WAAW;AACtD,YAAM,EAAE,MAAM,YAAY,IAAI,QAAQ;AAItC,YAAM,OAAO;AAAA,QACX,GAAG;AAAA,QACH,YAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA,MAAM;AAAA,UACN,GAAG;AAAA,UACH,SAAS;AAAA,UACT,gBAAgB;AAAA,QAClB;AAAA,MACF;AAEA,MAAAA,UAAS,KAAK,IAAI;AAAA,IACpB;AAEA,WAAOA;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import type GeoJSON from 'geojson';\n\nimport { _getCanvasColor as getCanvasColor } from '@dynatrace/strato-components/charts';\nimport { _accessValue as accessValue } from '@dynatrace/strato-components/core';\n\nimport { calculateHoveredColor } from '../../../utils/calculate-hovered-color.js';\nimport { defineColor } from '../../../utils/define-color.js';\n\nexport const parseRegionDataToGeoJSON = <T extends Record<string, unknown>>(\n mapSource: GeoJSON.FeatureCollection,\n data: T[],\n regionAccessor: string | ((i: T) => string),\n color: string | ((i: T) => string),\n): { geoJson: GeoJSON.FeatureCollection } => {\n const features = data.reduce((features: GeoJSON.Feature[], item, index) => {\n let id: string | undefined = '';\n\n if (typeof regionAccessor === 'function') {\n id = regionAccessor(item);\n } else {\n id = accessValue<string>(item, regionAccessor);\n }\n\n const feature = mapSource.features.find((region) => region.id === id);\n if (feature !== undefined) {\n const regionColor = defineColor(color, item);\n const canvasColor = getCanvasColor(regionColor);\n const hoveredColor = calculateHoveredColor(canvasColor);\n const { name, region_type } = feature.properties as {\n name: string;\n region_type: string;\n };\n\n const feat = {\n ...feature,\n properties: {\n name,\n region_type,\n __dataIndex: index,\n __color: canvasColor,\n __hoveredColor: hoveredColor,\n },\n };\n\n features.push(feat);\n }\n\n return features;\n }, []);\n\n return {\n geoJson: {\n type: 'FeatureCollection',\n features,\n },\n };\n};\n"],
5
+ "mappings": "AAEA,SAAS,mBAAmB,sBAAsB;AAClD,SAAS,gBAAgB,mBAAmB;AAE5C,SAAS,6BAA6B;AACtC,SAAS,mBAAmB;AAErB,MAAM,2BAA2B,CACtC,WACA,MACA,gBACA,UAC2C;AAC3C,QAAM,WAAW,KAAK,OAAO,CAACA,WAA6B,MAAM,UAAU;AACzE,QAAI,KAAyB;AAE7B,QAAI,OAAO,mBAAmB,YAAY;AACxC,WAAK,eAAe,IAAI;AAAA,IAC1B,OAAO;AACL,WAAK,YAAoB,MAAM,cAAc;AAAA,IAC/C;AAEA,UAAM,UAAU,UAAU,SAAS,KAAK,CAAC,WAAW,OAAO,OAAO,EAAE;AACpE,QAAI,YAAY,QAAW;AACzB,YAAM,cAAc,YAAY,OAAO,IAAI;AAC3C,YAAM,cAAc,eAAe,WAAW;AAC9C,YAAM,eAAe,sBAAsB,WAAW;AACtD,YAAM,EAAE,MAAM,YAAY,IAAI,QAAQ;AAKtC,YAAM,OAAO;AAAA,QACX,GAAG;AAAA,QACH,YAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA,aAAa;AAAA,UACb,SAAS;AAAA,UACT,gBAAgB;AAAA,QAClB;AAAA,MACF;AAEA,MAAAA,UAAS,KAAK,IAAI;AAAA,IACpB;AAEA,WAAOA;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACL,SAAS;AAAA,MACP,MAAM;AAAA,MACN;AAAA,IACF;AAAA,EACF;AACF;",
6
6
  "names": ["features"]
7
7
  }
@@ -33,16 +33,19 @@ const ConnectionLayer = (props) => {
33
33
  const sourceId = `source-${layerId}`;
34
34
  useLegendInteractionHighlighting(props, sourceId);
35
35
  useLegendInteractionVisibility(props, layerId);
36
- const geoJsonData = parseConnectionDataToGeoJSON(
36
+ const { geoJson: geoJsonData } = parseConnectionDataToGeoJSON(
37
37
  data,
38
38
  thickness,
39
39
  connectionColor,
40
40
  curve
41
41
  );
42
- const tooltipTemplate = useTooltipTemplate(
43
- children,
44
- ConnectionLayerTooltipSlot
45
- );
42
+ const {
43
+ handler: tooltipTemplate,
44
+ hidden: tooltipHidden,
45
+ symbolAlignment
46
+ } = useTooltipTemplate(children, ConnectionLayerTooltipSlot, {
47
+ extractProps: true
48
+ });
46
49
  return /* @__PURE__ */ jsxs(Fragment, { children: [
47
50
  /* @__PURE__ */ jsx(
48
51
  ConnectionLayerLine,
@@ -55,7 +58,9 @@ const ConnectionLayer = (props) => {
55
58
  children: /* @__PURE__ */ jsx(TooltipWrapper, { layerId, children: /* @__PURE__ */ jsx(
56
59
  ConnectionLayerTooltip,
57
60
  {
58
- tooltipTemplate: isConnectionTooltipTemplate(tooltipTemplate) ? tooltipTemplate : void 0
61
+ tooltipTemplate: isConnectionTooltipTemplate(tooltipTemplate) ? tooltipTemplate : void 0,
62
+ hidden: tooltipHidden,
63
+ symbolAlignment
59
64
  }
60
65
  ) })
61
66
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/map/components/ConnectionLayer/ConnectionLayer.tsx"],
4
- "sourcesContent": ["import { type PropsWithChildren } from 'react';\n\nimport { _useBehavioralTrackingProps as useBehavioralTrackingProps } from '@dynatrace/strato-components/core';\n\nimport { ConnectionLayerDirection } from './ConnectionLayerDirection.js';\nimport { ConnectionLayerLine } from './ConnectionLayerLine.js';\nimport { ConnectionLayerTooltip } from './ConnectionLayerTooltip.js';\nimport { parseConnectionDataToGeoJSON } from './utils/parse-connection-data-to-geo-json.js';\nimport { DEFAULT_LINE_COLOR, DEFAULT_LINE_THICKNESS } from '../../constants.js';\nimport { useLayerColoringStrategy } from '../../hooks/use-layer-coloring-strategy.js';\nimport { useLegendInteractionHighlighting } from '../../hooks/use-legend-interaction-highlighting.js';\nimport { useLegendInteractionVisibility } from '../../hooks/use-legend-interaction-visibility.js';\nimport { useResolveConnectionColor } from '../../hooks/use-resolve-color.js';\nimport { useTooltipTemplate } from '../../hooks/use-tooltip-template.js';\nimport { ConnectionLayerTooltip as ConnectionLayerTooltipSlot } from '../../slots/ConnectionLayerTooltip.js';\nimport type {\n Connection,\n InternalConnectionLayerProps,\n} from '../../types/connection-layer.js';\nimport { isConnectionTooltipTemplate } from '../../utils/tooltip-type-guards.js';\nimport { TooltipWrapper } from '../TooltipWrapper.js';\n\nexport const ConnectionLayer = <T extends Connection>(\n props: PropsWithChildren<InternalConnectionLayerProps<T>>,\n) => {\n const [behavioralTrackingProps] = useBehavioralTrackingProps(props);\n\n const {\n data,\n layerId,\n children,\n curve,\n directionIndicator,\n line,\n thickness = DEFAULT_LINE_THICKNESS,\n } = props;\n const colorParser = useLayerColoringStrategy();\n const connectionColor = useResolveConnectionColor(\n DEFAULT_LINE_COLOR,\n props,\n colorParser,\n );\n\n const sourceId = `source-${layerId}`;\n\n useLegendInteractionHighlighting(props, sourceId);\n useLegendInteractionVisibility(props, layerId);\n\n const geoJsonData = parseConnectionDataToGeoJSON(\n data,\n thickness,\n connectionColor,\n curve,\n );\n\n const tooltipTemplate = useTooltipTemplate(\n children,\n ConnectionLayerTooltipSlot,\n );\n\n return (\n <>\n <ConnectionLayerLine\n geoJsonData={geoJsonData}\n layerId={layerId}\n sourceId={sourceId}\n line={line}\n {...behavioralTrackingProps}\n >\n <TooltipWrapper layerId={layerId}>\n <ConnectionLayerTooltip\n tooltipTemplate={\n isConnectionTooltipTemplate(tooltipTemplate)\n ? tooltipTemplate\n : undefined\n }\n />\n </TooltipWrapper>\n </ConnectionLayerLine>\n\n {directionIndicator && (\n <ConnectionLayerDirection\n geoJsonData={geoJsonData}\n layerId={layerId}\n directionIndicator={directionIndicator}\n />\n )}\n </>\n );\n};\n\nConnectionLayer['displayName'] = 'ConnectionLayer';\n"],
5
- "mappings": "AA6DI,mBASM,KATN;AA3DJ,SAAS,+BAA+B,kCAAkC;AAE1E,SAAS,gCAAgC;AACzC,SAAS,2BAA2B;AACpC,SAAS,8BAA8B;AACvC,SAAS,oCAAoC;AAC7C,SAAS,oBAAoB,8BAA8B;AAC3D,SAAS,gCAAgC;AACzC,SAAS,wCAAwC;AACjD,SAAS,sCAAsC;AAC/C,SAAS,iCAAiC;AAC1C,SAAS,0BAA0B;AACnC,SAAS,0BAA0B,kCAAkC;AAKrE,SAAS,mCAAmC;AAC5C,SAAS,sBAAsB;AAExB,MAAM,kBAAkB,CAC7B,UACG;AACH,QAAM,CAAC,uBAAuB,IAAI,2BAA2B,KAAK;AAElE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,EACd,IAAI;AACJ,QAAM,cAAc,yBAAyB;AAC7C,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,WAAW,UAAU,OAAO;AAElC,mCAAiC,OAAO,QAAQ;AAChD,iCAA+B,OAAO,OAAO;AAE7C,QAAM,cAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,EACF;AAEA,SACE,iCACE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACC,GAAG;AAAA,QAEJ,8BAAC,kBAAe,SACd;AAAA,UAAC;AAAA;AAAA,YACC,iBACE,4BAA4B,eAAe,IACvC,kBACA;AAAA;AAAA,QAER,GACF;AAAA;AAAA,IACF;AAAA,IAEC,sBACC;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,KAEJ;AAEJ;AAEA,gBAAgB,aAAa,IAAI;",
4
+ "sourcesContent": ["import { type PropsWithChildren } from 'react';\n\nimport { _useBehavioralTrackingProps as useBehavioralTrackingProps } from '@dynatrace/strato-components/core';\n\nimport { ConnectionLayerDirection } from './ConnectionLayerDirection.js';\nimport { ConnectionLayerLine } from './ConnectionLayerLine.js';\nimport { ConnectionLayerTooltip } from './ConnectionLayerTooltip.js';\nimport { parseConnectionDataToGeoJSON } from './utils/parse-connection-data-to-geo-json.js';\nimport { DEFAULT_LINE_COLOR, DEFAULT_LINE_THICKNESS } from '../../constants.js';\nimport { useLayerColoringStrategy } from '../../hooks/use-layer-coloring-strategy.js';\nimport { useLegendInteractionHighlighting } from '../../hooks/use-legend-interaction-highlighting.js';\nimport { useLegendInteractionVisibility } from '../../hooks/use-legend-interaction-visibility.js';\nimport { useResolveConnectionColor } from '../../hooks/use-resolve-color.js';\nimport { useTooltipTemplate } from '../../hooks/use-tooltip-template.js';\nimport { ConnectionLayerTooltip as ConnectionLayerTooltipSlot } from '../../slots/ConnectionLayerTooltip.js';\nimport type {\n Connection,\n InternalConnectionLayerProps,\n} from '../../types/connection-layer.js';\nimport { isConnectionTooltipTemplate } from '../../utils/tooltip-type-guards.js';\nimport { TooltipWrapper } from '../TooltipWrapper.js';\n\nexport const ConnectionLayer = <T extends Connection>(\n props: PropsWithChildren<InternalConnectionLayerProps<T>>,\n) => {\n const [behavioralTrackingProps] = useBehavioralTrackingProps(props);\n\n const {\n data,\n layerId,\n children,\n curve,\n directionIndicator,\n line,\n thickness = DEFAULT_LINE_THICKNESS,\n } = props;\n const colorParser = useLayerColoringStrategy();\n const connectionColor = useResolveConnectionColor(\n DEFAULT_LINE_COLOR,\n props,\n colorParser,\n );\n\n const sourceId = `source-${layerId}`;\n\n useLegendInteractionHighlighting(props, sourceId);\n useLegendInteractionVisibility(props, layerId);\n\n const { geoJson: geoJsonData } = parseConnectionDataToGeoJSON(\n data,\n thickness,\n connectionColor,\n curve,\n );\n\n const {\n handler: tooltipTemplate,\n hidden: tooltipHidden,\n symbolAlignment,\n } = useTooltipTemplate(children, ConnectionLayerTooltipSlot, {\n extractProps: true,\n });\n\n return (\n <>\n <ConnectionLayerLine\n geoJsonData={geoJsonData}\n layerId={layerId}\n sourceId={sourceId}\n line={line}\n {...behavioralTrackingProps}\n >\n <TooltipWrapper layerId={layerId}>\n <ConnectionLayerTooltip\n tooltipTemplate={\n isConnectionTooltipTemplate(tooltipTemplate)\n ? tooltipTemplate\n : undefined\n }\n hidden={tooltipHidden}\n symbolAlignment={symbolAlignment}\n />\n </TooltipWrapper>\n </ConnectionLayerLine>\n\n {directionIndicator && (\n <ConnectionLayerDirection\n geoJsonData={geoJsonData}\n layerId={layerId}\n directionIndicator={directionIndicator}\n />\n )}\n </>\n );\n};\n\nConnectionLayer['displayName'] = 'ConnectionLayer';\n"],
5
+ "mappings": "AAgEI,mBASM,KATN;AA9DJ,SAAS,+BAA+B,kCAAkC;AAE1E,SAAS,gCAAgC;AACzC,SAAS,2BAA2B;AACpC,SAAS,8BAA8B;AACvC,SAAS,oCAAoC;AAC7C,SAAS,oBAAoB,8BAA8B;AAC3D,SAAS,gCAAgC;AACzC,SAAS,wCAAwC;AACjD,SAAS,sCAAsC;AAC/C,SAAS,iCAAiC;AAC1C,SAAS,0BAA0B;AACnC,SAAS,0BAA0B,kCAAkC;AAKrE,SAAS,mCAAmC;AAC5C,SAAS,sBAAsB;AAExB,MAAM,kBAAkB,CAC7B,UACG;AACH,QAAM,CAAC,uBAAuB,IAAI,2BAA2B,KAAK;AAElE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,EACd,IAAI;AACJ,QAAM,cAAc,yBAAyB;AAC7C,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,WAAW,UAAU,OAAO;AAElC,mCAAiC,OAAO,QAAQ;AAChD,iCAA+B,OAAO,OAAO;AAE7C,QAAM,EAAE,SAAS,YAAY,IAAI;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM;AAAA,IACJ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR;AAAA,EACF,IAAI,mBAAmB,UAAU,4BAA4B;AAAA,IAC3D,cAAc;AAAA,EAChB,CAAC;AAED,SACE,iCACE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACC,GAAG;AAAA,QAEJ,8BAAC,kBAAe,SACd;AAAA,UAAC;AAAA;AAAA,YACC,iBACE,4BAA4B,eAAe,IACvC,kBACA;AAAA,YAEN,QAAQ;AAAA,YACR;AAAA;AAAA,QACF,GACF;AAAA;AAAA,IACF;AAAA,IAEC,sBACC;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,KAEJ;AAEJ;AAEA,gBAAgB,aAAa,IAAI;",
6
6
  "names": []
7
7
  }
@@ -8,15 +8,18 @@ import {
8
8
  SHAPE_OPACITY_DEFAULT,
9
9
  SHAPE_OPACITY_DIMMED
10
10
  } from "../../constants.js";
11
+ import { useLayerBeforeId } from "../../hooks/use-layer-before-id.js";
11
12
  const ConnectionLayerLine = (props) => {
12
13
  const { geoJsonData, layerId, sourceId, line, children, ...restProps } = props;
13
14
  const [behavioralTrackingProps] = useBehavioralTrackingProps(restProps);
15
+ const beforeId = useLayerBeforeId(layerId);
14
16
  return /* @__PURE__ */ jsxs(Source, { id: sourceId, type: "geojson", data: geoJsonData, promoteId: "id", children: [
15
17
  /* @__PURE__ */ jsx(
16
18
  Layer,
17
19
  {
18
20
  type: "line",
19
21
  id: layerId,
22
+ beforeId,
20
23
  layout: {
21
24
  "line-cap": DEFAULT_LINE_CAP,
22
25
  "line-join": DEFAULT_LINE_JOIN
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/map/components/ConnectionLayer/ConnectionLayerLine.tsx"],
4
- "sourcesContent": ["import { Layer, Source } from '@vis.gl/react-maplibre';\nimport type { PropsWithChildren } from 'react';\n\nimport { _useBehavioralTrackingProps as useBehavioralTrackingProps } from '@dynatrace/strato-components/core';\n\nimport {\n DEFAULT_LINE_CAP,\n DEFAULT_LINE_DASH_ARRAY,\n DEFAULT_LINE_JOIN,\n SHAPE_OPACITY_DEFAULT,\n SHAPE_OPACITY_DIMMED,\n} from '../../constants.js';\nimport type {\n Connection,\n InternalConnectionLayerProps,\n} from '../../types/connection-layer.js';\n\ninterface ConnectionLayerLineProps<T extends Connection>\n extends Required<Pick<InternalConnectionLayerProps<T>, 'layerId'>> {\n geoJsonData: GeoJSON.FeatureCollection;\n sourceId: string;\n line: 'dashed' | 'solid' | undefined;\n}\n\nexport const ConnectionLayerLine = <T extends Connection>(\n props: PropsWithChildren<ConnectionLayerLineProps<T>>,\n) => {\n const { geoJsonData, layerId, sourceId, line, children, ...restProps } =\n props;\n const [behavioralTrackingProps] = useBehavioralTrackingProps(restProps);\n\n return (\n <Source id={sourceId} type=\"geojson\" data={geoJsonData} promoteId=\"id\">\n <Layer\n type=\"line\"\n id={layerId}\n layout={{\n 'line-cap': DEFAULT_LINE_CAP,\n 'line-join': DEFAULT_LINE_JOIN,\n }}\n paint={{\n 'line-color': [\n 'case',\n ['boolean', ['feature-state', 'hover'], false],\n ['get', '__lineHoveredColor'],\n ['get', '__lineColor'],\n ],\n 'line-opacity': [\n 'case',\n ['boolean', ['feature-state', 'legendHover'], true],\n SHAPE_OPACITY_DEFAULT,\n SHAPE_OPACITY_DIMMED,\n ],\n 'line-width': ['get', '__lineWidth'],\n ...(line && line === 'dashed'\n ? { 'line-dasharray': DEFAULT_LINE_DASH_ARRAY }\n : null),\n }}\n {...behavioralTrackingProps}\n />\n {children}\n </Source>\n );\n};\n\nConnectionLayerLine['displayName'] = 'ConnectionLayerLine';\n"],
5
- "mappings": "AAgCI,SACE,KADF;AAhCJ,SAAS,OAAO,cAAc;AAG9B,SAAS,+BAA+B,kCAAkC;AAE1E;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAaA,MAAM,sBAAsB,CACjC,UACG;AACH,QAAM,EAAE,aAAa,SAAS,UAAU,MAAM,UAAU,GAAG,UAAU,IACnE;AACF,QAAM,CAAC,uBAAuB,IAAI,2BAA2B,SAAS;AAEtE,SACE,qBAAC,UAAO,IAAI,UAAU,MAAK,WAAU,MAAM,aAAa,WAAU,MAChE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,IAAI;AAAA,QACJ,QAAQ;AAAA,UACN,YAAY;AAAA,UACZ,aAAa;AAAA,QACf;AAAA,QACA,OAAO;AAAA,UACL,cAAc;AAAA,YACZ;AAAA,YACA,CAAC,WAAW,CAAC,iBAAiB,OAAO,GAAG,KAAK;AAAA,YAC7C,CAAC,OAAO,oBAAoB;AAAA,YAC5B,CAAC,OAAO,aAAa;AAAA,UACvB;AAAA,UACA,gBAAgB;AAAA,YACd;AAAA,YACA,CAAC,WAAW,CAAC,iBAAiB,aAAa,GAAG,IAAI;AAAA,YAClD;AAAA,YACA;AAAA,UACF;AAAA,UACA,cAAc,CAAC,OAAO,aAAa;AAAA,UACnC,GAAI,QAAQ,SAAS,WACjB,EAAE,kBAAkB,wBAAwB,IAC5C;AAAA,QACN;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAAA,IACC;AAAA,KACH;AAEJ;AAEA,oBAAoB,aAAa,IAAI;",
4
+ "sourcesContent": ["import { Layer, Source } from '@vis.gl/react-maplibre';\nimport type { PropsWithChildren } from 'react';\n\nimport { _useBehavioralTrackingProps as useBehavioralTrackingProps } from '@dynatrace/strato-components/core';\n\nimport {\n DEFAULT_LINE_CAP,\n DEFAULT_LINE_DASH_ARRAY,\n DEFAULT_LINE_JOIN,\n SHAPE_OPACITY_DEFAULT,\n SHAPE_OPACITY_DIMMED,\n} from '../../constants.js';\nimport { useLayerBeforeId } from '../../hooks/use-layer-before-id.js';\nimport type {\n Connection,\n InternalConnectionLayerProps,\n} from '../../types/connection-layer.js';\n\ninterface ConnectionLayerLineProps<T extends Connection>\n extends Required<Pick<InternalConnectionLayerProps<T>, 'layerId'>> {\n geoJsonData: GeoJSON.FeatureCollection;\n sourceId: string;\n line: 'dashed' | 'solid' | undefined;\n}\n\nexport const ConnectionLayerLine = <T extends Connection>(\n props: PropsWithChildren<ConnectionLayerLineProps<T>>,\n) => {\n const { geoJsonData, layerId, sourceId, line, children, ...restProps } =\n props;\n const [behavioralTrackingProps] = useBehavioralTrackingProps(restProps);\n\n // Keep stack order aligned with JSX order even when this layer mounts after\n // siblings (e.g. async-gated `{apiData && <ChoroplethLayer>}`).\n const beforeId = useLayerBeforeId(layerId);\n\n return (\n <Source id={sourceId} type=\"geojson\" data={geoJsonData} promoteId=\"id\">\n <Layer\n type=\"line\"\n id={layerId}\n beforeId={beforeId}\n layout={{\n 'line-cap': DEFAULT_LINE_CAP,\n 'line-join': DEFAULT_LINE_JOIN,\n }}\n paint={{\n 'line-color': [\n 'case',\n ['boolean', ['feature-state', 'hover'], false],\n ['get', '__lineHoveredColor'],\n ['get', '__lineColor'],\n ],\n 'line-opacity': [\n 'case',\n ['boolean', ['feature-state', 'legendHover'], true],\n SHAPE_OPACITY_DEFAULT,\n SHAPE_OPACITY_DIMMED,\n ],\n 'line-width': ['get', '__lineWidth'],\n ...(line && line === 'dashed'\n ? { 'line-dasharray': DEFAULT_LINE_DASH_ARRAY }\n : null),\n }}\n {...behavioralTrackingProps}\n />\n {children}\n </Source>\n );\n};\n\nConnectionLayerLine['displayName'] = 'ConnectionLayerLine';\n"],
5
+ "mappings": "AAqCI,SACE,KADF;AArCJ,SAAS,OAAO,cAAc;AAG9B,SAAS,+BAA+B,kCAAkC;AAE1E;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,wBAAwB;AAa1B,MAAM,sBAAsB,CACjC,UACG;AACH,QAAM,EAAE,aAAa,SAAS,UAAU,MAAM,UAAU,GAAG,UAAU,IACnE;AACF,QAAM,CAAC,uBAAuB,IAAI,2BAA2B,SAAS;AAItE,QAAM,WAAW,iBAAiB,OAAO;AAEzC,SACE,qBAAC,UAAO,IAAI,UAAU,MAAK,WAAU,MAAM,aAAa,WAAU,MAChE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,IAAI;AAAA,QACJ;AAAA,QACA,QAAQ;AAAA,UACN,YAAY;AAAA,UACZ,aAAa;AAAA,QACf;AAAA,QACA,OAAO;AAAA,UACL,cAAc;AAAA,YACZ;AAAA,YACA,CAAC,WAAW,CAAC,iBAAiB,OAAO,GAAG,KAAK;AAAA,YAC7C,CAAC,OAAO,oBAAoB;AAAA,YAC5B,CAAC,OAAO,aAAa;AAAA,UACvB;AAAA,UACA,gBAAgB;AAAA,YACd;AAAA,YACA,CAAC,WAAW,CAAC,iBAAiB,aAAa,GAAG,IAAI;AAAA,YAClD;AAAA,YACA;AAAA,UACF;AAAA,UACA,cAAc,CAAC,OAAO,aAAa;AAAA,UACnC,GAAI,QAAQ,SAAS,WACjB,EAAE,kBAAkB,wBAAwB,IAC5C;AAAA,QACN;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAAA,IACC;AAAA,KACH;AAEJ;AAEA,oBAAoB,aAAa,IAAI;",
6
6
  "names": []
7
7
  }
@@ -1,27 +1,25 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import { _OverlayTooltip as OverlayTooltip } from "@dynatrace/strato-components/charts";
3
- import { restoreNullProps } from "./utils/restore-null-props.js";
4
3
  import { useGeoLayerTooltip } from "../../hooks/use-geo-layer-tooltip.js";
5
4
  import { isDefaultTooltipHandler } from "../../utils/tooltip-type-guards.js";
6
5
  const ConnectionLayerTooltip = (props) => {
7
- const { tooltipTemplate } = props;
8
- const {
9
- data: rawData,
10
- inBounds,
11
- position
12
- } = useGeoLayerTooltip("geoConnection");
13
- const data = restoreNullProps(rawData);
14
- if (!tooltipTemplate || !inBounds || !position) {
6
+ const { tooltipTemplate, hidden, symbolAlignment } = props;
7
+ const { data, inBounds, position } = useGeoLayerTooltip("geoConnection");
8
+ if (hidden || !tooltipTemplate || !inBounds || !position) {
15
9
  return null;
16
10
  }
17
11
  if (!data || !data[0]) {
18
12
  return null;
19
13
  }
20
- const { __lineColor: color, __lineWidth: thickness, ...rest } = data[0];
14
+ const {
15
+ __lineColor: color,
16
+ __lineWidth: thickness,
17
+ data: customData
18
+ } = data[0];
21
19
  const connectionData = {
22
20
  color,
23
21
  thickness,
24
- data: rest
22
+ data: customData
25
23
  };
26
24
  const template = tooltipTemplate(connectionData);
27
25
  if (!template) {
@@ -30,7 +28,13 @@ const ConnectionLayerTooltip = (props) => {
30
28
  if (isDefaultTooltipHandler(tooltipTemplate)) {
31
29
  return template;
32
30
  }
33
- return /* @__PURE__ */ jsx(OverlayTooltip, { legacyTemplate: template });
31
+ return /* @__PURE__ */ jsx(
32
+ OverlayTooltip,
33
+ {
34
+ legacyTemplate: template,
35
+ symbolAlignment
36
+ }
37
+ );
34
38
  };
35
39
  ConnectionLayerTooltip["displayName"] = "ConnectionLayerTooltip";
36
40
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/map/components/ConnectionLayer/ConnectionLayerTooltip.tsx"],
4
- "sourcesContent": ["import { _OverlayTooltip as OverlayTooltip } from '@dynatrace/strato-components/charts';\n\nimport { restoreNullProps } from './utils/restore-null-props.js';\nimport { useGeoLayerTooltip } from '../../hooks/use-geo-layer-tooltip.js';\nimport type {\n Connection,\n ConnectionTooltipStatePayload,\n} from '../../types/connection-layer.js';\nimport type {\n ConnectionLayerTooltipData,\n ConnectionLayerTooltipHandler,\n} from '../../types/tooltip.js';\nimport { isDefaultTooltipHandler } from '../../utils/tooltip-type-guards.js';\n\nexport interface ConnectionLayerTooltipProps {\n tooltipTemplate?: ConnectionLayerTooltipHandler;\n}\n\nexport const ConnectionLayerTooltip = (props: ConnectionLayerTooltipProps) => {\n const { tooltipTemplate } = props;\n\n const {\n data: rawData,\n inBounds,\n position,\n } = useGeoLayerTooltip<ConnectionTooltipStatePayload>('geoConnection');\n\n const data = restoreNullProps(rawData);\n\n if (!tooltipTemplate || !inBounds || !position) {\n return null;\n }\n\n if (!data || !data[0]) {\n return null;\n }\n\n const { __lineColor: color, __lineWidth: thickness, ...rest } = data[0];\n const connectionData: ConnectionLayerTooltipData<Connection> = {\n color,\n thickness,\n data: rest as Connection,\n };\n\n const template = tooltipTemplate(connectionData);\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\nConnectionLayerTooltip['displayName'] = 'ConnectionLayerTooltip';\n"],
5
- "mappings": "AAsDS;AAtDT,SAAS,mBAAmB,sBAAsB;AAElD,SAAS,wBAAwB;AACjC,SAAS,0BAA0B;AASnC,SAAS,+BAA+B;AAMjC,MAAM,yBAAyB,CAAC,UAAuC;AAC5E,QAAM,EAAE,gBAAgB,IAAI;AAE5B,QAAM;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF,IAAI,mBAAkD,eAAe;AAErE,QAAM,OAAO,iBAAiB,OAAO;AAErC,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,aAAa,OAAO,aAAa,WAAW,GAAG,KAAK,IAAI,KAAK,CAAC;AACtE,QAAM,iBAAyD;AAAA,IAC7D;AAAA,IACA;AAAA,IACA,MAAM;AAAA,EACR;AAEA,QAAM,WAAW,gBAAgB,cAAc;AAE/C,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,MAAI,wBAAwB,eAAe,GAAG;AAC5C,WAAO;AAAA,EACT;AAEA,SAAO,oBAAC,kBAAe,gBAAgB,UAAU;AACnD;AAEA,uBAAuB,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 { Connection } from '../../types/connection-layer.js';\nimport type {\n ConnectionLayerTooltipData,\n ConnectionLayerTooltipHandler,\n} from '../../types/tooltip.js';\nimport { isDefaultTooltipHandler } from '../../utils/tooltip-type-guards.js';\n\ninterface ConnectionTooltipPayload {\n id: string;\n __lineColor: string;\n __lineHoveredColor: string;\n __lineWidth: number;\n curve?: string;\n data: Connection;\n}\n\nexport interface ConnectionLayerTooltipProps {\n tooltipTemplate?: ConnectionLayerTooltipHandler;\n hidden?: boolean;\n symbolAlignment?: 'left' | 'right';\n}\n\nexport const ConnectionLayerTooltip = (props: ConnectionLayerTooltipProps) => {\n const { tooltipTemplate, hidden, symbolAlignment } = props;\n\n const { data, inBounds, position } =\n useGeoLayerTooltip<ConnectionTooltipPayload>('geoConnection');\n\n if (hidden || !tooltipTemplate || !inBounds || !position) {\n return null;\n }\n\n if (!data || !data[0]) {\n return null;\n }\n\n const {\n __lineColor: color,\n __lineWidth: thickness,\n data: customData,\n } = data[0];\n const connectionData: ConnectionLayerTooltipData<Connection> = {\n color,\n thickness,\n data: customData,\n };\n\n const template = tooltipTemplate(connectionData);\n\n if (!template) {\n return null;\n }\n\n if (isDefaultTooltipHandler(tooltipTemplate)) {\n return template;\n }\n\n return (\n <OverlayTooltip\n legacyTemplate={template}\n symbolAlignment={symbolAlignment}\n />\n );\n};\n\nConnectionLayerTooltip['displayName'] = 'ConnectionLayerTooltip';\n"],
5
+ "mappings": "AA6DI;AA7DJ,SAAS,mBAAmB,sBAAsB;AAElD,SAAS,0BAA0B;AAMnC,SAAS,+BAA+B;AAiBjC,MAAM,yBAAyB,CAAC,UAAuC;AAC5E,QAAM,EAAE,iBAAiB,QAAQ,gBAAgB,IAAI;AAErD,QAAM,EAAE,MAAM,UAAU,SAAS,IAC/B,mBAA6C,eAAe;AAE9D,MAAI,UAAU,CAAC,mBAAmB,CAAC,YAAY,CAAC,UAAU;AACxD,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG;AACrB,WAAO;AAAA,EACT;AAEA,QAAM;AAAA,IACJ,aAAa;AAAA,IACb,aAAa;AAAA,IACb,MAAM;AAAA,EACR,IAAI,KAAK,CAAC;AACV,QAAM,iBAAyD;AAAA,IAC7D;AAAA,IACA;AAAA,IACA,MAAM;AAAA,EACR;AAEA,QAAM,WAAW,gBAAgB,cAAc;AAE/C,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,MAAI,wBAAwB,eAAe,GAAG;AAC5C,WAAO;AAAA,EACT;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,gBAAgB;AAAA,MAChB;AAAA;AAAA,EACF;AAEJ;AAEA,uBAAuB,aAAa,IAAI;",
6
6
  "names": []
7
7
  }
@@ -13,14 +13,11 @@ const getLineThickness = (thickness) => {
13
13
  }
14
14
  return thickness;
15
15
  };
16
- const getKeysWithNullValues = (obj) => Object.keys(obj).filter((key) => obj[key] === null);
17
- const getFeatureProperties = (thickness, curve) => (properties, id) => {
16
+ const getRenderingProperties = (thickness, id, curve) => {
18
17
  const lineThickness = getLineThickness(thickness);
19
18
  return {
20
- ...properties,
21
19
  id,
22
20
  __lineWidth: lineThickness,
23
- __nullValues: getKeysWithNullValues(properties),
24
21
  curve
25
22
  };
26
23
  };
@@ -31,35 +28,40 @@ const getLineFeature = (path, featureProperties) => {
31
28
  }
32
29
  return getStraightLineFeature(path, featureProperties);
33
30
  };
31
+ const getConnectionColor = (connection, color) => {
32
+ const parsedColor = defineColor(color, connection);
33
+ const canvasColor = getCanvasColor(parsedColor);
34
+ const hoveredColor = calculateHoveredColor(canvasColor);
35
+ return {
36
+ __lineColor: canvasColor,
37
+ __lineHoveredColor: hoveredColor
38
+ };
39
+ };
34
40
  const getFeatures = (data, thickness, color, curve) => {
35
- const getProperties = getFeatureProperties(thickness, curve);
36
41
  const features = [];
37
42
  data.forEach((feature, index) => {
38
43
  if (feature.path.length >= 2) {
39
- const { path, ...properties } = feature;
44
+ const renderingProps = getRenderingProperties(
45
+ thickness,
46
+ `connection-${index}`,
47
+ curve
48
+ );
40
49
  const featureProperties = {
41
- ...getProperties({ path, ...properties }, `connection-${index}`),
50
+ ...renderingProps,
51
+ __dataIndex: index,
42
52
  ...getConnectionColor(feature, color)
43
53
  };
44
- features.push(getLineFeature(path, featureProperties));
54
+ features.push(getLineFeature(feature.path, featureProperties));
45
55
  }
46
56
  });
47
57
  return features;
48
58
  };
49
- const getConnectionColor = (connection, color) => {
50
- const parsedColor = defineColor(color, connection);
51
- const canvasColor = getCanvasColor(parsedColor);
52
- const hoveredColor = calculateHoveredColor(canvasColor);
53
- return {
54
- __lineColor: canvasColor,
55
- __lineHoveredColor: hoveredColor
56
- };
57
- };
58
59
  const parseConnectionDataToGeoJSON = (data, thickness, color, curve) => {
59
- return {
60
+ const geoJson = {
60
61
  type: "FeatureCollection",
61
62
  features: getFeatures(data, thickness, color, curve)
62
63
  };
64
+ return { geoJson };
63
65
  };
64
66
  export {
65
67
  parseConnectionDataToGeoJSON
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/map/components/ConnectionLayer/utils/parse-connection-data-to-geo-json.ts"],
4
- "sourcesContent": ["import type GeoJSON from 'geojson';\n\nimport { _getCanvasColor as getCanvasColor } from '@dynatrace/strato-components/charts';\n\nimport { getArcLineFeature } from './get-arc-line-feature.js';\nimport { getStraightLineFeature } from './get-straight-line-feature.js';\nimport { MAX_LINE_THICKNESS, MIN_LINE_THICKNESS } from '../../../constants.js';\nimport type {\n Connection,\n CurvedLine,\n FeatureProperties,\n} from '../../../types/connection-layer.js';\nimport type { Location } from '../../../types/location.js';\nimport { calculateHoveredColor } from '../../../utils/calculate-hovered-color.js';\nimport { defineColor } from '../../../utils/define-color.js';\n\nconst getLineThickness = (thickness: number): number => {\n if (thickness < MIN_LINE_THICKNESS) {\n return MIN_LINE_THICKNESS;\n }\n\n if (thickness > MAX_LINE_THICKNESS) {\n return MAX_LINE_THICKNESS;\n }\n\n return thickness;\n};\n\nconst getKeysWithNullValues = (obj: Record<string, unknown>): string[] =>\n Object.keys(obj).filter((key) => obj[key] === null);\n\nconst getFeatureProperties =\n (thickness: number, curve?: CurvedLine) =>\n <T extends Connection>(\n properties: T,\n id: string,\n ): Omit<FeatureProperties, '__lineColor' | '__lineHoveredColor'> => {\n const lineThickness = getLineThickness(thickness);\n\n return {\n ...properties,\n id,\n __lineWidth: lineThickness,\n __nullValues: getKeysWithNullValues(properties),\n curve,\n };\n };\n\nconst getLineFeature = (\n path: Location[],\n featureProperties: FeatureProperties,\n): GeoJSON.Feature => {\n const isCurve = featureProperties.curve === 'smooth';\n\n if (isCurve) {\n return getArcLineFeature(path, featureProperties);\n }\n\n return getStraightLineFeature(path, featureProperties);\n};\n\nconst getFeatures = <T extends Connection>(\n data: T[],\n thickness: number,\n color: string | ((connection: T) => string),\n curve?: CurvedLine,\n): GeoJSON.Feature[] => {\n const getProperties = getFeatureProperties(thickness, curve);\n const features: GeoJSON.Feature[] = [];\n data.forEach((feature, index) => {\n if (feature.path.length >= 2) {\n const { path, ...properties } = feature;\n\n const featureProperties = {\n ...getProperties({ path, ...properties }, `connection-${index}`),\n ...getConnectionColor(feature, color),\n };\n\n features.push(getLineFeature(path, featureProperties));\n }\n });\n return features;\n};\n\nconst getConnectionColor = <T extends Connection>(\n connection: T,\n color: string | ((connection: T) => string),\n): Pick<FeatureProperties, '__lineColor' | '__lineHoveredColor'> => {\n const parsedColor = defineColor(color, connection);\n\n const canvasColor = getCanvasColor(parsedColor);\n const hoveredColor = calculateHoveredColor(canvasColor);\n\n return {\n __lineColor: canvasColor,\n __lineHoveredColor: hoveredColor,\n };\n};\n\nexport const parseConnectionDataToGeoJSON = <T extends Connection>(\n data: T[],\n thickness: number,\n color: string | ((connection: T) => string),\n curve?: CurvedLine,\n): GeoJSON.FeatureCollection => {\n return {\n type: 'FeatureCollection',\n\n features: getFeatures(data, thickness, color, curve),\n };\n};\n"],
5
- "mappings": "AAEA,SAAS,mBAAmB,sBAAsB;AAElD,SAAS,yBAAyB;AAClC,SAAS,8BAA8B;AACvC,SAAS,oBAAoB,0BAA0B;AAOvD,SAAS,6BAA6B;AACtC,SAAS,mBAAmB;AAE5B,MAAM,mBAAmB,CAAC,cAA8B;AACtD,MAAI,YAAY,oBAAoB;AAClC,WAAO;AAAA,EACT;AAEA,MAAI,YAAY,oBAAoB;AAClC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,MAAM,wBAAwB,CAAC,QAC7B,OAAO,KAAK,GAAG,EAAE,OAAO,CAAC,QAAQ,IAAI,GAAG,MAAM,IAAI;AAEpD,MAAM,uBACJ,CAAC,WAAmB,UACpB,CACE,YACA,OACkE;AAClE,QAAM,gBAAgB,iBAAiB,SAAS;AAEhD,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA,aAAa;AAAA,IACb,cAAc,sBAAsB,UAAU;AAAA,IAC9C;AAAA,EACF;AACF;AAEF,MAAM,iBAAiB,CACrB,MACA,sBACoB;AACpB,QAAM,UAAU,kBAAkB,UAAU;AAE5C,MAAI,SAAS;AACX,WAAO,kBAAkB,MAAM,iBAAiB;AAAA,EAClD;AAEA,SAAO,uBAAuB,MAAM,iBAAiB;AACvD;AAEA,MAAM,cAAc,CAClB,MACA,WACA,OACA,UACsB;AACtB,QAAM,gBAAgB,qBAAqB,WAAW,KAAK;AAC3D,QAAM,WAA8B,CAAC;AACrC,OAAK,QAAQ,CAAC,SAAS,UAAU;AAC/B,QAAI,QAAQ,KAAK,UAAU,GAAG;AAC5B,YAAM,EAAE,MAAM,GAAG,WAAW,IAAI;AAEhC,YAAM,oBAAoB;AAAA,QACxB,GAAG,cAAc,EAAE,MAAM,GAAG,WAAW,GAAG,cAAc,KAAK,EAAE;AAAA,QAC/D,GAAG,mBAAmB,SAAS,KAAK;AAAA,MACtC;AAEA,eAAS,KAAK,eAAe,MAAM,iBAAiB,CAAC;AAAA,IACvD;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAEA,MAAM,qBAAqB,CACzB,YACA,UACkE;AAClE,QAAM,cAAc,YAAY,OAAO,UAAU;AAEjD,QAAM,cAAc,eAAe,WAAW;AAC9C,QAAM,eAAe,sBAAsB,WAAW;AAEtD,SAAO;AAAA,IACL,aAAa;AAAA,IACb,oBAAoB;AAAA,EACtB;AACF;AAEO,MAAM,+BAA+B,CAC1C,MACA,WACA,OACA,UAC8B;AAC9B,SAAO;AAAA,IACL,MAAM;AAAA,IAEN,UAAU,YAAY,MAAM,WAAW,OAAO,KAAK;AAAA,EACrD;AACF;",
4
+ "sourcesContent": ["import type GeoJSON from 'geojson';\n\nimport { _getCanvasColor as getCanvasColor } from '@dynatrace/strato-components/charts';\n\nimport { getArcLineFeature } from './get-arc-line-feature.js';\nimport { getStraightLineFeature } from './get-straight-line-feature.js';\nimport { MAX_LINE_THICKNESS, MIN_LINE_THICKNESS } from '../../../constants.js';\nimport type {\n Connection,\n CurvedLine,\n FeatureProperties,\n} from '../../../types/connection-layer.js';\nimport type { Location } from '../../../types/location.js';\nimport { calculateHoveredColor } from '../../../utils/calculate-hovered-color.js';\nimport { defineColor } from '../../../utils/define-color.js';\n\nconst getLineThickness = (thickness: number): number => {\n if (thickness < MIN_LINE_THICKNESS) {\n return MIN_LINE_THICKNESS;\n }\n\n if (thickness > MAX_LINE_THICKNESS) {\n return MAX_LINE_THICKNESS;\n }\n\n return thickness;\n};\n\nconst getRenderingProperties = (\n thickness: number,\n id: string,\n curve?: CurvedLine,\n): Omit<FeatureProperties, '__lineColor' | '__lineHoveredColor'> => {\n const lineThickness = getLineThickness(thickness);\n\n return {\n id,\n __lineWidth: lineThickness,\n curve,\n };\n};\n\nconst getLineFeature = (\n path: Location[],\n featureProperties: FeatureProperties,\n): GeoJSON.Feature => {\n const isCurve = featureProperties.curve === 'smooth';\n\n if (isCurve) {\n return getArcLineFeature(path, featureProperties);\n }\n\n return getStraightLineFeature(path, featureProperties);\n};\n\nconst getConnectionColor = <T extends Connection>(\n connection: T,\n color: string | ((connection: T) => string),\n): Pick<FeatureProperties, '__lineColor' | '__lineHoveredColor'> => {\n const parsedColor = defineColor(color, connection);\n\n const canvasColor = getCanvasColor(parsedColor);\n const hoveredColor = calculateHoveredColor(canvasColor);\n\n return {\n __lineColor: canvasColor,\n __lineHoveredColor: hoveredColor,\n };\n};\n\nconst getFeatures = <T extends Connection>(\n data: T[],\n thickness: number,\n color: string | ((connection: T) => string),\n curve?: CurvedLine,\n): GeoJSON.Feature[] => {\n const features: GeoJSON.Feature[] = [];\n data.forEach((feature, index) => {\n if (feature.path.length >= 2) {\n const renderingProps = getRenderingProperties(\n thickness,\n `connection-${index}`,\n curve,\n );\n\n const featureProperties: FeatureProperties = {\n ...renderingProps,\n __dataIndex: index,\n ...getConnectionColor(feature, color),\n };\n\n features.push(getLineFeature(feature.path, featureProperties));\n }\n });\n return features;\n};\n\nexport const parseConnectionDataToGeoJSON = <T extends Connection>(\n data: T[],\n thickness: number,\n color: string | ((connection: T) => string),\n curve?: CurvedLine,\n): { geoJson: GeoJSON.FeatureCollection } => {\n const geoJson: GeoJSON.FeatureCollection = {\n type: 'FeatureCollection',\n features: getFeatures(data, thickness, color, curve),\n };\n\n return { geoJson };\n};\n"],
5
+ "mappings": "AAEA,SAAS,mBAAmB,sBAAsB;AAElD,SAAS,yBAAyB;AAClC,SAAS,8BAA8B;AACvC,SAAS,oBAAoB,0BAA0B;AAOvD,SAAS,6BAA6B;AACtC,SAAS,mBAAmB;AAE5B,MAAM,mBAAmB,CAAC,cAA8B;AACtD,MAAI,YAAY,oBAAoB;AAClC,WAAO;AAAA,EACT;AAEA,MAAI,YAAY,oBAAoB;AAClC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,MAAM,yBAAyB,CAC7B,WACA,IACA,UACkE;AAClE,QAAM,gBAAgB,iBAAiB,SAAS;AAEhD,SAAO;AAAA,IACL;AAAA,IACA,aAAa;AAAA,IACb;AAAA,EACF;AACF;AAEA,MAAM,iBAAiB,CACrB,MACA,sBACoB;AACpB,QAAM,UAAU,kBAAkB,UAAU;AAE5C,MAAI,SAAS;AACX,WAAO,kBAAkB,MAAM,iBAAiB;AAAA,EAClD;AAEA,SAAO,uBAAuB,MAAM,iBAAiB;AACvD;AAEA,MAAM,qBAAqB,CACzB,YACA,UACkE;AAClE,QAAM,cAAc,YAAY,OAAO,UAAU;AAEjD,QAAM,cAAc,eAAe,WAAW;AAC9C,QAAM,eAAe,sBAAsB,WAAW;AAEtD,SAAO;AAAA,IACL,aAAa;AAAA,IACb,oBAAoB;AAAA,EACtB;AACF;AAEA,MAAM,cAAc,CAClB,MACA,WACA,OACA,UACsB;AACtB,QAAM,WAA8B,CAAC;AACrC,OAAK,QAAQ,CAAC,SAAS,UAAU;AAC/B,QAAI,QAAQ,KAAK,UAAU,GAAG;AAC5B,YAAM,iBAAiB;AAAA,QACrB;AAAA,QACA,cAAc,KAAK;AAAA,QACnB;AAAA,MACF;AAEA,YAAM,oBAAuC;AAAA,QAC3C,GAAG;AAAA,QACH,aAAa;AAAA,QACb,GAAG,mBAAmB,SAAS,KAAK;AAAA,MACtC;AAEA,eAAS,KAAK,eAAe,QAAQ,MAAM,iBAAiB,CAAC;AAAA,IAC/D;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAEO,MAAM,+BAA+B,CAC1C,MACA,WACA,OACA,UAC2C;AAC3C,QAAM,UAAqC;AAAA,IACzC,MAAM;AAAA,IACN,UAAU,YAAY,MAAM,WAAW,OAAO,KAAK;AAAA,EACrD;AAEA,SAAO,EAAE,QAAQ;AACnB;",
6
6
  "names": []
7
7
  }
@@ -14,6 +14,7 @@ import {
14
14
  SHAPE_OPACITY_DIMMED,
15
15
  SHAPE_OPACITY_DEFAULT
16
16
  } from "../../constants.js";
17
+ import { useLayerBeforeId } from "../../hooks/use-layer-before-id.js";
17
18
  import { useLayerColoringStrategy } from "../../hooks/use-layer-coloring-strategy.js";
18
19
  import { useLegendInteractionHighlighting } from "../../hooks/use-legend-interaction-highlighting.js";
19
20
  import { useLegendInteractionVisibility } from "../../hooks/use-legend-interaction-visibility.js";
@@ -53,11 +54,16 @@ const DotLayer = (props) => {
53
54
  props,
54
55
  colorParser
55
56
  );
56
- const tooltipTemplate = useTooltipTemplate(children, DotLayerTooltipSlot);
57
+ const {
58
+ handler: tooltipTemplate,
59
+ hidden: tooltipHidden,
60
+ symbolAlignment
61
+ } = useTooltipTemplate(children, DotLayerTooltipSlot, { extractProps: true });
57
62
  const sourceId = `source-${layerId}`;
58
63
  useLegendInteractionHighlighting(props, sourceId);
59
64
  useLegendInteractionVisibility(props, layerId);
60
- const dataGeoJson = parseDotDataToGeoJSON(
65
+ const beforeId = useLayerBeforeId(layerId);
66
+ const { geoJson: dataGeoJson } = parseDotDataToGeoJSON(
61
67
  data,
62
68
  shapeColor,
63
69
  bearing,
@@ -70,6 +76,7 @@ const DotLayer = (props) => {
70
76
  {
71
77
  type: "symbol",
72
78
  id: layerId,
79
+ beforeId,
73
80
  layout: {
74
81
  "icon-image": symbolName,
75
82
  "icon-size": DEFAULT_ICON_SIZE_RATIO,
@@ -115,7 +122,9 @@ const DotLayer = (props) => {
115
122
  /* @__PURE__ */ jsx(TooltipWrapper, { layerId, children: /* @__PURE__ */ jsx(
116
123
  DotLayerTooltip,
117
124
  {
118
- tooltipTemplate: isDotTooltipTemplate(tooltipTemplate) ? tooltipTemplate : void 0
125
+ tooltipTemplate: isDotTooltipTemplate(tooltipTemplate) ? tooltipTemplate : void 0,
126
+ hidden: tooltipHidden,
127
+ symbolAlignment
119
128
  }
120
129
  ) })
121
130
  ] });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/map/components/DotLayer/DotLayer.tsx"],
4
- "sourcesContent": ["import { Layer, Source } from '@vis.gl/react-maplibre';\nimport { type PropsWithChildren } from 'react';\n\nimport { _useBehavioralTrackingProps as useBehavioralTrackingProps } from '@dynatrace/strato-components/core';\n\nimport { BackgroundLayer } from './BackgroundLayer.js';\nimport { BackgroundSymbolLayer } from './BackgroundSymbolLayer.js';\nimport { DotLayerTooltip } from './DotLayerTooltip.js';\nimport { parseDotDataToGeoJSON } from './utils/parse-dot-data-to-geo-json.js';\nimport {\n DEFAULT_ICON_COLOR,\n DEFAULT_ICON_SIZE_RATIO,\n DEFAULT_SHAPE_COLOR,\n DEFAULT_SYMBOL_SIZE,\n FALLBACK_SYMBOL_SIZE,\n SHAPE_OPACITY_DIMMED,\n SHAPE_OPACITY_DEFAULT,\n} from '../../constants.js';\nimport { useLayerColoringStrategy } from '../../hooks/use-layer-coloring-strategy.js';\nimport { useLegendInteractionHighlighting } from '../../hooks/use-legend-interaction-highlighting.js';\nimport { useLegendInteractionVisibility } from '../../hooks/use-legend-interaction-visibility.js';\nimport { useLoadSymbolIntoMap } from '../../hooks/use-load-symbol-into-map.js';\nimport { useResolveLocationColor } from '../../hooks/use-resolve-color.js';\nimport { useTooltipTemplate } from '../../hooks/use-tooltip-template.js';\nimport { DotLayerTooltip as DotLayerTooltipSlot } from '../../slots/DotLayerTooltip.js';\nimport type { InternalDotLayerProps } from '../../types/dot-layer.js';\nimport type { Location } from '../../types/location.js';\nimport { isDotTooltipTemplate } from '../../utils/tooltip-type-guards.js';\nimport { TooltipWrapper } from '../TooltipWrapper.js';\n\n/**\n * DotLayer Component\n */\nexport const DotLayer = <T extends Location>(\n props: PropsWithChildren<InternalDotLayerProps<T>>,\n) => {\n const [behavioralTrackingProps] = useBehavioralTrackingProps(props);\n\n const {\n data,\n layerId,\n bearing = 0,\n children,\n shape = 'pin',\n background = false,\n shapeSize = DEFAULT_SYMBOL_SIZE,\n } = props;\n\n const calculatedShapeSize = shapeSize > 0 ? shapeSize : FALLBACK_SYMBOL_SIZE;\n\n const { symbolName, symbolType } = useLoadSymbolIntoMap(\n shape,\n layerId,\n calculatedShapeSize,\n );\n\n const bgLayerId = `${layerId}-background`;\n\n const { symbolName: bgName } = useLoadSymbolIntoMap(\n 'circle',\n bgLayerId,\n calculatedShapeSize,\n );\n\n const defaultSymbolColor =\n symbolType === 'shape' ? DEFAULT_SHAPE_COLOR : DEFAULT_ICON_COLOR;\n\n const colorParser = useLayerColoringStrategy();\n const shapeColor = useResolveLocationColor(\n defaultSymbolColor,\n props,\n colorParser,\n );\n\n const tooltipTemplate = useTooltipTemplate(children, DotLayerTooltipSlot);\n\n const sourceId = `source-${layerId}`;\n useLegendInteractionHighlighting(props, sourceId);\n useLegendInteractionVisibility(props, layerId);\n\n const dataGeoJson = parseDotDataToGeoJSON(\n data,\n shapeColor,\n bearing,\n background,\n );\n\n const iconAnchor = shape === 'pin' ? 'bottom' : 'center';\n\n return (\n <Source id={sourceId} type=\"geojson\" data={dataGeoJson} generateId>\n <Layer\n type=\"symbol\"\n id={layerId}\n layout={{\n 'icon-image': symbolName,\n 'icon-size': DEFAULT_ICON_SIZE_RATIO,\n 'icon-rotate': ['get', '__bearing'],\n // https://maplibre.org/maplibre-style-spec/layers/#layout-symbol-icon-ignore-placement\n 'icon-ignore-placement': true,\n 'icon-anchor': iconAnchor,\n }}\n paint={{\n 'icon-color': ['get', '__color'],\n 'icon-opacity': [\n 'case',\n ['boolean', ['feature-state', 'legendHover'], true],\n SHAPE_OPACITY_DEFAULT,\n SHAPE_OPACITY_DIMMED,\n ],\n }}\n {...behavioralTrackingProps}\n />\n {shape !== 'pin' ? (\n <BackgroundLayer\n background={Boolean(background)}\n beforeId={layerId}\n source={sourceId}\n radius={calculatedShapeSize / 2}\n iconAnchor={iconAnchor}\n />\n ) : (\n <BackgroundSymbolLayer\n background={Boolean(background)}\n beforeId={layerId}\n source={sourceId}\n radius={calculatedShapeSize / 2}\n iconAnchor={iconAnchor}\n symbolName={bgName}\n layerId={bgLayerId}\n shape={shape}\n />\n )}\n <TooltipWrapper layerId={layerId}>\n <DotLayerTooltip\n tooltipTemplate={\n isDotTooltipTemplate(tooltipTemplate) ? tooltipTemplate : undefined\n }\n />\n </TooltipWrapper>\n </Source>\n );\n};\n\nDotLayer['displayName'] = 'DotLayer';\n"],
5
- "mappings": "AA0FI,SACE,KADF;AA1FJ,SAAS,OAAO,cAAc;AAG9B,SAAS,+BAA+B,kCAAkC;AAE1E,SAAS,uBAAuB;AAChC,SAAS,6BAA6B;AACtC,SAAS,uBAAuB;AAChC,SAAS,6BAA6B;AACtC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,gCAAgC;AACzC,SAAS,wCAAwC;AACjD,SAAS,sCAAsC;AAC/C,SAAS,4BAA4B;AACrC,SAAS,+BAA+B;AACxC,SAAS,0BAA0B;AACnC,SAAS,mBAAmB,2BAA2B;AAGvD,SAAS,4BAA4B;AACrC,SAAS,sBAAsB;AAKxB,MAAM,WAAW,CACtB,UACG;AACH,QAAM,CAAC,uBAAuB,IAAI,2BAA2B,KAAK;AAElE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,YAAY;AAAA,EACd,IAAI;AAEJ,QAAM,sBAAsB,YAAY,IAAI,YAAY;AAExD,QAAM,EAAE,YAAY,WAAW,IAAI;AAAA,IACjC;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,YAAY,GAAG,OAAO;AAE5B,QAAM,EAAE,YAAY,OAAO,IAAI;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,qBACJ,eAAe,UAAU,sBAAsB;AAEjD,QAAM,cAAc,yBAAyB;AAC7C,QAAM,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,kBAAkB,mBAAmB,UAAU,mBAAmB;AAExE,QAAM,WAAW,UAAU,OAAO;AAClC,mCAAiC,OAAO,QAAQ;AAChD,iCAA+B,OAAO,OAAO;AAE7C,QAAM,cAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,aAAa,UAAU,QAAQ,WAAW;AAEhD,SACE,qBAAC,UAAO,IAAI,UAAU,MAAK,WAAU,MAAM,aAAa,YAAU,MAChE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,IAAI;AAAA,QACJ,QAAQ;AAAA,UACN,cAAc;AAAA,UACd,aAAa;AAAA,UACb,eAAe,CAAC,OAAO,WAAW;AAAA;AAAA,UAElC,yBAAyB;AAAA,UACzB,eAAe;AAAA,QACjB;AAAA,QACA,OAAO;AAAA,UACL,cAAc,CAAC,OAAO,SAAS;AAAA,UAC/B,gBAAgB;AAAA,YACd;AAAA,YACA,CAAC,WAAW,CAAC,iBAAiB,aAAa,GAAG,IAAI;AAAA,YAClD;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAAA,IACC,UAAU,QACT;AAAA,MAAC;AAAA;AAAA,QACC,YAAY,QAAQ,UAAU;AAAA,QAC9B,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,QAAQ,sBAAsB;AAAA,QAC9B;AAAA;AAAA,IACF,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,YAAY,QAAQ,UAAU;AAAA,QAC9B,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,QAAQ,sBAAsB;AAAA,QAC9B;AAAA,QACA,YAAY;AAAA,QACZ,SAAS;AAAA,QACT;AAAA;AAAA,IACF;AAAA,IAEF,oBAAC,kBAAe,SACd;AAAA,MAAC;AAAA;AAAA,QACC,iBACE,qBAAqB,eAAe,IAAI,kBAAkB;AAAA;AAAA,IAE9D,GACF;AAAA,KACF;AAEJ;AAEA,SAAS,aAAa,IAAI;",
4
+ "sourcesContent": ["import { Layer, Source } from '@vis.gl/react-maplibre';\nimport { type PropsWithChildren } from 'react';\n\nimport { _useBehavioralTrackingProps as useBehavioralTrackingProps } from '@dynatrace/strato-components/core';\n\nimport { BackgroundLayer } from './BackgroundLayer.js';\nimport { BackgroundSymbolLayer } from './BackgroundSymbolLayer.js';\nimport { DotLayerTooltip } from './DotLayerTooltip.js';\nimport { parseDotDataToGeoJSON } from './utils/parse-dot-data-to-geo-json.js';\nimport {\n DEFAULT_ICON_COLOR,\n DEFAULT_ICON_SIZE_RATIO,\n DEFAULT_SHAPE_COLOR,\n DEFAULT_SYMBOL_SIZE,\n FALLBACK_SYMBOL_SIZE,\n SHAPE_OPACITY_DIMMED,\n SHAPE_OPACITY_DEFAULT,\n} from '../../constants.js';\nimport { useLayerBeforeId } from '../../hooks/use-layer-before-id.js';\nimport { useLayerColoringStrategy } from '../../hooks/use-layer-coloring-strategy.js';\nimport { useLegendInteractionHighlighting } from '../../hooks/use-legend-interaction-highlighting.js';\nimport { useLegendInteractionVisibility } from '../../hooks/use-legend-interaction-visibility.js';\nimport { useLoadSymbolIntoMap } from '../../hooks/use-load-symbol-into-map.js';\nimport { useResolveLocationColor } from '../../hooks/use-resolve-color.js';\nimport { useTooltipTemplate } from '../../hooks/use-tooltip-template.js';\nimport { DotLayerTooltip as DotLayerTooltipSlot } from '../../slots/DotLayerTooltip.js';\nimport type { InternalDotLayerProps } from '../../types/dot-layer.js';\nimport type { Location } from '../../types/location.js';\nimport { isDotTooltipTemplate } from '../../utils/tooltip-type-guards.js';\nimport { TooltipWrapper } from '../TooltipWrapper.js';\n\n/**\n * DotLayer Component\n */\nexport const DotLayer = <T extends Location>(\n props: PropsWithChildren<InternalDotLayerProps<T>>,\n) => {\n const [behavioralTrackingProps] = useBehavioralTrackingProps(props);\n\n const {\n data,\n layerId,\n bearing = 0,\n children,\n shape = 'pin',\n background = false,\n shapeSize = DEFAULT_SYMBOL_SIZE,\n } = props;\n\n const calculatedShapeSize = shapeSize > 0 ? shapeSize : FALLBACK_SYMBOL_SIZE;\n\n const { symbolName, symbolType } = useLoadSymbolIntoMap(\n shape,\n layerId,\n calculatedShapeSize,\n );\n\n const bgLayerId = `${layerId}-background`;\n\n const { symbolName: bgName } = useLoadSymbolIntoMap(\n 'circle',\n bgLayerId,\n calculatedShapeSize,\n );\n\n const defaultSymbolColor =\n symbolType === 'shape' ? DEFAULT_SHAPE_COLOR : DEFAULT_ICON_COLOR;\n\n const colorParser = useLayerColoringStrategy();\n const shapeColor = useResolveLocationColor(\n defaultSymbolColor,\n props,\n colorParser,\n );\n\n const {\n handler: tooltipTemplate,\n hidden: tooltipHidden,\n symbolAlignment,\n } = useTooltipTemplate(children, DotLayerTooltipSlot, { extractProps: true });\n\n const sourceId = `source-${layerId}`;\n useLegendInteractionHighlighting(props, sourceId);\n useLegendInteractionVisibility(props, layerId);\n const beforeId = useLayerBeforeId(layerId);\n\n const { geoJson: dataGeoJson } = parseDotDataToGeoJSON(\n data,\n shapeColor,\n bearing,\n background,\n );\n\n const iconAnchor = shape === 'pin' ? 'bottom' : 'center';\n\n return (\n <Source id={sourceId} type=\"geojson\" data={dataGeoJson} generateId>\n <Layer\n type=\"symbol\"\n id={layerId}\n beforeId={beforeId}\n layout={{\n 'icon-image': symbolName,\n 'icon-size': DEFAULT_ICON_SIZE_RATIO,\n 'icon-rotate': ['get', '__bearing'],\n // https://maplibre.org/maplibre-style-spec/layers/#layout-symbol-icon-ignore-placement\n 'icon-ignore-placement': true,\n 'icon-anchor': iconAnchor,\n }}\n paint={{\n 'icon-color': ['get', '__color'],\n 'icon-opacity': [\n 'case',\n ['boolean', ['feature-state', 'legendHover'], true],\n SHAPE_OPACITY_DEFAULT,\n SHAPE_OPACITY_DIMMED,\n ],\n }}\n {...behavioralTrackingProps}\n />\n {shape !== 'pin' ? (\n <BackgroundLayer\n background={Boolean(background)}\n beforeId={layerId}\n source={sourceId}\n radius={calculatedShapeSize / 2}\n iconAnchor={iconAnchor}\n />\n ) : (\n <BackgroundSymbolLayer\n background={Boolean(background)}\n beforeId={layerId}\n source={sourceId}\n radius={calculatedShapeSize / 2}\n iconAnchor={iconAnchor}\n symbolName={bgName}\n layerId={bgLayerId}\n shape={shape}\n />\n )}\n <TooltipWrapper layerId={layerId}>\n <DotLayerTooltip\n tooltipTemplate={\n isDotTooltipTemplate(tooltipTemplate) ? tooltipTemplate : undefined\n }\n hidden={tooltipHidden}\n symbolAlignment={symbolAlignment}\n />\n </TooltipWrapper>\n </Source>\n );\n};\n\nDotLayer['displayName'] = 'DotLayer';\n"],
5
+ "mappings": "AAgGI,SACE,KADF;AAhGJ,SAAS,OAAO,cAAc;AAG9B,SAAS,+BAA+B,kCAAkC;AAE1E,SAAS,uBAAuB;AAChC,SAAS,6BAA6B;AACtC,SAAS,uBAAuB;AAChC,SAAS,6BAA6B;AACtC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,wBAAwB;AACjC,SAAS,gCAAgC;AACzC,SAAS,wCAAwC;AACjD,SAAS,sCAAsC;AAC/C,SAAS,4BAA4B;AACrC,SAAS,+BAA+B;AACxC,SAAS,0BAA0B;AACnC,SAAS,mBAAmB,2BAA2B;AAGvD,SAAS,4BAA4B;AACrC,SAAS,sBAAsB;AAKxB,MAAM,WAAW,CACtB,UACG;AACH,QAAM,CAAC,uBAAuB,IAAI,2BAA2B,KAAK;AAElE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,YAAY;AAAA,EACd,IAAI;AAEJ,QAAM,sBAAsB,YAAY,IAAI,YAAY;AAExD,QAAM,EAAE,YAAY,WAAW,IAAI;AAAA,IACjC;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,YAAY,GAAG,OAAO;AAE5B,QAAM,EAAE,YAAY,OAAO,IAAI;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,qBACJ,eAAe,UAAU,sBAAsB;AAEjD,QAAM,cAAc,yBAAyB;AAC7C,QAAM,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM;AAAA,IACJ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR;AAAA,EACF,IAAI,mBAAmB,UAAU,qBAAqB,EAAE,cAAc,KAAK,CAAC;AAE5E,QAAM,WAAW,UAAU,OAAO;AAClC,mCAAiC,OAAO,QAAQ;AAChD,iCAA+B,OAAO,OAAO;AAC7C,QAAM,WAAW,iBAAiB,OAAO;AAEzC,QAAM,EAAE,SAAS,YAAY,IAAI;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,aAAa,UAAU,QAAQ,WAAW;AAEhD,SACE,qBAAC,UAAO,IAAI,UAAU,MAAK,WAAU,MAAM,aAAa,YAAU,MAChE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,IAAI;AAAA,QACJ;AAAA,QACA,QAAQ;AAAA,UACN,cAAc;AAAA,UACd,aAAa;AAAA,UACb,eAAe,CAAC,OAAO,WAAW;AAAA;AAAA,UAElC,yBAAyB;AAAA,UACzB,eAAe;AAAA,QACjB;AAAA,QACA,OAAO;AAAA,UACL,cAAc,CAAC,OAAO,SAAS;AAAA,UAC/B,gBAAgB;AAAA,YACd;AAAA,YACA,CAAC,WAAW,CAAC,iBAAiB,aAAa,GAAG,IAAI;AAAA,YAClD;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAAA,IACC,UAAU,QACT;AAAA,MAAC;AAAA;AAAA,QACC,YAAY,QAAQ,UAAU;AAAA,QAC9B,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,QAAQ,sBAAsB;AAAA,QAC9B;AAAA;AAAA,IACF,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,YAAY,QAAQ,UAAU;AAAA,QAC9B,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,QAAQ,sBAAsB;AAAA,QAC9B;AAAA,QACA,YAAY;AAAA,QACZ,SAAS;AAAA,QACT;AAAA;AAAA,IACF;AAAA,IAEF,oBAAC,kBAAe,SACd;AAAA,MAAC;AAAA;AAAA,QACC,iBACE,qBAAqB,eAAe,IAAI,kBAAkB;AAAA,QAE5D,QAAQ;AAAA,QACR;AAAA;AAAA,IACF,GACF;AAAA,KACF;AAEJ;AAEA,SAAS,aAAa,IAAI;",
6
6
  "names": []
7
7
  }
@@ -3,9 +3,9 @@ import { _OverlayTooltip as OverlayTooltip } from "@dynatrace/strato-components/
3
3
  import { useGeoLayerTooltip } from "../../hooks/use-geo-layer-tooltip.js";
4
4
  import { isDefaultTooltipHandler } from "../../utils/tooltip-type-guards.js";
5
5
  const DotLayerTooltip = (props) => {
6
- const { tooltipTemplate } = props;
6
+ const { tooltipTemplate, hidden, symbolAlignment } = props;
7
7
  const { data, inBounds, position } = useGeoLayerTooltip("geoDot");
8
- if (!tooltipTemplate || !inBounds || !position) {
8
+ if (hidden || !tooltipTemplate || !inBounds || !position) {
9
9
  return null;
10
10
  }
11
11
  if (!data || !data[0]) {
@@ -24,7 +24,13 @@ const DotLayerTooltip = (props) => {
24
24
  if (isDefaultTooltipHandler(tooltipTemplate)) {
25
25
  return template;
26
26
  }
27
- return /* @__PURE__ */ jsx(OverlayTooltip, { legacyTemplate: template });
27
+ return /* @__PURE__ */ jsx(
28
+ OverlayTooltip,
29
+ {
30
+ legacyTemplate: template,
31
+ symbolAlignment
32
+ }
33
+ );
28
34
  };
29
35
  DotLayerTooltip["displayName"] = "DotLayerTooltip";
30
36
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/map/components/DotLayer/DotLayerTooltip.tsx"],
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;",
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 __backgroundColor: string;\n __hoveredBackgroundColor: string;\n data: Location;\n}\n\nexport interface DotLayerTooltipProps {\n tooltipTemplate?: DotLayerTooltipHandler;\n hidden?: boolean;\n symbolAlignment?: 'left' | 'right';\n}\n\nexport const DotLayerTooltip = (props: DotLayerTooltipProps) => {\n const { tooltipTemplate, hidden, symbolAlignment } = props;\n\n const { data, inBounds, position } =\n useGeoLayerTooltip<DotTooltipStatePayload>('geoDot');\n\n if (hidden || !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 (\n <OverlayTooltip\n legacyTemplate={template}\n symbolAlignment={symbolAlignment}\n />\n );\n};\n\nDotLayerTooltip['displayName'] = 'DotLayerTooltip';\n"],
5
+ "mappings": "AAyDI;AAzDJ,SAAS,mBAAmB,sBAAsB;AAElD,SAAS,0BAA0B;AAMnC,SAAS,+BAA+B;AAiBjC,MAAM,kBAAkB,CAAC,UAAgC;AAC9D,QAAM,EAAE,iBAAiB,QAAQ,gBAAgB,IAAI;AAErD,QAAM,EAAE,MAAM,UAAU,SAAS,IAC/B,mBAA2C,QAAQ;AAErD,MAAI,UAAU,CAAC,mBAAmB,CAAC,YAAY,CAAC,UAAU;AACxD,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,SACE;AAAA,IAAC;AAAA;AAAA,MACC,gBAAgB;AAAA,MAChB;AAAA;AAAA,EACF;AAEJ;AAEA,gBAAgB,aAAa,IAAI;",
6
6
  "names": []
7
7
  }
@@ -4,18 +4,17 @@ import { resolveIconBackground } from "./resolve-icon-background.js";
4
4
  import { calculateHoveredColor } from "../../../utils/calculate-hovered-color.js";
5
5
  import { defineColor } from "../../../utils/define-color.js";
6
6
  const parseDotDataToGeoJSON = (data, color, bearing, backgroundColor) => {
7
- return {
7
+ const geoJson = {
8
8
  type: "FeatureCollection",
9
- features: data.map((feature) => {
10
- const { longitude, latitude, ...properties } = feature;
9
+ features: data.map((feature, index) => {
10
+ const { longitude, latitude } = feature;
11
11
  const canvasColor = getCanvasColor(defineColor(color, feature));
12
12
  const hoveredColor = calculateHoveredColor(canvasColor);
13
13
  const { parsedBackgroundColor, parsedHoveredBackgroundColor } = resolveIconBackground(feature, backgroundColor);
14
14
  return {
15
15
  type: "Feature",
16
16
  properties: {
17
- data: feature,
18
- ...properties,
17
+ __dataIndex: index,
19
18
  __color: canvasColor,
20
19
  __hoveredColor: hoveredColor,
21
20
  __backgroundColor: parsedBackgroundColor,
@@ -26,6 +25,7 @@ const parseDotDataToGeoJSON = (data, color, bearing, backgroundColor) => {
26
25
  };
27
26
  })
28
27
  };
28
+ return { geoJson };
29
29
  };
30
30
  export {
31
31
  parseDotDataToGeoJSON
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/map/components/DotLayer/utils/parse-dot-data-to-geo-json.ts"],
4
- "sourcesContent": ["import type GeoJSON from 'geojson';\n\nimport { _getCanvasColor as getCanvasColor } from '@dynatrace/strato-components/charts';\n\nimport { defineBearing } from './define-bearing.js';\nimport { resolveIconBackground } from './resolve-icon-background.js';\nimport type { Location } from '../../../types/location.js';\nimport { calculateHoveredColor } from '../../../utils/calculate-hovered-color.js';\nimport { defineColor } from '../../../utils/define-color.js';\n\nexport const parseDotDataToGeoJSON = <T extends Location>(\n data: T[],\n color: string | ((item: T) => string),\n bearing: number | ((item: T) => number),\n backgroundColor: boolean | string | ((item: T) => string),\n): GeoJSON.FeatureCollection => {\n return {\n type: 'FeatureCollection',\n features: data.map((feature) => {\n const { longitude, latitude, ...properties } = feature;\n const canvasColor = getCanvasColor(defineColor(color, feature));\n const hoveredColor = calculateHoveredColor(canvasColor);\n\n const { parsedBackgroundColor, parsedHoveredBackgroundColor } =\n resolveIconBackground(feature, backgroundColor);\n\n return {\n type: 'Feature',\n properties: {\n data: feature,\n ...properties,\n __color: canvasColor,\n __hoveredColor: hoveredColor,\n __backgroundColor: parsedBackgroundColor,\n __hoveredBackgroundColor: parsedHoveredBackgroundColor,\n __bearing: defineBearing(bearing, feature),\n },\n geometry: { type: 'Point', coordinates: [longitude, latitude] },\n };\n }),\n };\n};\n"],
5
- "mappings": "AAEA,SAAS,mBAAmB,sBAAsB;AAElD,SAAS,qBAAqB;AAC9B,SAAS,6BAA6B;AAEtC,SAAS,6BAA6B;AACtC,SAAS,mBAAmB;AAErB,MAAM,wBAAwB,CACnC,MACA,OACA,SACA,oBAC8B;AAC9B,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU,KAAK,IAAI,CAAC,YAAY;AAC9B,YAAM,EAAE,WAAW,UAAU,GAAG,WAAW,IAAI;AAC/C,YAAM,cAAc,eAAe,YAAY,OAAO,OAAO,CAAC;AAC9D,YAAM,eAAe,sBAAsB,WAAW;AAEtD,YAAM,EAAE,uBAAuB,6BAA6B,IAC1D,sBAAsB,SAAS,eAAe;AAEhD,aAAO;AAAA,QACL,MAAM;AAAA,QACN,YAAY;AAAA,UACV,MAAM;AAAA,UACN,GAAG;AAAA,UACH,SAAS;AAAA,UACT,gBAAgB;AAAA,UAChB,mBAAmB;AAAA,UACnB,0BAA0B;AAAA,UAC1B,WAAW,cAAc,SAAS,OAAO;AAAA,QAC3C;AAAA,QACA,UAAU,EAAE,MAAM,SAAS,aAAa,CAAC,WAAW,QAAQ,EAAE;AAAA,MAChE;AAAA,IACF,CAAC;AAAA,EACH;AACF;",
4
+ "sourcesContent": ["import type GeoJSON from 'geojson';\n\nimport { _getCanvasColor as getCanvasColor } from '@dynatrace/strato-components/charts';\n\nimport { defineBearing } from './define-bearing.js';\nimport { resolveIconBackground } from './resolve-icon-background.js';\nimport type { Location } from '../../../types/location.js';\nimport { calculateHoveredColor } from '../../../utils/calculate-hovered-color.js';\nimport { defineColor } from '../../../utils/define-color.js';\n\nexport const parseDotDataToGeoJSON = <T extends Location>(\n data: T[],\n color: string | ((item: T) => string),\n bearing: number | ((item: T) => number),\n backgroundColor: boolean | string | ((item: T) => string),\n): { geoJson: GeoJSON.FeatureCollection } => {\n const geoJson: GeoJSON.FeatureCollection = {\n type: 'FeatureCollection',\n features: data.map((feature, index) => {\n const { longitude, latitude } = feature;\n const canvasColor = getCanvasColor(defineColor(color, feature));\n const hoveredColor = calculateHoveredColor(canvasColor);\n\n const { parsedBackgroundColor, parsedHoveredBackgroundColor } =\n resolveIconBackground(feature, backgroundColor);\n\n return {\n type: 'Feature',\n properties: {\n __dataIndex: index,\n __color: canvasColor,\n __hoveredColor: hoveredColor,\n __backgroundColor: parsedBackgroundColor,\n __hoveredBackgroundColor: parsedHoveredBackgroundColor,\n __bearing: defineBearing(bearing, feature),\n },\n geometry: { type: 'Point', coordinates: [longitude, latitude] },\n };\n }),\n };\n\n return { geoJson };\n};\n"],
5
+ "mappings": "AAEA,SAAS,mBAAmB,sBAAsB;AAElD,SAAS,qBAAqB;AAC9B,SAAS,6BAA6B;AAEtC,SAAS,6BAA6B;AACtC,SAAS,mBAAmB;AAErB,MAAM,wBAAwB,CACnC,MACA,OACA,SACA,oBAC2C;AAC3C,QAAM,UAAqC;AAAA,IACzC,MAAM;AAAA,IACN,UAAU,KAAK,IAAI,CAAC,SAAS,UAAU;AACrC,YAAM,EAAE,WAAW,SAAS,IAAI;AAChC,YAAM,cAAc,eAAe,YAAY,OAAO,OAAO,CAAC;AAC9D,YAAM,eAAe,sBAAsB,WAAW;AAEtD,YAAM,EAAE,uBAAuB,6BAA6B,IAC1D,sBAAsB,SAAS,eAAe;AAEhD,aAAO;AAAA,QACL,MAAM;AAAA,QACN,YAAY;AAAA,UACV,aAAa;AAAA,UACb,SAAS;AAAA,UACT,gBAAgB;AAAA,UAChB,mBAAmB;AAAA,UACnB,0BAA0B;AAAA,UAC1B,WAAW,cAAc,SAAS,OAAO;AAAA,QAC3C;AAAA,QACA,UAAU,EAAE,MAAM,SAAS,aAAa,CAAC,WAAW,QAAQ,EAAE;AAAA,MAChE;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,QAAQ;AACnB;",
6
6
  "names": []
7
7
  }
@@ -7,6 +7,7 @@ import {
7
7
  import { isUndefined } from "lodash-es";
8
8
  import {
9
9
  forwardRef,
10
+ useCallback,
10
11
  useContext,
11
12
  useRef,
12
13
  useState
@@ -35,9 +36,9 @@ import { useMapBaseLayerFeatures } from "../hooks/use-map-base-layer-features.js
35
36
  import { useMapConfig } from "../hooks/use-map-config.js";
36
37
  import { useMapLoading } from "../hooks/use-map-loading.js";
37
38
  import { useMapPerformance } from "../hooks/use-map-performance.js";
39
+ import { useMapRuntimeError } from "../hooks/use-map-runtime-error.js";
38
40
  import { useOverlayEvents } from "../hooks/use-overlay-events.js";
39
41
  import { useTooltipEventListeners } from "../hooks/use-tooltip-event-listeners.js";
40
- import { useWebGLContextError } from "../hooks/use-webgl-context-error.js";
41
42
  import { defaultStyle } from "../map-styles/default-style.js";
42
43
  import { MapViewImperativeHandler } from "../providers/imperative-handler.provider.js";
43
44
  import { getColorFromToken } from "../utils/get-color-from-token.js";
@@ -90,21 +91,23 @@ const MapSource = () => {
90
91
  };
91
92
  const MapInteractions = ({
92
93
  children,
93
- onContextLostError
94
+ onContextLostError,
95
+ interactiveLayerIds
94
96
  }) => {
95
- const [contextLostError, setContextLostError] = useState(null);
96
- useHoverInteraction();
97
- useActiveInteraction();
98
- useWebGLContextError(() => {
97
+ const [runtimeError, setRuntimeError] = useState(null);
98
+ const onRuntimeError = useCallback(() => {
99
99
  onContextLostError?.();
100
- setContextLostError(
100
+ setRuntimeError(
101
101
  new Error(
102
- "Too many active maps. This is a browser limitation. Try reducing the number of map instances."
102
+ "The map encountered repeated rendering errors and could not recover. Please reload the page."
103
103
  )
104
104
  );
105
- });
106
- if (contextLostError) {
107
- throw contextLostError;
105
+ }, [onContextLostError]);
106
+ useHoverInteraction(interactiveLayerIds);
107
+ useActiveInteraction(interactiveLayerIds);
108
+ useMapRuntimeError({ onError: onRuntimeError });
109
+ if (runtimeError) {
110
+ throw runtimeError;
108
111
  }
109
112
  return children;
110
113
  };
@@ -231,7 +234,14 @@ const MapContent = forwardRef((props, forwardedRef) => {
231
234
  children: [
232
235
  /* @__PURE__ */ jsx(MapSource, {}),
233
236
  loading ? null : /* @__PURE__ */ jsxs(Fragment, { children: [
234
- /* @__PURE__ */ jsx(MapInteractions, { onContextLostError, children }),
237
+ /* @__PURE__ */ jsx(
238
+ MapInteractions,
239
+ {
240
+ onContextLostError,
241
+ interactiveLayerIds: layerIds,
242
+ children
243
+ }
244
+ ),
235
245
  shouldRenderToolbar ? /* @__PURE__ */ jsx(MapToolbar, {}) : null
236
246
  ] })
237
247
  ]