@map-colonies/react-components 3.12.2 → 3.13.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 (376) hide show
  1. package/.eslintignore +1 -1
  2. package/.storybook/main.js +13 -13
  3. package/.storybook/manager.js +6 -6
  4. package/.storybook/preview-head.html +21 -21
  5. package/.storybook/preview.js +18 -18
  6. package/.storybook/theme.js +9 -9
  7. package/CHANGELOG.md +830 -810
  8. package/README.md +53 -53
  9. package/dist/autocomplete/autocomplete.css +25 -25
  10. package/dist/autocomplete/autocomplete.d.ts +33 -33
  11. package/dist/autocomplete/autocomplete.js +478 -478
  12. package/dist/autocomplete/index.d.ts +1 -1
  13. package/dist/autocomplete/index.js +5 -5
  14. package/dist/box/box.d.ts +3 -3
  15. package/dist/box/box.js +35 -35
  16. package/dist/box/index.d.ts +1 -1
  17. package/dist/box/index.js +5 -5
  18. package/dist/cesium-map/data-sources/custom.data-source.d.ts +5 -5
  19. package/dist/cesium-map/data-sources/custom.data-source.js +23 -23
  20. package/dist/cesium-map/data-sources/drawings.data-source.d.ts +34 -34
  21. package/dist/cesium-map/data-sources/drawings.data-source.js +193 -187
  22. package/dist/cesium-map/data-sources/index.d.ts +2 -2
  23. package/dist/cesium-map/data-sources/index.js +14 -14
  24. package/dist/cesium-map/entities/entity.d.ts +5 -5
  25. package/dist/cesium-map/entities/entity.description.d.ts +6 -6
  26. package/dist/cesium-map/entities/entity.description.js +27 -27
  27. package/dist/cesium-map/entities/entity.js +23 -23
  28. package/dist/cesium-map/entities/graphics/polygon.graphics.d.ts +5 -5
  29. package/dist/cesium-map/entities/graphics/polygon.graphics.js +23 -23
  30. package/dist/cesium-map/entities/graphics/polyline.graphics.d.ts +5 -5
  31. package/dist/cesium-map/entities/graphics/polyline.graphics.js +23 -23
  32. package/dist/cesium-map/entities/graphics/rectangle.graphics.d.ts +5 -5
  33. package/dist/cesium-map/entities/graphics/rectangle.graphics.js +23 -23
  34. package/dist/cesium-map/entities/index.d.ts +4 -4
  35. package/dist/cesium-map/entities/index.js +16 -16
  36. package/dist/cesium-map/index.d.ts +8 -8
  37. package/dist/cesium-map/index.js +20 -20
  38. package/dist/cesium-map/layers/3d.tileset.d.ts +7 -7
  39. package/dist/cesium-map/layers/3d.tileset.js +43 -43
  40. package/dist/cesium-map/layers/3d.tileset.with.update.d.ts +6 -6
  41. package/dist/cesium-map/layers/3d.tileset.with.update.js +115 -115
  42. package/dist/cesium-map/layers/geojson.layer.d.ts +5 -5
  43. package/dist/cesium-map/layers/geojson.layer.js +23 -23
  44. package/dist/cesium-map/layers/imagery.layer.d.ts +6 -6
  45. package/dist/cesium-map/layers/imagery.layer.js +68 -68
  46. package/dist/cesium-map/layers/index.d.ts +7 -7
  47. package/dist/cesium-map/layers/index.js +19 -19
  48. package/dist/cesium-map/layers/osm.layer.d.ts +9 -9
  49. package/dist/cesium-map/layers/osm.layer.js +36 -36
  50. package/dist/cesium-map/layers/wms.layer.d.ts +9 -9
  51. package/dist/cesium-map/layers/wms.layer.js +36 -36
  52. package/dist/cesium-map/layers/wmts.layer.d.ts +9 -9
  53. package/dist/cesium-map/layers/wmts.layer.js +36 -36
  54. package/dist/cesium-map/layers/xyz.layer.d.ts +9 -9
  55. package/dist/cesium-map/layers/xyz.layer.js +36 -36
  56. package/dist/cesium-map/layers-manager.d.ts +55 -55
  57. package/dist/cesium-map/layers-manager.js +246 -246
  58. package/dist/cesium-map/map-legend/MapLegend.css +136 -135
  59. package/dist/cesium-map/map-legend/MapLegend.d.ts +15 -15
  60. package/dist/cesium-map/map-legend/MapLegend.js +57 -57
  61. package/dist/cesium-map/map-legend/MapLegendList.d.ts +13 -13
  62. package/dist/cesium-map/map-legend/MapLegendList.js +43 -43
  63. package/dist/cesium-map/map-legend/MapLegendSidebar.d.ts +16 -16
  64. package/dist/cesium-map/map-legend/MapLegendSidebar.js +20 -20
  65. package/dist/cesium-map/map-legend/MapLegendToggle.d.ts +7 -7
  66. package/dist/cesium-map/map-legend/MapLegendToggle.js +20 -20
  67. package/dist/cesium-map/map-legend/index.d.ts +3 -3
  68. package/dist/cesium-map/map-legend/index.js +14 -14
  69. package/dist/cesium-map/map.css +59 -59
  70. package/dist/cesium-map/map.d.ts +63 -59
  71. package/dist/cesium-map/map.js +311 -305
  72. package/dist/cesium-map/map.types.d.ts +8 -8
  73. package/dist/cesium-map/map.types.js +12 -12
  74. package/dist/cesium-map/proxied.types.d.ts +30 -30
  75. package/dist/cesium-map/proxied.types.js +133 -132
  76. package/dist/cesium-map/settings/base-maps.css +37 -37
  77. package/dist/cesium-map/settings/base-maps.d.ts +7 -7
  78. package/dist/cesium-map/settings/base-maps.js +78 -78
  79. package/dist/cesium-map/settings/scene-modes.css +19 -19
  80. package/dist/cesium-map/settings/scene-modes.d.ts +7 -7
  81. package/dist/cesium-map/settings/scene-modes.js +65 -65
  82. package/dist/cesium-map/settings/settings.css +52 -52
  83. package/dist/cesium-map/settings/settings.d.ts +23 -23
  84. package/dist/cesium-map/settings/settings.js +79 -79
  85. package/dist/cesium-map/terrain-providers/custom/dummy-quantized-mesh-tile.d.ts +3 -3
  86. package/dist/cesium-map/terrain-providers/custom/dummy-quantized-mesh-tile.js +245 -245
  87. package/dist/cesium-map/terrain-providers/custom/quantized-mesh-decoder.d.ts +9 -9
  88. package/dist/cesium-map/terrain-providers/custom/quantized-mesh-decoder.js +202 -202
  89. package/dist/cesium-map/terrain-providers/custom/quantized-mesh-terrain-provider.d.ts +50 -50
  90. package/dist/cesium-map/terrain-providers/custom/quantized-mesh-terrain-provider.js +136 -136
  91. package/dist/cesium-map/tools/cesium/primitives-conversions.cesium.d.ts +2 -2
  92. package/dist/cesium-map/tools/cesium/primitives-conversions.cesium.js +38 -38
  93. package/dist/cesium-map/tools/coordinates-tracker.tool.css +11 -11
  94. package/dist/cesium-map/tools/coordinates-tracker.tool.d.ts +7 -7
  95. package/dist/cesium-map/tools/coordinates-tracker.tool.js +86 -78
  96. package/dist/cesium-map/tools/draw/drawHelper.css +101 -101
  97. package/dist/cesium-map/tools/draw/drawHelper.d.ts +28 -28
  98. package/dist/cesium-map/tools/draw/drawHelper.js +1694 -1694
  99. package/dist/cesium-map/tools/geojson/geojson-to-primitive.d.ts +4 -4
  100. package/dist/cesium-map/tools/geojson/geojson-to-primitive.js +41 -41
  101. package/dist/cesium-map/tools/geojson/index.d.ts +2 -2
  102. package/dist/cesium-map/tools/geojson/index.js +14 -14
  103. package/dist/cesium-map/tools/geojson/point.geojson.d.ts +7 -3
  104. package/dist/cesium-map/tools/geojson/point.geojson.js +47 -21
  105. package/dist/cesium-map/tools/geojson/polygon.geojson.d.ts +3 -3
  106. package/dist/cesium-map/tools/geojson/polygon.geojson.js +24 -24
  107. package/dist/cesium-map/tools/geojson/rectangle.geojson.d.ts +3 -3
  108. package/dist/cesium-map/tools/geojson/rectangle.geojson.js +44 -44
  109. package/dist/cesium-map/tools/inspector.tool.d.ts +4 -4
  110. package/dist/cesium-map/tools/inspector.tool.js +33 -33
  111. package/dist/cesium-map/tools/scale-tracker.tool.css +16 -16
  112. package/dist/cesium-map/tools/scale-tracker.tool.d.ts +8 -8
  113. package/dist/cesium-map/tools/scale-tracker.tool.js +158 -158
  114. package/dist/cesium-map/tools/terranian-height.tool.d.ts +4 -4
  115. package/dist/cesium-map/tools/terranian-height.tool.js +114 -114
  116. package/dist/cssbaseline/cssbaseline.d.ts +5 -5
  117. package/dist/cssbaseline/cssbaseline.js +41 -41
  118. package/dist/cssbaseline/index.d.ts +1 -1
  119. package/dist/cssbaseline/index.js +6 -6
  120. package/dist/date-picker/date-picker.css +9 -9
  121. package/dist/date-picker/date-picker.d.ts +14 -14
  122. package/dist/date-picker/date-picker.js +78 -78
  123. package/dist/date-picker/index.d.ts +1 -1
  124. package/dist/date-picker/index.js +13 -13
  125. package/dist/date-range-picker/date-range-picker.css +9 -9
  126. package/dist/date-range-picker/date-range-picker.d.ts +26 -26
  127. package/dist/date-range-picker/date-range-picker.form-control.css +3 -3
  128. package/dist/date-range-picker/date-range-picker.form-control.d.ts +28 -28
  129. package/dist/date-range-picker/date-range-picker.form-control.js +95 -95
  130. package/dist/date-range-picker/date-range-picker.js +104 -104
  131. package/dist/date-range-picker/index.d.ts +2 -2
  132. package/dist/date-range-picker/index.js +14 -14
  133. package/dist/file-picker/file-picker.css +63 -63
  134. package/dist/file-picker/file-picker.d.ts +276 -276
  135. package/dist/file-picker/file-picker.js +151 -151
  136. package/dist/file-picker/fs-map.json +1556 -1556
  137. package/dist/file-picker/index.d.ts +2 -2
  138. package/dist/file-picker/index.js +14 -14
  139. package/dist/file-picker/localization.d.ts +11 -11
  140. package/dist/file-picker/localization.js +124 -124
  141. package/dist/index.d.ts +13 -13
  142. package/dist/index.js +25 -25
  143. package/dist/map-filter-container/container-map.css +5 -5
  144. package/dist/map-filter-container/container-map.d.ts +11 -11
  145. package/dist/map-filter-container/container-map.js +31 -31
  146. package/dist/map-filter-container/index.d.ts +1 -1
  147. package/dist/map-filter-container/index.js +13 -13
  148. package/dist/map-filter-container/map-filter-container.d.ts +9 -9
  149. package/dist/map-filter-container/map-filter-container.js +78 -78
  150. package/dist/map-filter-container/polygon-selection-ui.d.ts +12 -12
  151. package/dist/map-filter-container/polygon-selection-ui.js +62 -62
  152. package/dist/models/defaults.d.ts +28 -28
  153. package/dist/models/defaults.js +32 -32
  154. package/dist/models/enums.d.ts +14 -14
  155. package/dist/models/enums.js +20 -20
  156. package/dist/models/index.d.ts +1 -1
  157. package/dist/models/index.js +13 -13
  158. package/dist/ol-map/feature.d.ts +6 -6
  159. package/dist/ol-map/feature.js +20 -20
  160. package/dist/ol-map/index.d.ts +6 -6
  161. package/dist/ol-map/index.js +18 -18
  162. package/dist/ol-map/interactions/draw.d.ts +8 -8
  163. package/dist/ol-map/interactions/draw.js +44 -44
  164. package/dist/ol-map/interactions/index.d.ts +1 -1
  165. package/dist/ol-map/interactions/index.js +13 -13
  166. package/dist/ol-map/layers/index.d.ts +3 -3
  167. package/dist/ol-map/layers/index.js +15 -15
  168. package/dist/ol-map/layers/tile-layer.d.ts +9 -9
  169. package/dist/ol-map/layers/tile-layer.js +48 -48
  170. package/dist/ol-map/layers/vector-layer.d.ts +4 -4
  171. package/dist/ol-map/layers/vector-layer.js +48 -48
  172. package/dist/ol-map/layers/vector-tile-layer.d.ts +10 -10
  173. package/dist/ol-map/layers/vector-tile-layer.js +66 -66
  174. package/dist/ol-map/map.css +17 -17
  175. package/dist/ol-map/map.d.ts +14 -14
  176. package/dist/ol-map/map.js +117 -117
  177. package/dist/ol-map/source/index.d.ts +6 -6
  178. package/dist/ol-map/source/index.js +18 -18
  179. package/dist/ol-map/source/mvt.d.ts +11 -11
  180. package/dist/ol-map/source/mvt.js +37 -37
  181. package/dist/ol-map/source/osm.d.ts +2 -2
  182. package/dist/ol-map/source/osm.js +14 -14
  183. package/dist/ol-map/source/vector-source.d.ts +4 -4
  184. package/dist/ol-map/source/vector-source.js +45 -45
  185. package/dist/ol-map/source/wms.d.ts +17 -17
  186. package/dist/ol-map/source/wms.js +30 -30
  187. package/dist/ol-map/source/wmts.d.ts +21 -21
  188. package/dist/ol-map/source/wmts.js +59 -59
  189. package/dist/ol-map/source/xyz.d.ts +12 -12
  190. package/dist/ol-map/source/xyz.js +27 -27
  191. package/dist/ol-map/style.d.ts +4 -4
  192. package/dist/ol-map/style.js +22 -22
  193. package/dist/popover/index.d.ts +1 -1
  194. package/dist/popover/index.js +5 -5
  195. package/dist/popover/popover.d.ts +3 -3
  196. package/dist/popover/popover.js +35 -35
  197. package/dist/smart-table/__mock-data__/smartTableMocks.d.ts +7 -7
  198. package/dist/smart-table/__mock-data__/smartTableMocks.js +17 -17
  199. package/dist/smart-table/index.d.ts +2 -2
  200. package/dist/smart-table/index.js +14 -14
  201. package/dist/smart-table/smart-table-head.d.ts +11 -11
  202. package/dist/smart-table/smart-table-head.js +22 -22
  203. package/dist/smart-table/smart-table-row.d.ts +12 -12
  204. package/dist/smart-table/smart-table-row.js +46 -46
  205. package/dist/smart-table/smart-table-types.d.ts +9 -9
  206. package/dist/smart-table/smart-table-types.js +2 -2
  207. package/dist/smart-table/smart-table.d.ts +17 -17
  208. package/dist/smart-table/smart-table.js +51 -51
  209. package/dist/theme/index.d.ts +1 -1
  210. package/dist/theme/index.js +13 -13
  211. package/dist/theme/theme.d.ts +8 -8
  212. package/dist/theme/theme.js +124 -124
  213. package/dist/utils/map.d.ts +3 -3
  214. package/dist/utils/map.js +21 -21
  215. package/dist/utils/projections.d.ts +6 -6
  216. package/dist/utils/projections.js +10 -10
  217. package/dist/utils/story.d.ts +12 -12
  218. package/dist/utils/story.js +2 -2
  219. package/jest_html_reporters.html +78 -0
  220. package/package.json +3 -3
  221. package/public/index.html +43 -43
  222. package/public/manifest.json +25 -25
  223. package/public/robots.txt +3 -3
  224. package/src/index.tsx +9 -9
  225. package/src/lib/autocomplete/autocomplete.css +25 -25
  226. package/src/lib/autocomplete/autocomplete.stories.tsx +101 -101
  227. package/src/lib/autocomplete/autocomplete.tsx +681 -681
  228. package/src/lib/autocomplete/index.ts +1 -1
  229. package/src/lib/box/box.tsx +7 -7
  230. package/src/lib/box/index.ts +1 -1
  231. package/src/lib/cesium-map/context-menu.stories.tsx +444 -444
  232. package/src/lib/cesium-map/data-sources/custom.data-source.tsx +12 -12
  233. package/src/lib/cesium-map/data-sources/drawings.data-source.stories.tsx +161 -161
  234. package/src/lib/cesium-map/data-sources/drawings.data-source.tsx +213 -204
  235. package/src/lib/cesium-map/data-sources/index.ts +2 -2
  236. package/src/lib/cesium-map/entities/entity.description.tsx +19 -19
  237. package/src/lib/cesium-map/entities/entity.graphics.stories.tsx +48 -48
  238. package/src/lib/cesium-map/entities/entity.stories.tsx +146 -146
  239. package/src/lib/cesium-map/entities/entity.tsx +10 -10
  240. package/src/lib/cesium-map/entities/graphics/polygon.graphics.tsx +12 -12
  241. package/src/lib/cesium-map/entities/graphics/polyline.graphics.tsx +12 -12
  242. package/src/lib/cesium-map/entities/graphics/rectangle.graphics.tsx +12 -12
  243. package/src/lib/cesium-map/entities/index.ts +4 -4
  244. package/src/lib/cesium-map/index.ts +8 -8
  245. package/src/lib/cesium-map/layers/3d.tileset.stories.tsx +164 -164
  246. package/src/lib/cesium-map/layers/3d.tileset.tsx +51 -51
  247. package/src/lib/cesium-map/layers/3d.tileset.with.update.tsx +120 -120
  248. package/src/lib/cesium-map/layers/geojson.layer.stories.tsx +180 -119
  249. package/src/lib/cesium-map/layers/geojson.layer.tsx +12 -12
  250. package/src/lib/cesium-map/layers/imagery.layer.stories.tsx +39 -39
  251. package/src/lib/cesium-map/layers/imagery.layer.tsx +37 -37
  252. package/src/lib/cesium-map/layers/index.ts +7 -7
  253. package/src/lib/cesium-map/layers/layers.rect.stories.tsx +171 -171
  254. package/src/lib/cesium-map/layers/osm.layer.stories.tsx +40 -40
  255. package/src/lib/cesium-map/layers/osm.layer.tsx +22 -22
  256. package/src/lib/cesium-map/layers/wms.layer.stories.tsx +38 -38
  257. package/src/lib/cesium-map/layers/wms.layer.tsx +22 -22
  258. package/src/lib/cesium-map/layers/wmts.layer.stories.tsx +53 -53
  259. package/src/lib/cesium-map/layers/wmts.layer.tsx +22 -22
  260. package/src/lib/cesium-map/layers/xyz.layer.stories.tsx +37 -37
  261. package/src/lib/cesium-map/layers/xyz.layer.tsx +22 -22
  262. package/src/lib/cesium-map/layers-manager.stories.tsx +286 -286
  263. package/src/lib/cesium-map/layers-manager.ts +354 -354
  264. package/src/lib/cesium-map/map-legend/MapLegend.css +136 -135
  265. package/src/lib/cesium-map/map-legend/MapLegend.tsx +92 -92
  266. package/src/lib/cesium-map/map-legend/MapLegendList.tsx +47 -47
  267. package/src/lib/cesium-map/map-legend/MapLegendSidebar.tsx +55 -55
  268. package/src/lib/cesium-map/map-legend/MapLegendToggle.tsx +31 -31
  269. package/src/lib/cesium-map/map-legend/index.tsx +3 -3
  270. package/src/lib/cesium-map/map-legend/legends-sidebar.stories.tsx +201 -201
  271. package/src/lib/cesium-map/map.css +59 -59
  272. package/src/lib/cesium-map/map.stories.tsx +143 -143
  273. package/src/lib/cesium-map/map.tsx +459 -446
  274. package/src/lib/cesium-map/map.types.ts +11 -11
  275. package/src/lib/cesium-map/proxied.types.ts +58 -54
  276. package/src/lib/cesium-map/settings/base-maps.css +37 -37
  277. package/src/lib/cesium-map/settings/base-maps.tsx +94 -94
  278. package/src/lib/cesium-map/settings/scene-modes.css +19 -19
  279. package/src/lib/cesium-map/settings/scene-modes.tsx +100 -100
  280. package/src/lib/cesium-map/settings/settings.css +52 -52
  281. package/src/lib/cesium-map/settings/settings.stories.tsx +182 -182
  282. package/src/lib/cesium-map/settings/settings.tsx +141 -141
  283. package/src/lib/cesium-map/terrain-providers/custom/dummy-quantized-mesh-tile.ts +243 -243
  284. package/src/lib/cesium-map/terrain-providers/custom/quantized-mesh-decoder.ts +321 -321
  285. package/src/lib/cesium-map/terrain-providers/custom/quantized-mesh-terrain-provider.ts +237 -237
  286. package/src/lib/cesium-map/terrain-providers/terrain-provider-heights-tool.stories.tsx +170 -170
  287. package/src/lib/cesium-map/terrain-providers/terrain-provider.stories.tsx +187 -187
  288. package/src/lib/cesium-map/tools/cesium/primitives-conversions.cesium.ts +15 -15
  289. package/src/lib/cesium-map/tools/coordinates-tracker.tool.css +11 -11
  290. package/src/lib/cesium-map/tools/coordinates-tracker.tool.tsx +81 -79
  291. package/src/lib/cesium-map/tools/draw/drawHelper.css +101 -101
  292. package/src/lib/cesium-map/tools/draw/drawHelper.ts +2116 -2116
  293. package/src/lib/cesium-map/tools/geojson/geojson-to-primitive.ts +54 -54
  294. package/src/lib/cesium-map/tools/geojson/index.ts +2 -2
  295. package/src/lib/cesium-map/tools/geojson/point.geojson.ts +63 -29
  296. package/src/lib/cesium-map/tools/geojson/polygon.geojson.ts +24 -24
  297. package/src/lib/cesium-map/tools/geojson/rectangle.geojson.ts +21 -21
  298. package/src/lib/cesium-map/tools/inspector.tool.tsx +15 -15
  299. package/src/lib/cesium-map/tools/scale-tracker.tool.css +16 -16
  300. package/src/lib/cesium-map/tools/scale-tracker.tool.tsx +192 -192
  301. package/src/lib/cesium-map/tools/terranian-height.tool.tsx +171 -171
  302. package/src/lib/cssbaseline/cssbaseline.tsx +19 -19
  303. package/src/lib/cssbaseline/index.ts +4 -4
  304. package/src/lib/date-picker/date-picker.css +9 -9
  305. package/src/lib/date-picker/date-picker.stories.tsx +130 -130
  306. package/src/lib/date-picker/date-picker.tsx +90 -90
  307. package/src/lib/date-picker/index.ts +1 -1
  308. package/src/lib/date-range-picker/date-range-picker.css +9 -9
  309. package/src/lib/date-range-picker/date-range-picker.form-control.css +3 -3
  310. package/src/lib/date-range-picker/date-range-picker.form-control.spec.tsx +58 -58
  311. package/src/lib/date-range-picker/date-range-picker.form-control.tsx +150 -150
  312. package/src/lib/date-range-picker/date-range-picker.stories.tsx +207 -207
  313. package/src/lib/date-range-picker/date-range-picker.tsx +156 -156
  314. package/src/lib/date-range-picker/index.ts +2 -2
  315. package/src/lib/file-picker/file-picker.css +63 -63
  316. package/src/lib/file-picker/file-picker.stories.tsx +447 -447
  317. package/src/lib/file-picker/file-picker.tsx +180 -180
  318. package/src/lib/file-picker/fs-map.json +1556 -1556
  319. package/src/lib/file-picker/index.ts +2 -2
  320. package/src/lib/file-picker/localization.ts +164 -164
  321. package/src/lib/index.ts +13 -13
  322. package/src/lib/map-filter-container/container-map.css +5 -5
  323. package/src/lib/map-filter-container/container-map.tsx +48 -48
  324. package/src/lib/map-filter-container/index.ts +1 -1
  325. package/src/lib/map-filter-container/map-filter-container.tsx +91 -91
  326. package/src/lib/map-filter-container/polygon-selection-ui.spec.tsx +119 -119
  327. package/src/lib/map-filter-container/polygon-selection-ui.tsx +111 -111
  328. package/src/lib/map-filter-container/stories/Map.stories.tsx +76 -76
  329. package/src/lib/models/defaults.ts +32 -32
  330. package/src/lib/models/enums.ts +16 -16
  331. package/src/lib/models/index.ts +1 -1
  332. package/src/lib/ol-map/feature.tsx +23 -23
  333. package/src/lib/ol-map/index.ts +6 -6
  334. package/src/lib/ol-map/interactions/draw.tsx +56 -56
  335. package/src/lib/ol-map/interactions/index.ts +1 -1
  336. package/src/lib/ol-map/layers/index.ts +3 -3
  337. package/src/lib/ol-map/layers/tile-layer.tsx +36 -36
  338. package/src/lib/ol-map/layers/vector-layer.tsx +32 -32
  339. package/src/lib/ol-map/layers/vector-tile-layer.tsx +56 -56
  340. package/src/lib/ol-map/map.css +17 -17
  341. package/src/lib/ol-map/map.tsx +137 -137
  342. package/src/lib/ol-map/source/index.ts +6 -6
  343. package/src/lib/ol-map/source/mvt.tsx +46 -46
  344. package/src/lib/ol-map/source/osm.tsx +13 -13
  345. package/src/lib/ol-map/source/stories/mvt.stories.tsx +68 -68
  346. package/src/lib/ol-map/source/stories/vector-source.stories.tsx +78 -78
  347. package/src/lib/ol-map/source/stories/wms.stories.tsx +51 -51
  348. package/src/lib/ol-map/source/stories/wmts.stories.tsx +72 -72
  349. package/src/lib/ol-map/source/stories/xyz.stories.tsx +53 -53
  350. package/src/lib/ol-map/source/vector-source.tsx +30 -30
  351. package/src/lib/ol-map/source/wms.tsx +40 -40
  352. package/src/lib/ol-map/source/wmts.tsx +82 -82
  353. package/src/lib/ol-map/source/xyz.tsx +33 -33
  354. package/src/lib/ol-map/stories/map.stories.tsx +60 -60
  355. package/src/lib/ol-map/style.ts +24 -24
  356. package/src/lib/popover/index.ts +1 -1
  357. package/src/lib/popover/popover.tsx +7 -7
  358. package/src/lib/smart-table/__mock-data__/smartTableMocks.ts +22 -22
  359. package/src/lib/smart-table/index.ts +2 -2
  360. package/src/lib/smart-table/smart-table-head.spec.tsx +116 -116
  361. package/src/lib/smart-table/smart-table-head.tsx +47 -47
  362. package/src/lib/smart-table/smart-table-row.spec.tsx +109 -109
  363. package/src/lib/smart-table/smart-table-row.tsx +78 -78
  364. package/src/lib/smart-table/smart-table-types.ts +10 -10
  365. package/src/lib/smart-table/smart-table.spec.tsx +116 -116
  366. package/src/lib/smart-table/smart-table.tsx +115 -115
  367. package/src/lib/smart-table/stories/SmartTable.stories.tsx +114 -114
  368. package/src/lib/theme/index.ts +1 -1
  369. package/src/lib/theme/theme.ts +123 -123
  370. package/src/lib/utils/map.ts +19 -19
  371. package/src/lib/utils/projections.ts +7 -7
  372. package/src/lib/utils/story.ts +11 -11
  373. package/src/react-app-env.d.ts +1 -1
  374. package/src/setupTests.ts +14 -14
  375. package/tsbuildconfig.json +37 -37
  376. package/tsconfig.json +26 -26
@@ -1,446 +1,459 @@
1
- import React, {
2
- createContext,
3
- useContext,
4
- useEffect,
5
- useState,
6
- useRef,
7
- useCallback,
8
- } from 'react';
9
- import { createPortal } from 'react-dom';
10
- import { Viewer, CesiumComponentRef } from 'resium';
11
- import { ViewerProps } from 'resium/dist/types/src/Viewer/Viewer';
12
- import {
13
- Viewer as CesiumViewerCls,
14
- Cartesian3,
15
- SceneMode,
16
- Cartesian2,
17
- Matrix4,
18
- PerspectiveFrustum,
19
- PerspectiveOffCenterFrustum,
20
- OrthographicFrustum,
21
- ScreenSpaceEventType,
22
- TerrainProvider,
23
- } from 'cesium';
24
- import { isNumber, isArray } from 'lodash';
25
- import { getAltitude, toDegrees } from '../utils/map';
26
- import { Box } from '../box';
27
- import { Proj } from '../utils/projections';
28
- import { CoordinatesTrackerTool } from './tools/coordinates-tracker.tool';
29
- import { ScaleTrackerTool } from './tools/scale-tracker.tool';
30
- import { CesiumSettings, IBaseMap, IBaseMaps } from './settings/settings';
31
- import { IMapLegend, MapLegendSidebar, MapLegendToggle } from './map-legend';
32
- import LayerManager, { LegendExtractor } from './layers-manager';
33
- import { CesiumSceneMode, CesiumSceneModeEnum } from './map.types';
34
-
35
- import './map.css';
36
-
37
- const DEFAULT_HEIGHT = 212;
38
- const DEFAULT_WIDTH = 260;
39
- const DEFAULT_DYNAMIC_HEIGHT_INCREMENT = 0;
40
-
41
- interface ICameraPosition {
42
- longitude: number;
43
- latitude: number;
44
- height: number | undefined;
45
- }
46
-
47
- interface ICameraState {
48
- position: ICameraPosition;
49
- direction?: Cartesian3;
50
- up?: Cartesian3;
51
- right?: Cartesian3;
52
- transform?: Matrix4;
53
- frustum?:
54
- | PerspectiveFrustum
55
- | PerspectiveOffCenterFrustum
56
- | OrthographicFrustum;
57
- }
58
- export class CesiumViewer extends CesiumViewerCls {
59
- public layersManager?: LayerManager;
60
-
61
- public constructor(
62
- container: string | Element,
63
- options?: CesiumViewerCls.ConstructorOptions
64
- ) {
65
- super(container, options);
66
- }
67
- }
68
-
69
- const mapContext = createContext<CesiumViewer | null>(null);
70
- const MapViewProvider = mapContext.Provider;
71
- const cameraPositionRefreshRate = 10000;
72
-
73
- export interface IContextMenuData {
74
- data: Record<string, unknown>[];
75
- position: {
76
- x: number;
77
- y: number;
78
- };
79
- style?: Record<string, string>;
80
- size?: {
81
- height: number;
82
- width: number;
83
- };
84
- handleClose: () => void;
85
- }
86
-
87
- interface ILegends {
88
- legendsList?: IMapLegend[];
89
- emptyText?: string;
90
- title?: string;
91
- actionsTexts?: { docText: string; imgText: string };
92
- mapLegendsExtractor?: LegendExtractor;
93
- }
94
-
95
- export interface CesiumMapProps extends ViewerProps {
96
- showMousePosition?: boolean;
97
- showScale?: boolean;
98
- projection?: Proj;
99
- center?: [number, number];
100
- zoom?: number;
101
- locale?: { [key: string]: string };
102
- sceneModes?: CesiumSceneModeEnum[];
103
- baseMaps?: IBaseMaps;
104
- terrainProvider?: TerrainProvider;
105
- imageryContextMenu?: React.ReactElement<IContextMenuData>;
106
- imageryContextMenuSize?: {
107
- height: number;
108
- width: number;
109
- dynamicHeightIncrement?: number;
110
- };
111
- legends?: ILegends;
112
- }
113
-
114
- export const useCesiumMap = (): CesiumViewer => {
115
- const mapViewer = useContext(mapContext);
116
-
117
- if (mapViewer === null) {
118
- throw new Error('map context is null, please check the provider');
119
- }
120
-
121
- return mapViewer;
122
- };
123
-
124
- export const CesiumMap: React.FC<CesiumMapProps> = (props) => {
125
- const ref = useRef<CesiumComponentRef<CesiumViewer>>(null);
126
- const [mapViewRef, setMapViewRef] = useState<CesiumViewer>();
127
- const [projection, setProjection] = useState<Proj>();
128
- const [showMousePosition, setShowMousePosition] = useState<boolean>();
129
- const [showScale, setShowScale] = useState<boolean>();
130
- const [locale, setLocale] = useState<{ [key: string]: string }>();
131
- const [cameraState, setCameraState] = useState<ICameraState | undefined>();
132
- const [sceneModes, setSceneModes] = useState<
133
- CesiumSceneModeEnum[] | undefined
134
- >();
135
- const [legendsList, setLegendsList] = useState<IMapLegend[]>([]);
136
- const [baseMaps, setBaseMaps] = useState<IBaseMaps | undefined>();
137
- const [showImageryMenu, setShowImageryMenu] = useState<boolean>(false);
138
- const [imageryMenuPosition, setImageryMenuPosition] = useState<
139
- Record<string, unknown> | undefined
140
- >(undefined);
141
- const [isLegendsSidebarOpen, setIsLegendsSidebarOpen] = useState<boolean>(
142
- false
143
- );
144
-
145
- const viewerProps = {
146
- fullscreenButton: true,
147
- timeline: false,
148
- animation: false,
149
- baseLayerPicker: false,
150
- geocoder: false,
151
- navigationHelpButton: false,
152
- homeButton: false,
153
- sceneModePicker: false,
154
- ...(props as ViewerProps),
155
- };
156
-
157
- const getImageryMenuStyle = (
158
- x: number,
159
- y: number,
160
- menuWidth: number,
161
- menuHeight: number,
162
- menuDynamicHeightIncrement: number
163
- ): Record<string, string> => {
164
- const container = (mapViewRef as CesiumViewer).container;
165
- const mapWidth = container.clientWidth;
166
- const mapHeight = container.clientHeight;
167
- const calculatedHeight = menuHeight + menuDynamicHeightIncrement;
168
- return {
169
- left: `${
170
- mapWidth - x < menuWidth ? x - (menuWidth - (mapWidth - x)) : x
171
- }px`,
172
- top: `${
173
- mapHeight - y < calculatedHeight
174
- ? y - (calculatedHeight - (mapHeight - y))
175
- : y
176
- }px`,
177
- };
178
- };
179
-
180
- useEffect(() => {
181
- if (ref.current) {
182
- const viewer = ref.current.cesiumElement as CesiumViewer;
183
-
184
- if (props.imageryContextMenu) {
185
- viewer.screenSpaceEventHandler.setInputAction(
186
- (evt: Record<string, unknown>) => {
187
- // console.log('RIGHT click', evt.position);
188
- setShowImageryMenu(false);
189
- setImageryMenuPosition(evt.position as Record<string, unknown>);
190
- setShowImageryMenu(true);
191
- },
192
- ScreenSpaceEventType.RIGHT_CLICK
193
- );
194
- }
195
- }
196
- setMapViewRef(ref.current?.cesiumElement);
197
- }, [ref, props.imageryContextMenu]);
198
-
199
- useEffect(() => {
200
- if (mapViewRef) {
201
- mapViewRef.layersManager = new LayerManager(
202
- mapViewRef,
203
- props.legends?.mapLegendsExtractor,
204
- () => {
205
- setLegendsList(
206
- mapViewRef?.layersManager?.legendsList as IMapLegend[]
207
- );
208
- }
209
- );
210
- }
211
- }, [mapViewRef]);
212
-
213
- useEffect(() => {
214
- setSceneModes(
215
- props.sceneModes ?? [
216
- CesiumSceneMode.SCENE2D,
217
- CesiumSceneMode.SCENE3D,
218
- CesiumSceneMode.COLUMBUS_VIEW,
219
- ]
220
- );
221
- }, [props.sceneModes]);
222
-
223
- useEffect(() => {
224
- setBaseMaps(props.baseMaps);
225
-
226
- const currentMap = props.baseMaps?.maps.find(
227
- (map: IBaseMap) => map.isCurrent
228
- );
229
- if (currentMap && mapViewRef) {
230
- mapViewRef.layersManager?.setBaseMapLayers(currentMap);
231
- }
232
- }, [props.baseMaps, mapViewRef]);
233
-
234
- useEffect(() => {
235
- setProjection(props.projection ?? Proj.WGS84);
236
- }, [props.projection]);
237
-
238
- useEffect(() => {
239
- setLocale(props.locale);
240
- }, [props.locale]);
241
-
242
- useEffect(() => {
243
- setShowMousePosition(props.showMousePosition ?? true);
244
- }, [props.showMousePosition]);
245
-
246
- useEffect(() => {
247
- setShowScale(props.showScale ?? true);
248
- }, [props.showScale]);
249
-
250
- useEffect(() => {
251
- const getCameraPosition = (): ICameraPosition => {
252
- if (mapViewRef === undefined) {
253
- return {
254
- longitude: 0,
255
- latitude: 0,
256
- height: 0,
257
- };
258
- }
259
-
260
- const getCameraPositionCartographic = (): ICameraPosition => {
261
- const camPos = mapViewRef.camera.positionCartographic;
262
- return {
263
- longitude: toDegrees(camPos.longitude),
264
- latitude: toDegrees(camPos.latitude),
265
- height: camPos.height,
266
- };
267
- };
268
-
269
- // https://stackoverflow.com/questions/33348761/get-center-in-cesium-map
270
- if (mapViewRef.scene.mode === SceneMode.SCENE3D) {
271
- const windowPosition = new Cartesian2(
272
- // eslint-disable-next-line @typescript-eslint/no-magic-numbers
273
- mapViewRef.container.clientWidth / 2,
274
- // eslint-disable-next-line @typescript-eslint/no-magic-numbers
275
- mapViewRef.container.clientHeight / 2
276
- );
277
- const pickRay = mapViewRef.scene.camera.getPickRay(windowPosition);
278
- const pickPosition = mapViewRef.scene.globe.pick(
279
- pickRay,
280
- mapViewRef.scene
281
- );
282
- const pickPositionCartographic = mapViewRef.scene.globe.ellipsoid.cartesianToCartographic(
283
- pickPosition as Cartesian3
284
- );
285
-
286
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
287
- return pickPositionCartographic !== undefined
288
- ? {
289
- longitude: toDegrees(pickPositionCartographic.longitude),
290
- latitude: toDegrees(pickPositionCartographic.latitude),
291
- height: mapViewRef.scene.camera.positionCartographic.height,
292
- }
293
- : getCameraPositionCartographic();
294
- } else {
295
- return getCameraPositionCartographic();
296
- }
297
- };
298
-
299
- const intervalHandle = setInterval(() => {
300
- if (mapViewRef && mapViewRef.scene.mode !== SceneMode.MORPHING) {
301
- const camera = mapViewRef.camera;
302
-
303
- const store: ICameraState = {
304
- position: getCameraPosition(),
305
- direction: camera.direction.clone(),
306
- up: camera.up.clone(),
307
- right: camera.right.clone(),
308
- transform: camera.transform.clone(),
309
- frustum: camera.frustum.clone(),
310
- };
311
- setCameraState(store);
312
- }
313
- }, cameraPositionRefreshRate);
314
-
315
- return (): void => {
316
- clearInterval(intervalHandle);
317
- };
318
- }, [mapViewRef]);
319
-
320
- useEffect(() => {
321
- const morphCompleteHandler = (): void => {
322
- if (mapViewRef && cameraState) {
323
- void mapViewRef.camera.flyTo({
324
- destination: Cartesian3.fromDegrees(
325
- cameraState.position.longitude,
326
- cameraState.position.latitude,
327
- cameraState.position.height
328
- ),
329
- duration: 0,
330
- });
331
- }
332
- };
333
- if (mapViewRef) {
334
- mapViewRef.scene.morphComplete.addEventListener(morphCompleteHandler);
335
- }
336
- return (): void => {
337
- if (mapViewRef) {
338
- mapViewRef.scene.morphComplete.removeEventListener(
339
- morphCompleteHandler
340
- );
341
- }
342
- };
343
- }, [mapViewRef, cameraState]);
344
-
345
- useEffect(() => {
346
- const zoom = props.zoom;
347
- const center = props.center;
348
- if (mapViewRef && isNumber(zoom) && isArray(center)) {
349
- void mapViewRef.camera.flyTo({
350
- destination: Cartesian3.fromDegrees(
351
- center[0],
352
- center[1],
353
- getAltitude(zoom)
354
- ),
355
- duration: 0,
356
- });
357
- }
358
- }, [props.zoom, props.center, mapViewRef]);
359
-
360
- const bindCustomToolsToViewer = useCallback((): JSX.Element | undefined => {
361
- return (
362
- mapViewRef &&
363
- createPortal(
364
- <>
365
- <Box className="sideToolsContainer">
366
- <CesiumSettings
367
- sceneModes={sceneModes as CesiumSceneModeEnum[]}
368
- baseMaps={baseMaps}
369
- locale={locale}
370
- />
371
- <MapLegendToggle
372
- onClick={(): void =>
373
- setIsLegendsSidebarOpen(!isLegendsSidebarOpen)
374
- }
375
- />
376
- </Box>
377
- <Box className="toolsContainer">
378
- {showMousePosition === true ? (
379
- <CoordinatesTrackerTool projection={projection} />
380
- ) : (
381
- <></>
382
- )}
383
- {showScale === true ? <ScaleTrackerTool locale={locale} /> : <></>}
384
- </Box>
385
- </>,
386
- document.querySelector('.cesium-viewer') as Element
387
- )
388
- );
389
- }, [
390
- baseMaps,
391
- locale,
392
- mapViewRef,
393
- projection,
394
- sceneModes,
395
- showMousePosition,
396
- showScale,
397
- isLegendsSidebarOpen,
398
- ]);
399
-
400
- return (
401
- <Viewer className="viewer" full ref={ref} {...viewerProps}>
402
- <MapViewProvider value={mapViewRef as CesiumViewer}>
403
- <MapLegendSidebar
404
- title={props.legends?.title}
405
- isOpen={isLegendsSidebarOpen}
406
- toggleSidebar={(): void =>
407
- setIsLegendsSidebarOpen(!isLegendsSidebarOpen)
408
- }
409
- noLegendsText={props.legends?.emptyText}
410
- legends={props.legends?.legendsList ?? legendsList}
411
- actionsTexts={props.legends?.actionsTexts}
412
- />
413
- {props.children}
414
- {bindCustomToolsToViewer()}
415
- {props.imageryContextMenu &&
416
- showImageryMenu &&
417
- imageryMenuPosition &&
418
- React.cloneElement(props.imageryContextMenu, {
419
- data: (mapViewRef?.layersManager?.findLayerByPOI(
420
- imageryMenuPosition.x as number,
421
- imageryMenuPosition.y as number
422
- ) as unknown) as Record<string, unknown>[],
423
- position: {
424
- x: imageryMenuPosition.x as number,
425
- y: imageryMenuPosition.y as number,
426
- },
427
- style: getImageryMenuStyle(
428
- imageryMenuPosition.x as number,
429
- imageryMenuPosition.y as number,
430
- props.imageryContextMenuSize?.width ?? DEFAULT_WIDTH,
431
- props.imageryContextMenuSize?.height ?? DEFAULT_HEIGHT,
432
- props.imageryContextMenuSize?.dynamicHeightIncrement ??
433
- DEFAULT_DYNAMIC_HEIGHT_INCREMENT
434
- ),
435
- size: props.imageryContextMenuSize ?? {
436
- height: DEFAULT_HEIGHT,
437
- width: DEFAULT_WIDTH,
438
- },
439
- handleClose: () => {
440
- setShowImageryMenu(!showImageryMenu);
441
- },
442
- })}
443
- </MapViewProvider>
444
- </Viewer>
445
- );
446
- };
1
+ import React, {
2
+ createContext,
3
+ useContext,
4
+ useEffect,
5
+ useState,
6
+ useRef,
7
+ useCallback,
8
+ } from 'react';
9
+ import { createPortal } from 'react-dom';
10
+ import { Viewer, CesiumComponentRef } from 'resium';
11
+ import { ViewerProps } from 'resium/dist/types/src/Viewer/Viewer';
12
+ import {
13
+ Viewer as CesiumViewerCls,
14
+ Cartesian3,
15
+ SceneMode,
16
+ Cartesian2,
17
+ Matrix4,
18
+ PerspectiveFrustum,
19
+ PerspectiveOffCenterFrustum,
20
+ OrthographicFrustum,
21
+ ScreenSpaceEventType,
22
+ TerrainProvider,
23
+ } from 'cesium';
24
+ import { isNumber, isArray } from 'lodash';
25
+ import { getAltitude, toDegrees } from '../utils/map';
26
+ import { Box } from '../box';
27
+ import { Proj } from '../utils/projections';
28
+ import { CoordinatesTrackerTool } from './tools/coordinates-tracker.tool';
29
+ import { ScaleTrackerTool } from './tools/scale-tracker.tool';
30
+ import { CesiumSettings, IBaseMap, IBaseMaps } from './settings/settings';
31
+ import { IMapLegend, MapLegendSidebar, MapLegendToggle } from './map-legend';
32
+ import LayerManager, { LegendExtractor } from './layers-manager';
33
+ import { CesiumSceneMode, CesiumSceneModeEnum } from './map.types';
34
+
35
+ import './map.css';
36
+ import { pointToLonLat } from './tools/geojson/point.geojson';
37
+
38
+ const DEFAULT_HEIGHT = 212;
39
+ const DEFAULT_WIDTH = 260;
40
+ const DEFAULT_DYNAMIC_HEIGHT_INCREMENT = 0;
41
+
42
+ interface ICameraPosition {
43
+ longitude: number;
44
+ latitude: number;
45
+ height: number | undefined;
46
+ }
47
+
48
+ interface ICameraState {
49
+ position: ICameraPosition;
50
+ direction?: Cartesian3;
51
+ up?: Cartesian3;
52
+ right?: Cartesian3;
53
+ transform?: Matrix4;
54
+ frustum?:
55
+ | PerspectiveFrustum
56
+ | PerspectiveOffCenterFrustum
57
+ | OrthographicFrustum;
58
+ }
59
+ export class CesiumViewer extends CesiumViewerCls {
60
+ public layersManager?: LayerManager;
61
+
62
+ public constructor(
63
+ container: string | Element,
64
+ options?: CesiumViewerCls.ConstructorOptions
65
+ ) {
66
+ super(container, options);
67
+ }
68
+ }
69
+
70
+ const mapContext = createContext<CesiumViewer | null>(null);
71
+ const MapViewProvider = mapContext.Provider;
72
+ const cameraPositionRefreshRate = 10000;
73
+
74
+ export interface IContextMenuData {
75
+ data: Record<string, unknown>[];
76
+ position: {
77
+ x: number;
78
+ y: number;
79
+ };
80
+ coordinates: { latitude: number; longitude: number };
81
+ style?: Record<string, string>;
82
+ size?: {
83
+ height: number;
84
+ width: number;
85
+ };
86
+ handleClose: () => void;
87
+ }
88
+
89
+ interface ILegends {
90
+ legendsList?: IMapLegend[];
91
+ emptyText?: string;
92
+ title?: string;
93
+ actionsTexts?: { docText: string; imgText: string };
94
+ mapLegendsExtractor?: LegendExtractor;
95
+ }
96
+
97
+ export interface CesiumMapProps extends ViewerProps {
98
+ showMousePosition?: boolean;
99
+ showScale?: boolean;
100
+ projection?: Proj;
101
+ center?: [number, number];
102
+ zoom?: number;
103
+ locale?: { [key: string]: string };
104
+ sceneModes?: CesiumSceneModeEnum[];
105
+ baseMaps?: IBaseMaps;
106
+ terrainProvider?: TerrainProvider;
107
+ imageryContextMenu?: React.ReactElement<IContextMenuData>;
108
+ imageryContextMenuSize?: {
109
+ height: number;
110
+ width: number;
111
+ dynamicHeightIncrement?: number;
112
+ };
113
+ legends?: ILegends;
114
+ }
115
+
116
+ export const useCesiumMap = (): CesiumViewer => {
117
+ const mapViewer = useContext(mapContext);
118
+
119
+ if (mapViewer === null) {
120
+ throw new Error('map context is null, please check the provider');
121
+ }
122
+
123
+ return mapViewer;
124
+ };
125
+
126
+ export const CesiumMap: React.FC<CesiumMapProps> = (props) => {
127
+ const ref = useRef<CesiumComponentRef<CesiumViewer>>(null);
128
+ const [mapViewRef, setMapViewRef] = useState<CesiumViewer>();
129
+ const [projection, setProjection] = useState<Proj>();
130
+ const [showMousePosition, setShowMousePosition] = useState<boolean>();
131
+ const [showScale, setShowScale] = useState<boolean>();
132
+ const [locale, setLocale] = useState<{ [key: string]: string }>();
133
+ const [cameraState, setCameraState] = useState<ICameraState | undefined>();
134
+ const [sceneModes, setSceneModes] = useState<
135
+ CesiumSceneModeEnum[] | undefined
136
+ >();
137
+ const [legendsList, setLegendsList] = useState<IMapLegend[]>([]);
138
+ const [baseMaps, setBaseMaps] = useState<IBaseMaps | undefined>();
139
+ const [showImageryMenu, setShowImageryMenu] = useState<boolean>(false);
140
+ const [imageryMenuPosition, setImageryMenuPosition] = useState<
141
+ Record<string, unknown> | undefined
142
+ >(undefined);
143
+ const [isLegendsSidebarOpen, setIsLegendsSidebarOpen] = useState<boolean>(
144
+ false
145
+ );
146
+ const [rightClickCoordinates, setRightClickCoordinates] = useState<{
147
+ longitude: number;
148
+ latitude: number;
149
+ }>();
150
+
151
+ const viewerProps = {
152
+ fullscreenButton: true,
153
+ timeline: false,
154
+ animation: false,
155
+ baseLayerPicker: false,
156
+ geocoder: false,
157
+ navigationHelpButton: false,
158
+ homeButton: false,
159
+ sceneModePicker: false,
160
+ ...(props as ViewerProps),
161
+ };
162
+
163
+ const getImageryMenuStyle = (
164
+ x: number,
165
+ y: number,
166
+ menuWidth: number,
167
+ menuHeight: number,
168
+ menuDynamicHeightIncrement: number
169
+ ): Record<string, string> => {
170
+ const container = (mapViewRef as CesiumViewer).container;
171
+ const mapWidth = container.clientWidth;
172
+ const mapHeight = container.clientHeight;
173
+ const calculatedHeight = menuHeight + menuDynamicHeightIncrement;
174
+ return {
175
+ left: `${
176
+ mapWidth - x < menuWidth ? x - (menuWidth - (mapWidth - x)) : x
177
+ }px`,
178
+ top: `${
179
+ mapHeight - y < calculatedHeight
180
+ ? y - (calculatedHeight - (mapHeight - y))
181
+ : y
182
+ }px`,
183
+ };
184
+ };
185
+
186
+ useEffect(() => {
187
+ if (ref.current) {
188
+ const viewer = ref.current.cesiumElement as CesiumViewer;
189
+
190
+ if (props.imageryContextMenu) {
191
+ viewer.screenSpaceEventHandler.setInputAction(
192
+ (evt: Record<string, unknown>) => {
193
+ // console.log('RIGHT click', evt.position);
194
+ const pos = evt.position as Record<string, unknown>;
195
+
196
+ setShowImageryMenu(false);
197
+ setImageryMenuPosition(pos);
198
+ setRightClickCoordinates(
199
+ pointToLonLat(viewer, pos.x as number, pos.y as number)
200
+ );
201
+ setShowImageryMenu(true);
202
+ },
203
+ ScreenSpaceEventType.RIGHT_CLICK
204
+ );
205
+ }
206
+ }
207
+ setMapViewRef(ref.current?.cesiumElement);
208
+ }, [ref, props.imageryContextMenu]);
209
+
210
+ useEffect(() => {
211
+ if (mapViewRef) {
212
+ mapViewRef.layersManager = new LayerManager(
213
+ mapViewRef,
214
+ props.legends?.mapLegendsExtractor,
215
+ () => {
216
+ setLegendsList(
217
+ mapViewRef?.layersManager?.legendsList as IMapLegend[]
218
+ );
219
+ }
220
+ );
221
+ }
222
+ }, [mapViewRef]);
223
+
224
+ useEffect(() => {
225
+ setSceneModes(
226
+ props.sceneModes ?? [
227
+ CesiumSceneMode.SCENE2D,
228
+ CesiumSceneMode.SCENE3D,
229
+ CesiumSceneMode.COLUMBUS_VIEW,
230
+ ]
231
+ );
232
+ }, [props.sceneModes]);
233
+
234
+ useEffect(() => {
235
+ setBaseMaps(props.baseMaps);
236
+
237
+ const currentMap = props.baseMaps?.maps.find(
238
+ (map: IBaseMap) => map.isCurrent
239
+ );
240
+ if (currentMap && mapViewRef) {
241
+ mapViewRef.layersManager?.setBaseMapLayers(currentMap);
242
+ }
243
+ }, [props.baseMaps, mapViewRef]);
244
+
245
+ useEffect(() => {
246
+ setProjection(props.projection ?? Proj.WGS84);
247
+ }, [props.projection]);
248
+
249
+ useEffect(() => {
250
+ setLocale(props.locale);
251
+ }, [props.locale]);
252
+
253
+ useEffect(() => {
254
+ setShowMousePosition(props.showMousePosition ?? true);
255
+ }, [props.showMousePosition]);
256
+
257
+ useEffect(() => {
258
+ setShowScale(props.showScale ?? true);
259
+ }, [props.showScale]);
260
+
261
+ useEffect(() => {
262
+ const getCameraPosition = (): ICameraPosition => {
263
+ if (mapViewRef === undefined) {
264
+ return {
265
+ longitude: 0,
266
+ latitude: 0,
267
+ height: 0,
268
+ };
269
+ }
270
+
271
+ const getCameraPositionCartographic = (): ICameraPosition => {
272
+ const camPos = mapViewRef.camera.positionCartographic;
273
+ return {
274
+ longitude: toDegrees(camPos.longitude),
275
+ latitude: toDegrees(camPos.latitude),
276
+ height: camPos.height,
277
+ };
278
+ };
279
+
280
+ // https://stackoverflow.com/questions/33348761/get-center-in-cesium-map
281
+ if (mapViewRef.scene.mode === SceneMode.SCENE3D) {
282
+ const windowPosition = new Cartesian2(
283
+ // eslint-disable-next-line @typescript-eslint/no-magic-numbers
284
+ mapViewRef.container.clientWidth / 2,
285
+ // eslint-disable-next-line @typescript-eslint/no-magic-numbers
286
+ mapViewRef.container.clientHeight / 2
287
+ );
288
+ const pickRay = mapViewRef.scene.camera.getPickRay(windowPosition);
289
+ const pickPosition = mapViewRef.scene.globe.pick(
290
+ pickRay,
291
+ mapViewRef.scene
292
+ );
293
+ const pickPositionCartographic = mapViewRef.scene.globe.ellipsoid.cartesianToCartographic(
294
+ pickPosition as Cartesian3
295
+ );
296
+
297
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
298
+ return pickPositionCartographic !== undefined
299
+ ? {
300
+ longitude: toDegrees(pickPositionCartographic.longitude),
301
+ latitude: toDegrees(pickPositionCartographic.latitude),
302
+ height: mapViewRef.scene.camera.positionCartographic.height,
303
+ }
304
+ : getCameraPositionCartographic();
305
+ } else {
306
+ return getCameraPositionCartographic();
307
+ }
308
+ };
309
+
310
+ const intervalHandle = setInterval(() => {
311
+ if (mapViewRef && mapViewRef.scene.mode !== SceneMode.MORPHING) {
312
+ const camera = mapViewRef.camera;
313
+
314
+ const store: ICameraState = {
315
+ position: getCameraPosition(),
316
+ direction: camera.direction.clone(),
317
+ up: camera.up.clone(),
318
+ right: camera.right.clone(),
319
+ transform: camera.transform.clone(),
320
+ frustum: camera.frustum.clone(),
321
+ };
322
+ setCameraState(store);
323
+ }
324
+ }, cameraPositionRefreshRate);
325
+
326
+ return (): void => {
327
+ clearInterval(intervalHandle);
328
+ };
329
+ }, [mapViewRef]);
330
+
331
+ useEffect(() => {
332
+ const morphCompleteHandler = (): void => {
333
+ if (mapViewRef && cameraState) {
334
+ void mapViewRef.camera.flyTo({
335
+ destination: Cartesian3.fromDegrees(
336
+ cameraState.position.longitude,
337
+ cameraState.position.latitude,
338
+ cameraState.position.height
339
+ ),
340
+ duration: 0,
341
+ });
342
+ }
343
+ };
344
+ if (mapViewRef) {
345
+ mapViewRef.scene.morphComplete.addEventListener(morphCompleteHandler);
346
+ }
347
+ return (): void => {
348
+ if (mapViewRef) {
349
+ mapViewRef.scene.morphComplete.removeEventListener(
350
+ morphCompleteHandler
351
+ );
352
+ }
353
+ };
354
+ }, [mapViewRef, cameraState]);
355
+
356
+ useEffect(() => {
357
+ const zoom = props.zoom;
358
+ const center = props.center;
359
+ if (mapViewRef && isNumber(zoom) && isArray(center)) {
360
+ void mapViewRef.camera.flyTo({
361
+ destination: Cartesian3.fromDegrees(
362
+ center[0],
363
+ center[1],
364
+ getAltitude(zoom)
365
+ ),
366
+ duration: 0,
367
+ });
368
+ }
369
+ }, [props.zoom, props.center, mapViewRef]);
370
+
371
+ const bindCustomToolsToViewer = useCallback((): JSX.Element | undefined => {
372
+ return (
373
+ mapViewRef &&
374
+ createPortal(
375
+ <>
376
+ <Box className="sideToolsContainer">
377
+ <CesiumSettings
378
+ sceneModes={sceneModes as CesiumSceneModeEnum[]}
379
+ baseMaps={baseMaps}
380
+ locale={locale}
381
+ />
382
+ <MapLegendToggle
383
+ onClick={(): void =>
384
+ setIsLegendsSidebarOpen(!isLegendsSidebarOpen)
385
+ }
386
+ />
387
+ </Box>
388
+ <Box className="toolsContainer">
389
+ {showMousePosition === true ? (
390
+ <CoordinatesTrackerTool projection={projection} />
391
+ ) : (
392
+ <></>
393
+ )}
394
+ {showScale === true ? <ScaleTrackerTool locale={locale} /> : <></>}
395
+ </Box>
396
+ </>,
397
+ document.querySelector('.cesium-viewer') as Element
398
+ )
399
+ );
400
+ }, [
401
+ baseMaps,
402
+ locale,
403
+ mapViewRef,
404
+ projection,
405
+ sceneModes,
406
+ showMousePosition,
407
+ showScale,
408
+ isLegendsSidebarOpen,
409
+ ]);
410
+
411
+ return (
412
+ <Viewer className="viewer" full ref={ref} {...viewerProps}>
413
+ <MapViewProvider value={mapViewRef as CesiumViewer}>
414
+ <MapLegendSidebar
415
+ title={props.legends?.title}
416
+ isOpen={isLegendsSidebarOpen}
417
+ toggleSidebar={(): void =>
418
+ setIsLegendsSidebarOpen(!isLegendsSidebarOpen)
419
+ }
420
+ noLegendsText={props.legends?.emptyText}
421
+ legends={props.legends?.legendsList ?? legendsList}
422
+ actionsTexts={props.legends?.actionsTexts}
423
+ />
424
+ {props.children}
425
+ {bindCustomToolsToViewer()}
426
+ {props.imageryContextMenu &&
427
+ showImageryMenu &&
428
+ imageryMenuPosition &&
429
+ rightClickCoordinates &&
430
+ React.cloneElement(props.imageryContextMenu, {
431
+ data: (mapViewRef?.layersManager?.findLayerByPOI(
432
+ imageryMenuPosition.x as number,
433
+ imageryMenuPosition.y as number
434
+ ) as unknown) as Record<string, unknown>[],
435
+ position: {
436
+ x: imageryMenuPosition.x as number,
437
+ y: imageryMenuPosition.y as number,
438
+ },
439
+ coordinates: rightClickCoordinates,
440
+ style: getImageryMenuStyle(
441
+ imageryMenuPosition.x as number,
442
+ imageryMenuPosition.y as number,
443
+ props.imageryContextMenuSize?.width ?? DEFAULT_WIDTH,
444
+ props.imageryContextMenuSize?.height ?? DEFAULT_HEIGHT,
445
+ props.imageryContextMenuSize?.dynamicHeightIncrement ??
446
+ DEFAULT_DYNAMIC_HEIGHT_INCREMENT
447
+ ),
448
+ size: props.imageryContextMenuSize ?? {
449
+ height: DEFAULT_HEIGHT,
450
+ width: DEFAULT_WIDTH,
451
+ },
452
+ handleClose: () => {
453
+ setShowImageryMenu(!showImageryMenu);
454
+ },
455
+ })}
456
+ </MapViewProvider>
457
+ </Viewer>
458
+ );
459
+ };