From 809a6b3edbec21aff1c6d0487e824ff957e0137f Mon Sep 17 00:00:00 2001 From: sulemanof Date: Tue, 1 Dec 2020 18:47:59 +0300 Subject: [PATCH 01/31] Convert to typescript --- ....test.js.snap => tile_map_fn.test.ts.snap} | 0 .../tile_map/public/components/index.tsx | 25 +++++++++++++++++ .../public/components/tile_map_options.tsx | 4 ++- src/plugins/tile_map/public/plugin.ts | 14 ++++------ ...tilemap_fn.test.js => tile_map_fn.test.ts} | 1 - .../public/{tile_map_fn.js => tile_map_fn.ts} | 27 ++++++++++++++++--- .../{tile_map_type.js => tile_map_type.ts} | 18 ++++++++----- 7 files changed, 69 insertions(+), 20 deletions(-) rename src/plugins/tile_map/public/__snapshots__/{tilemap_fn.test.js.snap => tile_map_fn.test.ts.snap} (100%) create mode 100644 src/plugins/tile_map/public/components/index.tsx rename src/plugins/tile_map/public/{tilemap_fn.test.js => tile_map_fn.test.ts} (98%) rename src/plugins/tile_map/public/{tile_map_fn.js => tile_map_fn.ts} (75%) rename src/plugins/tile_map/public/{tile_map_type.js => tile_map_type.ts} (91%) diff --git a/src/plugins/tile_map/public/__snapshots__/tilemap_fn.test.js.snap b/src/plugins/tile_map/public/__snapshots__/tile_map_fn.test.ts.snap similarity index 100% rename from src/plugins/tile_map/public/__snapshots__/tilemap_fn.test.js.snap rename to src/plugins/tile_map/public/__snapshots__/tile_map_fn.test.ts.snap diff --git a/src/plugins/tile_map/public/components/index.tsx b/src/plugins/tile_map/public/components/index.tsx new file mode 100644 index 0000000000000..4a4f887046fe2 --- /dev/null +++ b/src/plugins/tile_map/public/components/index.tsx @@ -0,0 +1,25 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { lazy } from 'react'; +import type { TileMapOptionsProps } from './tile_map_options'; + +const TileMapOptions = lazy(() => import('./tile_map_options')); + +export const TileMapOptionsLazy = (props: TileMapOptionsProps) => ; diff --git a/src/plugins/tile_map/public/components/tile_map_options.tsx b/src/plugins/tile_map/public/components/tile_map_options.tsx index 1a7b11ccf6e20..c645493aa3595 100644 --- a/src/plugins/tile_map/public/components/tile_map_options.tsx +++ b/src/plugins/tile_map/public/components/tile_map_options.tsx @@ -97,4 +97,6 @@ function TileMapOptions(props: TileMapOptionsProps) { ); } -export { TileMapOptions }; +// default export required for React.Lazy +// eslint-disable-next-line import/no-default-export +export { TileMapOptions as default }; diff --git a/src/plugins/tile_map/public/plugin.ts b/src/plugins/tile_map/public/plugin.ts index dfcafafbe47f7..69d1ea7957d7d 100644 --- a/src/plugins/tile_map/public/plugin.ts +++ b/src/plugins/tile_map/public/plugin.ts @@ -25,13 +25,6 @@ import { } from 'kibana/public'; import { Plugin as ExpressionsPublicPlugin } from '../../expressions/public'; import { VisualizationsSetup } from '../../visualizations/public'; -// TODO: Determine why visualizations don't populate without this -import 'angular-sanitize'; - -// @ts-ignore -import { createTileMapFn } from './tile_map_fn'; -// @ts-ignore -import { createTileMapTypeDefinition } from './tile_map_type'; import { IServiceSettings, MapsLegacyPluginSetup } from '../../maps_legacy/public'; import { DataPublicPluginStart } from '../../data/public'; import { @@ -44,12 +37,15 @@ import { import { KibanaLegacyStart } from '../../kibana_legacy/public'; import { SharePluginStart } from '../../share/public'; +import { createTileMapFn } from './tile_map_fn'; +import { createTileMapTypeDefinition } from './tile_map_type'; + export interface TileMapConfigType { tilemap: any; } /** @private */ -interface TileMapVisualizationDependencies { +export interface TileMapVisualizationDependencies { uiSettings: IUiSettingsClient; getZoomPrecision: any; getPrecision: any; @@ -98,7 +94,7 @@ export class TileMapPlugin implements Plugin createTileMapFn(visualizationDependencies)); + expressions.registerFunction(createTileMapFn); visualizations.createBaseVisualization(createTileMapTypeDefinition(visualizationDependencies)); diff --git a/src/plugins/tile_map/public/tilemap_fn.test.js b/src/plugins/tile_map/public/tile_map_fn.test.ts similarity index 98% rename from src/plugins/tile_map/public/tilemap_fn.test.js rename to src/plugins/tile_map/public/tile_map_fn.test.ts index df9fc10a7303c..5bfd49ba94608 100644 --- a/src/plugins/tile_map/public/tilemap_fn.test.js +++ b/src/plugins/tile_map/public/tile_map_fn.test.ts @@ -17,7 +17,6 @@ * under the License. */ -// eslint-disable-next-line import { functionWrapper } from '../../expressions/common/expression_functions/specs/tests/utils'; import { createTileMapFn } from './tile_map_fn'; diff --git a/src/plugins/tile_map/public/tile_map_fn.js b/src/plugins/tile_map/public/tile_map_fn.ts similarity index 75% rename from src/plugins/tile_map/public/tile_map_fn.js rename to src/plugins/tile_map/public/tile_map_fn.ts index 3253598d98d94..14678d1cbdb8e 100644 --- a/src/plugins/tile_map/public/tile_map_fn.js +++ b/src/plugins/tile_map/public/tile_map_fn.ts @@ -16,10 +16,30 @@ * specific language governing permissions and limitations * under the License. */ -import { convertToGeoJson } from '../../maps_legacy/public'; + import { i18n } from '@kbn/i18n'; +import { convertToGeoJson } from '../../maps_legacy/public'; +import { ExpressionFunctionDefinition, Datatable, Render } from '../../expressions/public'; + +interface Arguments { + visConfig: string | null; +} + +export interface TileMapVisRenderValue { + visData: any; + visType: 'tile_map'; + visConfig: any; + params: any; +} + +export type TileMapExpressionFunctionDefinition = ExpressionFunctionDefinition< + 'tilemap', + Datatable, + Arguments, + Render +>; -export const createTileMapFn = () => ({ +export const createTileMapFn = (): TileMapExpressionFunctionDefinition => ({ name: 'tilemap', type: 'render', context: { @@ -32,10 +52,11 @@ export const createTileMapFn = () => ({ visConfig: { types: ['string', 'null'], default: '"{}"', + help: '', }, }, fn(context, args) { - const visConfig = JSON.parse(args.visConfig); + const visConfig = args.visConfig && JSON.parse(args.visConfig); const { geohash, metric, geocentroid } = visConfig.dimensions; const convertedData = convertToGeoJson(context, { geohash, diff --git a/src/plugins/tile_map/public/tile_map_type.js b/src/plugins/tile_map/public/tile_map_type.ts similarity index 91% rename from src/plugins/tile_map/public/tile_map_type.js rename to src/plugins/tile_map/public/tile_map_type.ts index c5e3f0d578e30..3c78fabb99202 100644 --- a/src/plugins/tile_map/public/tile_map_type.js +++ b/src/plugins/tile_map/public/tile_map_type.ts @@ -17,17 +17,23 @@ * under the License. */ -import React from 'react'; import { i18n } from '@kbn/i18n'; -import { convertToGeoJson, MapTypes } from '../../maps_legacy/public'; +import { BaseVisTypeOptions } from 'src/plugins/visualizations/public'; +import { convertToGeoJson, MapTypes, TileMapVisParams } from '../../maps_legacy/public'; import { Schemas } from '../../vis_default_editor/public'; +import { truncatedColorSchemas } from '../../charts/public'; + +// @ts-expect-error import { createTileMapVisualization } from './tile_map_visualization'; -import { TileMapOptions } from './components/tile_map_options'; +// @ts-expect-error import { supportsCssFilters } from './css_filters'; -import { truncatedColorSchemas } from '../../charts/public'; +import { TileMapOptionsLazy } from './components'; import { getDeprecationMessage } from './get_deprecation_message'; +import { TileMapVisualizationDependencies } from './plugin'; -export function createTileMapTypeDefinition(dependencies) { +export function createTileMapTypeDefinition( + dependencies: TileMapVisualizationDependencies +): BaseVisTypeOptions { const CoordinateMapsVisualization = createTileMapVisualization(dependencies); const { uiSettings, getServiceSettings } = dependencies; @@ -114,7 +120,7 @@ export function createTileMapTypeDefinition(dependencies) { ], tmsLayers: [], }, - optionsTemplate: (props) => , + optionsTemplate: TileMapOptionsLazy, schemas: new Schemas([ { group: 'metrics', From 130cfc83191ff423d9a1c95172062f744999000a Mon Sep 17 00:00:00 2001 From: sulemanof Date: Wed, 2 Dec 2020 12:11:34 +0300 Subject: [PATCH 02/31] Move related files directly into plugin --- src/plugins/maps_legacy/public/index.ts | 8 +-- .../public/map/decode_geo_hash.test.ts | 9 +-- .../maps_legacy/public/map/decode_geo_hash.ts | 52 -------------- .../tile_map/public/tile_map_fn.test.ts | 4 +- src/plugins/tile_map/public/tile_map_fn.ts | 7 +- src/plugins/tile_map/public/tile_map_type.ts | 3 +- .../public/utils/convert_to_geojson.ts} | 15 ++-- .../public/utils/decode_geo_hash.test.ts | 27 +++++++ .../tile_map/public/utils/decode_geo_hash.ts | 71 +++++++++++++++++++ .../public/utils/grid_dimensions.ts} | 4 +- src/plugins/tile_map/public/utils/index.ts | 20 ++++++ 11 files changed, 138 insertions(+), 82 deletions(-) rename src/plugins/{maps_legacy/public/map/convert_to_geojson.js => tile_map/public/utils/convert_to_geojson.ts} (93%) create mode 100644 src/plugins/tile_map/public/utils/decode_geo_hash.test.ts create mode 100644 src/plugins/tile_map/public/utils/decode_geo_hash.ts rename src/plugins/{maps_legacy/public/map/grid_dimensions.js => tile_map/public/utils/grid_dimensions.ts} (92%) create mode 100644 src/plugins/tile_map/public/utils/index.ts diff --git a/src/plugins/maps_legacy/public/index.ts b/src/plugins/maps_legacy/public/index.ts index 2654ded907cce..a086ccb5cb502 100644 --- a/src/plugins/maps_legacy/public/index.ts +++ b/src/plugins/maps_legacy/public/index.ts @@ -17,17 +17,13 @@ * under the License. */ -// @ts-ignore import { PluginInitializerContext } from 'kibana/public'; import { MapsLegacyPlugin } from './plugin'; // @ts-ignore import * as colorUtil from './map/color_util'; // @ts-ignore import { KibanaMapLayer } from './map/kibana_map_layer'; -// @ts-ignore -import { convertToGeoJson } from './map/convert_to_geojson'; -// @ts-ignore -import { getPrecision, geoContains } from './map/decode_geo_hash'; +import { geoContains } from './map/decode_geo_hash'; import { VectorLayer, FileLayerField, @@ -46,10 +42,8 @@ export function plugin(initializerContext: PluginInitializerContext) { /** @public */ export { - getPrecision, geoContains, colorUtil, - convertToGeoJson, IServiceSettings, KibanaMapLayer, VectorLayer, diff --git a/src/plugins/maps_legacy/public/map/decode_geo_hash.test.ts b/src/plugins/maps_legacy/public/map/decode_geo_hash.test.ts index c1ca7e4c80383..dcd8c93bd0553 100644 --- a/src/plugins/maps_legacy/public/map/decode_geo_hash.test.ts +++ b/src/plugins/maps_legacy/public/map/decode_geo_hash.test.ts @@ -17,7 +17,7 @@ * under the License. */ -import { geohashColumns, decodeGeoHash } from './decode_geo_hash'; +import { geohashColumns } from './decode_geo_hash'; test('geohashColumns', () => { expect(geohashColumns(1)).toBe(8); @@ -25,10 +25,3 @@ test('geohashColumns', () => { expect(geohashColumns(3)).toBe(8 * 4 * 8); expect(geohashColumns(4)).toBe(8 * 4 * 8 * 4); }); - -test('decodeGeoHash', () => { - expect(decodeGeoHash('drm3btev3e86')).toEqual({ - latitude: [41.119999922811985, 41.12000009045005, 41.12000000663102], - longitude: [-71.34000029414892, -71.3399999588728, -71.34000012651086], - }); -}); diff --git a/src/plugins/maps_legacy/public/map/decode_geo_hash.ts b/src/plugins/maps_legacy/public/map/decode_geo_hash.ts index 65184a8244777..89d9f5a262083 100644 --- a/src/plugins/maps_legacy/public/map/decode_geo_hash.ts +++ b/src/plugins/maps_legacy/public/map/decode_geo_hash.ts @@ -17,58 +17,6 @@ * under the License. */ -interface DecodedGeoHash { - latitude: number[]; - longitude: number[]; -} - -/** - * Decodes geohash to object containing - * top-left and bottom-right corners of - * rectangle and center point. - */ -export function decodeGeoHash(geohash: string): DecodedGeoHash { - const BITS: number[] = [16, 8, 4, 2, 1]; - const BASE32: string = '0123456789bcdefghjkmnpqrstuvwxyz'; - let isEven: boolean = true; - const lat: number[] = []; - const lon: number[] = []; - lat[0] = -90.0; - lat[1] = 90.0; - lon[0] = -180.0; - lon[1] = 180.0; - let latErr: number = 90.0; - let lonErr: number = 180.0; - [...geohash].forEach((nextChar: string) => { - const cd: number = BASE32.indexOf(nextChar); - for (let j = 0; j < 5; j++) { - const mask: number = BITS[j]; - if (isEven) { - lonErr = lonErr /= 2; - refineInterval(lon, cd, mask); - } else { - latErr = latErr /= 2; - refineInterval(lat, cd, mask); - } - isEven = !isEven; - } - }); - lat[2] = (lat[0] + lat[1]) / 2; - lon[2] = (lon[0] + lon[1]) / 2; - return { - latitude: lat, - longitude: lon, - } as DecodedGeoHash; -} - -function refineInterval(interval: number[], cd: number, mask: number) { - if (cd & mask) { /* eslint-disable-line */ - interval[0] = (interval[0] + interval[1]) / 2; - } else { - interval[1] = (interval[0] + interval[1]) / 2; - } -} - export function geohashColumns(precision: number): number { return geohashCells(precision, 0); } diff --git a/src/plugins/tile_map/public/tile_map_fn.test.ts b/src/plugins/tile_map/public/tile_map_fn.test.ts index 5bfd49ba94608..0eda99ab61f20 100644 --- a/src/plugins/tile_map/public/tile_map_fn.test.ts +++ b/src/plugins/tile_map/public/tile_map_fn.test.ts @@ -20,7 +20,7 @@ import { functionWrapper } from '../../expressions/common/expression_functions/specs/tests/utils'; import { createTileMapFn } from './tile_map_fn'; -jest.mock('../../maps_legacy/public', () => ({ +jest.mock('./utils', () => ({ convertToGeoJson: jest.fn().mockReturnValue({ featureCollection: { type: 'FeatureCollection', @@ -35,7 +35,7 @@ jest.mock('../../maps_legacy/public', () => ({ }), })); -import { convertToGeoJson } from '../../maps_legacy/public'; +import { convertToGeoJson } from './utils'; describe('interpreter/functions#tilemap', () => { const fn = functionWrapper(createTileMapFn()); diff --git a/src/plugins/tile_map/public/tile_map_fn.ts b/src/plugins/tile_map/public/tile_map_fn.ts index 14678d1cbdb8e..4b26d623d6ff3 100644 --- a/src/plugins/tile_map/public/tile_map_fn.ts +++ b/src/plugins/tile_map/public/tile_map_fn.ts @@ -18,8 +18,9 @@ */ import { i18n } from '@kbn/i18n'; -import { convertToGeoJson } from '../../maps_legacy/public'; -import { ExpressionFunctionDefinition, Datatable, Render } from '../../expressions/public'; +import type { TileMapVisParams } from '../../maps_legacy/public'; +import type { ExpressionFunctionDefinition, Datatable, Render } from '../../expressions/public'; +import { convertToGeoJson } from './utils'; interface Arguments { visConfig: string | null; @@ -28,7 +29,7 @@ interface Arguments { export interface TileMapVisRenderValue { visData: any; visType: 'tile_map'; - visConfig: any; + visConfig: TileMapVisParams; params: any; } diff --git a/src/plugins/tile_map/public/tile_map_type.ts b/src/plugins/tile_map/public/tile_map_type.ts index 3c78fabb99202..7361ae3dc31f3 100644 --- a/src/plugins/tile_map/public/tile_map_type.ts +++ b/src/plugins/tile_map/public/tile_map_type.ts @@ -19,7 +19,7 @@ import { i18n } from '@kbn/i18n'; import { BaseVisTypeOptions } from 'src/plugins/visualizations/public'; -import { convertToGeoJson, MapTypes, TileMapVisParams } from '../../maps_legacy/public'; +import { MapTypes, TileMapVisParams } from '../../maps_legacy/public'; import { Schemas } from '../../vis_default_editor/public'; import { truncatedColorSchemas } from '../../charts/public'; @@ -30,6 +30,7 @@ import { supportsCssFilters } from './css_filters'; import { TileMapOptionsLazy } from './components'; import { getDeprecationMessage } from './get_deprecation_message'; import { TileMapVisualizationDependencies } from './plugin'; +import { convertToGeoJson } from './utils'; export function createTileMapTypeDefinition( dependencies: TileMapVisualizationDependencies diff --git a/src/plugins/maps_legacy/public/map/convert_to_geojson.js b/src/plugins/tile_map/public/utils/convert_to_geojson.ts similarity index 93% rename from src/plugins/maps_legacy/public/map/convert_to_geojson.js rename to src/plugins/tile_map/public/utils/convert_to_geojson.ts index bca21e4deea97..dc3efa11faa2e 100644 --- a/src/plugins/maps_legacy/public/map/convert_to_geojson.js +++ b/src/plugins/tile_map/public/utils/convert_to_geojson.ts @@ -17,10 +17,11 @@ * under the License. */ +import type { Datatable } from '../../../expressions/public'; import { decodeGeoHash } from './decode_geo_hash'; import { gridDimensions } from './grid_dimensions'; -export function convertToGeoJson(tabifiedResponse, { geohash, geocentroid, metric }) { +export function convertToGeoJson(tabifiedResponse: Datatable, { geohash, geocentroid, metric }) { let features; let min = Infinity; let max = -Infinity; @@ -86,9 +87,9 @@ export function convertToGeoJson(tabifiedResponse, { geohash, geocentroid, metri geohash: geohashValue, geohash_meta: { center: centerLatLng, - rectangle: rectangle, + rectangle, }, - value: value, + value, }, }; }) @@ -100,14 +101,14 @@ export function convertToGeoJson(tabifiedResponse, { geohash, geocentroid, metri const featureCollection = { type: 'FeatureCollection', - features: features, + features, }; return { - featureCollection: featureCollection, + featureCollection, meta: { - min: min, - max: max, + min, + max, geohashPrecision: geohash && geohash.params.precision, geohashGridDimensionsAtEquator: geohash && gridDimensions(geohash.params.precision), }, diff --git a/src/plugins/tile_map/public/utils/decode_geo_hash.test.ts b/src/plugins/tile_map/public/utils/decode_geo_hash.test.ts new file mode 100644 index 0000000000000..5114314f2c0af --- /dev/null +++ b/src/plugins/tile_map/public/utils/decode_geo_hash.test.ts @@ -0,0 +1,27 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { decodeGeoHash } from './decode_geo_hash'; + +test('decodeGeoHash', () => { + expect(decodeGeoHash('drm3btev3e86')).toEqual({ + latitude: [41.119999922811985, 41.12000009045005, 41.12000000663102], + longitude: [-71.34000029414892, -71.3399999588728, -71.34000012651086], + }); +}); diff --git a/src/plugins/tile_map/public/utils/decode_geo_hash.ts b/src/plugins/tile_map/public/utils/decode_geo_hash.ts new file mode 100644 index 0000000000000..12756219ba72b --- /dev/null +++ b/src/plugins/tile_map/public/utils/decode_geo_hash.ts @@ -0,0 +1,71 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +interface DecodedGeoHash { + latitude: number[]; + longitude: number[]; +} + +/** + * Decodes geohash to object containing + * top-left and bottom-right corners of + * rectangle and center point. + */ +export function decodeGeoHash(geohash: string): DecodedGeoHash { + const BITS: number[] = [16, 8, 4, 2, 1]; + const BASE32: string = '0123456789bcdefghjkmnpqrstuvwxyz'; + let isEven: boolean = true; + const lat: number[] = []; + const lon: number[] = []; + lat[0] = -90.0; + lat[1] = 90.0; + lon[0] = -180.0; + lon[1] = 180.0; + let latErr: number = 90.0; + let lonErr: number = 180.0; + [...geohash].forEach((nextChar: string) => { + const cd: number = BASE32.indexOf(nextChar); + for (let j = 0; j < 5; j++) { + const mask: number = BITS[j]; + if (isEven) { + lonErr = lonErr /= 2; + refineInterval(lon, cd, mask); + } else { + latErr = latErr /= 2; + refineInterval(lat, cd, mask); + } + isEven = !isEven; + } + }); + lat[2] = (lat[0] + lat[1]) / 2; + lon[2] = (lon[0] + lon[1]) / 2; + + return { + latitude: lat, + longitude: lon, + }; +} + +function refineInterval(interval: number[], cd: number, mask: number) { + if (cd & mask) { /* eslint-disable-line */ + interval[0] = (interval[0] + interval[1]) / 2; + } else { + interval[1] = (interval[0] + interval[1]) / 2; + } +} diff --git a/src/plugins/maps_legacy/public/map/grid_dimensions.js b/src/plugins/tile_map/public/utils/grid_dimensions.ts similarity index 92% rename from src/plugins/maps_legacy/public/map/grid_dimensions.js rename to src/plugins/tile_map/public/utils/grid_dimensions.ts index 0f84e972104ba..113909930598e 100644 --- a/src/plugins/maps_legacy/public/map/grid_dimensions.js +++ b/src/plugins/tile_map/public/utils/grid_dimensions.ts @@ -19,7 +19,7 @@ // geohash precision mapping of geohash grid cell dimensions (width x height, in meters) at equator. // https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-geohashgrid-aggregation.html#_cell_dimensions_at_the_equator -const gridAtEquator = { +const gridAtEquator: { [key: number]: [number, number] } = { 1: [5009400, 4992600], 2: [1252300, 624100], 3: [156500, 156000], @@ -34,6 +34,6 @@ const gridAtEquator = { 12: [0.037, 0.019], }; -export function gridDimensions(precision) { +export function gridDimensions(precision: number) { return gridAtEquator[precision]; } diff --git a/src/plugins/tile_map/public/utils/index.ts b/src/plugins/tile_map/public/utils/index.ts new file mode 100644 index 0000000000000..153862ccbd162 --- /dev/null +++ b/src/plugins/tile_map/public/utils/index.ts @@ -0,0 +1,20 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export { convertToGeoJson } from './convert_to_geojson'; From a4ffd02de81f8a73e2c25d186c610ef9bcdcbaa8 Mon Sep 17 00:00:00 2001 From: sulemanof Date: Wed, 2 Dec 2020 15:54:35 +0300 Subject: [PATCH 03/31] Implement toExpressionAst --- src/plugins/tile_map/public/tile_map_fn.ts | 11 ++-- src/plugins/tile_map/public/tile_map_type.ts | 4 +- src/plugins/tile_map/public/to_ast.ts | 54 ++++++++++++++++ src/plugins/tile_map/public/types.ts | 62 +++++++++++++++++++ .../public/utils/convert_to_geojson.ts | 38 +++++++----- 5 files changed, 146 insertions(+), 23 deletions(-) create mode 100644 src/plugins/tile_map/public/to_ast.ts create mode 100644 src/plugins/tile_map/public/types.ts diff --git a/src/plugins/tile_map/public/tile_map_fn.ts b/src/plugins/tile_map/public/tile_map_fn.ts index 4b26d623d6ff3..663b9c3e2afd4 100644 --- a/src/plugins/tile_map/public/tile_map_fn.ts +++ b/src/plugins/tile_map/public/tile_map_fn.ts @@ -18,8 +18,9 @@ */ import { i18n } from '@kbn/i18n'; -import type { TileMapVisParams } from '../../maps_legacy/public'; + import type { ExpressionFunctionDefinition, Datatable, Render } from '../../expressions/public'; +import { TileMapVisConfig, TileMapVisData } from './types'; import { convertToGeoJson } from './utils'; interface Arguments { @@ -27,9 +28,9 @@ interface Arguments { } export interface TileMapVisRenderValue { - visData: any; + visData: TileMapVisData; visType: 'tile_map'; - visConfig: TileMapVisParams; + visConfig: TileMapVisConfig; params: any; } @@ -65,10 +66,6 @@ export const createTileMapFn = (): TileMapExpressionFunctionDefinition => ({ geocentroid, }); - if (geohash && geohash.accessor) { - convertedData.meta.geohash = context.columns[geohash.accessor].meta; - } - return { type: 'render', as: 'visualization', diff --git a/src/plugins/tile_map/public/tile_map_type.ts b/src/plugins/tile_map/public/tile_map_type.ts index 7361ae3dc31f3..e3077ab82e2ff 100644 --- a/src/plugins/tile_map/public/tile_map_type.ts +++ b/src/plugins/tile_map/public/tile_map_type.ts @@ -30,7 +30,7 @@ import { supportsCssFilters } from './css_filters'; import { TileMapOptionsLazy } from './components'; import { getDeprecationMessage } from './get_deprecation_message'; import { TileMapVisualizationDependencies } from './plugin'; -import { convertToGeoJson } from './utils'; +import { toExpressionAst } from './to_ast'; export function createTileMapTypeDefinition( dependencies: TileMapVisualizationDependencies @@ -63,7 +63,7 @@ export function createTileMapTypeDefinition( }, }, visualization: CoordinateMapsVisualization, - responseHandler: convertToGeoJson, + toExpressionAst, editorConfig: { collections: { colorSchemas: truncatedColorSchemas, diff --git a/src/plugins/tile_map/public/to_ast.ts b/src/plugins/tile_map/public/to_ast.ts new file mode 100644 index 0000000000000..f8008b990a7ff --- /dev/null +++ b/src/plugins/tile_map/public/to_ast.ts @@ -0,0 +1,54 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { TileMapVisParams } from '../../maps_legacy/public'; +import { EsaggsExpressionFunctionDefinition } from '../../data/common/search/expressions'; +import { buildExpression, buildExpressionFunction } from '../../expressions/public'; +import { getVisSchemas, Vis, BuildPipelineParams } from '../../visualizations/public'; +import { TileMapExpressionFunctionDefinition } from './tile_map_fn'; +import { TileMapVisConfig } from './types'; + +export const toExpressionAst = (vis: Vis, params: BuildPipelineParams) => { + const esaggs = buildExpressionFunction('esaggs', { + index: vis.data.indexPattern!.id!, + metricsAtAllLevels: false, + partialRows: false, + aggConfigs: JSON.stringify(vis.data.aggs!.aggs), + includeFormatHints: false, + }); + + const schemas = getVisSchemas(vis, params); + + const visConfig: TileMapVisConfig = { + ...vis.params, + dimensions: { + metric: schemas.metric[0], + geohash: schemas.segment ? schemas.segment[0] : null, + geocentroid: schemas.geo_centroid ? schemas.geo_centroid[0] : null, + }, + }; + + const tilemap = buildExpressionFunction('tilemap', { + visConfig: JSON.stringify(visConfig), + }); + + const ast = buildExpression([esaggs, tilemap]); + + return ast.toAst(); +}; diff --git a/src/plugins/tile_map/public/types.ts b/src/plugins/tile_map/public/types.ts new file mode 100644 index 0000000000000..55e3e3aa7a4a5 --- /dev/null +++ b/src/plugins/tile_map/public/types.ts @@ -0,0 +1,62 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import type { SchemaConfig } from 'src/plugins/visualizations/public'; +import type { DatatableColumnMeta } from 'src/plugins/expressions'; +import type { TileMapVisParams } from 'src/plugins/maps_legacy/public'; + +export interface Feature { + type: 'Feature'; + geometry: { + type: 'Point'; + coordinates: [number, number]; + }; + properties: { + geohash: any; + geohash_meta: { + center: [number, number]; + rectangle: Array<[number, number]>; + }; + value: number; + }; +} + +export interface TileMapVisData { + featureCollection: { + type: 'FeatureCollection'; + features: Feature[]; + }; + meta: { + min: number; + max: number; + geohash?: DatatableColumnMeta; + geohashPrecision: number | undefined; + geohashGridDimensionsAtEquator: [number, number] | undefined; + }; +} + +export interface TileMapVisDimensions { + metric: SchemaConfig; + geohash: SchemaConfig | null; + geocentroid: SchemaConfig | null; +} + +export interface TileMapVisConfig extends TileMapVisParams { + dimensions: TileMapVisDimensions; +} diff --git a/src/plugins/tile_map/public/utils/convert_to_geojson.ts b/src/plugins/tile_map/public/utils/convert_to_geojson.ts index dc3efa11faa2e..e6c60e5309914 100644 --- a/src/plugins/tile_map/public/utils/convert_to_geojson.ts +++ b/src/plugins/tile_map/public/utils/convert_to_geojson.ts @@ -18,11 +18,15 @@ */ import type { Datatable } from '../../../expressions/public'; +import type { Feature, TileMapVisDimensions, TileMapVisData } from '../types'; import { decodeGeoHash } from './decode_geo_hash'; import { gridDimensions } from './grid_dimensions'; -export function convertToGeoJson(tabifiedResponse: Datatable, { geohash, geocentroid, metric }) { - let features; +export function convertToGeoJson( + tabifiedResponse: Datatable, + { geohash, geocentroid, metric }: TileMapVisDimensions +): TileMapVisData { + let features: Feature[]; let min = Infinity; let max = -Infinity; @@ -59,7 +63,7 @@ export function convertToGeoJson(tabifiedResponse: Datatable, { geohash, geocent const centerLatLng = [geohashLocation.latitude[2], geohashLocation.longitude[2]]; - if (geohash.params.useGeocentroid) { + if (geohash?.params.useGeocentroid) { // see https://github.com/elastic/elasticsearch/issues/24694 for why clampGrid is used pointCoordinates[0] = clampGrid( pointCoordinates[0], @@ -93,29 +97,35 @@ export function convertToGeoJson(tabifiedResponse: Datatable, { geohash, geocent }, }; }) - .filter((row) => row); + .filter((row): row is Feature => !!row); } } else { features = []; } - const featureCollection = { - type: 'FeatureCollection', - features, - }; - - return { - featureCollection, + const convertedData: TileMapVisData = { + featureCollection: { + type: 'FeatureCollection', + features, + }, meta: { min, max, - geohashPrecision: geohash && geohash.params.precision, - geohashGridDimensionsAtEquator: geohash && gridDimensions(geohash.params.precision), + geohashPrecision: geohash?.params.precision, + geohashGridDimensionsAtEquator: geohash?.params.precision + ? gridDimensions(geohash.params.precision) + : undefined, }, }; + + if (geohash && geohash.accessor) { + convertedData.meta.geohash = tabifiedResponse.columns[geohash.accessor].meta; + } + + return convertedData; } -function clampGrid(val, min, max) { +function clampGrid(val: number, min: number, max: number) { if (val > max) val = max; else if (val < min) val = min; return val; From 3d058dd7c9d92406d9b26ba28588a78f192cc7b5 Mon Sep 17 00:00:00 2001 From: sulemanof Date: Wed, 2 Dec 2020 16:00:44 +0300 Subject: [PATCH 04/31] Remove build_pipeline dedicated fn --- .../public/legacy/build_pipeline.test.ts | 11 ----------- .../public/legacy/build_pipeline.ts | 16 ---------------- 2 files changed, 27 deletions(-) diff --git a/src/plugins/visualizations/public/legacy/build_pipeline.test.ts b/src/plugins/visualizations/public/legacy/build_pipeline.test.ts index 653542bd8837d..86d5d02f364e9 100644 --- a/src/plugins/visualizations/public/legacy/build_pipeline.test.ts +++ b/src/plugins/visualizations/public/legacy/build_pipeline.test.ts @@ -117,17 +117,6 @@ describe('visualize loader pipeline helpers: build pipeline', () => { expect(actual).toMatchSnapshot(); }); }); - - it('handles tile_map function', () => { - const params = { metric: {} }; - const schemas = { - ...schemasDef, - segment: [1, 2], - geo_centroid: [3, 4], - }; - const actual = buildPipelineVisFunction.tile_map(params, schemas, uiState); - expect(actual).toMatchSnapshot(); - }); }); describe('buildPipeline', () => { diff --git a/src/plugins/visualizations/public/legacy/build_pipeline.ts b/src/plugins/visualizations/public/legacy/build_pipeline.ts index 0c244876ca6a3..8aa0085ce4e01 100644 --- a/src/plugins/visualizations/public/legacy/build_pipeline.ts +++ b/src/plugins/visualizations/public/legacy/build_pipeline.ts @@ -229,13 +229,6 @@ export const buildPipelineVisFunction: BuildPipelineVisFunction = { }; return `regionmap ${prepareJson('visConfig', visConfig)}`; }, - tile_map: (params, schemas) => { - const visConfig = { - ...params, - ...buildVisConfig.tile_map(schemas), - }; - return `tilemap ${prepareJson('visConfig', visConfig)}`; - }, }; const buildVisConfig: BuildVisConfigFunction = { @@ -247,15 +240,6 @@ const buildVisConfig: BuildVisConfigFunction = { } return visConfig; }, - tile_map: (schemas) => { - const visConfig = {} as any; - visConfig.dimensions = { - metric: schemas.metric[0], - geohash: schemas.segment ? schemas.segment[0] : null, - geocentroid: schemas.geo_centroid ? schemas.geo_centroid[0] : null, - }; - return visConfig; - }, }; export const buildPipeline = async (vis: Vis, params: BuildPipelineParams) => { From c1ef9c8f20cf4754b43c174bfee368f74e29e559 Mon Sep 17 00:00:00 2001 From: sulemanof Date: Wed, 2 Dec 2020 16:06:58 +0300 Subject: [PATCH 05/31] Async import converter --- src/plugins/tile_map/public/tile_map_fn.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/plugins/tile_map/public/tile_map_fn.ts b/src/plugins/tile_map/public/tile_map_fn.ts index 663b9c3e2afd4..c0999e3120dd5 100644 --- a/src/plugins/tile_map/public/tile_map_fn.ts +++ b/src/plugins/tile_map/public/tile_map_fn.ts @@ -21,7 +21,6 @@ import { i18n } from '@kbn/i18n'; import type { ExpressionFunctionDefinition, Datatable, Render } from '../../expressions/public'; import { TileMapVisConfig, TileMapVisData } from './types'; -import { convertToGeoJson } from './utils'; interface Arguments { visConfig: string | null; @@ -38,7 +37,7 @@ export type TileMapExpressionFunctionDefinition = ExpressionFunctionDefinition< 'tilemap', Datatable, Arguments, - Render + Promise> >; export const createTileMapFn = (): TileMapExpressionFunctionDefinition => ({ @@ -57,9 +56,11 @@ export const createTileMapFn = (): TileMapExpressionFunctionDefinition => ({ help: '', }, }, - fn(context, args) { + async fn(context, args) { const visConfig = args.visConfig && JSON.parse(args.visConfig); const { geohash, metric, geocentroid } = visConfig.dimensions; + + const { convertToGeoJson } = await import('./utils'); const convertedData = convertToGeoJson(context, { geohash, metric, From 42a2c64983aab77d4758c16ee3eb16ddde88307a Mon Sep 17 00:00:00 2001 From: sulemanof Date: Wed, 2 Dec 2020 17:31:46 +0300 Subject: [PATCH 06/31] Create a custom renderer --- .../maps_legacy/public/map/decode_geo_hash.ts | 29 ---------- .../__snapshots__/tile_map_fn.test.ts.snap | 1 - src/plugins/tile_map/public/plugin.ts | 2 + src/plugins/tile_map/public/tile_map_fn.ts | 6 +- .../tile_map/public/tile_map_renderer.tsx | 57 +++++++++++++++++++ src/plugins/tile_map/public/tile_map_type.ts | 2 - .../tile_map/public/tile_map_visualization.js | 12 ++-- src/plugins/tile_map/public/types.ts | 2 +- src/plugins/visualizations/public/index.ts | 1 + 9 files changed, 67 insertions(+), 45 deletions(-) create mode 100644 src/plugins/tile_map/public/tile_map_renderer.tsx diff --git a/src/plugins/maps_legacy/public/map/decode_geo_hash.ts b/src/plugins/maps_legacy/public/map/decode_geo_hash.ts index 89d9f5a262083..db592306dc705 100644 --- a/src/plugins/maps_legacy/public/map/decode_geo_hash.ts +++ b/src/plugins/maps_legacy/public/map/decode_geo_hash.ts @@ -36,32 +36,3 @@ function geohashCells(precision: number, axis: number) { } return cells; } - -interface GeoBoundingBoxCoordinate { - lat: number; - lon: number; -} - -interface GeoBoundingBox { - top_left: GeoBoundingBoxCoordinate; - bottom_right: GeoBoundingBoxCoordinate; -} - -export function geoContains(collar?: GeoBoundingBox, bounds?: GeoBoundingBox) { - if (!bounds || !collar) return false; - // test if bounds top_left is outside collar - if (bounds.top_left.lat > collar.top_left.lat || bounds.top_left.lon < collar.top_left.lon) { - return false; - } - - // test if bounds bottom_right is outside collar - if ( - bounds.bottom_right.lat < collar.bottom_right.lat || - bounds.bottom_right.lon > collar.bottom_right.lon - ) { - return false; - } - - // both corners are inside collar so collar contains bounds - return true; -} diff --git a/src/plugins/tile_map/public/__snapshots__/tile_map_fn.test.ts.snap b/src/plugins/tile_map/public/__snapshots__/tile_map_fn.test.ts.snap index d5f5127bae919..c75c32f83bb65 100644 --- a/src/plugins/tile_map/public/__snapshots__/tile_map_fn.test.ts.snap +++ b/src/plugins/tile_map/public/__snapshots__/tile_map_fn.test.ts.snap @@ -52,7 +52,6 @@ Object { "min": null, }, }, - "visType": "tile_map", }, } `; diff --git a/src/plugins/tile_map/public/plugin.ts b/src/plugins/tile_map/public/plugin.ts index 69d1ea7957d7d..0a877d9595ec9 100644 --- a/src/plugins/tile_map/public/plugin.ts +++ b/src/plugins/tile_map/public/plugin.ts @@ -39,6 +39,7 @@ import { SharePluginStart } from '../../share/public'; import { createTileMapFn } from './tile_map_fn'; import { createTileMapTypeDefinition } from './tile_map_type'; +import { getTileMapRenderer } from './tile_map_renderer'; export interface TileMapConfigType { tilemap: any; @@ -95,6 +96,7 @@ export class TileMapPlugin implements Plugin ({ return { type: 'render', - as: 'visualization', + as: 'tile_map_vis', value: { visData: convertedData, visType: 'tile_map', visConfig, - params: { - listenOnChange: true, - }, }, }; }, diff --git a/src/plugins/tile_map/public/tile_map_renderer.tsx b/src/plugins/tile_map/public/tile_map_renderer.tsx new file mode 100644 index 0000000000000..f2182c0e3bab1 --- /dev/null +++ b/src/plugins/tile_map/public/tile_map_renderer.tsx @@ -0,0 +1,57 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ExpressionRenderDefinition } from 'src/plugins/expressions'; +import { ExprVisClass, VisualizationController } from '../../visualizations/public'; +import { TileMapVisualizationDependencies } from './plugin'; +import { TileMapVisRenderValue } from './tile_map_fn'; + +const tableVisRegistry = new Map(); + +export const getTileMapRenderer: ( + deps: TileMapVisualizationDependencies +) => ExpressionRenderDefinition = (deps) => ({ + name: 'tile_map_vis', + reuseDomNode: true, + render: async (domNode, config, handlers) => { + let registeredController = tableVisRegistry.get(domNode); + + const vis = new ExprVisClass({ + type: config.visType, + params: config.visConfig, + }); + + if (!registeredController) { + // @ts-expect-error + const { createTileMapVisualization } = await import('./tile_map_visualization'); + + const Controller = createTileMapVisualization(deps); + registeredController = new Controller(domNode, vis, handlers) as VisualizationController; + tableVisRegistry.set(domNode, registeredController); + + handlers.onDestroy(() => { + registeredController?.destroy(); + tableVisRegistry.delete(domNode); + }); + } + + await registeredController.render(config.visData, config.visConfig); + handlers.done(); + }, +}); diff --git a/src/plugins/tile_map/public/tile_map_type.ts b/src/plugins/tile_map/public/tile_map_type.ts index e3077ab82e2ff..ab86c525cf2e5 100644 --- a/src/plugins/tile_map/public/tile_map_type.ts +++ b/src/plugins/tile_map/public/tile_map_type.ts @@ -35,7 +35,6 @@ import { toExpressionAst } from './to_ast'; export function createTileMapTypeDefinition( dependencies: TileMapVisualizationDependencies ): BaseVisTypeOptions { - const CoordinateMapsVisualization = createTileMapVisualization(dependencies); const { uiSettings, getServiceSettings } = dependencies; return { @@ -62,7 +61,6 @@ export function createTileMapTypeDefinition( wms: uiSettings.get('visualization:tileMap:WMSdefaults'), }, }, - visualization: CoordinateMapsVisualization, toExpressionAst, editorConfig: { collections: { diff --git a/src/plugins/tile_map/public/tile_map_visualization.js b/src/plugins/tile_map/public/tile_map_visualization.js index 80084be283658..791cc4f9b53cc 100644 --- a/src/plugins/tile_map/public/tile_map_visualization.js +++ b/src/plugins/tile_map/public/tile_map_visualization.js @@ -19,12 +19,9 @@ import { get, round } from 'lodash'; import { getFormatService, getQueryService, getKibanaLegacy } from './services'; -import { - geoContains, - mapTooltipProvider, - lazyLoadMapsLegacyModules, -} from '../../maps_legacy/public'; +import { mapTooltipProvider, lazyLoadMapsLegacyModules } from '../../maps_legacy/public'; import { tooltipFormatter } from './tooltip_formatter'; +import { geoContains } from './utils'; function scaleBounds(bounds) { const scale = 0.5; // scale bounds by 50% @@ -57,9 +54,10 @@ export const createTileMapVisualization = (dependencies) => { const { getZoomPrecision, getPrecision, BaseMapsVisualization } = dependencies; return class CoordinateMapsVisualization extends BaseMapsVisualization { - constructor(element, vis) { + constructor(element, vis, handlers) { super(element, vis); + this.handlers = handlers; this._geohashLayer = null; this._tooltipFormatter = mapTooltipProvider(element, tooltipFormatter); } @@ -87,7 +85,7 @@ export const createTileMapVisualization = (dependencies) => { ? zoomPrecision[this.vis.getUiState().get('mapZoom')] : getPrecision(geohashAgg.sourceParams.params.precision); - this.vis.eventsSubject.next(updateVarsObject); + this.handlers.event(updateVarsObject); }; async render(esResponse, visParams) { diff --git a/src/plugins/tile_map/public/types.ts b/src/plugins/tile_map/public/types.ts index 55e3e3aa7a4a5..01d87ffa00c83 100644 --- a/src/plugins/tile_map/public/types.ts +++ b/src/plugins/tile_map/public/types.ts @@ -28,7 +28,7 @@ export interface Feature { coordinates: [number, number]; }; properties: { - geohash: any; + geohash: string; geohash_meta: { center: [number, number]; rectangle: Array<[number, number]>; diff --git a/src/plugins/visualizations/public/index.ts b/src/plugins/visualizations/public/index.ts index d66a6f6113cad..50eec9cdb1add 100644 --- a/src/plugins/visualizations/public/index.ts +++ b/src/plugins/visualizations/public/index.ts @@ -43,6 +43,7 @@ export type VisualizeEmbeddableFactoryContract = PublicContract; export { VisualizeInput } from './embeddable'; export type ExprVis = ExprVisClass; +export { ExprVisClass }; export { SchemaConfig, BuildPipelineParams } from './legacy/build_pipeline'; // @ts-ignore export { updateOldState } from './legacy/vis_update_state'; From 54c2315f412a5e5e6d2cf639f56444778a60d7eb Mon Sep 17 00:00:00 2001 From: sulemanof Date: Wed, 2 Dec 2020 17:32:36 +0300 Subject: [PATCH 07/31] Move function directly into plugin --- src/plugins/maps_legacy/public/index.ts | 2 -- .../tile_map/public/utils/decode_geo_hash.ts | 29 +++++++++++++++++++ src/plugins/tile_map/public/utils/index.ts | 1 + 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/plugins/maps_legacy/public/index.ts b/src/plugins/maps_legacy/public/index.ts index a086ccb5cb502..84edce6dbf8e9 100644 --- a/src/plugins/maps_legacy/public/index.ts +++ b/src/plugins/maps_legacy/public/index.ts @@ -23,7 +23,6 @@ import { MapsLegacyPlugin } from './plugin'; import * as colorUtil from './map/color_util'; // @ts-ignore import { KibanaMapLayer } from './map/kibana_map_layer'; -import { geoContains } from './map/decode_geo_hash'; import { VectorLayer, FileLayerField, @@ -42,7 +41,6 @@ export function plugin(initializerContext: PluginInitializerContext) { /** @public */ export { - geoContains, colorUtil, IServiceSettings, KibanaMapLayer, diff --git a/src/plugins/tile_map/public/utils/decode_geo_hash.ts b/src/plugins/tile_map/public/utils/decode_geo_hash.ts index 12756219ba72b..3ee8ab69e996f 100644 --- a/src/plugins/tile_map/public/utils/decode_geo_hash.ts +++ b/src/plugins/tile_map/public/utils/decode_geo_hash.ts @@ -69,3 +69,32 @@ function refineInterval(interval: number[], cd: number, mask: number) { interval[1] = (interval[0] + interval[1]) / 2; } } + +interface GeoBoundingBoxCoordinate { + lat: number; + lon: number; +} + +interface GeoBoundingBox { + top_left: GeoBoundingBoxCoordinate; + bottom_right: GeoBoundingBoxCoordinate; +} + +export function geoContains(collar?: GeoBoundingBox, bounds?: GeoBoundingBox) { + if (!bounds || !collar) return false; + // test if bounds top_left is outside collar + if (bounds.top_left.lat > collar.top_left.lat || bounds.top_left.lon < collar.top_left.lon) { + return false; + } + + // test if bounds bottom_right is outside collar + if ( + bounds.bottom_right.lat < collar.bottom_right.lat || + bounds.bottom_right.lon > collar.bottom_right.lon + ) { + return false; + } + + // both corners are inside collar so collar contains bounds + return true; +} diff --git a/src/plugins/tile_map/public/utils/index.ts b/src/plugins/tile_map/public/utils/index.ts index 153862ccbd162..1c3dd02f48425 100644 --- a/src/plugins/tile_map/public/utils/index.ts +++ b/src/plugins/tile_map/public/utils/index.ts @@ -18,3 +18,4 @@ */ export { convertToGeoJson } from './convert_to_geojson'; +export { geoContains } from './decode_geo_hash'; From 6d69c4252d37069a04177a2a2e4908a014943c10 Mon Sep 17 00:00:00 2001 From: sulemanof Date: Wed, 2 Dec 2020 17:34:37 +0300 Subject: [PATCH 08/31] Update tests --- .../public/__snapshots__/tile_map_fn.test.ts.snap | 6 ++---- src/plugins/tile_map/public/tile_map_fn.test.ts | 8 ++++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/plugins/tile_map/public/__snapshots__/tile_map_fn.test.ts.snap b/src/plugins/tile_map/public/__snapshots__/tile_map_fn.test.ts.snap index c75c32f83bb65..7aab8b02890c0 100644 --- a/src/plugins/tile_map/public/__snapshots__/tile_map_fn.test.ts.snap +++ b/src/plugins/tile_map/public/__snapshots__/tile_map_fn.test.ts.snap @@ -2,12 +2,9 @@ exports[`interpreter/functions#tilemap returns an object with the correct structure 1`] = ` Object { - "as": "visualization", + "as": "tile_map_vis", "type": "render", "value": Object { - "params": Object { - "listenOnChange": true, - }, "visConfig": Object { "addTooltip": true, "colorSchema": "Yellow to Red", @@ -52,6 +49,7 @@ Object { "min": null, }, }, + "visType": "tile_map", }, } `; diff --git a/src/plugins/tile_map/public/tile_map_fn.test.ts b/src/plugins/tile_map/public/tile_map_fn.test.ts index 0eda99ab61f20..dde98b7fe84c0 100644 --- a/src/plugins/tile_map/public/tile_map_fn.test.ts +++ b/src/plugins/tile_map/public/tile_map_fn.test.ts @@ -78,14 +78,14 @@ describe('interpreter/functions#tilemap', () => { jest.clearAllMocks(); }); - it('returns an object with the correct structure', () => { - const actual = fn(context, { visConfig: JSON.stringify(visConfig) }); + it('returns an object with the correct structure', async () => { + const actual = await fn(context, { visConfig: JSON.stringify(visConfig) }); expect(actual).toMatchSnapshot(); }); - it('calls response handler with correct values', () => { + it('calls response handler with correct values', async () => { const { geohash, metric, geocentroid } = visConfig.dimensions; - fn(context, { visConfig: JSON.stringify(visConfig) }); + await fn(context, { visConfig: JSON.stringify(visConfig) }); expect(convertToGeoJson).toHaveBeenCalledTimes(1); expect(convertToGeoJson).toHaveBeenCalledWith(context, { geohash, From 2a45b91629d3456ab5bedff3f60729d78628a3b2 Mon Sep 17 00:00:00 2001 From: sulemanof Date: Thu, 3 Dec 2020 11:22:53 +0300 Subject: [PATCH 09/31] Move files directly into related plugins --- .../common/{types/index.ts => types.ts} | 22 ++++++--- .../common/types/external_basemap_types.ts | 47 ------------------- .../components/wms_internal_options.tsx | 2 +- .../public/components/wms_options.tsx | 9 ++-- .../public/components/region_map_options.tsx | 3 +- .../public}/region_map_types.ts | 3 +- .../public/components/tile_map_options.tsx | 4 +- src/plugins/tile_map/public/geohash_layer.js | 3 +- src/plugins/tile_map/public/tile_map_type.ts | 5 +- src/plugins/tile_map/public/types.ts | 15 +++++- .../public/utils}/map_types.ts | 0 11 files changed, 44 insertions(+), 69 deletions(-) rename src/plugins/maps_legacy/public/common/{types/index.ts => types.ts} (73%) delete mode 100644 src/plugins/maps_legacy/public/common/types/external_basemap_types.ts rename src/plugins/{maps_legacy/public/common/types => region_map/public}/region_map_types.ts (91%) rename src/plugins/{maps_legacy/public/common/types => tile_map/public/utils}/map_types.ts (100%) diff --git a/src/plugins/maps_legacy/public/common/types/index.ts b/src/plugins/maps_legacy/public/common/types.ts similarity index 73% rename from src/plugins/maps_legacy/public/common/types/index.ts rename to src/plugins/maps_legacy/public/common/types.ts index e6cabdde82cd9..802bed9f4b905 100644 --- a/src/plugins/maps_legacy/public/common/types/index.ts +++ b/src/plugins/maps_legacy/public/common/types.ts @@ -17,10 +17,18 @@ * under the License. */ -/** - * Use * syntax so that these exports do not break when internal - * types are stripped. - */ -export * from './external_basemap_types'; -export * from './map_types'; -export * from './region_map_types'; +import { TmsLayer } from '..'; + +export interface WMSOptions { + selectedTmsLayer?: TmsLayer; + enabled: boolean; + url?: string; + options: { + version?: string; + layers?: string; + format: string; + transparent: boolean; + attribution?: string; + styles?: string; + }; +} diff --git a/src/plugins/maps_legacy/public/common/types/external_basemap_types.ts b/src/plugins/maps_legacy/public/common/types/external_basemap_types.ts deleted file mode 100644 index be9c4d0d9c37b..0000000000000 --- a/src/plugins/maps_legacy/public/common/types/external_basemap_types.ts +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { TmsLayer } from '../../index'; -import { MapTypes } from './map_types'; - -export interface WMSOptions { - selectedTmsLayer?: TmsLayer; - enabled: boolean; - url?: string; - options: { - version?: string; - layers?: string; - format: string; - transparent: boolean; - attribution?: string; - styles?: string; - }; -} - -export interface TileMapVisParams { - colorSchema: string; - mapType: MapTypes; - isDesaturated: boolean; - addTooltip: boolean; - heatClusterSize: number; - legendPosition: 'bottomright' | 'bottomleft' | 'topright' | 'topleft'; - mapZoom: number; - mapCenter: [number, number]; - wms: WMSOptions; -} diff --git a/src/plugins/maps_legacy/public/components/wms_internal_options.tsx b/src/plugins/maps_legacy/public/components/wms_internal_options.tsx index d1def8153d1a8..657bb94b15024 100644 --- a/src/plugins/maps_legacy/public/components/wms_internal_options.tsx +++ b/src/plugins/maps_legacy/public/components/wms_internal_options.tsx @@ -22,7 +22,7 @@ import { EuiLink, EuiSpacer, EuiText, EuiScreenReaderOnly } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { TextInputOption } from '../../../charts/public'; -import { WMSOptions } from '../common/types/external_basemap_types'; +import { WMSOptions } from '../common/types'; interface WmsInternalOptions { wms: WMSOptions; diff --git a/src/plugins/maps_legacy/public/components/wms_options.tsx b/src/plugins/maps_legacy/public/components/wms_options.tsx index 4892463bb9f85..7fabbe83609d0 100644 --- a/src/plugins/maps_legacy/public/components/wms_options.tsx +++ b/src/plugins/maps_legacy/public/components/wms_options.tsx @@ -23,20 +23,19 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { TmsLayer } from '../index'; import { Vis } from '../../../visualizations/public'; -import { RegionMapVisParams } from '../common/types/region_map_types'; import { SelectOption, SwitchOption } from '../../../charts/public'; import { WmsInternalOptions } from './wms_internal_options'; -import { WMSOptions, TileMapVisParams } from '../common/types/external_basemap_types'; +import { WMSOptions } from '../common/types'; -interface Props { - stateParams: TileMapVisParams | RegionMapVisParams; +interface Props { + stateParams: K; setValue: (title: 'wms', options: WMSOptions) => void; vis: Vis; } const mapLayerForOption = ({ id }: TmsLayer) => ({ text: id, value: id }); -function WmsOptions({ stateParams, setValue, vis }: Props) { +function WmsOptions({ stateParams, setValue, vis }: Props) { const { wms } = stateParams; const { tmsLayers } = vis.type.editorConfig.collections; const tmsLayerOptions = useMemo(() => tmsLayers.map(mapLayerForOption), [tmsLayers]); diff --git a/src/plugins/region_map/public/components/region_map_options.tsx b/src/plugins/region_map/public/components/region_map_options.tsx index 4d564d7347a1e..fe33435c286d8 100644 --- a/src/plugins/region_map/public/components/region_map_options.tsx +++ b/src/plugins/region_map/public/components/region_map_options.tsx @@ -24,7 +24,8 @@ import { FormattedMessage } from '@kbn/i18n/react'; import { VisOptionsProps } from 'src/plugins/vis_default_editor/public'; import { FileLayerField, VectorLayer, IServiceSettings } from '../../../maps_legacy/public'; import { NumberInputOption, SelectOption, SwitchOption } from '../../../charts/public'; -import { RegionMapVisParams, WmsOptions } from '../../../maps_legacy/public'; +import { WmsOptions } from '../../../maps_legacy/public'; +import { RegionMapVisParams } from '../region_map_types'; const mapLayerForOption = ({ layerId, name }: VectorLayer) => ({ text: name, diff --git a/src/plugins/maps_legacy/public/common/types/region_map_types.ts b/src/plugins/region_map/public/region_map_types.ts similarity index 91% rename from src/plugins/maps_legacy/public/common/types/region_map_types.ts rename to src/plugins/region_map/public/region_map_types.ts index 0da597068f11e..b43b095a7c31d 100644 --- a/src/plugins/maps_legacy/public/common/types/region_map_types.ts +++ b/src/plugins/region_map/public/region_map_types.ts @@ -17,8 +17,7 @@ * under the License. */ -import { VectorLayer, FileLayerField } from '../../index'; -import { WMSOptions } from './external_basemap_types'; +import { VectorLayer, FileLayerField, WMSOptions } from '../../maps_legacy/public/index'; export interface RegionMapVisParams { readonly addTooltip: true; diff --git a/src/plugins/tile_map/public/components/tile_map_options.tsx b/src/plugins/tile_map/public/components/tile_map_options.tsx index c645493aa3595..075b364267001 100644 --- a/src/plugins/tile_map/public/components/tile_map_options.tsx +++ b/src/plugins/tile_map/public/components/tile_map_options.tsx @@ -23,7 +23,9 @@ import { i18n } from '@kbn/i18n'; import { VisOptionsProps } from 'src/plugins/vis_default_editor/public'; import { BasicOptions, RangeOption, SelectOption, SwitchOption } from '../../../charts/public'; -import { WmsOptions, TileMapVisParams, MapTypes } from '../../../maps_legacy/public'; +import { WmsOptions } from '../../../maps_legacy/public'; +import { TileMapVisParams } from '../types'; +import { MapTypes } from '../utils/map_types'; export type TileMapOptionsProps = VisOptionsProps; diff --git a/src/plugins/tile_map/public/geohash_layer.js b/src/plugins/tile_map/public/geohash_layer.js index ca992a0d09ec9..83c86149de531 100644 --- a/src/plugins/tile_map/public/geohash_layer.js +++ b/src/plugins/tile_map/public/geohash_layer.js @@ -19,11 +19,12 @@ import { min, isEqual } from 'lodash'; import { i18n } from '@kbn/i18n'; -import { KibanaMapLayer, MapTypes } from '../../maps_legacy/public'; +import { KibanaMapLayer } from '../../maps_legacy/public'; import { HeatmapMarkers } from './markers/heatmap'; import { ScaledCirclesMarkers } from './markers/scaled_circles'; import { ShadedCirclesMarkers } from './markers/shaded_circles'; import { GeohashGridMarkers } from './markers/geohash_grid'; +import { MapTypes } from './utils/map_types'; export class GeohashLayer extends KibanaMapLayer { constructor(featureCollection, featureCollectionMetaData, options, zoom, kibanaMap, leaflet) { diff --git a/src/plugins/tile_map/public/tile_map_type.ts b/src/plugins/tile_map/public/tile_map_type.ts index ab86c525cf2e5..af0fe77aa53b6 100644 --- a/src/plugins/tile_map/public/tile_map_type.ts +++ b/src/plugins/tile_map/public/tile_map_type.ts @@ -19,18 +19,17 @@ import { i18n } from '@kbn/i18n'; import { BaseVisTypeOptions } from 'src/plugins/visualizations/public'; -import { MapTypes, TileMapVisParams } from '../../maps_legacy/public'; import { Schemas } from '../../vis_default_editor/public'; import { truncatedColorSchemas } from '../../charts/public'; -// @ts-expect-error -import { createTileMapVisualization } from './tile_map_visualization'; // @ts-expect-error import { supportsCssFilters } from './css_filters'; import { TileMapOptionsLazy } from './components'; import { getDeprecationMessage } from './get_deprecation_message'; import { TileMapVisualizationDependencies } from './plugin'; import { toExpressionAst } from './to_ast'; +import { TileMapVisParams } from './types'; +import { MapTypes } from './utils/map_types'; export function createTileMapTypeDefinition( dependencies: TileMapVisualizationDependencies diff --git a/src/plugins/tile_map/public/types.ts b/src/plugins/tile_map/public/types.ts index 01d87ffa00c83..95459cf86908b 100644 --- a/src/plugins/tile_map/public/types.ts +++ b/src/plugins/tile_map/public/types.ts @@ -19,7 +19,8 @@ import type { SchemaConfig } from 'src/plugins/visualizations/public'; import type { DatatableColumnMeta } from 'src/plugins/expressions'; -import type { TileMapVisParams } from 'src/plugins/maps_legacy/public'; +import type { WMSOptions } from 'src/plugins/maps_legacy/public'; +import type { MapTypes } from './utils/map_types'; export interface Feature { type: 'Feature'; @@ -57,6 +58,18 @@ export interface TileMapVisDimensions { geocentroid: SchemaConfig | null; } +export interface TileMapVisParams { + colorSchema: string; + mapType: MapTypes; + isDesaturated: boolean; + addTooltip: boolean; + heatClusterSize: number; + legendPosition: 'bottomright' | 'bottomleft' | 'topright' | 'topleft'; + mapZoom: number; + mapCenter: [number, number]; + wms: WMSOptions; +} + export interface TileMapVisConfig extends TileMapVisParams { dimensions: TileMapVisDimensions; } diff --git a/src/plugins/maps_legacy/public/common/types/map_types.ts b/src/plugins/tile_map/public/utils/map_types.ts similarity index 100% rename from src/plugins/maps_legacy/public/common/types/map_types.ts rename to src/plugins/tile_map/public/utils/map_types.ts From 7a2422c6a48a071529a13da41b93e543ccb701c6 Mon Sep 17 00:00:00 2001 From: sulemanof Date: Thu, 3 Dec 2020 15:49:44 +0300 Subject: [PATCH 10/31] Remove ExprVis instance usage in maps visualizations --- .../public/map/base_maps_visualization.js | 27 +++++++++---------- .../maps_legacy/public/map/kibana_map.js | 22 +++++++-------- .../tile_map/public/tile_map_renderer.tsx | 13 +++++---- .../tile_map/public/tile_map_visualization.js | 14 ++++------ src/plugins/visualizations/public/index.ts | 1 - 5 files changed, 33 insertions(+), 44 deletions(-) diff --git a/src/plugins/maps_legacy/public/map/base_maps_visualization.js b/src/plugins/maps_legacy/public/map/base_maps_visualization.js index 406dae43c9b5e..af41037a9d262 100644 --- a/src/plugins/maps_legacy/public/map/base_maps_visualization.js +++ b/src/plugins/maps_legacy/public/map/base_maps_visualization.js @@ -34,8 +34,9 @@ export function BaseMapsVisualizationProvider() { * @constructor */ return class BaseMapsVisualization { - constructor(element, vis) { - this.vis = vis; + constructor(element, handlers, initialVisParams) { + this.handlers = handlers; + this._params = initialVisParams; this._container = element; this._kibanaMap = null; this._chartData = null; //reference to data currently on the map. @@ -75,7 +76,7 @@ export function BaseMapsVisualizationProvider() { if (this._hasESResponseChanged(esResponse)) { await this._updateData(esResponse); } - this._kibanaMap.useUiStateFromVisualization(this.vis); + this._kibanaMap.useUiStateFromVisualization(this.handlers.uiState); await this._whenBaseLayerIsLoaded(); } @@ -87,11 +88,11 @@ export function BaseMapsVisualizationProvider() { */ async _makeKibanaMap() { const options = {}; - const uiState = this.vis.getUiState(); - const zoomFromUiState = parseInt(uiState.get('mapZoom')); - const centerFromUIState = uiState.get('mapCenter'); - options.zoom = !isNaN(zoomFromUiState) ? zoomFromUiState : this.vis.params.mapZoom; - options.center = centerFromUIState ? centerFromUIState : this.vis.params.mapCenter; + const zoomFromUiState = parseInt(this.handlers.uiState.get('mapZoom')); + const centerFromUIState = this.handlers.uiState.get('mapCenter'); + const { mapZoom, mapCenter } = this._getMapsParams(); + options.zoom = !isNaN(zoomFromUiState) ? zoomFromUiState : mapZoom; + options.center = centerFromUIState ? centerFromUIState : mapCenter; const modules = await lazyLoadMapsLegacyModules(); this._kibanaMap = new modules.KibanaMap(this._container, options); @@ -100,7 +101,7 @@ export function BaseMapsVisualizationProvider() { this._kibanaMap.addLegendControl(); this._kibanaMap.addFitControl(); - this._kibanaMap.persistUiStateForVisualization(this.vis); + this._kibanaMap.persistUiStateForVisualization(this.handlers.uiState); this._kibanaMap.on('baseLayer:loaded', () => { this._baseLayerDirty = false; @@ -223,15 +224,11 @@ export function BaseMapsVisualizationProvider() { await this._updateBaseLayer(); this._kibanaMap.setLegendPosition(mapParams.legendPosition); this._kibanaMap.setShowTooltip(mapParams.addTooltip); - this._kibanaMap.useUiStateFromVisualization(this.vis); + this._kibanaMap.useUiStateFromVisualization(this.handlers.uiState); } _getMapsParams() { - return { - ...this.vis.type.visConfig.defaults, - type: this.vis.type.name, - ...this._params, - }; + return this._params; } _whenBaseLayerIsLoaded() { diff --git a/src/plugins/maps_legacy/public/map/kibana_map.js b/src/plugins/maps_legacy/public/map/kibana_map.js index 3948692e55676..3f8fbf32d7a4d 100644 --- a/src/plugins/maps_legacy/public/map/kibana_map.js +++ b/src/plugins/maps_legacy/public/map/kibana_map.js @@ -672,14 +672,13 @@ export class KibanaMap extends EventEmitter { } } - persistUiStateForVisualization(visualization) { + persistUiStateForVisualization(uiState) { function persistMapStateInUiState() { - const uiState = visualization.getUiState(); const centerFromUIState = uiState.get('mapCenter'); const zoomFromUiState = parseInt(uiState.get('mapZoom')); if (isNaN(zoomFromUiState) || this.getZoomLevel() !== zoomFromUiState) { - visualization.uiStateVal('mapZoom', this.getZoomLevel()); + uiState.set('mapZoom', this.getZoomLevel()); } const centerFromMap = this.getCenter(); if ( @@ -687,22 +686,21 @@ export class KibanaMap extends EventEmitter { centerFromMap.lon !== centerFromUIState[1] || centerFromMap.lat !== centerFromUIState[0] ) { - visualization.uiStateVal('mapCenter', [centerFromMap.lat, centerFromMap.lon]); + uiState.set('mapCenter', [centerFromMap.lat, centerFromMap.lon]); } } - this._leafletMap.on('resize', () => { - visualization.sessionState.mapBounds = this.getBounds(); - }); - this._leafletMap.on('load', () => { - visualization.sessionState.mapBounds = this.getBounds(); - }); + // this._leafletMap.on('resize', () => { + // visualization.sessionState.mapBounds = this.getBounds(); + // }); + // this._leafletMap.on('load', () => { + // visualization.sessionState.mapBounds = this.getBounds(); + // }); this.on('dragend', persistMapStateInUiState); this.on('zoomend', persistMapStateInUiState); } - useUiStateFromVisualization(visualization) { - const uiState = visualization.getUiState(); + useUiStateFromVisualization(uiState) { const zoomFromUiState = parseInt(uiState.get('mapZoom')); const centerFromUIState = uiState.get('mapCenter'); if (!isNaN(zoomFromUiState)) { diff --git a/src/plugins/tile_map/public/tile_map_renderer.tsx b/src/plugins/tile_map/public/tile_map_renderer.tsx index f2182c0e3bab1..5cbcbd943327b 100644 --- a/src/plugins/tile_map/public/tile_map_renderer.tsx +++ b/src/plugins/tile_map/public/tile_map_renderer.tsx @@ -18,7 +18,7 @@ */ import { ExpressionRenderDefinition } from 'src/plugins/expressions'; -import { ExprVisClass, VisualizationController } from '../../visualizations/public'; +import { VisualizationController } from '../../visualizations/public'; import { TileMapVisualizationDependencies } from './plugin'; import { TileMapVisRenderValue } from './tile_map_fn'; @@ -32,17 +32,16 @@ export const getTileMapRenderer: ( render: async (domNode, config, handlers) => { let registeredController = tableVisRegistry.get(domNode); - const vis = new ExprVisClass({ - type: config.visType, - params: config.visConfig, - }); - if (!registeredController) { // @ts-expect-error const { createTileMapVisualization } = await import('./tile_map_visualization'); const Controller = createTileMapVisualization(deps); - registeredController = new Controller(domNode, vis, handlers) as VisualizationController; + registeredController = new Controller( + domNode, + handlers, + config.visConfig + ) as VisualizationController; tableVisRegistry.set(domNode, registeredController); handlers.onDestroy(() => { diff --git a/src/plugins/tile_map/public/tile_map_visualization.js b/src/plugins/tile_map/public/tile_map_visualization.js index 791cc4f9b53cc..2128aec49992f 100644 --- a/src/plugins/tile_map/public/tile_map_visualization.js +++ b/src/plugins/tile_map/public/tile_map_visualization.js @@ -54,10 +54,9 @@ export const createTileMapVisualization = (dependencies) => { const { getZoomPrecision, getPrecision, BaseMapsVisualization } = dependencies; return class CoordinateMapsVisualization extends BaseMapsVisualization { - constructor(element, vis, handlers) { - super(element, vis); + constructor(element, handlers, initialVisParams) { + super(element, handlers, initialVisParams); - this.handlers = handlers; this._geohashLayer = null; this._tooltipFormatter = mapTooltipProvider(element, tooltipFormatter); } @@ -82,7 +81,7 @@ export const createTileMapVisualization = (dependencies) => { // todo: autoPrecision should be vis parameter, not aggConfig one const zoomPrecision = getZoomPrecision(); updateVarsObject.data.precision = geohashAgg.sourceParams.params.autoPrecision - ? zoomPrecision[this.vis.getUiState().get('mapZoom')] + ? zoomPrecision[this.handlers.uiState.get('mapZoom')] : getPrecision(geohashAgg.sourceParams.params.precision); this.handlers.event(updateVarsObject); @@ -94,13 +93,12 @@ export const createTileMapVisualization = (dependencies) => { } async _makeKibanaMap() { - await super._makeKibanaMap(); + await super._makeKibanaMap(this._params); let previousPrecision = this._kibanaMap.getGeohashPrecision(); let precisionChange = false; - const uiState = this.vis.getUiState(); - uiState.on('change', (prop) => { + this.handlers.uiState.on('change', (prop) => { if (prop === 'mapZoom' || prop === 'mapCenter') { this.updateGeohashAgg(); } @@ -248,8 +246,6 @@ export const createTileMapVisualization = (dependencies) => { const { filterManager } = getQueryService(); filterManager.addFilters([filter]); - - this.vis.updateState(); } _getGeoHashAgg() { diff --git a/src/plugins/visualizations/public/index.ts b/src/plugins/visualizations/public/index.ts index 50eec9cdb1add..d66a6f6113cad 100644 --- a/src/plugins/visualizations/public/index.ts +++ b/src/plugins/visualizations/public/index.ts @@ -43,7 +43,6 @@ export type VisualizeEmbeddableFactoryContract = PublicContract; export { VisualizeInput } from './embeddable'; export type ExprVis = ExprVisClass; -export { ExprVisClass }; export { SchemaConfig, BuildPipelineParams } from './legacy/build_pipeline'; // @ts-ignore export { updateOldState } from './legacy/vis_update_state'; From 4327075a135dc013f2421e370f89a5e7e8cd1cd5 Mon Sep 17 00:00:00 2001 From: sulemanof Date: Thu, 3 Dec 2020 16:23:54 +0300 Subject: [PATCH 11/31] Use uiState updates --- .../public/map/base_maps_visualization.js | 1 + .../tile_map/public/tile_map_renderer.tsx | 18 +++++++++++++++--- .../tile_map/public/tile_map_visualization.js | 5 +++++ 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/plugins/maps_legacy/public/map/base_maps_visualization.js b/src/plugins/maps_legacy/public/map/base_maps_visualization.js index af41037a9d262..cced72e8b448a 100644 --- a/src/plugins/maps_legacy/public/map/base_maps_visualization.js +++ b/src/plugins/maps_legacy/public/map/base_maps_visualization.js @@ -71,6 +71,7 @@ export function BaseMapsVisualizationProvider() { await this._mapIsLoaded; this._kibanaMap.resize(); this._params = visParams; + this._esResponse = esResponse; await this._updateParams(); if (this._hasESResponseChanged(esResponse)) { diff --git a/src/plugins/tile_map/public/tile_map_renderer.tsx b/src/plugins/tile_map/public/tile_map_renderer.tsx index 5cbcbd943327b..05e9bc5ea3767 100644 --- a/src/plugins/tile_map/public/tile_map_renderer.tsx +++ b/src/plugins/tile_map/public/tile_map_renderer.tsx @@ -18,11 +18,16 @@ */ import { ExpressionRenderDefinition } from 'src/plugins/expressions'; -import { VisualizationController } from '../../visualizations/public'; import { TileMapVisualizationDependencies } from './plugin'; import { TileMapVisRenderValue } from './tile_map_fn'; +import { TileMapVisConfig, TileMapVisData } from './types'; -const tableVisRegistry = new Map(); +interface TileMapVisController { + render(visData?: TileMapVisData, visConfig?: TileMapVisConfig): Promise; + destroy(): void; +} + +const tableVisRegistry = new Map(); export const getTileMapRenderer: ( deps: TileMapVisualizationDependencies @@ -41,10 +46,17 @@ export const getTileMapRenderer: ( domNode, handlers, config.visConfig - ) as VisualizationController; + ) as TileMapVisController; tableVisRegistry.set(domNode, registeredController); + const onUiStateChange = () => { + registeredController?.render(); + }; + + handlers.uiState?.on('change', onUiStateChange); + handlers.onDestroy(() => { + handlers.uiState?.off('change', onUiStateChange); registeredController?.destroy(); tableVisRegistry.delete(domNode); }); diff --git a/src/plugins/tile_map/public/tile_map_visualization.js b/src/plugins/tile_map/public/tile_map_visualization.js index 2128aec49992f..24d5ccfd5f32b 100644 --- a/src/plugins/tile_map/public/tile_map_visualization.js +++ b/src/plugins/tile_map/public/tile_map_visualization.js @@ -89,6 +89,11 @@ export const createTileMapVisualization = (dependencies) => { async render(esResponse, visParams) { getKibanaLegacy().loadFontAwesome(); + if (!esResponse && !visParams) { + // the case from uiState updates + await super.render(this._esResponse, this._params); + return; + } await super.render(esResponse, visParams); } From a097c4a15cf5672bbdd2e97611261ac33efd0c28 Mon Sep 17 00:00:00 2001 From: sulemanof Date: Thu, 3 Dec 2020 16:27:00 +0300 Subject: [PATCH 12/31] Fix minor issues --- src/plugins/tile_map/public/to_ast.ts | 3 +-- .../public/legacy/__snapshots__/build_pipeline.test.ts.snap | 2 -- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/plugins/tile_map/public/to_ast.ts b/src/plugins/tile_map/public/to_ast.ts index f8008b990a7ff..c4f26f172a393 100644 --- a/src/plugins/tile_map/public/to_ast.ts +++ b/src/plugins/tile_map/public/to_ast.ts @@ -17,12 +17,11 @@ * under the License. */ -import { TileMapVisParams } from '../../maps_legacy/public'; import { EsaggsExpressionFunctionDefinition } from '../../data/common/search/expressions'; import { buildExpression, buildExpressionFunction } from '../../expressions/public'; import { getVisSchemas, Vis, BuildPipelineParams } from '../../visualizations/public'; import { TileMapExpressionFunctionDefinition } from './tile_map_fn'; -import { TileMapVisConfig } from './types'; +import { TileMapVisConfig, TileMapVisParams } from './types'; export const toExpressionAst = (vis: Vis, params: BuildPipelineParams) => { const esaggs = buildExpressionFunction('esaggs', { diff --git a/src/plugins/visualizations/public/legacy/__snapshots__/build_pipeline.test.ts.snap b/src/plugins/visualizations/public/legacy/__snapshots__/build_pipeline.test.ts.snap index 3ff0c83961e2a..fc9cfb3f87496 100644 --- a/src/plugins/visualizations/public/legacy/__snapshots__/build_pipeline.test.ts.snap +++ b/src/plugins/visualizations/public/legacy/__snapshots__/build_pipeline.test.ts.snap @@ -5,5 +5,3 @@ exports[`visualize loader pipeline helpers: build pipeline buildPipeline calls t exports[`visualize loader pipeline helpers: build pipeline buildPipelineVisFunction handles region_map function with buckets 1`] = `"regionmap visConfig='{\\"metric\\":{\\"accessor\\":0,\\"label\\":\\"\\",\\"format\\":{},\\"params\\":{},\\"aggType\\":\\"\\"},\\"bucket\\":1}' "`; exports[`visualize loader pipeline helpers: build pipeline buildPipelineVisFunction handles region_map function without buckets 1`] = `"regionmap visConfig='{\\"metric\\":{\\"accessor\\":0,\\"label\\":\\"\\",\\"format\\":{},\\"params\\":{},\\"aggType\\":\\"\\"}}' "`; - -exports[`visualize loader pipeline helpers: build pipeline buildPipelineVisFunction handles tile_map function 1`] = `"tilemap visConfig='{\\"metric\\":{},\\"dimensions\\":{\\"metric\\":{\\"accessor\\":0,\\"label\\":\\"\\",\\"format\\":{},\\"params\\":{},\\"aggType\\":\\"\\"},\\"geohash\\":1,\\"geocentroid\\":3}}' "`; From e97e6154480f2e0c94a5736fcd9677e77dcf9b89 Mon Sep 17 00:00:00 2001 From: sulemanof Date: Tue, 15 Dec 2020 17:30:11 +0300 Subject: [PATCH 13/31] Update expression builder --- src/plugins/tile_map/public/to_ast.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/plugins/tile_map/public/to_ast.ts b/src/plugins/tile_map/public/to_ast.ts index c4f26f172a393..313ca3218591e 100644 --- a/src/plugins/tile_map/public/to_ast.ts +++ b/src/plugins/tile_map/public/to_ast.ts @@ -17,7 +17,10 @@ * under the License. */ -import { EsaggsExpressionFunctionDefinition } from '../../data/common/search/expressions'; +import { + EsaggsExpressionFunctionDefinition, + IndexPatternLoadExpressionFunctionDefinition, +} from '../../data/public'; import { buildExpression, buildExpressionFunction } from '../../expressions/public'; import { getVisSchemas, Vis, BuildPipelineParams } from '../../visualizations/public'; import { TileMapExpressionFunctionDefinition } from './tile_map_fn'; @@ -25,11 +28,14 @@ import { TileMapVisConfig, TileMapVisParams } from './types'; export const toExpressionAst = (vis: Vis, params: BuildPipelineParams) => { const esaggs = buildExpressionFunction('esaggs', { - index: vis.data.indexPattern!.id!, + index: buildExpression([ + buildExpressionFunction('indexPatternLoad', { + id: vis.data.indexPattern!.id!, + }), + ]), metricsAtAllLevels: false, partialRows: false, - aggConfigs: JSON.stringify(vis.data.aggs!.aggs), - includeFormatHints: false, + aggs: vis.data.aggs!.aggs.map((agg) => buildExpression(agg.toExpressionAst())), }); const schemas = getVisSchemas(vis, params); From 1f8ba9b17c6b42784c38c712f1e1eee5fa1060b4 Mon Sep 17 00:00:00 2001 From: sulemanof Date: Wed, 16 Dec 2020 12:53:26 +0300 Subject: [PATCH 14/31] Update styles --- src/plugins/tile_map/public/_tile_map.scss | 15 --------------- src/plugins/tile_map/public/index.scss | 8 -------- .../tile_map/public/tile_map_visualization.scss | 4 ++++ 3 files changed, 4 insertions(+), 23 deletions(-) delete mode 100644 src/plugins/tile_map/public/_tile_map.scss delete mode 100644 src/plugins/tile_map/public/index.scss create mode 100644 src/plugins/tile_map/public/tile_map_visualization.scss diff --git a/src/plugins/tile_map/public/_tile_map.scss b/src/plugins/tile_map/public/_tile_map.scss deleted file mode 100644 index 5e4b20f79fedf..0000000000000 --- a/src/plugins/tile_map/public/_tile_map.scss +++ /dev/null @@ -1,15 +0,0 @@ -// SASSTODO: Does this selector exist today? -.tilemap { - margin-bottom: 6px; - border: $euiBorderThin; - position: relative; -} - -/** -* 1. Visualizations have some padding by default but tilemaps look nice flush against the edge to maximize viewing -* space. -*/ -// SASSTODO: Does this selector exist today? -.tile_map { - padding: 0; /* 1. */ -} diff --git a/src/plugins/tile_map/public/index.scss b/src/plugins/tile_map/public/index.scss deleted file mode 100644 index f4b86b0c31190..0000000000000 --- a/src/plugins/tile_map/public/index.scss +++ /dev/null @@ -1,8 +0,0 @@ -// Prefix all styles with "tlm" to avoid conflicts. -// Examples -// tlmChart -// tlmChart__legend -// tlmChart__legend--small -// tlmChart__legend-isLoading - -@import 'tile_map'; diff --git a/src/plugins/tile_map/public/tile_map_visualization.scss b/src/plugins/tile_map/public/tile_map_visualization.scss new file mode 100644 index 0000000000000..4298b06c763da --- /dev/null +++ b/src/plugins/tile_map/public/tile_map_visualization.scss @@ -0,0 +1,4 @@ +.tlmChart__wrapper, .tlmChart { + flex: 1 1 0; + display: flex; +} From 2b1b11db13c0be8ff379f6edc009a683322ac156 Mon Sep 17 00:00:00 2001 From: sulemanof Date: Wed, 16 Dec 2020 12:57:39 +0300 Subject: [PATCH 15/31] Create wrapper component --- .../tile_map/public/tile_map_renderer.tsx | 58 ++++----- .../tile_map_visualization_component.tsx | 110 ++++++++++++++++++ 2 files changed, 131 insertions(+), 37 deletions(-) create mode 100644 src/plugins/tile_map/public/tile_map_visualization_component.tsx diff --git a/src/plugins/tile_map/public/tile_map_renderer.tsx b/src/plugins/tile_map/public/tile_map_renderer.tsx index 05e9bc5ea3767..a61d4a0cb79dc 100644 --- a/src/plugins/tile_map/public/tile_map_renderer.tsx +++ b/src/plugins/tile_map/public/tile_map_renderer.tsx @@ -17,52 +17,36 @@ * under the License. */ +import React, { lazy } from 'react'; +import { render, unmountComponentAtNode } from 'react-dom'; + import { ExpressionRenderDefinition } from 'src/plugins/expressions'; +import { VisualizationContainer } from '../../visualizations/public'; import { TileMapVisualizationDependencies } from './plugin'; import { TileMapVisRenderValue } from './tile_map_fn'; -import { TileMapVisConfig, TileMapVisData } from './types'; - -interface TileMapVisController { - render(visData?: TileMapVisData, visConfig?: TileMapVisConfig): Promise; - destroy(): void; -} -const tableVisRegistry = new Map(); +const TileMapVisualization = lazy(() => import('./tile_map_visualization_component')); export const getTileMapRenderer: ( deps: TileMapVisualizationDependencies ) => ExpressionRenderDefinition = (deps) => ({ name: 'tile_map_vis', reuseDomNode: true, - render: async (domNode, config, handlers) => { - let registeredController = tableVisRegistry.get(domNode); - - if (!registeredController) { - // @ts-expect-error - const { createTileMapVisualization } = await import('./tile_map_visualization'); - - const Controller = createTileMapVisualization(deps); - registeredController = new Controller( - domNode, - handlers, - config.visConfig - ) as TileMapVisController; - tableVisRegistry.set(domNode, registeredController); - - const onUiStateChange = () => { - registeredController?.render(); - }; - - handlers.uiState?.on('change', onUiStateChange); - - handlers.onDestroy(() => { - handlers.uiState?.off('change', onUiStateChange); - registeredController?.destroy(); - tableVisRegistry.delete(domNode); - }); - } - - await registeredController.render(config.visData, config.visConfig); - handlers.done(); + render: async (domNode, { visConfig, visData }, handlers) => { + handlers.onDestroy(() => { + unmountComponentAtNode(domNode); + }); + + render( + + + , + domNode + ); }, }); diff --git a/src/plugins/tile_map/public/tile_map_visualization_component.tsx b/src/plugins/tile_map/public/tile_map_visualization_component.tsx new file mode 100644 index 0000000000000..5ff16f26208bd --- /dev/null +++ b/src/plugins/tile_map/public/tile_map_visualization_component.tsx @@ -0,0 +1,110 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { useEffect, useMemo, useRef } from 'react'; +import { EuiResizeObserver } from '@elastic/eui'; +import { throttle } from 'lodash'; + +import { IInterpreterRenderHandlers } from 'src/plugins/expressions'; +import { TileMapVisualizationDependencies } from './plugin'; +import { TileMapVisConfig, TileMapVisData } from './types'; +// @ts-expect-error +import { createTileMapVisualization } from './tile_map_visualization'; + +import './tile_map_visualization.scss'; + +interface TileMapVisController { + render(visData?: TileMapVisData, visConfig?: TileMapVisConfig): Promise; + destroy(): void; +} + +interface TileMapVisualizationProps { + deps: TileMapVisualizationDependencies; + handlers: IInterpreterRenderHandlers; + visData: TileMapVisData; + visConfig: TileMapVisConfig; +} + +const TileMapVisualization = ({ + deps, + handlers, + visData, + visConfig, +}: TileMapVisualizationProps) => { + const chartDiv = useRef(null); + const visController = useRef(null); + const isFirstRender = useRef(true); + + useEffect(() => { + if (chartDiv.current && isFirstRender.current) { + isFirstRender.current = false; + const Controller = createTileMapVisualization(deps); + visController.current = new Controller(chartDiv.current, handlers, visConfig); + } + }, [deps, handlers, visConfig]); + + useEffect(() => { + if (visController.current) { + visController.current.render(visData, visConfig).then(handlers.done); + } + }, [visData, visConfig, handlers.done]); + + useEffect(() => { + const onUiStateChange = () => { + visController.current?.render().then(handlers.done); + }; + + handlers.uiState?.on('change', onUiStateChange); + + return () => { + handlers.uiState?.off('change', onUiStateChange); + }; + }, [handlers]); + + useEffect(() => { + return () => { + visController.current?.destroy(); + visController.current = null; + }; + }, []); + + const updateChartSize = useMemo( + () => + throttle(() => { + if (visController.current) { + visController.current.render().then(handlers.done); + } + }, 300), + [handlers.done] + ); + + return ( + {}}> + {(resizeRef) => ( +
+
+
+ )} + + ); +}; + +// default export required for React.Lazy +// eslint-disable-next-line import/no-default-export +export { TileMapVisualization as default }; From cb97c1e88dd230e64fd844d599a8889ff67715e6 Mon Sep 17 00:00:00 2001 From: sulemanof Date: Wed, 16 Dec 2020 16:52:57 +0300 Subject: [PATCH 16/31] Update rendering --- .../public/map/base_maps_visualization.js | 7 ++++--- .../tile_map/public/tile_map_visualization.js | 4 ++++ .../public/tile_map_visualization_component.tsx | 16 +++------------- 3 files changed, 11 insertions(+), 16 deletions(-) diff --git a/src/plugins/maps_legacy/public/map/base_maps_visualization.js b/src/plugins/maps_legacy/public/map/base_maps_visualization.js index cced72e8b448a..94ec33e87f77e 100644 --- a/src/plugins/maps_legacy/public/map/base_maps_visualization.js +++ b/src/plugins/maps_legacy/public/map/base_maps_visualization.js @@ -63,18 +63,19 @@ export function BaseMapsVisualizationProvider() { * @return {Promise} */ async render(esResponse, visParams) { + await this._mapIsLoaded; + if (!this._kibanaMap) { //the visualization has been destroyed; return; } - await this._mapIsLoaded; this._kibanaMap.resize(); this._params = visParams; - this._esResponse = esResponse; await this._updateParams(); if (this._hasESResponseChanged(esResponse)) { + this._esResponse = esResponse; await this._updateData(esResponse); } this._kibanaMap.useUiStateFromVisualization(this.handlers.uiState); @@ -214,7 +215,7 @@ export function BaseMapsVisualizationProvider() { } _hasESResponseChanged(data) { - return this._chartData !== data; + return this._esResponse !== data; } /** diff --git a/src/plugins/tile_map/public/tile_map_visualization.js b/src/plugins/tile_map/public/tile_map_visualization.js index 24d5ccfd5f32b..7c46d240a5416 100644 --- a/src/plugins/tile_map/public/tile_map_visualization.js +++ b/src/plugins/tile_map/public/tile_map_visualization.js @@ -97,6 +97,10 @@ export const createTileMapVisualization = (dependencies) => { await super.render(esResponse, visParams); } + resize() { + this._kibanaMap.resize(); + } + async _makeKibanaMap() { await super._makeKibanaMap(this._params); diff --git a/src/plugins/tile_map/public/tile_map_visualization_component.tsx b/src/plugins/tile_map/public/tile_map_visualization_component.tsx index 5ff16f26208bd..6429e874ac43f 100644 --- a/src/plugins/tile_map/public/tile_map_visualization_component.tsx +++ b/src/plugins/tile_map/public/tile_map_visualization_component.tsx @@ -60,9 +60,7 @@ const TileMapVisualization = ({ }, [deps, handlers, visConfig]); useEffect(() => { - if (visController.current) { - visController.current.render(visData, visConfig).then(handlers.done); - } + visController.current?.render(visData, visConfig).then(handlers.done); }, [visData, visConfig, handlers.done]); useEffect(() => { @@ -84,18 +82,10 @@ const TileMapVisualization = ({ }; }, []); - const updateChartSize = useMemo( - () => - throttle(() => { - if (visController.current) { - visController.current.render().then(handlers.done); - } - }, 300), - [handlers.done] - ); + const updateChartSize = useMemo(() => throttle(() => visController.current?.render(), 300), []); return ( - {}}> + {(resizeRef) => (
From 9c8babef652186a0d87da6124d41516b8ef7bc57 Mon Sep 17 00:00:00 2001 From: sulemanof Date: Thu, 17 Dec 2020 16:42:46 +0300 Subject: [PATCH 17/31] Create region map expression renderer --- .../public/map/base_maps_visualization.js | 7 +- .../region_map/public/components/index.tsx | 29 +++++ .../public/components/region_map_options.tsx | 4 +- src/plugins/region_map/public/plugin.ts | 4 +- .../{region_map_fn.js => region_map_fn.ts} | 30 ++++-- .../region_map/public/region_map_renderer.tsx | 52 +++++++++ ...{region_map_type.js => region_map_type.ts} | 29 ++--- .../region_map/public/region_map_types.ts | 10 ++ .../public/region_map_visualization.js | 24 +++-- .../public/region_map_visualization.scss | 4 + .../region_map_visualization_component.tsx | 100 ++++++++++++++++++ src/plugins/region_map/public/to_ast.ts | 59 +++++++++++ .../tile_map/public/tile_map_visualization.js | 9 +- .../tile_map_visualization_component.tsx | 4 +- .../public/legacy/build_pipeline.ts | 88 ++------------- 15 files changed, 332 insertions(+), 121 deletions(-) create mode 100644 src/plugins/region_map/public/components/index.tsx rename src/plugins/region_map/public/{region_map_fn.js => region_map_fn.ts} (64%) create mode 100644 src/plugins/region_map/public/region_map_renderer.tsx rename src/plugins/region_map/public/{region_map_type.js => region_map_type.ts} (87%) create mode 100644 src/plugins/region_map/public/region_map_visualization.scss create mode 100644 src/plugins/region_map/public/region_map_visualization_component.tsx create mode 100644 src/plugins/region_map/public/to_ast.ts diff --git a/src/plugins/maps_legacy/public/map/base_maps_visualization.js b/src/plugins/maps_legacy/public/map/base_maps_visualization.js index 94ec33e87f77e..70b276a15b0d3 100644 --- a/src/plugins/maps_legacy/public/map/base_maps_visualization.js +++ b/src/plugins/maps_legacy/public/map/base_maps_visualization.js @@ -34,9 +34,10 @@ export function BaseMapsVisualizationProvider() { * @constructor */ return class BaseMapsVisualization { - constructor(element, handlers, initialVisParams) { + constructor(element, handlers, initialVisParams, initialEsResponse) { this.handlers = handlers; this._params = initialVisParams; + this._esResponse = initialEsResponse; this._container = element; this._kibanaMap = null; this._chartData = null; //reference to data currently on the map. @@ -62,7 +63,7 @@ export function BaseMapsVisualizationProvider() { * @param status * @return {Promise} */ - async render(esResponse, visParams) { + async render(esResponse = this._esResponse, visParams = this._params) { await this._mapIsLoaded; if (!this._kibanaMap) { @@ -215,7 +216,7 @@ export function BaseMapsVisualizationProvider() { } _hasESResponseChanged(data) { - return this._esResponse !== data; + return this._esResponse && this._esResponse !== data; } /** diff --git a/src/plugins/region_map/public/components/index.tsx b/src/plugins/region_map/public/components/index.tsx new file mode 100644 index 0000000000000..871bcde41400b --- /dev/null +++ b/src/plugins/region_map/public/components/index.tsx @@ -0,0 +1,29 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { lazy } from 'react'; +import { IServiceSettings } from 'src/plugins/maps_legacy/public'; +import { VisOptionsProps } from 'src/plugins/vis_default_editor/public'; +import { RegionMapVisParams } from '../region_map_types'; + +const RegionMapOptions = lazy(() => import('./region_map_options')); + +export const createRegionMapOptions = (getServiceSettings: () => Promise) => ( + props: VisOptionsProps +) => ; diff --git a/src/plugins/region_map/public/components/region_map_options.tsx b/src/plugins/region_map/public/components/region_map_options.tsx index fe33435c286d8..fd649d9609ed8 100644 --- a/src/plugins/region_map/public/components/region_map_options.tsx +++ b/src/plugins/region_map/public/components/region_map_options.tsx @@ -213,4 +213,6 @@ function RegionMapOptions(props: RegionMapOptionsProps) { ); } -export { RegionMapOptions }; +// default export required for React.Lazy +// eslint-disable-next-line import/no-default-export +export { RegionMapOptions as default }; diff --git a/src/plugins/region_map/public/plugin.ts b/src/plugins/region_map/public/plugin.ts index e9978803ad5e2..6bb98858ad124 100644 --- a/src/plugins/region_map/public/plugin.ts +++ b/src/plugins/region_map/public/plugin.ts @@ -44,9 +44,10 @@ import { RegionMapsConfigType } from './index'; import { MapsLegacyConfig } from '../../maps_legacy/config'; import { KibanaLegacyStart } from '../../kibana_legacy/public'; import { SharePluginStart } from '../../share/public'; +import { getRegionMapRenderer } from './region_map_renderer'; /** @private */ -interface RegionMapVisualizationDependencies { +export interface RegionMapVisualizationDependencies { uiSettings: IUiSettingsClient; regionmapsConfig: RegionMapsConfig; getServiceSettings: () => Promise; @@ -107,6 +108,7 @@ export class RegionMapPlugin implements Plugin ({ +import type { ExpressionFunctionDefinition, Datatable, Render } from '../../expressions/public'; +import { RegionMapVisConfig, RegionMapVisData } from './region_map_types'; + +interface Arguments { + visConfig: string | null; +} + +export interface RegionMapVisRenderValue { + visData: RegionMapVisData; + visType: 'region_map'; + visConfig: RegionMapVisConfig; +} + +export type RegionMapExpressionFunctionDefinition = ExpressionFunctionDefinition< + 'regionmap', + Datatable, + Arguments, + Render +>; + +export const createRegionMapFn = (): RegionMapExpressionFunctionDefinition => ({ name: 'regionmap', type: 'render', context: { @@ -32,21 +52,19 @@ export const createRegionMapFn = () => ({ visConfig: { types: ['string', 'null'], default: '"{}"', + help: '', }, }, fn(context, args) { - const visConfig = JSON.parse(args.visConfig); + const visConfig = args.visConfig && JSON.parse(args.visConfig); return { type: 'render', - as: 'visualization', + as: 'region_map_vis', value: { visData: context, visType: 'region_map', visConfig, - params: { - listenOnChange: true, - }, }, }; }, diff --git a/src/plugins/region_map/public/region_map_renderer.tsx b/src/plugins/region_map/public/region_map_renderer.tsx new file mode 100644 index 0000000000000..f0597389b3d0e --- /dev/null +++ b/src/plugins/region_map/public/region_map_renderer.tsx @@ -0,0 +1,52 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { lazy } from 'react'; +import { render, unmountComponentAtNode } from 'react-dom'; + +import { ExpressionRenderDefinition } from 'src/plugins/expressions'; +import { VisualizationContainer } from '../../visualizations/public'; +import { RegionMapVisualizationDependencies } from './plugin'; +import { RegionMapVisRenderValue } from './region_map_fn'; + +const RegionMapVisualization = lazy(() => import('./region_map_visualization_component')); + +export const getRegionMapRenderer: ( + deps: RegionMapVisualizationDependencies +) => ExpressionRenderDefinition = (deps) => ({ + name: 'region_map_vis', + reuseDomNode: true, + render: async (domNode, { visConfig, visData }, handlers) => { + handlers.onDestroy(() => { + unmountComponentAtNode(domNode); + }); + + render( + + + , + domNode + ); + }, +}); diff --git a/src/plugins/region_map/public/region_map_type.js b/src/plugins/region_map/public/region_map_type.ts similarity index 87% rename from src/plugins/region_map/public/region_map_type.js rename to src/plugins/region_map/public/region_map_type.ts index ec32d582ce15b..df74bdab76ff5 100644 --- a/src/plugins/region_map/public/region_map_type.js +++ b/src/plugins/region_map/public/region_map_type.ts @@ -16,20 +16,23 @@ * specific language governing permissions and limitations * under the License. */ -import React from 'react'; import { i18n } from '@kbn/i18n'; import { mapToLayerWithId } from './util'; -import { createRegionMapVisualization } from './region_map_visualization'; -import { RegionMapOptions } from './components/region_map_options'; +import { BaseVisTypeOptions } from '../../visualizations/public'; import { truncatedColorSchemas } from '../../charts/public'; import { Schemas } from '../../vis_default_editor/public'; import { ORIGIN } from '../../maps_legacy/public'; import { getDeprecationMessage } from './get_deprecation_message'; +import { RegionMapVisualizationDependencies } from './plugin'; +import { createRegionMapOptions } from './components'; +import { toExpressionAst } from './to_ast'; +import { RegionMapVisParams } from './region_map_types'; -export function createRegionMapTypeDefinition(dependencies) { - const { uiSettings, regionmapsConfig, getServiceSettings } = dependencies; - const visualization = createRegionMapVisualization(dependencies); - +export function createRegionMapTypeDefinition({ + uiSettings, + regionmapsConfig, + getServiceSettings, +}: RegionMapVisualizationDependencies): BaseVisTypeOptions { return { name: 'region_map', getInfoMessage: getDeprecationMessage, @@ -51,14 +54,11 @@ provided base maps, or add your own. Darker colors represent higher values.', mapZoom: 2, mapCenter: [0, 0], outlineWeight: 1, - showAllShapes: true, //still under consideration + showAllShapes: true, // still under consideration }, }, - visualization, editorConfig: { - optionsTemplate: (props) => ( - - ), + optionsTemplate: createRegionMapOptions(getServiceSettings), collections: { colorSchemas: truncatedColorSchemas, vectorLayers: [], @@ -100,6 +100,7 @@ provided base maps, or add your own. Darker colors represent higher values.', }, ]), }, + toExpressionAst, setup: async (vis) => { const serviceSettings = await getServiceSettings(); const tmsLayers = await serviceSettings.getTMSServices(); @@ -112,7 +113,7 @@ provided base maps, or add your own. Darker colors represent higher values.', mapToLayerWithId.bind(null, ORIGIN.KIBANA_YML) ); let selectedLayer = vectorLayers[0]; - let selectedJoinField = selectedLayer ? selectedLayer.fields[0] : null; + let selectedJoinField = selectedLayer ? selectedLayer.fields[0] : undefined; if (regionmapsConfig.includeElasticMapsService) { const layers = await serviceSettings.getFileLayers(); const newLayers = layers @@ -133,7 +134,7 @@ provided base maps, or add your own. Darker colors represent higher values.', vis.type.editorConfig.collections.vectorLayers = [...vectorLayers, ...newLayers]; [selectedLayer] = vis.type.editorConfig.collections.vectorLayers; - selectedJoinField = selectedLayer ? selectedLayer.fields[0] : null; + selectedJoinField = selectedLayer ? selectedLayer.fields[0] : undefined; if (selectedLayer && !vis.params.selectedLayer && selectedLayer.isEMS) { vis.params.emsHotLink = await serviceSettings.getEMSHotLink(selectedLayer); diff --git a/src/plugins/region_map/public/region_map_types.ts b/src/plugins/region_map/public/region_map_types.ts index b43b095a7c31d..b977dd10800b8 100644 --- a/src/plugins/region_map/public/region_map_types.ts +++ b/src/plugins/region_map/public/region_map_types.ts @@ -17,6 +17,7 @@ * under the License. */ +import { SchemaConfig } from 'src/plugins/visualizations/public'; import { VectorLayer, FileLayerField, WMSOptions } from '../../maps_legacy/public/index'; export interface RegionMapVisParams { @@ -33,3 +34,12 @@ export interface RegionMapVisParams { selectedJoinField?: FileLayerField; wms: WMSOptions; } + +export interface RegionMapVisConfig extends RegionMapVisParams { + metric: SchemaConfig; + bucket?: SchemaConfig; +} + +export interface RegionMapVisData { + [key: string]: any; +} diff --git a/src/plugins/region_map/public/region_map_visualization.js b/src/plugins/region_map/public/region_map_visualization.js index ecb3541827cb3..33c29d2e335bf 100644 --- a/src/plugins/region_map/public/region_map_visualization.js +++ b/src/plugins/region_map/public/region_map_visualization.js @@ -30,9 +30,8 @@ export function createRegionMapVisualization({ getServiceSettings, }) { return class RegionMapsVisualization extends BaseMapsVisualization { - constructor(container, vis) { - super(container, vis); - this._vis = this.vis; + constructor(container, handlers, initialVisParams, initialEsResponse) { + super(container, handlers, initialVisParams, initialEsResponse); this._choroplethLayer = null; this._tooltipFormatter = mapTooltipProvider(container, tooltipFormatter); } @@ -88,7 +87,7 @@ export function createRegionMapVisualization({ ); } - this._kibanaMap.useUiStateFromVisualization(this._vis); + this._kibanaMap.useUiStateFromVisualization(this.handlers.uiState); } async _loadConfig(fileLayerConfig) { @@ -201,11 +200,18 @@ export function createRegionMapVisualization({ this._choroplethLayer.on('select', (event) => { const { rows, columns } = this._chartData; const rowIndex = rows.findIndex((row) => row[columns[0].id] === event); - this._vis.API.events.filter({ - table: this._chartData, - column: 0, - row: rowIndex, - value: event, + this.handlers.event({ + name: 'filterBucket', + data: { + data: [ + { + table: this._chartData, + column: 0, + row: rowIndex, + value: event, + }, + ], + }, }); }); diff --git a/src/plugins/region_map/public/region_map_visualization.scss b/src/plugins/region_map/public/region_map_visualization.scss new file mode 100644 index 0000000000000..ee593e2fc9c8c --- /dev/null +++ b/src/plugins/region_map/public/region_map_visualization.scss @@ -0,0 +1,4 @@ +.rgmChart__wrapper, .rgmChart { + flex: 1 1 0; + display: flex; +} diff --git a/src/plugins/region_map/public/region_map_visualization_component.tsx b/src/plugins/region_map/public/region_map_visualization_component.tsx new file mode 100644 index 0000000000000..cd4aa9fee1f54 --- /dev/null +++ b/src/plugins/region_map/public/region_map_visualization_component.tsx @@ -0,0 +1,100 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { useEffect, useMemo, useRef } from 'react'; +import { EuiResizeObserver } from '@elastic/eui'; +import { throttle } from 'lodash'; + +import { IInterpreterRenderHandlers } from 'src/plugins/expressions'; +import { RegionMapVisualizationDependencies } from './plugin'; +import { RegionMapVisConfig, RegionMapVisData } from './region_map_types'; +// @ts-expect-error +import { createRegionMapVisualization } from './region_map_visualization'; + +import './region_map_visualization.scss'; + +interface RegionMapVisController { + render(visData?: RegionMapVisData, visConfig?: RegionMapVisConfig): Promise; + destroy(): void; +} + +interface TileMapVisualizationProps { + deps: RegionMapVisualizationDependencies; + handlers: IInterpreterRenderHandlers; + visData: RegionMapVisData; + visConfig: RegionMapVisConfig; +} + +const RegionMapVisualization = ({ + deps, + handlers, + visData, + visConfig, +}: TileMapVisualizationProps) => { + const chartDiv = useRef(null); + const visController = useRef(null); + const isFirstRender = useRef(true); + + useEffect(() => { + if (chartDiv.current && isFirstRender.current) { + isFirstRender.current = false; + const Controller = createRegionMapVisualization(deps); + visController.current = new Controller(chartDiv.current, handlers, visConfig, visData); + } + }, [deps, handlers, visConfig, visData]); + + useEffect(() => { + visController.current?.render(visData, visConfig).then(handlers.done); + }, [visData, visConfig, handlers.done]); + + useEffect(() => { + const onUiStateChange = () => { + visController.current?.render().then(handlers.done); + }; + + handlers.uiState?.on('change', onUiStateChange); + + return () => { + handlers.uiState?.off('change', onUiStateChange); + }; + }, [handlers]); + + useEffect(() => { + return () => { + visController.current?.destroy(); + visController.current = null; + }; + }, []); + + const updateChartSize = useMemo(() => throttle(() => visController.current?.render(), 300), []); + + return ( + + {(resizeRef) => ( +
+
+
+ )} + + ); +}; + +// default export required for React.Lazy +// eslint-disable-next-line import/no-default-export +export { RegionMapVisualization as default }; diff --git a/src/plugins/region_map/public/to_ast.ts b/src/plugins/region_map/public/to_ast.ts new file mode 100644 index 0000000000000..90dc6583732b3 --- /dev/null +++ b/src/plugins/region_map/public/to_ast.ts @@ -0,0 +1,59 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + EsaggsExpressionFunctionDefinition, + IndexPatternLoadExpressionFunctionDefinition, +} from '../../data/public'; +import { buildExpression, buildExpressionFunction } from '../../expressions/public'; +import { getVisSchemas, Vis, BuildPipelineParams } from '../../visualizations/public'; +import { RegionMapExpressionFunctionDefinition } from './region_map_fn'; +import { RegionMapVisConfig, RegionMapVisParams } from './region_map_types'; + +export const toExpressionAst = (vis: Vis, params: BuildPipelineParams) => { + const esaggs = buildExpressionFunction('esaggs', { + index: buildExpression([ + buildExpressionFunction('indexPatternLoad', { + id: vis.data.indexPattern!.id!, + }), + ]), + metricsAtAllLevels: false, + partialRows: false, + aggs: vis.data.aggs!.aggs.map((agg) => buildExpression(agg.toExpressionAst())), + }); + + const schemas = getVisSchemas(vis, params); + + const visConfig: RegionMapVisConfig = { + ...vis.params, + metric: schemas.metric[0], + }; + + if (schemas.segment) { + visConfig.bucket = schemas.segment[0]; + } + + const regionmap = buildExpressionFunction('regionmap', { + visConfig: JSON.stringify(visConfig), + }); + + const ast = buildExpression([esaggs, regionmap]); + + return ast.toAst(); +}; diff --git a/src/plugins/tile_map/public/tile_map_visualization.js b/src/plugins/tile_map/public/tile_map_visualization.js index 7c46d240a5416..ef14a457d5c6d 100644 --- a/src/plugins/tile_map/public/tile_map_visualization.js +++ b/src/plugins/tile_map/public/tile_map_visualization.js @@ -54,8 +54,8 @@ export const createTileMapVisualization = (dependencies) => { const { getZoomPrecision, getPrecision, BaseMapsVisualization } = dependencies; return class CoordinateMapsVisualization extends BaseMapsVisualization { - constructor(element, handlers, initialVisParams) { - super(element, handlers, initialVisParams); + constructor(element, handlers, initialVisParams, initialEsResponse) { + super(element, handlers, initialVisParams, initialEsResponse); this._geohashLayer = null; this._tooltipFormatter = mapTooltipProvider(element, tooltipFormatter); @@ -89,11 +89,6 @@ export const createTileMapVisualization = (dependencies) => { async render(esResponse, visParams) { getKibanaLegacy().loadFontAwesome(); - if (!esResponse && !visParams) { - // the case from uiState updates - await super.render(this._esResponse, this._params); - return; - } await super.render(esResponse, visParams); } diff --git a/src/plugins/tile_map/public/tile_map_visualization_component.tsx b/src/plugins/tile_map/public/tile_map_visualization_component.tsx index 6429e874ac43f..11b797afdadf8 100644 --- a/src/plugins/tile_map/public/tile_map_visualization_component.tsx +++ b/src/plugins/tile_map/public/tile_map_visualization_component.tsx @@ -55,9 +55,9 @@ const TileMapVisualization = ({ if (chartDiv.current && isFirstRender.current) { isFirstRender.current = false; const Controller = createTileMapVisualization(deps); - visController.current = new Controller(chartDiv.current, handlers, visConfig); + visController.current = new Controller(chartDiv.current, handlers, visConfig, visData); } - }, [deps, handlers, visConfig]); + }, [deps, handlers, visConfig, visData]); useEffect(() => { visController.current?.render(visData, visConfig).then(handlers.done); diff --git a/src/plugins/visualizations/public/legacy/build_pipeline.ts b/src/plugins/visualizations/public/legacy/build_pipeline.ts index 7c03951b04f01..00dbbc7022a5e 100644 --- a/src/plugins/visualizations/public/legacy/build_pipeline.ts +++ b/src/plugins/visualizations/public/legacy/build_pipeline.ts @@ -23,7 +23,7 @@ import { SerializedFieldFormat, } from '../../../../plugins/expressions/public'; import { IAggConfig, search, TimefilterContract } from '../../../../plugins/data/public'; -import { Vis, VisParams } from '../types'; +import { Vis } from '../types'; const { isDateHistogramBucketAggConfig } = search.aggs; interface SchemaConfigParams { @@ -53,25 +53,6 @@ export interface Schemas { // catch all for schema name [key: string]: any[] | undefined; } - -type BuildVisFunction = ( - params: VisParams, - schemas: Schemas, - uiState: any, - meta?: { savedObjectId?: string } -) => string; - -// eslint-disable-next-line @typescript-eslint/naming-convention -type buildVisConfigFunction = (schemas: Schemas, visParams?: VisParams) => VisParams; - -interface BuildPipelineVisFunction { - [key: string]: BuildVisFunction; -} - -interface BuildVisConfigFunction { - [key: string]: buildVisConfigFunction; -} - export interface BuildPipelineParams { timefilter: TimefilterContract; timeRange?: any; @@ -222,32 +203,10 @@ export const prepareDimension = (variable: string, data: any) => { return expr; }; -export const buildPipelineVisFunction: BuildPipelineVisFunction = { - region_map: (params, schemas) => { - const visConfig = { - ...params, - ...buildVisConfig.region_map(schemas), - }; - return `regionmap ${prepareJson('visConfig', visConfig)}`; - }, -}; - -const buildVisConfig: BuildVisConfigFunction = { - region_map: (schemas) => { - const visConfig = {} as any; - visConfig.metric = schemas.metric[0]; - if (schemas.segment) { - visConfig.bucket = schemas.segment[0]; - } - return visConfig; - }, -}; - export const buildPipeline = async (vis: Vis, params: BuildPipelineParams) => { const { indexPattern, searchSource } = vis.data; const query = searchSource!.getField('query'); const filters = searchSource!.getField('filter'); - const { uiState, title } = vis; // context let pipeline = `kibana | kibana_context `; @@ -265,48 +224,21 @@ export const buildPipeline = async (vis: Vis, params: BuildPipelineParams) => { if (vis.type.toExpressionAst) { const visAst = await vis.type.toExpressionAst(vis, params); pipeline += formatExpression(visAst); - } else { + } else if (vis.type.requestHandler === 'courier') { // request handler - if (vis.type.requestHandler === 'courier') { - pipeline += `esaggs + pipeline += `esaggs index={indexPatternLoad ${prepareString('id', indexPattern!.id)}} metricsAtAllLevels=${vis.isHierarchical()} partialRows=${vis.params.showPartialRows || false} `; - if (vis.data.aggs) { - vis.data.aggs.aggs.forEach((agg) => { - const ast = agg.toExpressionAst(); - if (ast) { - pipeline += `aggs={${buildExpression(ast).toString()}} `; - } - }); - } - pipeline += `| `; - } - - const schemas = getSchemas(vis, params); - - if (buildPipelineVisFunction[vis.type.name]) { - pipeline += buildPipelineVisFunction[vis.type.name]( - { title, ...vis.params }, - schemas, - uiState - ); - } else { - const visConfig = { ...vis.params }; - visConfig.dimensions = schemas; - visConfig.title = title; - pipeline += `visualization type='${vis.type.name}' - ${prepareJson('visConfig', visConfig)} - ${prepareJson('uiState', uiState)} - metricsAtAllLevels=${vis.isHierarchical()} - partialRows=${vis.params.showPartialRows || false} `; - if (indexPattern) { - pipeline += `${prepareString('index', indexPattern.id)} `; - if (vis.data.aggs) { - pipeline += `${prepareJson('aggConfigs', vis.data.aggs!.aggs)}`; + if (vis.data.aggs) { + vis.data.aggs.aggs.forEach((agg) => { + const ast = agg.toExpressionAst(); + if (ast) { + pipeline += `aggs={${buildExpression(ast).toString()}} `; } - } + }); } + pipeline += `| `; } return pipeline; From f60712c3db1a6663caa62f78a031a9b9c054a1cd Mon Sep 17 00:00:00 2001 From: sulemanof Date: Fri, 18 Dec 2020 11:50:13 +0300 Subject: [PATCH 18/31] Fix tests and types --- ...est.js.snap => region_map_fn.test.ts.snap} | 5 +-- ...n_map_fn.test.js => region_map_fn.test.ts} | 7 +-- .../region_map/public/region_map_fn.ts | 4 +- .../region_map/public/region_map_types.ts | 4 -- .../region_map_visualization_component.tsx | 8 ++-- .../tile_map/public/tile_map_visualization.js | 4 -- .../__snapshots__/build_pipeline.test.ts.snap | 4 -- .../public/legacy/build_pipeline.test.ts | 45 +------------------ 8 files changed, 9 insertions(+), 72 deletions(-) rename src/plugins/region_map/public/__snapshots__/{region_map_fn.test.js.snap => region_map_fn.test.ts.snap} (93%) rename src/plugins/region_map/public/{region_map_fn.test.js => region_map_fn.test.ts} (92%) diff --git a/src/plugins/region_map/public/__snapshots__/region_map_fn.test.js.snap b/src/plugins/region_map/public/__snapshots__/region_map_fn.test.ts.snap similarity index 93% rename from src/plugins/region_map/public/__snapshots__/region_map_fn.test.js.snap rename to src/plugins/region_map/public/__snapshots__/region_map_fn.test.ts.snap index cb12712ae824f..df72e75f5ad6b 100644 --- a/src/plugins/region_map/public/__snapshots__/region_map_fn.test.js.snap +++ b/src/plugins/region_map/public/__snapshots__/region_map_fn.test.ts.snap @@ -2,12 +2,9 @@ exports[`interpreter/functions#regionmap returns an object with the correct structure 1`] = ` Object { - "as": "visualization", + "as": "region_map_vis", "type": "render", "value": Object { - "params": Object { - "listenOnChange": true, - }, "visConfig": Object { "addTooltip": true, "colorSchema": "Yellow to Red", diff --git a/src/plugins/region_map/public/region_map_fn.test.js b/src/plugins/region_map/public/region_map_fn.test.ts similarity index 92% rename from src/plugins/region_map/public/region_map_fn.test.js rename to src/plugins/region_map/public/region_map_fn.test.ts index d83d04be6d38c..dcf0e647f7f22 100644 --- a/src/plugins/region_map/public/region_map_fn.test.js +++ b/src/plugins/region_map/public/region_map_fn.test.ts @@ -17,7 +17,6 @@ * under the License. */ -// eslint-disable-next-line import { functionWrapper } from '../../expressions/common/expression_functions/specs/tests/utils'; import { createRegionMapFn } from './region_map_fn'; @@ -57,11 +56,7 @@ describe('interpreter/functions#regionmap', () => { }; it('returns an object with the correct structure', () => { - const actual = fn( - context, - { visConfig: JSON.stringify(visConfig) }, - { logDatatable: jest.fn() } - ); + const actual = fn(context, { visConfig: JSON.stringify(visConfig) }); expect(actual).toMatchSnapshot(); }); }); diff --git a/src/plugins/region_map/public/region_map_fn.ts b/src/plugins/region_map/public/region_map_fn.ts index 5d316bee943ea..74f41cf647b5c 100644 --- a/src/plugins/region_map/public/region_map_fn.ts +++ b/src/plugins/region_map/public/region_map_fn.ts @@ -20,14 +20,14 @@ import { i18n } from '@kbn/i18n'; import type { ExpressionFunctionDefinition, Datatable, Render } from '../../expressions/public'; -import { RegionMapVisConfig, RegionMapVisData } from './region_map_types'; +import { RegionMapVisConfig } from './region_map_types'; interface Arguments { visConfig: string | null; } export interface RegionMapVisRenderValue { - visData: RegionMapVisData; + visData: Datatable; visType: 'region_map'; visConfig: RegionMapVisConfig; } diff --git a/src/plugins/region_map/public/region_map_types.ts b/src/plugins/region_map/public/region_map_types.ts index b977dd10800b8..044872be7a7ca 100644 --- a/src/plugins/region_map/public/region_map_types.ts +++ b/src/plugins/region_map/public/region_map_types.ts @@ -39,7 +39,3 @@ export interface RegionMapVisConfig extends RegionMapVisParams { metric: SchemaConfig; bucket?: SchemaConfig; } - -export interface RegionMapVisData { - [key: string]: any; -} diff --git a/src/plugins/region_map/public/region_map_visualization_component.tsx b/src/plugins/region_map/public/region_map_visualization_component.tsx index cd4aa9fee1f54..0665ca9db6fde 100644 --- a/src/plugins/region_map/public/region_map_visualization_component.tsx +++ b/src/plugins/region_map/public/region_map_visualization_component.tsx @@ -21,23 +21,23 @@ import React, { useEffect, useMemo, useRef } from 'react'; import { EuiResizeObserver } from '@elastic/eui'; import { throttle } from 'lodash'; -import { IInterpreterRenderHandlers } from 'src/plugins/expressions'; +import { IInterpreterRenderHandlers, Datatable } from 'src/plugins/expressions'; import { RegionMapVisualizationDependencies } from './plugin'; -import { RegionMapVisConfig, RegionMapVisData } from './region_map_types'; +import { RegionMapVisConfig } from './region_map_types'; // @ts-expect-error import { createRegionMapVisualization } from './region_map_visualization'; import './region_map_visualization.scss'; interface RegionMapVisController { - render(visData?: RegionMapVisData, visConfig?: RegionMapVisConfig): Promise; + render(visData?: Datatable, visConfig?: RegionMapVisConfig): Promise; destroy(): void; } interface TileMapVisualizationProps { deps: RegionMapVisualizationDependencies; handlers: IInterpreterRenderHandlers; - visData: RegionMapVisData; + visData: Datatable; visConfig: RegionMapVisConfig; } diff --git a/src/plugins/tile_map/public/tile_map_visualization.js b/src/plugins/tile_map/public/tile_map_visualization.js index ef14a457d5c6d..0fccd738e2f5a 100644 --- a/src/plugins/tile_map/public/tile_map_visualization.js +++ b/src/plugins/tile_map/public/tile_map_visualization.js @@ -92,10 +92,6 @@ export const createTileMapVisualization = (dependencies) => { await super.render(esResponse, visParams); } - resize() { - this._kibanaMap.resize(); - } - async _makeKibanaMap() { await super._makeKibanaMap(this._params); diff --git a/src/plugins/visualizations/public/legacy/__snapshots__/build_pipeline.test.ts.snap b/src/plugins/visualizations/public/legacy/__snapshots__/build_pipeline.test.ts.snap index fc9cfb3f87496..3d685064111dc 100644 --- a/src/plugins/visualizations/public/legacy/__snapshots__/build_pipeline.test.ts.snap +++ b/src/plugins/visualizations/public/legacy/__snapshots__/build_pipeline.test.ts.snap @@ -1,7 +1,3 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`visualize loader pipeline helpers: build pipeline buildPipeline calls toExpression on vis_type if it exists 1`] = `"kibana | kibana_context | test"`; - -exports[`visualize loader pipeline helpers: build pipeline buildPipelineVisFunction handles region_map function with buckets 1`] = `"regionmap visConfig='{\\"metric\\":{\\"accessor\\":0,\\"label\\":\\"\\",\\"format\\":{},\\"params\\":{},\\"aggType\\":\\"\\"},\\"bucket\\":1}' "`; - -exports[`visualize loader pipeline helpers: build pipeline buildPipelineVisFunction handles region_map function without buckets 1`] = `"regionmap visConfig='{\\"metric\\":{\\"accessor\\":0,\\"label\\":\\"\\",\\"format\\":{},\\"params\\":{},\\"aggType\\":\\"\\"}}' "`; diff --git a/src/plugins/visualizations/public/legacy/build_pipeline.test.ts b/src/plugins/visualizations/public/legacy/build_pipeline.test.ts index e29e85c8238d3..1b86488c06354 100644 --- a/src/plugins/visualizations/public/legacy/build_pipeline.test.ts +++ b/src/plugins/visualizations/public/legacy/build_pipeline.test.ts @@ -17,14 +17,7 @@ * under the License. */ -import { - prepareJson, - prepareString, - buildPipelineVisFunction, - buildPipeline, - SchemaConfig, - Schemas, -} from './build_pipeline'; +import { prepareJson, prepareString, buildPipeline } from './build_pipeline'; import { Vis } from '..'; import { dataPluginMock } from '../../../../plugins/data/public/mocks'; import { parseExpression } from '../../../expressions/common'; @@ -74,42 +67,6 @@ describe('visualize loader pipeline helpers: build pipeline', () => { }); }); - describe('buildPipelineVisFunction', () => { - let schemaConfig: SchemaConfig; - let schemasDef: Schemas; - let uiState: any; - - beforeEach(() => { - schemaConfig = { - accessor: 0, - label: '', - format: {}, - params: {}, - aggType: '', - }; - - schemasDef = { metric: [schemaConfig] }; - uiState = {}; - }); - - describe('handles region_map function', () => { - it('without buckets', () => { - const params = { metric: {} }; - const actual = buildPipelineVisFunction.region_map(params, schemasDef, uiState); - expect(actual).toMatchSnapshot(); - }); - - it('with buckets', () => { - const schemas = { - ...schemasDef, - segment: [1, 2], - }; - const actual = buildPipelineVisFunction.region_map({}, schemas, uiState); - expect(actual).toMatchSnapshot(); - }); - }); - }); - describe('buildPipeline', () => { const dataStart = dataPluginMock.createStartContract(); From f09f74406b1e48b1887f336c2aa6ebd18c0d99a8 Mon Sep 17 00:00:00 2001 From: sulemanof Date: Fri, 18 Dec 2020 12:13:46 +0300 Subject: [PATCH 19/31] Fix initial render --- .../maps_legacy/public/map/base_maps_visualization.js | 9 ++++++--- .../region_map/public/region_map_visualization.js | 4 ++-- .../public/region_map_visualization_component.tsx | 5 +++-- src/plugins/tile_map/public/tile_map_visualization.js | 4 ++-- .../tile_map/public/tile_map_visualization_component.tsx | 5 +++-- 5 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/plugins/maps_legacy/public/map/base_maps_visualization.js b/src/plugins/maps_legacy/public/map/base_maps_visualization.js index 70b276a15b0d3..960e2843faaa1 100644 --- a/src/plugins/maps_legacy/public/map/base_maps_visualization.js +++ b/src/plugins/maps_legacy/public/map/base_maps_visualization.js @@ -34,10 +34,9 @@ export function BaseMapsVisualizationProvider() { * @constructor */ return class BaseMapsVisualization { - constructor(element, handlers, initialVisParams, initialEsResponse) { + constructor(element, handlers, initialVisParams) { this.handlers = handlers; this._params = initialVisParams; - this._esResponse = initialEsResponse; this._container = element; this._kibanaMap = null; this._chartData = null; //reference to data currently on the map. @@ -84,6 +83,10 @@ export function BaseMapsVisualizationProvider() { await this._whenBaseLayerIsLoaded(); } + resize() { + this._kibanaMap.resize(); + } + /** * Creates an instance of a kibana-map with a single baselayer and assigns it to the this._kibanaMap property. * Clients can override this method to customize the initialization. @@ -216,7 +219,7 @@ export function BaseMapsVisualizationProvider() { } _hasESResponseChanged(data) { - return this._esResponse && this._esResponse !== data; + return this._esResponse !== data; } /** diff --git a/src/plugins/region_map/public/region_map_visualization.js b/src/plugins/region_map/public/region_map_visualization.js index 33c29d2e335bf..4dfc6ead79449 100644 --- a/src/plugins/region_map/public/region_map_visualization.js +++ b/src/plugins/region_map/public/region_map_visualization.js @@ -30,8 +30,8 @@ export function createRegionMapVisualization({ getServiceSettings, }) { return class RegionMapsVisualization extends BaseMapsVisualization { - constructor(container, handlers, initialVisParams, initialEsResponse) { - super(container, handlers, initialVisParams, initialEsResponse); + constructor(container, handlers, initialVisParams) { + super(container, handlers, initialVisParams); this._choroplethLayer = null; this._tooltipFormatter = mapTooltipProvider(container, tooltipFormatter); } diff --git a/src/plugins/region_map/public/region_map_visualization_component.tsx b/src/plugins/region_map/public/region_map_visualization_component.tsx index 0665ca9db6fde..d30f2d4c71d10 100644 --- a/src/plugins/region_map/public/region_map_visualization_component.tsx +++ b/src/plugins/region_map/public/region_map_visualization_component.tsx @@ -31,6 +31,7 @@ import './region_map_visualization.scss'; interface RegionMapVisController { render(visData?: Datatable, visConfig?: RegionMapVisConfig): Promise; + resize(): void; destroy(): void; } @@ -55,7 +56,7 @@ const RegionMapVisualization = ({ if (chartDiv.current && isFirstRender.current) { isFirstRender.current = false; const Controller = createRegionMapVisualization(deps); - visController.current = new Controller(chartDiv.current, handlers, visConfig, visData); + visController.current = new Controller(chartDiv.current, handlers, visConfig); } }, [deps, handlers, visConfig, visData]); @@ -82,7 +83,7 @@ const RegionMapVisualization = ({ }; }, []); - const updateChartSize = useMemo(() => throttle(() => visController.current?.render(), 300), []); + const updateChartSize = useMemo(() => throttle(() => visController.current?.resize(), 300), []); return ( diff --git a/src/plugins/tile_map/public/tile_map_visualization.js b/src/plugins/tile_map/public/tile_map_visualization.js index 0fccd738e2f5a..2128aec49992f 100644 --- a/src/plugins/tile_map/public/tile_map_visualization.js +++ b/src/plugins/tile_map/public/tile_map_visualization.js @@ -54,8 +54,8 @@ export const createTileMapVisualization = (dependencies) => { const { getZoomPrecision, getPrecision, BaseMapsVisualization } = dependencies; return class CoordinateMapsVisualization extends BaseMapsVisualization { - constructor(element, handlers, initialVisParams, initialEsResponse) { - super(element, handlers, initialVisParams, initialEsResponse); + constructor(element, handlers, initialVisParams) { + super(element, handlers, initialVisParams); this._geohashLayer = null; this._tooltipFormatter = mapTooltipProvider(element, tooltipFormatter); diff --git a/src/plugins/tile_map/public/tile_map_visualization_component.tsx b/src/plugins/tile_map/public/tile_map_visualization_component.tsx index 11b797afdadf8..79a8e97c3767c 100644 --- a/src/plugins/tile_map/public/tile_map_visualization_component.tsx +++ b/src/plugins/tile_map/public/tile_map_visualization_component.tsx @@ -31,6 +31,7 @@ import './tile_map_visualization.scss'; interface TileMapVisController { render(visData?: TileMapVisData, visConfig?: TileMapVisConfig): Promise; + resize(): void; destroy(): void; } @@ -55,7 +56,7 @@ const TileMapVisualization = ({ if (chartDiv.current && isFirstRender.current) { isFirstRender.current = false; const Controller = createTileMapVisualization(deps); - visController.current = new Controller(chartDiv.current, handlers, visConfig, visData); + visController.current = new Controller(chartDiv.current, handlers, visConfig); } }, [deps, handlers, visConfig, visData]); @@ -82,7 +83,7 @@ const TileMapVisualization = ({ }; }, []); - const updateChartSize = useMemo(() => throttle(() => visController.current?.render(), 300), []); + const updateChartSize = useMemo(() => throttle(() => visController.current?.resize(), 300), []); return ( From bec27e52cc5b93d32a282565a371351f2ba17890 Mon Sep 17 00:00:00 2001 From: sulemanof Date: Fri, 18 Dec 2020 14:20:18 +0300 Subject: [PATCH 20/31] Remove resize subscription --- src/plugins/maps_legacy/public/map/kibana_map.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/plugins/maps_legacy/public/map/kibana_map.js b/src/plugins/maps_legacy/public/map/kibana_map.js index 3f8fbf32d7a4d..0a4290cbee68b 100644 --- a/src/plugins/maps_legacy/public/map/kibana_map.js +++ b/src/plugins/maps_legacy/public/map/kibana_map.js @@ -690,12 +690,6 @@ export class KibanaMap extends EventEmitter { } } - // this._leafletMap.on('resize', () => { - // visualization.sessionState.mapBounds = this.getBounds(); - // }); - // this._leafletMap.on('load', () => { - // visualization.sessionState.mapBounds = this.getBounds(); - // }); this.on('dragend', persistMapStateInUiState); this.on('zoomend', persistMapStateInUiState); } From 1e2c56a2ec7dfbaabc6826e969ff459d7a93cb00 Mon Sep 17 00:00:00 2001 From: sulemanof Date: Fri, 18 Dec 2020 16:17:18 +0300 Subject: [PATCH 21/31] Fix custom visualization expression --- .../public/legacy/build_pipeline.ts | 37 ++++++++++++++----- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/src/plugins/visualizations/public/legacy/build_pipeline.ts b/src/plugins/visualizations/public/legacy/build_pipeline.ts index 00dbbc7022a5e..7c5991d498faf 100644 --- a/src/plugins/visualizations/public/legacy/build_pipeline.ts +++ b/src/plugins/visualizations/public/legacy/build_pipeline.ts @@ -207,6 +207,7 @@ export const buildPipeline = async (vis: Vis, params: BuildPipelineParams) => { const { indexPattern, searchSource } = vis.data; const query = searchSource!.getField('query'); const filters = searchSource!.getField('filter'); + const { uiState, title } = vis; // context let pipeline = `kibana | kibana_context `; @@ -224,21 +225,39 @@ export const buildPipeline = async (vis: Vis, params: BuildPipelineParams) => { if (vis.type.toExpressionAst) { const visAst = await vis.type.toExpressionAst(vis, params); pipeline += formatExpression(visAst); - } else if (vis.type.requestHandler === 'courier') { + } else { // request handler - pipeline += `esaggs + if (vis.type.requestHandler === 'courier') { + pipeline += `esaggs index={indexPatternLoad ${prepareString('id', indexPattern!.id)}} metricsAtAllLevels=${vis.isHierarchical()} partialRows=${vis.params.showPartialRows || false} `; - if (vis.data.aggs) { - vis.data.aggs.aggs.forEach((agg) => { - const ast = agg.toExpressionAst(); - if (ast) { - pipeline += `aggs={${buildExpression(ast).toString()}} `; + if (vis.data.aggs) { + vis.data.aggs.aggs.forEach((agg) => { + const ast = agg.toExpressionAst(); + if (ast) { + pipeline += `aggs={${buildExpression(ast).toString()}} `; + } + }); + } + pipeline += `| `; + } else { + const schemas = getSchemas(vis, params); + const visConfig = { ...vis.params }; + visConfig.dimensions = schemas; + visConfig.title = title; + pipeline += `visualization type='${vis.type.name}' + ${prepareJson('visConfig', visConfig)} + ${prepareJson('uiState', uiState)} + metricsAtAllLevels=${vis.isHierarchical()} + partialRows=${vis.params.showPartialRows || false} `; + if (indexPattern) { + pipeline += `${prepareString('index', indexPattern.id)} `; + if (vis.data.aggs) { + pipeline += `${prepareJson('aggConfigs', vis.data.aggs!.aggs)}`; } - }); + } } - pipeline += `| `; } return pipeline; From 221616d210a7ff4b74db98250c5a9831da16a123 Mon Sep 17 00:00:00 2001 From: sulemanof Date: Fri, 18 Dec 2020 17:24:15 +0300 Subject: [PATCH 22/31] Update interpreter functional tests --- .../snapshots/baseline/partial_test_3.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/interpreter_functional/snapshots/baseline/partial_test_3.json b/test/interpreter_functional/snapshots/baseline/partial_test_3.json index 595127526156e..7ec1f34673aac 100644 --- a/test/interpreter_functional/snapshots/baseline/partial_test_3.json +++ b/test/interpreter_functional/snapshots/baseline/partial_test_3.json @@ -1 +1 @@ -{"as":"visualization","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"bucket":{"accessor":0},"metric":{"accessor":1,"format":{"id":"number"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"region_map"}} \ No newline at end of file +{"as":"region_map_vis","type":"render","value":{"visConfig":{"bucket":{"accessor":0},"metric":{"accessor":1,"format":{"id":"number"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"region_map"}} From 393e1a861b59260a4bdd7d32c017aa35233a45f9 Mon Sep 17 00:00:00 2001 From: sulemanof Date: Mon, 21 Dec 2020 14:08:31 +0300 Subject: [PATCH 23/31] Fix merge conflicts --- .../public/region_map_visualization_component.tsx | 8 +++++--- .../tile_map/public/tile_map_visualization_component.tsx | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/plugins/region_map/public/region_map_visualization_component.tsx b/src/plugins/region_map/public/region_map_visualization_component.tsx index d30f2d4c71d10..4e80c7e67c11b 100644 --- a/src/plugins/region_map/public/region_map_visualization_component.tsx +++ b/src/plugins/region_map/public/region_map_visualization_component.tsx @@ -22,6 +22,7 @@ import { EuiResizeObserver } from '@elastic/eui'; import { throttle } from 'lodash'; import { IInterpreterRenderHandlers, Datatable } from 'src/plugins/expressions'; +import { PersistedState } from 'src/plugins/visualizations/public'; import { RegionMapVisualizationDependencies } from './plugin'; import { RegionMapVisConfig } from './region_map_types'; // @ts-expect-error @@ -51,6 +52,7 @@ const RegionMapVisualization = ({ const chartDiv = useRef(null); const visController = useRef(null); const isFirstRender = useRef(true); + const uiState = handlers.uiState as PersistedState; useEffect(() => { if (chartDiv.current && isFirstRender.current) { @@ -69,12 +71,12 @@ const RegionMapVisualization = ({ visController.current?.render().then(handlers.done); }; - handlers.uiState?.on('change', onUiStateChange); + uiState.on('change', onUiStateChange); return () => { - handlers.uiState?.off('change', onUiStateChange); + uiState.off('change', onUiStateChange); }; - }, [handlers]); + }, [uiState, handlers.done]); useEffect(() => { return () => { diff --git a/src/plugins/tile_map/public/tile_map_visualization_component.tsx b/src/plugins/tile_map/public/tile_map_visualization_component.tsx index 79a8e97c3767c..f087ab59fe73b 100644 --- a/src/plugins/tile_map/public/tile_map_visualization_component.tsx +++ b/src/plugins/tile_map/public/tile_map_visualization_component.tsx @@ -22,6 +22,7 @@ import { EuiResizeObserver } from '@elastic/eui'; import { throttle } from 'lodash'; import { IInterpreterRenderHandlers } from 'src/plugins/expressions'; +import { PersistedState } from 'src/plugins/visualizations/public'; import { TileMapVisualizationDependencies } from './plugin'; import { TileMapVisConfig, TileMapVisData } from './types'; // @ts-expect-error @@ -51,6 +52,7 @@ const TileMapVisualization = ({ const chartDiv = useRef(null); const visController = useRef(null); const isFirstRender = useRef(true); + const uiState = handlers.uiState as PersistedState; useEffect(() => { if (chartDiv.current && isFirstRender.current) { @@ -69,12 +71,12 @@ const TileMapVisualization = ({ visController.current?.render().then(handlers.done); }; - handlers.uiState?.on('change', onUiStateChange); + uiState.on('change', onUiStateChange); return () => { - handlers.uiState?.off('change', onUiStateChange); + uiState.off('change', onUiStateChange); }; - }, [handlers]); + }, [uiState, handlers.done]); useEffect(() => { return () => { From d476215d12f924413ba872eb3c333e350287ff06 Mon Sep 17 00:00:00 2001 From: sulemanof Date: Mon, 21 Dec 2020 14:14:42 +0300 Subject: [PATCH 24/31] Fix interpreter functional tests --- .../interpreter_functional/snapshots/session/partial_test_2.json | 1 - .../interpreter_functional/snapshots/session/partial_test_3.json | 1 - 2 files changed, 2 deletions(-) delete mode 100644 test/interpreter_functional/snapshots/session/partial_test_2.json delete mode 100644 test/interpreter_functional/snapshots/session/partial_test_3.json diff --git a/test/interpreter_functional/snapshots/session/partial_test_2.json b/test/interpreter_functional/snapshots/session/partial_test_2.json deleted file mode 100644 index 2aa601a8d3631..0000000000000 --- a/test/interpreter_functional/snapshots/session/partial_test_2.json +++ /dev/null @@ -1 +0,0 @@ -{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":10000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":false,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/session/partial_test_3.json b/test/interpreter_functional/snapshots/session/partial_test_3.json deleted file mode 100644 index 595127526156e..0000000000000 --- a/test/interpreter_functional/snapshots/session/partial_test_3.json +++ /dev/null @@ -1 +0,0 @@ -{"as":"visualization","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"bucket":{"accessor":0},"metric":{"accessor":1,"format":{"id":"number"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"region_map"}} \ No newline at end of file From 9636a60d0e9a7156b491c1fff8da83534f71ff47 Mon Sep 17 00:00:00 2001 From: sulemanof Date: Mon, 21 Dec 2020 14:21:19 +0300 Subject: [PATCH 25/31] Fix interpreter functional tests --- .../snapshots/baseline/partial_test_3.json | 2 +- .../snapshots/session/partial_test_2.json | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 test/interpreter_functional/snapshots/session/partial_test_2.json diff --git a/test/interpreter_functional/snapshots/baseline/partial_test_3.json b/test/interpreter_functional/snapshots/baseline/partial_test_3.json index 7ec1f34673aac..a7761e86131bf 100644 --- a/test/interpreter_functional/snapshots/baseline/partial_test_3.json +++ b/test/interpreter_functional/snapshots/baseline/partial_test_3.json @@ -1 +1 @@ -{"as":"region_map_vis","type":"render","value":{"visConfig":{"bucket":{"accessor":0},"metric":{"accessor":1,"format":{"id":"number"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"region_map"}} +{"as":"region_map_vis","type":"render","value":{"visConfig":{"bucket":{"accessor":0},"metric":{"accessor":1,"format":{"id":"number"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"region_map"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/session/partial_test_2.json b/test/interpreter_functional/snapshots/session/partial_test_2.json new file mode 100644 index 0000000000000..2aa601a8d3631 --- /dev/null +++ b/test/interpreter_functional/snapshots/session/partial_test_2.json @@ -0,0 +1 @@ +{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":10000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":false,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file From dbd75e5ebbc6a1398af8fc6efe912ff37a85108f Mon Sep 17 00:00:00 2001 From: sulemanof Date: Tue, 22 Dec 2020 12:43:35 +0300 Subject: [PATCH 26/31] Update region map expression in tests --- src/plugins/expressions/public/render.ts | 2 +- .../maps_legacy/public/map/base_maps_visualization.js | 6 +++--- src/plugins/maps_legacy/public/map/kibana_map.js | 4 ++-- .../public/region_map_visualization_component.tsx | 6 +++--- .../snapshots/baseline/partial_test_3.json | 2 +- .../snapshots/session/partial_test_2.json | 1 - .../test_suites/run_pipeline/basic.ts | 2 +- 7 files changed, 11 insertions(+), 12 deletions(-) delete mode 100644 test/interpreter_functional/snapshots/session/partial_test_2.json diff --git a/src/plugins/expressions/public/render.ts b/src/plugins/expressions/public/render.ts index 717776a2861b4..a9364a28dacde 100644 --- a/src/plugins/expressions/public/render.ts +++ b/src/plugins/expressions/public/render.ts @@ -105,7 +105,7 @@ export class ExpressionRenderHandler { }; } - render = async (value: any, uiState: any = {}) => { + render = async (value: any, uiState: any) => { if (!value || typeof value !== 'object') { return this.handleRenderError(new Error('invalid data provided to the expression renderer')); } diff --git a/src/plugins/maps_legacy/public/map/base_maps_visualization.js b/src/plugins/maps_legacy/public/map/base_maps_visualization.js index 960e2843faaa1..f141642bce70c 100644 --- a/src/plugins/maps_legacy/public/map/base_maps_visualization.js +++ b/src/plugins/maps_legacy/public/map/base_maps_visualization.js @@ -84,7 +84,7 @@ export function BaseMapsVisualizationProvider() { } resize() { - this._kibanaMap.resize(); + this._kibanaMap?.resize(); } /** @@ -94,8 +94,8 @@ export function BaseMapsVisualizationProvider() { */ async _makeKibanaMap() { const options = {}; - const zoomFromUiState = parseInt(this.handlers.uiState.get('mapZoom')); - const centerFromUIState = this.handlers.uiState.get('mapCenter'); + const zoomFromUiState = parseInt(this.handlers.uiState?.get('mapZoom')); + const centerFromUIState = this.handlers.uiState?.get('mapCenter'); const { mapZoom, mapCenter } = this._getMapsParams(); options.zoom = !isNaN(zoomFromUiState) ? zoomFromUiState : mapZoom; options.center = centerFromUIState ? centerFromUIState : mapCenter; diff --git a/src/plugins/maps_legacy/public/map/kibana_map.js b/src/plugins/maps_legacy/public/map/kibana_map.js index 0a4290cbee68b..074c11e77b8a7 100644 --- a/src/plugins/maps_legacy/public/map/kibana_map.js +++ b/src/plugins/maps_legacy/public/map/kibana_map.js @@ -695,8 +695,8 @@ export class KibanaMap extends EventEmitter { } useUiStateFromVisualization(uiState) { - const zoomFromUiState = parseInt(uiState.get('mapZoom')); - const centerFromUIState = uiState.get('mapCenter'); + const zoomFromUiState = parseInt(uiState?.get('mapZoom')); + const centerFromUIState = uiState?.get('mapCenter'); if (!isNaN(zoomFromUiState)) { this.setZoomLevel(zoomFromUiState); } diff --git a/src/plugins/region_map/public/region_map_visualization_component.tsx b/src/plugins/region_map/public/region_map_visualization_component.tsx index 4e80c7e67c11b..7be210f953bf9 100644 --- a/src/plugins/region_map/public/region_map_visualization_component.tsx +++ b/src/plugins/region_map/public/region_map_visualization_component.tsx @@ -52,7 +52,7 @@ const RegionMapVisualization = ({ const chartDiv = useRef(null); const visController = useRef(null); const isFirstRender = useRef(true); - const uiState = handlers.uiState as PersistedState; + const uiState = handlers.uiState as PersistedState | undefined; useEffect(() => { if (chartDiv.current && isFirstRender.current) { @@ -71,10 +71,10 @@ const RegionMapVisualization = ({ visController.current?.render().then(handlers.done); }; - uiState.on('change', onUiStateChange); + uiState?.on('change', onUiStateChange); return () => { - uiState.off('change', onUiStateChange); + uiState?.off('change', onUiStateChange); }; }, [uiState, handlers.done]); diff --git a/test/interpreter_functional/snapshots/baseline/partial_test_3.json b/test/interpreter_functional/snapshots/baseline/partial_test_3.json index a7761e86131bf..2385b8628654d 100644 --- a/test/interpreter_functional/snapshots/baseline/partial_test_3.json +++ b/test/interpreter_functional/snapshots/baseline/partial_test_3.json @@ -1 +1 @@ -{"as":"region_map_vis","type":"render","value":{"visConfig":{"bucket":{"accessor":0},"metric":{"accessor":1,"format":{"id":"number"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"region_map"}} \ No newline at end of file +{"as":"region_map_vis","type":"render","value":{"visConfig":{"addTooltip":true,"bucket":{"accessor":0},"colorSchema":"Yellow to Red","isDisplayWarning":true,"legendPosition":"bottomright","mapCenter":[0,0],"mapZoom":2,"metric":{"accessor":1,"format":{"id":"number"}},"outlineWeight":1,"selectedJoinField":{},"selectedLayer":{},"showAllShapes":true,"wms":{}},"visData":{"columns":[],"meta":{},"rows":[],"type":"datatable"},"visType":"region_map"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/session/partial_test_2.json b/test/interpreter_functional/snapshots/session/partial_test_2.json deleted file mode 100644 index 2aa601a8d3631..0000000000000 --- a/test/interpreter_functional/snapshots/session/partial_test_2.json +++ /dev/null @@ -1 +0,0 @@ -{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":10000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":false,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/test_suites/run_pipeline/basic.ts b/test/interpreter_functional/test_suites/run_pipeline/basic.ts index fc7c0428631c6..6bd00b42502d0 100644 --- a/test/interpreter_functional/test_suites/run_pipeline/basic.ts +++ b/test/interpreter_functional/test_suites/run_pipeline/basic.ts @@ -110,7 +110,7 @@ export default function ({ await expectExpression('partial_test_2', metricExpr, context).toMatchSnapshot() ).toMatchScreenshot(); - const regionMapExpr = `regionmap visConfig='{"metric":{"accessor":1,"format":{"id":"number"}},"bucket":{"accessor":0}}'`; + const regionMapExpr = `regionmap visConfig='{"metric":{"accessor":1,"format":{"id":"number"}},"bucket":{"accessor":0},"legendPosition":"bottomright","addTooltip":true,"colorSchema":"Yellow to Red","isDisplayWarning":true,"wms":{},"mapZoom":2,"mapCenter":[0,0],"outlineWeight":1,"showAllShapes":true,"selectedLayer":{},"selectedJoinField":{}}'`; await ( await expectExpression('partial_test_3', regionMapExpr, context).toMatchSnapshot() ).toMatchScreenshot(); From db21ca898e85b2a895c3ca6c76b081a91a4b24dc Mon Sep 17 00:00:00 2001 From: sulemanof Date: Tue, 22 Dec 2020 12:57:18 +0300 Subject: [PATCH 27/31] Update types --- src/plugins/expressions/public/render.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/expressions/public/render.ts b/src/plugins/expressions/public/render.ts index a9364a28dacde..d16a8423c4d9e 100644 --- a/src/plugins/expressions/public/render.ts +++ b/src/plugins/expressions/public/render.ts @@ -105,7 +105,7 @@ export class ExpressionRenderHandler { }; } - render = async (value: any, uiState: any) => { + render = async (value: any, uiState?: any) => { if (!value || typeof value !== 'object') { return this.handleRenderError(new Error('invalid data provided to the expression renderer')); } From 95a5a8092661139d5bfb2390b5ccfb0e1967f27b Mon Sep 17 00:00:00 2001 From: sulemanof Date: Tue, 22 Dec 2020 16:00:22 +0300 Subject: [PATCH 28/31] Update snapshots --- .../interpreter_functional/snapshots/session/partial_test_2.json | 1 + .../interpreter_functional/snapshots/session/partial_test_3.json | 1 + 2 files changed, 2 insertions(+) create mode 100644 test/interpreter_functional/snapshots/session/partial_test_2.json create mode 100644 test/interpreter_functional/snapshots/session/partial_test_3.json diff --git a/test/interpreter_functional/snapshots/session/partial_test_2.json b/test/interpreter_functional/snapshots/session/partial_test_2.json new file mode 100644 index 0000000000000..2aa601a8d3631 --- /dev/null +++ b/test/interpreter_functional/snapshots/session/partial_test_2.json @@ -0,0 +1 @@ +{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":10000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":false,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/session/partial_test_3.json b/test/interpreter_functional/snapshots/session/partial_test_3.json new file mode 100644 index 0000000000000..2385b8628654d --- /dev/null +++ b/test/interpreter_functional/snapshots/session/partial_test_3.json @@ -0,0 +1 @@ +{"as":"region_map_vis","type":"render","value":{"visConfig":{"addTooltip":true,"bucket":{"accessor":0},"colorSchema":"Yellow to Red","isDisplayWarning":true,"legendPosition":"bottomright","mapCenter":[0,0],"mapZoom":2,"metric":{"accessor":1,"format":{"id":"number"}},"outlineWeight":1,"selectedJoinField":{},"selectedLayer":{},"showAllShapes":true,"wms":{}},"visData":{"columns":[],"meta":{},"rows":[],"type":"datatable"},"visType":"region_map"}} \ No newline at end of file From 4ffafcf386bf35aa0117e28b0579a734f52b54f9 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Tue, 22 Dec 2020 17:42:25 +0300 Subject: [PATCH 29/31] fix CI --- .../screenshots/baseline/partial_test_3.png | Bin 1994 -> 10749 bytes .../snapshots/baseline/partial_test_3.json | 2 +- .../snapshots/session/partial_test_3.json | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/interpreter_functional/screenshots/baseline/partial_test_3.png b/test/interpreter_functional/screenshots/baseline/partial_test_3.png index c43169bfb71014d53fe5cbdc7a75e82fc7f32a13..93a8e53540744bada4360e60a48df113aed0ca51 100644 GIT binary patch literal 10749 zcmeHtcTkgCw>KbFrHEZRh!AN95jY@SktQG@O^OO4O^9?u=paf5Y0{D21SJRp0py@` z3B40kLYJ1%OLBK4`kuM>oilgt{p*|W&HzL5?7jBdYyDP#LT+oR&>y{Ul#GmwUQP9e zE*Tl+Uu0zDg0$4&8!mE=4KgywC$$@jcb<|jH6F_x!hPE&%r3gg^=PH_Mo2HK*@q-` zv^8Qr+-go}9@i5V^$_R6B=oB;S5=>c^xy6=b)G2fd^>Um!pr;a1*?X189{E0fICP} zgX*SbW8v}~QPFrRwU-yc&pg5D#NmICBiui~QPZWqL42b2GUxaU)x)pOGsPT!b%m4r zaJ7}fjl)Oneyo%Co5RnOR@&EAI*gUe{BLQ#I6N+n{5K)zene5x<(bZ;rthD_jMz{P zbzZ42Pt%yKsJIw*urZV*3zvW**QnE^-INY*RV1XVjfStt{$6Tk5xzgCB2RjJH(gbB z2iqaiWLJEakRu{hWCG^`z7hqx7xWFWDu? zzdicsf~sr%(870nY_%3@W!&B_5Pe8~fxDb~{hBpdM{m9Nwfe3%RTIw+A5;`^7mo<| zdPe9wEiQTR9G>!~sMXGW@r?%;>7%2R0YbiRQ<|!2r9OUhX-uatu05pxj)A#9iFre? zKxoXNv7#zJ*5e@x-G4RLncHgmG)V~?LgmR04HK25kHsbr#TUnBPZ=mrHAj#bG|+!Y zZ`0>_#9&ZNJ5u>jws-Yo#J|RfGQJfAqy#lqEa43aGmi)tlRosLPp!{w`f9|Z!q5L!PK-F_yGC&L zN-DV^Y7aM~^EbT#0awqOKOCPrX{7TneYu@5KC+u8<`?g_=$GQVY z(#7>p8-EElbCV_6!a{>|xVdNJWu0IqX^Qm

Byj} z)o!o~1t|#yy8DH{qSg!Dc^lLvCD!SzVTVTp+}eNSv1Gq*wJul5_e=jb2BRVICyh_k zMJ=hVOnH*_4=6{9+o(_9aI9MrCNghlKmOqaN=E7o$)@BmMopd^Lt*Ha4U(bnN+^?V z_>aCYCq0O%RRi*iO$Y9c9Am^IjApt_(tuEI5Q$S6sRcD#TL|z=_woBXGP`rxC3Ig> zBvlTXzMG&byU<^F(q0`m^93R#^b7k5tQ#f&a%1)>zj5)~HU6&wwqUHUf7)fH^TFEp z&m|08l*!`uHvyw0We&CJL_O+CZOc*)GfLA{7c_e7M|JE>ccC61NiAJEF<&c0cMX7bybAf{p4 z{9lg~_;j`F_put-zXbS$VcYLmCXsN9v80zqtQ4k>Y~8VAk^UilQ})l~zhC9I>tnTlEw-25 zp5(1fLSK={{}5&WZ(GFw@Y28K_)l0QA@3jk$^Q`|+Qfe||NK8;|Af^4*g5`x4oHT> z;BPCg4q4MwqV2C@CB?le{@hRP>JS|!rA#>tDSFjYL3kIgtA`+&DBNPMA1*AihVbIc z6wKA>DDH_U(vqw8$LVs51br-O{grma#xWBNIdg9`1uu4&7>hYqvrazj$x`;(Z{wq+ zh%SKS-k|l5kN-uE29Pu1%%$Y&Dbm-tAn~|0)NcHPXatMoqs<>9OcefP7mwoo1up+es1?;i2&YvqQrtE((^Mb8I7=;9*t&^B);Roq=}JOLrgleL zSDg~v2i?11w_rEln~TYfqgCK0_YVN1xJjhmWPw`?D17zJp@isILqKRte3_`rO$Hb; z_{9*oDn&F97I|S!a*g^$U9g|PvnoQQGkNhBOU8a5391l9bs+NiqGGj+oY5pQzwUJx zD8=rm0^ppMiBsQD&pO0cBZP3q2=X@p3F>8b=~C!&$M}8pJyufi>mr8!gqOP9`i8O0 zlc90U{{IT^Cima`4)yw(dC!iW)jbR01r)M`N$FN^6=x6`*B>r}@RFh^d3+Fn1Q(^Q zdPxz9_PP)qBqM4bP zm6iReAF$~LoJ%ZUFSY}UXQssStUVXD=3MS9%1H#E5@Dg4hJ;kp^>9FvvB9csZz z&PC3(HVF_zqEK;Ei8d#$^%z&QY7mnuWDQEk%w*|z`^Jlytctjbt1&?2ts0aRAqt!# zXHF~nWikC^gOk$Yg@T3t^slN^5ReqTS)?a^8z@N%9|;$%|g0(T5nFsF?fRr-35B8ZF*Ebfo#4XX4etB|MDN`V8t{^XJd10$D{xp;i!K;hO|QPy}@7nwo|W3hV3Zmz0oj97j%C zZ`@~%Z0deJgq@Ydt5;(1+w~gT}^8URN4%tkcC}mHE*HejJPw5RAM`$~-~OIaA|%Y_DpiKWUhdGnJDQ9H^&{?^ z3dg%EH5^YVA-wgPdk6c8;l5rJjB-yTr`X{ys$FKWQxmnilla?GNwev`F{4_tQ@6~E zQa=@aSp5rsyvCI*P?+tbMttl!*LgB(GikpgHA~vIw)R*w9Lm7q^+(1oR(JYhm+aOp z;zPwmhWp*QNB*3~oNV2j5-2M#m)pKC$Cvt4n(B?@u;1wouvYkk4b%Gw{DdX)j#LP= z13$rVDd?jHije+Xg?<)!j2b&U+)`NF+dEjo@YD77dh|k}wXyQZ)r%1qPRCaDXGcneEnb~k)eP_pz1#+-t%b#tt?G+i7}$uVov;4#u|fo z-RADSbDq=hJ2MDeFp+vAwSlwxMA${i?b5(nI6SWAr~6zIpMXyushIE*v#VL!gl~VD zHpHP*t1;f&J@O!iHmp5wZ#!Oxy*twh%P7OOXP8^AMhhfiu>$?;>wPHa4ROgUP_)-k zA|q~Y-@9sqaotT((OX*$4Q;iE+1pa{R%kE#3y4Qw9xab=!3YO18L>5(wEGVQO>Nl& z!J)|~$Bv!#QE&XPc9P$y#ub8USfw%ddiSzOr05)w4~O?UBUTQ-ebVv6ngP4-ceSIB zz9fGcuU^67_i#@ieaB%Yd|G5p-8Sfnse~Y^(|85D){^mL3|ht)q=1IaZdx8B2*LJ4 z_}Yl#UTKhz0=29q79+3Q*OKA&*TB$tt9=>aS%A|N-)*zB54h5AGV7~6{jQBW)-Hq> zG{))5VREy{_R#O(*P`uZS!>Gf%vH3nFZnU2N!{vRN8Aa5}TEc*GnI^ca*KV zsgG4WARh8`K39#^4fDExeK%wBK2TP*$M%s^M71MnZpwAG>SPz%0+03K@oGG%`;T{A z@x?z+eX`$!5x3R-%d&x`&3h{<>+Aa=!e8A2WmfooMhH<60I0;>Kura<3NUzyyC=hTP1H;Llp z7bwfj1YHR;kCBj<%@GiRGEV4^Z8}!ZPd!(mmF%D${cx6JMH5Ze!qKEzHQpTGR62!2 z6}PhNwen-{R@x|+Lu;`go&J2LKo(5 zOoh;CJ9({SOReR|g|lr@F1{IxJI5nrQjw_`NR4?$mf^E|o(e#*-9Ua$K@<3^$M5xN zBCl=o`#5!BZ4DM-+|u&u`^GUwz7KJEmM zTyQ$Kx9q{GktjU9xW8HD;q2ZZRRO4)B#MXi$w&OHE?Xo6Ht^kBl#EIHh*E zCaT^#y`y~m=|OyIA3^D8*Mcv3eySG*mEk=X9*;>EdGJ9d?5uAa*YgeTmGA!70ch{n zavVg{YmD7CFjqAHH=LQ|N6O#NH`~N)HTWhYU%qUXc|u6Tqn$4;^5+o#8{k}htTXS z(1<`8QXPHbIoqv#Ew;kpgO*c|LEZpH2RZu13Hv|%0s)RPSCVF54prkAFmB7pBQV5l z=eK9p8DG1vGhp&e9H$aeN?$uo-86-NnGT10QNUvF;dy3L2cBQjRDZht`kSfqJan$V zkcWQAL3Ot4T6cx*$)nV%9%r_qo<<|}P;)KshfK9J8KY_vv1#o#Jy}wdd*;{W_I`+A zB}Sg|Fi5{;akvWw;~beT<;3H8m4#5PsfFTTA{j^IgL5<-{b{y+d5E1yDZSY(uZbuR z(T=ccoo?dao|xOStwehsud`r^kIj2KpT~mmDNbMrnoZvZUr4g9#zm$KdoI2y zD1=uX%$JV|SBzx|X%q0G3{oX$@8#>|M_x6p;vyzhU|ja+8tJDzzoxt#R+<#olcrS>rTTmg!kh>c_}uZn-95s`THVrXXfgtWBvK}4wdtlI#VPw z0v1c_0$#pkF0EdWMD8s=#(HKvxf~UFUJaZu=hEDU6mvO4)xhE{|7Fl5>b2qVEa%=+ zc9$Lcf_XLSxuM$!JR{XeF)HP1?q=CtCWkS{W&^fsxAnFh_xh}=%xtQZP15lPmaNW3 zA_mRC{SG?}rOo$R8A?pJTC%g@$nv+O!s3`SeDP9?C4GMED(vlG$~2v_jvugHpM%MO ztWG;By#=?qe!kyzXi3tk+ke7l_=#D2yZhITA%c=7(ItacuSNLdt!xfm-QHJSX&#w* z|3)cR5Fv-AV6F&7EO~K|jL4vxsRK>W`nX244Wyz7}z32X;#$HMm&f3N1 zf!0tDLCF(R-3DzHqIejmllWS6$JnYSTZvH#fvQslDJF2t$c@1G{F!LF%VMB>SV4GnMR`ml`3DMHTg5GXkoCpmSoT4D+gY5% zGf*BKeLog}tW1I4bP#*gnd30_<)nQJE8G910=Ls+tou95)qH z2H!yD1`qx?I$GiQWoX2=p)@Yu@X7XrhKCFNRs0ah>pZdD)Fyc_s_k&B?X7XMKicj- zo*w@mq>5OON_AI1rda^4bE%`8$O{!OZ-jCALplMTAO*!8Eh{8`_ujBgldezYWc{gI zg{iHXjo0VLR!o&>k*njB^<7cENHJng1VVu@GkT%d9BAtd@_+GfZ1k2RHIM~P#T(ws zHrZ<8e<51#0<-Q~nv6QaAQKM5%^-%@YhCcL1EX{kXnn%Xh|nGBt*CRKvn@IDz4EVA zj(7^l?L6dyMMZhP!gVzS5r?TlCYAU1Eg9csxsTea)OY#pEjRT`=C6G^sqMTI4Qih# zU%{`@P4IUEjMA%!gRR^=V*BQH<<#c!2H%S;!7WYj)VtCeT|EavW5{^I9lT- zA08m_#sqQM`R4?o9+WDVAGN*Y_1a(KyJ}y_PQ{mowbzpQ_UBPB_5oSkrIns{Q`MUb z9Z8ZaN8E=WT-z)djzIQgb6D*y`F;XfX}RD5s`drmddq6eq3ZShSWSt%qJ?92_T8D} z;<8sBQBnm`Gv&?2 zI*pdp(k(|MUfoU_TQGGFMlgF^-gXl+A!%`n>OZmdS9`&*w2nOLOdVJ`4j9;0-pau3WTBE)F?~ckAA)_wUzol&TyzihX&wij$?ZLj}*)o2|T}Dzi6K7WdUXP+&)n`;ckzO zoF53Rt9756OILAjF>8`qin|wM2r6#NNZAk^N?^U68GvnbqMq?%Lrn?lJ@|bRcB7TV-Up&#qqgZHthc zY>pVBw>;P|=_&Z|ipP_+#T;(%1SFZFU@UH&-rFm2oYj?zm|%6_8j*~1@R@32DY|@K zF2Fj2T?JjUSlS`llKzR&_k%bBou;V>s`p5#&5K>~1i@yxE1|N!STRqIvDn0W_>;%Z z3S*v+xmxUwi51xX6|21#MRkmS%n4pvhksOx^kRY?ba8Z^PTb6|v@fek1*!1ngf%oY zEbRP2t;)R1ZrfG6JGT@QWjCjT&@E3;t0(p=7PVXVCYpHWfRtH%$9s_5y1Zd$MII?H z5&BBQ*$9-pyuAJEO%9baaecmDzCCB}{L)Ythzvp1E1+p`a>T5u*B$regY`CTy0<5* zKsF5bNN|5$PfNO5M1KF<;JDAM>@6=lRxogF)!vl#>(iEvk#d=N*)iQ(yIO9~Ke?vj zIsuooyS5aL;J4nWeARLM zMG^v?>oUt$0LHGwqRj7@u+>-IS-rOe?b>pbcCE|y>jq473UsP@F?h`lID*}I>&F{` z4E>c|()8z^e9L`Y@hv#~=~qSU42lp9!iRK5>E4gee?7~%vQ~ZeoY#ml64xc@Q@%o; z>a!5inIx8IDy-t*ttFoXWa_#3XDWyj`5q;@``F>HOsG{oG#M>Yx*SsUy!3Tdz~ zF1;WTRJXY!HO1~7J-Xbm0M*(Za2f}`;o9Q{HdxF0LL=I&*2xvcQ$1DsE!Dlf z%;+@N!Lbfe%jV-hn|JnFi-T_p-+=0wSSjO17kyv5j4%-2#AyWH0pwNi3fsP9YI^7X z3Y(r;uQil!Z;{n8gHJRZowF;xzOhS{V+kNZHPQiDS3U^hL;>d&>P>#%o1A>fL{Us^ z>fg%1Gc1i&@jyWp44X|ezU8$E>yj&GByItjiy*4M5Zd$lI^0ejBDy#+@)#s|{rSKF zSb$c?h-+U&p)J^G3o=^J#S=uOO09s6_7=yz(zN9d!oeF$Qy>?*SO(gUwJR)|C>|e0 zO;8A)LdvfksV~?KsC1Cb&I2MPzQzOfO;HE!gn}jT&cIJ=di$-W|2dJ2Nd0yIy@XK) zn5Ng?t%(CZEX93kRQKJUV`ti)T#93jXmL@E^ctwdANRPs*d; zPA`_$3Ul~upLlckeGaJML1f)oZHglHG<32p{(jQ7wC};#odmBPUZRVAubH-cW|DwU z023U2Vn;PE)4L}zKd)Tb@&VK{SG*{s<|1w0|C6;%BU=)-EDvpu@ z;?0S_@$aV-Ox_BzNmt~ThK7dPfERA47Rx3>JSK8D{y?3adKGW~oB((JeOQ-U#h!YjqX`d_8^r&kN3g z2OSg8%O;e40PSAz&R>l3VF#O_JzCdM`cMb)XtAec#Is=8eWhH$esm_qA#`DA+031{ u*x4%(yuL^pJb4fOx8D8vhgm&d-r^P^<)h8zX7E}knVPcJjZ&ri0sjGm`U?U8 literal 1994 zcmeAS@N?(olHy`uVBq!ia0y~yU^&FVz^KE)1{6_bl>f@Wz&_E_#WAFU@$JDz#sdlr zObXBc+i!p8@xVG9sD$A`AuovH$pDcF4$L5mSqel-TmX>=8bBs7u$h2Jg9VI0vVn0_ z%V>y=CYaIuGFn^!i^I{<5*P@hl?5;mh^;H@SWDPK_W9mV0P11zboFyt=akR{0B(}e AN&o-= diff --git a/test/interpreter_functional/snapshots/baseline/partial_test_3.json b/test/interpreter_functional/snapshots/baseline/partial_test_3.json index 2385b8628654d..e011b69de2022 100644 --- a/test/interpreter_functional/snapshots/baseline/partial_test_3.json +++ b/test/interpreter_functional/snapshots/baseline/partial_test_3.json @@ -1 +1 @@ -{"as":"region_map_vis","type":"render","value":{"visConfig":{"addTooltip":true,"bucket":{"accessor":0},"colorSchema":"Yellow to Red","isDisplayWarning":true,"legendPosition":"bottomright","mapCenter":[0,0],"mapZoom":2,"metric":{"accessor":1,"format":{"id":"number"}},"outlineWeight":1,"selectedJoinField":{},"selectedLayer":{},"showAllShapes":true,"wms":{}},"visData":{"columns":[],"meta":{},"rows":[],"type":"datatable"},"visType":"region_map"}} \ No newline at end of file +{"as":"region_map_vis","type":"render","value":{"visConfig":{"addTooltip":true,"bucket":{"accessor":0},"colorSchema":"Yellow to Red","isDisplayWarning":true,"legendPosition":"bottomright","mapCenter":[0,0],"mapZoom":2,"metric":{"accessor":1,"format":{"id":"number"}},"outlineWeight":1,"selectedJoinField":{},"selectedLayer":{},"showAllShapes":true,"wms":{}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"region_map"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/session/partial_test_3.json b/test/interpreter_functional/snapshots/session/partial_test_3.json index 2385b8628654d..e011b69de2022 100644 --- a/test/interpreter_functional/snapshots/session/partial_test_3.json +++ b/test/interpreter_functional/snapshots/session/partial_test_3.json @@ -1 +1 @@ -{"as":"region_map_vis","type":"render","value":{"visConfig":{"addTooltip":true,"bucket":{"accessor":0},"colorSchema":"Yellow to Red","isDisplayWarning":true,"legendPosition":"bottomright","mapCenter":[0,0],"mapZoom":2,"metric":{"accessor":1,"format":{"id":"number"}},"outlineWeight":1,"selectedJoinField":{},"selectedLayer":{},"showAllShapes":true,"wms":{}},"visData":{"columns":[],"meta":{},"rows":[],"type":"datatable"},"visType":"region_map"}} \ No newline at end of file +{"as":"region_map_vis","type":"render","value":{"visConfig":{"addTooltip":true,"bucket":{"accessor":0},"colorSchema":"Yellow to Red","isDisplayWarning":true,"legendPosition":"bottomright","mapCenter":[0,0],"mapZoom":2,"metric":{"accessor":1,"format":{"id":"number"}},"outlineWeight":1,"selectedJoinField":{},"selectedLayer":{},"showAllShapes":true,"wms":{}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"region_map"}} \ No newline at end of file From c216dc4731b1c37f9a479dbc617bbc1077daf438 Mon Sep 17 00:00:00 2001 From: Daniil Suleiman Date: Tue, 12 Jan 2021 10:57:31 +0300 Subject: [PATCH 30/31] Update files structure --- src/plugins/maps_legacy/public/map/base_maps_visualization.js | 2 +- .../map/{decode_geo_hash.test.ts => geohash_columns.test.ts} | 2 +- .../public/map/{decode_geo_hash.ts => geohash_columns.ts} | 0 src/plugins/maps_legacy/public/map/precision.ts | 2 +- src/plugins/maps_legacy/public/map/zoom_to_precision.ts | 2 +- src/plugins/region_map/public/region_map_type.ts | 4 +++- src/plugins/tile_map/public/tile_map_type.ts | 2 +- 7 files changed, 8 insertions(+), 6 deletions(-) rename src/plugins/maps_legacy/public/map/{decode_geo_hash.test.ts => geohash_columns.test.ts} (95%) rename src/plugins/maps_legacy/public/map/{decode_geo_hash.ts => geohash_columns.ts} (100%) diff --git a/src/plugins/maps_legacy/public/map/base_maps_visualization.js b/src/plugins/maps_legacy/public/map/base_maps_visualization.js index f141642bce70c..39612a1b60240 100644 --- a/src/plugins/maps_legacy/public/map/base_maps_visualization.js +++ b/src/plugins/maps_legacy/public/map/base_maps_visualization.js @@ -70,7 +70,7 @@ export function BaseMapsVisualizationProvider() { return; } - this._kibanaMap.resize(); + this.resize(); this._params = visParams; await this._updateParams(); diff --git a/src/plugins/maps_legacy/public/map/decode_geo_hash.test.ts b/src/plugins/maps_legacy/public/map/geohash_columns.test.ts similarity index 95% rename from src/plugins/maps_legacy/public/map/decode_geo_hash.test.ts rename to src/plugins/maps_legacy/public/map/geohash_columns.test.ts index dcd8c93bd0553..e2a8eb575a9e2 100644 --- a/src/plugins/maps_legacy/public/map/decode_geo_hash.test.ts +++ b/src/plugins/maps_legacy/public/map/geohash_columns.test.ts @@ -17,7 +17,7 @@ * under the License. */ -import { geohashColumns } from './decode_geo_hash'; +import { geohashColumns } from './geohash_columns'; test('geohashColumns', () => { expect(geohashColumns(1)).toBe(8); diff --git a/src/plugins/maps_legacy/public/map/decode_geo_hash.ts b/src/plugins/maps_legacy/public/map/geohash_columns.ts similarity index 100% rename from src/plugins/maps_legacy/public/map/decode_geo_hash.ts rename to src/plugins/maps_legacy/public/map/geohash_columns.ts diff --git a/src/plugins/maps_legacy/public/map/precision.ts b/src/plugins/maps_legacy/public/map/precision.ts index a1b3b72f201a4..3dafd0813a174 100644 --- a/src/plugins/maps_legacy/public/map/precision.ts +++ b/src/plugins/maps_legacy/public/map/precision.ts @@ -19,7 +19,7 @@ // @ts-ignore import { getUiSettings } from '../kibana_services'; -import { geohashColumns } from './decode_geo_hash'; +import { geohashColumns } from './geohash_columns'; /** * Get the number of geohash columns (world-wide) for a given precision diff --git a/src/plugins/maps_legacy/public/map/zoom_to_precision.ts b/src/plugins/maps_legacy/public/map/zoom_to_precision.ts index 552c509590286..abad0a730a12d 100644 --- a/src/plugins/maps_legacy/public/map/zoom_to_precision.ts +++ b/src/plugins/maps_legacy/public/map/zoom_to_precision.ts @@ -17,7 +17,7 @@ * under the License. */ -import { geohashColumns } from './decode_geo_hash'; +import { geohashColumns } from './geohash_columns'; const defaultMaxPrecision = 12; const minGeoHashPixels = 16; diff --git a/src/plugins/region_map/public/region_map_type.ts b/src/plugins/region_map/public/region_map_type.ts index 4bcdea34033a7..1603cfc1e2c0c 100644 --- a/src/plugins/region_map/public/region_map_type.ts +++ b/src/plugins/region_map/public/region_map_type.ts @@ -17,15 +17,17 @@ * under the License. */ import { i18n } from '@kbn/i18n'; -import { mapToLayerWithId } from './util'; + import { BaseVisTypeOptions } from '../../visualizations/public'; import { truncatedColorSchemas } from '../../charts/public'; import { ORIGIN } from '../../maps_legacy/public'; + import { getDeprecationMessage } from './get_deprecation_message'; import { RegionMapVisualizationDependencies } from './plugin'; import { createRegionMapOptions } from './components'; import { toExpressionAst } from './to_ast'; import { RegionMapVisParams } from './region_map_types'; +import { mapToLayerWithId } from './util'; export function createRegionMapTypeDefinition({ uiSettings, diff --git a/src/plugins/tile_map/public/tile_map_type.ts b/src/plugins/tile_map/public/tile_map_type.ts index 406c3f2bc5133..e1d0dfb9a116f 100644 --- a/src/plugins/tile_map/public/tile_map_type.ts +++ b/src/plugins/tile_map/public/tile_map_type.ts @@ -18,7 +18,7 @@ */ import { i18n } from '@kbn/i18n'; -import { convertToGeoJson, MapTypes } from '../../maps_legacy/public'; +import { BaseVisTypeOptions } from 'src/plugins/visualizations/public'; import { truncatedColorSchemas } from '../../charts/public'; // @ts-expect-error From 3266772d6dd4c7dbbc9167e46f00e8bc7019af4d Mon Sep 17 00:00:00 2001 From: Daniil Suleiman Date: Wed, 13 Jan 2021 19:21:18 +0300 Subject: [PATCH 31/31] Use types from geojson --- src/plugins/tile_map/public/types.ts | 22 ++----------------- .../public/utils/convert_to_geojson.ts | 7 +++--- 2 files changed, 6 insertions(+), 23 deletions(-) diff --git a/src/plugins/tile_map/public/types.ts b/src/plugins/tile_map/public/types.ts index 95459cf86908b..360e0c474b21c 100644 --- a/src/plugins/tile_map/public/types.ts +++ b/src/plugins/tile_map/public/types.ts @@ -17,32 +17,14 @@ * under the License. */ +import { FeatureCollection } from 'geojson'; import type { SchemaConfig } from 'src/plugins/visualizations/public'; import type { DatatableColumnMeta } from 'src/plugins/expressions'; import type { WMSOptions } from 'src/plugins/maps_legacy/public'; import type { MapTypes } from './utils/map_types'; -export interface Feature { - type: 'Feature'; - geometry: { - type: 'Point'; - coordinates: [number, number]; - }; - properties: { - geohash: string; - geohash_meta: { - center: [number, number]; - rectangle: Array<[number, number]>; - }; - value: number; - }; -} - export interface TileMapVisData { - featureCollection: { - type: 'FeatureCollection'; - features: Feature[]; - }; + featureCollection: FeatureCollection; meta: { min: number; max: number; diff --git a/src/plugins/tile_map/public/utils/convert_to_geojson.ts b/src/plugins/tile_map/public/utils/convert_to_geojson.ts index e6c60e5309914..34fa0d8d4a6c0 100644 --- a/src/plugins/tile_map/public/utils/convert_to_geojson.ts +++ b/src/plugins/tile_map/public/utils/convert_to_geojson.ts @@ -17,8 +17,9 @@ * under the License. */ +import { Feature } from 'geojson'; import type { Datatable } from '../../../expressions/public'; -import type { Feature, TileMapVisDimensions, TileMapVisData } from '../types'; +import type { TileMapVisDimensions, TileMapVisData } from '../types'; import { decodeGeoHash } from './decode_geo_hash'; import { gridDimensions } from './grid_dimensions'; @@ -46,7 +47,7 @@ export function convertToGeoJson( if (!geohashValue) return false; const geohashLocation = decodeGeoHash(geohashValue); - let pointCoordinates; + let pointCoordinates: number[]; if (geocentroidColumn) { const location = row[geocentroidColumn.id]; pointCoordinates = [location.lon, location.lat]; @@ -95,7 +96,7 @@ export function convertToGeoJson( }, value, }, - }; + } as Feature; }) .filter((row): row is Feature => !!row); }