@kepler.gl/utils 3.0.0 → 3.1.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/package.json +14 -10
  2. package/dist/aggregate-utils.d.ts +0 -3
  3. package/dist/aggregate-utils.js +0 -75
  4. package/dist/arrow-data-container.d.ts +0 -54
  5. package/dist/arrow-data-container.js +0 -360
  6. package/dist/color-utils.d.ts +0 -51
  7. package/dist/color-utils.js +0 -161
  8. package/dist/data-container-interface.d.ts +0 -133
  9. package/dist/data-container-interface.js +0 -6
  10. package/dist/data-container-utils.d.ts +0 -30
  11. package/dist/data-container-utils.js +0 -88
  12. package/dist/data-row.d.ts +0 -59
  13. package/dist/data-row.js +0 -126
  14. package/dist/data-scale-utils.d.ts +0 -23
  15. package/dist/data-scale-utils.js +0 -62
  16. package/dist/data-utils.d.ts +0 -103
  17. package/dist/data-utils.js +0 -502
  18. package/dist/dataset-utils.d.ts +0 -116
  19. package/dist/dataset-utils.js +0 -614
  20. package/dist/dom-to-image.d.ts +0 -73
  21. package/dist/dom-to-image.js +0 -489
  22. package/dist/dom-utils.d.ts +0 -23
  23. package/dist/dom-utils.js +0 -434
  24. package/dist/effect-utils.d.ts +0 -23
  25. package/dist/effect-utils.js +0 -196
  26. package/dist/export-map-html.d.ts +0 -9
  27. package/dist/export-map-html.js +0 -28
  28. package/dist/export-utils.d.ts +0 -53
  29. package/dist/export-utils.js +0 -262
  30. package/dist/filter-utils.d.ts +0 -326
  31. package/dist/filter-utils.js +0 -1333
  32. package/dist/format.d.ts +0 -1
  33. package/dist/format.js +0 -17
  34. package/dist/gl-utils.d.ts +0 -1
  35. package/dist/gl-utils.js +0 -35
  36. package/dist/h3-utils.d.ts +0 -21
  37. package/dist/h3-utils.js +0 -81
  38. package/dist/index.d.ts +0 -36
  39. package/dist/index.js +0 -772
  40. package/dist/indexed-data-container.d.ts +0 -34
  41. package/dist/indexed-data-container.js +0 -254
  42. package/dist/locale-utils.d.ts +0 -2
  43. package/dist/locale-utils.js +0 -54
  44. package/dist/map-info-utils.d.ts +0 -1
  45. package/dist/map-info-utils.js +0 -15
  46. package/dist/map-style-utils/mapbox-gl-style-editor.d.ts +0 -65
  47. package/dist/map-style-utils/mapbox-gl-style-editor.js +0 -218
  48. package/dist/map-style-utils/mapbox-utils.d.ts +0 -9
  49. package/dist/map-style-utils/mapbox-utils.js +0 -48
  50. package/dist/map-utils.d.ts +0 -9
  51. package/dist/map-utils.js +0 -65
  52. package/dist/mapbox-utils.d.ts +0 -7
  53. package/dist/mapbox-utils.js +0 -22
  54. package/dist/noop.d.ts +0 -1
  55. package/dist/noop.js +0 -11
  56. package/dist/notifications-utils.d.ts +0 -42
  57. package/dist/notifications-utils.js +0 -85
  58. package/dist/observe-dimensions.d.ts +0 -15
  59. package/dist/observe-dimensions.js +0 -151
  60. package/dist/plot.d.ts +0 -6
  61. package/dist/plot.js +0 -31
  62. package/dist/projection-utils.d.ts +0 -21
  63. package/dist/projection-utils.js +0 -100
  64. package/dist/row-data-container.d.ts +0 -31
  65. package/dist/row-data-container.js +0 -252
  66. package/dist/searcher-utils.d.ts +0 -1
  67. package/dist/searcher-utils.js +0 -28
  68. package/dist/split-map-utils.d.ts +0 -32
  69. package/dist/split-map-utils.js +0 -114
  70. package/dist/time.d.ts +0 -16
  71. package/dist/time.js +0 -89
  72. package/dist/utils.d.ts +0 -116
  73. package/dist/utils.js +0 -305
@@ -1,262 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.isMSEdge = isMSEdge;
9
- exports.getScaleFromImageSize = getScaleFromImageSize;
10
- exports.calculateExportImageSize = calculateExportImageSize;
11
- exports.convertToPng = convertToPng;
12
- exports.dataURItoBlob = dataURItoBlob;
13
- exports.downloadFile = downloadFile;
14
- exports.exportImage = exportImage;
15
- exports.exportToJsonString = exportToJsonString;
16
- exports.getMapJSON = getMapJSON;
17
- exports.exportJson = exportJson;
18
- exports.exportHtml = exportHtml;
19
- exports.exportMap = exportMap;
20
- exports["default"] = exports.DEFAULT_EXPORT_JSON_SETTINGS = exports.DEFAULT_DATA_NAME = exports.DEFAULT_JSON_NAME = exports.DEFAULT_HTML_NAME = exports.DEFAULT_IMAGE_NAME = void 0;
21
-
22
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
23
-
24
- var _window = require("global/window");
25
-
26
- var _lodash = _interopRequireDefault(require("lodash.get"));
27
-
28
- var _constants = require("@kepler.gl/constants");
29
-
30
- var _domToImage = _interopRequireDefault(require("./dom-to-image"));
31
-
32
- var _utils = require("./utils");
33
-
34
- var _exportMapHtml = require("./export-map-html");
35
-
36
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
37
-
38
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
39
-
40
- /**
41
- * Default file names
42
- */
43
- var DEFAULT_IMAGE_NAME = 'kepler.gl.png';
44
- exports.DEFAULT_IMAGE_NAME = DEFAULT_IMAGE_NAME;
45
- var DEFAULT_HTML_NAME = 'kepler.gl.html';
46
- exports.DEFAULT_HTML_NAME = DEFAULT_HTML_NAME;
47
- var DEFAULT_JSON_NAME = 'kepler.gl.json';
48
- exports.DEFAULT_JSON_NAME = DEFAULT_JSON_NAME;
49
- var DEFAULT_DATA_NAME = 'kepler.gl';
50
- /**
51
- * Default json export settings
52
- */
53
-
54
- exports.DEFAULT_DATA_NAME = DEFAULT_DATA_NAME;
55
- var DEFAULT_EXPORT_JSON_SETTINGS = {
56
- hasData: true
57
- };
58
- exports.DEFAULT_EXPORT_JSON_SETTINGS = DEFAULT_EXPORT_JSON_SETTINGS;
59
- var defaultResolution = _constants.OneXResolutionOption;
60
- var defaultRatio = _constants.FourByThreeRatioOption;
61
-
62
- function isMSEdge(window) {
63
- // @ts-ignore msSaveOrOpenBlob was a proprietary addition to the Navigator object, added by Microsoft for Internet Explorer.
64
- return Boolean(window.navigator && window.navigator.msSaveOrOpenBlob);
65
- }
66
-
67
- function getScaleFromImageSize() {
68
- var imageW = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
69
- var imageH = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
70
- var mapW = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
71
- var mapH = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
72
-
73
- if ([imageW, imageH, mapW, mapH].some(function (d) {
74
- return d <= 0;
75
- })) {
76
- return 1;
77
- }
78
-
79
- var base = imageW / imageH > 1 ? imageW : imageH;
80
- var mapBase = imageW / imageH > 1 ? mapW : mapH;
81
- return base / mapBase;
82
- }
83
-
84
- function calculateExportImageSize(_ref) {
85
- var mapW = _ref.mapW,
86
- mapH = _ref.mapH,
87
- ratio = _ref.ratio,
88
- resolution = _ref.resolution;
89
-
90
- if (mapW <= 0 || mapH <= 0) {
91
- return null;
92
- }
93
-
94
- var ratioItem = _constants.EXPORT_IMG_RATIO_OPTIONS.find(function (op) {
95
- return op.id === ratio;
96
- }) || defaultRatio;
97
- var resolutionItem = _constants.EXPORT_IMG_RESOLUTION_OPTIONS.find(function (op) {
98
- return op.id === resolution;
99
- }) || defaultResolution;
100
-
101
- var _resolutionItem$getSi = resolutionItem.getSize(mapW, mapH),
102
- scaledWidth = _resolutionItem$getSi.width,
103
- scaledHeight = _resolutionItem$getSi.height;
104
-
105
- var _ratioItem$getSize = ratioItem.getSize(scaledWidth, scaledHeight),
106
- imageW = _ratioItem$getSize.width,
107
- imageH = _ratioItem$getSize.height;
108
-
109
- var _ref2 = ratioItem.id === _constants.EXPORT_IMG_RATIOS.CUSTOM ? {
110
- scale: undefined
111
- } : resolutionItem,
112
- scale = _ref2.scale;
113
-
114
- return {
115
- scale: scale,
116
- imageW: imageW,
117
- imageH: imageH
118
- };
119
- }
120
-
121
- function convertToPng(sourceElem, options) {
122
- return _domToImage["default"].toPng(sourceElem, options);
123
- }
124
-
125
- function dataURItoBlob(dataURI) {
126
- var binary = (0, _window.atob)(dataURI.split(',')[1]); // separate out the mime component
127
-
128
- var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; // write the bytes of the string to an ArrayBuffer
129
-
130
- var ab = new _window.ArrayBuffer(binary.length); // create a view into the buffer
131
-
132
- var ia = new _window.Uint8Array(ab);
133
-
134
- for (var i = 0; i < binary.length; i++) {
135
- ia[i] = binary.charCodeAt(i);
136
- }
137
-
138
- return new _window.Blob([ab], {
139
- type: mimeString
140
- });
141
- }
142
-
143
- function downloadFile(fileBlob, fileName) {
144
- if (isMSEdge(window)) {
145
- window.navigator.msSaveOrOpenBlob(fileBlob, fileName);
146
- } else {
147
- var url = _window.URL.createObjectURL(fileBlob);
148
-
149
- var link = _window.document.createElement('a');
150
-
151
- link.setAttribute('href', url);
152
- link.setAttribute('download', fileName);
153
-
154
- _window.document.body.appendChild(link); // in some cases where maps are embedded, e.g. need to
155
- // create and dispatch an event so that the browser downloads
156
- // the file instead of navigating to the url
157
-
158
-
159
- var evt = new MouseEvent('click', {
160
- view: window,
161
- bubbles: false,
162
- cancelable: true
163
- });
164
- link.dispatchEvent(evt);
165
-
166
- _window.document.body.removeChild(link);
167
-
168
- _window.URL.revokeObjectURL(url);
169
- }
170
- }
171
- /**
172
- * Whether color is rgb
173
- * @returns
174
- */
175
-
176
-
177
- function exportImage(uiStateExportImage) {
178
- var filename = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_IMAGE_NAME;
179
- var imageDataUri = uiStateExportImage.imageDataUri;
180
-
181
- if (imageDataUri) {
182
- var file = dataURItoBlob(imageDataUri);
183
- downloadFile(file, filename);
184
- }
185
- }
186
-
187
- function exportToJsonString(data) {
188
- try {
189
- return JSON.stringify(data);
190
- } catch (e) {
191
- if (e instanceof TypeError) return e.message; // Non-Standard Error Object Property
192
-
193
- return e.description;
194
- }
195
- }
196
-
197
- function getMapJSON(state) {
198
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_EXPORT_JSON_SETTINGS;
199
- var hasData = options.hasData;
200
- var schema = state.visState.schema;
201
-
202
- if (!hasData) {
203
- return schema.getConfigToSave(state);
204
- }
205
-
206
- var mapToSave = schema.save(state); // add file name if title is not provided
207
-
208
- var title = (0, _lodash["default"])(mapToSave, ['info', 'title']);
209
-
210
- if (!title || !title.length) {
211
- mapToSave = (0, _utils.set)(['info', 'title'], "keplergl_".concat((0, _utils.generateHashId)(6)), mapToSave);
212
- }
213
-
214
- return mapToSave;
215
- }
216
-
217
- function exportJson(state) {
218
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
219
- var map = getMapJSON(state, options);
220
- map.info.source = 'kepler.gl';
221
- var fileBlob = new _window.Blob([exportToJsonString(map)], {
222
- type: 'application/json'
223
- });
224
- var fileName = state.appName ? "".concat(state.appName, ".json") : DEFAULT_JSON_NAME;
225
- downloadFile(fileBlob, fileName);
226
- }
227
-
228
- function exportHtml(state, options) {
229
- var userMapboxToken = options.userMapboxToken,
230
- exportMapboxAccessToken = options.exportMapboxAccessToken,
231
- mode = options.mode;
232
-
233
- var data = _objectSpread(_objectSpread({}, getMapJSON(state)), {}, {
234
- mapboxApiAccessToken: (userMapboxToken || '') !== '' ? userMapboxToken : exportMapboxAccessToken,
235
- mode: mode
236
- });
237
-
238
- var fileBlob = new _window.Blob([(0, _exportMapHtml.exportMapToHTML)(data)], {
239
- type: 'text/html'
240
- });
241
- downloadFile(fileBlob, state.appName ? "".concat(state.appName, ".html") : DEFAULT_HTML_NAME);
242
- }
243
-
244
- function exportMap(state) {
245
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_EXPORT_JSON_SETTINGS;
246
- var imageDataUri = state.uiState.exportImage.imageDataUri;
247
- var thumbnail = imageDataUri ? dataURItoBlob(imageDataUri) : null;
248
- var mapToSave = getMapJSON(state, options);
249
- return {
250
- map: mapToSave,
251
- thumbnail: thumbnail
252
- };
253
- }
254
-
255
- var exporters = {
256
- exportImage: exportImage,
257
- exportJson: exportJson,
258
- exportHtml: exportHtml
259
- };
260
- var _default = exporters;
261
- exports["default"] = _default;
262
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9leHBvcnQtdXRpbHMudHMiXSwibmFtZXMiOlsiREVGQVVMVF9JTUFHRV9OQU1FIiwiREVGQVVMVF9IVE1MX05BTUUiLCJERUZBVUxUX0pTT05fTkFNRSIsIkRFRkFVTFRfREFUQV9OQU1FIiwiREVGQVVMVF9FWFBPUlRfSlNPTl9TRVRUSU5HUyIsImhhc0RhdGEiLCJkZWZhdWx0UmVzb2x1dGlvbiIsIk9uZVhSZXNvbHV0aW9uT3B0aW9uIiwiZGVmYXVsdFJhdGlvIiwiRm91ckJ5VGhyZWVSYXRpb09wdGlvbiIsImlzTVNFZGdlIiwid2luZG93IiwiQm9vbGVhbiIsIm5hdmlnYXRvciIsIm1zU2F2ZU9yT3BlbkJsb2IiLCJnZXRTY2FsZUZyb21JbWFnZVNpemUiLCJpbWFnZVciLCJpbWFnZUgiLCJtYXBXIiwibWFwSCIsInNvbWUiLCJkIiwiYmFzZSIsIm1hcEJhc2UiLCJjYWxjdWxhdGVFeHBvcnRJbWFnZVNpemUiLCJyYXRpbyIsInJlc29sdXRpb24iLCJyYXRpb0l0ZW0iLCJFWFBPUlRfSU1HX1JBVElPX09QVElPTlMiLCJmaW5kIiwib3AiLCJpZCIsInJlc29sdXRpb25JdGVtIiwiRVhQT1JUX0lNR19SRVNPTFVUSU9OX09QVElPTlMiLCJnZXRTaXplIiwic2NhbGVkV2lkdGgiLCJ3aWR0aCIsInNjYWxlZEhlaWdodCIsImhlaWdodCIsIkVYUE9SVF9JTUdfUkFUSU9TIiwiQ1VTVE9NIiwic2NhbGUiLCJ1bmRlZmluZWQiLCJjb252ZXJ0VG9QbmciLCJzb3VyY2VFbGVtIiwib3B0aW9ucyIsImRvbXRvaW1hZ2UiLCJ0b1BuZyIsImRhdGFVUkl0b0Jsb2IiLCJkYXRhVVJJIiwiYmluYXJ5Iiwic3BsaXQiLCJtaW1lU3RyaW5nIiwiYWIiLCJBcnJheUJ1ZmZlciIsImxlbmd0aCIsImlhIiwiVWludDhBcnJheSIsImkiLCJjaGFyQ29kZUF0IiwiQmxvYiIsInR5cGUiLCJkb3dubG9hZEZpbGUiLCJmaWxlQmxvYiIsImZpbGVOYW1lIiwidXJsIiwiVVJMIiwiY3JlYXRlT2JqZWN0VVJMIiwibGluayIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsInNldEF0dHJpYnV0ZSIsImJvZHkiLCJhcHBlbmRDaGlsZCIsImV2dCIsIk1vdXNlRXZlbnQiLCJ2aWV3IiwiYnViYmxlcyIsImNhbmNlbGFibGUiLCJkaXNwYXRjaEV2ZW50IiwicmVtb3ZlQ2hpbGQiLCJyZXZva2VPYmplY3RVUkwiLCJleHBvcnRJbWFnZSIsInVpU3RhdGVFeHBvcnRJbWFnZSIsImZpbGVuYW1lIiwiaW1hZ2VEYXRhVXJpIiwiZmlsZSIsImV4cG9ydFRvSnNvblN0cmluZyIsImRhdGEiLCJKU09OIiwic3RyaW5naWZ5IiwiZSIsIlR5cGVFcnJvciIsIm1lc3NhZ2UiLCJkZXNjcmlwdGlvbiIsImdldE1hcEpTT04iLCJzdGF0ZSIsInNjaGVtYSIsInZpc1N0YXRlIiwiZ2V0Q29uZmlnVG9TYXZlIiwibWFwVG9TYXZlIiwic2F2ZSIsInRpdGxlIiwiZXhwb3J0SnNvbiIsIm1hcCIsImluZm8iLCJzb3VyY2UiLCJhcHBOYW1lIiwiZXhwb3J0SHRtbCIsInVzZXJNYXBib3hUb2tlbiIsImV4cG9ydE1hcGJveEFjY2Vzc1Rva2VuIiwibW9kZSIsIm1hcGJveEFwaUFjY2Vzc1Rva2VuIiwiZXhwb3J0TWFwIiwidWlTdGF0ZSIsInRodW1ibmFpbCIsImV4cG9ydGVycyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQTs7QUFDQTs7QUFFQTs7QUFTQTs7QUFDQTs7QUFDQTs7Ozs7O0FBRUE7QUFDQTtBQUNBO0FBQ08sSUFBTUEsa0JBQWtCLEdBQUcsZUFBM0I7O0FBQ0EsSUFBTUMsaUJBQWlCLEdBQUcsZ0JBQTFCOztBQUNBLElBQU1DLGlCQUFpQixHQUFHLGdCQUExQjs7QUFDQSxJQUFNQyxpQkFBaUIsR0FBRyxXQUExQjtBQUVQO0FBQ0E7QUFDQTs7O0FBQ08sSUFBTUMsNEJBQTRCLEdBQUc7QUFDMUNDLEVBQUFBLE9BQU8sRUFBRTtBQURpQyxDQUFyQzs7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RCxFQUFRbkQsT0FBUixDQUE1QjtBQUVBLFNBQU87QUFDTDJELElBQUFBLEdBQUcsRUFBRUosU0FEQTtBQUVMZSxJQUFBQSxTQUFTLEVBQVRBO0FBRkssR0FBUDtBQUlEOztBQUVELElBQU1DLFNBQVMsR0FBRztBQUNoQmxDLEVBQUFBLFdBQVcsRUFBWEEsV0FEZ0I7QUFFaEJxQixFQUFBQSxVQUFVLEVBQVZBLFVBRmdCO0FBR2hCSyxFQUFBQSxVQUFVLEVBQVZBO0FBSGdCLENBQWxCO2VBTWVRLFMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQge0Jsb2IsIFVSTCwgYXRvYiwgVWludDhBcnJheSwgQXJyYXlCdWZmZXIsIGRvY3VtZW50fSBmcm9tICdnbG9iYWwvd2luZG93JztcbmltcG9ydCBnZXQgZnJvbSAnbG9kYXNoLmdldCc7XG5cbmltcG9ydCB7XG4gIEVYUE9SVF9JTUdfUkVTT0xVVElPTl9PUFRJT05TLFxuICBFWFBPUlRfSU1HX1JBVElPX09QVElPTlMsXG4gIFJFU09MVVRJT05TLFxuICBFWFBPUlRfSU1HX1JBVElPUyxcbiAgRm91ckJ5VGhyZWVSYXRpb09wdGlvbixcbiAgT25lWFJlc29sdXRpb25PcHRpb24sXG4gIEV4cG9ydEltYWdlXG59IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCBkb210b2ltYWdlIGZyb20gJy4vZG9tLXRvLWltYWdlJztcbmltcG9ydCB7Z2VuZXJhdGVIYXNoSWQsIHNldH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge2V4cG9ydE1hcFRvSFRNTH0gZnJvbSAnLi9leHBvcnQtbWFwLWh0bWwnO1xuXG4vKipcbiAqIERlZmF1bHQgZmlsZSBuYW1lc1xuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9JTUFHRV9OQU1FID0gJ2tlcGxlci5nbC5wbmcnO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfSFRNTF9OQU1FID0gJ2tlcGxlci5nbC5odG1sJztcbmV4cG9ydCBjb25zdCBERUZBVUxUX0pTT05fTkFNRSA9ICdrZXBsZXIuZ2wuanNvbic7XG5leHBvcnQgY29uc3QgREVGQVVMVF9EQVRBX05BTUUgPSAna2VwbGVyLmdsJztcblxuLyoqXG4gKiBEZWZhdWx0IGpzb24gZXhwb3J0IHNldHRpbmdzXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0VYUE9SVF9KU09OX1NFVFRJTkdTID0ge1xuICBoYXNEYXRhOiB0cnVlXG59O1xuXG5jb25zdCBkZWZhdWx0UmVzb2x1dGlvbiA9IE9uZVhSZXNvbHV0aW9uT3B0aW9uO1xuXG5jb25zdCBkZWZhdWx0UmF0aW8gPSBGb3VyQnlUaHJlZVJhdGlvT3B0aW9uO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNNU0VkZ2Uod2luZG93OiBXaW5kb3cpOiBib29sZWFuIHtcbiAgLy8gQHRzLWlnbm9yZSBtc1NhdmVPck9wZW5CbG9iIHdhcyBhIHByb3ByaWV0YXJ5IGFkZGl0aW9uIHRvIHRoZSBOYXZpZ2F0b3Igb2JqZWN0LCBhZGRlZCBieSBNaWNyb3NvZnQgZm9yIEludGVybmV0IEV4cGxvcmVyLlxuICByZXR1cm4gQm9vbGVhbih3aW5kb3cubmF2aWdhdG9yICYmIHdpbmRvdy5uYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY2FsZUZyb21JbWFnZVNpemUoaW1hZ2VXID0gMCwgaW1hZ2VIID0gMCwgbWFwVyA9IDAsIG1hcEggPSAwKSB7XG4gIGlmIChbaW1hZ2VXLCBpbWFnZUgsIG1hcFcsIG1hcEhdLnNvbWUoZCA9PiBkIDw9IDApKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBjb25zdCBiYXNlID0gaW1hZ2VXIC8gaW1hZ2VIID4gMSA/IGltYWdlVyA6IGltYWdlSDtcbiAgY29uc3QgbWFwQmFzZSA9IGltYWdlVyAvIGltYWdlSCA+IDEgPyBtYXBXIDogbWFwSDtcbiAgcmV0dXJuIGJhc2UgLyBtYXBCYXNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlRXhwb3J0SW1hZ2VTaXplKHtcbiAgbWFwVyxcbiAgbWFwSCxcbiAgcmF0aW8sXG4gIHJlc29sdXRpb25cbn06IHtcbiAgbWFwVzogbnVtYmVyO1xuICBtYXBIOiBudW1iZXI7XG4gIHJhdGlvOiBrZXlvZiB0eXBlb2YgRVhQT1JUX0lNR19SQVRJT1M7XG4gIHJlc29sdXRpb246IGtleW9mIHR5cGVvZiBSRVNPTFVUSU9OUztcbn0pIHtcbiAgaWYgKG1hcFcgPD0gMCB8fCBtYXBIIDw9IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHJhdGlvSXRlbSA9IEVYUE9SVF9JTUdfUkFUSU9fT1BUSU9OUy5maW5kKG9wID0+IG9wLmlkID09PSByYXRpbykgfHwgZGVmYXVsdFJhdGlvO1xuXG4gIGNvbnN0IHJlc29sdXRpb25JdGVtID1cbiAgICBFWFBPUlRfSU1HX1JFU09MVVRJT05fT1BUSU9OUy5maW5kKG9wID0+IG9wLmlkID09PSByZXNvbHV0aW9uKSB8fCBkZWZhdWx0UmVzb2x1dGlvbjtcblxuICBjb25zdCB7d2lkdGg6IHNjYWxlZFdpZHRoLCBoZWlnaHQ6IHNjYWxlZEhlaWdodH0gPSByZXNvbHV0aW9uSXRlbS5nZXRTaXplKG1hcFcsIG1hcEgpO1xuXG4gIGNvbnN0IHt3aWR0aDogaW1hZ2VXLCBoZWlnaHQ6IGltYWdlSH0gPSByYXRpb0l0ZW0uZ2V0U2l6ZShzY2FsZWRXaWR0aCwgc2NhbGVkSGVpZ2h0KTtcblxuICBjb25zdCB7c2NhbGV9ID0gcmF0aW9JdGVtLmlkID09PSBFWFBPUlRfSU1HX1JBVElPUy5DVVNUT00gPyB7c2NhbGU6IHVuZGVmaW5lZH0gOiByZXNvbHV0aW9uSXRlbTtcblxuICByZXR1cm4ge1xuICAgIHNjYWxlLFxuICAgIGltYWdlVyxcbiAgICBpbWFnZUhcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb1BuZyhzb3VyY2VFbGVtOiBIVE1MRWxlbWVudCwgb3B0aW9ucykge1xuICByZXR1cm4gZG9tdG9pbWFnZS50b1BuZyhzb3VyY2VFbGVtLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRhdGFVUkl0b0Jsb2IoZGF0YVVSSTogc3RyaW5nKTogQmxvYiB7XG4gIGNvbnN0IGJpbmFyeSA9IGF0b2IoZGF0YVVSSS5zcGxpdCgnLCcpWzFdKTtcblxuICAvLyBzZXBhcmF0ZSBvdXQgdGhlIG1pbWUgY29tcG9uZW50XG4gIGNvbnN0IG1pbWVTdHJpbmcgPSBkYXRhVVJJXG4gICAgLnNwbGl0KCcsJylbMF1cbiAgICAuc3BsaXQoJzonKVsxXVxuICAgIC5zcGxpdCgnOycpWzBdO1xuXG4gIC8vIHdyaXRlIHRoZSBieXRlcyBvZiB0aGUgc3RyaW5nIHRvIGFuIEFycmF5QnVmZmVyXG4gIGNvbnN0IGFiID0gbmV3IEFycmF5QnVmZmVyKGJpbmFyeS5sZW5ndGgpO1xuXG4gIC8vIGNyZWF0ZSBhIHZpZXcgaW50byB0aGUgYnVmZmVyXG4gIGNvbnN0IGlhID0gbmV3IFVpbnQ4QXJyYXkoYWIpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYmluYXJ5Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWFbaV0gPSBiaW5hcnkuY2hhckNvZGVBdChpKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgQmxvYihbYWJdLCB7dHlwZTogbWltZVN0cmluZ30pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZG93bmxvYWRGaWxlKGZpbGVCbG9iOiBCbG9iLCBmaWxlTmFtZTogc3RyaW5nKSB7XG4gIGlmIChpc01TRWRnZSh3aW5kb3cpKSB7XG4gICAgKHdpbmRvdy5uYXZpZ2F0b3IgYXMgYW55KS5tc1NhdmVPck9wZW5CbG9iKGZpbGVCbG9iLCBmaWxlTmFtZSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChmaWxlQmxvYik7XG5cbiAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGxpbmsuc2V0QXR0cmlidXRlKCdocmVmJywgdXJsKTtcbiAgICBsaW5rLnNldEF0dHJpYnV0ZSgnZG93bmxvYWQnLCBmaWxlTmFtZSk7XG5cbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspO1xuICAgIC8vIGluIHNvbWUgY2FzZXMgd2hlcmUgbWFwcyBhcmUgZW1iZWRkZWQsIGUuZy4gbmVlZCB0b1xuICAgIC8vIGNyZWF0ZSBhbmQgZGlzcGF0Y2ggYW4gZXZlbnQgc28gdGhhdCB0aGUgYnJvd3NlciBkb3dubG9hZHNcbiAgICAvLyB0aGUgZmlsZSBpbnN0ZWFkIG9mIG5hdmlnYXRpbmcgdG8gdGhlIHVybFxuICAgIGNvbnN0IGV2dCA9IG5ldyBNb3VzZUV2ZW50KCdjbGljaycsIHtcbiAgICAgIHZpZXc6IHdpbmRvdyxcbiAgICAgIGJ1YmJsZXM6IGZhbHNlLFxuICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIGxpbmsuZGlzcGF0Y2hFdmVudChldnQpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobGluayk7XG4gICAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuICB9XG59XG5cbi8qKlxuICogV2hldGhlciBjb2xvciBpcyByZ2JcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBvcnRJbWFnZSh1aVN0YXRlRXhwb3J0SW1hZ2U6IEV4cG9ydEltYWdlLCBmaWxlbmFtZSA9IERFRkFVTFRfSU1BR0VfTkFNRSkge1xuICBjb25zdCB7aW1hZ2VEYXRhVXJpfSA9IHVpU3RhdGVFeHBvcnRJbWFnZTtcbiAgaWYgKGltYWdlRGF0YVVyaSkge1xuICAgIGNvbnN0IGZpbGUgPSBkYXRhVVJJdG9CbG9iKGltYWdlRGF0YVVyaSk7XG4gICAgZG93bmxvYWRGaWxlKGZpbGUsIGZpbGVuYW1lKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwb3J0VG9Kc29uU3RyaW5nKGRhdGEpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIFR5cGVFcnJvcikgcmV0dXJuIGUubWVzc2FnZTtcbiAgICAvLyBOb24tU3RhbmRhcmQgRXJyb3IgT2JqZWN0IFByb3BlcnR5XG4gICAgcmV0dXJuIChlIGFzIGFueSkuZGVzY3JpcHRpb247XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1hcEpTT04oc3RhdGUsIG9wdGlvbnMgPSBERUZBVUxUX0VYUE9SVF9KU09OX1NFVFRJTkdTKSB7XG4gIGNvbnN0IHtoYXNEYXRhfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHNjaGVtYSA9IHN0YXRlLnZpc1N0YXRlLnNjaGVtYTtcblxuICBpZiAoIWhhc0RhdGEpIHtcbiAgICByZXR1cm4gc2NoZW1hLmdldENvbmZpZ1RvU2F2ZShzdGF0ZSk7XG4gIH1cblxuICBsZXQgbWFwVG9TYXZlID0gc2NoZW1hLnNhdmUoc3RhdGUpO1xuICAvLyBhZGQgZmlsZSBuYW1lIGlmIHRpdGxlIGlzIG5vdCBwcm92aWRlZFxuICBjb25zdCB0aXRsZSA9IGdldChtYXBUb1NhdmUsIFsnaW5mbycsICd0aXRsZSddKTtcbiAgaWYgKCF0aXRsZSB8fCAhdGl0bGUubGVuZ3RoKSB7XG4gICAgbWFwVG9TYXZlID0gc2V0KFsnaW5mbycsICd0aXRsZSddLCBga2VwbGVyZ2xfJHtnZW5lcmF0ZUhhc2hJZCg2KX1gLCBtYXBUb1NhdmUpO1xuICB9XG4gIHJldHVybiBtYXBUb1NhdmU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBvcnRKc29uKHN0YXRlLCBvcHRpb25zOiBhbnkgPSB7fSkge1xuICBjb25zdCBtYXAgPSBnZXRNYXBKU09OKHN0YXRlLCBvcHRpb25zKTtcbiAgbWFwLmluZm8uc291cmNlID0gJ2tlcGxlci5nbCc7XG4gIGNvbnN0IGZpbGVCbG9iID0gbmV3IEJsb2IoW2V4cG9ydFRvSnNvblN0cmluZyhtYXApXSwge3R5cGU6ICdhcHBsaWNhdGlvbi9qc29uJ30pO1xuICBjb25zdCBmaWxlTmFtZSA9IHN0YXRlLmFwcE5hbWUgPyBgJHtzdGF0ZS5hcHBOYW1lfS5qc29uYCA6IERFRkFVTFRfSlNPTl9OQU1FO1xuICBkb3dubG9hZEZpbGUoZmlsZUJsb2IsIGZpbGVOYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydEh0bWwoc3RhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3Qge3VzZXJNYXBib3hUb2tlbiwgZXhwb3J0TWFwYm94QWNjZXNzVG9rZW4sIG1vZGV9ID0gb3B0aW9ucztcblxuICBjb25zdCBkYXRhID0ge1xuICAgIC4uLmdldE1hcEpTT04oc3RhdGUpLFxuICAgIG1hcGJveEFwaUFjY2Vzc1Rva2VuOlxuICAgICAgKHVzZXJNYXBib3hUb2tlbiB8fCAnJykgIT09ICcnID8gdXNlck1hcGJveFRva2VuIDogZXhwb3J0TWFwYm94QWNjZXNzVG9rZW4sXG4gICAgbW9kZVxuICB9O1xuXG4gIGNvbnN0IGZpbGVCbG9iID0gbmV3IEJsb2IoW2V4cG9ydE1hcFRvSFRNTChkYXRhKV0sIHt0eXBlOiAndGV4dC9odG1sJ30pO1xuICBkb3dubG9hZEZpbGUoZmlsZUJsb2IsIHN0YXRlLmFwcE5hbWUgPyBgJHtzdGF0ZS5hcHBOYW1lfS5odG1sYCA6IERFRkFVTFRfSFRNTF9OQU1FKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydE1hcChzdGF0ZSwgb3B0aW9ucyA9IERFRkFVTFRfRVhQT1JUX0pTT05fU0VUVElOR1MpIHtcbiAgY29uc3Qge2ltYWdlRGF0YVVyaX0gPSBzdGF0ZS51aVN0YXRlLmV4cG9ydEltYWdlO1xuICBjb25zdCB0aHVtYm5haWw6IEJsb2IgfCBudWxsID0gaW1hZ2VEYXRhVXJpID8gZGF0YVVSSXRvQmxvYihpbWFnZURhdGFVcmkpIDogbnVsbDtcbiAgY29uc3QgbWFwVG9TYXZlID0gZ2V0TWFwSlNPTihzdGF0ZSwgb3B0aW9ucyk7XG5cbiAgcmV0dXJuIHtcbiAgICBtYXA6IG1hcFRvU2F2ZSxcbiAgICB0aHVtYm5haWxcbiAgfTtcbn1cblxuY29uc3QgZXhwb3J0ZXJzID0ge1xuICBleHBvcnRJbWFnZSxcbiAgZXhwb3J0SnNvbixcbiAgZXhwb3J0SHRtbFxufTtcblxuZXhwb3J0IGRlZmF1bHQgZXhwb3J0ZXJzO1xuIl19
@@ -1,326 +0,0 @@
1
- import { VisState } from '@kepler.gl/schemas';
2
- import { Millisecond, Field, ParsedFilter, Filter, FilterBase, PolygonFilter, FieldDomain, TimeRangeFieldDomain, HistogramBin, Feature, FeatureValue, LineChart, TimeRangeFilter, RangeFieldDomain, FilterDatasetOpt, FilterRecord } from '@kepler.gl/types';
3
- import { DataContainerInterface } from './data-container-interface';
4
- export declare const durationSecond = 1000;
5
- export declare const durationMinute: number;
6
- export declare const durationHour: number;
7
- export declare const durationDay: number;
8
- export declare const durationWeek: number;
9
- export declare const durationYear: number;
10
- export declare type FilterResult = {
11
- filteredIndexForDomain?: number[];
12
- filteredIndex?: number[];
13
- };
14
- export declare type FilterChanged = {
15
- [key in keyof FilterRecord]: {
16
- [key: string]: 'added' | 'deleted' | 'name_changed' | 'value_changed' | 'dataId_changed';
17
- } | null;
18
- };
19
- export declare type dataValueAccessor = (data: {
20
- index: number;
21
- }) => number | null;
22
- export declare const TimestampStepMap: {
23
- max: number;
24
- step: number;
25
- }[];
26
- export declare const histogramBins = 30;
27
- export declare const enlargedHistogramBins = 100;
28
- export declare const FILTER_UPDATER_PROPS: {
29
- dataId: "dataId";
30
- name: "name";
31
- layerId: "layerId";
32
- };
33
- export declare const LIMITED_FILTER_EFFECT_PROPS: {
34
- name: "name";
35
- };
36
- export declare const FILTER_COMPONENTS: {
37
- select: string;
38
- multiSelect: string;
39
- timeRange: string;
40
- range: string;
41
- polygon: string;
42
- };
43
- export declare const DEFAULT_FILTER_STRUCTURE: {
44
- dataId: never[];
45
- freeze: boolean;
46
- id: null;
47
- enabled: boolean;
48
- fixedDomain: boolean;
49
- view: "side";
50
- isAnimating: boolean;
51
- animationWindow: "free";
52
- speed: number;
53
- name: never[];
54
- type: null;
55
- fieldIdx: never[];
56
- domain: null;
57
- value: null;
58
- plotType: "histogram";
59
- yAxis: null;
60
- interval: null;
61
- gpu: boolean;
62
- };
63
- export declare const FILTER_ID_LENGTH = 4;
64
- export declare const LAYER_FILTERS: "polygon"[];
65
- /**
66
- * Generates a filter with a dataset id as dataId
67
- */
68
- export declare function getDefaultFilter({ dataId, id }?: {
69
- dataId?: string | null | string[];
70
- id?: string;
71
- }): FilterBase<LineChart>;
72
- /**
73
- * Check if a filter is valid based on the given dataId
74
- * @param filter to validate
75
- * @param datasetId id to validate filter against
76
- * @return true if a filter is valid, false otherwise
77
- */
78
- export declare function shouldApplyFilter(filter: Filter, datasetId: string): boolean;
79
- interface KeplerTableModel<K, L> {
80
- id: string;
81
- getColumnFieldIdx(columnName: string): number;
82
- filterTable(filters: Filter[], layers: L[], opt?: FilterDatasetOpt): K;
83
- getColumnFilterProps(columnName: string): Field['filterProps'] | null | undefined;
84
- dataContainer: DataContainerInterface;
85
- filterTableCPU(filters: Filter[], layers: L[]): K;
86
- }
87
- /**
88
- * Validates and modifies polygon filter structure
89
- * @param dataset
90
- * @param filter
91
- * @param layers
92
- * @return - {filter, dataset}
93
- */
94
- export declare function validatePolygonFilter<K extends KeplerTableModel<K, L>, L extends {
95
- id: string;
96
- }>(dataset: K, filter: PolygonFilter, layers: L[]): {
97
- filter: PolygonFilter | null;
98
- dataset: K;
99
- };
100
- /**
101
- * Default validate filter function
102
- * @param dataset
103
- * @param filter
104
- * @return - {filter, dataset}
105
- */
106
- export declare function validateFilter<K extends KeplerTableModel<K, L>, L>(dataset: K, filter: ParsedFilter): {
107
- filter: Filter | null;
108
- dataset: K;
109
- };
110
- /**
111
- * Validate saved filter config with new data,
112
- * calculate domain and fieldIdx based new fields and data
113
- *
114
- * @param dataset
115
- * @param filter - filter to be validate
116
- * @param layers - layers
117
- * @return validated filter
118
- */
119
- export declare function validateFilterWithData<K extends KeplerTableModel<K, L>, L>(dataset: K, filter: ParsedFilter, layers: L[]): {
120
- filter: Filter;
121
- dataset: K;
122
- };
123
- /**
124
- * Get default filter prop based on field type
125
- *
126
- * @param field
127
- * @param fieldDomain
128
- * @returns default filter
129
- */
130
- export declare function getFilterProps(field: Field, fieldDomain: FieldDomain): Partial<Filter> & {
131
- fieldType: string;
132
- };
133
- export declare const getPolygonFilterFunctor: (layer: any, filter: any, dataContainer: any) => (data: any) => any;
134
- /**
135
- * @param param An object that represents a row record.
136
- * @param param.index Index of the row in data container.
137
- * @returns Returns true to keep the element, or false otherwise.
138
- */
139
- declare type filterFunction = (data: {
140
- index: number;
141
- }) => boolean;
142
- /**
143
- * @param field dataset Field
144
- * @param dataId Dataset id
145
- * @param filter Filter object
146
- * @param layers list of layers to filter upon
147
- * @param dataContainer Data container
148
- * @return filterFunction
149
- */
150
- export declare function getFilterFunction<L extends {
151
- config: {
152
- dataId: string | null;
153
- };
154
- id: string;
155
- }>(field: Field | null, dataId: string, filter: Filter, layers: L[], dataContainer: DataContainerInterface): filterFunction;
156
- export declare function updateFilterDataId(dataId: string | string[]): FilterBase<LineChart>;
157
- export declare function filterDataByFilterTypes({ dynamicDomainFilters, cpuFilters, filterFuncs }: {
158
- dynamicDomainFilters: Filter[] | null;
159
- cpuFilters: Filter[] | null;
160
- filterFuncs: {
161
- [key: string]: filterFunction;
162
- };
163
- }, dataContainer: DataContainerInterface): FilterResult;
164
- /**
165
- * Get a record of filters based on domain type and gpu / cpu
166
- */
167
- export declare function getFilterRecord(dataId: string, filters: Filter[], opt?: FilterDatasetOpt): FilterRecord;
168
- /**
169
- * Compare filter records to get what has changed
170
- */
171
- export declare function diffFilters(filterRecord: FilterRecord, oldFilterRecord?: FilterRecord | {}): FilterChanged;
172
- /**
173
- * Call by parsing filters from URL
174
- * Check if value of filter within filter domain, if not adjust it to match
175
- * filter domain
176
- *
177
- * @returns value - adjusted value to match filter or null to remove filter
178
- */
179
- export declare function adjustValueToFilterDomain(value: Filter['value'], { domain, type }: {
180
- domain: any;
181
- type: any;
182
- }): any;
183
- /**
184
- * Calculate numeric domain and suitable step
185
- */
186
- export declare function getNumericFieldDomain(dataContainer: DataContainerInterface, valueAccessor: dataValueAccessor): RangeFieldDomain;
187
- /**
188
- * Calculate step size for range and timerange filter
189
- */
190
- export declare function getNumericStepSize(diff: number): number;
191
- /**
192
- * Calculate timestamp domain and suitable step
193
- */
194
- export declare function getTimestampFieldDomain(dataContainer: DataContainerInterface, valueAccessor: dataValueAccessor): TimeRangeFieldDomain;
195
- export declare function histogramConstruct(domain: [number, number], mappedValue: (Millisecond | number)[], bins: number): HistogramBin[];
196
- /**
197
- * Calculate histogram from domain and array of values
198
- */
199
- export declare function getHistogram(domain: [number, number], mappedValue: (Millisecond | number)[]): {
200
- histogram: HistogramBin[];
201
- enlargedHistogram: HistogramBin[];
202
- };
203
- /**
204
- * round number based on step
205
- *
206
- * @param {Number} val
207
- * @param {Number} step
208
- * @param {string} bound
209
- * @returns {Number} rounded number
210
- */
211
- export declare function formatNumberByStep(val: number, step: number, bound: 'floor' | 'ceil'): number;
212
- export declare function isInRange(val: any, domain: number[]): boolean;
213
- /**
214
- * Determines whether a point is within the provided polygon
215
- *
216
- * @param point as input search [lat, lng]
217
- * @param polygon Points must be within these (Multi)Polygon(s)
218
- * @return {boolean}
219
- */
220
- export declare function isInPolygon(point: number[], polygon: any): boolean;
221
- export declare function getTimeWidgetTitleFormatter(domain: [number, number]): string | null;
222
- /**
223
- * Sanity check on filters to prepare for save
224
- * @type {typeof import('./filter-utils').isFilterValidToSave}
225
- */
226
- export declare function isFilterValidToSave(filter: any): boolean;
227
- /**
228
- * Sanity check on filters to prepare for save
229
- * @type {typeof import('./filter-utils').isValidFilterValue}
230
- */
231
- export declare function isValidFilterValue(type: string | null, value: any): boolean;
232
- export declare function getColumnFilterProps<K extends KeplerTableModel<K, L>, L>(filter: Filter, dataset: K): {
233
- lineChart: LineChart;
234
- yAxs: Field;
235
- } | {};
236
- export declare function getDefaultFilterPlotType(filter: Filter): string | null;
237
- /**
238
- *
239
- * @param datasetIds list of dataset ids to be filtered
240
- * @param datasets all datasets
241
- * @param filters all filters to be applied to datasets
242
- * @return datasets - new updated datasets
243
- */
244
- export declare function applyFiltersToDatasets<K extends KeplerTableModel<K, L>, L extends {
245
- config: {
246
- dataId: string | null;
247
- };
248
- }>(datasetIds: string[], datasets: {
249
- [id: string]: K;
250
- }, filters: Filter[], layers?: L[]): {
251
- [id: string]: K;
252
- };
253
- /**
254
- * Applies a new field name value to fielter and update both filter and dataset
255
- * @param filter - to be applied the new field name on
256
- * @param dataset - dataset the field belongs to
257
- * @param fieldName - field.name
258
- * @param filterDatasetIndex - field.name
259
- * @param option
260
- * @return - {filter, datasets}
261
- */
262
- export declare function applyFilterFieldName<K extends KeplerTableModel<K, L>, L>(filter: Filter, dataset: K, fieldName: string, filterDatasetIndex?: number, option?: {
263
- mergeDomain: boolean;
264
- }): {
265
- filter: Filter | null;
266
- dataset: K;
267
- };
268
- /**
269
- * Merge one filter with other filter prop domain
270
- */
271
- export declare function mergeFilterDomainStep(filter: Filter, filterProps?: Partial<Filter>): (Filter & {
272
- step?: number;
273
- }) | null;
274
- /**
275
- * Generates polygon filter
276
- */
277
- export declare const featureToFilterValue: (feature: Feature, filterId: string, properties?: {} | undefined) => FeatureValue;
278
- export declare const getFilterIdInFeature: (f: FeatureValue) => string;
279
- /**
280
- * Generates polygon filter
281
- */
282
- export declare function generatePolygonFilter<L extends {
283
- config: {
284
- dataId: string | null;
285
- label: string;
286
- };
287
- id: string;
288
- }>(layers: L[], feature: Feature): PolygonFilter;
289
- /**
290
- * Run filter entirely on CPU
291
- */
292
- interface StateType<K extends KeplerTableModel<K, L>, L> {
293
- layers: L[];
294
- filters: Filter[];
295
- datasets: {
296
- [id: string]: K;
297
- };
298
- }
299
- export declare function filterDatasetCPU<T extends StateType<K, L>, K extends KeplerTableModel<K, L>, L>(state: T, dataId: string): T;
300
- /**
301
- * Validate parsed filters with datasets and add filterProps to field
302
- */
303
- declare type MinVisStateForFilter = Pick<VisState, 'layers' | 'datasets' | 'isMergingDatasets'>;
304
- export declare function validateFiltersUpdateDatasets<S extends MinVisStateForFilter, K extends KeplerTableModel<K, L>, L extends {
305
- config: {
306
- dataId: string | null;
307
- label: string;
308
- };
309
- id: string;
310
- }>(state: S, filtersToValidate?: ParsedFilter[]): {
311
- validated: Filter[];
312
- failed: Filter[];
313
- updatedDatasets: S['datasets'];
314
- };
315
- export declare function getFilterPlot<K extends KeplerTableModel<K, L>, L>(filter: Filter, dataset: K): {
316
- lineChart: LineChart;
317
- yAxs: Field;
318
- } | {};
319
- /**
320
- * Retrieve interval bins for time filter
321
- */
322
- export declare function getIntervalBins(filter: TimeRangeFilter): any;
323
- export declare function isValidTimeDomain(domain: any): boolean;
324
- export declare function getTimeWidgetHintFormatter(domain: [number, number]): string | undefined;
325
- export declare function isSideFilter(filter: Filter): boolean;
326
- export {};