kepler.gl 3.1.0-alpha.6 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/actions/src/action-types.d.ts +2 -0
- package/dist/src/actions/src/ui-state-actions.d.ts +16 -0
- package/dist/src/ai-assistant/src/actions.d.ts +1 -1
- package/dist/src/ai-assistant/src/components/ai-assistant-component.d.ts +2 -1
- package/dist/src/ai-assistant/src/constants.d.ts +3 -3
- package/dist/src/ai-assistant/src/reducers/index.d.ts +1 -1
- package/dist/src/ai-assistant/src/tools/basemap-functions.d.ts +1 -1
- package/dist/src/ai-assistant/src/tools/filter-function.d.ts +1 -1
- package/dist/src/ai-assistant/src/tools/layer-creation-function.d.ts +1 -1
- package/dist/src/ai-assistant/src/tools/layer-style-function.d.ts +1 -1
- package/dist/src/ai-assistant/src/tools/loadurl-function.d.ts +1 -1
- package/dist/src/ai-assistant/src/tools/utils.d.ts +73 -0
- package/dist/src/components/src/common/data-table/index.d.ts +1 -1
- package/dist/src/components/src/common/data-table/option-dropdown.d.ts +3 -3
- package/dist/src/components/src/common/file-uploader/file-drop.d.ts +2 -2
- package/dist/src/components/src/kepler-gl.d.ts +5 -0
- package/dist/src/components/src/loading-indicator.d.ts +13 -0
- package/dist/src/components/src/map-container.d.ts +3 -0
- package/dist/src/constants/src/default-settings.d.ts +1 -0
- package/dist/src/duckdb/src/plugin.d.ts +1 -0
- package/dist/src/duckdb/src/table/duckdb-table-utils.d.ts +13 -0
- package/dist/src/duckdb/src/table/duckdb-table.d.ts +7 -2
- package/dist/src/reducers/src/ui-state-updaters.d.ts +10 -0
- package/dist/src/reducers/src/vis-state-updaters.d.ts +1 -0
- package/dist/src/reducers/src/vis-state.d.ts +4 -0
- package/dist/src/utils/src/application-config.d.ts +2 -0
- package/dist/src/utils/src/observe-dimensions.d.ts +2 -1
- package/package.json +5 -3
- package/src/actions/dist/action-types.d.ts +2 -0
- package/src/actions/dist/action-types.js +2 -1
- package/src/actions/dist/ui-state-actions.d.ts +16 -0
- package/src/actions/dist/ui-state-actions.js +17 -2
- package/src/actions/package.json +8 -8
- package/src/actions/src/action-types.ts +1 -0
- package/src/actions/src/ui-state-actions.ts +22 -0
- package/src/ai-assistant/README.md +76 -0
- package/src/ai-assistant/dist/actions.d.ts +1 -1
- package/src/ai-assistant/dist/actions.js +2 -2
- package/src/ai-assistant/dist/components/ai-assistant-component.d.ts +2 -1
- package/src/ai-assistant/dist/components/ai-assistant-component.js +64 -23
- package/src/ai-assistant/dist/components/ai-assistant-config.js +67 -54
- package/src/ai-assistant/dist/constants.d.ts +3 -3
- package/src/ai-assistant/dist/constants.js +4 -4
- package/src/ai-assistant/dist/reducers/index.d.ts +1 -1
- package/src/ai-assistant/dist/reducers/index.js +2 -2
- package/src/ai-assistant/dist/tools/basemap-functions.d.ts +1 -1
- package/src/ai-assistant/dist/tools/basemap-functions.js +1 -1
- package/src/ai-assistant/dist/tools/filter-function.d.ts +1 -1
- package/src/ai-assistant/dist/tools/filter-function.js +9 -6
- package/src/ai-assistant/dist/tools/layer-creation-function.d.ts +1 -1
- package/src/ai-assistant/dist/tools/layer-creation-function.js +1 -1
- package/src/ai-assistant/dist/tools/layer-style-function.d.ts +1 -1
- package/src/ai-assistant/dist/tools/layer-style-function.js +1 -1
- package/src/ai-assistant/dist/tools/loadurl-function.d.ts +1 -1
- package/src/ai-assistant/dist/tools/loadurl-function.js +1 -1
- package/src/ai-assistant/dist/tools/utils.d.ts +73 -0
- package/src/ai-assistant/dist/tools/utils.js +211 -3
- package/src/ai-assistant/package.json +13 -9
- package/src/ai-assistant/src/actions.ts +2 -2
- package/src/ai-assistant/src/components/ai-assistant-component.tsx +56 -23
- package/src/ai-assistant/src/components/ai-assistant-config.tsx +63 -46
- package/src/ai-assistant/src/config/models.json +32 -0
- package/src/ai-assistant/src/constants.ts +7 -2
- package/src/ai-assistant/src/reducers/index.ts +2 -2
- package/src/ai-assistant/src/tools/basemap-functions.tsx +1 -1
- package/src/ai-assistant/src/tools/filter-function.tsx +11 -7
- package/src/ai-assistant/src/tools/layer-creation-function.tsx +1 -1
- package/src/ai-assistant/src/tools/layer-style-function.tsx +1 -1
- package/src/ai-assistant/src/tools/loadurl-function.tsx +1 -1
- package/src/ai-assistant/src/tools/utils.ts +212 -2
- package/src/cloud-providers/package.json +2 -2
- package/src/common-utils/package.json +3 -3
- package/src/components/dist/common/data-table/header-cell.js +10 -10
- package/src/components/dist/common/data-table/index.d.ts +1 -1
- package/src/components/dist/common/data-table/index.js +1 -1
- package/src/components/dist/common/data-table/option-dropdown.d.ts +3 -3
- package/src/components/dist/common/data-table/option-dropdown.js +5 -5
- package/src/components/dist/common/file-uploader/file-drop.d.ts +2 -2
- package/src/components/dist/common/file-uploader/file-drop.js +1 -1
- package/src/components/dist/common/portaled.js +1 -1
- package/src/components/dist/editor/editor.js +1 -1
- package/src/components/dist/kepler-gl.d.ts +5 -0
- package/src/components/dist/kepler-gl.js +7 -2
- package/src/components/dist/loading-indicator.d.ts +13 -0
- package/src/components/dist/loading-indicator.js +40 -0
- package/src/components/dist/map-container.d.ts +3 -0
- package/src/components/dist/map-container.js +11 -3
- package/src/components/dist/modals/save-map-modal.js +4 -3
- package/src/components/package.json +15 -15
- package/src/components/src/common/data-table/header-cell.tsx +5 -3
- package/src/components/src/common/data-table/index.tsx +1 -1
- package/src/components/src/common/data-table/option-dropdown.tsx +7 -7
- package/src/components/src/common/file-uploader/file-drop.tsx +11 -11
- package/src/components/src/common/portaled.tsx +12 -12
- package/src/components/src/editor/editor.tsx +3 -3
- package/src/components/src/kepler-gl.tsx +7 -2
- package/src/components/src/loading-indicator.tsx +49 -0
- package/src/components/src/map-container.tsx +19 -1
- package/src/components/src/modals/save-map-modal.tsx +6 -2
- package/src/constants/dist/default-settings.d.ts +1 -0
- package/src/constants/dist/default-settings.js +13 -9
- package/src/constants/dist/keyevent.js +1 -1
- package/src/constants/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/72/80/7a7c561d7985e92aab7b9683e7baf5a0286b353a8f2609c4c71099f668d012be027929e4bbac937f9aa0c9a61be3bd4405136f582895f05aa0313c8efa42 +1 -0
- package/src/constants/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/8f/f6/b66955867599392dc69ff1db64419e83c087a82c2e3d4b6418d49ac6bc80e3200dd6c86cdfd4a2cf98ce573f71a5281b86ba3df8a7210e02544f63054191 +1 -0
- package/src/constants/node_modules/.cache/terser-webpack-plugin/index-v5/bd/ba/47ea8fcb11ecd5cd47ad867052e58b1f7e0c8dc5f8918a36fe90eaf45981 +2 -0
- package/src/constants/node_modules/.cache/terser-webpack-plugin/index-v5/f0/6e/aadf3c48345aa72e7b2fb92e8c9788d04986b55caf83daa3fbd749c37c44 +2 -0
- package/src/constants/package.json +2 -2
- package/src/constants/src/default-settings.ts +11 -5
- package/src/constants/src/keyevent.ts +2 -2
- package/src/constants/umd/keplergl.min.js +1 -1
- package/src/deckgl-arrow-layers/package.json +1 -1
- package/src/deckgl-layers/package.json +4 -4
- package/src/duckdb/dist/components/preview-data-panel.js +2 -11
- package/src/duckdb/dist/components/sql-panel.js +7 -3
- package/src/duckdb/dist/components/tree.js +5 -4
- package/src/duckdb/dist/plugin.d.ts +1 -0
- package/src/duckdb/dist/plugin.js +9 -2
- package/src/duckdb/dist/processors/data-processor.js +4 -5
- package/src/duckdb/dist/table/duckdb-table-utils.d.ts +13 -0
- package/src/duckdb/dist/table/duckdb-table-utils.js +110 -0
- package/src/duckdb/dist/table/duckdb-table.d.ts +7 -2
- package/src/duckdb/dist/table/duckdb-table.js +189 -44
- package/src/duckdb/package.json +6 -6
- package/src/duckdb/src/components/preview-data-panel.tsx +0 -5
- package/src/duckdb/src/components/sql-panel.tsx +4 -2
- package/src/duckdb/src/components/tree.tsx +5 -1
- package/src/duckdb/src/plugin.ts +8 -1
- package/src/duckdb/src/processors/data-processor.ts +3 -4
- package/src/duckdb/src/table/duckdb-table-utils.ts +106 -0
- package/src/duckdb/src/table/duckdb-table.ts +134 -33
- package/src/effects/package.json +5 -5
- package/src/layers/dist/icon-layer/icon-layer.js +1 -1
- package/src/layers/dist/index.d.ts +3 -0
- package/src/layers/dist/index.js +6 -7
- package/src/layers/dist/point-layer/point-layer.d.ts +1 -1
- package/src/layers/dist/point-layer/point-layer.js +8 -2
- package/src/layers/package.json +9 -9
- package/src/layers/src/icon-layer/icon-layer.ts +8 -10
- package/src/layers/src/index.ts +5 -5
- package/src/layers/src/point-layer/point-layer.ts +6 -1
- package/src/localization/package.json +1 -1
- package/src/processors/dist/data-processor.js +2 -4
- package/src/processors/package.json +7 -7
- package/src/processors/src/data-processor.ts +1 -3
- package/src/reducers/dist/ui-state-updaters.d.ts +10 -0
- package/src/reducers/dist/ui-state-updaters.js +22 -2
- package/src/reducers/dist/ui-state.js +2 -2
- package/src/reducers/dist/vis-state-updaters.d.ts +1 -0
- package/src/reducers/dist/vis-state-updaters.js +21 -5
- package/src/reducers/dist/vis-state.d.ts +4 -0
- package/src/reducers/package.json +16 -16
- package/src/reducers/src/ui-state-updaters.ts +24 -0
- package/src/reducers/src/ui-state.ts +3 -1
- package/src/reducers/src/vis-state-updaters.ts +24 -5
- package/src/schemas/dist/dataset-schema.js +38 -2
- package/src/schemas/package.json +8 -7
- package/src/schemas/src/dataset-schema.ts +43 -1
- package/src/styles/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/5f/aa/96c67b383dbcd2b95625113a5389c6078fd8a53e6fc73a054229709f2dac1e0a409e7117049485a569fbebf8434a319451842671398904bfe1a7f7b5991c +1 -0
- package/src/styles/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/af/aa/228fbff58007b23eea5eb6cc7d2da1f0af1d8a7024129a416ea88b4df0ad7afc7aec93b09f3dd42a98f1d6a6f4dce6b53204818da85ef5becc42f928a64d +1 -0
- package/src/styles/node_modules/.cache/terser-webpack-plugin/index-v5/40/72/cac221d8459e6b743bc62ecdb370ed854b21ec30d3f7f4c06c7d1d7ffde2 +2 -0
- package/src/styles/node_modules/.cache/terser-webpack-plugin/index-v5/c1/39/f7cd1d5947ec6e5d82bfa07041271344eb02f9e67bf5823acf2f22c2d01f +2 -0
- package/src/styles/package.json +2 -2
- package/src/styles/umd/keplergl.min.js +1 -1
- package/src/table/dist/dataset-utils.js +10 -4
- package/src/table/package.json +5 -5
- package/src/table/src/dataset-utils.ts +7 -1
- package/src/tasks/package.json +2 -2
- package/src/types/package.json +1 -1
- package/src/types/reducers.d.ts +2 -0
- package/src/utils/dist/application-config.d.ts +2 -0
- package/src/utils/dist/application-config.js +4 -2
- package/src/utils/dist/data-utils.js +14 -2
- package/src/utils/dist/dataset-utils.js +5 -3
- package/src/utils/dist/dom-to-image.js +1 -1
- package/src/utils/dist/dom-utils.js +1 -1
- package/src/utils/dist/map-style-utils/mapbox-gl-style-editor.js +7 -1
- package/src/utils/dist/observe-dimensions.d.ts +2 -1
- package/src/utils/dist/observe-dimensions.js +10 -4
- package/src/utils/dist/utils.js +1 -1
- package/src/utils/package.json +4 -4
- package/src/utils/src/application-config.ts +9 -1
- package/src/utils/src/data-utils.ts +13 -1
- package/src/utils/src/dataset-utils.ts +1 -1
- package/src/utils/src/dom-to-image.ts +5 -6
- package/src/utils/src/dom-utils.ts +15 -15
- package/src/utils/src/map-style-utils/mapbox-gl-style-editor.ts +6 -0
- package/src/utils/src/observe-dimensions.ts +9 -4
- package/src/utils/src/utils.ts +8 -8
- package/umd/keplergl.min.css +1 -1
- package/umd/keplergl.min.js +1499 -1428
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
import { Layer } from '@kepler.gl/layers';
|
|
2
2
|
import { Datasets, KeplerTable } from '@kepler.gl/table';
|
|
3
|
+
import { SpatialJoinGeometries } from '@openassistant/geoda';
|
|
4
|
+
import { AddDataToMapPayload } from '@kepler.gl/types';
|
|
5
|
+
/**
|
|
6
|
+
* Check if the dataset exists
|
|
7
|
+
* @param datasets The kepler.gl datasets
|
|
8
|
+
* @param datasetName The name of the dataset
|
|
9
|
+
* @param functionName The name of the function
|
|
10
|
+
* @returns The result of the check
|
|
11
|
+
*/
|
|
3
12
|
export declare function checkDatasetNotExists(datasets: Datasets, datasetName: string, functionName: string): {
|
|
4
13
|
name: string;
|
|
5
14
|
result: {
|
|
@@ -7,6 +16,13 @@ export declare function checkDatasetNotExists(datasets: Datasets, datasetName: s
|
|
|
7
16
|
details: string;
|
|
8
17
|
};
|
|
9
18
|
} | null;
|
|
19
|
+
/**
|
|
20
|
+
* Check if the field exists
|
|
21
|
+
* @param dataset The kepler.gl dataset
|
|
22
|
+
* @param fieldName The name of the field
|
|
23
|
+
* @param functionName The name of the function
|
|
24
|
+
* @returns The result of the check
|
|
25
|
+
*/
|
|
10
26
|
export declare function checkFieldNotExists(dataset: KeplerTable, fieldName: string, functionName: string): {
|
|
11
27
|
type: string;
|
|
12
28
|
name: string;
|
|
@@ -15,7 +31,64 @@ export declare function checkFieldNotExists(dataset: KeplerTable, fieldName: str
|
|
|
15
31
|
details: string;
|
|
16
32
|
};
|
|
17
33
|
} | null;
|
|
34
|
+
/**
|
|
35
|
+
* Interpolate the colors from the original colors with the given number of colors
|
|
36
|
+
* @param originalColors The original colors
|
|
37
|
+
* @param numberOfColors The number of colors
|
|
38
|
+
* @returns The interpolated colors
|
|
39
|
+
*/
|
|
18
40
|
export declare function interpolateColor(originalColors: string[], numberOfColors: number): string[];
|
|
41
|
+
/**
|
|
42
|
+
* Get the values from a dataset for a variable
|
|
43
|
+
* @param datasets
|
|
44
|
+
* @param datasetName
|
|
45
|
+
* @param variableName
|
|
46
|
+
* @returns {number[]}
|
|
47
|
+
*/
|
|
19
48
|
export declare function getValuesFromDataset(datasets: Datasets, datasetName: string, variableName: string): number[];
|
|
49
|
+
/**
|
|
50
|
+
* Get the x and y values from a dataset for a scatterplot
|
|
51
|
+
* @param datasets
|
|
52
|
+
* @param datasetName
|
|
53
|
+
* @param xVariableName
|
|
54
|
+
* @param yVariableName
|
|
55
|
+
* @returns {x: number[], y: number[]}
|
|
56
|
+
*/
|
|
57
|
+
export declare function getScatterplotValuesFromDataset(datasets: Datasets, datasetName: string, xVariableName: string, yVariableName: string): {
|
|
58
|
+
x: number[];
|
|
59
|
+
y: number[];
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Highlight the rows in a dataset
|
|
63
|
+
* @param datasets The kepler.gl datasets
|
|
64
|
+
* @param layers The kepler.gl layers
|
|
65
|
+
* @param datasetName The name of the dataset
|
|
66
|
+
* @param selectedRowIndices The indices of the rows to highlight
|
|
67
|
+
* @param layerSetIsValid The function to set the layer validity
|
|
68
|
+
*/
|
|
20
69
|
export declare function highlightRows(datasets: Datasets, layers: Layer[], datasetName: string, selectedRowIndices: number[], layerSetIsValid: (layer: Layer, isValid: boolean) => void): void;
|
|
70
|
+
/**
|
|
71
|
+
* Get the dataset context, which is used to provide the dataset information to the AI assistant
|
|
72
|
+
* @param datasets The kepler.gl datasets
|
|
73
|
+
* @param layers The kepler.gl layers
|
|
74
|
+
* @returns The dataset context
|
|
75
|
+
*/
|
|
21
76
|
export declare function getDatasetContext(datasets: Datasets, layers: Layer[]): string;
|
|
77
|
+
/**
|
|
78
|
+
* Get the geometries from a dataset
|
|
79
|
+
* @param datasets The kepler.gl datasets
|
|
80
|
+
* @param layers The kepler.gl layers
|
|
81
|
+
* @param layerData The layer data
|
|
82
|
+
* @param datasetName The name of the dataset
|
|
83
|
+
* @returns The geometries
|
|
84
|
+
*/
|
|
85
|
+
export declare function getGeometriesFromDataset(datasets: Datasets, layers: Layer[], layerData: any[], datasetName: string): SpatialJoinGeometries;
|
|
86
|
+
/**
|
|
87
|
+
* Save the data as a new dataset by joining it with the left dataset
|
|
88
|
+
* @param datasets The kepler.gl datasets
|
|
89
|
+
* @param datasetName The name of the left dataset
|
|
90
|
+
* @param data The data to save
|
|
91
|
+
* @param addDataToMap The function to add the data to the map
|
|
92
|
+
*/
|
|
93
|
+
export declare function saveAsDataset(datasets: Datasets, datasetName: string, data: Record<string, number[]>, addDataToMap: (data: AddDataToMapPayload) => void): void;
|
|
94
|
+
export declare function highlightRowsByColumnValues(datasets: Datasets, layers: Layer[], datasetName: string, columnName: string, selectedValues: unknown[], layerSetIsValid: (layer: Layer, isValid: boolean) => void): void;
|
|
@@ -7,14 +7,29 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
7
7
|
exports.checkDatasetNotExists = checkDatasetNotExists;
|
|
8
8
|
exports.checkFieldNotExists = checkFieldNotExists;
|
|
9
9
|
exports.getDatasetContext = getDatasetContext;
|
|
10
|
+
exports.getGeometriesFromDataset = getGeometriesFromDataset;
|
|
11
|
+
exports.getScatterplotValuesFromDataset = getScatterplotValuesFromDataset;
|
|
10
12
|
exports.getValuesFromDataset = getValuesFromDataset;
|
|
11
13
|
exports.highlightRows = highlightRows;
|
|
14
|
+
exports.highlightRowsByColumnValues = highlightRowsByColumnValues;
|
|
12
15
|
exports.interpolateColor = interpolateColor;
|
|
16
|
+
exports.saveAsDataset = saveAsDataset;
|
|
17
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
18
|
+
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
19
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
13
20
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
14
21
|
var _colorInterpolate = _interopRequireDefault(require("color-interpolate"));
|
|
22
|
+
var _constants = require("@kepler.gl/constants");
|
|
15
23
|
// SPDX-License-Identifier: MIT
|
|
16
24
|
// Copyright contributors to the kepler.gl project
|
|
17
25
|
|
|
26
|
+
/**
|
|
27
|
+
* Check if the dataset exists
|
|
28
|
+
* @param datasets The kepler.gl datasets
|
|
29
|
+
* @param datasetName The name of the dataset
|
|
30
|
+
* @param functionName The name of the function
|
|
31
|
+
* @returns The result of the check
|
|
32
|
+
*/
|
|
18
33
|
function checkDatasetNotExists(datasets, datasetName, functionName) {
|
|
19
34
|
var datasetId = Object.keys(datasets).find(function (dataId) {
|
|
20
35
|
return datasets[dataId].label === datasetName;
|
|
@@ -30,6 +45,14 @@ function checkDatasetNotExists(datasets, datasetName, functionName) {
|
|
|
30
45
|
}
|
|
31
46
|
return null;
|
|
32
47
|
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Check if the field exists
|
|
51
|
+
* @param dataset The kepler.gl dataset
|
|
52
|
+
* @param fieldName The name of the field
|
|
53
|
+
* @param functionName The name of the function
|
|
54
|
+
* @returns The result of the check
|
|
55
|
+
*/
|
|
33
56
|
function checkFieldNotExists(dataset, fieldName, functionName) {
|
|
34
57
|
var field = dataset.fields.find(function (f) {
|
|
35
58
|
return f.name === fieldName;
|
|
@@ -48,6 +71,13 @@ function checkFieldNotExists(dataset, fieldName, functionName) {
|
|
|
48
71
|
}
|
|
49
72
|
return null;
|
|
50
73
|
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Interpolate the colors from the original colors with the given number of colors
|
|
77
|
+
* @param originalColors The original colors
|
|
78
|
+
* @param numberOfColors The number of colors
|
|
79
|
+
* @returns The interpolated colors
|
|
80
|
+
*/
|
|
51
81
|
function interpolateColor(originalColors, numberOfColors) {
|
|
52
82
|
if (originalColors.length === numberOfColors) {
|
|
53
83
|
return originalColors;
|
|
@@ -67,6 +97,14 @@ function interpolateColor(originalColors, numberOfColors) {
|
|
|
67
97
|
});
|
|
68
98
|
return hexColors;
|
|
69
99
|
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Get the values from a dataset for a variable
|
|
103
|
+
* @param datasets
|
|
104
|
+
* @param datasetName
|
|
105
|
+
* @param variableName
|
|
106
|
+
* @returns {number[]}
|
|
107
|
+
*/
|
|
70
108
|
function getValuesFromDataset(datasets, datasetName, variableName) {
|
|
71
109
|
// find which dataset has the variableName
|
|
72
110
|
var datasetId = Object.keys(datasets).find(function (dataId) {
|
|
@@ -83,6 +121,32 @@ function getValuesFromDataset(datasets, datasetName, variableName) {
|
|
|
83
121
|
}
|
|
84
122
|
return [];
|
|
85
123
|
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Get the x and y values from a dataset for a scatterplot
|
|
127
|
+
* @param datasets
|
|
128
|
+
* @param datasetName
|
|
129
|
+
* @param xVariableName
|
|
130
|
+
* @param yVariableName
|
|
131
|
+
* @returns {x: number[], y: number[]}
|
|
132
|
+
*/
|
|
133
|
+
function getScatterplotValuesFromDataset(datasets, datasetName, xVariableName, yVariableName) {
|
|
134
|
+
var xValues = getValuesFromDataset(datasets, datasetName, xVariableName);
|
|
135
|
+
var yValues = getValuesFromDataset(datasets, datasetName, yVariableName);
|
|
136
|
+
return {
|
|
137
|
+
x: xValues,
|
|
138
|
+
y: yValues
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Highlight the rows in a dataset
|
|
144
|
+
* @param datasets The kepler.gl datasets
|
|
145
|
+
* @param layers The kepler.gl layers
|
|
146
|
+
* @param datasetName The name of the dataset
|
|
147
|
+
* @param selectedRowIndices The indices of the rows to highlight
|
|
148
|
+
* @param layerSetIsValid The function to set the layer validity
|
|
149
|
+
*/
|
|
86
150
|
function highlightRows(datasets, layers, datasetName, selectedRowIndices, layerSetIsValid) {
|
|
87
151
|
// update the filteredIndex in the dataset
|
|
88
152
|
var datasetId = Object.keys(datasets).find(function (dataId) {
|
|
@@ -99,10 +163,17 @@ function highlightRows(datasets, layers, datasetName, selectedRowIndices, layerS
|
|
|
99
163
|
selectLayers.forEach(function (layer) {
|
|
100
164
|
layer.formatLayerData(datasets);
|
|
101
165
|
// trigger a re-render using layerSetIsValid() to update the top layer
|
|
102
|
-
layerSetIsValid(
|
|
166
|
+
layerSetIsValid(layer, true);
|
|
103
167
|
});
|
|
104
168
|
}
|
|
105
169
|
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Get the dataset context, which is used to provide the dataset information to the AI assistant
|
|
173
|
+
* @param datasets The kepler.gl datasets
|
|
174
|
+
* @param layers The kepler.gl layers
|
|
175
|
+
* @returns The dataset context
|
|
176
|
+
*/
|
|
106
177
|
function getDatasetContext(datasets, layers) {
|
|
107
178
|
var context = 'Please remember the following dataset context:';
|
|
108
179
|
var dataMeta = Object.values(datasets).map(function (dataset) {
|
|
@@ -118,11 +189,148 @@ function getDatasetContext(datasets, layers) {
|
|
|
118
189
|
return {
|
|
119
190
|
id: layer.id,
|
|
120
191
|
label: layer.config.label,
|
|
121
|
-
type: layer.type
|
|
192
|
+
type: layer.type,
|
|
193
|
+
geometryMode: layer.config.columnMode,
|
|
194
|
+
// get the valid geometry columns as string
|
|
195
|
+
geometryColumns: Object.fromEntries(Object.entries(layer.config.columns).filter(function (_ref2) {
|
|
196
|
+
var _ref3 = (0, _slicedToArray2["default"])(_ref2, 2),
|
|
197
|
+
value = _ref3[1];
|
|
198
|
+
return value !== null;
|
|
199
|
+
}).map(function (_ref4) {
|
|
200
|
+
var _ref5 = (0, _slicedToArray2["default"])(_ref4, 2),
|
|
201
|
+
key = _ref5[0],
|
|
202
|
+
value = _ref5[1];
|
|
203
|
+
return [key, (0, _typeof2["default"])(value) === 'object' && value !== null ? Object.fromEntries(Object.entries(value).filter(function (_ref6) {
|
|
204
|
+
var _ref7 = (0, _slicedToArray2["default"])(_ref6, 2),
|
|
205
|
+
v = _ref7[1];
|
|
206
|
+
return v !== null;
|
|
207
|
+
})) : value];
|
|
208
|
+
}))
|
|
122
209
|
};
|
|
123
210
|
})
|
|
124
211
|
};
|
|
125
212
|
});
|
|
126
213
|
return "".concat(context, "\n").concat(JSON.stringify(dataMeta));
|
|
127
214
|
}
|
|
128
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29sb3JJbnRlcnBvbGF0ZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiY2hlY2tEYXRhc2V0Tm90RXhpc3RzIiwiZGF0YXNldHMiLCJkYXRhc2V0TmFtZSIsImZ1bmN0aW9uTmFtZSIsImRhdGFzZXRJZCIsIk9iamVjdCIsImtleXMiLCJmaW5kIiwiZGF0YUlkIiwibGFiZWwiLCJuYW1lIiwicmVzdWx0Iiwic3VjY2VzcyIsImRldGFpbHMiLCJjb25jYXQiLCJqb2luIiwiY2hlY2tGaWVsZE5vdEV4aXN0cyIsImRhdGFzZXQiLCJmaWVsZE5hbWUiLCJmaWVsZCIsImZpZWxkcyIsImYiLCJ0eXBlIiwibWFwIiwiaW50ZXJwb2xhdGVDb2xvciIsIm9yaWdpbmFsQ29sb3JzIiwibnVtYmVyT2ZDb2xvcnMiLCJsZW5ndGgiLCJpbnRlcnAiLCJpbnRlcnBvbGF0ZSIsImNvbG9ycyIsIkFycmF5IiwiZnJvbSIsIl8iLCJqIiwiaGV4Q29sb3JzIiwiY29sb3IiLCJyZ2IiLCJtYXRjaCIsImMiLCJwYXJzZUludCIsInRvU3RyaW5nIiwicGFkU3RhcnQiLCJnZXRWYWx1ZXNGcm9tRGF0YXNldCIsInZhcmlhYmxlTmFtZSIsImkiLCJnZXRWYWx1ZSIsImhpZ2hsaWdodFJvd3MiLCJsYXllcnMiLCJzZWxlY3RlZFJvd0luZGljZXMiLCJsYXllclNldElzVmFsaWQiLCJmaWx0ZXJlZEluZGV4IiwiYWxsSW5kZXhlcyIsInNlbGVjdExheWVycyIsImZpbHRlciIsImxheWVyIiwiY29uZmlnIiwiaWQiLCJmb3JFYWNoIiwiZm9ybWF0TGF5ZXJEYXRhIiwiZ2V0RGF0YXNldENvbnRleHQiLCJjb250ZXh0IiwiZGF0YU1ldGEiLCJ2YWx1ZXMiLCJfZGVmaW5lUHJvcGVydHkyIiwiSlNPTiIsInN0cmluZ2lmeSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29scy91dGlscy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgaW50ZXJwb2xhdGUgZnJvbSAnY29sb3ItaW50ZXJwb2xhdGUnO1xuXG5pbXBvcnQge0xheWVyfSBmcm9tICdAa2VwbGVyLmdsL2xheWVycyc7XG5pbXBvcnQge0RhdGFzZXRzLCBLZXBsZXJUYWJsZX0gZnJvbSAnQGtlcGxlci5nbC90YWJsZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0RhdGFzZXROb3RFeGlzdHMoXG4gIGRhdGFzZXRzOiBEYXRhc2V0cyxcbiAgZGF0YXNldE5hbWU6IHN0cmluZyxcbiAgZnVuY3Rpb25OYW1lOiBzdHJpbmdcbikge1xuICBjb25zdCBkYXRhc2V0SWQgPSBPYmplY3Qua2V5cyhkYXRhc2V0cykuZmluZChkYXRhSWQgPT4gZGF0YXNldHNbZGF0YUlkXS5sYWJlbCA9PT0gZGF0YXNldE5hbWUpO1xuICBpZiAoIWRhdGFzZXRJZCkge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBmdW5jdGlvbk5hbWUsXG4gICAgICByZXN1bHQ6IHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGRldGFpbHM6IGBEYXRhc2V0IG5vdCBmb3VuZC4gUGxlYXNlIHNwZWNpZnkgb25lIGZyb20gdGhlIGZvbGxvd2luZyBkYXRhc2V0czogJHtPYmplY3Qua2V5cyhcbiAgICAgICAgICBkYXRhc2V0c1xuICAgICAgICApLmpvaW4oJywgJyl9YFxuICAgICAgfVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0ZpZWxkTm90RXhpc3RzKGRhdGFzZXQ6IEtlcGxlclRhYmxlLCBmaWVsZE5hbWU6IHN0cmluZywgZnVuY3Rpb25OYW1lOiBzdHJpbmcpIHtcbiAgY29uc3QgZmllbGQgPSBkYXRhc2V0LmZpZWxkcy5maW5kKGYgPT4gZi5uYW1lID09PSBmaWVsZE5hbWUpO1xuICBpZiAoIWZpZWxkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdsYXllcicsXG4gICAgICBuYW1lOiBmdW5jdGlvbk5hbWUsXG4gICAgICByZXN1bHQ6IHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGRldGFpbHM6IGBGaWVsZCBub3QgZm91bmQuIFBsZWFzZSBzcGVjaWZ5IG9uZSBmcm9tIHRoZSBmb2xsb3dpbmcgZmllbGRzOiAke2RhdGFzZXQuZmllbGRzXG4gICAgICAgICAgLm1hcChmID0+IGYubmFtZSlcbiAgICAgICAgICAuam9pbignLCAnKX1gXG4gICAgICB9XG4gICAgfTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGludGVycG9sYXRlQ29sb3Iob3JpZ2luYWxDb2xvcnM6IHN0cmluZ1tdLCBudW1iZXJPZkNvbG9yczogbnVtYmVyKSB7XG4gIGlmIChvcmlnaW5hbENvbG9ycy5sZW5ndGggPT09IG51bWJlck9mQ29sb3JzKSB7XG4gICAgcmV0dXJuIG9yaWdpbmFsQ29sb3JzO1xuICB9XG4gIGNvbnN0IGludGVycCA9IGludGVycG9sYXRlKG9yaWdpbmFsQ29sb3JzKTtcbiAgY29uc3QgY29sb3JzID0gQXJyYXkuZnJvbSh7bGVuZ3RoOiBudW1iZXJPZkNvbG9yc30sIChfLCBqKSA9PiBpbnRlcnAoaiAvIChudW1iZXJPZkNvbG9ycyAtIDEpKSk7XG4gIC8vIGNvbnZlcnQgY29sb3JzIGZyb20gJ3JnYigyNTUsIDI1NSwgMjU1KScgdG8gJyNmZmZmZmYnXG4gIGNvbnN0IGhleENvbG9ycyA9IGNvbG9ycy5tYXAoY29sb3IgPT4ge1xuICAgIGNvbnN0IHJnYiA9IGNvbG9yLm1hdGNoKC9cXGQrL2cpO1xuICAgIHJldHVybiBgIyR7cmdiPy5tYXAoYyA9PiBwYXJzZUludChjKS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyl9YDtcbiAgfSk7XG4gIHJldHVybiBoZXhDb2xvcnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWx1ZXNGcm9tRGF0YXNldChcbiAgZGF0YXNldHM6IERhdGFzZXRzLFxuICBkYXRhc2V0TmFtZTogc3RyaW5nLFxuICB2YXJpYWJsZU5hbWU6IHN0cmluZ1xuKTogbnVtYmVyW10ge1xuICAvLyBmaW5kIHdoaWNoIGRhdGFzZXQgaGFzIHRoZSB2YXJpYWJsZU5hbWVcbiAgY29uc3QgZGF0YXNldElkID0gT2JqZWN0LmtleXMoZGF0YXNldHMpLmZpbmQoZGF0YUlkID0+IGRhdGFzZXRzW2RhdGFJZF0ubGFiZWwgPT09IGRhdGFzZXROYW1lKTtcbiAgaWYgKCFkYXRhc2V0SWQpIHJldHVybiBbXTtcbiAgY29uc3QgZGF0YXNldCA9IGRhdGFzZXRzW2RhdGFzZXRJZF07XG4gIGlmIChkYXRhc2V0KSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oe2xlbmd0aDogZGF0YXNldC5sZW5ndGh9LCAoXywgaSkgPT4gZGF0YXNldC5nZXRWYWx1ZSh2YXJpYWJsZU5hbWUsIGkpKTtcbiAgfVxuICByZXR1cm4gW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoaWdobGlnaHRSb3dzKFxuICBkYXRhc2V0czogRGF0YXNldHMsXG4gIGxheWVyczogTGF5ZXJbXSxcbiAgZGF0YXNldE5hbWU6IHN0cmluZyxcbiAgc2VsZWN0ZWRSb3dJbmRpY2VzOiBudW1iZXJbXSxcbiAgbGF5ZXJTZXRJc1ZhbGlkOiAobGF5ZXI6IExheWVyLCBpc1ZhbGlkOiBib29sZWFuKSA9PiB2b2lkXG4pIHtcbiAgLy8gdXBkYXRlIHRoZSBmaWx0ZXJlZEluZGV4IGluIHRoZSBkYXRhc2V0XG4gIGNvbnN0IGRhdGFzZXRJZCA9IE9iamVjdC5rZXlzKGRhdGFzZXRzKS5maW5kKGRhdGFJZCA9PiBkYXRhc2V0c1tkYXRhSWRdLmxhYmVsID09PSBkYXRhc2V0TmFtZSk7XG4gIGlmICghZGF0YXNldElkKSByZXR1cm47XG4gIGNvbnN0IGRhdGFzZXQgPSBkYXRhc2V0c1tkYXRhc2V0SWRdO1xuICBpZiAoZGF0YXNldCkge1xuICAgIGRhdGFzZXQuZmlsdGVyZWRJbmRleCA9XG4gICAgICBzZWxlY3RlZFJvd0luZGljZXMubGVuZ3RoID09PSAwID8gZGF0YXNldC5hbGxJbmRleGVzIDogc2VsZWN0ZWRSb3dJbmRpY2VzO1xuICAgIC8vIGdldCBhbGwgbGF5ZXJzIHRoYXQgdXNlIHRoaXMgZGF0YXNldFxuICAgIGNvbnN0IHNlbGVjdExheWVycyA9IGxheWVycy5maWx0ZXIobGF5ZXIgPT4gbGF5ZXIuY29uZmlnLmRhdGFJZCA9PT0gZGF0YXNldC5pZCk7XG4gICAgc2VsZWN0TGF5ZXJzLmZvckVhY2gobGF5ZXIgPT4ge1xuICAgICAgbGF5ZXIuZm9ybWF0TGF5ZXJEYXRhKGRhdGFzZXRzKTtcbiAgICAgIC8vIHRyaWdnZXIgYSByZS1yZW5kZXIgdXNpbmcgbGF5ZXJTZXRJc1ZhbGlkKCkgdG8gdXBkYXRlIHRoZSB0b3AgbGF5ZXJcbiAgICAgIGxheWVyU2V0SXNWYWxpZChzZWxlY3RMYXllcnNbMF0sIHRydWUpO1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRhc2V0Q29udGV4dChkYXRhc2V0czogRGF0YXNldHMsIGxheWVyczogTGF5ZXJbXSkge1xuICBjb25zdCBjb250ZXh0ID0gJ1BsZWFzZSByZW1lbWJlciB0aGUgZm9sbG93aW5nIGRhdGFzZXQgY29udGV4dDonO1xuICBjb25zdCBkYXRhTWV0YSA9IE9iamVjdC52YWx1ZXMoZGF0YXNldHMpLm1hcCgoZGF0YXNldDogS2VwbGVyVGFibGUpID0+ICh7XG4gICAgZGF0YXNldE5hbWU6IGRhdGFzZXQubGFiZWwsXG4gICAgZGF0YXNldElkOiBkYXRhc2V0LmlkLFxuICAgIGZpZWxkczogZGF0YXNldC5maWVsZHMubWFwKGZpZWxkID0+ICh7W2ZpZWxkLm5hbWVdOiBmaWVsZC50eXBlfSkpLFxuICAgIGxheWVyczogbGF5ZXJzXG4gICAgICAuZmlsdGVyKGxheWVyID0+IGxheWVyLmNvbmZpZy5kYXRhSWQgPT09IGRhdGFzZXQuaWQpXG4gICAgICAubWFwKGxheWVyID0+ICh7aWQ6IGxheWVyLmlkLCBsYWJlbDogbGF5ZXIuY29uZmlnLmxhYmVsLCB0eXBlOiBsYXllci50eXBlfSkpXG4gIH0pKTtcbiAgcmV0dXJuIGAke2NvbnRleHR9XFxuJHtKU09OLnN0cmluZ2lmeShkYXRhTWV0YSl9YDtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLGlCQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFIQTtBQUNBOztBQU9PLFNBQVNDLHFCQUFxQkEsQ0FDbkNDLFFBQWtCLEVBQ2xCQyxXQUFtQixFQUNuQkMsWUFBb0IsRUFDcEI7RUFDQSxJQUFNQyxTQUFTLEdBQUdDLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDTCxRQUFRLENBQUMsQ0FBQ00sSUFBSSxDQUFDLFVBQUFDLE1BQU07SUFBQSxPQUFJUCxRQUFRLENBQUNPLE1BQU0sQ0FBQyxDQUFDQyxLQUFLLEtBQUtQLFdBQVc7RUFBQSxFQUFDO0VBQzlGLElBQUksQ0FBQ0UsU0FBUyxFQUFFO0lBQ2QsT0FBTztNQUNMTSxJQUFJLEVBQUVQLFlBQVk7TUFDbEJRLE1BQU0sRUFBRTtRQUNOQyxPQUFPLEVBQUUsS0FBSztRQUNkQyxPQUFPLHdFQUFBQyxNQUFBLENBQXdFVCxNQUFNLENBQUNDLElBQUksQ0FDeEZMLFFBQ0YsQ0FBQyxDQUFDYyxJQUFJLENBQUMsSUFBSSxDQUFDO01BQ2Q7SUFDRixDQUFDO0VBQ0g7RUFDQSxPQUFPLElBQUk7QUFDYjtBQUVPLFNBQVNDLG1CQUFtQkEsQ0FBQ0MsT0FBb0IsRUFBRUMsU0FBaUIsRUFBRWYsWUFBb0IsRUFBRTtFQUNqRyxJQUFNZ0IsS0FBSyxHQUFHRixPQUFPLENBQUNHLE1BQU0sQ0FBQ2IsSUFBSSxDQUFDLFVBQUFjLENBQUM7SUFBQSxPQUFJQSxDQUFDLENBQUNYLElBQUksS0FBS1EsU0FBUztFQUFBLEVBQUM7RUFDNUQsSUFBSSxDQUFDQyxLQUFLLEVBQUU7SUFDVixPQUFPO01BQ0xHLElBQUksRUFBRSxPQUFPO01BQ2JaLElBQUksRUFBRVAsWUFB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
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Get the geometries from a dataset
|
|
218
|
+
* @param datasets The kepler.gl datasets
|
|
219
|
+
* @param layers The kepler.gl layers
|
|
220
|
+
* @param layerData The layer data
|
|
221
|
+
* @param datasetName The name of the dataset
|
|
222
|
+
* @returns The geometries
|
|
223
|
+
*/
|
|
224
|
+
function getGeometriesFromDataset(datasets, layers, layerData, datasetName) {
|
|
225
|
+
var datasetId = Object.keys(datasets).find(function (dataId) {
|
|
226
|
+
return datasets[dataId].label === datasetName;
|
|
227
|
+
});
|
|
228
|
+
if (!datasetId) return [];
|
|
229
|
+
var dataset = datasets[datasetId];
|
|
230
|
+
|
|
231
|
+
// get the index of the layer
|
|
232
|
+
var layerIndex = layers.findIndex(function (layer) {
|
|
233
|
+
return layer.config.dataId === dataset.id;
|
|
234
|
+
});
|
|
235
|
+
if (layerIndex === -1) return [];
|
|
236
|
+
var geometries = layerData[layerIndex];
|
|
237
|
+
return geometries === null || geometries === void 0 ? void 0 : geometries.data;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Save the data as a new dataset by joining it with the left dataset
|
|
242
|
+
* @param datasets The kepler.gl datasets
|
|
243
|
+
* @param datasetName The name of the left dataset
|
|
244
|
+
* @param data The data to save
|
|
245
|
+
* @param addDataToMap The function to add the data to the map
|
|
246
|
+
*/
|
|
247
|
+
function saveAsDataset(datasets, datasetName, data, addDataToMap) {
|
|
248
|
+
// find datasetId from datasets
|
|
249
|
+
var datasetId = Object.keys(datasets).find(function (dataId) {
|
|
250
|
+
return datasets[dataId].label === datasetName;
|
|
251
|
+
});
|
|
252
|
+
if (!datasetId) return;
|
|
253
|
+
var leftDataset = datasets[datasetId];
|
|
254
|
+
var numRows = leftDataset.length;
|
|
255
|
+
var fields = [].concat((0, _toConsumableArray2["default"])(Object.keys(data).map(function (fieldName, index) {
|
|
256
|
+
return {
|
|
257
|
+
name: fieldName,
|
|
258
|
+
id: "".concat(fieldName, "_").concat(index),
|
|
259
|
+
displayName: fieldName,
|
|
260
|
+
type: determineFieldType(data[fieldName][0])
|
|
261
|
+
};
|
|
262
|
+
})), (0, _toConsumableArray2["default"])(leftDataset.fields.map(function (field, index) {
|
|
263
|
+
return {
|
|
264
|
+
name: field.name,
|
|
265
|
+
id: field.id || "".concat(field.name, "_").concat(index),
|
|
266
|
+
displayName: field.displayName,
|
|
267
|
+
type: field.type
|
|
268
|
+
};
|
|
269
|
+
})));
|
|
270
|
+
|
|
271
|
+
// Pre-calculate data values array
|
|
272
|
+
var dataValues = Object.values(data);
|
|
273
|
+
var rows = Array(numRows).fill(null).map(function (_, rowIdx) {
|
|
274
|
+
return [].concat((0, _toConsumableArray2["default"])(dataValues.map(function (col) {
|
|
275
|
+
return col[rowIdx];
|
|
276
|
+
})), (0, _toConsumableArray2["default"])(leftDataset.fields.map(function (field) {
|
|
277
|
+
return leftDataset.getValue(field.name, rowIdx);
|
|
278
|
+
})));
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
// create new dataset
|
|
282
|
+
var newDatasetName = "".concat(datasetName, "_joined");
|
|
283
|
+
var newDataset = {
|
|
284
|
+
info: {
|
|
285
|
+
id: newDatasetName,
|
|
286
|
+
label: newDatasetName
|
|
287
|
+
},
|
|
288
|
+
data: {
|
|
289
|
+
fields: fields,
|
|
290
|
+
rows: rows
|
|
291
|
+
}
|
|
292
|
+
};
|
|
293
|
+
addDataToMap({
|
|
294
|
+
datasets: [newDataset],
|
|
295
|
+
options: {
|
|
296
|
+
autoCreateLayers: true,
|
|
297
|
+
centerMap: true
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* Helper function to determine field type
|
|
304
|
+
* @param value The value to determine the field type
|
|
305
|
+
* @returns The field type
|
|
306
|
+
*/
|
|
307
|
+
function determineFieldType(value) {
|
|
308
|
+
return typeof value === 'number' ? Number.isInteger(value) ? _constants.ALL_FIELD_TYPES.integer : _constants.ALL_FIELD_TYPES.real : _constants.ALL_FIELD_TYPES.string;
|
|
309
|
+
}
|
|
310
|
+
function highlightRowsByColumnValues(datasets, layers, datasetName, columnName, selectedValues, layerSetIsValid) {
|
|
311
|
+
var datasetId = Object.keys(datasets).find(function (dataId) {
|
|
312
|
+
return datasets[dataId].label === datasetName;
|
|
313
|
+
});
|
|
314
|
+
if (!datasetId) return;
|
|
315
|
+
var dataset = datasets[datasetId];
|
|
316
|
+
if (dataset) {
|
|
317
|
+
// get the values of the column
|
|
318
|
+
var values = Array.from({
|
|
319
|
+
length: dataset.length
|
|
320
|
+
}, function (_, i) {
|
|
321
|
+
return dataset.getValue(columnName, i);
|
|
322
|
+
});
|
|
323
|
+
// create a dict using the values
|
|
324
|
+
var valueDict = values.reduce(function (acc, value, index) {
|
|
325
|
+
acc[value] = index;
|
|
326
|
+
return acc;
|
|
327
|
+
}, {});
|
|
328
|
+
// need to fix the type error of value here
|
|
329
|
+
var selectedIndices = selectedValues.map(function (value) {
|
|
330
|
+
return valueDict[value];
|
|
331
|
+
});
|
|
332
|
+
// highlight the rows
|
|
333
|
+
highlightRows(datasets, layers, datasetName, selectedIndices, layerSetIsValid);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29sb3JJbnRlcnBvbGF0ZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2NvbnN0YW50cyIsImNoZWNrRGF0YXNldE5vdEV4aXN0cyIsImRhdGFzZXRzIiwiZGF0YXNldE5hbWUiLCJmdW5jdGlvbk5hbWUiLCJkYXRhc2V0SWQiLCJPYmplY3QiLCJrZXlzIiwiZmluZCIsImRhdGFJZCIsImxhYmVsIiwibmFtZSIsInJlc3VsdCIsInN1Y2Nlc3MiLCJkZXRhaWxzIiwiY29uY2F0Iiwiam9pbiIsImNoZWNrRmllbGROb3RFeGlzdHMiLCJkYXRhc2V0IiwiZmllbGROYW1lIiwiZmllbGQiLCJmaWVsZHMiLCJmIiwidHlwZSIsIm1hcCIsImludGVycG9sYXRlQ29sb3IiLCJvcmlnaW5hbENvbG9ycyIsIm51bWJlck9mQ29sb3JzIiwibGVuZ3RoIiwiaW50ZXJwIiwiaW50ZXJwb2xhdGUiLCJjb2xvcnMiLCJBcnJheSIsImZyb20iLCJfIiwiaiIsImhleENvbG9ycyIsImNvbG9yIiwicmdiIiwibWF0Y2giLCJjIiwicGFyc2VJbnQiLCJ0b1N0cmluZyIsInBhZFN0YXJ0IiwiZ2V0VmFsdWVzRnJvbURhdGFzZXQiLCJ2YXJpYWJsZU5hbWUiLCJpIiwiZ2V0VmFsdWUiLCJnZXRTY2F0dGVycGxvdFZhbHVlc0Zyb21EYXRhc2V0IiwieFZhcmlhYmxlTmFtZSIsInlWYXJpYWJsZU5hbWUiLCJ4VmFsdWVzIiwieVZhbHVlcyIsIngiLCJ5IiwiaGlnaGxpZ2h0Um93cyIsImxheWVycyIsInNlbGVjdGVkUm93SW5kaWNlcyIsImxheWVyU2V0SXNWYWxpZCIsImZpbHRlcmVkSW5kZXgiLCJhbGxJbmRleGVzIiwic2VsZWN0TGF5ZXJzIiwiZmlsdGVyIiwibGF5ZXIiLCJjb25maWciLCJpZCIsImZvckVhY2giLCJmb3JtYXRMYXllckRhdGEiLCJnZXREYXRhc2V0Q29udGV4dCIsImNvbnRleHQiLCJkYXRhTWV0YSIsInZhbHVlcyIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZW9tZXRyeU1vZGUiLCJjb2x1bW5Nb2RlIiwiZ2VvbWV0cnlDb2x1bW5zIiwiZnJvbUVudHJpZXMiLCJlbnRyaWVzIiwiY29sdW1ucyIsIl9yZWYyIiwiX3JlZjMiLCJfc2xpY2VkVG9BcnJheTIiLCJ2YWx1ZSIsIl9yZWY0IiwiX3JlZjUiLCJrZXkiLCJfdHlwZW9mMiIsIl9yZWY2IiwiX3JlZjciLCJ2IiwiSlNPTiIsInN0cmluZ2lmeSIsImdldEdlb21ldHJpZXNGcm9tRGF0YXNldCIsImxheWVyRGF0YSIsImxheWVySW5kZXgiLCJmaW5kSW5kZXgiLCJnZW9tZXRyaWVzIiwiZGF0YSIsInNhdmVBc0RhdGFzZXQiLCJhZGREYXRhVG9NYXAiLCJsZWZ0RGF0YXNldCIsIm51bVJvd3MiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwiaW5kZXgiLCJkaXNwbGF5TmFtZSIsImRldGVybWluZUZpZWxkVHlwZSIsImRhdGFWYWx1ZXMiLCJyb3dzIiwiZmlsbCIsInJvd0lkeCIsImNvbCIsIm5ld0RhdGFzZXROYW1lIiwibmV3RGF0YXNldCIsImluZm8iLCJvcHRpb25zIiwiYXV0b0NyZWF0ZUxheWVycyIsImNlbnRlck1hcCIsIk51bWJlciIsImlzSW50ZWdlciIsIkFMTF9GSUVMRF9UWVBFUyIsImludGVnZXIiLCJyZWFsIiwic3RyaW5nIiwiaGlnaGxpZ2h0Um93c0J5Q29sdW1uVmFsdWVzIiwiY29sdW1uTmFtZSIsInNlbGVjdGVkVmFsdWVzIiwidmFsdWVEaWN0IiwicmVkdWNlIiwiYWNjIiwic2VsZWN0ZWRJbmRpY2VzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rvb2xzL3V0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBpbnRlcnBvbGF0ZSBmcm9tICdjb2xvci1pbnRlcnBvbGF0ZSc7XG5cbmltcG9ydCB7TGF5ZXJ9IGZyb20gJ0BrZXBsZXIuZ2wvbGF5ZXJzJztcbmltcG9ydCB7RGF0YXNldHMsIEtlcGxlclRhYmxlfSBmcm9tICdAa2VwbGVyLmdsL3RhYmxlJztcbmltcG9ydCB7U3BhdGlhbEpvaW5HZW9tZXRyaWVzfSBmcm9tICdAb3BlbmFzc2lzdGFudC9nZW9kYSc7XG5pbXBvcnQge0FMTF9GSUVMRF9UWVBFU30gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtBZGREYXRhVG9NYXBQYXlsb2FkLCBQcm90b0RhdGFzZXQsIFByb3RvRGF0YXNldEZpZWxkfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgZGF0YXNldCBleGlzdHNcbiAqIEBwYXJhbSBkYXRhc2V0cyBUaGUga2VwbGVyLmdsIGRhdGFzZXRzXG4gKiBAcGFyYW0gZGF0YXNldE5hbWUgVGhlIG5hbWUgb2YgdGhlIGRhdGFzZXRcbiAqIEBwYXJhbSBmdW5jdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSBjaGVja1xuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tEYXRhc2V0Tm90RXhpc3RzKFxuICBkYXRhc2V0czogRGF0YXNldHMsXG4gIGRhdGFzZXROYW1lOiBzdHJpbmcsXG4gIGZ1bmN0aW9uTmFtZTogc3RyaW5nXG4pIHtcbiAgY29uc3QgZGF0YXNldElkID0gT2JqZWN0LmtleXMoZGF0YXNldHMpLmZpbmQoZGF0YUlkID0+IGRhdGFzZXRzW2RhdGFJZF0ubGFiZWwgPT09IGRhdGFzZXROYW1lKTtcbiAgaWYgKCFkYXRhc2V0SWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogZnVuY3Rpb25OYW1lLFxuICAgICAgcmVzdWx0OiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBkZXRhaWxzOiBgRGF0YXNldCBub3QgZm91bmQuIFBsZWFzZSBzcGVjaWZ5IG9uZSBmcm9tIHRoZSBmb2xsb3dpbmcgZGF0YXNldHM6ICR7T2JqZWN0LmtleXMoXG4gICAgICAgICAgZGF0YXNldHNcbiAgICAgICAgKS5qb2luKCcsICcpfWBcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBmaWVsZCBleGlzdHNcbiAqIEBwYXJhbSBkYXRhc2V0IFRoZSBrZXBsZXIuZ2wgZGF0YXNldFxuICogQHBhcmFtIGZpZWxkTmFtZSBUaGUgbmFtZSBvZiB0aGUgZmllbGRcbiAqIEBwYXJhbSBmdW5jdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSBjaGVja1xuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tGaWVsZE5vdEV4aXN0cyhkYXRhc2V0OiBLZXBsZXJUYWJsZSwgZmllbGROYW1lOiBzdHJpbmcsIGZ1bmN0aW9uTmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IGZpZWxkID0gZGF0YXNldC5maWVsZHMuZmluZChmID0+IGYubmFtZSA9PT0gZmllbGROYW1lKTtcbiAgaWYgKCFmaWVsZCkge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnbGF5ZXInLFxuICAgICAgbmFtZTogZnVuY3Rpb25OYW1lLFxuICAgICAgcmVzdWx0OiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBkZXRhaWxzOiBgRmllbGQgbm90IGZvdW5kLiBQbGVhc2Ugc3BlY2lmeSBvbmUgZnJvbSB0aGUgZm9sbG93aW5nIGZpZWxkczogJHtkYXRhc2V0LmZpZWxkc1xuICAgICAgICAgIC5tYXAoZiA9PiBmLm5hbWUpXG4gICAgICAgICAgLmpvaW4oJywgJyl9YFxuICAgICAgfVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogSW50ZXJwb2xhdGUgdGhlIGNvbG9ycyBmcm9tIHRoZSBvcmlnaW5hbCBjb2xvcnMgd2l0aCB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGNvbG9yc1xuICogQHBhcmFtIG9yaWdpbmFsQ29sb3JzIFRoZSBvcmlnaW5hbCBjb2xvcnNcbiAqIEBwYXJhbSBudW1iZXJPZkNvbG9ycyBUaGUgbnVtYmVyIG9mIGNvbG9yc1xuICogQHJldHVybnMgVGhlIGludGVycG9sYXRlZCBjb2xvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludGVycG9sYXRlQ29sb3Iob3JpZ2luYWxDb2xvcnM6IHN0cmluZ1tdLCBudW1iZXJPZkNvbG9yczogbnVtYmVyKSB7XG4gIGlmIChvcmlnaW5hbENvbG9ycy5sZW5ndGggPT09IG51bWJlck9mQ29sb3JzKSB7XG4gICAgcmV0dXJuIG9yaWdpbmFsQ29sb3JzO1xuICB9XG4gIGNvbnN0IGludGVycCA9IGludGVycG9sYXRlKG9yaWdpbmFsQ29sb3JzKTtcbiAgY29uc3QgY29sb3JzID0gQXJyYXkuZnJvbSh7bGVuZ3RoOiBudW1iZXJPZkNvbG9yc30sIChfLCBqKSA9PiBpbnRlcnAoaiAvIChudW1iZXJPZkNvbG9ycyAtIDEpKSk7XG4gIC8vIGNvbnZlcnQgY29sb3JzIGZyb20gJ3JnYigyNTUsIDI1NSwgMjU1KScgdG8gJyNmZmZmZmYnXG4gIGNvbnN0IGhleENvbG9ycyA9IGNvbG9ycy5tYXAoY29sb3IgPT4ge1xuICAgIGNvbnN0IHJnYiA9IGNvbG9yLm1hdGNoKC9cXGQrL2cpO1xuICAgIHJldHVybiBgIyR7cmdiPy5tYXAoYyA9PiBwYXJzZUludChjKS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyl9YDtcbiAgfSk7XG4gIHJldHVybiBoZXhDb2xvcnM7XG59XG5cbi8qKlxuICogR2V0IHRoZSB2YWx1ZXMgZnJvbSBhIGRhdGFzZXQgZm9yIGEgdmFyaWFibGVcbiAqIEBwYXJhbSBkYXRhc2V0c1xuICogQHBhcmFtIGRhdGFzZXROYW1lXG4gKiBAcGFyYW0gdmFyaWFibGVOYW1lXG4gKiBAcmV0dXJucyB7bnVtYmVyW119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWx1ZXNGcm9tRGF0YXNldChcbiAgZGF0YXNldHM6IERhdGFzZXRzLFxuICBkYXRhc2V0TmFtZTogc3RyaW5nLFxuICB2YXJpYWJsZU5hbWU6IHN0cmluZ1xuKTogbnVtYmVyW10ge1xuICAvLyBmaW5kIHdoaWNoIGRhdGFzZXQgaGFzIHRoZSB2YXJpYWJsZU5hbWVcbiAgY29uc3QgZGF0YXNldElkID0gT2JqZWN0LmtleXMoZGF0YXNldHMpLmZpbmQoZGF0YUlkID0+IGRhdGFzZXRzW2RhdGFJZF0ubGFiZWwgPT09IGRhdGFzZXROYW1lKTtcbiAgaWYgKCFkYXRhc2V0SWQpIHJldHVybiBbXTtcbiAgY29uc3QgZGF0YXNldCA9IGRhdGFzZXRzW2RhdGFzZXRJZF07XG4gIGlmIChkYXRhc2V0KSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oe2xlbmd0aDogZGF0YXNldC5sZW5ndGh9LCAoXywgaSkgPT4gZGF0YXNldC5nZXRWYWx1ZSh2YXJpYWJsZU5hbWUsIGkpKTtcbiAgfVxuICByZXR1cm4gW107XG59XG5cbi8qKlxuICogR2V0IHRoZSB4IGFuZCB5IHZhbHVlcyBmcm9tIGEgZGF0YXNldCBmb3IgYSBzY2F0dGVycGxvdFxuICogQHBhcmFtIGRhdGFzZXRzXG4gKiBAcGFyYW0gZGF0YXNldE5hbWVcbiAqIEBwYXJhbSB4VmFyaWFibGVOYW1lXG4gKiBAcGFyYW0geVZhcmlhYmxlTmFtZVxuICogQHJldHVybnMge3g6IG51bWJlcltdLCB5OiBudW1iZXJbXX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNjYXR0ZXJwbG90VmFsdWVzRnJvbURhdGFzZXQoXG4gIGRhdGFzZXRzOiBEYXRhc2V0cyxcbiAgZGF0YXNldE5hbWU6IHN0cmluZyxcbiAgeFZhcmlhYmxlTmFtZTogc3RyaW5nLFxuICB5VmFyaWFibGVOYW1lOiBzdHJpbmdcbik6IHt4OiBudW1iZXJbXTsgeTogbnVtYmVyW119IHtcbiAgY29uc3QgeFZhbHVlcyA9IGdldFZhbHVlc0Zyb21EYXRhc2V0KGRhdGFzZXRzLCBkYXRhc2V0TmFtZSwgeFZhcmlhYmxlTmFtZSk7XG4gIGNvbnN0IHlWYWx1ZXMgPSBnZXRWYWx1ZXNGcm9tRGF0YXNldChkYXRhc2V0cywgZGF0YXNldE5hbWUsIHlWYXJpYWJsZU5hbWUpO1xuICByZXR1cm4ge3g6IHhWYWx1ZXMsIHk6IHlWYWx1ZXN9O1xufVxuXG4vKipcbiAqIEhpZ2hsaWdodCB0aGUgcm93cyBpbiBhIGRhdGFzZXRcbiAqIEBwYXJhbSBkYXRhc2V0cyBUaGUga2VwbGVyLmdsIGRhdGFzZXRzXG4gKiBAcGFyYW0gbGF5ZXJzIFRoZSBrZXBsZXIuZ2wgbGF5ZXJzXG4gKiBAcGFyYW0gZGF0YXNldE5hbWUgVGhlIG5hbWUgb2YgdGhlIGRhdGFzZXRcbiAqIEBwYXJhbSBzZWxlY3RlZFJvd0luZGljZXMgVGhlIGluZGljZXMgb2YgdGhlIHJvd3MgdG8gaGlnaGxpZ2h0XG4gKiBAcGFyYW0gbGF5ZXJTZXRJc1ZhbGlkIFRoZSBmdW5jdGlvbiB0byBzZXQgdGhlIGxheWVyIHZhbGlkaXR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoaWdobGlnaHRSb3dzKFxuICBkYXRhc2V0czogRGF0YXNldHMsXG4gIGxheWVyczogTGF5ZXJbXSxcbiAgZGF0YXNldE5hbWU6IHN0cmluZyxcbiAgc2VsZWN0ZWRSb3dJbmRpY2VzOiBudW1iZXJbXSxcbiAgbGF5ZXJTZXRJc1ZhbGlkOiAobGF5ZXI6IExheWVyLCBpc1ZhbGlkOiBib29sZWFuKSA9PiB2b2lkXG4pIHtcbiAgLy8gdXBkYXRlIHRoZSBmaWx0ZXJlZEluZGV4IGluIHRoZSBkYXRhc2V0XG4gIGNvbnN0IGRhdGFzZXRJZCA9IE9iamVjdC5rZXlzKGRhdGFzZXRzKS5maW5kKGRhdGFJZCA9PiBkYXRhc2V0c1tkYXRhSWRdLmxhYmVsID09PSBkYXRhc2V0TmFtZSk7XG4gIGlmICghZGF0YXNldElkKSByZXR1cm47XG4gIGNvbnN0IGRhdGFzZXQgPSBkYXRhc2V0c1tkYXRhc2V0SWRdO1xuICBpZiAoZGF0YXNldCkge1xuICAgIGRhdGFzZXQuZmlsdGVyZWRJbmRleCA9XG4gICAgICBzZWxlY3RlZFJvd0luZGljZXMubGVuZ3RoID09PSAwID8gZGF0YXNldC5hbGxJbmRleGVzIDogc2VsZWN0ZWRSb3dJbmRpY2VzO1xuICAgIC8vIGdldCBhbGwgbGF5ZXJzIHRoYXQgdXNlIHRoaXMgZGF0YXNldFxuICAgIGNvbnN0IHNlbGVjdExheWVycyA9IGxheWVycy5maWx0ZXIobGF5ZXIgPT4gbGF5ZXIuY29uZmlnLmRhdGFJZCA9PT0gZGF0YXNldC5pZCk7XG4gICAgc2VsZWN0TGF5ZXJzLmZvckVhY2gobGF5ZXIgPT4ge1xuICAgICAgbGF5ZXIuZm9ybWF0TGF5ZXJEYXRhKGRhdGFzZXRzKTtcbiAgICAgIC8vIHRyaWdnZXIgYSByZS1yZW5kZXIgdXNpbmcgbGF5ZXJTZXRJc1ZhbGlkKCkgdG8gdXBkYXRlIHRoZSB0b3AgbGF5ZXJcbiAgICAgIGxheWVyU2V0SXNWYWxpZChsYXllciwgdHJ1ZSk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIGRhdGFzZXQgY29udGV4dCwgd2hpY2ggaXMgdXNlZCB0byBwcm92aWRlIHRoZSBkYXRhc2V0IGluZm9ybWF0aW9uIHRvIHRoZSBBSSBhc3Npc3RhbnRcbiAqIEBwYXJhbSBkYXRhc2V0cyBUaGUga2VwbGVyLmdsIGRhdGFzZXRzXG4gKiBAcGFyYW0gbGF5ZXJzIFRoZSBrZXBsZXIuZ2wgbGF5ZXJzXG4gKiBAcmV0dXJucyBUaGUgZGF0YXNldCBjb250ZXh0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRhc2V0Q29udGV4dChkYXRhc2V0czogRGF0YXNldHMsIGxheWVyczogTGF5ZXJbXSkge1xuICBjb25zdCBjb250ZXh0ID0gJ1BsZWFzZSByZW1lbWJlciB0aGUgZm9sbG93aW5nIGRhdGFzZXQgY29udGV4dDonO1xuICBjb25zdCBkYXRhTWV0YSA9IE9iamVjdC52YWx1ZXMoZGF0YXNldHMpLm1hcCgoZGF0YXNldDogS2VwbGVyVGFibGUpID0+ICh7XG4gICAgZGF0YXNldE5hbWU6IGRhdGFzZXQubGFiZWwsXG4gICAgZGF0YXNldElkOiBkYXRhc2V0LmlkLFxuICAgIGZpZWxkczogZGF0YXNldC5maWVsZHMubWFwKGZpZWxkID0+ICh7W2ZpZWxkLm5hbWVdOiBmaWVsZC50eXBlfSkpLFxuICAgIGxheWVyczogbGF5ZXJzXG4gICAgICAuZmlsdGVyKGxheWVyID0+IGxheWVyLmNvbmZpZy5kYXRhSWQgPT09IGRhdGFzZXQuaWQpXG4gICAgICAubWFwKGxheWVyID0+ICh7XG4gICAgICAgIGlkOiBsYXllci5pZCxcbiAgICAgICAgbGFiZWw6IGxheWVyLmNvbmZpZy5sYWJlbCxcbiAgICAgICAgdHlwZTogbGF5ZXIudHlwZSxcbiAgICAgICAgZ2VvbWV0cnlNb2RlOiBsYXllci5jb25maWcuY29sdW1uTW9kZSxcbiAgICAgICAgLy8gZ2V0IHRoZSB2YWxpZCBnZW9tZXRyeSBjb2x1bW5zIGFzIHN0cmluZ1xuICAgICAgICBnZW9tZXRyeUNvbHVtbnM6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICBPYmplY3QuZW50cmllcyhsYXllci5jb25maWcuY29sdW1ucylcbiAgICAgICAgICAgIC5maWx0ZXIoKFssIHZhbHVlXSkgPT4gdmFsdWUgIT09IG51bGwpXG4gICAgICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IFtcbiAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXModmFsdWUpLmZpbHRlcigoWywgdl0pID0+IHYgIT09IG51bGwpKVxuICAgICAgICAgICAgICAgIDogdmFsdWVcbiAgICAgICAgICAgIF0pXG4gICAgICAgIClcbiAgICAgIH0pKVxuICB9KSk7XG4gIHJldHVybiBgJHtjb250ZXh0fVxcbiR7SlNPTi5zdHJpbmdpZnkoZGF0YU1ldGEpfWA7XG59XG5cbi8qKlxuICogR2V0IHRoZSBnZW9tZXRyaWVzIGZyb20gYSBkYXRhc2V0XG4gKiBAcGFyYW0gZGF0YXNldHMgVGhlIGtlcGxlci5nbCBkYXRhc2V0c1xuICogQHBhcmFtIGxheWVycyBUaGUga2VwbGVyLmdsIGxheWVyc1xuICogQHBhcmFtIGxheWVyRGF0YSBUaGUgbGF5ZXIgZGF0YVxuICogQHBhcmFtIGRhdGFzZXROYW1lIFRoZSBuYW1lIG9mIHRoZSBkYXRhc2V0XG4gKiBAcmV0dXJucyBUaGUgZ2VvbWV0cmllc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2VvbWV0cmllc0Zyb21EYXRhc2V0KFxuICBkYXRhc2V0czogRGF0YXNldHMsXG4gIGxheWVyczogTGF5ZXJbXSxcbiAgbGF5ZXJEYXRhOiBhbnlbXSxcbiAgZGF0YXNldE5hbWU6IHN0cmluZ1xuKTogU3BhdGlhbEpvaW5HZW9tZXRyaWVzIHtcbiAgY29uc3QgZGF0YXNldElkID0gT2JqZWN0LmtleXMoZGF0YXNldHMpLmZpbmQoZGF0YUlkID0+IGRhdGFzZXRzW2RhdGFJZF0ubGFiZWwgPT09IGRhdGFzZXROYW1lKTtcbiAgaWYgKCFkYXRhc2V0SWQpIHJldHVybiBbXTtcbiAgY29uc3QgZGF0YXNldCA9IGRhdGFzZXRzW2RhdGFzZXRJZF07XG5cbiAgLy8gZ2V0IHRoZSBpbmRleCBvZiB0aGUgbGF5ZXJcbiAgY29uc3QgbGF5ZXJJbmRleCA9IGxheWVycy5maW5kSW5kZXgobGF5ZXIgPT4gbGF5ZXIuY29uZmlnLmRhdGFJZCA9PT0gZGF0YXNldC5pZCk7XG4gIGlmIChsYXllckluZGV4ID09PSAtMSkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGdlb21ldHJpZXMgPSBsYXllckRhdGFbbGF5ZXJJbmRleF07XG5cbiAgcmV0dXJuIGdlb21ldHJpZXM/LmRhdGE7XG59XG5cbi8qKlxuICogU2F2ZSB0aGUgZGF0YSBhcyBhIG5ldyBkYXRhc2V0IGJ5IGpvaW5pbmcgaXQgd2l0aCB0aGUgbGVmdCBkYXRhc2V0XG4gKiBAcGFyYW0gZGF0YXNldHMgVGhlIGtlcGxlci5nbCBkYXRhc2V0c1xuICogQHBhcmFtIGRhdGFzZXROYW1lIFRoZSBuYW1lIG9mIHRoZSBsZWZ0IGRhdGFzZXRcbiAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIHNhdmVcbiAqIEBwYXJhbSBhZGREYXRhVG9NYXAgVGhlIGZ1bmN0aW9uIHRvIGFkZCB0aGUgZGF0YSB0byB0aGUgbWFwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYXZlQXNEYXRhc2V0KFxuICBkYXRhc2V0czogRGF0YXNldHMsXG4gIGRhdGFzZXROYW1lOiBzdHJpbmcsXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIG51bWJlcltdPixcbiAgYWRkRGF0YVRvTWFwOiAoZGF0YTogQWRkRGF0YVRvTWFwUGF5bG9hZCkgPT4gdm9pZFxuKSB7XG4gIC8vIGZpbmQgZGF0YXNldElkIGZyb20gZGF0YXNldHNcbiAgY29uc3QgZGF0YXNldElkID0gT2JqZWN0LmtleXMoZGF0YXNldHMpLmZpbmQoZGF0YUlkID0+IGRhdGFzZXRzW2RhdGFJZF0ubGFiZWwgPT09IGRhdGFzZXROYW1lKTtcbiAgaWYgKCFkYXRhc2V0SWQpIHJldHVybjtcblxuICBjb25zdCBsZWZ0RGF0YXNldCA9IGRhdGFzZXRzW2RhdGFzZXRJZF07XG4gIGNvbnN0IG51bVJvd3MgPSBsZWZ0RGF0YXNldC5sZW5ndGg7XG5cbiAgY29uc3QgZmllbGRzOiBQcm90b0RhdGFzZXRGaWVsZFtdID0gW1xuICAgIC8vIE5ldyBmaWVsZHMgZnJvbSBkYXRhXG4gICAgLi4uT2JqZWN0LmtleXMoZGF0YSkubWFwKChmaWVsZE5hbWUsIGluZGV4KSA9PiAoe1xuICAgICAgbmFtZTogZmllbGROYW1lLFxuICAgICAgaWQ6IGAke2ZpZWxkTmFtZX1fJHtpbmRleH1gLFxuICAgICAgZGlzcGxheU5hbWU6IGZpZWxkTmFtZSxcbiAgICAgIHR5cGU6IGRldGVybWluZUZpZWxkVHlwZShkYXRhW2ZpZWxkTmFtZV1bMF0pXG4gICAgfSkpLFxuICAgIC8vIEV4aXN0aW5nIGZpZWxkcyBmcm9tIGxlZnREYXRhc2V0XG4gICAgLi4ubGVmdERhdGFzZXQuZmllbGRzLm1hcCgoZmllbGQsIGluZGV4KSA9PiAoe1xuICAgICAgbmFtZTogZmllbGQubmFtZSxcbiAgICAgIGlkOiBmaWVsZC5pZCB8fCBgJHtmaWVsZC5uYW1lfV8ke2luZGV4fWAsXG4gICAgICBkaXNwbGF5TmFtZTogZmllbGQuZGlzcGxheU5hbWUsXG4gICAgICB0eXBlOiBmaWVsZC50eXBlXG4gICAgfSkpXG4gIF07XG5cbiAgLy8gUHJlLWNhbGN1bGF0ZSBkYXRhIHZhbHVlcyBhcnJheVxuICBjb25zdCBkYXRhVmFsdWVzID0gT2JqZWN0LnZhbHVlcyhkYXRhKTtcblxuICBjb25zdCByb3dzID0gQXJyYXkobnVtUm93cylcbiAgICAuZmlsbChudWxsKVxuICAgIC5tYXAoKF8sIHJvd0lkeCkgPT4gW1xuICAgICAgLy8gTmV3IGRhdGEgdmFsdWVzXG4gICAgICAuLi5kYXRhVmFsdWVzLm1hcChjb2wgPT4gY29sW3Jvd0lkeF0pLFxuICAgICAgLy8gRXhpc3RpbmcgZGF0YXNldCB2YWx1ZXNcbiAgICAgIC4uLmxlZnREYXRhc2V0LmZpZWxkcy5tYXAoZmllbGQgPT4gbGVmdERhdGFzZXQuZ2V0VmFsdWUoZmllbGQubmFtZSwgcm93SWR4KSlcbiAgICBdKTtcblxuICAvLyBjcmVhdGUgbmV3IGRhdGFzZXRcbiAgY29uc3QgbmV3RGF0YXNldE5hbWUgPSBgJHtkYXRhc2V0TmFtZX1fam9pbmVkYDtcbiAgY29uc3QgbmV3RGF0YXNldDogUHJvdG9EYXRhc2V0ID0ge1xuICAgIGluZm86IHtcbiAgICAgIGlkOiBuZXdEYXRhc2V0TmFtZSxcbiAgICAgIGxhYmVsOiBuZXdEYXRhc2V0TmFtZVxuICAgIH0sXG4gICAgZGF0YToge1xuICAgICAgZmllbGRzLFxuICAgICAgcm93c1xuICAgIH1cbiAgfTtcblxuICBhZGREYXRhVG9NYXAoe2RhdGFzZXRzOiBbbmV3RGF0YXNldF0sIG9wdGlvbnM6IHthdXRvQ3JlYXRlTGF5ZXJzOiB0cnVlLCBjZW50ZXJNYXA6IHRydWV9fSk7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSBmaWVsZCB0eXBlXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGRldGVybWluZSB0aGUgZmllbGQgdHlwZVxuICogQHJldHVybnMgVGhlIGZpZWxkIHR5cGVcbiAqL1xuZnVuY3Rpb24gZGV0ZXJtaW5lRmllbGRUeXBlKHZhbHVlOiB1bmtub3duKToga2V5b2YgdHlwZW9mIEFMTF9GSUVMRF9UWVBFUyB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInXG4gICAgPyBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKVxuICAgICAgPyBBTExfRklFTERfVFlQRVMuaW50ZWdlclxuICAgICAgOiBBTExfRklFTERfVFlQRVMucmVhbFxuICAgIDogQUxMX0ZJRUxEX1RZUEVTLnN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhpZ2hsaWdodFJvd3NCeUNvbHVtblZhbHVlcyhcbiAgZGF0YXNldHM6IERhdGFzZXRzLFxuICBsYXllcnM6IExheWVyW10sXG4gIGRhdGFzZXROYW1lOiBzdHJpbmcsXG4gIGNvbHVtbk5hbWU6IHN0cmluZyxcbiAgc2VsZWN0ZWRWYWx1ZXM6IHVua25vd25bXSxcbiAgbGF5ZXJTZXRJc1ZhbGlkOiAobGF5ZXI6IExheWVyLCBpc1ZhbGlkOiBib29sZWFuKSA9PiB2b2lkXG4pIHtcbiAgY29uc3QgZGF0YXNldElkID0gT2JqZWN0LmtleXMoZGF0YXNldHMpLmZpbmQoZGF0YUlkID0+IGRhdGFzZXRzW2RhdGFJZF0ubGFiZWwgPT09IGRhdGFzZXROYW1lKTtcbiAgaWYgKCFkYXRhc2V0SWQpIHJldHVybjtcbiAgY29uc3QgZGF0YXNldCA9IGRhdGFzZXRzW2RhdGFzZXRJZF07XG4gIGlmIChkYXRhc2V0KSB7XG4gICAgLy8gZ2V0IHRoZSB2YWx1ZXMgb2YgdGhlIGNvbHVtblxuICAgIGNvbnN0IHZhbHVlcyA9IEFycmF5LmZyb20oe2xlbmd0aDogZGF0YXNldC5sZW5ndGh9LCAoXywgaSkgPT4gZGF0YXNldC5nZXRWYWx1ZShjb2x1bW5OYW1lLCBpKSk7XG4gICAgLy8gY3JlYXRlIGEgZGljdCB1c2luZyB0aGUgdmFsdWVzXG4gICAgY29uc3QgdmFsdWVEaWN0ID0gdmFsdWVzLnJlZHVjZSgoYWNjLCB2YWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgIGFjY1t2YWx1ZV0gPSBpbmRleDtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pO1xuICAgIC8vIG5lZWQgdG8gZml4IHRoZSB0eXBlIGVycm9yIG9mIHZhbHVlIGhlcmVcbiAgICBjb25zdCBzZWxlY3RlZEluZGljZXMgPSBzZWxlY3RlZFZhbHVlcy5tYXAodmFsdWUgPT4gdmFsdWVEaWN0W3ZhbHVlIGFzIGFueV0pO1xuICAgIC8vIGhpZ2hsaWdodCB0aGUgcm93c1xuICAgIGhpZ2hsaWdodFJvd3MoZGF0YXNldHMsIGxheWVycywgZGF0YXNldE5hbWUsIHNlbGVjdGVkSW5kaWNlcywgbGF5ZXJTZXRJc1ZhbGlkKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLGlCQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFLQSxJQUFBQyxVQUFBLEdBQUFELE9BQUE7QUFSQTtBQUNBOztBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0UscUJBQXFCQSxDQUNuQ0MsUUFBa0IsRUFDbEJDLFdBQW1CLEVBQ25CQyxZQUFvQixFQUNwQjtFQUNBLElBQU1DLFNBQVMsR0FBR0MsTUFBTSxDQUFDQyxJQUFJLENBQUNMLFFBQVEsQ0FBQyxDQUFDTSxJQUFJLENBQUMsVUFBQUMsTUFBTTtJQUFBLE9BQUlQLFFBQVEsQ0FBQ08sTUFBTSxDQUFDLENBQUNDLEtBQUssS0FBS1AsV0FBVztFQUFBLEVBQUM7RUFDOUYsSUFBSSxDQUFDRSxTQUFTLEVBQUU7SUFDZCxPQUFPO01BQ0xNLElBQUksRUFBRVAsWUFBWTtNQUNsQlEsTUFBTSxFQUFFO1FBQ05DLE9BQU8sRUFBRSxLQUFLO1FBQ2RD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
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kepler.gl/ai-assistant",
|
|
3
3
|
"author": "Xun Li<lixun910@gmail.com>",
|
|
4
|
-
"version": "3.1.0
|
|
4
|
+
"version": "3.1.0",
|
|
5
5
|
"description": "kepler.gl AI assistant",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"main": "dist/index.js",
|
|
@@ -30,17 +30,21 @@
|
|
|
30
30
|
"umd"
|
|
31
31
|
],
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@kepler.gl/components": "3.1.0
|
|
34
|
-
"@kepler.gl/constants": "3.1.0
|
|
35
|
-
"@kepler.gl/layers": "3.1.0
|
|
36
|
-
"@kepler.gl/table": "3.1.0
|
|
37
|
-
"@kepler.gl/types": "3.1.0
|
|
38
|
-
"@kepler.gl/utils": "3.1.0
|
|
33
|
+
"@kepler.gl/components": "3.1.0",
|
|
34
|
+
"@kepler.gl/constants": "3.1.0",
|
|
35
|
+
"@kepler.gl/layers": "3.1.0",
|
|
36
|
+
"@kepler.gl/table": "3.1.0",
|
|
37
|
+
"@kepler.gl/types": "3.1.0",
|
|
38
|
+
"@kepler.gl/utils": "3.1.0",
|
|
39
|
+
"@openassistant/core": "^0.0.7",
|
|
40
|
+
"@openassistant/echarts": "^0.0.6",
|
|
41
|
+
"@openassistant/geoda": "^0.0.6",
|
|
42
|
+
"@openassistant/ui": "^0.0.7",
|
|
39
43
|
"color-interpolate": "^1.0.5",
|
|
40
44
|
"echarts": "^5.5.1",
|
|
41
45
|
"global": "^4.3.0",
|
|
42
|
-
"react-
|
|
43
|
-
"
|
|
46
|
+
"react-intl": "^6.3.0",
|
|
47
|
+
"usehooks-ts": "^3.1.0"
|
|
44
48
|
},
|
|
45
49
|
"nyc": {
|
|
46
50
|
"sourceMap": false,
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
// SPDX-License-Identifier: MIT
|
|
2
2
|
// Copyright contributors to the kepler.gl project
|
|
3
3
|
|
|
4
|
-
import {MessageModel} from '
|
|
4
|
+
import {MessageModel} from '@openassistant/core';
|
|
5
5
|
import {AiAssistantConfig} from './reducers';
|
|
6
6
|
|
|
7
|
-
const ACTION_PREFIX = '@@
|
|
7
|
+
const ACTION_PREFIX = '@@openassistant/';
|
|
8
8
|
|
|
9
9
|
export const UPDATE_AI_ASSISTANT_CONFIG = `${ACTION_PREFIX}UPDATE_AI_ASSISTANT_CONFIG`;
|
|
10
10
|
export const UPDATE_AI_ASSISTANT_MESSAGES = `${ACTION_PREFIX}UPDATE_AI_ASSISTANT_MESSAGES`;
|
|
@@ -3,13 +3,16 @@
|
|
|
3
3
|
|
|
4
4
|
import React, {useEffect} from 'react';
|
|
5
5
|
import styled, {withTheme} from 'styled-components';
|
|
6
|
+
import {MessageModel, useAssistant} from '@openassistant/core';
|
|
6
7
|
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
} from '
|
|
12
|
-
import '
|
|
8
|
+
dataClassifyFunctionDefinition,
|
|
9
|
+
spatialCountFunctionDefinition,
|
|
10
|
+
SpatialJoinGeometries
|
|
11
|
+
} from '@openassistant/geoda';
|
|
12
|
+
import {histogramFunctionDefinition, scatterplotFunctionDefinition} from '@openassistant/echarts';
|
|
13
|
+
import {AiAssistant} from '@openassistant/ui';
|
|
14
|
+
import '@openassistant/echarts/dist/index.css';
|
|
15
|
+
import '@openassistant/ui/dist/index.css';
|
|
13
16
|
|
|
14
17
|
import {textColorLT} from '@kepler.gl/styles';
|
|
15
18
|
import {ActionHandler} from '@kepler.gl/actions';
|
|
@@ -29,11 +32,17 @@ import {
|
|
|
29
32
|
PROMPT_IDEAS,
|
|
30
33
|
WELCOME_MESSAGE
|
|
31
34
|
} from '../constants';
|
|
32
|
-
import {filterFunctionDefinition} from '../tools/filter-function';
|
|
33
35
|
import {addLayerFunctionDefinition} from '../tools/layer-creation-function';
|
|
34
36
|
import {updateLayerColorFunctionDefinition} from '../tools/layer-style-function';
|
|
35
37
|
import {SelectedKeplerGlActions} from './ai-assistant-manager';
|
|
36
|
-
import {
|
|
38
|
+
import {
|
|
39
|
+
getDatasetContext,
|
|
40
|
+
getGeometriesFromDataset,
|
|
41
|
+
getScatterplotValuesFromDataset,
|
|
42
|
+
getValuesFromDataset,
|
|
43
|
+
highlightRows,
|
|
44
|
+
saveAsDataset
|
|
45
|
+
} from '../tools/utils';
|
|
37
46
|
|
|
38
47
|
type ThemeProps = {theme: any};
|
|
39
48
|
|
|
@@ -69,6 +78,21 @@ function AiAssistantComponentFactory() {
|
|
|
69
78
|
mapStyle,
|
|
70
79
|
visState
|
|
71
80
|
}: AiAssistantComponentProps & ThemeProps) => {
|
|
81
|
+
// get values from dataset, used by LLM functions
|
|
82
|
+
const getValuesCallback = (datasetName: string, variableName: string): number[] =>
|
|
83
|
+
getValuesFromDataset(visState.datasets, datasetName, variableName);
|
|
84
|
+
|
|
85
|
+
// highlight rows, used by LLM functions and plots (scatterplot, histogram)
|
|
86
|
+
const highlightRowsCallback = (datasetName: string, selectedRowIndices: number[]) =>
|
|
87
|
+
highlightRows(
|
|
88
|
+
visState.datasets,
|
|
89
|
+
visState.layers,
|
|
90
|
+
datasetName,
|
|
91
|
+
selectedRowIndices,
|
|
92
|
+
keplerGlActions.layerSetIsValid
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
// define LLM functions
|
|
72
96
|
const functions = [
|
|
73
97
|
basemapFunctionDefinition({mapStyleChange: keplerGlActions.mapStyleChange, mapStyle}),
|
|
74
98
|
loadUrlFunctionDefinition({
|
|
@@ -84,30 +108,37 @@ function AiAssistantComponentFactory() {
|
|
|
84
108
|
layerVisualChannelConfigChange: keplerGlActions.layerVisualChannelConfigChange,
|
|
85
109
|
layers: visState.layers
|
|
86
110
|
}),
|
|
87
|
-
filterFunctionDefinition({
|
|
88
|
-
datasets: visState.datasets,
|
|
89
|
-
filters: visState.filters,
|
|
90
|
-
createOrUpdateFilter: keplerGlActions.createOrUpdateFilter,
|
|
91
|
-
setFilter: keplerGlActions.setFilter,
|
|
92
|
-
setFilterPlot: keplerGlActions.setFilterPlot
|
|
93
|
-
}),
|
|
94
111
|
histogramFunctionDefinition({
|
|
95
|
-
getValues:
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
112
|
+
getValues: getValuesCallback,
|
|
113
|
+
onSelected: highlightRowsCallback
|
|
114
|
+
}),
|
|
115
|
+
scatterplotFunctionDefinition({
|
|
116
|
+
getValues: async (datasetName: string, xVar: string, yVar: string) =>
|
|
117
|
+
getScatterplotValuesFromDataset(visState.datasets, datasetName, xVar, yVar),
|
|
118
|
+
onSelected: highlightRowsCallback
|
|
119
|
+
}),
|
|
120
|
+
dataClassifyFunctionDefinition({
|
|
121
|
+
getValues: getValuesCallback
|
|
122
|
+
}),
|
|
123
|
+
spatialCountFunctionDefinition({
|
|
124
|
+
getValues: getValuesCallback,
|
|
125
|
+
getGeometries: (datasetName: string): SpatialJoinGeometries =>
|
|
126
|
+
getGeometriesFromDataset(
|
|
99
127
|
visState.datasets,
|
|
100
128
|
visState.layers,
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
129
|
+
visState.layerData,
|
|
130
|
+
datasetName
|
|
131
|
+
),
|
|
132
|
+
saveAsDataset: (datasetName: string, data: Record<string, number[]>) =>
|
|
133
|
+
saveAsDataset(visState.datasets, datasetName, data, keplerGlActions.addDataToMap)
|
|
105
134
|
})
|
|
106
135
|
];
|
|
107
136
|
|
|
137
|
+
// enable voice and screen capture
|
|
108
138
|
const enableVoiceAndScreenCapture =
|
|
109
139
|
aiAssistant.config.provider === 'openai' || aiAssistant.config.provider === 'google';
|
|
110
140
|
|
|
141
|
+
// define assistant props
|
|
111
142
|
const assistantProps = {
|
|
112
143
|
name: ASSISTANT_NAME,
|
|
113
144
|
description: ASSISTANT_DESCRIPTION,
|
|
@@ -121,12 +152,14 @@ function AiAssistantComponentFactory() {
|
|
|
121
152
|
|
|
122
153
|
const {initializeAssistant, addAdditionalContext} = useAssistant(assistantProps);
|
|
123
154
|
|
|
155
|
+
// initialize assistant with context
|
|
124
156
|
const initializeAssistantWithContext = async () => {
|
|
125
157
|
await initializeAssistant();
|
|
126
158
|
const context = getDatasetContext(visState.datasets, visState.layers);
|
|
127
159
|
addAdditionalContext({context});
|
|
128
160
|
};
|
|
129
161
|
|
|
162
|
+
// initialize assistant with context
|
|
130
163
|
useEffect(() => {
|
|
131
164
|
initializeAssistantWithContext();
|
|
132
165
|
// re-initialize assistant when datasets, filters or layers change
|