@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.
- package/CHANGELOG.md +939 -0
- package/LICENSE +19 -0
- package/README.md +63 -0
- package/actions.js +21 -0
- package/cloud-providers.js +21 -0
- package/components.js +21 -0
- package/constants.js +21 -0
- package/dist/actions/action-wrapper.js +218 -0
- package/dist/actions/actions.js +198 -0
- package/dist/actions/identity-actions.js +105 -0
- package/dist/actions/index.js +161 -0
- package/dist/actions/map-state-actions.js +112 -0
- package/dist/actions/map-style-actions.js +167 -0
- package/dist/actions/provider-actions.js +129 -0
- package/dist/actions/ui-state-actions.js +316 -0
- package/dist/actions/vis-state-actions.js +1045 -0
- package/dist/cloud-providers/index.js +22 -0
- package/dist/cloud-providers/provider.js +386 -0
- package/dist/components/bottom-widget.js +215 -0
- package/dist/components/common/action-panel.js +134 -0
- package/dist/components/common/animation-control/animation-control.js +126 -0
- package/dist/components/common/animation-control/animation-controller.js +273 -0
- package/dist/components/common/animation-control/animation-speed-slider.js +101 -0
- package/dist/components/common/animation-control/floating-time-display.js +157 -0
- package/dist/components/common/animation-control/playback-controls.js +278 -0
- package/dist/components/common/animation-control/speed-control.js +68 -0
- package/dist/components/common/checkbox.js +155 -0
- package/dist/components/common/color-legend.js +249 -0
- package/dist/components/common/data-table/button.js +46 -0
- package/dist/components/common/data-table/canvas.js +32 -0
- package/dist/components/common/data-table/cell-size.js +174 -0
- package/dist/components/common/data-table/grid.js +84 -0
- package/dist/components/common/data-table/index.js +514 -0
- package/dist/components/common/data-table/option-dropdown.js +103 -0
- package/dist/components/common/dataset-label.js +36 -0
- package/dist/components/common/error-boundary.js +83 -0
- package/dist/components/common/field-selector.js +282 -0
- package/dist/components/common/field-token.js +42 -0
- package/dist/components/common/file-uploader/file-drop.js +227 -0
- package/dist/components/common/file-uploader/file-upload-progress.js +102 -0
- package/dist/components/common/file-uploader/file-upload.js +304 -0
- package/dist/components/common/file-uploader/upload-button.js +111 -0
- package/dist/components/common/histogram-plot.js +102 -0
- package/dist/components/common/icons/add.js +64 -0
- package/dist/components/common/icons/anchor_window.js +62 -0
- package/dist/components/common/icons/arrow-down-alt.js +64 -0
- package/dist/components/common/icons/arrow-down-solid .js +64 -0
- package/dist/components/common/icons/arrow-down.js +64 -0
- package/dist/components/common/icons/arrow-left.js +67 -0
- package/dist/components/common/icons/arrow-right.js +64 -0
- package/dist/components/common/icons/arrow-up-alt.js +65 -0
- package/dist/components/common/icons/arrow-up-solid.js +64 -0
- package/dist/components/common/icons/arrow-up.js +64 -0
- package/dist/components/common/icons/base.js +110 -0
- package/dist/components/common/icons/bug.js +66 -0
- package/dist/components/common/icons/cancel.js +64 -0
- package/dist/components/common/icons/checkmark.js +71 -0
- package/dist/components/common/icons/chevron-right.js +69 -0
- package/dist/components/common/icons/clipboard.js +65 -0
- package/dist/components/common/icons/clock.js +66 -0
- package/dist/components/common/icons/close.js +69 -0
- package/dist/components/common/icons/code-alt.js +68 -0
- package/dist/components/common/icons/copy.js +70 -0
- package/dist/components/common/icons/crosshairs.js +68 -0
- package/dist/components/common/icons/cube-3d.js +68 -0
- package/dist/components/common/icons/cursor-click.js +68 -0
- package/dist/components/common/icons/data-table.js +65 -0
- package/dist/components/common/icons/db.js +65 -0
- package/dist/components/common/icons/delete.js +65 -0
- package/dist/components/common/icons/docs.js +80 -0
- package/dist/components/common/icons/drag-n-drop.js +66 -0
- package/dist/components/common/icons/draw-polygon.js +87 -0
- package/dist/components/common/icons/email.js +68 -0
- package/dist/components/common/icons/expand.js +66 -0
- package/dist/components/common/icons/eye-seen.js +66 -0
- package/dist/components/common/icons/eye-unseen.js +66 -0
- package/dist/components/common/icons/file-type.js +45 -0
- package/dist/components/common/icons/file.js +64 -0
- package/dist/components/common/icons/files.js +66 -0
- package/dist/components/common/icons/filter-funnel.js +64 -0
- package/dist/components/common/icons/free-window.js +62 -0
- package/dist/components/common/icons/gear.js +66 -0
- package/dist/components/common/icons/hash.js +64 -0
- package/dist/components/common/icons/histogram.js +64 -0
- package/dist/components/common/icons/index.js +612 -0
- package/dist/components/common/icons/info.js +78 -0
- package/dist/components/common/icons/layers.js +64 -0
- package/dist/components/common/icons/left-arrow.js +68 -0
- package/dist/components/common/icons/legend.js +64 -0
- package/dist/components/common/icons/line-chart.js +63 -0
- package/dist/components/common/icons/login.js +66 -0
- package/dist/components/common/icons/logout.js +65 -0
- package/dist/components/common/icons/map-icon.js +73 -0
- package/dist/components/common/icons/map.js +73 -0
- package/dist/components/common/icons/messages.js +64 -0
- package/dist/components/common/icons/minus.js +64 -0
- package/dist/components/common/icons/pause.js +64 -0
- package/dist/components/common/icons/picture.js +66 -0
- package/dist/components/common/icons/pin.js +64 -0
- package/dist/components/common/icons/play.js +64 -0
- package/dist/components/common/icons/polygon.js +89 -0
- package/dist/components/common/icons/rectangle.js +90 -0
- package/dist/components/common/icons/reduce.js +67 -0
- package/dist/components/common/icons/reset.js +64 -0
- package/dist/components/common/icons/rocket.js +64 -0
- package/dist/components/common/icons/save.js +66 -0
- package/dist/components/common/icons/save2.js +70 -0
- package/dist/components/common/icons/search.js +66 -0
- package/dist/components/common/icons/settings.js +66 -0
- package/dist/components/common/icons/share.js +64 -0
- package/dist/components/common/icons/split.js +92 -0
- package/dist/components/common/icons/square-select.js +66 -0
- package/dist/components/common/icons/swap-horizontal.js +68 -0
- package/dist/components/common/icons/table.js +63 -0
- package/dist/components/common/icons/trash.js +66 -0
- package/dist/components/common/icons/upload.js +65 -0
- package/dist/components/common/icons/vert-dots.js +102 -0
- package/dist/components/common/icons/vert-three-dots.js +77 -0
- package/dist/components/common/icons/warning.js +79 -0
- package/dist/components/common/image-preview.js +73 -0
- package/dist/components/common/info-helper.js +84 -0
- package/dist/components/common/item-selector/accessor.js +56 -0
- package/dist/components/common/item-selector/chickleted-input.js +118 -0
- package/dist/components/common/item-selector/dropdown-list.js +316 -0
- package/dist/components/common/item-selector/item-selector-submenu.js +99 -0
- package/dist/components/common/item-selector/item-selector.js +363 -0
- package/dist/components/common/item-selector/typeahead.js +496 -0
- package/dist/components/common/line-chart.js +125 -0
- package/dist/components/common/loading-spinner.js +58 -0
- package/dist/components/common/logo.js +92 -0
- package/dist/components/common/map-layer-selector.js +50 -0
- package/dist/components/common/modal.js +204 -0
- package/dist/components/common/portaled.js +317 -0
- package/dist/components/common/progress-bar.js +56 -0
- package/dist/components/common/range-brush.js +319 -0
- package/dist/components/common/range-plot.js +148 -0
- package/dist/components/common/range-slider.js +346 -0
- package/dist/components/common/slider/mouse-event.js +136 -0
- package/dist/components/common/slider/slider-bar-handle.js +122 -0
- package/dist/components/common/slider/slider-handle.js +167 -0
- package/dist/components/common/slider/slider.js +268 -0
- package/dist/components/common/styled-components.js +395 -0
- package/dist/components/common/switch.js +47 -0
- package/dist/components/common/time-range-slider-time-title.js +74 -0
- package/dist/components/common/time-range-slider.js +131 -0
- package/dist/components/common/time-slider-marker.js +141 -0
- package/dist/components/common/toolbar-item.js +67 -0
- package/dist/components/common/toolbar.js +33 -0
- package/dist/components/common/vertical-toolbar.js +22 -0
- package/dist/components/container.js +217 -0
- package/dist/components/context.js +42 -0
- package/dist/components/editor/constants.js +47 -0
- package/dist/components/editor/editor.js +274 -0
- package/dist/components/editor/feature-action-panel.js +154 -0
- package/dist/components/editor/feature-styles.js +72 -0
- package/dist/components/editor/handle-style.js +80 -0
- package/dist/components/filters/components.js +20 -0
- package/dist/components/filters/filter-panels/filter-panel-with-field-select.js +110 -0
- package/dist/components/filters/filter-panels/multi-select-filter-panel.js +80 -0
- package/dist/components/filters/filter-panels/new-filter-panel.js +101 -0
- package/dist/components/filters/filter-panels/polygon-filter-panel.js +102 -0
- package/dist/components/filters/filter-panels/range-filter-panel.js +80 -0
- package/dist/components/filters/filter-panels/single-select-filter-panel.js +80 -0
- package/dist/components/filters/filter-panels/time-range-filter-panel.js +92 -0
- package/dist/components/filters/index.js +48 -0
- package/dist/components/filters/multi-select-filter.js +54 -0
- package/dist/components/filters/polygon-filter.js +96 -0
- package/dist/components/filters/range-filter.js +53 -0
- package/dist/components/filters/single-select-filter.js +63 -0
- package/dist/components/filters/time-range-filter.js +86 -0
- package/dist/components/filters/time-widget.js +173 -0
- package/dist/components/geocoder/geocoder.js +315 -0
- package/dist/components/geocoder-panel.js +224 -0
- package/dist/components/index.js +1485 -0
- package/dist/components/injector.js +178 -0
- package/dist/components/kepler-gl.js +563 -0
- package/dist/components/map/coordinate-info.js +68 -0
- package/dist/components/map/layer-hover-info.js +176 -0
- package/dist/components/map/layer-selector-panel.js +116 -0
- package/dist/components/map/locale-panel.js +113 -0
- package/dist/components/map/map-control-panel.js +79 -0
- package/dist/components/map/map-control-toolbar.js +25 -0
- package/dist/components/map/map-control-tooltip.js +55 -0
- package/dist/components/map/map-control.js +80 -0
- package/dist/components/map/map-draw-panel.js +142 -0
- package/dist/components/map/map-legend-panel.js +124 -0
- package/dist/components/map/map-legend.js +244 -0
- package/dist/components/map/map-popover.js +204 -0
- package/dist/components/map/split-map-button.js +98 -0
- package/dist/components/map/toggle-3d-button.js +86 -0
- package/dist/components/map-container.js +562 -0
- package/dist/components/maps-layout.js +58 -0
- package/dist/components/modal-container.js +536 -0
- package/dist/components/modals/add-map-style-modal.js +288 -0
- package/dist/components/modals/cloud-tile.js +124 -0
- package/dist/components/modals/data-table-modal.js +249 -0
- package/dist/components/modals/delete-data-modal.js +54 -0
- package/dist/components/modals/error-display.js +51 -0
- package/dist/components/modals/export-data-modal.js +227 -0
- package/dist/components/modals/export-image-modal.js +136 -0
- package/dist/components/modals/export-map-modal/components.js +51 -0
- package/dist/components/modals/export-map-modal/export-html-map.js +141 -0
- package/dist/components/modals/export-map-modal/export-json-map.js +87 -0
- package/dist/components/modals/export-map-modal/export-map-modal.js +133 -0
- package/dist/components/modals/image-modal-container.js +90 -0
- package/dist/components/modals/load-data-modal.js +97 -0
- package/dist/components/modals/load-storage-map.js +288 -0
- package/dist/components/modals/loading-dialog.js +48 -0
- package/dist/components/modals/modal-dialog.js +37 -0
- package/dist/components/modals/modal-tabs.js +99 -0
- package/dist/components/modals/overwrite-map-modal.js +80 -0
- package/dist/components/modals/provider-modal-container.js +84 -0
- package/dist/components/modals/save-map-modal.js +207 -0
- package/dist/components/modals/share-map-modal.js +202 -0
- package/dist/components/modals/status-panel.js +83 -0
- package/dist/components/modals/storage-map-viewer.js +135 -0
- package/dist/components/notification-panel/notification-item.js +164 -0
- package/dist/components/notification-panel.js +87 -0
- package/dist/components/performance.js +134 -0
- package/dist/components/plot-container.js +275 -0
- package/dist/components/side-panel/cloud-storage-dropdown.js +63 -0
- package/dist/components/side-panel/common/dataset-info.js +43 -0
- package/dist/components/side-panel/common/dataset-tag.js +42 -0
- package/dist/components/side-panel/common/dataset-title.js +170 -0
- package/dist/components/side-panel/common/source-data-catalog.js +60 -0
- package/dist/components/side-panel/common/source-data-selector.js +120 -0
- package/dist/components/side-panel/custom-panel.js +60 -0
- package/dist/components/side-panel/filter-manager.js +132 -0
- package/dist/components/side-panel/filter-panel/filter-panel-header.js +70 -0
- package/dist/components/side-panel/filter-panel/filter-panel.js +145 -0
- package/dist/components/side-panel/interaction-manager.js +58 -0
- package/dist/components/side-panel/interaction-panel/brush-config.js +54 -0
- package/dist/components/side-panel/interaction-panel/interaction-panel.js +168 -0
- package/dist/components/side-panel/interaction-panel/tooltip-config/tooltip-chicklet.js +250 -0
- package/dist/components/side-panel/interaction-panel/tooltip-config.js +163 -0
- package/dist/components/side-panel/layer-manager.js +321 -0
- package/dist/components/side-panel/layer-panel/color-dimension-scale-selector.js +45 -0
- package/dist/components/side-panel/layer-panel/color-palette.js +83 -0
- package/dist/components/side-panel/layer-panel/color-range-selector.js +370 -0
- package/dist/components/side-panel/layer-panel/color-selector.js +226 -0
- package/dist/components/side-panel/layer-panel/column-selector.js +65 -0
- package/dist/components/side-panel/layer-panel/custom-markers-config-group.js +40 -0
- package/dist/components/side-panel/layer-panel/custom-palette.js +318 -0
- package/dist/components/side-panel/layer-panel/custom-picker.js +128 -0
- package/dist/components/side-panel/layer-panel/dimension-scale-selector.js +61 -0
- package/dist/components/side-panel/layer-panel/layer-aggregation-resolution.js +26 -0
- package/dist/components/side-panel/layer-panel/layer-column-config.js +93 -0
- package/dist/components/side-panel/layer-panel/layer-config-group.js +245 -0
- package/dist/components/side-panel/layer-panel/layer-configurator.js +977 -0
- package/dist/components/side-panel/layer-panel/layer-panel-header.js +222 -0
- package/dist/components/side-panel/layer-panel/layer-panel.js +201 -0
- package/dist/components/side-panel/layer-panel/layer-type-dropdown-list.js +89 -0
- package/dist/components/side-panel/layer-panel/layer-type-list-item.js +71 -0
- package/dist/components/side-panel/layer-panel/layer-type-selector.js +96 -0
- package/dist/components/side-panel/layer-panel/layer-visibility-by-zoom.js +111 -0
- package/dist/components/side-panel/layer-panel/single-color-palette.js +109 -0
- package/dist/components/side-panel/layer-panel/text-label-panel.js +175 -0
- package/dist/components/side-panel/layer-panel/vis-config-by-field-selector.js +174 -0
- package/dist/components/side-panel/layer-panel/vis-config-slider.js +90 -0
- package/dist/components/side-panel/layer-panel/vis-config-switch.js +84 -0
- package/dist/components/side-panel/map-manager.js +155 -0
- package/dist/components/side-panel/map-style-panel/map-layer-selector.js +106 -0
- package/dist/components/side-panel/map-style-panel/map-style-selector.js +78 -0
- package/dist/components/side-panel/panel-dropdown.js +86 -0
- package/dist/components/side-panel/panel-header-action.js +121 -0
- package/dist/components/side-panel/panel-header.js +351 -0
- package/dist/components/side-panel/panel-tab.js +68 -0
- package/dist/components/side-panel/panel-title.js +28 -0
- package/dist/components/side-panel/panel-toggle.js +69 -0
- package/dist/components/side-panel/side-bar.js +164 -0
- package/dist/components/side-panel.js +242 -0
- package/dist/connect/keplergl-connect.js +68 -0
- package/dist/connect/with-local-selector.js +110 -0
- package/dist/constants/action-types.js +180 -0
- package/dist/constants/color-palette.js +547 -0
- package/dist/constants/color-ranges.js +70 -0
- package/dist/constants/custom-color-ranges.js +415 -0
- package/dist/constants/default-settings.js +902 -0
- package/dist/constants/index.js +370 -0
- package/dist/constants/keyevent.js +47 -0
- package/dist/constants/tooltip.js +205 -0
- package/dist/constants/user-feedbacks.js +33 -0
- package/dist/constants/user-guides.js +44 -0
- package/dist/deckgl-layers/3d-building-layer/3d-building-layer.js +88 -0
- package/dist/deckgl-layers/3d-building-layer/3d-building-utils.js +214 -0
- package/dist/deckgl-layers/cluster-layer/cluster-layer.js +334 -0
- package/dist/deckgl-layers/column-layer/enhanced-column-layer.js +78 -0
- package/dist/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.js +96 -0
- package/dist/deckgl-layers/hexagon-layer/enhanced-hexagon-layer.js +96 -0
- package/dist/deckgl-layers/layer-utils/cluster-utils.js +119 -0
- package/dist/deckgl-layers/layer-utils/cpu-aggregator.js +643 -0
- package/dist/deckgl-layers/layer-utils/shader-utils.js +50 -0
- package/dist/deckgl-layers/line-layer/line-layer.js +111 -0
- package/dist/deckgl-layers/svg-icon-layer/scatterplot-icon-layer.js +78 -0
- package/dist/deckgl-layers/svg-icon-layer/svg-icon-layer.js +120 -0
- package/dist/index.js +155 -0
- package/dist/layers/aggregation-layer.js +416 -0
- package/dist/layers/arc-layer/arc-layer-icon.js +77 -0
- package/dist/layers/arc-layer/arc-layer.js +275 -0
- package/dist/layers/base-layer.js +1688 -0
- package/dist/layers/cluster-layer/cluster-layer-icon.js +80 -0
- package/dist/layers/cluster-layer/cluster-layer.js +151 -0
- package/dist/layers/default-layer-icon.js +87 -0
- package/dist/layers/geojson-layer/geojson-layer-icon.js +91 -0
- package/dist/layers/geojson-layer/geojson-layer.js +446 -0
- package/dist/layers/geojson-layer/geojson-utils.js +183 -0
- package/dist/layers/grid-layer/grid-layer-icon.js +136 -0
- package/dist/layers/grid-layer/grid-layer.js +115 -0
- package/dist/layers/grid-layer/grid-utils.js +62 -0
- package/dist/layers/h3-hexagon-layer/h3-hexagon-layer-icon.js +71 -0
- package/dist/layers/h3-hexagon-layer/h3-hexagon-layer.js +346 -0
- package/dist/layers/h3-hexagon-layer/h3-utils.js +97 -0
- package/dist/layers/heatmap-layer/heatmap-layer-icon.js +88 -0
- package/dist/layers/heatmap-layer/heatmap-layer.js +269 -0
- package/dist/layers/hexagon-layer/hexagon-layer-icon.js +100 -0
- package/dist/layers/hexagon-layer/hexagon-layer.js +120 -0
- package/dist/layers/hexagon-layer/hexagon-utils.js +74 -0
- package/dist/layers/icon-layer/icon-info-modal.js +117 -0
- package/dist/layers/icon-layer/icon-layer-icon.js +73 -0
- package/dist/layers/icon-layer/icon-layer.js +392 -0
- package/dist/layers/index.js +97 -0
- package/dist/layers/layer-factory.js +499 -0
- package/dist/layers/layer-text-label.js +72 -0
- package/dist/layers/layer-update.js +85 -0
- package/dist/layers/line-layer/line-layer-icon.js +79 -0
- package/dist/layers/line-layer/line-layer.js +209 -0
- package/dist/layers/mapbox-utils.js +204 -0
- package/dist/layers/mapboxgl-layer.js +210 -0
- package/dist/layers/point-layer/point-layer-icon.js +94 -0
- package/dist/layers/point-layer/point-layer.js +475 -0
- package/dist/layers/s2-geometry-layer/s2-geometry-layer.js +334 -0
- package/dist/layers/s2-geometry-layer/s2-layer-icon.js +70 -0
- package/dist/layers/s2-geometry-layer/s2-utils.js +51 -0
- package/dist/layers/scenegraph-layer/scenegraph-info-modal.js +48 -0
- package/dist/layers/scenegraph-layer/scenegraph-layer-icon.js +151 -0
- package/dist/layers/scenegraph-layer/scenegraph-layer.js +250 -0
- package/dist/layers/trip-layer/trip-info-modal.js +54 -0
- package/dist/layers/trip-layer/trip-layer-icon.js +89 -0
- package/dist/layers/trip-layer/trip-layer.js +403 -0
- package/dist/layers/trip-layer/trip-utils.js +204 -0
- package/dist/layers/types.js +47 -0
- package/dist/localization/en.js +480 -0
- package/dist/localization/formatted-message.js +45 -0
- package/dist/localization/index.js +60 -0
- package/dist/localization/locales.js +64 -0
- package/dist/middleware/index.js +47 -0
- package/dist/processors/data-processor.js +784 -0
- package/dist/processors/file-handler.js +432 -0
- package/dist/processors/index.js +106 -0
- package/dist/reducers/combined-updaters.js +195 -0
- package/dist/reducers/composer-helpers.js +110 -0
- package/dist/reducers/composers.js +27 -0
- package/dist/reducers/core.js +156 -0
- package/dist/reducers/index.js +139 -0
- package/dist/reducers/map-state-updaters.js +239 -0
- package/dist/reducers/map-state.js +47 -0
- package/dist/reducers/map-style-updaters.js +531 -0
- package/dist/reducers/map-style.js +46 -0
- package/dist/reducers/provider-state-updaters.js +541 -0
- package/dist/reducers/provider-state.js +46 -0
- package/dist/reducers/root.js +218 -0
- package/dist/reducers/ui-state-updaters.js +855 -0
- package/dist/reducers/ui-state.js +47 -0
- package/dist/reducers/vis-state-merger.js +615 -0
- package/dist/reducers/vis-state-selectors.js +52 -0
- package/dist/reducers/vis-state-updaters.js +2433 -0
- package/dist/reducers/vis-state.js +46 -0
- package/dist/schemas/dataset-schema.js +189 -0
- package/dist/schemas/index.js +132 -0
- package/dist/schemas/map-state-schema.js +49 -0
- package/dist/schemas/map-style-schema.js +122 -0
- package/dist/schemas/schema-manager.js +262 -0
- package/dist/schemas/schema-utils.js +62 -0
- package/dist/schemas/schema.js +114 -0
- package/dist/schemas/versions.js +38 -0
- package/dist/schemas/vis-state-schema.js +1071 -0
- package/dist/styles/base.js +1570 -0
- package/dist/styles/index.js +32 -0
- package/dist/styles/media-breakpoints.js +39 -0
- package/dist/tasks/tasks.js +122 -0
- package/dist/templates/export-map-html.js +45 -0
- package/dist/utils/aggregate-utils.js +75 -0
- package/dist/utils/color-utils.js +135 -0
- package/dist/utils/data-scale-utils.js +84 -0
- package/dist/utils/data-utils.js +491 -0
- package/dist/utils/dataset-utils.js +254 -0
- package/dist/utils/dom-to-image.js +557 -0
- package/dist/utils/dom-utils.js +425 -0
- package/dist/utils/export-utils.js +297 -0
- package/dist/utils/filter-utils.js +1286 -0
- package/dist/utils/gl-utils.js +35 -0
- package/dist/utils/gpu-filter-utils.js +261 -0
- package/dist/utils/index.js +226 -0
- package/dist/utils/interaction-utils.js +201 -0
- package/dist/utils/layer-utils.js +205 -0
- package/dist/utils/locale-utils.js +54 -0
- package/dist/utils/map-info-utils.js +32 -0
- package/dist/utils/map-style-utils/mapbox-gl-style-editor.js +212 -0
- package/dist/utils/map-style-utils/mapbox-utils.js +35 -0
- package/dist/utils/mapbox-utils.js +39 -0
- package/dist/utils/notifications-utils.js +89 -0
- package/dist/utils/observe-dimensions.js +147 -0
- package/dist/utils/projection-utils.js +83 -0
- package/dist/utils/searcher-utils.js +45 -0
- package/dist/utils/split-map-utils.js +108 -0
- package/dist/utils/table-utils/data-container-utils.js +69 -0
- package/dist/utils/table-utils/data-row.js +82 -0
- package/dist/utils/table-utils/index.js +20 -0
- package/dist/utils/table-utils/indexed-data-container.js +241 -0
- package/dist/utils/table-utils/kepler-table.js +544 -0
- package/dist/utils/table-utils/row-data-container.js +242 -0
- package/dist/utils/utils.js +234 -0
- package/layers.js +21 -0
- package/localization.js +21 -0
- package/middleware.js +21 -0
- package/package.json +281 -0
- package/processors.js +21 -0
- package/reducers.js +21 -0
- package/schemas.js +21 -0
- package/src/actions/action-wrapper.js +183 -0
- package/src/actions/actions.d.ts +104 -0
- package/src/actions/actions.js +178 -0
- package/src/actions/identity-actions.d.ts +53 -0
- package/src/actions/identity-actions.js +83 -0
- package/src/actions/index.d.ts +23 -0
- package/src/actions/index.js +42 -0
- package/src/actions/map-state-actions.d.ts +46 -0
- package/src/actions/map-state-actions.js +90 -0
- package/src/actions/map-style-actions.d.ts +116 -0
- package/src/actions/map-style-actions.js +135 -0
- package/src/actions/provider-actions.d.ts +203 -0
- package/src/actions/provider-actions.js +94 -0
- package/src/actions/ui-state-actions.d.ts +200 -0
- package/src/actions/ui-state-actions.js +272 -0
- package/src/actions/vis-state-actions.d.ts +502 -0
- package/src/actions/vis-state-actions.js +919 -0
- package/src/cloud-providers/index.d.ts +53 -0
- package/src/cloud-providers/index.js +21 -0
- package/src/cloud-providers/provider.js +233 -0
- package/src/components/bottom-widget.d.ts +33 -0
- package/src/components/bottom-widget.js +235 -0
- package/src/components/common/action-panel.d.ts +24 -0
- package/src/components/common/action-panel.js +177 -0
- package/src/components/common/animation-control/animation-control.js +155 -0
- package/src/components/common/animation-control/animation-controller.js +224 -0
- package/src/components/common/animation-control/animation-speed-slider.js +79 -0
- package/src/components/common/animation-control/floating-time-display.js +192 -0
- package/src/components/common/animation-control/playback-controls.js +278 -0
- package/src/components/common/animation-control/speed-control.js +71 -0
- package/src/components/common/checkbox.js +128 -0
- package/src/components/common/color-legend.js +198 -0
- package/src/components/common/data-table/button.js +47 -0
- package/src/components/common/data-table/canvas.js +43 -0
- package/src/components/common/data-table/cell-size.js +180 -0
- package/src/components/common/data-table/grid.js +55 -0
- package/src/components/common/data-table/index.js +620 -0
- package/src/components/common/data-table/option-dropdown.js +110 -0
- package/src/components/common/dataset-label.js +40 -0
- package/src/components/common/error-boundary.js +43 -0
- package/src/components/common/field-selector.js +233 -0
- package/src/components/common/field-token.js +56 -0
- package/src/components/common/file-uploader/file-drop.d.ts +19 -0
- package/src/components/common/file-uploader/file-drop.js +196 -0
- package/src/components/common/file-uploader/file-upload-progress.d.ts +11 -0
- package/src/components/common/file-uploader/file-upload-progress.js +110 -0
- package/src/components/common/file-uploader/file-upload.d.ts +22 -0
- package/src/components/common/file-uploader/file-upload.js +301 -0
- package/src/components/common/file-uploader/upload-button.d.ts.wip +11 -0
- package/src/components/common/file-uploader/upload-button.js +83 -0
- package/src/components/common/histogram-plot.js +102 -0
- package/src/components/common/icons/add.js +43 -0
- package/src/components/common/icons/anchor_window.js +53 -0
- package/src/components/common/icons/arrow-down-alt.js +43 -0
- package/src/components/common/icons/arrow-down-solid .js +43 -0
- package/src/components/common/icons/arrow-down.js +46 -0
- package/src/components/common/icons/arrow-left.js +48 -0
- package/src/components/common/icons/arrow-right.js +46 -0
- package/src/components/common/icons/arrow-up-alt.js +46 -0
- package/src/components/common/icons/arrow-up-solid.js +43 -0
- package/src/components/common/icons/arrow-up.js +46 -0
- package/src/components/common/icons/base.js +90 -0
- package/src/components/common/icons/bug.js +46 -0
- package/src/components/common/icons/cancel.js +43 -0
- package/src/components/common/icons/checkmark.js +45 -0
- package/src/components/common/icons/chevron-right.js +47 -0
- package/src/components/common/icons/clipboard.js +46 -0
- package/src/components/common/icons/clock.js +44 -0
- package/src/components/common/icons/close.js +49 -0
- package/src/components/common/icons/code-alt.js +43 -0
- package/src/components/common/icons/copy.js +44 -0
- package/src/components/common/icons/crosshairs.js +43 -0
- package/src/components/common/icons/cube-3d.js +45 -0
- package/src/components/common/icons/cursor-click.js +49 -0
- package/src/components/common/icons/data-table.js +45 -0
- package/src/components/common/icons/db.js +45 -0
- package/src/components/common/icons/delete.js +44 -0
- package/src/components/common/icons/docs.js +46 -0
- package/src/components/common/icons/drag-n-drop.js +44 -0
- package/src/components/common/icons/draw-polygon.js +60 -0
- package/src/components/common/icons/email.js +45 -0
- package/src/components/common/icons/expand.js +45 -0
- package/src/components/common/icons/eye-seen.js +44 -0
- package/src/components/common/icons/eye-unseen.js +44 -0
- package/src/components/common/icons/file-type.js +57 -0
- package/src/components/common/icons/file.js +43 -0
- package/src/components/common/icons/files.js +42 -0
- package/src/components/common/icons/filter-funnel.js +43 -0
- package/src/components/common/icons/free-window.js +53 -0
- package/src/components/common/icons/gear.js +45 -0
- package/src/components/common/icons/hash.js +43 -0
- package/src/components/common/icons/histogram.js +47 -0
- package/src/components/common/icons/index.js +96 -0
- package/src/components/common/icons/info.js +54 -0
- package/src/components/common/icons/layers.js +43 -0
- package/src/components/common/icons/left-arrow.js +43 -0
- package/src/components/common/icons/legend.js +43 -0
- package/src/components/common/icons/line-chart.js +45 -0
- package/src/components/common/icons/login.js +46 -0
- package/src/components/common/icons/logout.js +43 -0
- package/src/components/common/icons/map-icon.js +69 -0
- package/src/components/common/icons/map.js +69 -0
- package/src/components/common/icons/messages.js +43 -0
- package/src/components/common/icons/minus.js +45 -0
- package/src/components/common/icons/pause.js +43 -0
- package/src/components/common/icons/picture.js +43 -0
- package/src/components/common/icons/pin.js +43 -0
- package/src/components/common/icons/play.js +43 -0
- package/src/components/common/icons/polygon.js +74 -0
- package/src/components/common/icons/rectangle.js +75 -0
- package/src/components/common/icons/reduce.js +48 -0
- package/src/components/common/icons/reset.js +43 -0
- package/src/components/common/icons/rocket.js +43 -0
- package/src/components/common/icons/save.js +44 -0
- package/src/components/common/icons/save2.js +47 -0
- package/src/components/common/icons/search.js +44 -0
- package/src/components/common/icons/settings.js +45 -0
- package/src/components/common/icons/share.js +43 -0
- package/src/components/common/icons/split.js +63 -0
- package/src/components/common/icons/square-select.js +44 -0
- package/src/components/common/icons/swap-horizontal.js +43 -0
- package/src/components/common/icons/table.js +46 -0
- package/src/components/common/icons/trash.js +51 -0
- package/src/components/common/icons/upload.js +44 -0
- package/src/components/common/icons/vert-dots.js +50 -0
- package/src/components/common/icons/vert-three-dots.js +45 -0
- package/src/components/common/icons/warning.js +46 -0
- package/src/components/common/image-preview.js +111 -0
- package/src/components/common/info-helper.js +84 -0
- package/src/components/common/item-selector/accessor.js +45 -0
- package/src/components/common/item-selector/chickleted-input.js +143 -0
- package/src/components/common/item-selector/dropdown-list.js +250 -0
- package/src/components/common/item-selector/item-selector-submenu.js +68 -0
- package/src/components/common/item-selector/item-selector.d.ts +34 -0
- package/src/components/common/item-selector/item-selector.js +360 -0
- package/src/components/common/item-selector/typeahead.js +507 -0
- package/src/components/common/line-chart.js +134 -0
- package/src/components/common/loading-spinner.js +64 -0
- package/src/components/common/logo.js +92 -0
- package/src/components/common/map-layer-selector.d.ts +10 -0
- package/src/components/common/map-layer-selector.js +54 -0
- package/src/components/common/modal.js +233 -0
- package/src/components/common/portaled.js +264 -0
- package/src/components/common/progress-bar.d.ts +13 -0
- package/src/components/common/progress-bar.js +49 -0
- package/src/components/common/range-brush.js +256 -0
- package/src/components/common/range-plot.js +139 -0
- package/src/components/common/range-slider.js +299 -0
- package/src/components/common/slider/mouse-event.js +97 -0
- package/src/components/common/slider/slider-bar-handle.js +97 -0
- package/src/components/common/slider/slider-handle.js +181 -0
- package/src/components/common/slider/slider.js +213 -0
- package/src/components/common/styled-components.js +657 -0
- package/src/components/common/switch.js +50 -0
- package/src/components/common/time-range-slider-time-title.js +76 -0
- package/src/components/common/time-range-slider.js +163 -0
- package/src/components/common/time-slider-marker.js +168 -0
- package/src/components/common/toolbar-item.d.ts +14 -0
- package/src/components/common/toolbar-item.js +83 -0
- package/src/components/common/toolbar.js +45 -0
- package/src/components/common/vertical-toolbar.js +35 -0
- package/src/components/container.js +173 -0
- package/src/components/context.d.ts +10 -0
- package/src/components/context.js +32 -0
- package/src/components/editor/constants.js +39 -0
- package/src/components/editor/editor.js +218 -0
- package/src/components/editor/feature-action-panel.js +143 -0
- package/src/components/editor/feature-styles.js +75 -0
- package/src/components/editor/handle-style.js +89 -0
- package/src/components/filters/components.js +28 -0
- package/src/components/filters/filter-panels/filter-panel-types.d.ts +28 -0
- package/src/components/filters/filter-panels/filter-panel-with-field-select.js +124 -0
- package/src/components/filters/filter-panels/multi-select-filter-panel.js +75 -0
- package/src/components/filters/filter-panels/new-filter-panel.js +99 -0
- package/src/components/filters/filter-panels/polygon-filter-panel.js +96 -0
- package/src/components/filters/filter-panels/range-filter-panel.js +75 -0
- package/src/components/filters/filter-panels/single-select-filter-panel.js +75 -0
- package/src/components/filters/filter-panels/time-range-filter-panel.js +95 -0
- package/src/components/filters/index.js +25 -0
- package/src/components/filters/multi-select-filter.js +36 -0
- package/src/components/filters/polygon-filter.d.ts +13 -0
- package/src/components/filters/polygon-filter.js +73 -0
- package/src/components/filters/range-filter.js +43 -0
- package/src/components/filters/single-select-filter.js +49 -0
- package/src/components/filters/time-range-filter.js +68 -0
- package/src/components/filters/time-widget.js +228 -0
- package/src/components/geocoder/geocoder.d.ts +33 -0
- package/src/components/geocoder/geocoder.js +272 -0
- package/src/components/geocoder-panel.js +191 -0
- package/src/components/index.js +247 -0
- package/src/components/injector.js +161 -0
- package/src/components/kepler-gl.d.ts +60 -0
- package/src/components/kepler-gl.js +525 -0
- package/src/components/map/coordinate-info.js +53 -0
- package/src/components/map/layer-hover-info.d.ts +12 -0
- package/src/components/map/layer-hover-info.js +185 -0
- package/src/components/map/layer-selector-panel.d.ts +16 -0
- package/src/components/map/layer-selector-panel.js +106 -0
- package/src/components/map/locale-panel.d.ts +12 -0
- package/src/components/map/locale-panel.js +91 -0
- package/src/components/map/map-control-panel.d.ts +11 -0
- package/src/components/map/map-control-panel.js +98 -0
- package/src/components/map/map-control-toolbar.js +33 -0
- package/src/components/map/map-control-tooltip.d.ts +8 -0
- package/src/components/map/map-control-tooltip.js +40 -0
- package/src/components/map/map-control.d.ts +37 -0
- package/src/components/map/map-control.js +100 -0
- package/src/components/map/map-draw-panel.d.ts +16 -0
- package/src/components/map/map-draw-panel.js +125 -0
- package/src/components/map/map-legend-panel.d.ts +20 -0
- package/src/components/map/map-legend-panel.js +100 -0
- package/src/components/map/map-legend.d.ts +58 -0
- package/src/components/map/map-legend.js +228 -0
- package/src/components/map/map-popover.d.ts +28 -0
- package/src/components/map/map-popover.js +250 -0
- package/src/components/map/split-map-button.d.ts +19 -0
- package/src/components/map/split-map-button.js +82 -0
- package/src/components/map/toggle-3d-button.d.ts +16 -0
- package/src/components/map/toggle-3d-button.js +75 -0
- package/src/components/map-container.d.ts +18 -0
- package/src/components/map-container.js +502 -0
- package/src/components/maps-layout.d.ts +5 -0
- package/src/components/maps-layout.js +40 -0
- package/src/components/modal-container.d.ts +38 -0
- package/src/components/modal-container.js +545 -0
- package/src/components/modals/add-map-style-modal.js +301 -0
- package/src/components/modals/cloud-tile.js +147 -0
- package/src/components/modals/data-table-modal.js +217 -0
- package/src/components/modals/delete-data-modal.js +48 -0
- package/src/components/modals/error-display.js +39 -0
- package/src/components/modals/export-data-modal.js +193 -0
- package/src/components/modals/export-image-modal.d.ts +21 -0
- package/src/components/modals/export-image-modal.js +144 -0
- package/src/components/modals/export-map-modal/components.js +42 -0
- package/src/components/modals/export-map-modal/export-html-map.d.ts +21 -0
- package/src/components/modals/export-map-modal/export-html-map.js +145 -0
- package/src/components/modals/export-map-modal/export-json-map.js +100 -0
- package/src/components/modals/export-map-modal/export-map-modal.js +114 -0
- package/src/components/modals/image-modal-container.d.ts +13 -0
- package/src/components/modals/image-modal-container.js +76 -0
- package/src/components/modals/load-data-modal.d.ts +30 -0
- package/src/components/modals/load-data-modal.js +94 -0
- package/src/components/modals/load-storage-map.js +381 -0
- package/src/components/modals/loading-dialog.js +69 -0
- package/src/components/modals/modal-dialog.js +25 -0
- package/src/components/modals/modal-tabs.js +126 -0
- package/src/components/modals/overwrite-map-modal.d.ts +18 -0
- package/src/components/modals/overwrite-map-modal.js +97 -0
- package/src/components/modals/provider-modal-container.d.ts +12 -0
- package/src/components/modals/provider-modal-container.js +60 -0
- package/src/components/modals/save-map-modal.d.ts +32 -0
- package/src/components/modals/save-map-modal.js +244 -0
- package/src/components/modals/share-map-modal.js +208 -0
- package/src/components/modals/status-panel.js +95 -0
- package/src/components/modals/storage-map-viewer.js +177 -0
- package/src/components/notification-panel/notification-item.js +132 -0
- package/src/components/notification-panel.js +72 -0
- package/src/components/performance.js +103 -0
- package/src/components/plot-container.js +228 -0
- package/src/components/side-panel/cloud-storage-dropdown.js +52 -0
- package/src/components/side-panel/common/dataset-info.js +45 -0
- package/src/components/side-panel/common/dataset-tag.js +55 -0
- package/src/components/side-panel/common/dataset-title.js +146 -0
- package/src/components/side-panel/common/source-data-catalog.js +61 -0
- package/src/components/side-panel/common/source-data-selector.js +79 -0
- package/src/components/side-panel/custom-panel.js +50 -0
- package/src/components/side-panel/filter-manager.js +105 -0
- package/src/components/side-panel/filter-panel/filter-panel-header.js +83 -0
- package/src/components/side-panel/filter-panel/filter-panel.js +126 -0
- package/src/components/side-panel/interaction-manager.js +46 -0
- package/src/components/side-panel/interaction-panel/brush-config.js +51 -0
- package/src/components/side-panel/interaction-panel/interaction-panel.js +115 -0
- package/src/components/side-panel/interaction-panel/tooltip-config/tooltip-chicklet.js +199 -0
- package/src/components/side-panel/interaction-panel/tooltip-config.js +190 -0
- package/src/components/side-panel/layer-manager.js +290 -0
- package/src/components/side-panel/layer-panel/color-dimension-scale-selector.js +33 -0
- package/src/components/side-panel/layer-panel/color-palette.js +90 -0
- package/src/components/side-panel/layer-panel/color-range-selector.js +322 -0
- package/src/components/side-panel/layer-panel/color-selector.js +193 -0
- package/src/components/side-panel/layer-panel/column-selector.js +70 -0
- package/src/components/side-panel/layer-panel/custom-markers-config-group.js +30 -0
- package/src/components/side-panel/layer-panel/custom-palette.js +296 -0
- package/src/components/side-panel/layer-panel/custom-picker.js +88 -0
- package/src/components/side-panel/layer-panel/dimension-scale-selector.js +48 -0
- package/src/components/side-panel/layer-panel/layer-aggregation-resolution.js +13 -0
- package/src/components/side-panel/layer-panel/layer-column-config.js +113 -0
- package/src/components/side-panel/layer-panel/layer-config-group.js +237 -0
- package/src/components/side-panel/layer-panel/layer-configurator.js +1317 -0
- package/src/components/side-panel/layer-panel/layer-panel-header.js +236 -0
- package/src/components/side-panel/layer-panel/layer-panel.js +171 -0
- package/src/components/side-panel/layer-panel/layer-type-dropdown-list.js +105 -0
- package/src/components/side-panel/layer-panel/layer-type-list-item.js +83 -0
- package/src/components/side-panel/layer-panel/layer-type-selector.js +89 -0
- package/src/components/side-panel/layer-panel/layer-visibility-by-zoom.js +123 -0
- package/src/components/side-panel/layer-panel/single-color-palette.js +98 -0
- package/src/components/side-panel/layer-panel/text-label-panel.js +179 -0
- package/src/components/side-panel/layer-panel/vis-config-by-field-selector.js +163 -0
- package/src/components/side-panel/layer-panel/vis-config-slider.js +82 -0
- package/src/components/side-panel/layer-panel/vis-config-switch.js +87 -0
- package/src/components/side-panel/map-manager.js +114 -0
- package/src/components/side-panel/map-style-panel/map-layer-selector.js +128 -0
- package/src/components/side-panel/map-style-panel/map-style-selector.js +111 -0
- package/src/components/side-panel/panel-dropdown.js +53 -0
- package/src/components/side-panel/panel-header-action.js +106 -0
- package/src/components/side-panel/panel-header.js +321 -0
- package/src/components/side-panel/panel-tab.js +62 -0
- package/src/components/side-panel/panel-title.js +32 -0
- package/src/components/side-panel/panel-toggle.js +70 -0
- package/src/components/side-panel/side-bar.js +136 -0
- package/src/components/side-panel.d.ts +33 -0
- package/src/components/side-panel.js +253 -0
- package/src/connect/keplergl-connect.js +47 -0
- package/src/connect/with-local-selector.d.ts +11 -0
- package/src/connect/with-local-selector.js +67 -0
- package/src/constants/action-types.d.ts +135 -0
- package/src/constants/action-types.js +184 -0
- package/src/constants/color-palette.js +553 -0
- package/src/constants/color-ranges.js +63 -0
- package/src/constants/custom-color-ranges.js +551 -0
- package/src/constants/default-settings.js +991 -0
- package/src/constants/index.js +80 -0
- package/src/constants/keyevent.js +36 -0
- package/src/constants/tooltip.js +198 -0
- package/src/constants/user-feedbacks.js +32 -0
- package/src/constants/user-guides.js +32 -0
- package/src/deckgl-layers/3d-building-layer/3d-building-layer.js +56 -0
- package/src/deckgl-layers/3d-building-layer/3d-building-utils.js +192 -0
- package/src/deckgl-layers/cluster-layer/cluster-layer.js +255 -0
- package/src/deckgl-layers/column-layer/enhanced-column-layer.js +63 -0
- package/src/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.js +70 -0
- package/src/deckgl-layers/hexagon-layer/enhanced-hexagon-layer.js +70 -0
- package/src/deckgl-layers/layer-utils/cluster-utils.js +76 -0
- package/src/deckgl-layers/layer-utils/cpu-aggregator.js +583 -0
- package/src/deckgl-layers/layer-utils/shader-utils.js +41 -0
- package/src/deckgl-layers/line-layer/line-layer.js +122 -0
- package/src/deckgl-layers/svg-icon-layer/scatterplot-icon-layer.js +57 -0
- package/src/deckgl-layers/svg-icon-layer/svg-icon-layer.js +85 -0
- package/src/index.js +52 -0
- package/src/layers/aggregation-layer.js +356 -0
- package/src/layers/arc-layer/arc-layer-icon.js +67 -0
- package/src/layers/arc-layer/arc-layer.js +221 -0
- package/src/layers/base-layer.js +1439 -0
- package/src/layers/cluster-layer/cluster-layer-icon.js +71 -0
- package/src/layers/cluster-layer/cluster-layer.js +125 -0
- package/src/layers/default-layer-icon.js +50 -0
- package/src/layers/geojson-layer/geojson-layer-icon.js +68 -0
- package/src/layers/geojson-layer/geojson-layer.js +344 -0
- package/src/layers/geojson-layer/geojson-utils.js +179 -0
- package/src/layers/grid-layer/grid-layer-icon.js +53 -0
- package/src/layers/grid-layer/grid-layer.js +95 -0
- package/src/layers/grid-layer/grid-utils.js +71 -0
- package/src/layers/h3-hexagon-layer/h3-hexagon-layer-icon.js +48 -0
- package/src/layers/h3-hexagon-layer/h3-hexagon-layer.js +264 -0
- package/src/layers/h3-hexagon-layer/h3-utils.js +65 -0
- package/src/layers/heatmap-layer/heatmap-layer-icon.js +64 -0
- package/src/layers/heatmap-layer/heatmap-layer.js +226 -0
- package/src/layers/hexagon-layer/hexagon-layer-icon.js +74 -0
- package/src/layers/hexagon-layer/hexagon-layer.js +95 -0
- package/src/layers/hexagon-layer/hexagon-utils.js +63 -0
- package/src/layers/icon-layer/icon-info-modal.js +155 -0
- package/src/layers/icon-layer/icon-layer-icon.js +56 -0
- package/src/layers/icon-layer/icon-layer.js +324 -0
- package/src/layers/index.d.ts +126 -0
- package/src/layers/index.js +72 -0
- package/src/layers/layer-factory.d.ts +148 -0
- package/src/layers/layer-factory.js +480 -0
- package/src/layers/layer-text-label.js +62 -0
- package/src/layers/layer-update.js +71 -0
- package/src/layers/line-layer/line-layer-icon.js +69 -0
- package/src/layers/line-layer/line-layer.js +161 -0
- package/src/layers/mapbox-utils.js +195 -0
- package/src/layers/mapboxgl-layer.js +154 -0
- package/src/layers/point-layer/point-layer-icon.js +51 -0
- package/src/layers/point-layer/point-layer.js +414 -0
- package/src/layers/s2-geometry-layer/s2-geometry-layer.js +265 -0
- package/src/layers/s2-geometry-layer/s2-layer-icon.js +47 -0
- package/src/layers/s2-geometry-layer/s2-utils.js +36 -0
- package/src/layers/scenegraph-layer/scenegraph-info-modal.js +97 -0
- package/src/layers/scenegraph-layer/scenegraph-layer-icon.js +144 -0
- package/src/layers/scenegraph-layer/scenegraph-layer.js +182 -0
- package/src/layers/trip-layer/trip-info-modal.js +82 -0
- package/src/layers/trip-layer/trip-layer-icon.js +62 -0
- package/src/layers/trip-layer/trip-layer.js +295 -0
- package/src/layers/trip-layer/trip-utils.js +169 -0
- package/src/layers/types.js +37 -0
- package/src/localization/en.js +501 -0
- package/src/localization/formatted-message.js +33 -0
- package/src/localization/index.js +32 -0
- package/src/localization/locales.js +46 -0
- package/src/middleware/index.js +34 -0
- package/src/processors/data-processor.d.ts +57 -0
- package/src/processors/data-processor.js +684 -0
- package/src/processors/file-handler.d.ts +46 -0
- package/src/processors/file-handler.js +220 -0
- package/src/processors/index.js +44 -0
- package/src/reducers/combined-updaters.d.ts +26 -0
- package/src/reducers/combined-updaters.js +198 -0
- package/src/reducers/composer-helpers.d.ts +32 -0
- package/src/reducers/composer-helpers.js +70 -0
- package/src/reducers/composers.js +33 -0
- package/src/reducers/core.d.ts +25 -0
- package/src/reducers/core.js +97 -0
- package/src/reducers/index.d.ts +118 -0
- package/src/reducers/index.js +53 -0
- package/src/reducers/map-state-updaters.d.ts +64 -0
- package/src/reducers/map-state-updaters.js +224 -0
- package/src/reducers/map-state.js +47 -0
- package/src/reducers/map-style-updaters.d.ts +76 -0
- package/src/reducers/map-style-updaters.js +541 -0
- package/src/reducers/map-style.js +53 -0
- package/src/reducers/provider-state-updaters.d.ts +88 -0
- package/src/reducers/provider-state-updaters.js +428 -0
- package/src/reducers/provider-state.js +53 -0
- package/src/reducers/root.js +230 -0
- package/src/reducers/types.d.ts +10 -0
- package/src/reducers/ui-state-updaters.d.ts +198 -0
- package/src/reducers/ui-state-updaters.js +766 -0
- package/src/reducers/ui-state.js +73 -0
- package/src/reducers/vis-state-merger.d.ts +78 -0
- package/src/reducers/vis-state-merger.js +545 -0
- package/src/reducers/vis-state-selectors.js +35 -0
- package/src/reducers/vis-state-updaters.d.ts +534 -0
- package/src/reducers/vis-state-updaters.js +2137 -0
- package/src/reducers/vis-state.js +155 -0
- package/src/schemas/dataset-schema.js +141 -0
- package/src/schemas/index.d.ts +24 -0
- package/src/schemas/index.js +42 -0
- package/src/schemas/map-state-schema.js +52 -0
- package/src/schemas/map-style-schema.js +95 -0
- package/src/schemas/schema-manager.d.ts +229 -0
- package/src/schemas/schema-manager.js +228 -0
- package/src/schemas/schema-utils.js +54 -0
- package/src/schemas/schema.d.ts +47 -0
- package/src/schemas/schema.js +90 -0
- package/src/schemas/versions.d.ts +23 -0
- package/src/schemas/versions.js +28 -0
- package/src/schemas/vis-state-schema.js +731 -0
- package/src/styles/base.js +1620 -0
- package/src/styles/index.js +22 -0
- package/src/styles/media-breakpoints.js +47 -0
- package/src/tasks/tasks.js +92 -0
- package/src/templates/export-map-html.js +262 -0
- package/src/typedefs/README.md +3 -0
- package/src/typedefs/deck.gl__core.d.ts +64 -0
- package/src/typedefs/deck.gl__mesh-layers.d.ts +33 -0
- package/src/utils/aggregate-utils.js +71 -0
- package/src/utils/color-utils.js +106 -0
- package/src/utils/data-scale-utils.d.ts +26 -0
- package/src/utils/data-scale-utils.js +61 -0
- package/src/utils/data-utils.d.ts +45 -0
- package/src/utils/data-utils.js +428 -0
- package/src/utils/dataset-utils.d.ts +10 -0
- package/src/utils/dataset-utils.js +255 -0
- package/src/utils/dom-to-image.js +533 -0
- package/src/utils/dom-utils.js +354 -0
- package/src/utils/export-utils.js +247 -0
- package/src/utils/filter-utils.d.ts +192 -0
- package/src/utils/filter-utils.js +1114 -0
- package/src/utils/gl-utils.js +42 -0
- package/src/utils/gpu-filter-utils.d.ts +28 -0
- package/src/utils/gpu-filter-utils.js +253 -0
- package/src/utils/index.d.ts +5 -0
- package/src/utils/index.js +55 -0
- package/src/utils/interaction-utils.d.ts +36 -0
- package/src/utils/interaction-utils.js +185 -0
- package/src/utils/layer-utils.d.ts +78 -0
- package/src/utils/layer-utils.js +205 -0
- package/src/utils/locale-utils.js +59 -0
- package/src/utils/map-info-utils.js +29 -0
- package/src/utils/map-style-utils/mapbox-gl-style-editor.js +201 -0
- package/src/utils/map-style-utils/mapbox-utils.js +28 -0
- package/src/utils/mapbox-utils.js +27 -0
- package/src/utils/notifications-utils.js +83 -0
- package/src/utils/observe-dimensions.d.ts +18 -0
- package/src/utils/observe-dimensions.js +115 -0
- package/src/utils/projection-utils.js +72 -0
- package/src/utils/searcher-utils.js +37 -0
- package/src/utils/split-map-utils.js +104 -0
- package/src/utils/table-utils/UPGRADE-data-container.md +38 -0
- package/src/utils/table-utils/data-container-interface.d.ts +140 -0
- package/src/utils/table-utils/data-container-utils.d.ts +43 -0
- package/src/utils/table-utils/data-container-utils.js +61 -0
- package/src/utils/table-utils/data-row.d.ts +65 -0
- package/src/utils/table-utils/data-row.js +54 -0
- package/src/utils/table-utils/index.d.ts +1 -0
- package/src/utils/table-utils/index.js +21 -0
- package/src/utils/table-utils/indexed-data-container.d.ts +26 -0
- package/src/utils/table-utils/indexed-data-container.js +152 -0
- package/src/utils/table-utils/kepler-table.d.ts +114 -0
- package/src/utils/table-utils/kepler-table.js +486 -0
- package/src/utils/table-utils/row-data-container.d.ts +30 -0
- package/src/utils/table-utils/row-data-container.js +151 -0
- package/src/utils/utils.js +202 -0
- 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
|
+
}
|