@carto/kepler.gl 0.0.76 → 0.0.78-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 (1300) hide show
  1. package/README.md +652 -42
  2. package/dist/actions/action-wrapper.js +49 -21
  3. package/dist/actions/actions.js +30 -16
  4. package/dist/actions/identity-actions.js +28 -14
  5. package/dist/actions/index.js +24 -7
  6. package/dist/actions/map-state-actions.js +27 -12
  7. package/dist/actions/map-style-actions.js +69 -31
  8. package/dist/actions/provider-actions.js +81 -44
  9. package/dist/actions/ui-state-actions.js +166 -71
  10. package/dist/actions/vis-state-actions.js +78 -106
  11. package/dist/cloud-providers/index.js +8 -8
  12. package/dist/cloud-providers/provider.js +109 -63
  13. package/dist/components/bottom-widget.js +58 -53
  14. package/dist/components/common/action-panel.js +41 -44
  15. package/dist/components/common/animation-control/animation-control.js +44 -44
  16. package/dist/components/common/animation-control/animation-controller.js +109 -55
  17. package/dist/components/common/animation-control/animation-speed-slider.js +38 -29
  18. package/dist/components/common/animation-control/floating-time-display.js +73 -58
  19. package/dist/components/common/animation-control/playback-controls.js +81 -67
  20. package/dist/components/common/animation-control/speed-control.js +24 -26
  21. package/dist/components/common/checkbox.js +54 -49
  22. package/dist/components/common/color-legend.js +71 -51
  23. package/dist/components/common/data-table/button.js +23 -30
  24. package/dist/components/common/data-table/canvas.js +10 -21
  25. package/dist/components/common/data-table/cell-size.js +58 -54
  26. package/dist/components/common/data-table/grid.js +51 -35
  27. package/dist/components/common/data-table/index.js +150 -109
  28. package/dist/components/common/data-table/option-dropdown.js +33 -29
  29. package/dist/components/common/dataset-label.js +15 -23
  30. package/dist/components/common/error-boundary.js +30 -25
  31. package/dist/components/common/field-selector.js +67 -67
  32. package/dist/components/common/field-token.js +17 -22
  33. package/dist/components/common/file-uploader/file-drop.js +66 -46
  34. package/dist/components/common/file-uploader/file-upload-progress.js +32 -33
  35. package/dist/components/common/file-uploader/file-upload.js +91 -52
  36. package/dist/components/common/file-uploader/upload-button.js +56 -82
  37. package/dist/components/common/histogram-plot.js +37 -35
  38. package/dist/components/common/icons/add.js +26 -32
  39. package/dist/components/common/icons/anchor_window.js +8 -8
  40. package/dist/components/common/icons/arrow-down-alt.js +26 -32
  41. package/dist/components/common/icons/arrow-down-solid.js +58 -0
  42. package/dist/components/common/icons/arrow-down.js +26 -32
  43. package/dist/components/common/icons/arrow-left.js +26 -32
  44. package/dist/components/common/icons/arrow-right.js +26 -32
  45. package/dist/components/common/icons/arrow-up-alt.js +26 -32
  46. package/dist/components/common/icons/arrow-up-solid.js +26 -32
  47. package/dist/components/common/icons/arrow-up.js +26 -32
  48. package/dist/components/common/icons/base.js +42 -52
  49. package/dist/components/common/icons/bug.js +26 -32
  50. package/dist/components/common/icons/cancel.js +26 -32
  51. package/dist/components/common/icons/checkmark.js +27 -32
  52. package/dist/components/common/icons/chevron-right.js +27 -27
  53. package/dist/components/common/icons/clipboard.js +26 -32
  54. package/dist/components/common/icons/clock.js +26 -32
  55. package/dist/components/common/icons/close.js +26 -32
  56. package/dist/components/common/icons/code-alt.js +27 -32
  57. package/dist/components/common/icons/copy.js +27 -32
  58. package/dist/components/common/icons/crosshairs.js +27 -32
  59. package/dist/components/common/icons/cube-3d.js +26 -32
  60. package/dist/components/common/icons/cursor-click.js +26 -32
  61. package/dist/components/common/icons/data-table.js +26 -32
  62. package/dist/components/common/icons/db.js +26 -32
  63. package/dist/components/common/icons/delete.js +26 -31
  64. package/dist/components/common/icons/docs.js +26 -32
  65. package/dist/components/common/icons/drag-n-drop.js +26 -32
  66. package/dist/components/common/icons/draw-polygon.js +26 -35
  67. package/dist/components/common/icons/email.js +26 -32
  68. package/dist/components/common/icons/expand.js +26 -32
  69. package/dist/components/common/icons/eye-seen.js +26 -32
  70. package/dist/components/common/icons/eye-unseen.js +26 -32
  71. package/dist/components/common/icons/file-type.js +16 -23
  72. package/dist/components/common/icons/file.js +26 -32
  73. package/dist/components/common/icons/files.js +25 -29
  74. package/dist/components/common/icons/filter-funnel.js +26 -32
  75. package/dist/components/common/icons/free-window.js +8 -8
  76. package/dist/components/common/icons/gear.js +26 -32
  77. package/dist/components/common/icons/hash.js +26 -32
  78. package/dist/components/common/icons/histogram.js +24 -28
  79. package/dist/components/common/icons/index.js +154 -63
  80. package/dist/components/common/icons/info.js +27 -32
  81. package/dist/components/common/icons/layers.js +26 -32
  82. package/dist/components/common/icons/left-arrow.js +27 -32
  83. package/dist/components/common/icons/legend.js +26 -32
  84. package/dist/components/common/icons/line-chart.js +26 -31
  85. package/dist/components/common/icons/login.js +26 -31
  86. package/dist/components/common/icons/logout.js +26 -31
  87. package/dist/components/common/icons/map-icon.js +27 -33
  88. package/dist/components/common/icons/map.js +27 -33
  89. package/dist/components/common/icons/messages.js +26 -32
  90. package/dist/components/common/icons/minus.js +26 -32
  91. package/dist/components/common/icons/order-by-dataset.js +56 -0
  92. package/dist/components/common/icons/order-by-list.js +48 -0
  93. package/dist/components/common/icons/pause.js +26 -32
  94. package/dist/components/common/icons/picture.js +25 -29
  95. package/dist/components/common/icons/pin.js +35 -33
  96. package/dist/components/common/icons/play.js +26 -32
  97. package/dist/components/common/icons/polygon.js +26 -35
  98. package/dist/components/common/icons/rectangle.js +26 -35
  99. package/dist/components/common/icons/reduce.js +26 -32
  100. package/dist/components/common/icons/reset.js +26 -32
  101. package/dist/components/common/icons/rocket.js +26 -32
  102. package/dist/components/common/icons/save.js +26 -32
  103. package/dist/components/common/icons/save2.js +26 -32
  104. package/dist/components/common/icons/search.js +26 -32
  105. package/dist/components/common/icons/settings.js +26 -32
  106. package/dist/components/common/icons/share.js +26 -32
  107. package/dist/components/common/icons/split.js +26 -32
  108. package/dist/components/common/icons/square-select.js +26 -32
  109. package/dist/components/common/icons/swap-horizontal.js +28 -27
  110. package/dist/components/common/icons/table.js +26 -31
  111. package/dist/components/common/icons/trash.js +26 -32
  112. package/dist/components/common/icons/upload.js +26 -33
  113. package/dist/components/common/icons/vert-dots.js +26 -32
  114. package/dist/components/common/icons/vert-three-dots.js +26 -32
  115. package/dist/components/common/icons/warning.js +27 -32
  116. package/dist/components/common/image-preview.js +27 -35
  117. package/dist/components/common/info-helper.js +23 -32
  118. package/dist/components/common/item-selector/accessor.js +5 -3
  119. package/dist/components/common/item-selector/chickleted-input.js +42 -62
  120. package/dist/components/common/item-selector/dropdown-list.js +95 -72
  121. package/dist/components/common/item-selector/item-selector-submenu.js +38 -29
  122. package/dist/components/common/item-selector/item-selector.js +102 -89
  123. package/dist/components/common/item-selector/typeahead.js +118 -86
  124. package/dist/components/common/line-chart.js +44 -46
  125. package/dist/components/common/loading-spinner.js +23 -33
  126. package/dist/components/common/logo.js +24 -36
  127. package/dist/components/common/map-layer-selector.js +14 -22
  128. package/dist/components/common/modal.js +62 -50
  129. package/dist/components/common/portaled.js +109 -64
  130. package/dist/components/common/progress-bar.js +17 -28
  131. package/dist/components/common/range-brush.js +132 -84
  132. package/dist/components/common/range-plot.js +51 -60
  133. package/dist/components/common/range-slider.js +88 -76
  134. package/dist/components/common/slider/mouse-event.js +88 -52
  135. package/dist/components/common/slider/slider-bar-handle.js +40 -39
  136. package/dist/components/common/slider/slider-handle.js +49 -45
  137. package/dist/components/common/slider/slider.js +107 -104
  138. package/dist/components/common/styled-components.js +183 -69
  139. package/dist/components/common/switch.js +14 -37
  140. package/dist/components/common/time-range-slider-time-title.js +19 -24
  141. package/dist/components/common/time-range-slider.js +39 -61
  142. package/dist/components/common/time-slider-marker.js +41 -36
  143. package/dist/components/common/tippy-tooltip.js +115 -0
  144. package/dist/components/common/toolbar-item.js +23 -25
  145. package/dist/components/common/toolbar.js +10 -21
  146. package/dist/components/common/vertical-toolbar.js +10 -21
  147. package/dist/components/container.js +94 -66
  148. package/dist/components/context.js +10 -6
  149. package/dist/components/editor/constants.js +8 -6
  150. package/dist/components/editor/editor.js +77 -62
  151. package/dist/components/editor/feature-action-panel.js +50 -47
  152. package/dist/components/editor/feature-styles.js +42 -37
  153. package/dist/components/editor/handle-style.js +39 -37
  154. package/dist/components/filters/components.js +10 -21
  155. package/dist/components/filters/filter-panels/filter-panel-with-field-select.js +27 -19
  156. package/dist/components/filters/filter-panels/multi-select-filter-panel.js +18 -18
  157. package/dist/components/filters/filter-panels/new-filter-panel.js +23 -19
  158. package/dist/components/filters/filter-panels/polygon-filter-panel.js +28 -21
  159. package/dist/components/filters/filter-panels/range-filter-panel.js +18 -18
  160. package/dist/components/filters/filter-panels/single-select-filter-panel.js +18 -18
  161. package/dist/components/filters/filter-panels/time-range-filter-panel.js +24 -19
  162. package/dist/components/filters/filter-panels/types.js +6 -0
  163. package/dist/components/filters/index.js +17 -11
  164. package/dist/components/filters/multi-select-filter.js +9 -3
  165. package/dist/components/filters/polygon-filter.js +19 -10
  166. package/dist/components/filters/range-filter.js +9 -4
  167. package/dist/components/filters/single-select-filter.js +9 -3
  168. package/dist/components/filters/time-range-filter.js +18 -7
  169. package/dist/components/filters/time-widget.js +51 -42
  170. package/dist/components/filters/types.js +6 -0
  171. package/dist/components/geocoder/geocoder.js +134 -100
  172. package/dist/components/geocoder-panel.js +79 -57
  173. package/dist/components/index.js +591 -356
  174. package/dist/components/injector.js +58 -42
  175. package/dist/components/kepler-gl.js +171 -91
  176. package/dist/components/map/coordinate-info.js +13 -4
  177. package/dist/components/map/layer-hover-info.js +46 -39
  178. package/dist/components/map/layer-selector-panel.js +30 -17
  179. package/dist/components/map/locale-panel.js +43 -23
  180. package/dist/components/map/map-control-panel.js +43 -30
  181. package/dist/components/map/map-control-toolbar.js +11 -21
  182. package/dist/components/map/map-control-tooltip.js +13 -6
  183. package/dist/components/map/map-control.js +28 -27
  184. package/dist/components/map/map-draw-panel.js +48 -23
  185. package/dist/components/map/map-legend-panel.js +138 -77
  186. package/dist/components/map/map-legend.js +82 -55
  187. package/dist/components/map/map-popover.js +58 -42
  188. package/dist/components/map/split-map-button.js +40 -25
  189. package/dist/components/map/toggle-3d-button.js +37 -22
  190. package/dist/components/map-container.js +164 -147
  191. package/dist/components/maps-layout.js +29 -25
  192. package/dist/components/modal-container.js +116 -91
  193. package/dist/components/modals/add-map-style-modal.js +66 -49
  194. package/dist/components/modals/cloud-tile.js +36 -36
  195. package/dist/components/modals/data-table-modal.js +96 -60
  196. package/dist/components/modals/delete-data-modal.js +20 -24
  197. package/dist/components/modals/error-display.js +10 -3
  198. package/dist/components/modals/export-data-modal.js +59 -57
  199. package/dist/components/modals/export-image-modal.js +28 -31
  200. package/dist/components/modals/export-map-modal/components.js +27 -27
  201. package/dist/components/modals/export-map-modal/export-html-map.js +27 -28
  202. package/dist/components/modals/export-map-modal/export-json-map.js +43 -30
  203. package/dist/components/modals/export-map-modal/export-map-modal.js +41 -34
  204. package/dist/components/modals/image-modal-container.js +19 -14
  205. package/dist/components/modals/load-data-modal.js +35 -31
  206. package/dist/components/modals/load-storage-map.js +79 -44
  207. package/dist/components/modals/loading-dialog.js +18 -24
  208. package/dist/components/modals/modal-dialog.js +7 -3
  209. package/dist/components/modals/modal-tabs.js +29 -29
  210. package/dist/components/modals/overwrite-map-modal.js +28 -29
  211. package/dist/components/modals/provider-modal-container.js +32 -35
  212. package/dist/components/modals/save-map-modal.js +51 -47
  213. package/dist/components/modals/share-map-modal.js +63 -55
  214. package/dist/components/modals/status-panel.js +25 -24
  215. package/dist/components/modals/storage-map-viewer.js +43 -38
  216. package/dist/components/notification-panel/notification-item.js +46 -41
  217. package/dist/components/notification-panel.js +32 -35
  218. package/dist/components/performance.js +36 -11
  219. package/dist/components/plot-container.js +76 -60
  220. package/dist/components/side-panel/cloud-storage-dropdown.js +10 -4
  221. package/dist/components/side-panel/common/dataset-info.js +13 -20
  222. package/dist/components/side-panel/common/dataset-tag.js +49 -31
  223. package/dist/components/side-panel/common/dataset-title.js +91 -44
  224. package/dist/components/side-panel/common/source-data-catalog.js +26 -28
  225. package/dist/components/side-panel/common/source-data-selector.js +51 -37
  226. package/dist/components/side-panel/common/types.js +6 -0
  227. package/dist/components/side-panel/custom-panel.js +9 -5
  228. package/dist/components/side-panel/filter-manager.js +32 -30
  229. package/dist/components/side-panel/filter-panel/filter-panel-header.js +29 -32
  230. package/dist/components/side-panel/filter-panel/filter-panel.js +58 -53
  231. package/dist/components/side-panel/interaction-manager.js +12 -5
  232. package/dist/components/side-panel/interaction-panel/brush-config.js +19 -23
  233. package/dist/components/side-panel/interaction-panel/interaction-panel.js +58 -41
  234. package/dist/components/side-panel/interaction-panel/tooltip-config/tooltip-chicklet.js +83 -47
  235. package/dist/components/side-panel/interaction-panel/tooltip-config.js +46 -30
  236. package/dist/components/side-panel/layer-manager.js +132 -211
  237. package/dist/components/side-panel/layer-panel/add-layer-button.js +156 -0
  238. package/dist/components/side-panel/layer-panel/color-dimension-scale-selector.js +11 -4
  239. package/dist/components/side-panel/layer-panel/color-palette.js +29 -41
  240. package/dist/components/side-panel/layer-panel/color-range-selector.js +164 -162
  241. package/dist/components/side-panel/layer-panel/color-selector.js +71 -60
  242. package/dist/components/side-panel/layer-panel/column-selector.js +27 -28
  243. package/dist/components/side-panel/layer-panel/custom-markers-config-group.js +7 -3
  244. package/dist/components/side-panel/layer-panel/custom-palette.js +72 -48
  245. package/dist/components/side-panel/layer-panel/custom-picker.js +41 -40
  246. package/dist/components/side-panel/layer-panel/dataset-layer-group.js +87 -0
  247. package/dist/components/side-panel/layer-panel/dataset-layer-section.js +69 -0
  248. package/dist/components/side-panel/layer-panel/dataset-section.js +91 -0
  249. package/dist/components/side-panel/layer-panel/dimension-scale-selector.js +16 -8
  250. package/dist/components/side-panel/layer-panel/hex-column-config.js +34 -12
  251. package/dist/components/side-panel/layer-panel/layer-aggregation-resolution.js +10 -2
  252. package/dist/components/side-panel/layer-panel/layer-column-config.js +26 -42
  253. package/dist/components/side-panel/layer-panel/layer-config-group.js +86 -52
  254. package/dist/components/side-panel/layer-panel/layer-configurator.js +249 -158
  255. package/dist/components/side-panel/layer-panel/layer-list.js +168 -0
  256. package/dist/components/side-panel/layer-panel/layer-panel-header.js +70 -74
  257. package/dist/components/side-panel/layer-panel/layer-panel.js +58 -55
  258. package/dist/components/side-panel/layer-panel/layer-type-dropdown-list.js +22 -28
  259. package/dist/components/side-panel/layer-panel/layer-type-list-item.js +18 -22
  260. package/dist/components/side-panel/layer-panel/layer-type-selector.js +30 -35
  261. package/dist/components/side-panel/layer-panel/layer-visibility-by-zoom.js +40 -35
  262. package/dist/components/side-panel/layer-panel/panel-view-list-toggle.js +123 -0
  263. package/dist/components/side-panel/layer-panel/single-color-palette.js +45 -77
  264. package/dist/components/side-panel/layer-panel/text-label-panel.js +45 -41
  265. package/dist/components/side-panel/layer-panel/vis-config-by-field-selector.js +51 -60
  266. package/dist/components/side-panel/layer-panel/vis-config-slider.js +163 -52
  267. package/dist/components/side-panel/layer-panel/vis-config-switch.js +27 -38
  268. package/dist/components/side-panel/map-manager.js +45 -38
  269. package/dist/components/side-panel/map-style-panel/map-layer-selector.js +31 -28
  270. package/dist/components/side-panel/map-style-panel/map-style-selector.js +24 -26
  271. package/dist/components/side-panel/panel-dropdown.js +34 -34
  272. package/dist/components/side-panel/panel-header-action.js +43 -51
  273. package/dist/components/side-panel/panel-header.js +105 -78
  274. package/dist/components/side-panel/panel-tab.js +20 -24
  275. package/dist/components/side-panel/panel-title.js +17 -22
  276. package/dist/components/side-panel/panel-toggle.js +21 -33
  277. package/dist/components/side-panel/side-bar.js +53 -44
  278. package/dist/components/side-panel.js +79 -68
  279. package/dist/components/types.js +6 -0
  280. package/dist/connect/keplergl-connect.js +14 -5
  281. package/dist/connect/with-local-selector.js +38 -33
  282. package/dist/constants/action-types.js +14 -5
  283. package/dist/constants/color-palette.js +23 -12
  284. package/dist/constants/color-ranges.js +31 -32
  285. package/dist/constants/custom-color-ranges.js +14 -9
  286. package/dist/constants/default-settings.js +265 -162
  287. package/dist/constants/index.js +103 -95
  288. package/dist/constants/keyevent.js +7 -3
  289. package/dist/constants/tooltip.js +10 -7
  290. package/dist/constants/user-feedbacks.js +6 -5
  291. package/dist/constants/user-guides.js +20 -12
  292. package/dist/deckgl-layers/3d-building-layer/3d-building-layer.js +33 -30
  293. package/dist/deckgl-layers/3d-building-layer/3d-building-utils.js +43 -10
  294. package/dist/deckgl-layers/3d-building-layer/types.js +6 -0
  295. package/dist/deckgl-layers/cluster-layer/cluster-layer.js +75 -54
  296. package/dist/deckgl-layers/column-layer/enhanced-column-layer.js +34 -31
  297. package/dist/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.js +38 -38
  298. package/dist/deckgl-layers/hexagon-layer/enhanced-hexagon-layer.js +38 -38
  299. package/dist/deckgl-layers/layer-utils/cluster-utils.js +26 -12
  300. package/dist/deckgl-layers/layer-utils/cpu-aggregator.js +152 -90
  301. package/dist/deckgl-layers/layer-utils/shader-utils.js +5 -1
  302. package/dist/deckgl-layers/line-layer/line-layer.js +40 -31
  303. package/dist/deckgl-layers/svg-icon-layer/scatterplot-icon-layer.js +32 -27
  304. package/dist/deckgl-layers/svg-icon-layer/svg-icon-layer.js +42 -36
  305. package/dist/index.js +23 -4
  306. package/dist/layers/aggregation-layer.js +126 -76
  307. package/dist/layers/arc-layer/arc-layer-icon.js +27 -27
  308. package/dist/layers/arc-layer/arc-layer.js +85 -56
  309. package/dist/layers/base-layer.js +459 -288
  310. package/dist/layers/cluster-layer/cluster-layer-icon.js +27 -27
  311. package/dist/layers/cluster-layer/cluster-layer.js +45 -34
  312. package/dist/layers/default-layer-icon.js +27 -27
  313. package/dist/layers/geojson-layer/geojson-layer-icon.js +27 -27
  314. package/dist/layers/geojson-layer/geojson-layer.js +105 -60
  315. package/dist/layers/geojson-layer/geojson-utils.js +68 -39
  316. package/dist/layers/grid-layer/grid-layer-icon.js +27 -27
  317. package/dist/layers/grid-layer/grid-layer.js +42 -31
  318. package/dist/layers/grid-layer/grid-utils.js +15 -12
  319. package/dist/layers/h3-hexagon-layer/h3-hexagon-layer-icon.js +27 -27
  320. package/dist/layers/h3-hexagon-layer/h3-hexagon-layer.js +92 -49
  321. package/dist/layers/h3-hexagon-layer/h3-utils.js +22 -11
  322. package/dist/layers/heatmap-layer/heatmap-layer-icon.js +27 -27
  323. package/dist/layers/heatmap-layer/heatmap-layer.js +81 -59
  324. package/dist/layers/hexagon-layer/hexagon-layer-icon.js +27 -27
  325. package/dist/layers/hexagon-layer/hexagon-layer.js +43 -31
  326. package/dist/layers/hexagon-layer/hexagon-utils.js +15 -3
  327. package/dist/layers/icon-layer/icon-info-modal.js +28 -24
  328. package/dist/layers/icon-layer/icon-layer-icon.js +27 -27
  329. package/dist/layers/icon-layer/icon-layer.js +115 -63
  330. package/dist/layers/index.js +39 -38
  331. package/dist/layers/layer-factory.js +83 -69
  332. package/dist/layers/layer-text-label.js +15 -9
  333. package/dist/layers/layer-update.js +21 -12
  334. package/dist/layers/line-layer/line-layer-icon.js +27 -27
  335. package/dist/layers/line-layer/line-layer.js +84 -63
  336. package/dist/layers/mapbox-utils.js +54 -48
  337. package/dist/layers/mapboxgl-layer.js +68 -45
  338. package/dist/layers/point-layer/point-layer-icon.js +27 -27
  339. package/dist/layers/point-layer/point-layer.js +100 -60
  340. package/dist/layers/s2-geometry-layer/s2-geometry-layer.js +86 -45
  341. package/dist/layers/s2-geometry-layer/s2-layer-icon.js +27 -27
  342. package/dist/layers/s2-geometry-layer/s2-utils.js +18 -5
  343. package/dist/layers/scenegraph-layer/scenegraph-info-modal.js +15 -21
  344. package/dist/layers/scenegraph-layer/scenegraph-layer-icon.js +27 -27
  345. package/dist/layers/scenegraph-layer/scenegraph-layer.js +85 -54
  346. package/dist/layers/trip-layer/trip-info-modal.js +16 -21
  347. package/dist/layers/trip-layer/trip-layer-icon.js +27 -27
  348. package/dist/layers/trip-layer/trip-layer.js +115 -58
  349. package/dist/layers/trip-layer/trip-utils.js +51 -28
  350. package/dist/layers/types.js +6 -3
  351. package/dist/localization/formatted-message.js +12 -8
  352. package/dist/localization/index.js +14 -8
  353. package/dist/localization/locales.js +12 -7
  354. package/dist/localization/messages.js +29 -0
  355. package/dist/localization/translations/ca.js +455 -0
  356. package/dist/localization/translations/cn.js +458 -0
  357. package/dist/localization/translations/en.js +483 -0
  358. package/dist/localization/translations/es.js +455 -0
  359. package/dist/localization/translations/fi.js +427 -0
  360. package/dist/localization/translations/ja.js +456 -0
  361. package/dist/localization/translations/pt.js +427 -0
  362. package/dist/localization/translations/ru.js +464 -0
  363. package/dist/middleware/index.js +5 -2
  364. package/dist/processors/data-processor.js +217 -149
  365. package/dist/processors/file-handler.js +284 -210
  366. package/dist/processors/index.js +25 -97
  367. package/dist/processors/types.js +6 -0
  368. package/dist/reducers/combined-updaters.js +48 -40
  369. package/dist/reducers/composer-helpers.js +34 -32
  370. package/dist/reducers/composers.js +12 -25
  371. package/dist/reducers/core.js +46 -19
  372. package/dist/reducers/index.js +52 -24
  373. package/dist/reducers/map-state-updaters.js +64 -61
  374. package/dist/reducers/map-state.js +26 -31
  375. package/dist/reducers/map-style-updaters.js +149 -116
  376. package/dist/reducers/map-style.js +26 -31
  377. package/dist/reducers/provider-state-updaters.js +151 -121
  378. package/dist/reducers/provider-state.js +25 -32
  379. package/dist/reducers/root.js +52 -45
  380. package/dist/reducers/types.js +6 -0
  381. package/dist/reducers/ui-state-updaters.js +231 -138
  382. package/dist/reducers/ui-state.js +27 -32
  383. package/dist/reducers/vis-state-merger.js +212 -143
  384. package/dist/reducers/vis-state-selectors.js +12 -5
  385. package/dist/reducers/vis-state-updaters.js +706 -490
  386. package/dist/reducers/vis-state.js +25 -32
  387. package/dist/schemas/dataset-schema.js +59 -39
  388. package/dist/schemas/index.js +45 -38
  389. package/dist/schemas/map-state-schema.js +24 -28
  390. package/dist/schemas/map-style-schema.js +48 -34
  391. package/dist/schemas/schema-manager.js +71 -46
  392. package/dist/schemas/schema-utils.js +15 -11
  393. package/dist/schemas/schema.js +37 -35
  394. package/dist/schemas/versions.js +9 -5
  395. package/dist/schemas/vis-state-schema.js +312 -112
  396. package/dist/styles/base.js +646 -367
  397. package/dist/styles/index.js +5 -1
  398. package/dist/styles/media-breakpoints.js +36 -27
  399. package/dist/tasks/tasks.js +50 -22
  400. package/dist/templates/export-map-html.js +6 -3
  401. package/dist/utils/aggregate-utils.js +27 -23
  402. package/dist/utils/color-utils.js +62 -44
  403. package/dist/utils/custom-scales.js +7 -1
  404. package/dist/utils/data-scale-utils.js +18 -14
  405. package/dist/utils/data-utils.js +148 -110
  406. package/dist/utils/dataset-utils.js +91 -75
  407. package/dist/utils/dom-to-image.js +97 -19
  408. package/dist/utils/dom-utils.js +116 -34
  409. package/dist/utils/export-utils.js +122 -81
  410. package/dist/utils/filter-utils.js +335 -242
  411. package/dist/utils/gl-utils.js +15 -26
  412. package/dist/utils/gpu-filter-utils.js +70 -61
  413. package/dist/utils/index.js +220 -64
  414. package/dist/utils/interaction-utils.js +52 -34
  415. package/dist/utils/layer-utils.js +65 -60
  416. package/dist/utils/locale-utils.js +21 -23
  417. package/dist/utils/map-info-utils.js +3 -2
  418. package/dist/utils/map-style-utils/mapbox-gl-style-editor.js +85 -86
  419. package/dist/utils/map-style-utils/mapbox-utils.js +5 -3
  420. package/dist/utils/mapbox-utils.js +5 -2
  421. package/dist/utils/notifications-utils.js +42 -43
  422. package/dist/utils/observe-dimensions.js +44 -39
  423. package/dist/utils/projection-utils.js +20 -9
  424. package/dist/utils/searcher-utils.js +4 -1
  425. package/dist/utils/split-map-utils.js +34 -38
  426. package/dist/utils/table-utils/data-container-interface.js +6 -0
  427. package/dist/utils/table-utils/data-container-utils.js +36 -29
  428. package/dist/utils/table-utils/data-row.js +79 -7
  429. package/dist/utils/table-utils/index.js +2 -1
  430. package/dist/utils/table-utils/indexed-data-container.js +113 -81
  431. package/dist/utils/table-utils/kepler-table.js +200 -99
  432. package/dist/utils/table-utils/row-data-container.js +109 -74
  433. package/dist/utils/utils.js +94 -50
  434. package/package.json +71 -21
  435. package/src/actions/action-wrapper.ts +183 -0
  436. package/src/actions/actions.ts +260 -0
  437. package/src/actions/identity-actions.ts +116 -0
  438. package/src/actions/map-state-actions.ts +116 -0
  439. package/src/actions/map-style-actions.ts +243 -0
  440. package/src/actions/provider-actions.ts +218 -0
  441. package/src/actions/ui-state-actions.ts +490 -0
  442. package/src/actions/vis-state-actions.ts +1279 -0
  443. package/src/cloud-providers/index.ts +22 -0
  444. package/src/cloud-providers/provider.ts +277 -0
  445. package/src/components/bottom-widget.tsx +275 -0
  446. package/src/components/common/action-panel.tsx +207 -0
  447. package/src/components/common/animation-control/animation-control.tsx +157 -0
  448. package/src/components/common/animation-control/animation-controller.ts +249 -0
  449. package/src/components/common/animation-control/animation-speed-slider.tsx +86 -0
  450. package/src/components/common/animation-control/floating-time-display.tsx +209 -0
  451. package/src/components/common/animation-control/playback-controls.tsx +316 -0
  452. package/src/components/common/animation-control/speed-control.tsx +71 -0
  453. package/src/components/common/checkbox.tsx +137 -0
  454. package/src/components/common/color-legend.tsx +203 -0
  455. package/src/components/common/data-table/button.tsx +54 -0
  456. package/src/components/common/data-table/cell-size.ts +185 -0
  457. package/src/components/common/data-table/grid.tsx +57 -0
  458. package/src/components/common/data-table/index.tsx +693 -0
  459. package/src/components/common/data-table/option-dropdown.tsx +122 -0
  460. package/src/components/common/dataset-label.tsx +48 -0
  461. package/src/components/common/error-boundary.tsx +43 -0
  462. package/src/components/common/field-selector.tsx +237 -0
  463. package/src/components/common/field-token.tsx +60 -0
  464. package/src/components/common/file-uploader/file-drop.tsx +208 -0
  465. package/src/components/common/file-uploader/file-upload-progress.tsx +123 -0
  466. package/src/components/common/file-uploader/file-upload.tsx +319 -0
  467. package/src/components/common/file-uploader/upload-button.tsx +88 -0
  468. package/src/components/common/histogram-plot.tsx +125 -0
  469. package/src/components/common/icons/add.tsx +37 -0
  470. package/src/components/common/icons/anchor_window.tsx +49 -0
  471. package/src/components/common/icons/arrow-down-alt.tsx +37 -0
  472. package/src/components/common/icons/arrow-down-solid.tsx +37 -0
  473. package/src/components/common/icons/arrow-down.tsx +40 -0
  474. package/src/components/common/icons/arrow-left.tsx +42 -0
  475. package/src/components/common/icons/arrow-right.tsx +40 -0
  476. package/src/components/common/icons/arrow-up-alt.tsx +40 -0
  477. package/src/components/common/icons/arrow-up-solid.tsx +37 -0
  478. package/src/components/common/icons/arrow-up.tsx +40 -0
  479. package/src/components/common/icons/base.tsx +95 -0
  480. package/src/components/common/icons/bug.tsx +40 -0
  481. package/src/components/common/icons/cancel.tsx +37 -0
  482. package/src/components/common/icons/checkmark.tsx +39 -0
  483. package/src/components/common/icons/chevron-right.js +1 -1
  484. package/src/components/common/icons/clipboard.tsx +40 -0
  485. package/src/components/common/icons/clock.tsx +38 -0
  486. package/src/components/common/icons/close.tsx +43 -0
  487. package/src/components/common/icons/code-alt.tsx +37 -0
  488. package/src/components/common/icons/copy.tsx +38 -0
  489. package/src/components/common/icons/crosshairs.tsx +37 -0
  490. package/src/components/common/icons/cube-3d.tsx +39 -0
  491. package/src/components/common/icons/cursor-click.tsx +43 -0
  492. package/src/components/common/icons/data-table.tsx +40 -0
  493. package/src/components/common/icons/db.tsx +40 -0
  494. package/src/components/common/icons/delete.tsx +39 -0
  495. package/src/components/common/icons/docs.tsx +40 -0
  496. package/src/components/common/icons/drag-n-drop.tsx +38 -0
  497. package/src/components/common/icons/draw-polygon.tsx +51 -0
  498. package/src/components/common/icons/email.tsx +39 -0
  499. package/src/components/common/icons/expand.tsx +39 -0
  500. package/src/components/common/icons/eye-seen.tsx +38 -0
  501. package/src/components/common/icons/eye-unseen.tsx +38 -0
  502. package/src/components/common/icons/file-type.tsx +71 -0
  503. package/src/components/common/icons/file.tsx +37 -0
  504. package/src/components/common/icons/files.tsx +37 -0
  505. package/src/components/common/icons/filter-funnel.tsx +37 -0
  506. package/src/components/common/icons/free-window.tsx +48 -0
  507. package/src/components/common/icons/gear.tsx +40 -0
  508. package/src/components/common/icons/hash.tsx +37 -0
  509. package/src/components/common/icons/histogram.tsx +42 -0
  510. package/src/components/common/icons/index.tsx +98 -0
  511. package/src/components/common/icons/info.tsx +48 -0
  512. package/src/components/common/icons/layers.tsx +37 -0
  513. package/src/components/common/icons/left-arrow.tsx +37 -0
  514. package/src/components/common/icons/legend.tsx +37 -0
  515. package/src/components/common/icons/line-chart.tsx +40 -0
  516. package/src/components/common/icons/login.tsx +41 -0
  517. package/src/components/common/icons/logout.tsx +38 -0
  518. package/src/components/common/icons/map-icon.tsx +62 -0
  519. package/src/components/common/icons/map.tsx +62 -0
  520. package/src/components/common/icons/messages.tsx +37 -0
  521. package/src/components/common/icons/minus.tsx +39 -0
  522. package/src/components/common/icons/order-by-dataset.tsx +49 -0
  523. package/src/components/common/icons/order-by-list.tsx +39 -0
  524. package/src/components/common/icons/pause.tsx +37 -0
  525. package/src/components/common/icons/picture.tsx +37 -0
  526. package/src/components/common/icons/pin.tsx +42 -0
  527. package/src/components/common/icons/play.tsx +37 -0
  528. package/src/components/common/icons/polygon.tsx +65 -0
  529. package/src/components/common/icons/rectangle.tsx +66 -0
  530. package/src/components/common/icons/reduce.tsx +42 -0
  531. package/src/components/common/icons/reset.tsx +37 -0
  532. package/src/components/common/icons/rocket.tsx +37 -0
  533. package/src/components/common/icons/save.tsx +38 -0
  534. package/src/components/common/icons/save2.tsx +42 -0
  535. package/src/components/common/icons/search.tsx +38 -0
  536. package/src/components/common/icons/settings.tsx +39 -0
  537. package/src/components/common/icons/share.tsx +37 -0
  538. package/src/components/common/icons/split.tsx +57 -0
  539. package/src/components/common/icons/square-select.tsx +38 -0
  540. package/src/components/common/icons/swap-horizontal.js +1 -1
  541. package/src/components/common/icons/table.tsx +41 -0
  542. package/src/components/common/icons/trash.tsx +45 -0
  543. package/src/components/common/icons/upload.tsx +37 -0
  544. package/src/components/common/icons/vert-dots.tsx +44 -0
  545. package/src/components/common/icons/vert-three-dots.tsx +39 -0
  546. package/src/components/common/icons/warning.tsx +40 -0
  547. package/src/components/common/image-preview.tsx +118 -0
  548. package/src/components/common/info-helper.tsx +90 -0
  549. package/src/components/common/item-selector/accessor.ts +45 -0
  550. package/src/components/common/item-selector/chickleted-input.tsx +153 -0
  551. package/src/components/common/item-selector/dropdown-list.tsx +269 -0
  552. package/src/components/common/item-selector/item-selector-submenu.js +1 -1
  553. package/src/components/common/item-selector/item-selector.d.ts +24 -27
  554. package/src/components/common/item-selector/item-selector.tsx +372 -0
  555. package/src/components/common/item-selector/typeahead.tsx +533 -0
  556. package/src/components/common/line-chart.tsx +170 -0
  557. package/src/components/common/loading-spinner.tsx +75 -0
  558. package/src/components/common/logo.tsx +88 -0
  559. package/src/components/common/map-layer-selector.tsx +64 -0
  560. package/src/components/common/modal.tsx +238 -0
  561. package/src/components/common/portaled.tsx +312 -0
  562. package/src/components/common/progress-bar.tsx +74 -0
  563. package/src/components/common/range-brush.tsx +276 -0
  564. package/src/components/common/range-plot.tsx +145 -0
  565. package/src/components/common/range-slider.tsx +320 -0
  566. package/src/components/common/slider/mouse-event.ts +122 -0
  567. package/src/components/common/slider/slider-bar-handle.tsx +106 -0
  568. package/src/components/common/slider/slider-handle.tsx +210 -0
  569. package/src/components/common/slider/slider.tsx +234 -0
  570. package/src/components/common/styled-components.tsx +708 -0
  571. package/src/components/common/switch.tsx +47 -0
  572. package/src/components/common/time-range-slider-time-title.tsx +87 -0
  573. package/src/components/common/time-range-slider.tsx +171 -0
  574. package/src/components/common/time-slider-marker.tsx +187 -0
  575. package/src/components/common/tippy-tooltip.tsx +130 -0
  576. package/src/components/common/toolbar-item.tsx +99 -0
  577. package/src/components/common/toolbar.tsx +49 -0
  578. package/src/components/common/vertical-toolbar.tsx +35 -0
  579. package/src/components/container.d.ts +8 -0
  580. package/src/components/container.tsx +188 -0
  581. package/src/components/context.ts +32 -0
  582. package/src/components/editor/editor.tsx +231 -0
  583. package/src/components/editor/feature-action-panel.tsx +155 -0
  584. package/src/components/editor/feature-styles.ts +75 -0
  585. package/src/components/editor/handle-style.ts +89 -0
  586. package/src/components/filters/filter-panels/filter-panel-with-field-select.tsx +118 -0
  587. package/src/components/filters/filter-panels/multi-select-filter-panel.tsx +63 -0
  588. package/src/components/filters/filter-panels/new-filter-panel.tsx +100 -0
  589. package/src/components/filters/filter-panels/polygon-filter-panel.tsx +84 -0
  590. package/src/components/filters/filter-panels/range-filter-panel.tsx +63 -0
  591. package/src/components/filters/filter-panels/single-select-filter-panel.tsx +63 -0
  592. package/src/components/filters/filter-panels/time-range-filter-panel.tsx +92 -0
  593. package/src/components/filters/filter-panels/types.ts +39 -0
  594. package/src/components/filters/multi-select-filter.tsx +37 -0
  595. package/src/components/filters/polygon-filter.tsx +74 -0
  596. package/src/components/filters/range-filter.tsx +44 -0
  597. package/src/components/filters/single-select-filter.tsx +50 -0
  598. package/src/components/filters/time-range-filter.tsx +76 -0
  599. package/src/components/filters/time-widget.tsx +240 -0
  600. package/src/components/filters/types.ts +78 -0
  601. package/src/components/geocoder/geocoder.tsx +307 -0
  602. package/src/components/geocoder-panel.tsx +199 -0
  603. package/src/components/index.ts +262 -0
  604. package/src/components/injector.d.ts +33 -0
  605. package/src/components/injector.tsx +171 -0
  606. package/src/components/kepler-gl.d.ts +0 -2
  607. package/src/components/kepler-gl.tsx +579 -0
  608. package/src/components/map/coordinate-info.tsx +58 -0
  609. package/src/components/map/layer-hover-info.tsx +192 -0
  610. package/src/components/map/layer-selector-panel.tsx +121 -0
  611. package/src/components/map/locale-panel.tsx +110 -0
  612. package/src/components/map/map-control-panel.tsx +141 -0
  613. package/src/components/map/map-control-tooltip.tsx +45 -0
  614. package/src/components/map/map-control.tsx +138 -0
  615. package/src/components/map/map-draw-panel.tsx +145 -0
  616. package/src/components/map/map-legend-panel.tsx +167 -0
  617. package/src/components/map/map-legend.tsx +283 -0
  618. package/src/components/map/map-popover.tsx +266 -0
  619. package/src/components/map/split-map-button.tsx +98 -0
  620. package/src/components/map/toggle-3d-button.tsx +90 -0
  621. package/src/components/map-container.tsx +541 -0
  622. package/src/components/maps-layout.tsx +44 -0
  623. package/src/components/modal-container.tsx +556 -0
  624. package/src/components/modals/add-map-style-modal.tsx +303 -0
  625. package/src/components/modals/cloud-tile.tsx +181 -0
  626. package/src/components/modals/data-table-modal.tsx +241 -0
  627. package/src/components/modals/delete-data-modal.tsx +55 -0
  628. package/src/components/modals/error-display.tsx +43 -0
  629. package/src/components/modals/export-data-modal.tsx +201 -0
  630. package/src/components/modals/export-image-modal.tsx +155 -0
  631. package/src/components/modals/export-map-modal/export-html-map.tsx +164 -0
  632. package/src/components/modals/export-map-modal/export-json-map.tsx +112 -0
  633. package/src/components/modals/export-map-modal/export-map-modal.tsx +109 -0
  634. package/src/components/modals/image-modal-container.tsx +85 -0
  635. package/src/components/modals/load-data-modal.tsx +120 -0
  636. package/src/components/modals/load-storage-map.tsx +414 -0
  637. package/src/components/modals/loading-dialog.tsx +77 -0
  638. package/src/components/modals/modal-tabs.tsx +137 -0
  639. package/src/components/modals/overwrite-map-modal.tsx +113 -0
  640. package/src/components/modals/provider-modal-container.tsx +61 -0
  641. package/src/components/modals/save-map-modal.tsx +277 -0
  642. package/src/components/modals/share-map-modal.tsx +217 -0
  643. package/src/components/modals/status-panel.tsx +106 -0
  644. package/src/components/modals/storage-map-viewer.tsx +190 -0
  645. package/src/components/notification-panel/notification-item.tsx +143 -0
  646. package/src/components/notification-panel.tsx +75 -0
  647. package/src/components/plot-container.tsx +237 -0
  648. package/src/components/side-panel/common/dataset-info.tsx +46 -0
  649. package/src/components/side-panel/common/dataset-tag.tsx +86 -0
  650. package/src/components/side-panel/common/dataset-title.tsx +186 -0
  651. package/src/components/side-panel/common/source-data-catalog.tsx +67 -0
  652. package/src/components/side-panel/common/source-data-selector.tsx +90 -0
  653. package/src/components/side-panel/common/types.ts +76 -0
  654. package/src/components/side-panel/filter-manager.tsx +120 -0
  655. package/src/components/side-panel/filter-panel/filter-panel-header.tsx +96 -0
  656. package/src/components/side-panel/filter-panel/filter-panel.tsx +125 -0
  657. package/src/components/side-panel/interaction-manager.tsx +59 -0
  658. package/src/components/side-panel/interaction-panel/brush-config.tsx +58 -0
  659. package/src/components/side-panel/interaction-panel/interaction-panel.tsx +124 -0
  660. package/src/components/side-panel/interaction-panel/tooltip-config/tooltip-chicklet.tsx +243 -0
  661. package/src/components/side-panel/interaction-panel/tooltip-config.tsx +238 -0
  662. package/src/components/side-panel/layer-manager.tsx +242 -0
  663. package/src/components/side-panel/layer-panel/add-layer-button.tsx +208 -0
  664. package/src/components/side-panel/layer-panel/color-dimension-scale-selector.js +1 -1
  665. package/src/components/side-panel/layer-panel/color-palette.tsx +98 -0
  666. package/src/components/side-panel/layer-panel/color-range-selector.tsx +377 -0
  667. package/src/components/side-panel/layer-panel/color-selector.tsx +200 -0
  668. package/src/components/side-panel/layer-panel/column-selector.tsx +102 -0
  669. package/src/components/side-panel/layer-panel/custom-markers-config-group.js +1 -1
  670. package/src/components/side-panel/layer-panel/custom-palette.tsx +297 -0
  671. package/src/components/side-panel/layer-panel/custom-picker.tsx +99 -0
  672. package/src/components/side-panel/layer-panel/dataset-layer-group.tsx +99 -0
  673. package/src/components/side-panel/layer-panel/dataset-layer-section.tsx +100 -0
  674. package/src/components/side-panel/layer-panel/dataset-section.tsx +125 -0
  675. package/src/components/side-panel/layer-panel/dimension-scale-selector.tsx +64 -0
  676. package/src/components/side-panel/layer-panel/layer-column-config.tsx +115 -0
  677. package/src/components/side-panel/layer-panel/layer-config-group.tsx +256 -0
  678. package/src/components/side-panel/layer-panel/layer-list.tsx +191 -0
  679. package/src/components/side-panel/layer-panel/layer-panel-header.tsx +272 -0
  680. package/src/components/side-panel/layer-panel/layer-panel.tsx +196 -0
  681. package/src/components/side-panel/layer-panel/layer-type-dropdown-list.tsx +118 -0
  682. package/src/components/side-panel/layer-panel/layer-type-list-item.tsx +92 -0
  683. package/src/components/side-panel/layer-panel/layer-type-selector.tsx +115 -0
  684. package/src/components/side-panel/layer-panel/layer-visibility-by-zoom.js +1 -1
  685. package/src/components/side-panel/layer-panel/panel-view-list-toggle.tsx +132 -0
  686. package/src/components/side-panel/layer-panel/single-color-palette.tsx +94 -0
  687. package/src/components/side-panel/layer-panel/text-label-panel.tsx +187 -0
  688. package/src/components/side-panel/layer-panel/vis-config-by-field-selector.tsx +179 -0
  689. package/src/components/side-panel/layer-panel/vis-config-slider.tsx +237 -0
  690. package/src/components/side-panel/layer-panel/vis-config-switch.tsx +86 -0
  691. package/src/components/side-panel/map-manager.tsx +123 -0
  692. package/src/components/side-panel/map-style-panel/map-layer-selector.tsx +145 -0
  693. package/src/components/side-panel/map-style-panel/map-style-selector.tsx +122 -0
  694. package/src/components/side-panel/panel-dropdown.tsx +53 -0
  695. package/src/components/side-panel/panel-header-action.tsx +114 -0
  696. package/src/components/side-panel/panel-header.tsx +386 -0
  697. package/src/components/side-panel/panel-tab.tsx +79 -0
  698. package/src/components/side-panel/panel-title.tsx +35 -0
  699. package/src/components/side-panel/panel-toggle.tsx +72 -0
  700. package/src/components/side-panel/side-bar.tsx +140 -0
  701. package/src/components/side-panel.tsx +261 -0
  702. package/src/components/types.ts +41 -0
  703. package/src/connect/keplergl-connect.ts +48 -0
  704. package/src/connect/with-local-selector.tsx +70 -0
  705. package/src/constants/action-types.ts +188 -0
  706. package/src/constants/color-ranges.ts +87 -0
  707. package/src/constants/default-settings.ts +1049 -0
  708. package/src/deckgl-layers/3d-building-layer/3d-building-layer.ts +57 -0
  709. package/src/deckgl-layers/3d-building-layer/3d-building-utils.ts +211 -0
  710. package/src/deckgl-layers/3d-building-layer/types.ts +29 -0
  711. package/src/deckgl-layers/column-layer/enhanced-column-layer.ts +63 -0
  712. package/src/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.ts +68 -0
  713. package/src/deckgl-layers/hexagon-layer/enhanced-hexagon-layer.ts +68 -0
  714. package/src/deckgl-layers/layer-utils/cluster-utils.ts +78 -0
  715. package/src/deckgl-layers/layer-utils/cpu-aggregator.ts +672 -0
  716. package/src/deckgl-layers/layer-utils/shader-utils.ts +41 -0
  717. package/src/deckgl-layers/line-layer/line-layer.ts +126 -0
  718. package/src/deckgl-layers/svg-icon-layer/scatterplot-icon-layer.ts +63 -0
  719. package/src/deckgl-layers/svg-icon-layer/svg-icon-layer.ts +96 -0
  720. package/src/index.d.ts +1 -0
  721. package/src/layers/aggregation-layer.ts +402 -0
  722. package/src/layers/arc-layer/arc-layer-icon.tsx +67 -0
  723. package/src/layers/arc-layer/arc-layer.ts +294 -0
  724. package/src/layers/base-layer.ts +1743 -0
  725. package/src/layers/cluster-layer/cluster-layer.ts +162 -0
  726. package/src/layers/geojson-layer/geojson-layer-icon.tsx +68 -0
  727. package/src/layers/geojson-layer/geojson-layer.ts +461 -0
  728. package/src/layers/geojson-layer/geojson-utils.ts +200 -0
  729. package/src/layers/grid-layer/grid-layer-icon.tsx +53 -0
  730. package/src/layers/grid-layer/grid-layer.ts +153 -0
  731. package/src/layers/grid-layer/grid-utils.ts +84 -0
  732. package/src/layers/h3-hexagon-layer/h3-hexagon-layer.ts +339 -0
  733. package/src/layers/h3-hexagon-layer/h3-utils.ts +67 -0
  734. package/src/layers/heatmap-layer/heatmap-layer.ts +255 -0
  735. package/src/layers/hexagon-layer/hexagon-layer.ts +156 -0
  736. package/src/layers/hexagon-layer/hexagon-utils.ts +64 -0
  737. package/src/layers/icon-layer/icon-info-modal.tsx +155 -0
  738. package/src/layers/icon-layer/icon-layer.ts +392 -0
  739. package/src/layers/index.ts +77 -0
  740. package/src/layers/layer-factory.ts +695 -0
  741. package/src/layers/layer-text-label.ts +62 -0
  742. package/src/layers/layer-update.ts +70 -0
  743. package/src/layers/line-layer/line-layer.ts +222 -0
  744. package/src/layers/mapbox-utils.ts +204 -0
  745. package/src/layers/mapboxgl-layer.ts +176 -0
  746. package/src/layers/point-layer/point-layer.ts +504 -0
  747. package/src/layers/s2-geometry-layer/s2-geometry-layer.ts +369 -0
  748. package/src/layers/s2-geometry-layer/s2-utils.ts +42 -0
  749. package/src/layers/scenegraph-layer/scenegraph-layer.ts +237 -0
  750. package/src/layers/trip-layer/trip-layer.ts +356 -0
  751. package/src/layers/trip-layer/trip-utils.ts +177 -0
  752. package/src/localization/formatted-message.tsx +42 -0
  753. package/src/localization/index.ts +29 -0
  754. package/src/localization/locales.ts +53 -0
  755. package/src/localization/messages.ts +40 -0
  756. package/src/localization/translations/ca.ts +476 -0
  757. package/src/localization/translations/cn.ts +477 -0
  758. package/src/localization/translations/en.ts +504 -0
  759. package/src/localization/translations/es.ts +477 -0
  760. package/src/localization/translations/fi.ts +448 -0
  761. package/src/localization/translations/ja.ts +477 -0
  762. package/src/localization/translations/pt.ts +449 -0
  763. package/src/localization/translations/ru.ts +488 -0
  764. package/src/middleware/index.ts +35 -0
  765. package/src/processors/data-processor.ts +723 -0
  766. package/src/processors/file-handler.ts +248 -0
  767. package/src/processors/index.ts +22 -0
  768. package/src/processors/types.ts +22 -0
  769. package/src/reducers/combined-updaters.ts +216 -0
  770. package/src/reducers/composer-helpers.ts +75 -0
  771. package/src/reducers/core.ts +111 -0
  772. package/src/reducers/index.ts +116 -0
  773. package/src/reducers/map-state-updaters.ts +271 -0
  774. package/src/reducers/map-state.ts +47 -0
  775. package/src/reducers/map-style-updaters.ts +640 -0
  776. package/src/reducers/map-style.ts +53 -0
  777. package/src/reducers/provider-state-updaters.ts +454 -0
  778. package/src/reducers/provider-state.ts +53 -0
  779. package/src/reducers/root.ts +231 -0
  780. package/src/reducers/types.ts +18 -0
  781. package/src/reducers/ui-state-updaters.ts +926 -0
  782. package/src/reducers/ui-state.ts +75 -0
  783. package/src/reducers/vis-state-merger.ts +627 -0
  784. package/src/reducers/vis-state-selectors.ts +37 -0
  785. package/src/reducers/vis-state-updaters.ts +2568 -0
  786. package/src/reducers/vis-state.ts +157 -0
  787. package/src/schemas/dataset-schema.ts +141 -0
  788. package/src/schemas/index.ts +52 -0
  789. package/src/schemas/schema-manager.ts +446 -0
  790. package/src/schemas/schema.ts +124 -0
  791. package/src/schemas/vis-state-schema.ts +761 -0
  792. package/src/styles/base.ts +1642 -0
  793. package/src/styles/media-breakpoints.ts +56 -0
  794. package/src/typedefs/deckgl.d.ts +25 -0
  795. package/src/utils/aggregate-utils.ts +71 -0
  796. package/src/utils/color-utils.ts +134 -0
  797. package/src/utils/data-scale-utils.ts +73 -0
  798. package/src/utils/data-utils.ts +459 -0
  799. package/src/utils/dataset-utils.ts +261 -0
  800. package/src/utils/dom-to-image.ts +533 -0
  801. package/src/utils/dom-utils.ts +354 -0
  802. package/src/utils/export-utils.ts +265 -0
  803. package/src/utils/filter-utils.ts +1185 -0
  804. package/src/utils/gl-utils.ts +40 -0
  805. package/src/utils/gpu-filter-utils.ts +249 -0
  806. package/src/utils/index.ts +69 -0
  807. package/src/utils/interaction-utils.ts +212 -0
  808. package/src/utils/layer-utils.ts +249 -0
  809. package/src/utils/map-style-utils/mapbox-gl-style-editor.ts +227 -0
  810. package/src/utils/notifications-utils.ts +89 -0
  811. package/src/utils/observe-dimensions.ts +127 -0
  812. package/src/utils/split-map-utils.ts +104 -0
  813. package/src/utils/table-utils/data-container-utils.ts +90 -0
  814. package/src/utils/table-utils/data-row.ts +110 -0
  815. package/src/utils/table-utils/indexed-data-container.ts +184 -0
  816. package/src/utils/table-utils/kepler-table.ts +639 -0
  817. package/src/utils/table-utils/row-data-container.ts +178 -0
  818. package/src/utils/utils.ts +228 -0
  819. package/dist/components/common/icons/arrow-down-solid .js +0 -64
  820. package/dist/localization/en.js +0 -494
  821. package/src/actions/action-wrapper.js +0 -183
  822. package/src/actions/actions.d.ts +0 -104
  823. package/src/actions/actions.js +0 -178
  824. package/src/actions/identity-actions.d.ts +0 -53
  825. package/src/actions/identity-actions.js +0 -83
  826. package/src/actions/index.d.ts +0 -23
  827. package/src/actions/map-state-actions.d.ts +0 -46
  828. package/src/actions/map-state-actions.js +0 -90
  829. package/src/actions/map-style-actions.d.ts +0 -116
  830. package/src/actions/map-style-actions.js +0 -135
  831. package/src/actions/provider-actions.d.ts +0 -203
  832. package/src/actions/provider-actions.js +0 -94
  833. package/src/actions/ui-state-actions.d.ts +0 -200
  834. package/src/actions/ui-state-actions.js +0 -272
  835. package/src/actions/vis-state-actions.d.ts +0 -502
  836. package/src/actions/vis-state-actions.js +0 -919
  837. package/src/cloud-providers/index.d.ts +0 -53
  838. package/src/cloud-providers/index.js +0 -21
  839. package/src/cloud-providers/provider.js +0 -233
  840. package/src/components/bottom-widget.d.ts +0 -33
  841. package/src/components/bottom-widget.js +0 -235
  842. package/src/components/common/action-panel.d.ts +0 -24
  843. package/src/components/common/action-panel.js +0 -177
  844. package/src/components/common/animation-control/animation-control.js +0 -155
  845. package/src/components/common/animation-control/animation-controller.js +0 -224
  846. package/src/components/common/animation-control/animation-speed-slider.js +0 -79
  847. package/src/components/common/animation-control/floating-time-display.js +0 -192
  848. package/src/components/common/animation-control/playback-controls.js +0 -278
  849. package/src/components/common/animation-control/speed-control.js +0 -71
  850. package/src/components/common/checkbox.js +0 -128
  851. package/src/components/common/color-legend.js +0 -198
  852. package/src/components/common/data-table/button.js +0 -47
  853. package/src/components/common/data-table/cell-size.js +0 -180
  854. package/src/components/common/data-table/grid.js +0 -55
  855. package/src/components/common/data-table/index.js +0 -620
  856. package/src/components/common/data-table/option-dropdown.js +0 -110
  857. package/src/components/common/dataset-label.js +0 -40
  858. package/src/components/common/error-boundary.js +0 -43
  859. package/src/components/common/field-selector.js +0 -233
  860. package/src/components/common/field-token.js +0 -56
  861. package/src/components/common/file-uploader/file-drop.d.ts +0 -19
  862. package/src/components/common/file-uploader/file-drop.js +0 -196
  863. package/src/components/common/file-uploader/file-upload-progress.d.ts +0 -11
  864. package/src/components/common/file-uploader/file-upload-progress.js +0 -110
  865. package/src/components/common/file-uploader/file-upload.d.ts +0 -22
  866. package/src/components/common/file-uploader/file-upload.js +0 -301
  867. package/src/components/common/file-uploader/upload-button.d.ts.wip +0 -11
  868. package/src/components/common/file-uploader/upload-button.js +0 -83
  869. package/src/components/common/histogram-plot.js +0 -102
  870. package/src/components/common/icons/add.js +0 -43
  871. package/src/components/common/icons/anchor_window.js +0 -53
  872. package/src/components/common/icons/arrow-down-alt.js +0 -43
  873. package/src/components/common/icons/arrow-down-solid .js +0 -43
  874. package/src/components/common/icons/arrow-down.js +0 -46
  875. package/src/components/common/icons/arrow-left.js +0 -48
  876. package/src/components/common/icons/arrow-right.js +0 -46
  877. package/src/components/common/icons/arrow-up-alt.js +0 -46
  878. package/src/components/common/icons/arrow-up-solid.js +0 -43
  879. package/src/components/common/icons/arrow-up.js +0 -46
  880. package/src/components/common/icons/base.js +0 -90
  881. package/src/components/common/icons/bug.js +0 -46
  882. package/src/components/common/icons/cancel.js +0 -43
  883. package/src/components/common/icons/checkmark.js +0 -45
  884. package/src/components/common/icons/clipboard.js +0 -46
  885. package/src/components/common/icons/clock.js +0 -44
  886. package/src/components/common/icons/close.js +0 -49
  887. package/src/components/common/icons/code-alt.js +0 -43
  888. package/src/components/common/icons/copy.js +0 -44
  889. package/src/components/common/icons/crosshairs.js +0 -43
  890. package/src/components/common/icons/cube-3d.js +0 -45
  891. package/src/components/common/icons/cursor-click.js +0 -49
  892. package/src/components/common/icons/data-table.js +0 -45
  893. package/src/components/common/icons/db.js +0 -45
  894. package/src/components/common/icons/delete.js +0 -44
  895. package/src/components/common/icons/docs.js +0 -46
  896. package/src/components/common/icons/drag-n-drop.js +0 -44
  897. package/src/components/common/icons/draw-polygon.js +0 -60
  898. package/src/components/common/icons/email.js +0 -45
  899. package/src/components/common/icons/expand.js +0 -45
  900. package/src/components/common/icons/eye-seen.js +0 -44
  901. package/src/components/common/icons/eye-unseen.js +0 -44
  902. package/src/components/common/icons/file-type.js +0 -57
  903. package/src/components/common/icons/file.js +0 -43
  904. package/src/components/common/icons/files.js +0 -42
  905. package/src/components/common/icons/filter-funnel.js +0 -43
  906. package/src/components/common/icons/free-window.js +0 -53
  907. package/src/components/common/icons/gear.js +0 -45
  908. package/src/components/common/icons/hash.js +0 -43
  909. package/src/components/common/icons/histogram.js +0 -47
  910. package/src/components/common/icons/index.js +0 -96
  911. package/src/components/common/icons/info.js +0 -54
  912. package/src/components/common/icons/layers.js +0 -43
  913. package/src/components/common/icons/left-arrow.js +0 -43
  914. package/src/components/common/icons/legend.js +0 -43
  915. package/src/components/common/icons/line-chart.js +0 -45
  916. package/src/components/common/icons/login.js +0 -46
  917. package/src/components/common/icons/logout.js +0 -43
  918. package/src/components/common/icons/map-icon.js +0 -69
  919. package/src/components/common/icons/map.js +0 -69
  920. package/src/components/common/icons/messages.js +0 -43
  921. package/src/components/common/icons/minus.js +0 -45
  922. package/src/components/common/icons/pause.js +0 -43
  923. package/src/components/common/icons/picture.js +0 -43
  924. package/src/components/common/icons/pin.js +0 -43
  925. package/src/components/common/icons/play.js +0 -43
  926. package/src/components/common/icons/polygon.js +0 -74
  927. package/src/components/common/icons/rectangle.js +0 -75
  928. package/src/components/common/icons/reduce.js +0 -48
  929. package/src/components/common/icons/reset.js +0 -43
  930. package/src/components/common/icons/rocket.js +0 -43
  931. package/src/components/common/icons/save.js +0 -44
  932. package/src/components/common/icons/save2.js +0 -47
  933. package/src/components/common/icons/search.js +0 -44
  934. package/src/components/common/icons/settings.js +0 -45
  935. package/src/components/common/icons/share.js +0 -43
  936. package/src/components/common/icons/split.js +0 -63
  937. package/src/components/common/icons/square-select.js +0 -44
  938. package/src/components/common/icons/table.js +0 -46
  939. package/src/components/common/icons/trash.js +0 -51
  940. package/src/components/common/icons/upload.js +0 -44
  941. package/src/components/common/icons/vert-dots.js +0 -50
  942. package/src/components/common/icons/vert-three-dots.js +0 -45
  943. package/src/components/common/icons/warning.js +0 -46
  944. package/src/components/common/image-preview.js +0 -111
  945. package/src/components/common/info-helper.js +0 -84
  946. package/src/components/common/item-selector/accessor.js +0 -45
  947. package/src/components/common/item-selector/chickleted-input.js +0 -143
  948. package/src/components/common/item-selector/dropdown-list.js +0 -258
  949. package/src/components/common/item-selector/item-selector.js +0 -360
  950. package/src/components/common/item-selector/typeahead.js +0 -507
  951. package/src/components/common/line-chart.js +0 -134
  952. package/src/components/common/loading-spinner.js +0 -64
  953. package/src/components/common/logo.js +0 -92
  954. package/src/components/common/map-layer-selector.d.ts +0 -10
  955. package/src/components/common/map-layer-selector.js +0 -54
  956. package/src/components/common/modal.js +0 -233
  957. package/src/components/common/portaled.js +0 -264
  958. package/src/components/common/progress-bar.d.ts +0 -13
  959. package/src/components/common/progress-bar.js +0 -49
  960. package/src/components/common/range-brush.js +0 -256
  961. package/src/components/common/range-plot.js +0 -139
  962. package/src/components/common/range-slider.js +0 -299
  963. package/src/components/common/slider/mouse-event.js +0 -97
  964. package/src/components/common/slider/slider-bar-handle.js +0 -97
  965. package/src/components/common/slider/slider-handle.js +0 -181
  966. package/src/components/common/slider/slider.js +0 -213
  967. package/src/components/common/styled-components.js +0 -657
  968. package/src/components/common/switch.js +0 -50
  969. package/src/components/common/time-range-slider-time-title.js +0 -76
  970. package/src/components/common/time-range-slider.js +0 -163
  971. package/src/components/common/time-slider-marker.js +0 -168
  972. package/src/components/common/toolbar-item.d.ts +0 -14
  973. package/src/components/common/toolbar-item.js +0 -83
  974. package/src/components/common/toolbar.js +0 -45
  975. package/src/components/common/vertical-toolbar.js +0 -35
  976. package/src/components/container.js +0 -173
  977. package/src/components/context.d.ts +0 -10
  978. package/src/components/context.js +0 -32
  979. package/src/components/editor/editor.js +0 -218
  980. package/src/components/editor/feature-action-panel.js +0 -143
  981. package/src/components/editor/feature-styles.js +0 -75
  982. package/src/components/editor/handle-style.js +0 -89
  983. package/src/components/filters/filter-panels/filter-panel-types.d.ts +0 -28
  984. package/src/components/filters/filter-panels/filter-panel-with-field-select.js +0 -124
  985. package/src/components/filters/filter-panels/multi-select-filter-panel.js +0 -75
  986. package/src/components/filters/filter-panels/new-filter-panel.js +0 -99
  987. package/src/components/filters/filter-panels/polygon-filter-panel.js +0 -96
  988. package/src/components/filters/filter-panels/range-filter-panel.js +0 -75
  989. package/src/components/filters/filter-panels/single-select-filter-panel.js +0 -75
  990. package/src/components/filters/filter-panels/time-range-filter-panel.js +0 -95
  991. package/src/components/filters/multi-select-filter.js +0 -36
  992. package/src/components/filters/polygon-filter.d.ts +0 -13
  993. package/src/components/filters/polygon-filter.js +0 -73
  994. package/src/components/filters/range-filter.js +0 -43
  995. package/src/components/filters/single-select-filter.js +0 -49
  996. package/src/components/filters/time-range-filter.js +0 -68
  997. package/src/components/filters/time-widget.js +0 -228
  998. package/src/components/geocoder/geocoder.d.ts +0 -33
  999. package/src/components/geocoder/geocoder.js +0 -272
  1000. package/src/components/geocoder-panel.js +0 -191
  1001. package/src/components/index.js +0 -247
  1002. package/src/components/injector.js +0 -161
  1003. package/src/components/kepler-gl.js +0 -525
  1004. package/src/components/map/coordinate-info.js +0 -53
  1005. package/src/components/map/layer-hover-info.d.ts +0 -12
  1006. package/src/components/map/layer-hover-info.js +0 -185
  1007. package/src/components/map/layer-selector-panel.d.ts +0 -16
  1008. package/src/components/map/layer-selector-panel.js +0 -106
  1009. package/src/components/map/locale-panel.d.ts +0 -12
  1010. package/src/components/map/locale-panel.js +0 -91
  1011. package/src/components/map/map-control-panel.d.ts +0 -11
  1012. package/src/components/map/map-control-panel.js +0 -98
  1013. package/src/components/map/map-control-tooltip.d.ts +0 -8
  1014. package/src/components/map/map-control-tooltip.js +0 -40
  1015. package/src/components/map/map-control.d.ts +0 -37
  1016. package/src/components/map/map-control.js +0 -100
  1017. package/src/components/map/map-draw-panel.d.ts +0 -16
  1018. package/src/components/map/map-draw-panel.js +0 -125
  1019. package/src/components/map/map-legend-panel.d.ts +0 -20
  1020. package/src/components/map/map-legend-panel.js +0 -100
  1021. package/src/components/map/map-legend.d.ts +0 -58
  1022. package/src/components/map/map-legend.js +0 -228
  1023. package/src/components/map/map-popover.d.ts +0 -28
  1024. package/src/components/map/map-popover.js +0 -250
  1025. package/src/components/map/split-map-button.d.ts +0 -19
  1026. package/src/components/map/split-map-button.js +0 -82
  1027. package/src/components/map/toggle-3d-button.d.ts +0 -16
  1028. package/src/components/map/toggle-3d-button.js +0 -75
  1029. package/src/components/map-container.d.ts +0 -18
  1030. package/src/components/map-container.js +0 -502
  1031. package/src/components/maps-layout.d.ts +0 -5
  1032. package/src/components/maps-layout.js +0 -40
  1033. package/src/components/modal-container.d.ts +0 -38
  1034. package/src/components/modal-container.js +0 -545
  1035. package/src/components/modals/add-map-style-modal.js +0 -301
  1036. package/src/components/modals/cloud-tile.js +0 -147
  1037. package/src/components/modals/data-table-modal.js +0 -217
  1038. package/src/components/modals/delete-data-modal.js +0 -48
  1039. package/src/components/modals/error-display.js +0 -39
  1040. package/src/components/modals/export-data-modal.js +0 -193
  1041. package/src/components/modals/export-image-modal.d.ts +0 -21
  1042. package/src/components/modals/export-image-modal.js +0 -144
  1043. package/src/components/modals/export-map-modal/export-html-map.d.ts +0 -21
  1044. package/src/components/modals/export-map-modal/export-html-map.js +0 -145
  1045. package/src/components/modals/export-map-modal/export-json-map.js +0 -100
  1046. package/src/components/modals/export-map-modal/export-map-modal.js +0 -114
  1047. package/src/components/modals/image-modal-container.d.ts +0 -13
  1048. package/src/components/modals/image-modal-container.js +0 -76
  1049. package/src/components/modals/load-data-modal.d.ts +0 -30
  1050. package/src/components/modals/load-data-modal.js +0 -94
  1051. package/src/components/modals/load-storage-map.js +0 -381
  1052. package/src/components/modals/loading-dialog.js +0 -69
  1053. package/src/components/modals/modal-tabs.js +0 -126
  1054. package/src/components/modals/overwrite-map-modal.d.ts +0 -18
  1055. package/src/components/modals/overwrite-map-modal.js +0 -97
  1056. package/src/components/modals/provider-modal-container.d.ts +0 -12
  1057. package/src/components/modals/provider-modal-container.js +0 -60
  1058. package/src/components/modals/save-map-modal.d.ts +0 -32
  1059. package/src/components/modals/save-map-modal.js +0 -244
  1060. package/src/components/modals/share-map-modal.js +0 -208
  1061. package/src/components/modals/status-panel.js +0 -95
  1062. package/src/components/modals/storage-map-viewer.js +0 -177
  1063. package/src/components/notification-panel/notification-item.js +0 -132
  1064. package/src/components/notification-panel.js +0 -72
  1065. package/src/components/plot-container.js +0 -228
  1066. package/src/components/side-panel/common/dataset-info.js +0 -45
  1067. package/src/components/side-panel/common/dataset-tag.js +0 -55
  1068. package/src/components/side-panel/common/dataset-title.js +0 -146
  1069. package/src/components/side-panel/common/source-data-catalog.js +0 -61
  1070. package/src/components/side-panel/common/source-data-selector.js +0 -79
  1071. package/src/components/side-panel/filter-manager.js +0 -105
  1072. package/src/components/side-panel/filter-panel/filter-panel-header.js +0 -83
  1073. package/src/components/side-panel/filter-panel/filter-panel.js +0 -126
  1074. package/src/components/side-panel/interaction-manager.js +0 -46
  1075. package/src/components/side-panel/interaction-panel/brush-config.js +0 -51
  1076. package/src/components/side-panel/interaction-panel/interaction-panel.js +0 -115
  1077. package/src/components/side-panel/interaction-panel/tooltip-config/tooltip-chicklet.js +0 -199
  1078. package/src/components/side-panel/interaction-panel/tooltip-config.js +0 -190
  1079. package/src/components/side-panel/layer-manager.js +0 -290
  1080. package/src/components/side-panel/layer-panel/color-palette.js +0 -90
  1081. package/src/components/side-panel/layer-panel/color-range-selector.js +0 -353
  1082. package/src/components/side-panel/layer-panel/color-selector.js +0 -196
  1083. package/src/components/side-panel/layer-panel/column-selector.js +0 -70
  1084. package/src/components/side-panel/layer-panel/custom-palette.js +0 -296
  1085. package/src/components/side-panel/layer-panel/custom-picker.js +0 -88
  1086. package/src/components/side-panel/layer-panel/dimension-scale-selector.js +0 -48
  1087. package/src/components/side-panel/layer-panel/layer-column-config.js +0 -113
  1088. package/src/components/side-panel/layer-panel/layer-config-group.js +0 -237
  1089. package/src/components/side-panel/layer-panel/layer-panel-header.js +0 -236
  1090. package/src/components/side-panel/layer-panel/layer-panel.js +0 -171
  1091. package/src/components/side-panel/layer-panel/layer-type-dropdown-list.js +0 -105
  1092. package/src/components/side-panel/layer-panel/layer-type-list-item.js +0 -83
  1093. package/src/components/side-panel/layer-panel/layer-type-selector.js +0 -89
  1094. package/src/components/side-panel/layer-panel/single-color-palette.js +0 -98
  1095. package/src/components/side-panel/layer-panel/text-label-panel.js +0 -179
  1096. package/src/components/side-panel/layer-panel/vis-config-by-field-selector.js +0 -163
  1097. package/src/components/side-panel/layer-panel/vis-config-slider.js +0 -82
  1098. package/src/components/side-panel/layer-panel/vis-config-switch.js +0 -87
  1099. package/src/components/side-panel/map-manager.js +0 -114
  1100. package/src/components/side-panel/map-style-panel/map-layer-selector.js +0 -128
  1101. package/src/components/side-panel/map-style-panel/map-style-selector.js +0 -111
  1102. package/src/components/side-panel/panel-dropdown.js +0 -53
  1103. package/src/components/side-panel/panel-header-action.js +0 -106
  1104. package/src/components/side-panel/panel-header.js +0 -321
  1105. package/src/components/side-panel/panel-tab.js +0 -62
  1106. package/src/components/side-panel/panel-title.js +0 -32
  1107. package/src/components/side-panel/panel-toggle.js +0 -70
  1108. package/src/components/side-panel/side-bar.js +0 -136
  1109. package/src/components/side-panel.d.ts +0 -33
  1110. package/src/components/side-panel.js +0 -253
  1111. package/src/connect/keplergl-connect.js +0 -47
  1112. package/src/connect/with-local-selector.d.ts +0 -11
  1113. package/src/connect/with-local-selector.js +0 -67
  1114. package/src/constants/action-types.d.ts +0 -135
  1115. package/src/constants/action-types.js +0 -184
  1116. package/src/constants/color-ranges.js +0 -72
  1117. package/src/constants/default-settings.js +0 -994
  1118. package/src/deckgl-layers/3d-building-layer/3d-building-layer.js +0 -56
  1119. package/src/deckgl-layers/3d-building-layer/3d-building-utils.js +0 -192
  1120. package/src/deckgl-layers/column-layer/enhanced-column-layer.js +0 -63
  1121. package/src/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.js +0 -70
  1122. package/src/deckgl-layers/hexagon-layer/enhanced-hexagon-layer.js +0 -70
  1123. package/src/deckgl-layers/layer-utils/cluster-utils.js +0 -76
  1124. package/src/deckgl-layers/layer-utils/cpu-aggregator.js +0 -583
  1125. package/src/deckgl-layers/layer-utils/shader-utils.js +0 -41
  1126. package/src/deckgl-layers/line-layer/line-layer.js +0 -122
  1127. package/src/deckgl-layers/svg-icon-layer/scatterplot-icon-layer.js +0 -57
  1128. package/src/deckgl-layers/svg-icon-layer/svg-icon-layer.js +0 -85
  1129. package/src/layers/aggregation-layer.js +0 -356
  1130. package/src/layers/arc-layer/arc-layer-icon.js +0 -67
  1131. package/src/layers/arc-layer/arc-layer.js +0 -221
  1132. package/src/layers/base-layer.js +0 -1545
  1133. package/src/layers/cluster-layer/cluster-layer.js +0 -125
  1134. package/src/layers/geojson-layer/geojson-layer-icon.js +0 -68
  1135. package/src/layers/geojson-layer/geojson-layer.js +0 -344
  1136. package/src/layers/geojson-layer/geojson-utils.js +0 -179
  1137. package/src/layers/grid-layer/grid-layer-icon.js +0 -53
  1138. package/src/layers/grid-layer/grid-layer.js +0 -95
  1139. package/src/layers/grid-layer/grid-utils.js +0 -71
  1140. package/src/layers/h3-hexagon-layer/h3-hexagon-layer.js +0 -264
  1141. package/src/layers/h3-hexagon-layer/h3-utils.js +0 -65
  1142. package/src/layers/heatmap-layer/heatmap-layer.js +0 -226
  1143. package/src/layers/hexagon-layer/hexagon-layer.js +0 -95
  1144. package/src/layers/hexagon-layer/hexagon-utils.js +0 -63
  1145. package/src/layers/icon-layer/icon-info-modal.js +0 -155
  1146. package/src/layers/icon-layer/icon-layer.js +0 -324
  1147. package/src/layers/index.d.ts +0 -128
  1148. package/src/layers/index.js +0 -72
  1149. package/src/layers/layer-factory.d.ts +0 -149
  1150. package/src/layers/layer-factory.js +0 -480
  1151. package/src/layers/layer-text-label.js +0 -62
  1152. package/src/layers/layer-update.js +0 -71
  1153. package/src/layers/line-layer/line-layer.js +0 -161
  1154. package/src/layers/mapbox-utils.js +0 -195
  1155. package/src/layers/mapboxgl-layer.js +0 -154
  1156. package/src/layers/point-layer/point-layer.js +0 -414
  1157. package/src/layers/s2-geometry-layer/s2-geometry-layer.js +0 -265
  1158. package/src/layers/s2-geometry-layer/s2-utils.js +0 -36
  1159. package/src/layers/scenegraph-layer/scenegraph-layer.js +0 -182
  1160. package/src/layers/trip-layer/trip-layer.js +0 -295
  1161. package/src/layers/trip-layer/trip-utils.js +0 -169
  1162. package/src/localization/en.js +0 -504
  1163. package/src/localization/formatted-message.js +0 -33
  1164. package/src/localization/index.js +0 -32
  1165. package/src/localization/locales.js +0 -46
  1166. package/src/middleware/index.js +0 -34
  1167. package/src/processors/data-processor.d.ts +0 -57
  1168. package/src/processors/data-processor.js +0 -684
  1169. package/src/processors/file-handler.d.ts +0 -46
  1170. package/src/processors/file-handler.js +0 -220
  1171. package/src/processors/index.js +0 -44
  1172. package/src/reducers/combined-updaters.d.ts +0 -26
  1173. package/src/reducers/combined-updaters.js +0 -198
  1174. package/src/reducers/composer-helpers.d.ts +0 -32
  1175. package/src/reducers/composer-helpers.js +0 -70
  1176. package/src/reducers/core.d.ts +0 -25
  1177. package/src/reducers/core.js +0 -97
  1178. package/src/reducers/index.d.ts +0 -118
  1179. package/src/reducers/index.js +0 -53
  1180. package/src/reducers/map-state-updaters.d.ts +0 -64
  1181. package/src/reducers/map-state-updaters.js +0 -224
  1182. package/src/reducers/map-state.js +0 -47
  1183. package/src/reducers/map-style-updaters.d.ts +0 -76
  1184. package/src/reducers/map-style-updaters.js +0 -541
  1185. package/src/reducers/map-style.js +0 -53
  1186. package/src/reducers/provider-state-updaters.d.ts +0 -88
  1187. package/src/reducers/provider-state-updaters.js +0 -428
  1188. package/src/reducers/provider-state.js +0 -53
  1189. package/src/reducers/root.js +0 -230
  1190. package/src/reducers/types.d.ts +0 -10
  1191. package/src/reducers/ui-state-updaters.d.ts +0 -198
  1192. package/src/reducers/ui-state-updaters.js +0 -766
  1193. package/src/reducers/ui-state.js +0 -73
  1194. package/src/reducers/vis-state-merger.d.ts +0 -78
  1195. package/src/reducers/vis-state-merger.js +0 -557
  1196. package/src/reducers/vis-state-selectors.js +0 -35
  1197. package/src/reducers/vis-state-updaters.d.ts +0 -534
  1198. package/src/reducers/vis-state-updaters.js +0 -2137
  1199. package/src/reducers/vis-state.js +0 -155
  1200. package/src/schemas/dataset-schema.js +0 -141
  1201. package/src/schemas/index.d.ts +0 -24
  1202. package/src/schemas/index.js +0 -42
  1203. package/src/schemas/schema-manager.d.ts +0 -229
  1204. package/src/schemas/schema-manager.js +0 -228
  1205. package/src/schemas/schema.d.ts +0 -47
  1206. package/src/schemas/schema.js +0 -90
  1207. package/src/schemas/versions.d.ts +0 -23
  1208. package/src/schemas/vis-state-schema.js +0 -754
  1209. package/src/styles/base.js +0 -1620
  1210. package/src/styles/media-breakpoints.js +0 -47
  1211. package/src/typedefs/README.md +0 -3
  1212. package/src/typedefs/deck.gl__core.d.ts +0 -64
  1213. package/src/typedefs/deck.gl__mesh-layers.d.ts +0 -33
  1214. package/src/utils/aggregate-utils.js +0 -71
  1215. package/src/utils/color-utils.js +0 -115
  1216. package/src/utils/data-scale-utils.d.ts +0 -26
  1217. package/src/utils/data-scale-utils.js +0 -61
  1218. package/src/utils/data-utils.d.ts +0 -46
  1219. package/src/utils/data-utils.js +0 -447
  1220. package/src/utils/dataset-utils.d.ts +0 -10
  1221. package/src/utils/dataset-utils.js +0 -255
  1222. package/src/utils/dom-to-image.js +0 -533
  1223. package/src/utils/dom-utils.js +0 -354
  1224. package/src/utils/export-utils.js +0 -247
  1225. package/src/utils/filter-utils.d.ts +0 -192
  1226. package/src/utils/filter-utils.js +0 -1114
  1227. package/src/utils/gl-utils.js +0 -42
  1228. package/src/utils/gpu-filter-utils.d.ts +0 -28
  1229. package/src/utils/gpu-filter-utils.js +0 -253
  1230. package/src/utils/index.d.ts +0 -5
  1231. package/src/utils/index.js +0 -55
  1232. package/src/utils/interaction-utils.d.ts +0 -36
  1233. package/src/utils/interaction-utils.js +0 -185
  1234. package/src/utils/layer-utils.d.ts +0 -78
  1235. package/src/utils/layer-utils.js +0 -206
  1236. package/src/utils/map-style-utils/mapbox-gl-style-editor.js +0 -201
  1237. package/src/utils/notifications-utils.js +0 -83
  1238. package/src/utils/observe-dimensions.d.ts +0 -18
  1239. package/src/utils/observe-dimensions.js +0 -115
  1240. package/src/utils/split-map-utils.js +0 -104
  1241. package/src/utils/table-utils/data-container-utils.d.ts +0 -43
  1242. package/src/utils/table-utils/data-container-utils.js +0 -61
  1243. package/src/utils/table-utils/data-row.d.ts +0 -65
  1244. package/src/utils/table-utils/data-row.js +0 -54
  1245. package/src/utils/table-utils/index.d.ts +0 -1
  1246. package/src/utils/table-utils/indexed-data-container.d.ts +0 -26
  1247. package/src/utils/table-utils/indexed-data-container.js +0 -152
  1248. package/src/utils/table-utils/kepler-table.d.ts +0 -114
  1249. package/src/utils/table-utils/kepler-table.js +0 -508
  1250. package/src/utils/table-utils/row-data-container.d.ts +0 -30
  1251. package/src/utils/table-utils/row-data-container.js +0 -151
  1252. package/src/utils/utils.js +0 -202
  1253. /package/src/actions/{index.js → index.ts} +0 -0
  1254. /package/src/components/common/data-table/{canvas.js → canvas.tsx} +0 -0
  1255. /package/src/components/editor/{constants.js → constants.ts} +0 -0
  1256. /package/src/components/filters/{components.js → components.ts} +0 -0
  1257. /package/src/components/filters/{index.js → index.ts} +0 -0
  1258. /package/src/components/map/{map-control-toolbar.js → map-control-toolbar.tsx} +0 -0
  1259. /package/src/components/modals/export-map-modal/{components.js → components.tsx} +0 -0
  1260. /package/src/components/modals/{modal-dialog.js → modal-dialog.tsx} +0 -0
  1261. /package/src/components/side-panel/{cloud-storage-dropdown.js → cloud-storage-dropdown.tsx} +0 -0
  1262. /package/src/components/side-panel/{custom-panel.js → custom-panel.tsx} +0 -0
  1263. /package/src/components/side-panel/layer-panel/{layer-configurator.js → layer-configurator.tsx} +0 -0
  1264. /package/src/constants/{color-palette.js → color-palette.ts} +0 -0
  1265. /package/src/constants/{custom-color-ranges.js → custom-color-ranges.ts} +0 -0
  1266. /package/src/constants/{index.js → index.ts} +0 -0
  1267. /package/src/constants/{keyevent.js → keyevent.ts} +0 -0
  1268. /package/src/constants/{tooltip.js → tooltip.ts} +0 -0
  1269. /package/src/constants/{user-feedbacks.js → user-feedbacks.ts} +0 -0
  1270. /package/src/constants/{user-guides.js → user-guides.ts} +0 -0
  1271. /package/src/layers/cluster-layer/{cluster-layer-icon.js → cluster-layer-icon.tsx} +0 -0
  1272. /package/src/layers/{default-layer-icon.js → default-layer-icon.tsx} +0 -0
  1273. /package/src/layers/h3-hexagon-layer/{h3-hexagon-layer-icon.js → h3-hexagon-layer-icon.tsx} +0 -0
  1274. /package/src/layers/heatmap-layer/{heatmap-layer-icon.js → heatmap-layer-icon.tsx} +0 -0
  1275. /package/src/layers/hexagon-layer/{hexagon-layer-icon.js → hexagon-layer-icon.tsx} +0 -0
  1276. /package/src/layers/icon-layer/{icon-layer-icon.js → icon-layer-icon.tsx} +0 -0
  1277. /package/src/layers/line-layer/{line-layer-icon.js → line-layer-icon.tsx} +0 -0
  1278. /package/src/layers/point-layer/{point-layer-icon.js → point-layer-icon.tsx} +0 -0
  1279. /package/src/layers/s2-geometry-layer/{s2-layer-icon.js → s2-layer-icon.tsx} +0 -0
  1280. /package/src/layers/scenegraph-layer/{scenegraph-info-modal.js → scenegraph-info-modal.tsx} +0 -0
  1281. /package/src/layers/scenegraph-layer/{scenegraph-layer-icon.js → scenegraph-layer-icon.tsx} +0 -0
  1282. /package/src/layers/trip-layer/{trip-info-modal.js → trip-info-modal.tsx} +0 -0
  1283. /package/src/layers/trip-layer/{trip-layer-icon.js → trip-layer-icon.tsx} +0 -0
  1284. /package/src/layers/{types.js → types.ts} +0 -0
  1285. /package/src/reducers/{composers.js → composers.ts} +0 -0
  1286. /package/src/schemas/{map-state-schema.js → map-state-schema.ts} +0 -0
  1287. /package/src/schemas/{map-style-schema.js → map-style-schema.ts} +0 -0
  1288. /package/src/schemas/{schema-utils.js → schema-utils.ts} +0 -0
  1289. /package/src/schemas/{versions.js → versions.ts} +0 -0
  1290. /package/src/styles/{index.js → index.ts} +0 -0
  1291. /package/src/tasks/{tasks.js → tasks.ts} +0 -0
  1292. /package/src/templates/{export-map-html.js → export-map-html.ts} +0 -0
  1293. /package/src/utils/{locale-utils.js → locale-utils.ts} +0 -0
  1294. /package/src/utils/{map-info-utils.js → map-info-utils.ts} +0 -0
  1295. /package/src/utils/map-style-utils/{mapbox-utils.js → mapbox-utils.ts} +0 -0
  1296. /package/src/utils/{mapbox-utils.js → mapbox-utils.ts} +0 -0
  1297. /package/src/utils/{projection-utils.js → projection-utils.ts} +0 -0
  1298. /package/src/utils/{searcher-utils.js → searcher-utils.ts} +0 -0
  1299. /package/src/utils/table-utils/{data-container-interface.d.ts → data-container-interface.ts} +0 -0
  1300. /package/src/utils/table-utils/{index.js → index.ts} +0 -0
@@ -0,0 +1,1743 @@
1
+ // Copyright (c) 2022 Uber Technologies, Inc.
2
+ //
3
+ // Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ // of this software and associated documentation files (the "Software"), to deal
5
+ // in the Software without restriction, including without limitation the rights
6
+ // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ // copies of the Software, and to permit persons to whom the Software is
8
+ // furnished to do so, subject to the following conditions:
9
+ //
10
+ // The above copyright notice and this permission notice shall be included in
11
+ // all copies or substantial portions of the Software.
12
+ //
13
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ // THE SOFTWARE.
20
+
21
+ import {console as Console} from 'global/window';
22
+ import keymirror from 'keymirror';
23
+ import {CollisionFilterExtension, DataFilterExtension} from '@deck.gl/extensions';
24
+ import {COORDINATE_SYSTEM, Layer as DeckLayer} from '@deck.gl/core';
25
+ import {_PointLabelLayer as PointLabelLayer} from '@deck.gl/carto';
26
+ import DefaultLayerIcon from './default-layer-icon';
27
+ import {diffUpdateTriggers} from './layer-update';
28
+ import {rgb} from 'd3-color';
29
+
30
+ import {
31
+ ALL_FIELD_TYPES,
32
+ NO_VALUE_COLOR,
33
+ SCALE_TYPES,
34
+ CHANNEL_SCALES,
35
+ FIELD_OPTS,
36
+ SCALE_FUNC,
37
+ CHANNEL_SCALE_SUPPORTED_FIELDS,
38
+ MAX_GPU_FILTERS,
39
+ UNKNOWN_COLOR,
40
+ ZOOM_LEVEL_LIMITS
41
+ } from 'constants/default-settings';
42
+ import {ColorRange, COLOR_RANGES, hexColor} from 'constants/color-ranges';
43
+ import {DataVizColors} from 'constants/custom-color-ranges';
44
+ import {
45
+ LAYER_VIS_CONFIGS,
46
+ DEFAULT_TEXT_LABEL,
47
+ DEFAULT_COLOR_UI,
48
+ DEFAULT_HIGHLIGHT_COLOR,
49
+ DEFAULT_LAYER_LABEL,
50
+ LayerVisConfig,
51
+ LayerVisConfigSettings
52
+ } from './layer-factory';
53
+
54
+ import {generateHashId, isPlainObject} from 'utils/utils';
55
+
56
+ import {getLatLngBounds, notNullorUndefined} from 'utils/data-utils';
57
+ import {getSampleData} from 'utils/table-utils/data-container-utils';
58
+
59
+ import {hexToRgb, getColorGroupByName, reverseColorRange, checkColorOrFallback} from 'utils/color-utils';
60
+ import {getMaskExtensionProps} from 'utils/layer-utils';
61
+ import {scaleOrdinal} from 'd3-scale';
62
+
63
+ import {RGBColor, RGBAColor, MapState, Filter, Datasets, ValueOf, NestedPartial} from 'reducers';
64
+ import {LayerTextLabel, ColorUI} from './layer-factory';
65
+ import {KeplerTable} from '../utils';
66
+ import {DataContainerInterface} from 'utils/table-utils/data-container-interface';
67
+ import {Field, GpuFilter} from 'utils/table-utils/kepler-table';
68
+ import React from 'react';
69
+
70
+ export type LayerColumn = {value: string | null; fieldIdx: number; optional?: boolean};
71
+
72
+ export type LayerColumns = {
73
+ [key: string]: LayerColumn;
74
+ };
75
+ export type VisualChannelDomain = number[] | string[];
76
+ export type VisualChannelField = Field | null;
77
+ export type VisualChannelScale = keyof typeof SCALE_TYPES;
78
+
79
+ export type LayerBaseConfig = {
80
+ dataId: string | null;
81
+ label: string;
82
+ color: RGBColor;
83
+
84
+ columns: LayerColumns;
85
+ isVisible: boolean;
86
+ isConfigActive: boolean;
87
+ highlightColor: RGBColor | RGBAColor;
88
+ hidden: boolean;
89
+
90
+ visConfig: LayerVisConfig;
91
+ textLabel: LayerTextLabel[];
92
+
93
+ colorUI: {
94
+ color: ColorUI;
95
+ colorRange: ColorUI;
96
+ };
97
+ animation: {
98
+ enabled: boolean;
99
+ domain?: null;
100
+ };
101
+ };
102
+
103
+ export type LayerColorConfig = {
104
+ colorField: VisualChannelField;
105
+ colorDomain: VisualChannelDomain;
106
+ colorScale: VisualChannelScale;
107
+ };
108
+ export type LayerSizeConfig = {
109
+ // color by size, domain is set by filters, field, scale type
110
+ sizeDomain: VisualChannelDomain;
111
+ sizeScale: VisualChannelScale;
112
+ sizeField: VisualChannelField;
113
+ };
114
+ export type LayerHeightConfig = {
115
+ heightField: VisualChannelField;
116
+ heightDomain: VisualChannelDomain;
117
+ heightScale: VisualChannelScale;
118
+ };
119
+ export type LayerStrokeColorConfig = {
120
+ strokeColorField: VisualChannelField;
121
+ strokeColorDomain: VisualChannelDomain;
122
+ strokeColorScale: VisualChannelScale;
123
+ };
124
+ export type LayerCoverageConfig = {
125
+ coverageField: VisualChannelField;
126
+ coverageDomain: VisualChannelDomain;
127
+ coverageScale: VisualChannelScale;
128
+ };
129
+ export type LayerRadiusConfig = {
130
+ radiusField: VisualChannelField;
131
+ radiusDomain: VisualChannelDomain;
132
+ radiusScale: VisualChannelScale;
133
+ };
134
+ export type LayerWeightConfig = {
135
+ weightField: VisualChannelField;
136
+ };
137
+
138
+ export type VisualChannels = {[key: string]: VisualChannel};
139
+
140
+ export type VisualChannelAggregation = 'colorAggregation' | 'sizeAggregation';
141
+
142
+ export type VisualChannel = {
143
+ property: string;
144
+ field: string;
145
+ scale: string;
146
+ domain: string;
147
+ range: string;
148
+ key: string;
149
+ channelScaleType: string;
150
+ nullValue?: any;
151
+ defaultMeasure?: any;
152
+ accessor?: string;
153
+ condition?: (config: any) => boolean;
154
+ getAttributeValue?: (config: any) => (d: any) => any;
155
+
156
+ // TODO: define defaultValue
157
+ defaultValue?: any;
158
+ // TODO: define fixed
159
+ fixed?: any;
160
+
161
+ supportedFieldTypes?: Array<keyof typeof ALL_FIELD_TYPES>;
162
+
163
+ aggregation?: VisualChannelAggregation;
164
+ };
165
+
166
+ export type VisualChannelDescription = {
167
+ label: string;
168
+ measure: string;
169
+ };
170
+
171
+ export type ColumnPairs = {[key: string]: {pair: string; fieldPairKey: string}};
172
+
173
+ type ColumnValidator = (column: LayerColumn, columns: LayerColumns, allFields: Field[]) => boolean;
174
+
175
+ export type UpdateTriggers = {
176
+ [key: string]: UpdateTrigger;
177
+ };
178
+ export type UpdateTrigger = {
179
+ [key: string]: {};
180
+ };
181
+ export type LayerBounds = [number, number, number, number];
182
+ export type FindDefaultLayerPropsReturnValue = {props: any[]; foundLayers?: any[]};
183
+ /**
184
+ * Approx. number of points to sample in a large data set
185
+ */
186
+ export const LAYER_ID_LENGTH = 6;
187
+
188
+ // Note, this is is SVG of solid circle encoded as data-uri
189
+ const FALLBACK_ICON =
190
+ 'data:image/svg+xml;charset=utf-8;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4NCiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgcj0iNTAiLz4NCjwvc3ZnPg==';
191
+
192
+ const MAX_SAMPLE_SIZE = 5000;
193
+ const defaultDomain: [number, number] = [0, 1];
194
+ const dataFilterExtension = new DataFilterExtension({filterSize: MAX_GPU_FILTERS});
195
+ const collisionFilterExtension = new CollisionFilterExtension();
196
+
197
+ const defaultDataAccessor = dc => d => d;
198
+ const defaultGetFieldValue = (field, d) => field.valueAccessor(d);
199
+ const scaleIdentity = v => v;
200
+
201
+ export const OVERLAY_TYPE = keymirror({
202
+ deckgl: null,
203
+ mapboxgl: null
204
+ });
205
+
206
+ export const layerColors = Object.values(DataVizColors).map(hexToRgb);
207
+ function* generateColor(): Generator<RGBColor> {
208
+ let index = 0;
209
+ while (index < layerColors.length + 1) {
210
+ if (index === layerColors.length) {
211
+ index = 0;
212
+ }
213
+ yield layerColors[index++];
214
+ }
215
+ }
216
+
217
+ export const colorMaker = generateColor();
218
+
219
+ class Layer {
220
+ id: string;
221
+ // TODO: define meta
222
+ meta: {};
223
+ visConfigSettings: {
224
+ [key: string]: ValueOf<LayerVisConfigSettings>;
225
+ };
226
+ config: LayerBaseConfig;
227
+ // TODO: define _oldDataUpdateTriggers
228
+ _oldDataUpdateTriggers: any;
229
+
230
+ constructor(
231
+ props: {
232
+ id?: string;
233
+ } & Partial<LayerBaseConfig> = {}
234
+ ) {
235
+ this.id = props.id || generateHashId(LAYER_ID_LENGTH);
236
+ // meta
237
+ this.meta = {};
238
+
239
+ // legendSettings
240
+ this.legendSettings = {};
241
+
242
+ // visConfigSettings
243
+ this.visConfigSettings = {};
244
+
245
+ // interactivitySettings
246
+ this._interactivitySettings = {};
247
+
248
+ this.config = this.getDefaultLayerConfig({
249
+ columns: this.getLayerColumns(),
250
+ ...props
251
+ });
252
+ }
253
+
254
+ get layerIcon(): React.ElementType {
255
+ return DefaultLayerIcon;
256
+ }
257
+
258
+ get overlayType(): keyof typeof OVERLAY_TYPE {
259
+ return OVERLAY_TYPE.deckgl;
260
+ }
261
+
262
+ get type(): string | null {
263
+ return null;
264
+ }
265
+
266
+ get name() {
267
+ return this.type;
268
+ }
269
+
270
+ get isAggregated() {
271
+ return false;
272
+ }
273
+
274
+ get requiredLayerColumns(): string[] {
275
+ return [];
276
+ }
277
+
278
+ get optionalColumns(): string[] {
279
+ return [];
280
+ }
281
+
282
+ get noneLayerDataAffectingProps() {
283
+ return ['label', 'opacity', 'thickness', 'isVisible', 'hidden'];
284
+ }
285
+
286
+ get visualChannels(): VisualChannels {
287
+ return {
288
+ color: {
289
+ property: 'color',
290
+ field: 'colorField',
291
+ scale: 'colorScale',
292
+ domain: 'colorDomain',
293
+ range: 'colorRange',
294
+ key: 'color',
295
+ channelScaleType: CHANNEL_SCALES.color,
296
+ nullValue: NO_VALUE_COLOR,
297
+ defaultValue: config => config.color
298
+ },
299
+ size: {
300
+ property: 'size',
301
+ field: 'sizeField',
302
+ scale: 'sizeScale',
303
+ domain: 'sizeDomain',
304
+ range: 'sizeRange',
305
+ key: 'size',
306
+ channelScaleType: CHANNEL_SCALES.size,
307
+ nullValue: 0,
308
+ defaultValue: 1
309
+ }
310
+ };
311
+ }
312
+
313
+ get columnValidators(): {[key: string]: ColumnValidator} {
314
+ return {};
315
+ }
316
+ /*
317
+ * Column pairs maps layer column to a specific field pairs,
318
+ * By default, it is set to null
319
+ */
320
+ get columnPairs(): ColumnPairs | null {
321
+ return null;
322
+ }
323
+
324
+ /*
325
+ * Default point column pairs, can be used for point based layers: point, icon etc.
326
+ */
327
+ get defaultPointColumnPairs(): ColumnPairs {
328
+ return {
329
+ lat: {pair: 'lng', fieldPairKey: 'lat'},
330
+ lng: {pair: 'lat', fieldPairKey: 'lng'}
331
+ };
332
+ }
333
+
334
+ /*
335
+ * Default link column pairs, can be used for link based layers: arc, line etc
336
+ */
337
+ get defaultLinkColumnPairs(): ColumnPairs {
338
+ return {
339
+ lat0: {pair: 'lng0', fieldPairKey: 'lat'},
340
+ lng0: {pair: 'lat0', fieldPairKey: 'lng'},
341
+ lat1: {pair: 'lng1', fieldPairKey: 'lat'},
342
+ lng1: {pair: 'lat1', fieldPairKey: 'lng'}
343
+ };
344
+ }
345
+
346
+ /**
347
+ * Return a React component for to render layer instructions in a modal
348
+ * @returns {object} - an object
349
+ * @example
350
+ * return {
351
+ * id: 'iconInfo',
352
+ * template: IconInfoModal,
353
+ * modalProps: {
354
+ * title: 'How to draw icons'
355
+ * };
356
+ * }
357
+ */
358
+ get layerInfoModal(): any {
359
+ return null;
360
+ }
361
+
362
+ get interactivitySettings() {
363
+ return this._interactivitySettings;
364
+ }
365
+
366
+ set interactivitySettings(interactivitySettings) {
367
+ this._interactivitySettings = interactivitySettings;
368
+ }
369
+
370
+ get hasTooltip() {
371
+ return Boolean(
372
+ this.interactivitySettings?.hover?.fields.length ||
373
+ this.interactivitySettings?.click?.fields.length
374
+ );
375
+ }
376
+
377
+ get hasInteractivity() {
378
+ return Boolean(this.hasTooltip && this.interactivitySettings?.enabled);
379
+ }
380
+
381
+ /*
382
+ * Given a dataset, automatically find props to create layer based on it
383
+ * and return the props and previous found layers.
384
+ * By default, no layers will be found
385
+ */
386
+ static findDefaultLayerProps(
387
+ dataset: KeplerTable,
388
+ foundLayers?: any[]
389
+ ): FindDefaultLayerPropsReturnValue {
390
+ return {props: [], foundLayers};
391
+ }
392
+
393
+ /**
394
+ * Given a array of preset required column names
395
+ * found field that has the same name to set as layer column
396
+ *
397
+ * @param {object} defaultFields
398
+ * @param {object[]} allFields
399
+ * @returns {object[] | null} all possible required layer column pairs
400
+ */
401
+ static findDefaultColumnField(defaultFields, allFields) {
402
+ // find all matched fields for each required col
403
+ const requiredColumns = Object.keys(defaultFields).reduce((prev, key) => {
404
+ const requiredFields = allFields.filter(
405
+ f => f.name === defaultFields[key] || defaultFields[key].includes(f.name)
406
+ );
407
+
408
+ prev[key] = requiredFields.length
409
+ ? requiredFields.map(f => ({
410
+ value: f.name,
411
+ fieldIdx: f.fieldIdx
412
+ }))
413
+ : null;
414
+ return prev;
415
+ }, {});
416
+
417
+ if (!Object.values(requiredColumns).every(Boolean)) {
418
+ // if any field missing, return null
419
+ return null;
420
+ }
421
+
422
+ return this.getAllPossibleColumnParis(requiredColumns);
423
+ }
424
+
425
+ static getAllPossibleColumnParis(requiredColumns) {
426
+ // for multiple matched field for one required column, return multiple
427
+ // combinations, e. g. if column a has 2 matched, column b has 3 matched
428
+ // 6 possible column pairs will be returned
429
+ const allKeys = Object.keys(requiredColumns);
430
+ const pointers = allKeys.map((k, i) => (i === allKeys.length - 1 ? -1 : 0));
431
+ const countPerKey = allKeys.map(k => requiredColumns[k].length);
432
+ // TODO: Better typings
433
+ const pairs: any[] = [];
434
+
435
+ /* eslint-disable no-loop-func */
436
+ while (incrementPointers(pointers, countPerKey, pointers.length - 1)) {
437
+ const newPair = pointers.reduce((prev, cuur, i) => {
438
+ prev[allKeys[i]] = requiredColumns[allKeys[i]][cuur];
439
+ return prev;
440
+ }, {});
441
+
442
+ pairs.push(newPair);
443
+ }
444
+ /* eslint-enable no-loop-func */
445
+
446
+ // recursively increment pointers
447
+ function incrementPointers(pts, counts, index) {
448
+ if (index === 0 && pts[0] === counts[0] - 1) {
449
+ // nothing to increment
450
+ return false;
451
+ }
452
+
453
+ if (pts[index] + 1 < counts[index]) {
454
+ pts[index] = pts[index] + 1;
455
+ return true;
456
+ }
457
+
458
+ pts[index] = 0;
459
+ return incrementPointers(pts, counts, index - 1);
460
+ }
461
+
462
+ return pairs;
463
+ }
464
+
465
+ static hexToRgb(c) {
466
+ return hexToRgb(c);
467
+ }
468
+
469
+ getDefaultLayerConfig(
470
+ props: Partial<LayerBaseConfig> = {}
471
+ ): LayerBaseConfig & Partial<LayerColorConfig & LayerSizeConfig> {
472
+ return {
473
+ dataId: props.dataId || null,
474
+ visibilityByZoom: {
475
+ min: props.visibilityByZoom?.min || ZOOM_LEVEL_LIMITS.min,
476
+ max: props.visibilityByZoom?.max || ZOOM_LEVEL_LIMITS.max
477
+ },
478
+ label: props.label || DEFAULT_LAYER_LABEL,
479
+ color: props.color || colorMaker.next().value,
480
+ columns: props.columns || {},
481
+ isVisible: props.isVisible || false,
482
+ isConfigActive: props.isConfigActive || false,
483
+ highlightColor: props.highlightColor || DEFAULT_HIGHLIGHT_COLOR,
484
+ hidden: props.hidden || false,
485
+
486
+ // TODO: refactor this into separate visual Channel config
487
+ // color by field, domain is set by filters, field, scale type
488
+ colorField: null,
489
+ colorDomain: [0, 1],
490
+ colorScale: SCALE_TYPES.quantile,
491
+
492
+ // color by size, domain is set by filters, field, scale type
493
+ sizeDomain: [0, 1],
494
+ sizeScale: SCALE_TYPES.linear,
495
+ sizeField: null,
496
+ radiusField: null,
497
+
498
+ visConfig: {},
499
+
500
+ textLabel: [DEFAULT_TEXT_LABEL],
501
+
502
+ colorUI: {
503
+ color: DEFAULT_COLOR_UI,
504
+ colorRange: DEFAULT_COLOR_UI
505
+ },
506
+ animation: {enabled: false}
507
+ };
508
+ }
509
+
510
+ /**
511
+ * Get the description of a visualChannel config
512
+ * @param key
513
+ * @returns
514
+ */
515
+ getVisualChannelDescription(key: string): VisualChannelDescription {
516
+ // e.g. label: Color, measure: Vehicle Type
517
+ const channel = this.visualChannels[key];
518
+ if (!channel) return {label: '', measure: ''};
519
+ const rangeSettings = this.visConfigSettings[channel.range];
520
+ const fieldSettings = this.config[channel.field];
521
+ const label = rangeSettings?.label;
522
+ return {
523
+ label: typeof label === 'function' ? label(this.config) : label,
524
+ measure: fieldSettings
525
+ ? fieldSettings.displayName || fieldSettings.name
526
+ : channel.defaultMeasure
527
+ };
528
+ }
529
+
530
+ /**
531
+ * Assign a field to layer column, return column config
532
+ * @param key - Column Key
533
+ * @param field - Selected field
534
+ * @returns {{}} - Column config
535
+ */
536
+ assignColumn(key: string, field: Field): LayerColumns {
537
+ // field value could be null for optional columns
538
+ const update = field
539
+ ? {
540
+ value: field.name,
541
+ fieldIdx: field.fieldIdx
542
+ }
543
+ : {value: null, fieldIdx: -1};
544
+
545
+ return {
546
+ ...this.config.columns,
547
+ [key]: {
548
+ ...this.config.columns[key],
549
+ ...update
550
+ }
551
+ };
552
+ }
553
+
554
+ /**
555
+ * Assign a field pair to column config, return column config
556
+ * @param key - Column Key
557
+ * @param pair - field Pair
558
+ * @returns {object} - Column config
559
+ */
560
+ assignColumnPairs(key, pair) {
561
+ if (!this.columnPairs || !this.columnPairs?.[key]) {
562
+ // should not end in this state
563
+ return this.config.columns;
564
+ }
565
+
566
+ const {pair: partnerKey, fieldPairKey} = this.columnPairs?.[key];
567
+ const {fieldPairKey: partnerFieldPairKey} = this.columnPairs?.[partnerKey];
568
+
569
+ return {
570
+ ...this.config.columns,
571
+ [key]: pair[fieldPairKey],
572
+ [partnerKey]: pair[partnerFieldPairKey]
573
+ };
574
+ }
575
+
576
+ /**
577
+ * Calculate a radius zoom multiplier to render points, so they are visible in all zoom level
578
+ * @param {object} mapState
579
+ * @param {number} mapState.zoom - actual zoom
580
+ * @param {number | void} mapState.zoomOffset - zoomOffset when render in the plot container for export image
581
+ * @returns {number}
582
+ */
583
+ getZoomFactor({zoom, zoomOffset = 0}) {
584
+ return Math.pow(2, Math.max(14 - zoom + zoomOffset, 0));
585
+ }
586
+
587
+ /**
588
+ * Calculate a elevation zoom multiplier to render points, so they are visible in all zoom level
589
+ * @param {object} mapState
590
+ * @param {number} mapState.zoom - actual zoom
591
+ * @param {number | void} mapState.zoomOffset - zoomOffset when render in the plot container for export image
592
+ * @returns {number}
593
+ */
594
+ getElevationZoomFactor({zoom, zoomOffset = 0}: {zoom: number; zoomOffset?: number}) {
595
+ return this.config.visConfig.enableElevationZoomFactor
596
+ ? Math.pow(2, Math.max(8 - zoom + zoomOffset, 0))
597
+ : 1;
598
+ }
599
+
600
+ formatLayerData(datasets: Datasets, oldLayerData?: any) {
601
+ return {};
602
+ }
603
+
604
+ renderLayer(...args: any[]): any[] {
605
+ return [];
606
+ }
607
+
608
+ getHoverData(object, dataContainer: DataContainerInterface, fields: Field[]) {
609
+ if (!object) {
610
+ return null;
611
+ }
612
+
613
+ // By default, each entry of layerData should have an index of a row in the original data container.
614
+ // Each layer can implement its own getHoverData method
615
+ return dataContainer.row(object.index);
616
+ }
617
+
618
+ /**
619
+ * When change layer type, try to copy over layer configs as much as possible
620
+ * @param configToCopy - config to copy over
621
+ * @param visConfigSettings - visConfig settings of config to copy
622
+ */
623
+ assignConfigToLayer(configToCopy, visConfigSettings) {
624
+ // don't deep merge visualChannel field
625
+ // don't deep merge color range, reversed: is not a key by default
626
+ const shallowCopy = ['colorRange', 'strokeColorRange'].concat(
627
+ Object.values(this.visualChannels).map(v => v.field)
628
+ );
629
+
630
+ // don't copy over domain and animation
631
+ const notToCopy = ['animation'].concat(Object.values(this.visualChannels).map(v => v.domain));
632
+ // if range is for the same property group copy it, otherwise, not to copy
633
+ Object.values(this.visualChannels).forEach(v => {
634
+ if (
635
+ configToCopy.visConfig[v.range] &&
636
+ this.visConfigSettings[v.range] &&
637
+ visConfigSettings[v.range].group !== this.visConfigSettings[v.range].group
638
+ ) {
639
+ notToCopy.push(v.range);
640
+ }
641
+ });
642
+
643
+ // don't copy over visualChannel range
644
+ const currentConfig = this.config;
645
+ const copied = this.copyLayerConfig(currentConfig, configToCopy, {
646
+ shallowCopy,
647
+ notToCopy
648
+ });
649
+ this.updateLayerConfig(copied);
650
+ // validate visualChannel field type and scale types
651
+ Object.keys(this.visualChannels).forEach(channel => {
652
+ this.validateVisualChannel(channel);
653
+ });
654
+ }
655
+
656
+ /*
657
+ * Recursively copy config over to an empty layer
658
+ * when received saved config, or copy config over from a different layer type
659
+ * make sure to only copy over value to existing keys
660
+ * @param {object} currentConfig - existing config to be override
661
+ * @param {object} configToCopy - new Config to copy over
662
+ * @param {string[]} shallowCopy - array of properties to not to be deep copied
663
+ * @param {string[]} notToCopy - array of properties not to copy
664
+ * @returns {object} - copied config
665
+ */
666
+ copyLayerConfig(
667
+ currentConfig,
668
+ configToCopy,
669
+ {shallowCopy = [], notToCopy = []}: {shallowCopy?: string[]; notToCopy?: string[]} = {}
670
+ ) {
671
+ const copied = {};
672
+ Object.keys(currentConfig).forEach(key => {
673
+ if (
674
+ isPlainObject(currentConfig[key]) &&
675
+ isPlainObject(configToCopy[key]) &&
676
+ !shallowCopy.includes(key) &&
677
+ !notToCopy.includes(key)
678
+ ) {
679
+ // recursively assign object value
680
+ copied[key] = this.copyLayerConfig(currentConfig[key], configToCopy[key], {
681
+ shallowCopy,
682
+ notToCopy
683
+ });
684
+ } else if (notNullorUndefined(configToCopy[key]) && !notToCopy.includes(key)) {
685
+ // copy
686
+ copied[key] = configToCopy[key];
687
+ } else {
688
+ // keep existing
689
+ copied[key] = currentConfig[key];
690
+ }
691
+ });
692
+
693
+ return copied;
694
+ }
695
+
696
+ registerVisConfig(layerVisConfigs: {
697
+ [key: string]: keyof LayerVisConfigSettings | ValueOf<LayerVisConfigSettings>;
698
+ }) {
699
+ Object.keys(layerVisConfigs).forEach(item => {
700
+ const configItem = layerVisConfigs[item];
701
+ if (typeof configItem === 'string' && LAYER_VIS_CONFIGS[configItem]) {
702
+ // if assigned one of default LAYER_CONFIGS
703
+ this.config.visConfig[item] = LAYER_VIS_CONFIGS[configItem].defaultValue;
704
+ this.visConfigSettings[item] = LAYER_VIS_CONFIGS[configItem];
705
+ } else if (
706
+ typeof configItem === 'object' &&
707
+ ['type', 'defaultValue'].every(p => configItem.hasOwnProperty(p))
708
+ ) {
709
+ // if provided customized visConfig, and has type && defaultValue
710
+ // TODO: further check if customized visConfig is valid
711
+ this.config.visConfig[item] = configItem.defaultValue;
712
+ this.visConfigSettings[item] = configItem;
713
+ }
714
+ });
715
+ }
716
+
717
+ getLayerColumns() {
718
+ const columnValidators = this.columnValidators;
719
+ const required = this.requiredLayerColumns.reduce(
720
+ (accu, key) => ({
721
+ ...accu,
722
+ [key]: columnValidators[key]
723
+ ? {value: null, fieldIdx: -1, validator: columnValidators[key]}
724
+ : {value: null, fieldIdx: -1}
725
+ }),
726
+ {}
727
+ );
728
+ const optional = this.optionalColumns.reduce(
729
+ (accu, key) => ({
730
+ ...accu,
731
+ [key]: {value: null, fieldIdx: -1, optional: true}
732
+ }),
733
+ {}
734
+ );
735
+
736
+ return {...required, ...optional};
737
+ }
738
+
739
+ updateLayerConfig<LayerConfig extends LayerBaseConfig = LayerBaseConfig>(
740
+ newConfig: Partial<LayerConfig>
741
+ ): Layer {
742
+ this.config = {...this.config, ...newConfig};
743
+ return this;
744
+ }
745
+
746
+ updateLayerVisConfig(newVisConfig) {
747
+ this.config.visConfig = {...this.config.visConfig, ...newVisConfig};
748
+ return this;
749
+ }
750
+
751
+ updateLayerColorUI(prop: string, newConfig: NestedPartial<ColorUI>): Layer {
752
+ const {colorUI: previous, visConfig} = this.config;
753
+
754
+ if (!isPlainObject(newConfig) || typeof prop !== 'string') {
755
+ return this;
756
+ }
757
+
758
+ const colorUIProp = Object.entries(newConfig).reduce((accu, [key, value]) => {
759
+ return {
760
+ ...accu,
761
+ [key]: isPlainObject(accu[key]) && isPlainObject(value) ? {...accu[key], ...value} : value
762
+ };
763
+ }, previous[prop] || DEFAULT_COLOR_UI);
764
+
765
+ const colorUI = {
766
+ ...previous,
767
+ [prop]: colorUIProp
768
+ };
769
+
770
+ this.updateLayerConfig({colorUI});
771
+ // if colorUI[prop] is colorRange. If type is hexColor then it's also a range
772
+ const isColorRange =
773
+ visConfig[prop] && (visConfig[prop].colors || visConfig[prop].type === hexColor);
774
+
775
+ if (isColorRange) {
776
+ this.updateColorUIByColorRange(newConfig, prop);
777
+ this.updateColorRangeByColorUI(newConfig, previous, prop);
778
+ this.updateCustomPalette(newConfig, previous, prop);
779
+ }
780
+
781
+ return this;
782
+ }
783
+
784
+ updateCustomPalette(newConfig, previous, prop) {
785
+ if (!newConfig.colorRangeConfig || !newConfig.colorRangeConfig.custom) {
786
+ return;
787
+ }
788
+
789
+ const {colorUI, visConfig} = this.config;
790
+
791
+ if (!visConfig[prop]) return;
792
+ const {colors} = visConfig[prop];
793
+ const customPalette = {
794
+ ...colorUI[prop].customPalette,
795
+ name: 'Custom Palette',
796
+ colors: [...colors]
797
+ };
798
+ this.updateLayerConfig({
799
+ colorUI: {
800
+ ...colorUI,
801
+ [prop]: {
802
+ ...colorUI[prop],
803
+ customPalette
804
+ }
805
+ }
806
+ });
807
+ }
808
+ /**
809
+ * if open dropdown and prop is color range
810
+ * Automatically set colorRangeConfig's step, reversed and type
811
+ * @param {*} newConfig
812
+ * @param {*} prop
813
+ */
814
+ updateColorUIByColorRange(newConfig, prop) {
815
+ if (typeof newConfig.showDropdown !== 'number') return;
816
+
817
+ const {colorUI, visConfig} = this.config;
818
+ this.updateLayerConfig({
819
+ colorUI: {
820
+ ...colorUI,
821
+ [prop]: {
822
+ ...colorUI[prop],
823
+ colorRangeConfig: {
824
+ ...colorUI[prop].colorRangeConfig,
825
+ type: visConfig[prop].type,
826
+ steps: visConfig[prop].colors?.length,
827
+ reversed: Boolean(visConfig[prop].reversed),
828
+ hexColumn: this.getHexColumn(prop),
829
+ isHexColumn: this.isColoredByColorColumn(prop)
830
+ }
831
+ }
832
+ }
833
+ });
834
+ }
835
+
836
+ // eslint-disable-next-line complexity
837
+ updateColorRangeByColorUI(newConfig, previous, prop) {
838
+ // only update colorRange if changes in UI is made to 'reversed', 'steps' or steps
839
+ const shouldUpdate =
840
+ newConfig.colorRangeConfig &&
841
+ ['reversed', 'steps'].some(
842
+ key =>
843
+ newConfig.colorRangeConfig.hasOwnProperty(key) &&
844
+ newConfig.colorRangeConfig[key] !==
845
+ (previous[prop] || DEFAULT_COLOR_UI).colorRangeConfig[key]
846
+ );
847
+ if (!shouldUpdate) return;
848
+
849
+ const {colorUI, visConfig} = this.config;
850
+ const {steps, reversed} = colorUI[prop].colorRangeConfig;
851
+ const colorRange = visConfig[prop];
852
+ // find based on step or reversed
853
+ let update;
854
+ if (newConfig.colorRangeConfig.hasOwnProperty('steps')) {
855
+ const group = getColorGroupByName(colorRange);
856
+
857
+ if (group) {
858
+ const sameGroup = COLOR_RANGES.filter(cr => getColorGroupByName(cr) === group);
859
+
860
+ update = sameGroup.find(cr => cr.colors.length === steps);
861
+
862
+ if (update && colorRange.reversed) {
863
+ update = reverseColorRange(true, update);
864
+ }
865
+
866
+ if (update && colorRange.colorMap) {
867
+ update = this.updateColorMap(prop, colorRange.colorMap, update);
868
+ }
869
+ }
870
+ }
871
+
872
+ if (newConfig.colorRangeConfig.hasOwnProperty('reversed')) {
873
+ update = reverseColorRange(reversed, update || colorRange);
874
+ }
875
+
876
+ if (update) {
877
+ this.updateLayerVisConfig({[prop]: update});
878
+ }
879
+ }
880
+
881
+ updateColorMap(prop, colorMap, colorRange) {
882
+ // @ts-ignore
883
+ const {field, domain} = Object.values(this.visualChannels).find(value => value.range === prop);
884
+ const type = this.config[field]?.type;
885
+
886
+ if (type === 'string' || type === 'boolean' || type === 'date') {
887
+ return this.updateCategoryColorMap(colorMap, this.config[domain], colorRange);
888
+ }
889
+
890
+ // If no type or type is not string, boolean or date
891
+ return this.updateNumericColorMap(colorMap, this.config[domain], colorRange);
892
+ }
893
+
894
+ updateCategoryColorMap(colorMap, domain, colorRange) {
895
+ const colors = colorRange.colors;
896
+ const assignedCategories = [];
897
+ if (colorRange.type === hexColor) {
898
+ return {
899
+ ...colorRange,
900
+ colorMap: []
901
+ };
902
+ }
903
+ const newColorMap = colorMap.slice(0, colors.length).map((cMap, index) => {
904
+ assignedCategories.push(cMap[0]);
905
+ return [cMap[0], colors[index]];
906
+ });
907
+ const unassignedColors = colors.slice(newColorMap.length, colors.length);
908
+
909
+ for (const color of unassignedColors) {
910
+ const category = domain.find(d => !assignedCategories.includes(d));
911
+ if (!category) {
912
+ break;
913
+ }
914
+ assignedCategories.push(category);
915
+ newColorMap.push([category, color]);
916
+ }
917
+ return {
918
+ ...colorRange,
919
+ colorMap: newColorMap
920
+ };
921
+ }
922
+
923
+ updateNumericColorMap(colorMap, domain, update) {
924
+ const colors = update.colors;
925
+ let newColorMap = colorMap.slice(0, colors.length);
926
+
927
+ newColorMap = newColorMap.map((cMap, index) => {
928
+ const value = index === newColorMap.length - 1 ? null : cMap[0];
929
+ return [value, colors[index]];
930
+ });
931
+ const unassignedColors = colors.slice(newColorMap.length, colors.length);
932
+
933
+ if (unassignedColors.length > 0) {
934
+ const colorMapValues = colorMap.map(c => c[0]).filter(c => typeof c === 'number');
935
+ const maxValue = Math.max(...colorMapValues, domain[domain.length - 1]);
936
+ const prevValue = newColorMap[newColorMap.length - 2][0];
937
+ const step = (maxValue - prevValue) / (unassignedColors.length + 1);
938
+ newColorMap[newColorMap.length - 1][0] = prevValue + step;
939
+
940
+ for (const [i, color] of unassignedColors.entries()) {
941
+ const value = i === unassignedColors.length - 1 ? null : prevValue + (step * (i + 2));
942
+ newColorMap.push([value, color]);
943
+ }
944
+ }
945
+ return {
946
+ ...update,
947
+ colorMap: newColorMap
948
+ };
949
+ }
950
+
951
+ /**
952
+ * Check whether layer has all columns
953
+ * @returns yes or no
954
+ */
955
+ hasAllColumns(): boolean {
956
+ const {columns} = this.config;
957
+ return (
958
+ columns &&
959
+ Object.values(columns).every(v => {
960
+ return Boolean(v.optional || (v.value && v.fieldIdx > -1));
961
+ })
962
+ );
963
+ }
964
+
965
+ /**
966
+ * Check whether layer has data
967
+ *
968
+ * @param {Array | Object} layerData
969
+ * @returns {boolean} yes or no
970
+ */
971
+ hasLayerData(layerData) {
972
+ if (!layerData) {
973
+ return false;
974
+ }
975
+ return Boolean(layerData.data && layerData.data.length);
976
+ }
977
+
978
+ isValidToSave(): boolean {
979
+ return Boolean(this.type && this.hasAllColumns());
980
+ }
981
+
982
+ shouldRenderLayer(data): boolean {
983
+ return (
984
+ Boolean(this.type) &&
985
+ this.hasAllColumns() &&
986
+ this.hasLayerData(data) &&
987
+ typeof this.renderLayer === 'function'
988
+ );
989
+ }
990
+
991
+ getColorScale(colorScale: string, colorDomain: VisualChannelDomain, colorRange: ColorRange) {
992
+ if (colorRange.type === hexColor) {
993
+ return (_, color) => {
994
+ const {r, g, b} = rgb(color);
995
+ return [r, g, b].some(isNaN) ? UNKNOWN_COLOR : [r, g, b];
996
+ };
997
+ } else if (Array.isArray(colorRange.colorMap)) {
998
+ const cMap = new Map();
999
+ colorRange.colorMap.forEach(([k, v]) => {
1000
+ cMap.set(k, typeof v === 'string' ? hexToRgb(v) : v);
1001
+ });
1002
+
1003
+ const scale = SCALE_FUNC[colorScale]()
1004
+ .domain(cMap.keys())
1005
+ .range(cMap.values())
1006
+ .unknown(UNKNOWN_COLOR);
1007
+ return scale;
1008
+ }
1009
+ return this.getVisChannelScale(colorScale, colorDomain, colorRange.colors.map(hexToRgb));
1010
+ }
1011
+
1012
+ getCustomMarkersScale(range, fallbackIcon) {
1013
+ let unknownValue = fallbackIcon || FALLBACK_ICON;
1014
+ if (!range) {
1015
+ return () => unknownValue;
1016
+ }
1017
+
1018
+ const mapping = new Map();
1019
+
1020
+ if (range.othersMarker) {
1021
+ unknownValue = range.othersMarker;
1022
+ }
1023
+ for (const {value, markerUrl} of range.markerMap) {
1024
+ if (markerUrl) {
1025
+ mapping.set(value, markerUrl);
1026
+ }
1027
+ }
1028
+
1029
+ // @ts-ignore d3 scale
1030
+ const scale = scaleOrdinal()
1031
+ .domain(Array.from(mapping.keys()))
1032
+ .range(Array.from(mapping.values()))
1033
+ .unknown(unknownValue);
1034
+ return scale;
1035
+ }
1036
+
1037
+ /**
1038
+ * Mapping from visual channels to deck.gl accesors
1039
+ * @param {Object} param Parameters
1040
+ * @param {Function} param.dataAccessor Access kepler.gl layer data from deck.gl layer
1041
+ * @param {import('utils/table-utils/data-container-interface').DataContainerInterface} param.dataContainer DataContainer to use use with dataAccessor
1042
+ * @return {Object} attributeAccessors - deck.gl layer attribute accessors
1043
+ */
1044
+ getAttributeAccessors({
1045
+ dataAccessor = defaultDataAccessor,
1046
+ dataContainer
1047
+ }: {
1048
+ dataAccessor?: typeof defaultDataAccessor;
1049
+ dataContainer: DataContainerInterface;
1050
+ }) {
1051
+ const attributeAccessors: {[key: string]: any} = {};
1052
+
1053
+ // eslint-disable-next-line complexity
1054
+ Object.keys(this.visualChannels).forEach(channel => {
1055
+ const {
1056
+ field,
1057
+ fixed,
1058
+ scale,
1059
+ domain,
1060
+ range,
1061
+ accessor,
1062
+ defaultValue,
1063
+ getAttributeValue,
1064
+ nullValue,
1065
+ channelScaleType,
1066
+ aggregation
1067
+ } = this.visualChannels[channel];
1068
+
1069
+ const shouldGetScale = Boolean(
1070
+ (scale || channelScaleType === CHANNEL_SCALES.identity) && this.config[field]
1071
+ );
1072
+
1073
+ if (shouldGetScale) {
1074
+ const isFixed = fixed && this.config.visConfig[fixed];
1075
+ // It's important to declare as const all the parameters that we are going to be use in the getEncodedChannelValue call
1076
+ // otherwise, the oldLayerData parameter in formatLayerData method will be wrong (you can check the formatLayerData TileLayer method in Builder as example)
1077
+ const fieldConfig = this.config[field];
1078
+ const aggregationValue = this.config.visConfig[aggregation];
1079
+
1080
+ const scaleFunction =
1081
+ channelScaleType === CHANNEL_SCALES.identity
1082
+ ? scaleIdentity
1083
+ : channelScaleType === CHANNEL_SCALES.color
1084
+ ? this.getColorScale(
1085
+ this.config[scale],
1086
+ this.config[domain],
1087
+ this.config.visConfig[range]
1088
+ )
1089
+ : channelScaleType === CHANNEL_SCALES.customMarker
1090
+ ? this.getCustomMarkersScale(
1091
+ this.config.visConfig[range],
1092
+ this.config.visConfig.customMarkersUrl
1093
+ )
1094
+ : this.getVisChannelScale(
1095
+ this.config[scale],
1096
+ this.config[domain],
1097
+ this.config.visConfig[range],
1098
+ isFixed
1099
+ );
1100
+
1101
+ attributeAccessors[accessor] = d =>
1102
+ this.getEncodedChannelValue({
1103
+ channel,
1104
+ dataContainer,
1105
+ scale: scaleFunction,
1106
+ data: dataAccessor(dataContainer)(d),
1107
+ field: fieldConfig,
1108
+ _aggregation: aggregationValue,
1109
+ nullValue
1110
+ });
1111
+ } else if (typeof getAttributeValue === 'function') {
1112
+ attributeAccessors[accessor] = getAttributeValue(this.config);
1113
+ } else {
1114
+ attributeAccessors[accessor] =
1115
+ typeof defaultValue === 'function' ? defaultValue(this.config) : defaultValue;
1116
+ }
1117
+
1118
+ if (!(accessor in attributeAccessors)) {
1119
+ Console.warn(`Failed to provide accessor function for ${accessor || channel}`);
1120
+ }
1121
+ });
1122
+
1123
+ return attributeAccessors;
1124
+ }
1125
+
1126
+ getVisChannelScale(
1127
+ scale: string,
1128
+ domain: VisualChannelDomain,
1129
+ range: any,
1130
+ fixed?: boolean
1131
+ ): () => any | null {
1132
+ if (scale === SCALE_TYPES.ordinal) {
1133
+ return SCALE_FUNC[scale]()
1134
+ .domain(domain.slice(0, range.length))
1135
+ .range(range)
1136
+ .unknown(UNKNOWN_COLOR);
1137
+ }
1138
+
1139
+ // for `count` aggregation, we domain is actually `[0, Infinity]` so it doesn't make sense
1140
+ // to use it, so skip specyfying this domains
1141
+ const domainIsInfinite = domain && (domain[0] === 0 && domain[1] === Infinity);
1142
+ const scaleFactory = SCALE_FUNC[fixed ? 'linear' : scale];
1143
+ // @ts-ignore d3-scale type
1144
+ let result = scaleFactory();
1145
+ if (domain && !domainIsInfinite) {
1146
+ result = result.domain(domain);
1147
+ }
1148
+ return result.range(fixed ? domain : range);
1149
+ }
1150
+
1151
+ /**
1152
+ * Get longitude and latitude bounds of the data.
1153
+ * @param {import('utils/table-utils/data-container-interface').DataContainerInterface} dataContainer DataContainer to calculate bounds for.
1154
+ * @param {(d: {index: number}, dc: import('utils/table-utils/data-container-interface').DataContainerInterface) => number[]} getPosition Access kepler.gl layer data from deck.gl layer
1155
+ * @return {number[]|null} bounds of the data.
1156
+ */
1157
+ getPointsBounds(dataContainer, getPosition) {
1158
+ // no need to loop through the entire dataset
1159
+ // get a sample of data to calculate bounds
1160
+ const sampleData =
1161
+ dataContainer.numRows() > MAX_SAMPLE_SIZE
1162
+ ? getSampleData(dataContainer, MAX_SAMPLE_SIZE)
1163
+ : dataContainer;
1164
+
1165
+ const points = sampleData.mapIndex(getPosition);
1166
+
1167
+ const latBounds = getLatLngBounds(points, 1, [-90, 90]);
1168
+ const lngBounds = getLatLngBounds(points, 0, [-180, 180]);
1169
+
1170
+ if (!latBounds || !lngBounds) {
1171
+ return null;
1172
+ }
1173
+
1174
+ return [lngBounds[0], latBounds[0], lngBounds[1], latBounds[1]];
1175
+ }
1176
+
1177
+ getChangedTriggers(dataUpdateTriggers) {
1178
+ const triggerChanged = diffUpdateTriggers(dataUpdateTriggers, this._oldDataUpdateTriggers);
1179
+ this._oldDataUpdateTriggers = dataUpdateTriggers;
1180
+
1181
+ return triggerChanged;
1182
+ }
1183
+
1184
+ getEncodedChannelValue({
1185
+ channel,
1186
+ scale,
1187
+ data,
1188
+ field,
1189
+ dataContainer,
1190
+ // In builder we overwrite the getValue function and we use the _aggregation parameter in spatial index layers as the QuadkeyLayer.
1191
+ _aggregation,
1192
+ nullValue = NO_VALUE_COLOR,
1193
+ getValue = defaultGetFieldValue
1194
+ }: {
1195
+ channel: string;
1196
+ scale: (...value) => any;
1197
+ data: any[];
1198
+ field: VisualChannelField;
1199
+ dataContainer: any;
1200
+ _aggregation: any;
1201
+ nullValue?: RGBAColor;
1202
+ getValue?: typeof defaultGetFieldValue;
1203
+ }) {
1204
+ // @ts-expect-error TODO: VisualChannelField better typing
1205
+ const {type} = field;
1206
+ const value = getValue(field, data);
1207
+ const channelConfig = this.config.visConfig[this.visualChannels[channel].range];
1208
+ const channelField = this.config[this.visualChannels[channel].field];
1209
+ let colorColumnValue: any;
1210
+
1211
+ if (channelConfig?.type === hexColor) {
1212
+ const columnField = {
1213
+ id: channelField.colorColumn,
1214
+ name: channelField.colorColumn,
1215
+ fieldIdx: channelField.colorColumnIdx,
1216
+ valueAccessor: d => {
1217
+ return dataContainer.valueAt(d.index, channelField.colorColumnIdx);
1218
+ }
1219
+ };
1220
+
1221
+ colorColumnValue = getValue(columnField, data);
1222
+ } else if (!notNullorUndefined(value)) {
1223
+ return nullValue;
1224
+ }
1225
+
1226
+ let attributeValue;
1227
+ if (type === ALL_FIELD_TYPES.timestamp) {
1228
+ // shouldn't need to convert here
1229
+ // scale Function should take care of it
1230
+ attributeValue = scale(new Date(value), colorColumnValue);
1231
+ } else {
1232
+ attributeValue = scale(value, colorColumnValue);
1233
+ }
1234
+
1235
+ if (!notNullorUndefined(attributeValue)) {
1236
+ attributeValue = nullValue;
1237
+ }
1238
+
1239
+ return attributeValue;
1240
+ }
1241
+
1242
+ updateMeta(meta) {
1243
+ this.meta = {...this.meta, ...meta};
1244
+ }
1245
+
1246
+ updateLayerLegend(settings) {
1247
+ this.legendSettings = settings;
1248
+ }
1249
+
1250
+ // @ts-expect-error
1251
+ getDataUpdateTriggers({filteredIndex, id, allData}: KeplerTable): any {
1252
+ const {columns} = this.config;
1253
+
1254
+ return {
1255
+ getData: {datasetId: id, allData, columns, filteredIndex},
1256
+ getMeta: {datasetId: id, allData, columns},
1257
+ ...(this.config.textLabel || []).reduce(
1258
+ (accu, tl, i) => ({
1259
+ ...accu,
1260
+ [`getLabelCharacterSet-${i}`]: tl.field ? tl.field.name : null
1261
+ }),
1262
+ {}
1263
+ )
1264
+ };
1265
+ }
1266
+
1267
+ updateData(datasets, oldLayerData) {
1268
+ if (!this.config.dataId) {
1269
+ return {};
1270
+ }
1271
+ const dataset = this.getDataset(datasets);
1272
+ const {dataContainer} = dataset;
1273
+
1274
+ this.updateVisualChannelFields(dataset);
1275
+ this.updateHexColorDomain(dataset);
1276
+
1277
+ const getPosition = this.getPositionAccessor(dataContainer);
1278
+ const dataUpdateTriggers = this.getDataUpdateTriggers(dataset);
1279
+ const triggerChanged = this.getChangedTriggers(dataUpdateTriggers);
1280
+
1281
+ if (triggerChanged && triggerChanged.getMeta) {
1282
+ this.updateLayerMeta(dataContainer, getPosition);
1283
+ }
1284
+
1285
+ let data = [];
1286
+
1287
+ if (!(triggerChanged && triggerChanged.getData) && oldLayerData && oldLayerData.data) {
1288
+ // same data
1289
+ data = oldLayerData.data;
1290
+ } else {
1291
+ data = this.calculateDataAttribute(dataset, getPosition);
1292
+ }
1293
+
1294
+ return {data, triggerChanged};
1295
+ }
1296
+
1297
+ /**
1298
+ * Update styled fields to match ones from new dataset.
1299
+ *
1300
+ * @param {Object} dataset
1301
+ */
1302
+ updateVisualChannelFields(dataset) {
1303
+ for (const {field, range} of Object.values(this.visualChannels)) {
1304
+ const oldField = this.config[field];
1305
+ const isUsingHexColorCode = this.config.visConfig[range]?.hexColor;
1306
+ if (!oldField) {
1307
+ return;
1308
+ }
1309
+ let newDataSetField = dataset.fields.find(fd => fd.name === oldField.name) || null;
1310
+ if (isUsingHexColorCode) {
1311
+ newDataSetField = {
1312
+ ...newDataSetField,
1313
+ colorColumn: newDataSetField.colorColumn || oldField.colorColumn,
1314
+ colorColumnIdx: newDataSetField.colorColumnIdx || oldField.colorColumnIdx
1315
+ };
1316
+ }
1317
+ this.updateLayerConfig({[field]: newDataSetField});
1318
+ }
1319
+ }
1320
+
1321
+ /**
1322
+ * helper function to update one layer domain when state.data changed
1323
+ * if state.data change is due ot update filter, newFiler will be passed
1324
+ * called by updateAllLayerDomainData
1325
+ * @param datasets
1326
+ * @param newFilter
1327
+ * @returns layer
1328
+ */
1329
+ updateLayerDomain(datasets: Datasets, newFilter?: Filter): Layer {
1330
+ const table = this.getDataset(datasets);
1331
+ if (!table) {
1332
+ return this;
1333
+ }
1334
+ Object.values(this.visualChannels).forEach(channel => {
1335
+ const {scale} = channel;
1336
+ const scaleType = this.config[scale];
1337
+
1338
+ // ordinal domain is based on dataContainer, if only filter changed
1339
+ // no need to update ordinal domain
1340
+ if (!newFilter || scaleType !== SCALE_TYPES.ordinal) {
1341
+ const {domain} = channel;
1342
+ const updatedDomain = this.calculateLayerDomain(table, channel);
1343
+ this.updateLayerConfig({[domain]: updatedDomain});
1344
+ }
1345
+ });
1346
+
1347
+ return this;
1348
+ }
1349
+
1350
+ getDataset(datasets) {
1351
+ return this.config.dataId ? datasets[this.config.dataId] : null;
1352
+ }
1353
+
1354
+ /**
1355
+ * Validate visual channel field and scales based on supported field & scale type
1356
+ * @param channel
1357
+ */
1358
+ validateVisualChannel(channel: string) {
1359
+ this.validateFieldType(channel);
1360
+ this.validateScale(channel);
1361
+ }
1362
+
1363
+ /**
1364
+ * Validate field type based on channelScaleType
1365
+ */
1366
+ validateFieldType(channel: string) {
1367
+ const visualChannel = this.visualChannels[channel];
1368
+ const {field, channelScaleType, supportedFieldTypes} = visualChannel;
1369
+
1370
+ if (this.config[field]) {
1371
+ // if field is selected, check if field type is supported
1372
+ const channelSupportedFieldTypes =
1373
+ supportedFieldTypes || CHANNEL_SCALE_SUPPORTED_FIELDS[channelScaleType];
1374
+
1375
+ if (!channelSupportedFieldTypes.includes(this.config[field].type)) {
1376
+ // field type is not supported, set it back to null
1377
+ // set scale back to default
1378
+ this.updateLayerConfig({[field]: null});
1379
+ }
1380
+ }
1381
+ }
1382
+
1383
+ /**
1384
+ * Validate scale type based on aggregation
1385
+ */
1386
+ validateScale(channel) {
1387
+ const visualChannel = this.visualChannels[channel];
1388
+ const {scale, range} = visualChannel;
1389
+ if (
1390
+ !scale ||
1391
+ (this.isColoredByColorColumn(range) && this.config[scale] === SCALE_TYPES.identity)
1392
+ ) {
1393
+ // visualChannel doesn't have scale
1394
+ return;
1395
+ }
1396
+ const scaleOptions = this.getScaleOptions(channel);
1397
+ // check if current selected scale is
1398
+ // supported, if not, change to default
1399
+ if (!scaleOptions.includes(this.config[scale])) {
1400
+ this.updateLayerConfig({[scale]: scaleOptions[0]});
1401
+ }
1402
+ }
1403
+
1404
+ /**
1405
+ * Get scale options based on current field
1406
+ * @param {string} channel
1407
+ * @returns {string[]}
1408
+ */
1409
+ getScaleOptions(channel) {
1410
+ const visualChannel = this.visualChannels[channel];
1411
+ const {field, scale, channelScaleType} = visualChannel;
1412
+
1413
+ return this.config[field]
1414
+ ? FIELD_OPTS[this.config[field].type].scale[channelScaleType]
1415
+ : [this.getDefaultLayerConfig()[scale]];
1416
+ }
1417
+
1418
+ updateLayerVisualChannel(dataset: KeplerTable, channel: string) {
1419
+ const visualChannel = this.visualChannels[channel];
1420
+ this.validateVisualChannel(channel);
1421
+ // calculate layer channel domain
1422
+ const updatedDomain = this.calculateLayerDomain(dataset, visualChannel);
1423
+ this.updateLayerConfig({[visualChannel.domain]: updatedDomain});
1424
+ }
1425
+
1426
+ getVisualChannelUpdateTriggers(): UpdateTriggers {
1427
+ const updateTriggers: UpdateTriggers = {};
1428
+ Object.values(this.visualChannels).forEach(visualChannel => {
1429
+ // field range scale domain
1430
+ const {accessor, field, scale, domain, range, defaultValue, fixed} = visualChannel;
1431
+
1432
+ if (accessor) {
1433
+ updateTriggers[accessor] = {
1434
+ [field]: this.config[field],
1435
+ [scale]: this.config[scale],
1436
+ [domain]: this.config[domain],
1437
+ [range]: this.config.visConfig[range],
1438
+ defaultValue:
1439
+ typeof defaultValue === 'function' ? defaultValue(this.config) : defaultValue,
1440
+ ...(fixed ? {[fixed]: this.config.visConfig[fixed]} : {})
1441
+ };
1442
+ }
1443
+ });
1444
+ return updateTriggers;
1445
+ }
1446
+
1447
+ calculateLayerDomain(dataset, visualChannel) {
1448
+ const {scale} = visualChannel;
1449
+ const field = this.config[visualChannel.field];
1450
+ if (!field || !scale) {
1451
+ // if colorField or sizeField were set back to null
1452
+ return defaultDomain;
1453
+ }
1454
+
1455
+ const scaleType = this.config[scale];
1456
+ const dataSetField = dataset.fields.find(f => f.name === field.name);
1457
+ if (!scaleType || !dataSetField) {
1458
+ // if new dataset doesn't contain previously set field
1459
+ return defaultDomain;
1460
+ }
1461
+
1462
+ return dataset.getColumnLayerDomain(dataSetField, scaleType) || defaultDomain;
1463
+ }
1464
+
1465
+ updateHexColorDomain(dataset) {
1466
+ if (!dataset) {
1467
+ return this;
1468
+ }
1469
+ Object.values(this.visualChannels).forEach(channel => {
1470
+ const channelConfig = this.config.visConfig[channel.range];
1471
+ const field = this.config[channel.field];
1472
+
1473
+ if (channelConfig?.type === hexColor && field?.colorColumn) {
1474
+ const dataSetField = dataset.fields.find(f => f.name === field.colorColumn);
1475
+ const colors = dataset
1476
+ .getColumnLayerDomain(dataSetField, SCALE_TYPES.ordinal)
1477
+ .map(c => checkColorOrFallback(c));
1478
+ this.updateLayerVisConfig({
1479
+ [channel.range]: {...channelConfig, colors}
1480
+ });
1481
+ }
1482
+ });
1483
+
1484
+ return this;
1485
+ }
1486
+
1487
+ calculateHexColumnLegend(datasets) {
1488
+ const dataset = this.getDataset(datasets);
1489
+ if (!datasets) {
1490
+ return;
1491
+ }
1492
+
1493
+ const legendSettings = Object.keys(this.visualChannels).reduce((legends, channel) => {
1494
+ const {range, field: channelField} = this.visualChannels[channel];
1495
+ const channelConfig = this.config.visConfig[range];
1496
+ const field = this.config[channelField];
1497
+
1498
+ if (channelConfig?.type === hexColor && field?.colorColumn) {
1499
+ const dataSetField = dataset.fields.find(f => f.name === field.colorColumn);
1500
+ const legend = dataset.calculateLegend(field, dataSetField);
1501
+ legends[channel] = legend;
1502
+ }
1503
+ return legends;
1504
+ }, {});
1505
+ this.updateLayerLegend(legendSettings);
1506
+ }
1507
+
1508
+ hasHoveredObject(objectInfo) {
1509
+ return this.isLayerHovered(objectInfo) && objectInfo.object ? objectInfo.object : null;
1510
+ }
1511
+
1512
+ isLayerHovered(objectInfo): boolean {
1513
+ return objectInfo?.picked && objectInfo?.layer?.props?.id === this.id;
1514
+ }
1515
+
1516
+ getRadiusScaleByZoom(mapState: MapState, fixedRadius?: boolean) {
1517
+ const radiusChannel = Object.values(this.visualChannels).find(vc => vc.property === 'radius');
1518
+
1519
+ if (!radiusChannel) {
1520
+ return 1;
1521
+ }
1522
+
1523
+ const field = radiusChannel.field;
1524
+ const {radius} = this.config.visConfig;
1525
+
1526
+ // @ts-ignore
1527
+ return (this.config[field] ? 1 : radius) * this.getZoomFactor(mapState);
1528
+ }
1529
+
1530
+ getRadiusScale() {
1531
+ const radiusChannel = Object.values(this.visualChannels).find(vc => vc.property === 'radius');
1532
+
1533
+ if (!radiusChannel || this.config[radiusChannel.field]) {
1534
+ return 1;
1535
+ }
1536
+
1537
+ return this.config.visConfig.radius;
1538
+ }
1539
+
1540
+ getMaxMarkerSize() {
1541
+ const {radiusField, sizeField, visConfig} = this.config;
1542
+ const {radiusRange, radius} = visConfig;
1543
+ const field = radiusField || sizeField;
1544
+ return Math.ceil((field && radiusRange ? radiusRange[1] : radius));
1545
+ }
1546
+
1547
+ shouldCalculateLayerData(props: string[]) {
1548
+ return props.some(p => !this.noneLayerDataAffectingProps.includes(p));
1549
+ }
1550
+
1551
+ getBrushingExtensionProps(interactionConfig, brushingTarget?) {
1552
+ const {brush} = interactionConfig;
1553
+
1554
+ return {
1555
+ // brushing
1556
+ autoHighlight: !brush.enabled,
1557
+ brushingRadius: brush.config.size * 1000,
1558
+ brushingTarget: brushingTarget || 'source',
1559
+ brushingEnabled: brush.enabled
1560
+ };
1561
+ }
1562
+
1563
+ getDefaultDeckLayerProps({
1564
+ idx,
1565
+ gpuFilter,
1566
+ mapState,
1567
+ visible,
1568
+ maskPolygon
1569
+ }: {
1570
+ idx: number;
1571
+ gpuFilter: GpuFilter;
1572
+ mapState: MapState;
1573
+ visible: boolean;
1574
+ maskPolygon: any;
1575
+ }) {
1576
+ const maskExtensionProps = getMaskExtensionProps(maskPolygon);
1577
+ return {
1578
+ ...maskExtensionProps,
1579
+ id: this.id,
1580
+ idx,
1581
+ coordinateSystem: COORDINATE_SYSTEM.LNGLAT,
1582
+ pickable: this.hasInteractivity,
1583
+ wrapLongitude: true,
1584
+ parameters: {depthTest: Boolean(mapState.dragRotate || this.config.visConfig.enable3d)},
1585
+ hidden: this.config.hidden,
1586
+ visibilityByZoom: this.config.visibilityByZoom,
1587
+ // visconfig
1588
+ opacity: this.config.visConfig.opacity,
1589
+ highlightColor: this.config.highlightColor,
1590
+ // data filtering
1591
+ extensions: [dataFilterExtension, ...maskExtensionProps.extensions],
1592
+ filterRange: gpuFilter ? gpuFilter.filterRange : undefined,
1593
+ // layer should be visible and if splitMap, shown in to one of panel
1594
+ visible: this.config.isVisible && visible
1595
+ };
1596
+ }
1597
+
1598
+ getDefaultHoverLayerProps() {
1599
+ return {
1600
+ id: `${this.id}-hovered`,
1601
+ pickable: false,
1602
+ wrapLongitude: true,
1603
+ coordinateSystem: COORDINATE_SYSTEM.LNGLAT
1604
+ };
1605
+ }
1606
+
1607
+ renderTextLabelLayer(
1608
+ {getPosition, getRadius, radiusScale, updateTriggers, sharedProps},
1609
+ renderOpts
1610
+ ) {
1611
+ const {data} = renderOpts;
1612
+ const {textLabel, visibilityByZoom} = this.config;
1613
+ const extensions = [...sharedProps.extensions, collisionFilterExtension];
1614
+
1615
+ if (!data || !data.textLabels || !data.textLabels[0] || !data.textLabels[0].getText) {
1616
+ return [];
1617
+ }
1618
+
1619
+ const [mainLabel, secondaryLabel] = textLabel;
1620
+ const {
1621
+ alignment,
1622
+ anchor,
1623
+ color: getColor,
1624
+ field: mainField,
1625
+ outlineColor,
1626
+ size: sizeScale
1627
+ } = mainLabel;
1628
+ const {
1629
+ color: getSecondaryColor,
1630
+ field: secondaryField,
1631
+ outlineColor: secondaryOutlineColor,
1632
+ size: secondarySizeScale
1633
+ } = secondaryLabel || {};
1634
+
1635
+ return [
1636
+ new PointLabelLayer({
1637
+ ...sharedProps,
1638
+
1639
+ // Recreate layer when labels change otherwise rendering breaks
1640
+ // TODO could be more efficient with updateTriggers?
1641
+ id: `${this.id}-${mainField?.name}-${secondaryField?.name}-label`,
1642
+ data: data.data,
1643
+ visibilityByZoom,
1644
+ extensions,
1645
+
1646
+ characterSet: 'auto',
1647
+ collisionEnabled: true,
1648
+ collisionGroup: `${this.id}-labels`,
1649
+
1650
+ getText: data.textLabels[0].getText,
1651
+ getColor,
1652
+ sizeScale,
1653
+ outlineColor,
1654
+
1655
+ ...(secondaryField && {
1656
+ getSecondaryText: data.textLabels[1].getText,
1657
+ getSecondaryColor,
1658
+ secondarySizeScale,
1659
+ secondaryOutlineColor
1660
+ }),
1661
+
1662
+ // Position
1663
+ getPosition,
1664
+ getRadius,
1665
+ radiusScale,
1666
+ getTextAnchor: anchor,
1667
+ getAlignmentBaseline: alignment,
1668
+
1669
+ // Style
1670
+ fontFamily: 'Inter, sans',
1671
+ fontSettings: {sdf: true},
1672
+ fontWeight: 500,
1673
+ outlineWidth: 4,
1674
+ parameters: {
1675
+ // text will always show on top of all layers
1676
+ depthTest: false
1677
+ },
1678
+
1679
+ getFilterValue: data.getFilterValue,
1680
+ updateTriggers: {
1681
+ ...updateTriggers,
1682
+ getText: mainField?.name,
1683
+ getColor: mainField?.color,
1684
+ getTextAnchor: mainLabel.anchor,
1685
+ getAlignmentBaseline: mainLabel.alignment,
1686
+ getSecondaryText: secondaryField?.name
1687
+ }
1688
+ })
1689
+ ];
1690
+ }
1691
+
1692
+ /**
1693
+ * Create deck.gl `IconLayer` "autoPack" mode accessor for custom markers.
1694
+ *
1695
+ * @param {*} iconUrlAccessor deck.gl accessor (or value) that resolves to URL of icon for given row
1696
+ * @returns deck.gl accessor that returns UnpackedIcon ready to consume by IconLayer
1697
+ */
1698
+ getCustomMarkerIconAccessor(iconUrlAccessor, mask = true) {
1699
+ const maxIconSize = this.getMaxMarkerSize();
1700
+
1701
+ return d => {
1702
+ const wantedUrl =
1703
+ (typeof iconUrlAccessor === 'function') ? iconUrlAccessor(d) : iconUrlAccessor;
1704
+ const iconOk = Boolean(wantedUrl);
1705
+ mask = iconOk ? mask : true;
1706
+ const url = iconOk ? wantedUrl : FALLBACK_ICON;
1707
+ return {
1708
+ id: `${url}@@${maxIconSize}@${mask ? 'm' : 'c'}`,
1709
+ url,
1710
+ width: maxIconSize,
1711
+ height: maxIconSize,
1712
+ mask
1713
+ };
1714
+ };
1715
+ }
1716
+
1717
+ calculateDataAttribute(keplerTable: KeplerTable, getPosition): any {
1718
+ // implemented in subclasses
1719
+ return [];
1720
+ }
1721
+
1722
+ updateLayerMeta(dataContainer: DataContainerInterface, getPosition) {
1723
+ // implemented in subclasses
1724
+ }
1725
+
1726
+ getPositionAccessor(dataContainer?: DataContainerInterface): (...args: any[]) => any {
1727
+ // implemented in subclasses
1728
+ return () => null;
1729
+ }
1730
+
1731
+ getHexColumn(range) {
1732
+ const field = Object.values(this.visualChannels)?.find(value => value.range === range)?.field;
1733
+ if (field) {
1734
+ return this.config[field]?.colorColumn;
1735
+ }
1736
+ }
1737
+
1738
+ isColoredByColorColumn(range) {
1739
+ return this.config.visConfig[range]?.hexColor;
1740
+ }
1741
+ }
1742
+
1743
+ export default Layer;