diff --git a/src/legacy/core_plugins/kibana/public/discover/kibana_services.ts b/src/legacy/core_plugins/kibana/public/discover/kibana_services.ts index 7a3a6949baa94c..e1ff2749112848 100644 --- a/src/legacy/core_plugins/kibana/public/discover/kibana_services.ts +++ b/src/legacy/core_plugins/kibana/public/discover/kibana_services.ts @@ -75,6 +75,5 @@ export { EsQuerySortValue, SortDirection, } from '../../../../../plugins/data/public'; -export { getFormat } from 'ui/visualize/loader/pipeline_helpers/utilities'; // @ts-ignore export { buildPointSeriesData } from 'ui/agg_response/point_series/point_series'; diff --git a/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/response_handler.js b/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/response_handler.js index e49f43a443719d..0c19c108415356 100644 --- a/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/response_handler.js +++ b/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/response_handler.js @@ -17,7 +17,7 @@ * under the License. */ -import { buildPointSeriesData, getFormat } from '../../kibana_services'; +import { buildPointSeriesData, getServices } from '../../kibana_services'; function tableResponseHandler(table, dimensions) { const converted = { tables: [] }; @@ -26,7 +26,7 @@ function tableResponseHandler(table, dimensions) { if (split) { converted.direction = dimensions.splitRow ? 'row' : 'column'; const splitColumnIndex = split[0].accessor; - const splitColumnFormatter = getFormat(split[0].format); + const splitColumnFormatter = getServices().data.fieldFormats.deserialize(split[0].format); const splitColumn = table.columns[splitColumnIndex]; const splitMap = {}; let splitIndex = 0; diff --git a/src/legacy/core_plugins/vis_type_metric/public/components/__snapshots__/metric_vis_component.test.tsx.snap b/src/legacy/core_plugins/vis_type_metric/public/components/__snapshots__/metric_vis_component.test.tsx.snap index d84424cc6179a6..47ca3f1e0465e4 100644 --- a/src/legacy/core_plugins/vis_type_metric/public/components/__snapshots__/metric_vis_component.test.tsx.snap +++ b/src/legacy/core_plugins/vis_type_metric/public/components/__snapshots__/metric_vis_component.test.tsx.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`MetricVisComponent should render correct structure for single metric 1`] = ` +exports[`MetricVisComponent should render correct structure for multi-value metrics 1`] = `
@@ -10,45 +10,45 @@ exports[`MetricVisComponent should render correct structure for single metric 1` Object { "bgColor": undefined, "color": undefined, - "label": "Count", + "label": "1st percentile of bytes", "lightText": false, "rowIndex": 0, - "value": "4301021", + "value": 182, } } showLabel={true} /> -
-`; - -exports[`MetricVisComponent should render correct structure for multi-value metrics 1`] = ` -
182", + "value": 445842.4634666484, } } showLabel={true} /> +
+`; + +exports[`MetricVisComponent should render correct structure for single metric 1`] = ` +
445842.4634666484", + "value": 4301021, } } showLabel={true} diff --git a/src/legacy/core_plugins/vis_type_metric/public/components/metric_vis_component.test.tsx b/src/legacy/core_plugins/vis_type_metric/public/components/metric_vis_component.test.tsx index 7ba4fe017522d3..00e8df2f0f9363 100644 --- a/src/legacy/core_plugins/vis_type_metric/public/components/metric_vis_component.test.tsx +++ b/src/legacy/core_plugins/vis_type_metric/public/components/metric_vis_component.test.tsx @@ -21,13 +21,17 @@ import React from 'react'; import { shallow } from 'enzyme'; import { MetricVisComponent, MetricVisComponentProps } from './metric_vis_component'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { npStart } from 'ui/new_platform'; -import { fieldFormats } from '../../../../../plugins/data/public'; -import { identity } from 'lodash'; import { ExprVis } from '../../../visualizations/public/np_ready/public/expressions/vis'; -jest.mock('ui/new_platform'); +jest.mock('../services', () => ({ + getFormatService: () => ({ + deserialize: () => { + return { + convert: (x: unknown) => x, + }; + }, + }), +})); type Props = MetricVisComponentProps; @@ -66,12 +70,6 @@ describe('MetricVisComponent', function() { return shallow(); }; - beforeAll(() => { - (npStart.plugins.data.fieldFormats.deserialize as jest.Mock).mockImplementation(() => { - return new (fieldFormats.FieldFormat.from(identity))(); - }); - }); - it('should render component', () => { expect(getComponent().exists()).toBe(true); }); diff --git a/src/legacy/core_plugins/vis_type_metric/public/components/metric_vis_component.tsx b/src/legacy/core_plugins/vis_type_metric/public/components/metric_vis_component.tsx index 175458497a05e8..3fca1df92eacb0 100644 --- a/src/legacy/core_plugins/vis_type_metric/public/components/metric_vis_component.tsx +++ b/src/legacy/core_plugins/vis_type_metric/public/components/metric_vis_component.tsx @@ -20,13 +20,13 @@ import { last, findIndex, isNaN } from 'lodash'; import React, { Component } from 'react'; import { isColorDark } from '@elastic/eui'; -import { getFormat } from '../legacy_imports'; import { MetricVisValue } from './metric_vis_value'; import { Input } from '../metric_vis_fn'; import { FieldFormatsContentType, IFieldFormat } from '../../../../../plugins/data/public'; import { KibanaDatatable } from '../../../../../plugins/expressions/public'; import { getHeatmapColors } from '../../../../../plugins/charts/public'; import { VisParams, MetricVisMetric } from '../types'; +import { getFormatService } from '../services'; import { SchemaConfig } from '../../../visualizations/public'; import { ExprVis } from '../../../visualizations/public/np_ready/public/expressions/vis'; @@ -122,13 +122,13 @@ export class MetricVisComponent extends Component { if (dimensions.bucket) { bucketColumnId = table.columns[dimensions.bucket.accessor].id; - bucketFormatter = getFormat(dimensions.bucket.format); + bucketFormatter = getFormatService().deserialize(dimensions.bucket.format); } dimensions.metrics.forEach((metric: SchemaConfig) => { const columnIndex = metric.accessor; const column = table?.columns[columnIndex]; - const formatter = getFormat(metric.format); + const formatter = getFormatService().deserialize(metric.format); table.rows.forEach((row, rowIndex) => { let title = column.name; let value: any = row[column.id]; diff --git a/src/legacy/core_plugins/vis_type_metric/public/legacy.ts b/src/legacy/core_plugins/vis_type_metric/public/legacy.ts index 87355c57926b6f..5fc2e48609d4bc 100644 --- a/src/legacy/core_plugins/vis_type_metric/public/legacy.ts +++ b/src/legacy/core_plugins/vis_type_metric/public/legacy.ts @@ -33,4 +33,4 @@ const plugins: Readonly = { const pluginInstance = plugin({} as PluginInitializerContext); export const setup = pluginInstance.setup(npSetup.core, plugins); -export const start = pluginInstance.start(npStart.core); +export const start = pluginInstance.start(npStart.core, { data: npStart.plugins.data }); diff --git a/src/legacy/core_plugins/vis_type_metric/public/metric_vis_type.test.ts b/src/legacy/core_plugins/vis_type_metric/public/metric_vis_type.test.ts index c0bfa47bff5023..2a5478f23e8509 100644 --- a/src/legacy/core_plugins/vis_type_metric/public/metric_vis_type.test.ts +++ b/src/legacy/core_plugins/vis_type_metric/public/metric_vis_type.test.ts @@ -20,14 +20,11 @@ import $ from 'jquery'; // TODO This is an integration test and thus requires a running platform. When moving to the new platform, -// this test has to be migrated to the newly created integration test environment. -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { npStart } from 'ui/new_platform'; +// this test has to be migrated to a real unit test. // @ts-ignore import getStubIndexPattern from 'fixtures/stubbed_logstash_index_pattern'; import { Vis } from '../../visualizations/public'; -import { fieldFormats } from '../../../../plugins/data/public'; import { setup as visualizationsSetup, start as visualizationsStart, @@ -36,6 +33,16 @@ import { createMetricVisTypeDefinition } from './metric_vis_type'; jest.mock('ui/new_platform'); +jest.mock('./services', () => ({ + getFormatService: () => ({ + deserialize: () => { + return { + convert: (x: unknown) => `ip[${x}]`, + }; + }, + }), +})); + jest.mock('../../vis_default_editor/public', () => ({ Schemas: class {}, })); @@ -45,12 +52,6 @@ describe('metric_vis - createMetricVisTypeDefinition', () => { beforeAll(() => { visualizationsSetup.createReactVisualization(createMetricVisTypeDefinition()); - (npStart.plugins.data.fieldFormats.getType as jest.Mock).mockImplementation(() => { - return fieldFormats.UrlFormat; - }); - (npStart.plugins.data.fieldFormats.deserialize as jest.Mock).mockImplementation(mapping => { - return new fieldFormats.UrlFormat(mapping ? mapping.params : {}); - }); }); const setup = () => { diff --git a/src/legacy/core_plugins/vis_type_metric/public/plugin.ts b/src/legacy/core_plugins/vis_type_metric/public/plugin.ts index 28b435cbc79807..1c3e1568f4de25 100644 --- a/src/legacy/core_plugins/vis_type_metric/public/plugin.ts +++ b/src/legacy/core_plugins/vis_type_metric/public/plugin.ts @@ -24,6 +24,8 @@ import { VisualizationsSetup } from '../../visualizations/public'; import { createMetricVisFn } from './metric_vis_fn'; import { createMetricVisTypeDefinition } from './metric_vis_type'; import { ChartsPluginSetup } from '../../../../plugins/charts/public'; +import { DataPublicPluginStart } from '../../../../plugins/data/public'; +import { setFormatService } from './services'; /** @internal */ export interface MetricVisPluginSetupDependencies { @@ -32,6 +34,11 @@ export interface MetricVisPluginSetupDependencies { charts: ChartsPluginSetup; } +/** @internal */ +export interface MetricVisPluginStartDependencies { + data: DataPublicPluginStart; +} + /** @internal */ export class MetricVisPlugin implements Plugin { initializerContext: PluginInitializerContext; @@ -48,7 +55,7 @@ export class MetricVisPlugin implements Plugin { visualizations.createReactVisualization(createMetricVisTypeDefinition()); } - public start(core: CoreStart) { - // nothing to do here yet + public start(core: CoreStart, { data }: MetricVisPluginStartDependencies) { + setFormatService(data.fieldFormats); } } diff --git a/src/legacy/core_plugins/vis_type_metric/public/services.ts b/src/legacy/core_plugins/vis_type_metric/public/services.ts new file mode 100644 index 00000000000000..5af11bc7f0b039 --- /dev/null +++ b/src/legacy/core_plugins/vis_type_metric/public/services.ts @@ -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 { createGetterSetter } from '../../../../plugins/kibana_utils/common'; +import { DataPublicPluginStart } from '../../../../plugins/data/public'; + +export const [getFormatService, setFormatService] = createGetterSetter< + DataPublicPluginStart['fieldFormats'] +>('metric data.fieldFormats'); diff --git a/src/legacy/core_plugins/vis_type_table/public/agg_table/agg_table.js b/src/legacy/core_plugins/vis_type_table/public/agg_table/agg_table.js index 83d7ca4084a202..b9e79f96e4fc13 100644 --- a/src/legacy/core_plugins/vis_type_table/public/agg_table/agg_table.js +++ b/src/legacy/core_plugins/vis_type_table/public/agg_table/agg_table.js @@ -18,7 +18,7 @@ */ import _ from 'lodash'; import aggTableTemplate from './agg_table.html'; -import { getFormat } from '../legacy_imports'; +import { getFormatService } from '../services'; import { i18n } from '@kbn/i18n'; export function KbnAggTable(config, RecursionHelper) { @@ -127,7 +127,7 @@ export function KbnAggTable(config, RecursionHelper) { if (!dimension) return; - const formatter = getFormat(dimension.format); + const formatter = getFormatService().deserialize(dimension.format); const formattedColumn = { id: col.id, @@ -247,7 +247,7 @@ export function KbnAggTable(config, RecursionHelper) { function addPercentageCol(columns, title, rows, insertAtIndex) { const { id, sumTotal } = columns[insertAtIndex]; const newId = `${id}-percents`; - const formatter = getFormat({ id: 'percent' }); + const formatter = getFormatService().deserialize({ id: 'percent' }); const i18nTitle = i18n.translate('visTypeTable.params.percentageTableColumnName', { defaultMessage: '{title} percentages', values: { title }, diff --git a/src/legacy/core_plugins/vis_type_table/public/legacy.ts b/src/legacy/core_plugins/vis_type_table/public/legacy.ts index e5b2619ef29702..30403139d212d9 100644 --- a/src/legacy/core_plugins/vis_type_table/public/legacy.ts +++ b/src/legacy/core_plugins/vis_type_table/public/legacy.ts @@ -32,4 +32,4 @@ const plugins: Readonly = { const pluginInstance = plugin({} as PluginInitializerContext); export const setup = pluginInstance.setup(npSetup.core, plugins); -export const start = pluginInstance.start(npStart.core); +export const start = pluginInstance.start(npStart.core, { data: npStart.plugins.data }); diff --git a/src/legacy/core_plugins/vis_type_table/public/legacy_imports.ts b/src/legacy/core_plugins/vis_type_table/public/legacy_imports.ts index 287b6c172ffd94..1030e971d64504 100644 --- a/src/legacy/core_plugins/vis_type_table/public/legacy_imports.ts +++ b/src/legacy/core_plugins/vis_type_table/public/legacy_imports.ts @@ -18,4 +18,3 @@ */ export { npSetup, npStart } from 'ui/new_platform'; -export { getFormat } from 'ui/visualize/loader/pipeline_helpers/utilities'; diff --git a/src/legacy/core_plugins/vis_type_table/public/plugin.ts b/src/legacy/core_plugins/vis_type_table/public/plugin.ts index 519a56da23ac9b..42bd36c83e28c5 100644 --- a/src/legacy/core_plugins/vis_type_table/public/plugin.ts +++ b/src/legacy/core_plugins/vis_type_table/public/plugin.ts @@ -23,6 +23,8 @@ import { PluginInitializerContext, CoreSetup, CoreStart, Plugin } from '../../.. import { createTableVisFn } from './table_vis_fn'; import { tableVisTypeDefinition } from './table_vis_type'; +import { DataPublicPluginStart } from '../../../../plugins/data/public'; +import { setFormatService } from './services'; /** @internal */ export interface TablePluginSetupDependencies { @@ -30,6 +32,11 @@ export interface TablePluginSetupDependencies { visualizations: VisualizationsSetup; } +/** @internal */ +export interface TablePluginStartDependencies { + data: DataPublicPluginStart; +} + /** @internal */ export class TableVisPlugin implements Plugin, void> { initializerContext: PluginInitializerContext; @@ -47,7 +54,7 @@ export class TableVisPlugin implements Plugin, void> { visualizations.createBaseVisualization(tableVisTypeDefinition); } - public start(core: CoreStart) { - // nothing to do here yet + public start(core: CoreStart, { data }: TablePluginStartDependencies) { + setFormatService(data.fieldFormats); } } diff --git a/src/legacy/core_plugins/vis_type_tagcloud/public/legacy_imports.ts b/src/legacy/core_plugins/vis_type_table/public/services.ts similarity index 73% rename from src/legacy/core_plugins/vis_type_tagcloud/public/legacy_imports.ts rename to src/legacy/core_plugins/vis_type_table/public/services.ts index cd7a8e740d85d8..08efed733cafe5 100644 --- a/src/legacy/core_plugins/vis_type_tagcloud/public/legacy_imports.ts +++ b/src/legacy/core_plugins/vis_type_table/public/services.ts @@ -17,4 +17,9 @@ * under the License. */ -export { getFormat } from 'ui/visualize/loader/pipeline_helpers/utilities'; +import { createGetterSetter } from '../../../../plugins/kibana_utils/common'; +import { DataPublicPluginStart } from '../../../../plugins/data/public'; + +export const [getFormatService, setFormatService] = createGetterSetter< + DataPublicPluginStart['fieldFormats'] +>('table data.fieldFormats'); diff --git a/src/legacy/core_plugins/vis_type_table/public/table_vis_response_handler.ts b/src/legacy/core_plugins/vis_type_table/public/table_vis_response_handler.ts index 426480fa5b52de..4bf33c876dfff9 100644 --- a/src/legacy/core_plugins/vis_type_table/public/table_vis_response_handler.ts +++ b/src/legacy/core_plugins/vis_type_table/public/table_vis_response_handler.ts @@ -19,7 +19,7 @@ import { Required } from '@kbn/utility-types'; -import { getFormat } from './legacy_imports'; +import { getFormatService } from './services'; import { Input } from './table_vis_fn'; export interface TableContext { @@ -54,7 +54,7 @@ export function tableVisResponseHandler(table: Input, dimensions: any): TableCon if (split) { converted.direction = dimensions.splitRow ? 'row' : 'column'; const splitColumnIndex = split[0].accessor; - const splitColumnFormatter = getFormat(split[0].format); + const splitColumnFormatter = getFormatService().deserialize(split[0].format); const splitColumn = table.columns[splitColumnIndex]; const splitMap = {}; let splitIndex = 0; diff --git a/src/legacy/core_plugins/vis_type_tagcloud/public/components/tag_cloud_visualization.js b/src/legacy/core_plugins/vis_type_tagcloud/public/components/tag_cloud_visualization.js index 04f447bf78d505..4094f2ab591588 100644 --- a/src/legacy/core_plugins/vis_type_tagcloud/public/components/tag_cloud_visualization.js +++ b/src/legacy/core_plugins/vis_type_tagcloud/public/components/tag_cloud_visualization.js @@ -23,7 +23,7 @@ import { take } from 'rxjs/operators'; import { render, unmountComponentAtNode } from 'react-dom'; import { I18nProvider } from '@kbn/i18n/react'; -import { getFormat } from '../legacy_imports'; +import { getFormatService } from '../services'; import { Label } from './label'; import { TagCloud } from './tag_cloud'; @@ -118,7 +118,7 @@ export function createTagCloudVisualization({ colors }) { const bucket = this._visParams.bucket; const metric = this._visParams.metric; - const bucketFormatter = bucket ? getFormat(bucket.format) : null; + const bucketFormatter = bucket ? getFormatService().deserialize(bucket.format) : null; const tagColumn = bucket ? data.columns[bucket.accessor].id : -1; const metricColumn = data.columns[metric.accessor].id; const tags = data.rows.map((row, rowIndex) => { diff --git a/src/legacy/core_plugins/vis_type_tagcloud/public/legacy.ts b/src/legacy/core_plugins/vis_type_tagcloud/public/legacy.ts index 182da40a3e6eaf..96073caf205158 100644 --- a/src/legacy/core_plugins/vis_type_tagcloud/public/legacy.ts +++ b/src/legacy/core_plugins/vis_type_tagcloud/public/legacy.ts @@ -33,4 +33,4 @@ const plugins: Readonly = { const pluginInstance = plugin({} as PluginInitializerContext); export const setup = pluginInstance.setup(npSetup.core, plugins); -export const start = pluginInstance.start(npStart.core); +export const start = pluginInstance.start(npStart.core, { data: npStart.plugins.data }); diff --git a/src/legacy/core_plugins/vis_type_tagcloud/public/plugin.ts b/src/legacy/core_plugins/vis_type_tagcloud/public/plugin.ts index 8244cba38edc32..c9dd4943519be1 100644 --- a/src/legacy/core_plugins/vis_type_tagcloud/public/plugin.ts +++ b/src/legacy/core_plugins/vis_type_tagcloud/public/plugin.ts @@ -24,6 +24,8 @@ import { ChartsPluginSetup } from '../../../../plugins/charts/public'; import { createTagCloudFn } from './tag_cloud_fn'; import { createTagCloudVisTypeDefinition } from './tag_cloud_type'; +import { DataPublicPluginStart } from '../../../../plugins/data/public'; +import { setFormatService } from './services'; /** @internal */ export interface TagCloudPluginSetupDependencies { @@ -37,6 +39,11 @@ export interface TagCloudVisDependencies { colors: ChartsPluginSetup['colors']; } +/** @internal */ +export interface TagCloudVisPluginStartDependencies { + data: DataPublicPluginStart; +} + /** @internal */ export class TagCloudPlugin implements Plugin { initializerContext: PluginInitializerContext; @@ -58,7 +65,7 @@ export class TagCloudPlugin implements Plugin { ); } - public start(core: CoreStart) { - // nothing to do here yet + public start(core: CoreStart, { data }: TagCloudVisPluginStartDependencies) { + setFormatService(data.fieldFormats); } } diff --git a/src/legacy/core_plugins/vis_type_metric/public/legacy_imports.ts b/src/legacy/core_plugins/vis_type_tagcloud/public/services.ts similarity index 73% rename from src/legacy/core_plugins/vis_type_metric/public/legacy_imports.ts rename to src/legacy/core_plugins/vis_type_tagcloud/public/services.ts index cd7a8e740d85d8..30fd185be877d3 100644 --- a/src/legacy/core_plugins/vis_type_metric/public/legacy_imports.ts +++ b/src/legacy/core_plugins/vis_type_tagcloud/public/services.ts @@ -17,4 +17,9 @@ * under the License. */ -export { getFormat } from 'ui/visualize/loader/pipeline_helpers/utilities'; +import { createGetterSetter } from '../../../../plugins/kibana_utils/common'; +import { DataPublicPluginStart } from '../../../../plugins/data/public'; + +export const [getFormatService, setFormatService] = createGetterSetter< + DataPublicPluginStart['fieldFormats'] +>('data.fieldFormats'); diff --git a/src/legacy/core_plugins/vis_type_vislib/public/legacy.ts b/src/legacy/core_plugins/vis_type_vislib/public/legacy.ts index 5828a0cccebd7b..de3a115fc3e49a 100644 --- a/src/legacy/core_plugins/vis_type_vislib/public/legacy.ts +++ b/src/legacy/core_plugins/vis_type_vislib/public/legacy.ts @@ -39,6 +39,7 @@ const setupPlugins: Readonly = { const startPlugins: Readonly = { expressions: npStart.plugins.expressions, visualizations: visualizationsStart, + data: npStart.plugins.data, }; const pluginInstance = plugin({} as PluginInitializerContext); diff --git a/src/legacy/core_plugins/vis_type_vislib/public/legacy_imports.ts b/src/legacy/core_plugins/vis_type_vislib/public/legacy_imports.ts index 2b177bff98d565..667396a14c3dda 100644 --- a/src/legacy/core_plugins/vis_type_vislib/public/legacy_imports.ts +++ b/src/legacy/core_plugins/vis_type_vislib/public/legacy_imports.ts @@ -19,7 +19,6 @@ import { npStart } from 'ui/new_platform'; export const { createFiltersFromEvent } = npStart.plugins.data.actions; -export { getFormat } from 'ui/visualize/loader/pipeline_helpers/utilities'; import { search } from '../../../../plugins/data/public'; export const { tabifyAggResponse, tabifyGetColumns } = search; // @ts-ignore diff --git a/src/legacy/core_plugins/vis_type_vislib/public/plugin.ts b/src/legacy/core_plugins/vis_type_vislib/public/plugin.ts index a71892cc47b05a..9539adbd2ec29f 100644 --- a/src/legacy/core_plugins/vis_type_vislib/public/plugin.ts +++ b/src/legacy/core_plugins/vis_type_vislib/public/plugin.ts @@ -40,6 +40,8 @@ import { } from './vis_type_vislib_vis_types'; import { ChartsPluginSetup } from '../../../../plugins/charts/public'; import { ConfigSchema as VisTypeXyConfigSchema } from '../../vis_type_xy'; +import { DataPublicPluginStart } from '../../../../plugins/data/public'; +import { setFormatService } from './services'; export interface VisTypeVislibDependencies { uiSettings: IUiSettingsClient; @@ -57,6 +59,7 @@ export interface VisTypeVislibPluginSetupDependencies { export interface VisTypeVislibPluginStartDependencies { expressions: ReturnType; visualizations: VisualizationsStart; + data: DataPublicPluginStart; } type VisTypeVislibCoreSetup = CoreSetup; @@ -109,6 +112,6 @@ export class VisTypeVislibPlugin implements Plugin, void> { } public start(core: CoreStart, deps: VisTypeVislibPluginStartDependencies) { - // nothing to do here + setFormatService(deps.data.fieldFormats); } } diff --git a/src/legacy/core_plugins/vis_type_vislib/public/services.ts b/src/legacy/core_plugins/vis_type_vislib/public/services.ts new file mode 100644 index 00000000000000..658db00b9a31d3 --- /dev/null +++ b/src/legacy/core_plugins/vis_type_vislib/public/services.ts @@ -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 { createGetterSetter } from '../../../../plugins/kibana_utils/common'; +import { DataPublicPluginStart } from '../../../../plugins/data/public'; + +export const [getFormatService, setFormatService] = createGetterSetter< + DataPublicPluginStart['fieldFormats'] +>('vislib data.fieldFormats'); diff --git a/src/legacy/core_plugins/vis_type_vislib/public/vislib/lib/data.js b/src/legacy/core_plugins/vis_type_vislib/public/vislib/lib/data.js index 2ed6d899f86028..2df157b6f121db 100644 --- a/src/legacy/core_plugins/vis_type_vislib/public/vislib/lib/data.js +++ b/src/legacy/core_plugins/vis_type_vislib/public/vislib/lib/data.js @@ -23,7 +23,7 @@ import _ from 'lodash'; import { injectZeros } from '../components/zero_injection/inject_zeros'; import { orderXValues } from '../components/zero_injection/ordered_x_keys'; import { labels } from '../components/labels/labels'; -import { getFormat } from '../../legacy_imports'; +import { getFormatService } from '../../services'; /** * Provides an API for pulling values off the data @@ -56,8 +56,8 @@ export class Data { newData[key] = data[key]; } else { newData[key] = data[key].map(seri => { - const converter = getFormat(seri.format); - const zConverter = getFormat(seri.zFormat); + const converter = getFormatService().deserialize(seri.format); + const zConverter = getFormatService().deserialize(seri.zFormat); return { id: seri.id, rawId: seri.rawId, @@ -76,9 +76,9 @@ export class Data { } }); - const xConverter = getFormat(newData.xAxisFormat); - const yConverter = getFormat(newData.yAxisFormat); - const zConverter = getFormat(newData.zAxisFormat); + const xConverter = getFormatService().deserialize(newData.xAxisFormat); + const yConverter = getFormatService().deserialize(newData.yAxisFormat); + const zConverter = getFormatService().deserialize(newData.zAxisFormat); newData.xAxisFormatter = val => xConverter.convert(val); newData.yAxisFormatter = val => yConverter.convert(val); newData.zAxisFormatter = val => zConverter.convert(val); diff --git a/src/legacy/core_plugins/vis_type_vislib/public/vislib/response_handler.js b/src/legacy/core_plugins/vis_type_vislib/public/vislib/response_handler.js index 0c584fedda217d..9ba86c5181a4c8 100644 --- a/src/legacy/core_plugins/vis_type_vislib/public/vislib/response_handler.js +++ b/src/legacy/core_plugins/vis_type_vislib/public/vislib/response_handler.js @@ -17,7 +17,8 @@ * under the License. */ -import { buildHierarchicalData, buildPointSeriesData, getFormat } from '../legacy_imports'; +import { buildHierarchicalData, buildPointSeriesData } from '../legacy_imports'; +import { getFormatService } from '../services'; function tableResponseHandler(table, dimensions) { const converted = { tables: [] }; @@ -26,7 +27,7 @@ function tableResponseHandler(table, dimensions) { if (split) { converted.direction = dimensions.splitRow ? 'row' : 'column'; const splitColumnIndex = split[0].accessor; - const splitColumnFormatter = getFormat(split[0].format); + const splitColumnFormatter = getFormatService().deserialize(split[0].format); const splitColumn = table.columns[splitColumnIndex]; const splitMap = {}; let splitIndex = 0; diff --git a/src/legacy/core_plugins/vis_type_vislib/public/vislib/visualizations/_chart.js b/src/legacy/core_plugins/vis_type_vislib/public/vislib/visualizations/_chart.js index a36c7c4774dadf..8e881c2a157269 100644 --- a/src/legacy/core_plugins/vis_type_vislib/public/vislib/visualizations/_chart.js +++ b/src/legacy/core_plugins/vis_type_vislib/public/vislib/visualizations/_chart.js @@ -22,7 +22,7 @@ import _ from 'lodash'; import { dataLabel } from '../lib/_data_label'; import { Dispatch } from '../lib/dispatch'; -import { getFormat } from '../../legacy_imports'; +import { getFormatService } from '../../services'; import { Tooltip, hierarchicalTooltipFormatter, @@ -47,7 +47,9 @@ export class Chart { const events = (this.events = new Dispatch(handler, deps.uiSettings)); - const fieldFormatter = getFormat(this.handler.data.get('tooltipFormatter')); + const fieldFormatter = getFormatService().deserialize( + this.handler.data.get('tooltipFormatter') + ); const tooltipFormatterProvider = this.handler.visConfig.get('type') === 'pie' ? hierarchicalTooltipFormatter diff --git a/src/legacy/ui/public/agg_response/hierarchical/build_hierarchical_data.test.js b/src/legacy/ui/public/agg_response/hierarchical/build_hierarchical_data.test.js index f96f194108ff9f..21a937bf1fb66e 100644 --- a/src/legacy/ui/public/agg_response/hierarchical/build_hierarchical_data.test.js +++ b/src/legacy/ui/public/agg_response/hierarchical/build_hierarchical_data.test.js @@ -18,7 +18,58 @@ */ import { buildHierarchicalData } from './build_hierarchical_data'; -import { tableVisResponseHandler } from '../../../../core_plugins/vis_type_table/public/table_vis_response_handler'; + +function tableVisResponseHandler(table, dimensions) { + const converted = { + tables: [], + }; + + const split = dimensions.splitColumn || dimensions.splitRow; + + if (split) { + converted.direction = dimensions.splitRow ? 'row' : 'column'; + const splitColumnIndex = split[0].accessor; + const splitColumn = table.columns[splitColumnIndex]; + const splitMap = {}; + let splitIndex = 0; + + table.rows.forEach((row, rowIndex) => { + const splitValue = row[splitColumn.id]; + + if (!splitMap.hasOwnProperty(splitValue)) { + splitMap[splitValue] = splitIndex++; + const tableGroup = { + $parent: converted, + title: `splitValue: ${splitColumn.name}`, + name: splitColumn.name, + key: splitValue, + column: splitColumnIndex, + row: rowIndex, + table, + tables: [], + }; + + tableGroup.tables.push({ + $parent: tableGroup, + columns: table.columns, + rows: [], + }); + + converted.tables.push(tableGroup); + } + + const tableIndex = splitMap[splitValue]; + converted.tables[tableIndex].tables[0].rows.push(row); + }); + } else { + converted.tables.push({ + columns: table.columns, + rows: table.rows, + }); + } + + return converted; +} jest.mock('ui/new_platform'); jest.mock('ui/chrome', () => ({ diff --git a/x-pack/legacy/plugins/lens/public/datatable_visualization/expression.tsx b/x-pack/legacy/plugins/lens/public/datatable_visualization/expression.tsx index 440f7bdc42bcbf..050f294d0b9642 100644 --- a/x-pack/legacy/plugins/lens/public/datatable_visualization/expression.tsx +++ b/x-pack/legacy/plugins/lens/public/datatable_visualization/expression.tsx @@ -8,13 +8,12 @@ import React from 'react'; import ReactDOM from 'react-dom'; import { i18n } from '@kbn/i18n'; import { EuiBasicTable } from '@elastic/eui'; -import { LensMultiTable } from '../types'; +import { FormatFactory, LensMultiTable } from '../types'; import { ExpressionFunctionDefinition, ExpressionRenderDefinition, IInterpreterRenderHandlers, } from '../../../../../../src/plugins/expressions/public'; -import { FormatFactory } from '../../../../../../src/legacy/ui/public/visualize/loader/pipeline_helpers/utilities'; import { VisualizationContainer } from '../visualization_container'; export interface DatatableColumns { @@ -102,7 +101,7 @@ export const datatableColumns: ExpressionFunctionDefinition< }; export const getDatatableRenderer = ( - formatFactory: FormatFactory + formatFactory: Promise ): ExpressionRenderDefinition => ({ name: 'lens_datatable_renderer', displayName: i18n.translate('xpack.lens.datatable.visualizationName', { @@ -116,8 +115,9 @@ export const getDatatableRenderer = ( config: DatatableProps, handlers: IInterpreterRenderHandlers ) => { + const resolvedFormatFactory = await formatFactory; ReactDOM.render( - , + , domNode, () => { handlers.done(); diff --git a/x-pack/legacy/plugins/lens/public/datatable_visualization/index.ts b/x-pack/legacy/plugins/lens/public/datatable_visualization/index.ts index 6dee47cc632c27..7a54a5daa30956 100644 --- a/x-pack/legacy/plugins/lens/public/datatable_visualization/index.ts +++ b/x-pack/legacy/plugins/lens/public/datatable_visualization/index.ts @@ -8,12 +8,11 @@ import { CoreSetup } from 'src/core/public'; import { datatableVisualization } from './visualization'; import { ExpressionsSetup } from '../../../../../../src/plugins/expressions/public'; import { datatable, datatableColumns, getDatatableRenderer } from './expression'; -import { FormatFactory } from '../legacy_imports'; -import { EditorFrameSetup } from '../types'; +import { EditorFrameSetup, FormatFactory } from '../types'; export interface DatatableVisualizationPluginSetupPlugins { expressions: ExpressionsSetup; - formatFactory: FormatFactory; + formatFactory: Promise; editorFrame: EditorFrameSetup; } diff --git a/x-pack/legacy/plugins/lens/public/legacy.ts b/x-pack/legacy/plugins/lens/public/legacy.ts index 1cfd3e198547d5..b7d47644c7f31c 100644 --- a/x-pack/legacy/plugins/lens/public/legacy.ts +++ b/x-pack/legacy/plugins/lens/public/legacy.ts @@ -5,7 +5,7 @@ */ import { npSetup, npStart } from 'ui/new_platform'; -import { getFormat, visualizations } from './legacy_imports'; +import { visualizations } from './legacy_imports'; export * from './types'; @@ -14,6 +14,6 @@ import { plugin } from './index'; const pluginInstance = plugin(); pluginInstance.setup(npSetup.core, { ...npSetup.plugins, - __LEGACY: { formatFactory: getFormat, visualizations }, + __LEGACY: { visualizations }, }); pluginInstance.start(npStart.core, npStart.plugins); diff --git a/x-pack/legacy/plugins/lens/public/legacy_imports.ts b/x-pack/legacy/plugins/lens/public/legacy_imports.ts index 88f189fe3db5a7..d53842d209e2b7 100644 --- a/x-pack/legacy/plugins/lens/public/legacy_imports.ts +++ b/x-pack/legacy/plugins/lens/public/legacy_imports.ts @@ -4,6 +4,5 @@ * you may not use this file except in compliance with the Elastic License. */ -export { getFormat, FormatFactory } from 'ui/visualize/loader/pipeline_helpers/utilities'; export { setup as visualizations } from '../../../../../src/legacy/core_plugins/visualizations/public/np_ready/public/legacy'; export { VisualizationsSetup } from '../../../../../src/legacy/core_plugins/visualizations/public'; diff --git a/x-pack/legacy/plugins/lens/public/metric_visualization/index.ts b/x-pack/legacy/plugins/lens/public/metric_visualization/index.ts index 217cc6902fc995..65f064258a5e21 100644 --- a/x-pack/legacy/plugins/lens/public/metric_visualization/index.ts +++ b/x-pack/legacy/plugins/lens/public/metric_visualization/index.ts @@ -5,15 +5,14 @@ */ import { CoreSetup } from 'src/core/public'; -import { FormatFactory } from '../legacy_imports'; import { metricVisualization } from './metric_visualization'; import { ExpressionsSetup } from '../../../../../../src/plugins/expressions/public'; import { metricChart, getMetricChartRenderer } from './metric_expression'; -import { EditorFrameSetup } from '../types'; +import { EditorFrameSetup, FormatFactory } from '../types'; export interface MetricVisualizationPluginSetupPlugins { expressions: ExpressionsSetup; - formatFactory: FormatFactory; + formatFactory: Promise; editorFrame: EditorFrameSetup; } diff --git a/x-pack/legacy/plugins/lens/public/metric_visualization/metric_expression.tsx b/x-pack/legacy/plugins/lens/public/metric_visualization/metric_expression.tsx index 4d979a766cd2b9..a80552e57a9e06 100644 --- a/x-pack/legacy/plugins/lens/public/metric_visualization/metric_expression.tsx +++ b/x-pack/legacy/plugins/lens/public/metric_visualization/metric_expression.tsx @@ -6,14 +6,13 @@ import React from 'react'; import ReactDOM from 'react-dom'; -import { FormatFactory } from 'ui/visualize/loader/pipeline_helpers/utilities'; import { ExpressionFunctionDefinition, ExpressionRenderDefinition, IInterpreterRenderHandlers, } from '../../../../../../src/plugins/expressions/public'; import { MetricConfig } from './types'; -import { LensMultiTable } from '../types'; +import { FormatFactory, LensMultiTable } from '../types'; import { AutoScale } from './auto_scale'; import { VisualizationContainer } from '../visualization_container'; @@ -68,17 +67,26 @@ export const metricChart: ExpressionFunctionDefinition< }; export const getMetricChartRenderer = ( - formatFactory: FormatFactory + formatFactory: Promise ): ExpressionRenderDefinition => ({ name: 'lens_metric_chart_renderer', displayName: 'Metric chart', help: 'Metric chart renderer', validate: () => undefined, reuseDomNode: true, - render: (domNode: Element, config: MetricChartProps, handlers: IInterpreterRenderHandlers) => { - ReactDOM.render(, domNode, () => { - handlers.done(); - }); + render: async ( + domNode: Element, + config: MetricChartProps, + handlers: IInterpreterRenderHandlers + ) => { + const resolvedFormatFactory = await formatFactory; + ReactDOM.render( + , + domNode, + () => { + handlers.done(); + } + ); handlers.onDestroy(() => ReactDOM.unmountComponentAtNode(domNode)); }, }); diff --git a/x-pack/legacy/plugins/lens/public/plugin.tsx b/x-pack/legacy/plugins/lens/public/plugin.tsx index 16f1d194b240ac..fad1371199e6a1 100644 --- a/x-pack/legacy/plugins/lens/public/plugin.tsx +++ b/x-pack/legacy/plugins/lens/public/plugin.tsx @@ -37,7 +37,6 @@ import { getUrlVars, getLensUrlFromDashboardAbsoluteUrl, } from '../../../../../src/legacy/core_plugins/kibana/public/dashboard/np_ready/url_helper'; -import { FormatFactory } from './legacy_imports'; import { EmbeddableSetup, EmbeddableStart } from '../../../../../src/plugins/embeddable/public'; import { EditorFrameStart } from './types'; import { getLensAliasConfig } from './vis_type_alias'; @@ -48,7 +47,6 @@ export interface LensPluginSetupDependencies { data: DataPublicPluginSetup; embeddable: EmbeddableSetup; __LEGACY: { - formatFactory: FormatFactory; visualizations: VisualizationsSetup; }; } @@ -86,7 +84,7 @@ export class LensPlugin { expressions, data, embeddable, - __LEGACY: { formatFactory, visualizations }, + __LEGACY: { visualizations }, }: LensPluginSetupDependencies ) { const editorFrameSetupInterface = this.editorFrameService.setup(core, { @@ -98,7 +96,9 @@ export class LensPlugin { expressions, data, editorFrame: editorFrameSetupInterface, - formatFactory, + formatFactory: core + .getStartServices() + .then(([_, { data: dataStart }]) => dataStart.fieldFormats.deserialize), }; this.indexpatternDatasource.setup(core, dependencies); this.xyVisualization.setup(core, dependencies); diff --git a/x-pack/legacy/plugins/lens/public/types.ts b/x-pack/legacy/plugins/lens/public/types.ts index c897979b06cfb6..3d67b7b2da460c 100644 --- a/x-pack/legacy/plugins/lens/public/types.ts +++ b/x-pack/legacy/plugins/lens/public/types.ts @@ -7,14 +7,19 @@ import { Ast } from '@kbn/interpreter/common'; import { IconType } from '@elastic/eui/src/components/icon/icon'; import { CoreSetup } from 'src/core/public'; -import { KibanaDatatable } from '../../../../../src/plugins/expressions/public'; +import { + KibanaDatatable, + SerializedFieldFormat, +} from '../../../../../src/plugins/expressions/public'; import { DragContextState } from './drag_drop'; import { Document } from './persistence'; import { DateRange } from '../../../../plugins/lens/common'; -import { Query, Filter, SavedQuery } from '../../../../../src/plugins/data/public'; +import { Query, Filter, SavedQuery, IFieldFormat } from '../../../../../src/plugins/data/public'; export type ErrorCallback = (e: { message: string }) => void; +export type FormatFactory = (mapping?: SerializedFieldFormat) => IFieldFormat; + export interface PublicAPIProps { state: T; layerId: string; diff --git a/x-pack/legacy/plugins/lens/public/xy_visualization/index.ts b/x-pack/legacy/plugins/lens/public/xy_visualization/index.ts index fc836d81ada2b5..8cc5abb44d6e1d 100644 --- a/x-pack/legacy/plugins/lens/public/xy_visualization/index.ts +++ b/x-pack/legacy/plugins/lens/public/xy_visualization/index.ts @@ -7,18 +7,17 @@ import { EUI_CHARTS_THEME_DARK, EUI_CHARTS_THEME_LIGHT } from '@elastic/eui/dist/eui_charts_theme'; import { CoreSetup, IUiSettingsClient, CoreStart } from 'src/core/public'; import moment from 'moment-timezone'; -import { FormatFactory } from '../legacy_imports'; import { ExpressionsSetup } from '../../../../../../src/plugins/expressions/public'; import { xyVisualization } from './xy_visualization'; import { xyChart, getXyChartRenderer } from './xy_expression'; import { legendConfig, xConfig, layerConfig } from './types'; -import { EditorFrameSetup } from '../types'; +import { EditorFrameSetup, FormatFactory } from '../types'; import { UiActionsStart } from '../../../../../../src/plugins/ui_actions/public'; import { setExecuteTriggerActions } from './services'; export interface XyVisualizationPluginSetupPlugins { expressions: ExpressionsSetup; - formatFactory: FormatFactory; + formatFactory: Promise; editorFrame: EditorFrameSetup; } diff --git a/x-pack/legacy/plugins/lens/public/xy_visualization/xy_expression.tsx b/x-pack/legacy/plugins/lens/public/xy_visualization/xy_expression.tsx index 98d95c2ea77153..eaf3acf7bb2a7c 100644 --- a/x-pack/legacy/plugins/lens/public/xy_visualization/xy_expression.tsx +++ b/x-pack/legacy/plugins/lens/public/xy_visualization/xy_expression.tsx @@ -30,8 +30,7 @@ import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; import { EmbeddableVisTriggerContext } from '../../../../../../src/plugins/embeddable/public'; import { VIS_EVENT_TO_TRIGGER } from '../../../../../../src/legacy/core_plugins/visualizations/public/np_ready/public/embeddable/events'; -import { FormatFactory } from '../../../../../../src/legacy/ui/public/visualize/loader/pipeline_helpers/utilities'; -import { LensMultiTable } from '../types'; +import { LensMultiTable, FormatFactory } from '../types'; import { XYArgs, SeriesType, visualizationTypes } from './types'; import { VisualizationContainer } from '../visualization_container'; import { isHorizontalChart } from './state_helpers'; @@ -108,7 +107,7 @@ export const xyChart: ExpressionFunctionDefinition< }; export const getXyChartRenderer = (dependencies: { - formatFactory: FormatFactory; + formatFactory: Promise; chartTheme: PartialTheme; timeZone: string; }): ExpressionRenderDefinition => ({ @@ -119,14 +118,17 @@ export const getXyChartRenderer = (dependencies: { }), validate: () => undefined, reuseDomNode: true, - render: (domNode: Element, config: XYChartProps, handlers: IInterpreterRenderHandlers) => { + render: async (domNode: Element, config: XYChartProps, handlers: IInterpreterRenderHandlers) => { const executeTriggerActions = getExecuteTriggerActions(); handlers.onDestroy(() => ReactDOM.unmountComponentAtNode(domNode)); + const formatFactory = await dependencies.formatFactory; ReactDOM.render( ,