@carto/kepler.gl 0.0.1-alpha.map-libre

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 (913) hide show
  1. package/CHANGELOG.md +939 -0
  2. package/LICENSE +19 -0
  3. package/README.md +63 -0
  4. package/actions.js +21 -0
  5. package/cloud-providers.js +21 -0
  6. package/components.js +21 -0
  7. package/constants.js +21 -0
  8. package/dist/actions/action-wrapper.js +218 -0
  9. package/dist/actions/actions.js +198 -0
  10. package/dist/actions/identity-actions.js +105 -0
  11. package/dist/actions/index.js +161 -0
  12. package/dist/actions/map-state-actions.js +112 -0
  13. package/dist/actions/map-style-actions.js +167 -0
  14. package/dist/actions/provider-actions.js +129 -0
  15. package/dist/actions/ui-state-actions.js +316 -0
  16. package/dist/actions/vis-state-actions.js +1045 -0
  17. package/dist/cloud-providers/index.js +22 -0
  18. package/dist/cloud-providers/provider.js +386 -0
  19. package/dist/components/bottom-widget.js +215 -0
  20. package/dist/components/common/action-panel.js +134 -0
  21. package/dist/components/common/animation-control/animation-control.js +126 -0
  22. package/dist/components/common/animation-control/animation-controller.js +273 -0
  23. package/dist/components/common/animation-control/animation-speed-slider.js +101 -0
  24. package/dist/components/common/animation-control/floating-time-display.js +157 -0
  25. package/dist/components/common/animation-control/playback-controls.js +278 -0
  26. package/dist/components/common/animation-control/speed-control.js +68 -0
  27. package/dist/components/common/checkbox.js +155 -0
  28. package/dist/components/common/color-legend.js +249 -0
  29. package/dist/components/common/data-table/button.js +46 -0
  30. package/dist/components/common/data-table/canvas.js +32 -0
  31. package/dist/components/common/data-table/cell-size.js +174 -0
  32. package/dist/components/common/data-table/grid.js +84 -0
  33. package/dist/components/common/data-table/index.js +514 -0
  34. package/dist/components/common/data-table/option-dropdown.js +103 -0
  35. package/dist/components/common/dataset-label.js +36 -0
  36. package/dist/components/common/error-boundary.js +83 -0
  37. package/dist/components/common/field-selector.js +282 -0
  38. package/dist/components/common/field-token.js +42 -0
  39. package/dist/components/common/file-uploader/file-drop.js +227 -0
  40. package/dist/components/common/file-uploader/file-upload-progress.js +102 -0
  41. package/dist/components/common/file-uploader/file-upload.js +304 -0
  42. package/dist/components/common/file-uploader/upload-button.js +111 -0
  43. package/dist/components/common/histogram-plot.js +102 -0
  44. package/dist/components/common/icons/add.js +64 -0
  45. package/dist/components/common/icons/anchor_window.js +62 -0
  46. package/dist/components/common/icons/arrow-down-alt.js +64 -0
  47. package/dist/components/common/icons/arrow-down-solid .js +64 -0
  48. package/dist/components/common/icons/arrow-down.js +64 -0
  49. package/dist/components/common/icons/arrow-left.js +67 -0
  50. package/dist/components/common/icons/arrow-right.js +64 -0
  51. package/dist/components/common/icons/arrow-up-alt.js +65 -0
  52. package/dist/components/common/icons/arrow-up-solid.js +64 -0
  53. package/dist/components/common/icons/arrow-up.js +64 -0
  54. package/dist/components/common/icons/base.js +110 -0
  55. package/dist/components/common/icons/bug.js +66 -0
  56. package/dist/components/common/icons/cancel.js +64 -0
  57. package/dist/components/common/icons/checkmark.js +71 -0
  58. package/dist/components/common/icons/chevron-right.js +69 -0
  59. package/dist/components/common/icons/clipboard.js +65 -0
  60. package/dist/components/common/icons/clock.js +66 -0
  61. package/dist/components/common/icons/close.js +69 -0
  62. package/dist/components/common/icons/code-alt.js +68 -0
  63. package/dist/components/common/icons/copy.js +70 -0
  64. package/dist/components/common/icons/crosshairs.js +68 -0
  65. package/dist/components/common/icons/cube-3d.js +68 -0
  66. package/dist/components/common/icons/cursor-click.js +68 -0
  67. package/dist/components/common/icons/data-table.js +65 -0
  68. package/dist/components/common/icons/db.js +65 -0
  69. package/dist/components/common/icons/delete.js +65 -0
  70. package/dist/components/common/icons/docs.js +80 -0
  71. package/dist/components/common/icons/drag-n-drop.js +66 -0
  72. package/dist/components/common/icons/draw-polygon.js +87 -0
  73. package/dist/components/common/icons/email.js +68 -0
  74. package/dist/components/common/icons/expand.js +66 -0
  75. package/dist/components/common/icons/eye-seen.js +66 -0
  76. package/dist/components/common/icons/eye-unseen.js +66 -0
  77. package/dist/components/common/icons/file-type.js +45 -0
  78. package/dist/components/common/icons/file.js +64 -0
  79. package/dist/components/common/icons/files.js +66 -0
  80. package/dist/components/common/icons/filter-funnel.js +64 -0
  81. package/dist/components/common/icons/free-window.js +62 -0
  82. package/dist/components/common/icons/gear.js +66 -0
  83. package/dist/components/common/icons/hash.js +64 -0
  84. package/dist/components/common/icons/histogram.js +64 -0
  85. package/dist/components/common/icons/index.js +612 -0
  86. package/dist/components/common/icons/info.js +78 -0
  87. package/dist/components/common/icons/layers.js +64 -0
  88. package/dist/components/common/icons/left-arrow.js +68 -0
  89. package/dist/components/common/icons/legend.js +64 -0
  90. package/dist/components/common/icons/line-chart.js +63 -0
  91. package/dist/components/common/icons/login.js +66 -0
  92. package/dist/components/common/icons/logout.js +65 -0
  93. package/dist/components/common/icons/map-icon.js +73 -0
  94. package/dist/components/common/icons/map.js +73 -0
  95. package/dist/components/common/icons/messages.js +64 -0
  96. package/dist/components/common/icons/minus.js +64 -0
  97. package/dist/components/common/icons/pause.js +64 -0
  98. package/dist/components/common/icons/picture.js +66 -0
  99. package/dist/components/common/icons/pin.js +64 -0
  100. package/dist/components/common/icons/play.js +64 -0
  101. package/dist/components/common/icons/polygon.js +89 -0
  102. package/dist/components/common/icons/rectangle.js +90 -0
  103. package/dist/components/common/icons/reduce.js +67 -0
  104. package/dist/components/common/icons/reset.js +64 -0
  105. package/dist/components/common/icons/rocket.js +64 -0
  106. package/dist/components/common/icons/save.js +66 -0
  107. package/dist/components/common/icons/save2.js +70 -0
  108. package/dist/components/common/icons/search.js +66 -0
  109. package/dist/components/common/icons/settings.js +66 -0
  110. package/dist/components/common/icons/share.js +64 -0
  111. package/dist/components/common/icons/split.js +92 -0
  112. package/dist/components/common/icons/square-select.js +66 -0
  113. package/dist/components/common/icons/swap-horizontal.js +68 -0
  114. package/dist/components/common/icons/table.js +63 -0
  115. package/dist/components/common/icons/trash.js +66 -0
  116. package/dist/components/common/icons/upload.js +65 -0
  117. package/dist/components/common/icons/vert-dots.js +102 -0
  118. package/dist/components/common/icons/vert-three-dots.js +77 -0
  119. package/dist/components/common/icons/warning.js +79 -0
  120. package/dist/components/common/image-preview.js +73 -0
  121. package/dist/components/common/info-helper.js +84 -0
  122. package/dist/components/common/item-selector/accessor.js +56 -0
  123. package/dist/components/common/item-selector/chickleted-input.js +118 -0
  124. package/dist/components/common/item-selector/dropdown-list.js +316 -0
  125. package/dist/components/common/item-selector/item-selector-submenu.js +99 -0
  126. package/dist/components/common/item-selector/item-selector.js +363 -0
  127. package/dist/components/common/item-selector/typeahead.js +496 -0
  128. package/dist/components/common/line-chart.js +125 -0
  129. package/dist/components/common/loading-spinner.js +58 -0
  130. package/dist/components/common/logo.js +92 -0
  131. package/dist/components/common/map-layer-selector.js +50 -0
  132. package/dist/components/common/modal.js +204 -0
  133. package/dist/components/common/portaled.js +317 -0
  134. package/dist/components/common/progress-bar.js +56 -0
  135. package/dist/components/common/range-brush.js +319 -0
  136. package/dist/components/common/range-plot.js +148 -0
  137. package/dist/components/common/range-slider.js +346 -0
  138. package/dist/components/common/slider/mouse-event.js +136 -0
  139. package/dist/components/common/slider/slider-bar-handle.js +122 -0
  140. package/dist/components/common/slider/slider-handle.js +167 -0
  141. package/dist/components/common/slider/slider.js +268 -0
  142. package/dist/components/common/styled-components.js +395 -0
  143. package/dist/components/common/switch.js +47 -0
  144. package/dist/components/common/time-range-slider-time-title.js +74 -0
  145. package/dist/components/common/time-range-slider.js +131 -0
  146. package/dist/components/common/time-slider-marker.js +141 -0
  147. package/dist/components/common/toolbar-item.js +67 -0
  148. package/dist/components/common/toolbar.js +33 -0
  149. package/dist/components/common/vertical-toolbar.js +22 -0
  150. package/dist/components/container.js +217 -0
  151. package/dist/components/context.js +42 -0
  152. package/dist/components/editor/constants.js +47 -0
  153. package/dist/components/editor/editor.js +274 -0
  154. package/dist/components/editor/feature-action-panel.js +154 -0
  155. package/dist/components/editor/feature-styles.js +72 -0
  156. package/dist/components/editor/handle-style.js +80 -0
  157. package/dist/components/filters/components.js +20 -0
  158. package/dist/components/filters/filter-panels/filter-panel-with-field-select.js +110 -0
  159. package/dist/components/filters/filter-panels/multi-select-filter-panel.js +80 -0
  160. package/dist/components/filters/filter-panels/new-filter-panel.js +101 -0
  161. package/dist/components/filters/filter-panels/polygon-filter-panel.js +102 -0
  162. package/dist/components/filters/filter-panels/range-filter-panel.js +80 -0
  163. package/dist/components/filters/filter-panels/single-select-filter-panel.js +80 -0
  164. package/dist/components/filters/filter-panels/time-range-filter-panel.js +92 -0
  165. package/dist/components/filters/index.js +48 -0
  166. package/dist/components/filters/multi-select-filter.js +54 -0
  167. package/dist/components/filters/polygon-filter.js +96 -0
  168. package/dist/components/filters/range-filter.js +53 -0
  169. package/dist/components/filters/single-select-filter.js +63 -0
  170. package/dist/components/filters/time-range-filter.js +86 -0
  171. package/dist/components/filters/time-widget.js +173 -0
  172. package/dist/components/geocoder/geocoder.js +315 -0
  173. package/dist/components/geocoder-panel.js +224 -0
  174. package/dist/components/index.js +1485 -0
  175. package/dist/components/injector.js +178 -0
  176. package/dist/components/kepler-gl.js +563 -0
  177. package/dist/components/map/coordinate-info.js +68 -0
  178. package/dist/components/map/layer-hover-info.js +176 -0
  179. package/dist/components/map/layer-selector-panel.js +116 -0
  180. package/dist/components/map/locale-panel.js +113 -0
  181. package/dist/components/map/map-control-panel.js +79 -0
  182. package/dist/components/map/map-control-toolbar.js +25 -0
  183. package/dist/components/map/map-control-tooltip.js +55 -0
  184. package/dist/components/map/map-control.js +80 -0
  185. package/dist/components/map/map-draw-panel.js +142 -0
  186. package/dist/components/map/map-legend-panel.js +124 -0
  187. package/dist/components/map/map-legend.js +244 -0
  188. package/dist/components/map/map-popover.js +204 -0
  189. package/dist/components/map/split-map-button.js +98 -0
  190. package/dist/components/map/toggle-3d-button.js +86 -0
  191. package/dist/components/map-container.js +562 -0
  192. package/dist/components/maps-layout.js +58 -0
  193. package/dist/components/modal-container.js +536 -0
  194. package/dist/components/modals/add-map-style-modal.js +288 -0
  195. package/dist/components/modals/cloud-tile.js +124 -0
  196. package/dist/components/modals/data-table-modal.js +249 -0
  197. package/dist/components/modals/delete-data-modal.js +54 -0
  198. package/dist/components/modals/error-display.js +51 -0
  199. package/dist/components/modals/export-data-modal.js +227 -0
  200. package/dist/components/modals/export-image-modal.js +136 -0
  201. package/dist/components/modals/export-map-modal/components.js +51 -0
  202. package/dist/components/modals/export-map-modal/export-html-map.js +141 -0
  203. package/dist/components/modals/export-map-modal/export-json-map.js +87 -0
  204. package/dist/components/modals/export-map-modal/export-map-modal.js +133 -0
  205. package/dist/components/modals/image-modal-container.js +90 -0
  206. package/dist/components/modals/load-data-modal.js +97 -0
  207. package/dist/components/modals/load-storage-map.js +288 -0
  208. package/dist/components/modals/loading-dialog.js +48 -0
  209. package/dist/components/modals/modal-dialog.js +37 -0
  210. package/dist/components/modals/modal-tabs.js +99 -0
  211. package/dist/components/modals/overwrite-map-modal.js +80 -0
  212. package/dist/components/modals/provider-modal-container.js +84 -0
  213. package/dist/components/modals/save-map-modal.js +207 -0
  214. package/dist/components/modals/share-map-modal.js +202 -0
  215. package/dist/components/modals/status-panel.js +83 -0
  216. package/dist/components/modals/storage-map-viewer.js +135 -0
  217. package/dist/components/notification-panel/notification-item.js +164 -0
  218. package/dist/components/notification-panel.js +87 -0
  219. package/dist/components/performance.js +134 -0
  220. package/dist/components/plot-container.js +275 -0
  221. package/dist/components/side-panel/cloud-storage-dropdown.js +63 -0
  222. package/dist/components/side-panel/common/dataset-info.js +43 -0
  223. package/dist/components/side-panel/common/dataset-tag.js +42 -0
  224. package/dist/components/side-panel/common/dataset-title.js +170 -0
  225. package/dist/components/side-panel/common/source-data-catalog.js +60 -0
  226. package/dist/components/side-panel/common/source-data-selector.js +120 -0
  227. package/dist/components/side-panel/custom-panel.js +60 -0
  228. package/dist/components/side-panel/filter-manager.js +132 -0
  229. package/dist/components/side-panel/filter-panel/filter-panel-header.js +70 -0
  230. package/dist/components/side-panel/filter-panel/filter-panel.js +145 -0
  231. package/dist/components/side-panel/interaction-manager.js +58 -0
  232. package/dist/components/side-panel/interaction-panel/brush-config.js +54 -0
  233. package/dist/components/side-panel/interaction-panel/interaction-panel.js +168 -0
  234. package/dist/components/side-panel/interaction-panel/tooltip-config/tooltip-chicklet.js +250 -0
  235. package/dist/components/side-panel/interaction-panel/tooltip-config.js +163 -0
  236. package/dist/components/side-panel/layer-manager.js +321 -0
  237. package/dist/components/side-panel/layer-panel/color-dimension-scale-selector.js +45 -0
  238. package/dist/components/side-panel/layer-panel/color-palette.js +83 -0
  239. package/dist/components/side-panel/layer-panel/color-range-selector.js +370 -0
  240. package/dist/components/side-panel/layer-panel/color-selector.js +226 -0
  241. package/dist/components/side-panel/layer-panel/column-selector.js +65 -0
  242. package/dist/components/side-panel/layer-panel/custom-markers-config-group.js +40 -0
  243. package/dist/components/side-panel/layer-panel/custom-palette.js +318 -0
  244. package/dist/components/side-panel/layer-panel/custom-picker.js +128 -0
  245. package/dist/components/side-panel/layer-panel/dimension-scale-selector.js +61 -0
  246. package/dist/components/side-panel/layer-panel/layer-aggregation-resolution.js +26 -0
  247. package/dist/components/side-panel/layer-panel/layer-column-config.js +93 -0
  248. package/dist/components/side-panel/layer-panel/layer-config-group.js +245 -0
  249. package/dist/components/side-panel/layer-panel/layer-configurator.js +977 -0
  250. package/dist/components/side-panel/layer-panel/layer-panel-header.js +222 -0
  251. package/dist/components/side-panel/layer-panel/layer-panel.js +201 -0
  252. package/dist/components/side-panel/layer-panel/layer-type-dropdown-list.js +89 -0
  253. package/dist/components/side-panel/layer-panel/layer-type-list-item.js +71 -0
  254. package/dist/components/side-panel/layer-panel/layer-type-selector.js +96 -0
  255. package/dist/components/side-panel/layer-panel/layer-visibility-by-zoom.js +111 -0
  256. package/dist/components/side-panel/layer-panel/single-color-palette.js +109 -0
  257. package/dist/components/side-panel/layer-panel/text-label-panel.js +175 -0
  258. package/dist/components/side-panel/layer-panel/vis-config-by-field-selector.js +174 -0
  259. package/dist/components/side-panel/layer-panel/vis-config-slider.js +90 -0
  260. package/dist/components/side-panel/layer-panel/vis-config-switch.js +84 -0
  261. package/dist/components/side-panel/map-manager.js +155 -0
  262. package/dist/components/side-panel/map-style-panel/map-layer-selector.js +106 -0
  263. package/dist/components/side-panel/map-style-panel/map-style-selector.js +78 -0
  264. package/dist/components/side-panel/panel-dropdown.js +86 -0
  265. package/dist/components/side-panel/panel-header-action.js +121 -0
  266. package/dist/components/side-panel/panel-header.js +351 -0
  267. package/dist/components/side-panel/panel-tab.js +68 -0
  268. package/dist/components/side-panel/panel-title.js +28 -0
  269. package/dist/components/side-panel/panel-toggle.js +69 -0
  270. package/dist/components/side-panel/side-bar.js +164 -0
  271. package/dist/components/side-panel.js +242 -0
  272. package/dist/connect/keplergl-connect.js +68 -0
  273. package/dist/connect/with-local-selector.js +110 -0
  274. package/dist/constants/action-types.js +180 -0
  275. package/dist/constants/color-palette.js +547 -0
  276. package/dist/constants/color-ranges.js +70 -0
  277. package/dist/constants/custom-color-ranges.js +415 -0
  278. package/dist/constants/default-settings.js +902 -0
  279. package/dist/constants/index.js +370 -0
  280. package/dist/constants/keyevent.js +47 -0
  281. package/dist/constants/tooltip.js +205 -0
  282. package/dist/constants/user-feedbacks.js +33 -0
  283. package/dist/constants/user-guides.js +44 -0
  284. package/dist/deckgl-layers/3d-building-layer/3d-building-layer.js +88 -0
  285. package/dist/deckgl-layers/3d-building-layer/3d-building-utils.js +214 -0
  286. package/dist/deckgl-layers/cluster-layer/cluster-layer.js +334 -0
  287. package/dist/deckgl-layers/column-layer/enhanced-column-layer.js +78 -0
  288. package/dist/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.js +96 -0
  289. package/dist/deckgl-layers/hexagon-layer/enhanced-hexagon-layer.js +96 -0
  290. package/dist/deckgl-layers/layer-utils/cluster-utils.js +119 -0
  291. package/dist/deckgl-layers/layer-utils/cpu-aggregator.js +643 -0
  292. package/dist/deckgl-layers/layer-utils/shader-utils.js +50 -0
  293. package/dist/deckgl-layers/line-layer/line-layer.js +111 -0
  294. package/dist/deckgl-layers/svg-icon-layer/scatterplot-icon-layer.js +78 -0
  295. package/dist/deckgl-layers/svg-icon-layer/svg-icon-layer.js +120 -0
  296. package/dist/index.js +155 -0
  297. package/dist/layers/aggregation-layer.js +416 -0
  298. package/dist/layers/arc-layer/arc-layer-icon.js +77 -0
  299. package/dist/layers/arc-layer/arc-layer.js +275 -0
  300. package/dist/layers/base-layer.js +1688 -0
  301. package/dist/layers/cluster-layer/cluster-layer-icon.js +80 -0
  302. package/dist/layers/cluster-layer/cluster-layer.js +151 -0
  303. package/dist/layers/default-layer-icon.js +87 -0
  304. package/dist/layers/geojson-layer/geojson-layer-icon.js +91 -0
  305. package/dist/layers/geojson-layer/geojson-layer.js +446 -0
  306. package/dist/layers/geojson-layer/geojson-utils.js +183 -0
  307. package/dist/layers/grid-layer/grid-layer-icon.js +136 -0
  308. package/dist/layers/grid-layer/grid-layer.js +115 -0
  309. package/dist/layers/grid-layer/grid-utils.js +62 -0
  310. package/dist/layers/h3-hexagon-layer/h3-hexagon-layer-icon.js +71 -0
  311. package/dist/layers/h3-hexagon-layer/h3-hexagon-layer.js +346 -0
  312. package/dist/layers/h3-hexagon-layer/h3-utils.js +97 -0
  313. package/dist/layers/heatmap-layer/heatmap-layer-icon.js +88 -0
  314. package/dist/layers/heatmap-layer/heatmap-layer.js +269 -0
  315. package/dist/layers/hexagon-layer/hexagon-layer-icon.js +100 -0
  316. package/dist/layers/hexagon-layer/hexagon-layer.js +120 -0
  317. package/dist/layers/hexagon-layer/hexagon-utils.js +74 -0
  318. package/dist/layers/icon-layer/icon-info-modal.js +117 -0
  319. package/dist/layers/icon-layer/icon-layer-icon.js +73 -0
  320. package/dist/layers/icon-layer/icon-layer.js +392 -0
  321. package/dist/layers/index.js +97 -0
  322. package/dist/layers/layer-factory.js +499 -0
  323. package/dist/layers/layer-text-label.js +72 -0
  324. package/dist/layers/layer-update.js +85 -0
  325. package/dist/layers/line-layer/line-layer-icon.js +79 -0
  326. package/dist/layers/line-layer/line-layer.js +209 -0
  327. package/dist/layers/mapbox-utils.js +204 -0
  328. package/dist/layers/mapboxgl-layer.js +210 -0
  329. package/dist/layers/point-layer/point-layer-icon.js +94 -0
  330. package/dist/layers/point-layer/point-layer.js +475 -0
  331. package/dist/layers/s2-geometry-layer/s2-geometry-layer.js +334 -0
  332. package/dist/layers/s2-geometry-layer/s2-layer-icon.js +70 -0
  333. package/dist/layers/s2-geometry-layer/s2-utils.js +51 -0
  334. package/dist/layers/scenegraph-layer/scenegraph-info-modal.js +48 -0
  335. package/dist/layers/scenegraph-layer/scenegraph-layer-icon.js +151 -0
  336. package/dist/layers/scenegraph-layer/scenegraph-layer.js +250 -0
  337. package/dist/layers/trip-layer/trip-info-modal.js +54 -0
  338. package/dist/layers/trip-layer/trip-layer-icon.js +89 -0
  339. package/dist/layers/trip-layer/trip-layer.js +403 -0
  340. package/dist/layers/trip-layer/trip-utils.js +204 -0
  341. package/dist/layers/types.js +47 -0
  342. package/dist/localization/en.js +480 -0
  343. package/dist/localization/formatted-message.js +45 -0
  344. package/dist/localization/index.js +60 -0
  345. package/dist/localization/locales.js +64 -0
  346. package/dist/middleware/index.js +47 -0
  347. package/dist/processors/data-processor.js +784 -0
  348. package/dist/processors/file-handler.js +432 -0
  349. package/dist/processors/index.js +106 -0
  350. package/dist/reducers/combined-updaters.js +195 -0
  351. package/dist/reducers/composer-helpers.js +110 -0
  352. package/dist/reducers/composers.js +27 -0
  353. package/dist/reducers/core.js +156 -0
  354. package/dist/reducers/index.js +139 -0
  355. package/dist/reducers/map-state-updaters.js +239 -0
  356. package/dist/reducers/map-state.js +47 -0
  357. package/dist/reducers/map-style-updaters.js +531 -0
  358. package/dist/reducers/map-style.js +46 -0
  359. package/dist/reducers/provider-state-updaters.js +541 -0
  360. package/dist/reducers/provider-state.js +46 -0
  361. package/dist/reducers/root.js +218 -0
  362. package/dist/reducers/ui-state-updaters.js +855 -0
  363. package/dist/reducers/ui-state.js +47 -0
  364. package/dist/reducers/vis-state-merger.js +615 -0
  365. package/dist/reducers/vis-state-selectors.js +52 -0
  366. package/dist/reducers/vis-state-updaters.js +2433 -0
  367. package/dist/reducers/vis-state.js +46 -0
  368. package/dist/schemas/dataset-schema.js +189 -0
  369. package/dist/schemas/index.js +132 -0
  370. package/dist/schemas/map-state-schema.js +49 -0
  371. package/dist/schemas/map-style-schema.js +122 -0
  372. package/dist/schemas/schema-manager.js +262 -0
  373. package/dist/schemas/schema-utils.js +62 -0
  374. package/dist/schemas/schema.js +114 -0
  375. package/dist/schemas/versions.js +38 -0
  376. package/dist/schemas/vis-state-schema.js +1071 -0
  377. package/dist/styles/base.js +1570 -0
  378. package/dist/styles/index.js +32 -0
  379. package/dist/styles/media-breakpoints.js +39 -0
  380. package/dist/tasks/tasks.js +122 -0
  381. package/dist/templates/export-map-html.js +45 -0
  382. package/dist/utils/aggregate-utils.js +75 -0
  383. package/dist/utils/color-utils.js +135 -0
  384. package/dist/utils/data-scale-utils.js +84 -0
  385. package/dist/utils/data-utils.js +491 -0
  386. package/dist/utils/dataset-utils.js +254 -0
  387. package/dist/utils/dom-to-image.js +557 -0
  388. package/dist/utils/dom-utils.js +425 -0
  389. package/dist/utils/export-utils.js +297 -0
  390. package/dist/utils/filter-utils.js +1286 -0
  391. package/dist/utils/gl-utils.js +35 -0
  392. package/dist/utils/gpu-filter-utils.js +261 -0
  393. package/dist/utils/index.js +226 -0
  394. package/dist/utils/interaction-utils.js +201 -0
  395. package/dist/utils/layer-utils.js +205 -0
  396. package/dist/utils/locale-utils.js +54 -0
  397. package/dist/utils/map-info-utils.js +32 -0
  398. package/dist/utils/map-style-utils/mapbox-gl-style-editor.js +212 -0
  399. package/dist/utils/map-style-utils/mapbox-utils.js +35 -0
  400. package/dist/utils/mapbox-utils.js +39 -0
  401. package/dist/utils/notifications-utils.js +89 -0
  402. package/dist/utils/observe-dimensions.js +147 -0
  403. package/dist/utils/projection-utils.js +83 -0
  404. package/dist/utils/searcher-utils.js +45 -0
  405. package/dist/utils/split-map-utils.js +108 -0
  406. package/dist/utils/table-utils/data-container-utils.js +69 -0
  407. package/dist/utils/table-utils/data-row.js +82 -0
  408. package/dist/utils/table-utils/index.js +20 -0
  409. package/dist/utils/table-utils/indexed-data-container.js +241 -0
  410. package/dist/utils/table-utils/kepler-table.js +544 -0
  411. package/dist/utils/table-utils/row-data-container.js +242 -0
  412. package/dist/utils/utils.js +234 -0
  413. package/layers.js +21 -0
  414. package/localization.js +21 -0
  415. package/middleware.js +21 -0
  416. package/package.json +281 -0
  417. package/processors.js +21 -0
  418. package/reducers.js +21 -0
  419. package/schemas.js +21 -0
  420. package/src/actions/action-wrapper.js +183 -0
  421. package/src/actions/actions.d.ts +104 -0
  422. package/src/actions/actions.js +178 -0
  423. package/src/actions/identity-actions.d.ts +53 -0
  424. package/src/actions/identity-actions.js +83 -0
  425. package/src/actions/index.d.ts +23 -0
  426. package/src/actions/index.js +42 -0
  427. package/src/actions/map-state-actions.d.ts +46 -0
  428. package/src/actions/map-state-actions.js +90 -0
  429. package/src/actions/map-style-actions.d.ts +116 -0
  430. package/src/actions/map-style-actions.js +135 -0
  431. package/src/actions/provider-actions.d.ts +203 -0
  432. package/src/actions/provider-actions.js +94 -0
  433. package/src/actions/ui-state-actions.d.ts +200 -0
  434. package/src/actions/ui-state-actions.js +272 -0
  435. package/src/actions/vis-state-actions.d.ts +502 -0
  436. package/src/actions/vis-state-actions.js +919 -0
  437. package/src/cloud-providers/index.d.ts +53 -0
  438. package/src/cloud-providers/index.js +21 -0
  439. package/src/cloud-providers/provider.js +233 -0
  440. package/src/components/bottom-widget.d.ts +33 -0
  441. package/src/components/bottom-widget.js +235 -0
  442. package/src/components/common/action-panel.d.ts +24 -0
  443. package/src/components/common/action-panel.js +177 -0
  444. package/src/components/common/animation-control/animation-control.js +155 -0
  445. package/src/components/common/animation-control/animation-controller.js +224 -0
  446. package/src/components/common/animation-control/animation-speed-slider.js +79 -0
  447. package/src/components/common/animation-control/floating-time-display.js +192 -0
  448. package/src/components/common/animation-control/playback-controls.js +278 -0
  449. package/src/components/common/animation-control/speed-control.js +71 -0
  450. package/src/components/common/checkbox.js +128 -0
  451. package/src/components/common/color-legend.js +198 -0
  452. package/src/components/common/data-table/button.js +47 -0
  453. package/src/components/common/data-table/canvas.js +43 -0
  454. package/src/components/common/data-table/cell-size.js +180 -0
  455. package/src/components/common/data-table/grid.js +55 -0
  456. package/src/components/common/data-table/index.js +620 -0
  457. package/src/components/common/data-table/option-dropdown.js +110 -0
  458. package/src/components/common/dataset-label.js +40 -0
  459. package/src/components/common/error-boundary.js +43 -0
  460. package/src/components/common/field-selector.js +233 -0
  461. package/src/components/common/field-token.js +56 -0
  462. package/src/components/common/file-uploader/file-drop.d.ts +19 -0
  463. package/src/components/common/file-uploader/file-drop.js +196 -0
  464. package/src/components/common/file-uploader/file-upload-progress.d.ts +11 -0
  465. package/src/components/common/file-uploader/file-upload-progress.js +110 -0
  466. package/src/components/common/file-uploader/file-upload.d.ts +22 -0
  467. package/src/components/common/file-uploader/file-upload.js +301 -0
  468. package/src/components/common/file-uploader/upload-button.d.ts.wip +11 -0
  469. package/src/components/common/file-uploader/upload-button.js +83 -0
  470. package/src/components/common/histogram-plot.js +102 -0
  471. package/src/components/common/icons/add.js +43 -0
  472. package/src/components/common/icons/anchor_window.js +53 -0
  473. package/src/components/common/icons/arrow-down-alt.js +43 -0
  474. package/src/components/common/icons/arrow-down-solid .js +43 -0
  475. package/src/components/common/icons/arrow-down.js +46 -0
  476. package/src/components/common/icons/arrow-left.js +48 -0
  477. package/src/components/common/icons/arrow-right.js +46 -0
  478. package/src/components/common/icons/arrow-up-alt.js +46 -0
  479. package/src/components/common/icons/arrow-up-solid.js +43 -0
  480. package/src/components/common/icons/arrow-up.js +46 -0
  481. package/src/components/common/icons/base.js +90 -0
  482. package/src/components/common/icons/bug.js +46 -0
  483. package/src/components/common/icons/cancel.js +43 -0
  484. package/src/components/common/icons/checkmark.js +45 -0
  485. package/src/components/common/icons/chevron-right.js +47 -0
  486. package/src/components/common/icons/clipboard.js +46 -0
  487. package/src/components/common/icons/clock.js +44 -0
  488. package/src/components/common/icons/close.js +49 -0
  489. package/src/components/common/icons/code-alt.js +43 -0
  490. package/src/components/common/icons/copy.js +44 -0
  491. package/src/components/common/icons/crosshairs.js +43 -0
  492. package/src/components/common/icons/cube-3d.js +45 -0
  493. package/src/components/common/icons/cursor-click.js +49 -0
  494. package/src/components/common/icons/data-table.js +45 -0
  495. package/src/components/common/icons/db.js +45 -0
  496. package/src/components/common/icons/delete.js +44 -0
  497. package/src/components/common/icons/docs.js +46 -0
  498. package/src/components/common/icons/drag-n-drop.js +44 -0
  499. package/src/components/common/icons/draw-polygon.js +60 -0
  500. package/src/components/common/icons/email.js +45 -0
  501. package/src/components/common/icons/expand.js +45 -0
  502. package/src/components/common/icons/eye-seen.js +44 -0
  503. package/src/components/common/icons/eye-unseen.js +44 -0
  504. package/src/components/common/icons/file-type.js +57 -0
  505. package/src/components/common/icons/file.js +43 -0
  506. package/src/components/common/icons/files.js +42 -0
  507. package/src/components/common/icons/filter-funnel.js +43 -0
  508. package/src/components/common/icons/free-window.js +53 -0
  509. package/src/components/common/icons/gear.js +45 -0
  510. package/src/components/common/icons/hash.js +43 -0
  511. package/src/components/common/icons/histogram.js +47 -0
  512. package/src/components/common/icons/index.js +96 -0
  513. package/src/components/common/icons/info.js +54 -0
  514. package/src/components/common/icons/layers.js +43 -0
  515. package/src/components/common/icons/left-arrow.js +43 -0
  516. package/src/components/common/icons/legend.js +43 -0
  517. package/src/components/common/icons/line-chart.js +45 -0
  518. package/src/components/common/icons/login.js +46 -0
  519. package/src/components/common/icons/logout.js +43 -0
  520. package/src/components/common/icons/map-icon.js +69 -0
  521. package/src/components/common/icons/map.js +69 -0
  522. package/src/components/common/icons/messages.js +43 -0
  523. package/src/components/common/icons/minus.js +45 -0
  524. package/src/components/common/icons/pause.js +43 -0
  525. package/src/components/common/icons/picture.js +43 -0
  526. package/src/components/common/icons/pin.js +43 -0
  527. package/src/components/common/icons/play.js +43 -0
  528. package/src/components/common/icons/polygon.js +74 -0
  529. package/src/components/common/icons/rectangle.js +75 -0
  530. package/src/components/common/icons/reduce.js +48 -0
  531. package/src/components/common/icons/reset.js +43 -0
  532. package/src/components/common/icons/rocket.js +43 -0
  533. package/src/components/common/icons/save.js +44 -0
  534. package/src/components/common/icons/save2.js +47 -0
  535. package/src/components/common/icons/search.js +44 -0
  536. package/src/components/common/icons/settings.js +45 -0
  537. package/src/components/common/icons/share.js +43 -0
  538. package/src/components/common/icons/split.js +63 -0
  539. package/src/components/common/icons/square-select.js +44 -0
  540. package/src/components/common/icons/swap-horizontal.js +43 -0
  541. package/src/components/common/icons/table.js +46 -0
  542. package/src/components/common/icons/trash.js +51 -0
  543. package/src/components/common/icons/upload.js +44 -0
  544. package/src/components/common/icons/vert-dots.js +50 -0
  545. package/src/components/common/icons/vert-three-dots.js +45 -0
  546. package/src/components/common/icons/warning.js +46 -0
  547. package/src/components/common/image-preview.js +111 -0
  548. package/src/components/common/info-helper.js +84 -0
  549. package/src/components/common/item-selector/accessor.js +45 -0
  550. package/src/components/common/item-selector/chickleted-input.js +143 -0
  551. package/src/components/common/item-selector/dropdown-list.js +250 -0
  552. package/src/components/common/item-selector/item-selector-submenu.js +68 -0
  553. package/src/components/common/item-selector/item-selector.d.ts +34 -0
  554. package/src/components/common/item-selector/item-selector.js +360 -0
  555. package/src/components/common/item-selector/typeahead.js +507 -0
  556. package/src/components/common/line-chart.js +134 -0
  557. package/src/components/common/loading-spinner.js +64 -0
  558. package/src/components/common/logo.js +92 -0
  559. package/src/components/common/map-layer-selector.d.ts +10 -0
  560. package/src/components/common/map-layer-selector.js +54 -0
  561. package/src/components/common/modal.js +233 -0
  562. package/src/components/common/portaled.js +264 -0
  563. package/src/components/common/progress-bar.d.ts +13 -0
  564. package/src/components/common/progress-bar.js +49 -0
  565. package/src/components/common/range-brush.js +256 -0
  566. package/src/components/common/range-plot.js +139 -0
  567. package/src/components/common/range-slider.js +299 -0
  568. package/src/components/common/slider/mouse-event.js +97 -0
  569. package/src/components/common/slider/slider-bar-handle.js +97 -0
  570. package/src/components/common/slider/slider-handle.js +181 -0
  571. package/src/components/common/slider/slider.js +213 -0
  572. package/src/components/common/styled-components.js +657 -0
  573. package/src/components/common/switch.js +50 -0
  574. package/src/components/common/time-range-slider-time-title.js +76 -0
  575. package/src/components/common/time-range-slider.js +163 -0
  576. package/src/components/common/time-slider-marker.js +168 -0
  577. package/src/components/common/toolbar-item.d.ts +14 -0
  578. package/src/components/common/toolbar-item.js +83 -0
  579. package/src/components/common/toolbar.js +45 -0
  580. package/src/components/common/vertical-toolbar.js +35 -0
  581. package/src/components/container.js +173 -0
  582. package/src/components/context.d.ts +10 -0
  583. package/src/components/context.js +32 -0
  584. package/src/components/editor/constants.js +39 -0
  585. package/src/components/editor/editor.js +218 -0
  586. package/src/components/editor/feature-action-panel.js +143 -0
  587. package/src/components/editor/feature-styles.js +75 -0
  588. package/src/components/editor/handle-style.js +89 -0
  589. package/src/components/filters/components.js +28 -0
  590. package/src/components/filters/filter-panels/filter-panel-types.d.ts +28 -0
  591. package/src/components/filters/filter-panels/filter-panel-with-field-select.js +124 -0
  592. package/src/components/filters/filter-panels/multi-select-filter-panel.js +75 -0
  593. package/src/components/filters/filter-panels/new-filter-panel.js +99 -0
  594. package/src/components/filters/filter-panels/polygon-filter-panel.js +96 -0
  595. package/src/components/filters/filter-panels/range-filter-panel.js +75 -0
  596. package/src/components/filters/filter-panels/single-select-filter-panel.js +75 -0
  597. package/src/components/filters/filter-panels/time-range-filter-panel.js +95 -0
  598. package/src/components/filters/index.js +25 -0
  599. package/src/components/filters/multi-select-filter.js +36 -0
  600. package/src/components/filters/polygon-filter.d.ts +13 -0
  601. package/src/components/filters/polygon-filter.js +73 -0
  602. package/src/components/filters/range-filter.js +43 -0
  603. package/src/components/filters/single-select-filter.js +49 -0
  604. package/src/components/filters/time-range-filter.js +68 -0
  605. package/src/components/filters/time-widget.js +228 -0
  606. package/src/components/geocoder/geocoder.d.ts +33 -0
  607. package/src/components/geocoder/geocoder.js +272 -0
  608. package/src/components/geocoder-panel.js +191 -0
  609. package/src/components/index.js +247 -0
  610. package/src/components/injector.js +161 -0
  611. package/src/components/kepler-gl.d.ts +60 -0
  612. package/src/components/kepler-gl.js +525 -0
  613. package/src/components/map/coordinate-info.js +53 -0
  614. package/src/components/map/layer-hover-info.d.ts +12 -0
  615. package/src/components/map/layer-hover-info.js +185 -0
  616. package/src/components/map/layer-selector-panel.d.ts +16 -0
  617. package/src/components/map/layer-selector-panel.js +106 -0
  618. package/src/components/map/locale-panel.d.ts +12 -0
  619. package/src/components/map/locale-panel.js +91 -0
  620. package/src/components/map/map-control-panel.d.ts +11 -0
  621. package/src/components/map/map-control-panel.js +98 -0
  622. package/src/components/map/map-control-toolbar.js +33 -0
  623. package/src/components/map/map-control-tooltip.d.ts +8 -0
  624. package/src/components/map/map-control-tooltip.js +40 -0
  625. package/src/components/map/map-control.d.ts +37 -0
  626. package/src/components/map/map-control.js +100 -0
  627. package/src/components/map/map-draw-panel.d.ts +16 -0
  628. package/src/components/map/map-draw-panel.js +125 -0
  629. package/src/components/map/map-legend-panel.d.ts +20 -0
  630. package/src/components/map/map-legend-panel.js +100 -0
  631. package/src/components/map/map-legend.d.ts +58 -0
  632. package/src/components/map/map-legend.js +228 -0
  633. package/src/components/map/map-popover.d.ts +28 -0
  634. package/src/components/map/map-popover.js +250 -0
  635. package/src/components/map/split-map-button.d.ts +19 -0
  636. package/src/components/map/split-map-button.js +82 -0
  637. package/src/components/map/toggle-3d-button.d.ts +16 -0
  638. package/src/components/map/toggle-3d-button.js +75 -0
  639. package/src/components/map-container.d.ts +18 -0
  640. package/src/components/map-container.js +502 -0
  641. package/src/components/maps-layout.d.ts +5 -0
  642. package/src/components/maps-layout.js +40 -0
  643. package/src/components/modal-container.d.ts +38 -0
  644. package/src/components/modal-container.js +545 -0
  645. package/src/components/modals/add-map-style-modal.js +301 -0
  646. package/src/components/modals/cloud-tile.js +147 -0
  647. package/src/components/modals/data-table-modal.js +217 -0
  648. package/src/components/modals/delete-data-modal.js +48 -0
  649. package/src/components/modals/error-display.js +39 -0
  650. package/src/components/modals/export-data-modal.js +193 -0
  651. package/src/components/modals/export-image-modal.d.ts +21 -0
  652. package/src/components/modals/export-image-modal.js +144 -0
  653. package/src/components/modals/export-map-modal/components.js +42 -0
  654. package/src/components/modals/export-map-modal/export-html-map.d.ts +21 -0
  655. package/src/components/modals/export-map-modal/export-html-map.js +145 -0
  656. package/src/components/modals/export-map-modal/export-json-map.js +100 -0
  657. package/src/components/modals/export-map-modal/export-map-modal.js +114 -0
  658. package/src/components/modals/image-modal-container.d.ts +13 -0
  659. package/src/components/modals/image-modal-container.js +76 -0
  660. package/src/components/modals/load-data-modal.d.ts +30 -0
  661. package/src/components/modals/load-data-modal.js +94 -0
  662. package/src/components/modals/load-storage-map.js +381 -0
  663. package/src/components/modals/loading-dialog.js +69 -0
  664. package/src/components/modals/modal-dialog.js +25 -0
  665. package/src/components/modals/modal-tabs.js +126 -0
  666. package/src/components/modals/overwrite-map-modal.d.ts +18 -0
  667. package/src/components/modals/overwrite-map-modal.js +97 -0
  668. package/src/components/modals/provider-modal-container.d.ts +12 -0
  669. package/src/components/modals/provider-modal-container.js +60 -0
  670. package/src/components/modals/save-map-modal.d.ts +32 -0
  671. package/src/components/modals/save-map-modal.js +244 -0
  672. package/src/components/modals/share-map-modal.js +208 -0
  673. package/src/components/modals/status-panel.js +95 -0
  674. package/src/components/modals/storage-map-viewer.js +177 -0
  675. package/src/components/notification-panel/notification-item.js +132 -0
  676. package/src/components/notification-panel.js +72 -0
  677. package/src/components/performance.js +103 -0
  678. package/src/components/plot-container.js +228 -0
  679. package/src/components/side-panel/cloud-storage-dropdown.js +52 -0
  680. package/src/components/side-panel/common/dataset-info.js +45 -0
  681. package/src/components/side-panel/common/dataset-tag.js +55 -0
  682. package/src/components/side-panel/common/dataset-title.js +146 -0
  683. package/src/components/side-panel/common/source-data-catalog.js +61 -0
  684. package/src/components/side-panel/common/source-data-selector.js +79 -0
  685. package/src/components/side-panel/custom-panel.js +50 -0
  686. package/src/components/side-panel/filter-manager.js +105 -0
  687. package/src/components/side-panel/filter-panel/filter-panel-header.js +83 -0
  688. package/src/components/side-panel/filter-panel/filter-panel.js +126 -0
  689. package/src/components/side-panel/interaction-manager.js +46 -0
  690. package/src/components/side-panel/interaction-panel/brush-config.js +51 -0
  691. package/src/components/side-panel/interaction-panel/interaction-panel.js +115 -0
  692. package/src/components/side-panel/interaction-panel/tooltip-config/tooltip-chicklet.js +199 -0
  693. package/src/components/side-panel/interaction-panel/tooltip-config.js +190 -0
  694. package/src/components/side-panel/layer-manager.js +290 -0
  695. package/src/components/side-panel/layer-panel/color-dimension-scale-selector.js +33 -0
  696. package/src/components/side-panel/layer-panel/color-palette.js +90 -0
  697. package/src/components/side-panel/layer-panel/color-range-selector.js +322 -0
  698. package/src/components/side-panel/layer-panel/color-selector.js +193 -0
  699. package/src/components/side-panel/layer-panel/column-selector.js +70 -0
  700. package/src/components/side-panel/layer-panel/custom-markers-config-group.js +30 -0
  701. package/src/components/side-panel/layer-panel/custom-palette.js +296 -0
  702. package/src/components/side-panel/layer-panel/custom-picker.js +88 -0
  703. package/src/components/side-panel/layer-panel/dimension-scale-selector.js +48 -0
  704. package/src/components/side-panel/layer-panel/layer-aggregation-resolution.js +13 -0
  705. package/src/components/side-panel/layer-panel/layer-column-config.js +113 -0
  706. package/src/components/side-panel/layer-panel/layer-config-group.js +237 -0
  707. package/src/components/side-panel/layer-panel/layer-configurator.js +1317 -0
  708. package/src/components/side-panel/layer-panel/layer-panel-header.js +236 -0
  709. package/src/components/side-panel/layer-panel/layer-panel.js +171 -0
  710. package/src/components/side-panel/layer-panel/layer-type-dropdown-list.js +105 -0
  711. package/src/components/side-panel/layer-panel/layer-type-list-item.js +83 -0
  712. package/src/components/side-panel/layer-panel/layer-type-selector.js +89 -0
  713. package/src/components/side-panel/layer-panel/layer-visibility-by-zoom.js +123 -0
  714. package/src/components/side-panel/layer-panel/single-color-palette.js +98 -0
  715. package/src/components/side-panel/layer-panel/text-label-panel.js +179 -0
  716. package/src/components/side-panel/layer-panel/vis-config-by-field-selector.js +163 -0
  717. package/src/components/side-panel/layer-panel/vis-config-slider.js +82 -0
  718. package/src/components/side-panel/layer-panel/vis-config-switch.js +87 -0
  719. package/src/components/side-panel/map-manager.js +114 -0
  720. package/src/components/side-panel/map-style-panel/map-layer-selector.js +128 -0
  721. package/src/components/side-panel/map-style-panel/map-style-selector.js +111 -0
  722. package/src/components/side-panel/panel-dropdown.js +53 -0
  723. package/src/components/side-panel/panel-header-action.js +106 -0
  724. package/src/components/side-panel/panel-header.js +321 -0
  725. package/src/components/side-panel/panel-tab.js +62 -0
  726. package/src/components/side-panel/panel-title.js +32 -0
  727. package/src/components/side-panel/panel-toggle.js +70 -0
  728. package/src/components/side-panel/side-bar.js +136 -0
  729. package/src/components/side-panel.d.ts +33 -0
  730. package/src/components/side-panel.js +253 -0
  731. package/src/connect/keplergl-connect.js +47 -0
  732. package/src/connect/with-local-selector.d.ts +11 -0
  733. package/src/connect/with-local-selector.js +67 -0
  734. package/src/constants/action-types.d.ts +135 -0
  735. package/src/constants/action-types.js +184 -0
  736. package/src/constants/color-palette.js +553 -0
  737. package/src/constants/color-ranges.js +63 -0
  738. package/src/constants/custom-color-ranges.js +551 -0
  739. package/src/constants/default-settings.js +991 -0
  740. package/src/constants/index.js +80 -0
  741. package/src/constants/keyevent.js +36 -0
  742. package/src/constants/tooltip.js +198 -0
  743. package/src/constants/user-feedbacks.js +32 -0
  744. package/src/constants/user-guides.js +32 -0
  745. package/src/deckgl-layers/3d-building-layer/3d-building-layer.js +56 -0
  746. package/src/deckgl-layers/3d-building-layer/3d-building-utils.js +192 -0
  747. package/src/deckgl-layers/cluster-layer/cluster-layer.js +255 -0
  748. package/src/deckgl-layers/column-layer/enhanced-column-layer.js +63 -0
  749. package/src/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.js +70 -0
  750. package/src/deckgl-layers/hexagon-layer/enhanced-hexagon-layer.js +70 -0
  751. package/src/deckgl-layers/layer-utils/cluster-utils.js +76 -0
  752. package/src/deckgl-layers/layer-utils/cpu-aggregator.js +583 -0
  753. package/src/deckgl-layers/layer-utils/shader-utils.js +41 -0
  754. package/src/deckgl-layers/line-layer/line-layer.js +122 -0
  755. package/src/deckgl-layers/svg-icon-layer/scatterplot-icon-layer.js +57 -0
  756. package/src/deckgl-layers/svg-icon-layer/svg-icon-layer.js +85 -0
  757. package/src/index.js +52 -0
  758. package/src/layers/aggregation-layer.js +356 -0
  759. package/src/layers/arc-layer/arc-layer-icon.js +67 -0
  760. package/src/layers/arc-layer/arc-layer.js +221 -0
  761. package/src/layers/base-layer.js +1439 -0
  762. package/src/layers/cluster-layer/cluster-layer-icon.js +71 -0
  763. package/src/layers/cluster-layer/cluster-layer.js +125 -0
  764. package/src/layers/default-layer-icon.js +50 -0
  765. package/src/layers/geojson-layer/geojson-layer-icon.js +68 -0
  766. package/src/layers/geojson-layer/geojson-layer.js +344 -0
  767. package/src/layers/geojson-layer/geojson-utils.js +179 -0
  768. package/src/layers/grid-layer/grid-layer-icon.js +53 -0
  769. package/src/layers/grid-layer/grid-layer.js +95 -0
  770. package/src/layers/grid-layer/grid-utils.js +71 -0
  771. package/src/layers/h3-hexagon-layer/h3-hexagon-layer-icon.js +48 -0
  772. package/src/layers/h3-hexagon-layer/h3-hexagon-layer.js +264 -0
  773. package/src/layers/h3-hexagon-layer/h3-utils.js +65 -0
  774. package/src/layers/heatmap-layer/heatmap-layer-icon.js +64 -0
  775. package/src/layers/heatmap-layer/heatmap-layer.js +226 -0
  776. package/src/layers/hexagon-layer/hexagon-layer-icon.js +74 -0
  777. package/src/layers/hexagon-layer/hexagon-layer.js +95 -0
  778. package/src/layers/hexagon-layer/hexagon-utils.js +63 -0
  779. package/src/layers/icon-layer/icon-info-modal.js +155 -0
  780. package/src/layers/icon-layer/icon-layer-icon.js +56 -0
  781. package/src/layers/icon-layer/icon-layer.js +324 -0
  782. package/src/layers/index.d.ts +126 -0
  783. package/src/layers/index.js +72 -0
  784. package/src/layers/layer-factory.d.ts +148 -0
  785. package/src/layers/layer-factory.js +480 -0
  786. package/src/layers/layer-text-label.js +62 -0
  787. package/src/layers/layer-update.js +71 -0
  788. package/src/layers/line-layer/line-layer-icon.js +69 -0
  789. package/src/layers/line-layer/line-layer.js +161 -0
  790. package/src/layers/mapbox-utils.js +195 -0
  791. package/src/layers/mapboxgl-layer.js +154 -0
  792. package/src/layers/point-layer/point-layer-icon.js +51 -0
  793. package/src/layers/point-layer/point-layer.js +414 -0
  794. package/src/layers/s2-geometry-layer/s2-geometry-layer.js +265 -0
  795. package/src/layers/s2-geometry-layer/s2-layer-icon.js +47 -0
  796. package/src/layers/s2-geometry-layer/s2-utils.js +36 -0
  797. package/src/layers/scenegraph-layer/scenegraph-info-modal.js +97 -0
  798. package/src/layers/scenegraph-layer/scenegraph-layer-icon.js +144 -0
  799. package/src/layers/scenegraph-layer/scenegraph-layer.js +182 -0
  800. package/src/layers/trip-layer/trip-info-modal.js +82 -0
  801. package/src/layers/trip-layer/trip-layer-icon.js +62 -0
  802. package/src/layers/trip-layer/trip-layer.js +295 -0
  803. package/src/layers/trip-layer/trip-utils.js +169 -0
  804. package/src/layers/types.js +37 -0
  805. package/src/localization/en.js +501 -0
  806. package/src/localization/formatted-message.js +33 -0
  807. package/src/localization/index.js +32 -0
  808. package/src/localization/locales.js +46 -0
  809. package/src/middleware/index.js +34 -0
  810. package/src/processors/data-processor.d.ts +57 -0
  811. package/src/processors/data-processor.js +684 -0
  812. package/src/processors/file-handler.d.ts +46 -0
  813. package/src/processors/file-handler.js +220 -0
  814. package/src/processors/index.js +44 -0
  815. package/src/reducers/combined-updaters.d.ts +26 -0
  816. package/src/reducers/combined-updaters.js +198 -0
  817. package/src/reducers/composer-helpers.d.ts +32 -0
  818. package/src/reducers/composer-helpers.js +70 -0
  819. package/src/reducers/composers.js +33 -0
  820. package/src/reducers/core.d.ts +25 -0
  821. package/src/reducers/core.js +97 -0
  822. package/src/reducers/index.d.ts +118 -0
  823. package/src/reducers/index.js +53 -0
  824. package/src/reducers/map-state-updaters.d.ts +64 -0
  825. package/src/reducers/map-state-updaters.js +224 -0
  826. package/src/reducers/map-state.js +47 -0
  827. package/src/reducers/map-style-updaters.d.ts +76 -0
  828. package/src/reducers/map-style-updaters.js +541 -0
  829. package/src/reducers/map-style.js +53 -0
  830. package/src/reducers/provider-state-updaters.d.ts +88 -0
  831. package/src/reducers/provider-state-updaters.js +428 -0
  832. package/src/reducers/provider-state.js +53 -0
  833. package/src/reducers/root.js +230 -0
  834. package/src/reducers/types.d.ts +10 -0
  835. package/src/reducers/ui-state-updaters.d.ts +198 -0
  836. package/src/reducers/ui-state-updaters.js +766 -0
  837. package/src/reducers/ui-state.js +73 -0
  838. package/src/reducers/vis-state-merger.d.ts +78 -0
  839. package/src/reducers/vis-state-merger.js +545 -0
  840. package/src/reducers/vis-state-selectors.js +35 -0
  841. package/src/reducers/vis-state-updaters.d.ts +534 -0
  842. package/src/reducers/vis-state-updaters.js +2137 -0
  843. package/src/reducers/vis-state.js +155 -0
  844. package/src/schemas/dataset-schema.js +141 -0
  845. package/src/schemas/index.d.ts +24 -0
  846. package/src/schemas/index.js +42 -0
  847. package/src/schemas/map-state-schema.js +52 -0
  848. package/src/schemas/map-style-schema.js +95 -0
  849. package/src/schemas/schema-manager.d.ts +229 -0
  850. package/src/schemas/schema-manager.js +228 -0
  851. package/src/schemas/schema-utils.js +54 -0
  852. package/src/schemas/schema.d.ts +47 -0
  853. package/src/schemas/schema.js +90 -0
  854. package/src/schemas/versions.d.ts +23 -0
  855. package/src/schemas/versions.js +28 -0
  856. package/src/schemas/vis-state-schema.js +731 -0
  857. package/src/styles/base.js +1620 -0
  858. package/src/styles/index.js +22 -0
  859. package/src/styles/media-breakpoints.js +47 -0
  860. package/src/tasks/tasks.js +92 -0
  861. package/src/templates/export-map-html.js +262 -0
  862. package/src/typedefs/README.md +3 -0
  863. package/src/typedefs/deck.gl__core.d.ts +64 -0
  864. package/src/typedefs/deck.gl__mesh-layers.d.ts +33 -0
  865. package/src/utils/aggregate-utils.js +71 -0
  866. package/src/utils/color-utils.js +106 -0
  867. package/src/utils/data-scale-utils.d.ts +26 -0
  868. package/src/utils/data-scale-utils.js +61 -0
  869. package/src/utils/data-utils.d.ts +45 -0
  870. package/src/utils/data-utils.js +428 -0
  871. package/src/utils/dataset-utils.d.ts +10 -0
  872. package/src/utils/dataset-utils.js +255 -0
  873. package/src/utils/dom-to-image.js +533 -0
  874. package/src/utils/dom-utils.js +354 -0
  875. package/src/utils/export-utils.js +247 -0
  876. package/src/utils/filter-utils.d.ts +192 -0
  877. package/src/utils/filter-utils.js +1114 -0
  878. package/src/utils/gl-utils.js +42 -0
  879. package/src/utils/gpu-filter-utils.d.ts +28 -0
  880. package/src/utils/gpu-filter-utils.js +253 -0
  881. package/src/utils/index.d.ts +5 -0
  882. package/src/utils/index.js +55 -0
  883. package/src/utils/interaction-utils.d.ts +36 -0
  884. package/src/utils/interaction-utils.js +185 -0
  885. package/src/utils/layer-utils.d.ts +78 -0
  886. package/src/utils/layer-utils.js +205 -0
  887. package/src/utils/locale-utils.js +59 -0
  888. package/src/utils/map-info-utils.js +29 -0
  889. package/src/utils/map-style-utils/mapbox-gl-style-editor.js +201 -0
  890. package/src/utils/map-style-utils/mapbox-utils.js +28 -0
  891. package/src/utils/mapbox-utils.js +27 -0
  892. package/src/utils/notifications-utils.js +83 -0
  893. package/src/utils/observe-dimensions.d.ts +18 -0
  894. package/src/utils/observe-dimensions.js +115 -0
  895. package/src/utils/projection-utils.js +72 -0
  896. package/src/utils/searcher-utils.js +37 -0
  897. package/src/utils/split-map-utils.js +104 -0
  898. package/src/utils/table-utils/UPGRADE-data-container.md +38 -0
  899. package/src/utils/table-utils/data-container-interface.d.ts +140 -0
  900. package/src/utils/table-utils/data-container-utils.d.ts +43 -0
  901. package/src/utils/table-utils/data-container-utils.js +61 -0
  902. package/src/utils/table-utils/data-row.d.ts +65 -0
  903. package/src/utils/table-utils/data-row.js +54 -0
  904. package/src/utils/table-utils/index.d.ts +1 -0
  905. package/src/utils/table-utils/index.js +21 -0
  906. package/src/utils/table-utils/indexed-data-container.d.ts +26 -0
  907. package/src/utils/table-utils/indexed-data-container.js +152 -0
  908. package/src/utils/table-utils/kepler-table.d.ts +114 -0
  909. package/src/utils/table-utils/kepler-table.js +486 -0
  910. package/src/utils/table-utils/row-data-container.d.ts +30 -0
  911. package/src/utils/table-utils/row-data-container.js +151 -0
  912. package/src/utils/utils.js +202 -0
  913. package/styles.js +21 -0
@@ -0,0 +1,1114 @@
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 {ascending, extent, histogram as d3Histogram, ticks} from 'd3-array';
22
+ import keyMirror from 'keymirror';
23
+ import {console as Console} from 'global/console';
24
+ import get from 'lodash.get';
25
+ import isEqual from 'lodash.isequal';
26
+
27
+ import booleanWithin from '@turf/boolean-within';
28
+ import {point as turfPoint} from '@turf/helpers';
29
+ import {Decimal} from 'decimal.js';
30
+ import {ALL_FIELD_TYPES, FILTER_TYPES, ANIMATION_WINDOW} from 'constants/default-settings';
31
+ import {notNullorUndefined, unique, timeToUnixMilli} from './data-utils';
32
+ import * as ScaleUtils from './data-scale-utils';
33
+ import {LAYER_TYPES} from 'layers/types';
34
+ import {generateHashId, set, toArray} from './utils';
35
+ import {getCentroid, h3IsValid} from 'layers/h3-hexagon-layer/h3-utils';
36
+
37
+ // TYPE
38
+ /** @typedef {import('./table-utils/kepler-table').FilterRecord} FilterRecord */
39
+ /** @typedef {import('./filter-utils').FilterResult} FilterResult */
40
+
41
+ export const TimestampStepMap = [
42
+ {max: 1, step: 0.05},
43
+ {max: 10, step: 0.1},
44
+ {max: 100, step: 1},
45
+ {max: 500, step: 5},
46
+ {max: 1000, step: 10},
47
+ {max: 5000, step: 50},
48
+ {max: Number.POSITIVE_INFINITY, step: 1000}
49
+ ];
50
+
51
+ export const histogramBins = 30;
52
+ export const enlargedHistogramBins = 100;
53
+
54
+ const durationSecond = 1000;
55
+ const durationMinute = durationSecond * 60;
56
+ const durationHour = durationMinute * 60;
57
+ const durationDay = durationHour * 24;
58
+ const durationWeek = durationDay * 7;
59
+ const durationYear = durationDay * 365;
60
+
61
+ export const PLOT_TYPES = keyMirror({
62
+ histogram: null,
63
+ lineChart: null
64
+ });
65
+
66
+ export const FILTER_UPDATER_PROPS = keyMirror({
67
+ dataId: null,
68
+ name: null,
69
+ layerId: null
70
+ });
71
+
72
+ export const LIMITED_FILTER_EFFECT_PROPS = keyMirror({
73
+ [FILTER_UPDATER_PROPS.name]: null
74
+ });
75
+ /**
76
+ * Max number of filter value buffers that deck.gl provides
77
+ */
78
+
79
+ const SupportedPlotType = {
80
+ [FILTER_TYPES.timeRange]: {
81
+ default: 'histogram',
82
+ [ALL_FIELD_TYPES.integer]: 'lineChart',
83
+ [ALL_FIELD_TYPES.real]: 'lineChart'
84
+ },
85
+ [FILTER_TYPES.range]: {
86
+ default: 'histogram',
87
+ [ALL_FIELD_TYPES.integer]: 'lineChart',
88
+ [ALL_FIELD_TYPES.real]: 'lineChart'
89
+ }
90
+ };
91
+
92
+ export const FILTER_COMPONENTS = {
93
+ [FILTER_TYPES.select]: 'SingleSelectFilter',
94
+ [FILTER_TYPES.multiSelect]: 'MultiSelectFilter',
95
+ [FILTER_TYPES.timeRange]: 'TimeRangeFilter',
96
+ [FILTER_TYPES.range]: 'RangeFilter',
97
+ [FILTER_TYPES.polygon]: 'PolygonFilter'
98
+ };
99
+
100
+ export const DEFAULT_FILTER_STRUCTURE = {
101
+ dataId: [], // [string]
102
+ freeze: false,
103
+ id: null,
104
+
105
+ // time range filter specific
106
+ fixedDomain: false,
107
+ enlarged: false,
108
+ isAnimating: false,
109
+ animationWindow: ANIMATION_WINDOW.free,
110
+ speed: 1,
111
+
112
+ // field specific
113
+ name: [], // string
114
+ type: null,
115
+ fieldIdx: [], // [integer]
116
+ domain: null,
117
+ value: null,
118
+
119
+ // plot
120
+ plotType: PLOT_TYPES.histogram,
121
+ yAxis: null,
122
+ interval: null,
123
+
124
+ // mode
125
+ gpu: false
126
+ };
127
+
128
+ export const FILTER_ID_LENGTH = 4;
129
+
130
+ export const LAYER_FILTERS = [FILTER_TYPES.polygon];
131
+
132
+ /**
133
+ * Generates a filter with a dataset id as dataId
134
+ * @type {typeof import('./filter-utils').getDefaultFilter}
135
+ */
136
+ export function getDefaultFilter(dataId) {
137
+ return {
138
+ ...DEFAULT_FILTER_STRUCTURE,
139
+ // store it as dataId and it could be one or many
140
+ dataId: toArray(dataId),
141
+ id: generateHashId(FILTER_ID_LENGTH)
142
+ };
143
+ }
144
+
145
+ /**
146
+ * Check if a filter is valid based on the given dataId
147
+ * @param filter to validate
148
+ * @param datasetId id to validate filter against
149
+ * @return true if a filter is valid, false otherwise
150
+ * @type {typeof import('./filter-utils').shouldApplyFilter}
151
+ */
152
+ export function shouldApplyFilter(filter, datasetId) {
153
+ const dataIds = toArray(filter.dataId);
154
+ return dataIds.includes(datasetId) && filter.value !== null;
155
+ }
156
+
157
+ /**
158
+ * Validates and modifies polygon filter structure
159
+ * @param dataset
160
+ * @param filter
161
+ * @param layers
162
+ * @return - {filter, dataset}
163
+ * @type {typeof import('./filter-utils').validatePolygonFilter}
164
+ */
165
+ export function validatePolygonFilter(dataset, filter, layers) {
166
+ const failed = {dataset, filter: null};
167
+ const {value, layerId, type, dataId} = filter;
168
+
169
+ if (!layerId || !isValidFilterValue(type, value)) {
170
+ return failed;
171
+ }
172
+
173
+ const isValidDataset = dataId.includes(dataset.id);
174
+
175
+ if (!isValidDataset) {
176
+ return failed;
177
+ }
178
+
179
+ const layer = layers.find(l => layerId.includes(l.id));
180
+
181
+ if (!layer) {
182
+ return failed;
183
+ }
184
+
185
+ return {
186
+ filter: {
187
+ ...filter,
188
+ freeze: true,
189
+ fieldIdx: []
190
+ },
191
+ dataset
192
+ };
193
+ }
194
+
195
+ /**
196
+ * Custom filter validators
197
+ */
198
+ const filterValidators = {
199
+ [FILTER_TYPES.polygon]: validatePolygonFilter
200
+ };
201
+
202
+ /**
203
+ * Default validate filter function
204
+ * @param dataset
205
+ * @param filter
206
+ * @return - {filter, dataset}
207
+ * @type {typeof import('./filter-utils').validateFilter}
208
+ */
209
+ export function validateFilter(dataset, filter) {
210
+ // match filter.dataId
211
+ const failed = {dataset, filter: null};
212
+ const filterDataId = toArray(filter.dataId);
213
+
214
+ const filterDatasetIndex = filterDataId.indexOf(dataset.id);
215
+ if (filterDatasetIndex < 0) {
216
+ // the current filter is not mapped against the current dataset
217
+ return failed;
218
+ }
219
+
220
+ const initializeFilter = {
221
+ ...getDefaultFilter(filter.dataId),
222
+ ...filter,
223
+ dataId: filterDataId,
224
+ name: toArray(filter.name)
225
+ };
226
+
227
+ const fieldName = initializeFilter.name[filterDatasetIndex];
228
+ const {filter: updatedFilter, dataset: updatedDataset} = applyFilterFieldName(
229
+ initializeFilter,
230
+ dataset,
231
+ fieldName,
232
+ filterDatasetIndex,
233
+ {mergeDomain: true}
234
+ );
235
+
236
+ if (!updatedFilter) {
237
+ return failed;
238
+ }
239
+
240
+ updatedFilter.value = adjustValueToFilterDomain(filter.value, updatedFilter);
241
+ updatedFilter.enlarged =
242
+ typeof filter.enlarged === 'boolean' ? filter.enlarged : updatedFilter.enlarged;
243
+
244
+ if (updatedFilter.value === null) {
245
+ // cannot adjust saved value to filter
246
+ return failed;
247
+ }
248
+
249
+ return {
250
+ filter: validateFilterYAxis(updatedFilter, updatedDataset),
251
+ dataset: updatedDataset
252
+ };
253
+ }
254
+
255
+ /**
256
+ * Validate saved filter config with new data,
257
+ * calculate domain and fieldIdx based new fields and data
258
+ *
259
+ * @param dataset
260
+ * @param filter - filter to be validate
261
+ * @param layers - layers
262
+ * @return validated filter
263
+ * @type {typeof import('./filter-utils').validateFilterWithData}
264
+ */
265
+ export function validateFilterWithData(dataset, filter, layers) {
266
+ // @ts-ignore
267
+ return filterValidators.hasOwnProperty(filter.type)
268
+ ? filterValidators[filter.type](dataset, filter, layers)
269
+ : validateFilter(dataset, filter);
270
+ }
271
+
272
+ /**
273
+ * Validate YAxis
274
+ * @param filter
275
+ * @param dataset
276
+ * @return {*}
277
+ */
278
+ function validateFilterYAxis(filter, dataset) {
279
+ // TODO: validate yAxis against other datasets
280
+
281
+ const {fields} = dataset;
282
+ const {yAxis} = filter;
283
+ // TODO: validate yAxis against other datasets
284
+ if (yAxis) {
285
+ const matchedAxis = fields.find(({name, type}) => name === yAxis.name && type === yAxis.type);
286
+
287
+ filter = matchedAxis
288
+ ? {
289
+ ...filter,
290
+ yAxis: matchedAxis,
291
+ ...getFilterPlot({...filter, yAxis: matchedAxis}, dataset)
292
+ }
293
+ : filter;
294
+ }
295
+
296
+ return filter;
297
+ }
298
+
299
+ /**
300
+ * Get default filter prop based on field type
301
+ *
302
+ * @param field
303
+ * @param fieldDomain
304
+ * @returns default filter
305
+ * @type {typeof import('./filter-utils').getFilterProps}
306
+ */
307
+ export function getFilterProps(field, fieldDomain) {
308
+ const filterProps = {
309
+ ...fieldDomain,
310
+ fieldType: field.type
311
+ };
312
+
313
+ switch (field.type) {
314
+ case ALL_FIELD_TYPES.real:
315
+ case ALL_FIELD_TYPES.integer:
316
+ return {
317
+ ...filterProps,
318
+ value: fieldDomain.domain,
319
+ type: FILTER_TYPES.range,
320
+ typeOptions: [FILTER_TYPES.range],
321
+ gpu: true
322
+ };
323
+
324
+ case ALL_FIELD_TYPES.boolean:
325
+ return {
326
+ ...filterProps,
327
+ type: FILTER_TYPES.select,
328
+ value: true,
329
+ gpu: false
330
+ };
331
+
332
+ case ALL_FIELD_TYPES.string:
333
+ case ALL_FIELD_TYPES.date:
334
+ return {
335
+ ...filterProps,
336
+ type: FILTER_TYPES.multiSelect,
337
+ value: [],
338
+ gpu: false
339
+ };
340
+
341
+ case ALL_FIELD_TYPES.timestamp:
342
+ return {
343
+ ...filterProps,
344
+ type: FILTER_TYPES.timeRange,
345
+ enlarged: true,
346
+ fixedDomain: true,
347
+ value: filterProps.domain,
348
+ gpu: true
349
+ };
350
+
351
+ default:
352
+ return {};
353
+ }
354
+ }
355
+
356
+ export const getPolygonFilterFunctor = (layer, filter, dataContainer) => {
357
+ const getPosition = layer.getPositionAccessor(dataContainer);
358
+
359
+ switch (layer.type) {
360
+ case LAYER_TYPES.point:
361
+ case LAYER_TYPES.icon:
362
+ return data => {
363
+ const pos = getPosition(data);
364
+ return pos.every(Number.isFinite) && isInPolygon(pos, filter.value);
365
+ };
366
+ case LAYER_TYPES.arc:
367
+ case LAYER_TYPES.line:
368
+ return data => {
369
+ const pos = getPosition(data);
370
+ return (
371
+ pos.every(Number.isFinite) &&
372
+ [
373
+ [pos[0], pos[1]],
374
+ [pos[3], pos[4]]
375
+ ].every(point => isInPolygon(point, filter.value))
376
+ );
377
+ };
378
+ case LAYER_TYPES.hexagonId:
379
+ if (layer.dataToFeature && layer.dataToFeature.centroids) {
380
+ return data => {
381
+ // null or getCentroid({id})
382
+ const centroid = layer.dataToFeature.centroids[data.index];
383
+ return centroid && isInPolygon(centroid, filter.value);
384
+ };
385
+ }
386
+ return data => {
387
+ const id = getPosition(data);
388
+ if (!h3IsValid(id)) {
389
+ return false;
390
+ }
391
+ const pos = getCentroid({id});
392
+ return pos.every(Number.isFinite) && isInPolygon(pos, filter.value);
393
+ };
394
+ default:
395
+ return () => true;
396
+ }
397
+ };
398
+
399
+ /**
400
+ * @param field dataset Field
401
+ * @param dataId Dataset id
402
+ * @param filter Filter object
403
+ * @param layers list of layers to filter upon
404
+ * @param dataContainer Data container
405
+ * @return filterFunction
406
+ * @type {typeof import('./filter-utils').getFilterFunction}
407
+ */
408
+ export function getFilterFunction(field, dataId, filter, layers, dataContainer) {
409
+ // field could be null in polygon filter
410
+ const valueAccessor = field ? field.valueAccessor : data => null;
411
+ const defaultFunc = d => true;
412
+
413
+ switch (filter.type) {
414
+ case FILTER_TYPES.range:
415
+ return data => isInRange(valueAccessor(data), filter.value);
416
+ case FILTER_TYPES.multiSelect:
417
+ return data => filter.value.includes(valueAccessor(data));
418
+ case FILTER_TYPES.select:
419
+ return data => valueAccessor(data) === filter.value;
420
+ case FILTER_TYPES.timeRange:
421
+ if (!field) {
422
+ return defaultFunc;
423
+ }
424
+ const mappedValue = get(field, ['filterProps', 'mappedValue']);
425
+ const accessor = Array.isArray(mappedValue)
426
+ ? data => mappedValue[data.index]
427
+ : data => timeToUnixMilli(valueAccessor(data), field.format);
428
+ return data => isInRange(accessor(data), filter.value);
429
+ case FILTER_TYPES.polygon:
430
+ if (!layers || !layers.length) {
431
+ return defaultFunc;
432
+ }
433
+ // @ts-ignore
434
+ const layerFilterFunctions = filter.layerId
435
+ .map(id => layers.find(l => l.id === id))
436
+ .filter(l => l && l.config.dataId === dataId)
437
+ .map(layer => getPolygonFilterFunctor(layer, filter, dataContainer));
438
+
439
+ return data => layerFilterFunctions.every(filterFunc => filterFunc(data));
440
+ default:
441
+ return defaultFunc;
442
+ }
443
+ }
444
+
445
+ export function updateFilterDataId(dataId) {
446
+ return getDefaultFilter(dataId);
447
+ }
448
+
449
+ /**
450
+ * @type {typeof import('./filter-utils').filterDataByFilterTypes}
451
+ */
452
+ export function filterDataByFilterTypes(
453
+ {dynamicDomainFilters, cpuFilters, filterFuncs},
454
+ dataContainer
455
+ ) {
456
+ const result = {
457
+ ...(dynamicDomainFilters ? {filteredIndexForDomain: []} : {}),
458
+ ...(cpuFilters ? {filteredIndex: []} : {})
459
+ };
460
+
461
+ const filterContext = {index: -1, dataContainer};
462
+ const filterFuncCaller = filter => filterFuncs[filter.id](filterContext);
463
+
464
+ const numRows = dataContainer.numRows();
465
+ for (let i = 0; i < numRows; ++i) {
466
+ filterContext.index = i;
467
+
468
+ const matchForDomain = dynamicDomainFilters && dynamicDomainFilters.every(filterFuncCaller);
469
+ if (matchForDomain) {
470
+ // @ts-ignore
471
+ result.filteredIndexForDomain.push(filterContext.index);
472
+ }
473
+
474
+ const matchForRender = cpuFilters && cpuFilters.every(filterFuncCaller);
475
+ if (matchForRender) {
476
+ // @ts-ignore
477
+ result.filteredIndex.push(filterContext.index);
478
+ }
479
+ }
480
+
481
+ return result;
482
+ }
483
+
484
+ /**
485
+ * Get a record of filters based on domain type and gpu / cpu
486
+ * @type {typeof import('./filter-utils').getFilterRecord}
487
+ */
488
+ export function getFilterRecord(dataId, filters, opt = {}) {
489
+ /**
490
+ * @type {FilterRecord}
491
+ */
492
+ const filterRecord = {
493
+ dynamicDomain: [],
494
+ fixedDomain: [],
495
+ cpu: [],
496
+ gpu: []
497
+ };
498
+
499
+ filters.forEach(f => {
500
+ if (isValidFilterValue(f.type, f.value) && toArray(f.dataId).includes(dataId)) {
501
+ (f.fixedDomain || opt.ignoreDomain
502
+ ? filterRecord.fixedDomain
503
+ : filterRecord.dynamicDomain
504
+ ).push(f);
505
+
506
+ (f.gpu && !opt.cpuOnly ? filterRecord.gpu : filterRecord.cpu).push(f);
507
+ }
508
+ });
509
+
510
+ return filterRecord;
511
+ }
512
+
513
+ /**
514
+ * Compare filter records to get what has changed
515
+ * @type {typeof import('./filter-utils').diffFilters}
516
+ */
517
+ export function diffFilters(filterRecord, oldFilterRecord = {}) {
518
+ let filterChanged = {};
519
+
520
+ Object.entries(filterRecord).forEach(([record, items]) => {
521
+ items.forEach(filter => {
522
+ const oldFilter = (oldFilterRecord[record] || []).find(f => f.id === filter.id);
523
+
524
+ if (!oldFilter) {
525
+ // added
526
+ filterChanged = set([record, filter.id], 'added', filterChanged);
527
+ } else {
528
+ // check what has changed
529
+ ['name', 'value', 'dataId'].forEach(prop => {
530
+ if (filter[prop] !== oldFilter[prop]) {
531
+ filterChanged = set([record, filter.id], `${prop}_changed`, filterChanged);
532
+ }
533
+ });
534
+ }
535
+ });
536
+
537
+ (oldFilterRecord[record] || []).forEach(oldFilter => {
538
+ // deleted
539
+ if (!items.find(f => f.id === oldFilter.id)) {
540
+ filterChanged = set([record, oldFilter.id], 'deleted', filterChanged);
541
+ }
542
+ });
543
+
544
+ if (!filterChanged[record]) {
545
+ filterChanged[record] = null;
546
+ }
547
+ });
548
+
549
+ // @ts-ignore
550
+ return filterChanged;
551
+ }
552
+ /**
553
+ * Call by parsing filters from URL
554
+ * Check if value of filter within filter domain, if not adjust it to match
555
+ * filter domain
556
+ *
557
+ * @type {typeof import('./filter-utils').adjustValueToFilterDomain}
558
+ * @returns value - adjusted value to match filter or null to remove filter
559
+ */
560
+ /* eslint-disable complexity */
561
+ export function adjustValueToFilterDomain(value, {domain, type}) {
562
+ if (!domain || !type) {
563
+ return false;
564
+ }
565
+
566
+ switch (type) {
567
+ case FILTER_TYPES.range:
568
+ case FILTER_TYPES.timeRange:
569
+ if (!Array.isArray(value) || value.length !== 2) {
570
+ return domain.map(d => d);
571
+ }
572
+
573
+ return value.map((d, i) => (notNullorUndefined(d) && isInRange(d, domain) ? d : domain[i]));
574
+
575
+ case FILTER_TYPES.multiSelect:
576
+ if (!Array.isArray(value)) {
577
+ return [];
578
+ }
579
+ const filteredValue = value.filter(d => domain.includes(d));
580
+ return filteredValue.length ? filteredValue : [];
581
+
582
+ case FILTER_TYPES.select:
583
+ return domain.includes(value) ? value : true;
584
+
585
+ default:
586
+ return null;
587
+ }
588
+ }
589
+ /* eslint-enable complexity */
590
+
591
+ /**
592
+ * Calculate numeric domain and suitable step
593
+ *
594
+ * @type {typeof import('./filter-utils').getNumericFieldDomain}
595
+ */
596
+ export function getNumericFieldDomain(dataContainer, valueAccessor) {
597
+ let domain = [0, 1];
598
+ let step = 0.1;
599
+
600
+ const mappedValue = dataContainer.mapIndex(valueAccessor);
601
+
602
+ if (dataContainer.numRows() > 1) {
603
+ domain = ScaleUtils.getLinearDomain(mappedValue);
604
+ const diff = domain[1] - domain[0];
605
+
606
+ // in case equal domain, [96, 96], which will break quantize scale
607
+ if (!diff) {
608
+ domain[1] = domain[0] + 1;
609
+ }
610
+
611
+ step = getNumericStepSize(diff) || step;
612
+ domain[0] = formatNumberByStep(domain[0], step, 'floor');
613
+ domain[1] = formatNumberByStep(domain[1], step, 'ceil');
614
+ }
615
+
616
+ // @ts-ignore
617
+ const {histogram, enlargedHistogram} = getHistogram(domain, mappedValue);
618
+
619
+ return {domain, step, histogram, enlargedHistogram};
620
+ }
621
+
622
+ /**
623
+ * Calculate step size for range and timerange filter
624
+ *
625
+ * @type {typeof import('./filter-utils').getNumericStepSize}
626
+ */
627
+ export function getNumericStepSize(diff) {
628
+ diff = Math.abs(diff);
629
+
630
+ if (diff > 100) {
631
+ return 1;
632
+ } else if (diff > 3) {
633
+ return 0.01;
634
+ } else if (diff > 1) {
635
+ return 0.001;
636
+ }
637
+ // Try to get at least 1000 steps - and keep the step size below that of
638
+ // the (diff > 1) case.
639
+ const x = diff / 1000;
640
+ // Find the exponent and truncate to 10 to the power of that exponent
641
+
642
+ const exponentialForm = x.toExponential();
643
+ const exponent = parseFloat(exponentialForm.split('e')[1]);
644
+
645
+ // Getting ready for node 12
646
+ // this is why we need decimal.js
647
+ // Math.pow(10, -5) = 0.000009999999999999999
648
+ // the above result shows in browser and node 10
649
+ // node 12 behaves correctly
650
+ return new Decimal(10).pow(exponent).toNumber();
651
+ }
652
+
653
+ /**
654
+ * Calculate timestamp domain and suitable step
655
+ * @type {typeof import('./filter-utils').getTimestampFieldDomain}
656
+ */
657
+ export function getTimestampFieldDomain(dataContainer, valueAccessor) {
658
+ // to avoid converting string format time to epoch
659
+ // every time we compare we store a value mapped to int in filter domain
660
+
661
+ const mappedValue = dataContainer.mapIndex(valueAccessor);
662
+ const domain = ScaleUtils.getLinearDomain(mappedValue);
663
+ const defaultTimeFormat = getTimeWidgetTitleFormatter(domain);
664
+
665
+ let step = 0.01;
666
+
667
+ const diff = domain[1] - domain[0];
668
+ const entry = TimestampStepMap.find(f => f.max >= diff);
669
+ if (entry) {
670
+ step = entry.step;
671
+ }
672
+
673
+ const {histogram, enlargedHistogram} = getHistogram(domain, mappedValue);
674
+
675
+ return {
676
+ domain,
677
+ step,
678
+ mappedValue,
679
+ histogram,
680
+ enlargedHistogram,
681
+ defaultTimeFormat
682
+ };
683
+ }
684
+
685
+ /**
686
+ *
687
+ * @type {typeof import('./filter-utils').histogramConstruct}
688
+ */
689
+ export function histogramConstruct(domain, mappedValue, bins) {
690
+ return d3Histogram()
691
+ .thresholds(ticks(domain[0], domain[1], bins))
692
+ .domain(domain)(mappedValue)
693
+ .map(bin => ({
694
+ count: bin.length,
695
+ x0: bin.x0,
696
+ x1: bin.x1
697
+ }));
698
+ }
699
+ /**
700
+ * Calculate histogram from domain and array of values
701
+ *
702
+ * @type {typeof import('./filter-utils').getHistogram}
703
+ */
704
+ export function getHistogram(domain, mappedValue) {
705
+ const histogram = histogramConstruct(domain, mappedValue, histogramBins);
706
+ const enlargedHistogram = histogramConstruct(domain, mappedValue, enlargedHistogramBins);
707
+
708
+ return {histogram, enlargedHistogram};
709
+ }
710
+
711
+ /**
712
+ * round number based on step
713
+ *
714
+ * @param {Number} val
715
+ * @param {Number} step
716
+ * @param {string} bound
717
+ * @returns {Number} rounded number
718
+ */
719
+ export function formatNumberByStep(val, step, bound) {
720
+ if (bound === 'floor') {
721
+ return Math.floor(val * (1 / step)) / (1 / step);
722
+ }
723
+
724
+ return Math.ceil(val * (1 / step)) / (1 / step);
725
+ }
726
+
727
+ /**
728
+ *
729
+ * @type {typeof import('./filter-utils').isInRange}
730
+ */
731
+ export function isInRange(val, domain) {
732
+ if (!Array.isArray(domain)) {
733
+ return false;
734
+ }
735
+
736
+ return val >= domain[0] && val <= domain[1];
737
+ }
738
+
739
+ /**
740
+ * Determines whether a point is within the provided polygon
741
+ *
742
+ * @param point as input search [lat, lng]
743
+ * @param polygon Points must be within these (Multi)Polygon(s)
744
+ * @return {boolean}
745
+ */
746
+ export function isInPolygon(point, polygon) {
747
+ return booleanWithin(turfPoint(point), polygon);
748
+ }
749
+ export function isValidTimeDomain(domain) {
750
+ return Array.isArray(domain) && domain.every(Number.isFinite);
751
+ }
752
+ export function getTimeWidgetTitleFormatter(domain) {
753
+ if (!isValidTimeDomain(domain)) {
754
+ return null;
755
+ }
756
+
757
+ const diff = domain[1] - domain[0];
758
+
759
+ // Local aware formats
760
+ // https://momentjs.com/docs/#/parsing/string-format
761
+ return diff > durationYear ? 'L' : diff > durationDay ? 'L LT' : 'L LTS';
762
+ }
763
+
764
+ export function getTimeWidgetHintFormatter(domain) {
765
+ if (!isValidTimeDomain(domain)) {
766
+ return null;
767
+ }
768
+
769
+ const diff = domain[1] - domain[0];
770
+ return diff > durationWeek
771
+ ? 'L'
772
+ : diff > durationDay
773
+ ? 'L LT'
774
+ : diff > durationHour
775
+ ? 'LT'
776
+ : 'LTS';
777
+ }
778
+
779
+ /**
780
+ * Sanity check on filters to prepare for save
781
+ * @type {typeof import('./filter-utils').isValidFilterValue}
782
+ */
783
+ /* eslint-disable complexity */
784
+ export function isValidFilterValue(type, value) {
785
+ if (!type) {
786
+ return false;
787
+ }
788
+ switch (type) {
789
+ case FILTER_TYPES.select:
790
+ return value === true || value === false;
791
+
792
+ case FILTER_TYPES.range:
793
+ case FILTER_TYPES.timeRange:
794
+ return Array.isArray(value) && value.every(v => v !== null && !isNaN(v));
795
+
796
+ case FILTER_TYPES.multiSelect:
797
+ return Array.isArray(value) && Boolean(value.length);
798
+
799
+ case FILTER_TYPES.input:
800
+ return Boolean(value.length);
801
+
802
+ case FILTER_TYPES.polygon:
803
+ const coordinates = get(value, ['geometry', 'coordinates']);
804
+ return Boolean(value && value.id && coordinates);
805
+
806
+ default:
807
+ return true;
808
+ }
809
+ }
810
+
811
+ /**
812
+ *
813
+ * @type {typeof import('./filter-utils').getFilterPlot}
814
+ */
815
+ export function getFilterPlot(filter, dataset) {
816
+ if (filter.plotType === PLOT_TYPES.histogram || !filter.yAxis) {
817
+ // histogram should be calculated when create filter
818
+ return {};
819
+ }
820
+
821
+ const {mappedValue = []} = filter;
822
+ const {yAxis} = filter;
823
+ const fieldIdx = dataset.getColumnFieldIdx(yAxis.name);
824
+ if (fieldIdx < 0) {
825
+ Console.warn(`yAxis ${yAxis.name} does not exist in dataset`);
826
+ return {lineChart: {}, yAxis};
827
+ }
828
+
829
+ // return lineChart
830
+ const series = dataset.dataContainer
831
+ .map(
832
+ (row, rowIndex) => ({
833
+ x: mappedValue[rowIndex],
834
+ y: row.valueAt(fieldIdx)
835
+ }),
836
+ true
837
+ )
838
+ .filter(({x, y}) => Number.isFinite(x) && Number.isFinite(y))
839
+ .sort((a, b) => ascending(a.x, b.x));
840
+
841
+ const yDomain = extent(series, d => d.y);
842
+ const xDomain = [series[0].x, series[series.length - 1].x];
843
+
844
+ return {lineChart: {series, yDomain, xDomain}, yAxis};
845
+ }
846
+
847
+ export function getDefaultFilterPlotType(filter) {
848
+ const filterPlotTypes = SupportedPlotType[filter.type];
849
+ if (!filterPlotTypes) {
850
+ return null;
851
+ }
852
+
853
+ if (!filter.yAxis) {
854
+ return filterPlotTypes.default;
855
+ }
856
+
857
+ return filterPlotTypes[filter.yAxis.type] || null;
858
+ }
859
+
860
+ /**
861
+ *
862
+ * @param datasetIds list of dataset ids to be filtered
863
+ * @param datasets all datasets
864
+ * @param filters all filters to be applied to datasets
865
+ * @return datasets - new updated datasets
866
+ * @type {typeof import('./filter-utils').applyFiltersToDatasets}
867
+ */
868
+ export function applyFiltersToDatasets(datasetIds, datasets, filters, layers) {
869
+ const dataIds = toArray(datasetIds);
870
+ return dataIds.reduce((acc, dataId) => {
871
+ const layersToFilter = (layers || []).filter(l => l.config.dataId === dataId);
872
+ const appliedFilters = filters.filter(d => shouldApplyFilter(d, dataId));
873
+ const table = datasets[dataId];
874
+
875
+ return {
876
+ ...acc,
877
+ [dataId]: table.filterTable(appliedFilters, layersToFilter, {})
878
+ };
879
+ }, datasets);
880
+ }
881
+
882
+ /**
883
+ * Applies a new field name value to fielter and update both filter and dataset
884
+ * @param filter - to be applied the new field name on
885
+ * @param dataset - dataset the field belongs to
886
+ * @param fieldName - field.name
887
+ * @param filterDatasetIndex - field.name
888
+ * @param option
889
+ * @return - {filter, datasets}
890
+ * @type {typeof import('./filter-utils').applyFilterFieldName}
891
+ */
892
+ export function applyFilterFieldName(filter, dataset, fieldName, filterDatasetIndex = 0, option) {
893
+ // using filterDatasetIndex we can filter only the specified dataset
894
+ const mergeDomain = option && option.hasOwnProperty('mergeDomain') ? option.mergeDomain : false;
895
+
896
+ const fieldIndex = dataset.getColumnFieldIdx(fieldName);
897
+ // if no field with same name is found, move to the next datasets
898
+ if (fieldIndex === -1) {
899
+ // throw new Error(`fieldIndex not found. Dataset must contain a property with name: ${fieldName}`);
900
+ return {filter: null, dataset};
901
+ }
902
+
903
+ // TODO: validate field type
904
+ const filterProps = dataset.getColumnFilterProps(fieldName);
905
+
906
+ const newFilter = {
907
+ ...(mergeDomain ? mergeFilterDomainStep(filter, filterProps) : {...filter, ...filterProps}),
908
+ name: Object.assign([...toArray(filter.name)], {[filterDatasetIndex]: fieldName}),
909
+ fieldIdx: Object.assign([...toArray(filter.fieldIdx)], {
910
+ [filterDatasetIndex]: fieldIndex
911
+ }),
912
+ // TODO, since we allow to add multiple fields to a filter we can no longer freeze the filter
913
+ freeze: true
914
+ };
915
+
916
+ return {
917
+ filter: newFilter,
918
+ dataset
919
+ };
920
+ }
921
+
922
+ /**
923
+ * Merge one filter with other filter prop domain
924
+ * @type {typeof import('./filter-utils').mergeFilterDomainStep}
925
+ */
926
+ /* eslint-disable complexity */
927
+ export function mergeFilterDomainStep(filter, filterProps) {
928
+ if (!filter) {
929
+ return null;
930
+ }
931
+
932
+ if (!filterProps) {
933
+ return filter;
934
+ }
935
+
936
+ if ((filter.fieldType && filter.fieldType !== filterProps.fieldType) || !filterProps.domain) {
937
+ return filter;
938
+ }
939
+
940
+ const combinedDomain = !filter.domain
941
+ ? filterProps.domain
942
+ : [...(filter.domain || []), ...(filterProps.domain || [])].sort((a, b) => a - b);
943
+
944
+ const newFilter = {
945
+ ...filter,
946
+ ...filterProps,
947
+ domain: [combinedDomain[0], combinedDomain[combinedDomain.length - 1]]
948
+ };
949
+
950
+ switch (filterProps.fieldType) {
951
+ case ALL_FIELD_TYPES.string:
952
+ case ALL_FIELD_TYPES.date:
953
+ return {
954
+ ...newFilter,
955
+ domain: unique(combinedDomain).sort()
956
+ };
957
+
958
+ case ALL_FIELD_TYPES.timestamp:
959
+ // @ts-ignore
960
+ const step = filter.step < filterProps.step ? filter.step : filterProps.step;
961
+
962
+ return {
963
+ ...newFilter,
964
+ step
965
+ };
966
+ case ALL_FIELD_TYPES.real:
967
+ case ALL_FIELD_TYPES.integer:
968
+ default:
969
+ return newFilter;
970
+ }
971
+ }
972
+ /* eslint-enable complexity */
973
+
974
+ /**
975
+ * Generates polygon filter
976
+ * @type {typeof import('./filter-utils').featureToFilterValue}
977
+ */
978
+ export const featureToFilterValue = (feature, filterId, properties = {}) => ({
979
+ ...feature,
980
+ id: feature.id,
981
+ properties: {
982
+ ...feature.properties,
983
+ ...properties,
984
+ filterId
985
+ }
986
+ });
987
+
988
+ /**
989
+ * @type {typeof import('./filter-utils').getFilterIdInFeature}
990
+ */
991
+ export const getFilterIdInFeature = f => get(f, ['properties', 'filterId']);
992
+
993
+ /**
994
+ * Generates polygon filter
995
+ * @type {typeof import('./filter-utils').generatePolygonFilter}
996
+ */
997
+ export function generatePolygonFilter(layers, feature) {
998
+ const dataId = layers.map(l => l.config.dataId).filter(d => d);
999
+ const layerId = layers.map(l => l.id);
1000
+ const name = layers.map(l => l.config.label);
1001
+ // @ts-ignore
1002
+ const filter = getDefaultFilter(dataId);
1003
+ return {
1004
+ ...filter,
1005
+ fixedDomain: true,
1006
+ type: FILTER_TYPES.polygon,
1007
+ name,
1008
+ layerId,
1009
+ value: featureToFilterValue(feature, filter.id, {isVisible: true})
1010
+ };
1011
+ }
1012
+
1013
+ /**
1014
+ * Run filter entirely on CPU
1015
+ * @type {typeof import('./filter-utils').filterDatasetCPU}
1016
+ */
1017
+ export function filterDatasetCPU(state, dataId) {
1018
+ const datasetFilters = state.filters.filter(f => f.dataId.includes(dataId));
1019
+ const dataset = state.datasets[dataId];
1020
+
1021
+ if (!dataset) {
1022
+ return state;
1023
+ }
1024
+
1025
+ const cpuFilteredDataset = dataset.filterTableCPU(datasetFilters, state.layers);
1026
+
1027
+ return set(['datasets', dataId], cpuFilteredDataset, state);
1028
+ }
1029
+
1030
+ /**
1031
+ * Validate parsed filters with datasets and add filterProps to field
1032
+ * @type {typeof import('./filter-utils').validateFiltersUpdateDatasets}
1033
+ */
1034
+ export function validateFiltersUpdateDatasets(state, filtersToValidate = []) {
1035
+ const validated = [];
1036
+ const failed = [];
1037
+ const {datasets} = state;
1038
+ let updatedDatasets = datasets;
1039
+
1040
+ // merge filters
1041
+ filtersToValidate.forEach(filter => {
1042
+ // we can only look for datasets define in the filter dataId
1043
+ const datasetIds = toArray(filter.dataId);
1044
+
1045
+ // we can merge a filter only if all datasets in filter.dataId are loaded
1046
+ if (datasetIds.every(d => datasets[d])) {
1047
+ // all datasetIds in filter must be present the state datasets
1048
+ const {filter: validatedFilter, applyToDatasets, augmentedDatasets} = datasetIds.reduce(
1049
+ (acc, datasetId) => {
1050
+ const dataset = updatedDatasets[datasetId];
1051
+ const layers = state.layers.filter(l => l.config.dataId === dataset.id);
1052
+ const {filter: updatedFilter, dataset: updatedDataset} = validateFilterWithData(
1053
+ acc.augmentedDatasets[datasetId] || dataset,
1054
+ filter,
1055
+ layers
1056
+ );
1057
+
1058
+ if (updatedFilter) {
1059
+ return {
1060
+ ...acc,
1061
+ // merge filter props
1062
+ filter: acc.filter
1063
+ ? {
1064
+ ...acc.filter,
1065
+ ...mergeFilterDomainStep(acc, updatedFilter)
1066
+ }
1067
+ : updatedFilter,
1068
+
1069
+ applyToDatasets: [...acc.applyToDatasets, datasetId],
1070
+
1071
+ augmentedDatasets: {
1072
+ ...acc.augmentedDatasets,
1073
+ [datasetId]: updatedDataset
1074
+ }
1075
+ };
1076
+ }
1077
+
1078
+ return acc;
1079
+ },
1080
+ {
1081
+ filter: null,
1082
+ applyToDatasets: [],
1083
+ augmentedDatasets: {}
1084
+ }
1085
+ );
1086
+
1087
+ if (validatedFilter && isEqual(datasetIds, applyToDatasets)) {
1088
+ validated.push(validatedFilter);
1089
+ updatedDatasets = {
1090
+ ...updatedDatasets,
1091
+ ...augmentedDatasets
1092
+ };
1093
+ }
1094
+ } else {
1095
+ failed.push(filter);
1096
+ }
1097
+ });
1098
+
1099
+ return {validated, failed, updatedDatasets};
1100
+ }
1101
+
1102
+ /**
1103
+ * Retrieve interval bins for time filter
1104
+ * @type {typeof import('./filter-utils').getIntervalBins}
1105
+ */
1106
+ export function getIntervalBins(filter) {
1107
+ const {bins} = filter;
1108
+ const interval = filter.plotType?.interval;
1109
+ if (!interval || !bins || Object.keys(bins).length === 0) {
1110
+ return null;
1111
+ }
1112
+ const values = Object.values(bins);
1113
+ return values[0] ? values[0][interval] : null;
1114
+ }