legacy agg vis tag cloud convert to lens (#159348)

Part of https://github.com/elastic/kibana/issues/154307

Add convert to lens logic for tag cloud visualization

---------

Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
Co-authored-by: Stratoula Kalafateli <efstratia.kalafateli@elastic.co>
This commit is contained in:
Nathan Reese 2023-06-12 09:32:41 -06:00 committed by GitHub
parent 5fd356a3d7
commit e8e5cec83d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
26 changed files with 336 additions and 163 deletions

View file

@ -7,32 +7,15 @@
*/
import { v4 as uuidv4 } from 'uuid';
import {
Column,
ColumnWithMeta,
PercentageModeConfigWithMinMax,
} from '@kbn/visualizations-plugin/common';
import { PercentageModeConfigWithMinMax } from '@kbn/visualizations-plugin/common';
import {
convertToLensModule,
getDataViewByIndexPatternId,
} from '@kbn/visualizations-plugin/public';
import { excludeMetaFromColumn } from '@kbn/visualizations-plugin/common/convert_to_lens';
import { getDataViewsStart } from '../services';
import { ConvertGaugeVisToLensVisualization } from './types';
export const isColumnWithMeta = (column: Column): column is ColumnWithMeta => {
if ((column as ColumnWithMeta).meta) {
return true;
}
return false;
};
export const excludeMetaFromColumn = (column: Column) => {
if (isColumnWithMeta(column)) {
const { meta, ...rest } = column;
return rest;
}
return column;
};
import { getConfiguration } from './configurations/gauge';
export const convertToLens: ConvertGaugeVisToLensVisualization = async (vis, timefilter) => {
if (!timefilter) {
@ -46,10 +29,8 @@ export const convertToLens: ConvertGaugeVisToLensVisualization = async (vis, tim
return null;
}
const [
{ getColumnsFromVis, createStaticValueColumn, getPalette, getPercentageModeConfig },
{ getConfiguration },
] = await Promise.all([convertToLensModule, import('./configurations/gauge')]);
const { getColumnsFromVis, createStaticValueColumn, getPalette, getPercentageModeConfig } =
await convertToLensModule;
const percentageModeConfig = getPercentageModeConfig(vis.params.gauge, false);

View file

@ -7,32 +7,15 @@
*/
import { v4 as uuidv4 } from 'uuid';
import {
Column,
ColumnWithMeta,
PercentageModeConfigWithMinMax,
} from '@kbn/visualizations-plugin/common';
import { PercentageModeConfigWithMinMax } from '@kbn/visualizations-plugin/common';
import {
convertToLensModule,
getDataViewByIndexPatternId,
} from '@kbn/visualizations-plugin/public';
import { excludeMetaFromColumn } from '@kbn/visualizations-plugin/common/convert_to_lens';
import { getDataViewsStart } from '../services';
import { ConvertGoalVisToLensVisualization } from './types';
export const isColumnWithMeta = (column: Column): column is ColumnWithMeta => {
if ((column as ColumnWithMeta).meta) {
return true;
}
return false;
};
export const excludeMetaFromColumn = (column: Column) => {
if (isColumnWithMeta(column)) {
const { meta, ...rest } = column;
return rest;
}
return column;
};
import { getConfiguration } from './configurations/goal';
export const convertToLens: ConvertGoalVisToLensVisualization = async (vis, timefilter) => {
if (!timefilter) {
@ -46,10 +29,8 @@ export const convertToLens: ConvertGoalVisToLensVisualization = async (vis, time
return null;
}
const [
{ getColumnsFromVis, getPalette, getPercentageModeConfig, createStaticValueColumn },
{ getConfiguration },
] = await Promise.all([convertToLensModule, import('./configurations/goal')]);
const { getColumnsFromVis, getPalette, getPercentageModeConfig, createStaticValueColumn } =
await convertToLensModule;
const percentageModeConfig = getPercentageModeConfig(vis.params.gauge, false);

View file

@ -18,7 +18,6 @@ import { toExpressionAst } from '../to_ast';
import { getGaugeOptions } from '../editor/components';
import { GaugeVisParams } from '../types';
import { SplitTooltip } from './split_tooltip';
import { convertGaugeToLens } from '../convert_to_lens';
export const getGaugeVisTypeDefinition = (
props: GaugeTypeProps
@ -130,8 +129,12 @@ export const getGaugeVisTypeDefinition = (
],
},
requiresSearch: true,
navigateToLens: async (vis, timefilter) => (vis ? convertGaugeToLens(vis, timefilter) : null),
navigateToLens: async (vis, timefilter) => {
const { convertGaugeToLens } = await import('../convert_to_lens');
return vis ? convertGaugeToLens(vis, timefilter) : null;
},
getExpressionVariables: async (vis, timeFilter) => {
const { convertGaugeToLens } = await import('../convert_to_lens');
return {
canNavigateToLens: Boolean(vis?.params ? await convertGaugeToLens(vis, timeFilter) : null),
};

View file

@ -17,7 +17,6 @@ import { getGaugeOptions } from '../editor/components';
import { toExpressionAst } from '../to_ast';
import { GaugeVisParams, GaugeType, GaugeTypeProps } from '../types';
import { SplitTooltip } from './split_tooltip';
import { convertGoalToLens } from '../convert_to_lens';
export const getGoalVisTypeDefinition = (
props: GaugeTypeProps
@ -122,8 +121,12 @@ export const getGoalVisTypeDefinition = (
],
},
requiresSearch: true,
navigateToLens: async (vis, timefilter) => (vis ? convertGoalToLens(vis, timefilter) : null),
navigateToLens: async (vis, timefilter) => {
const { convertGoalToLens } = await import('../convert_to_lens');
return vis ? convertGoalToLens(vis, timefilter) : null;
},
getExpressionVariables: async (vis, timeFilter) => {
const { convertGoalToLens } = await import('../convert_to_lens');
return {
canNavigateToLens: Boolean(vis?.params ? await convertGoalToLens(vis, timeFilter) : null),
};

View file

@ -6,31 +6,16 @@
* Side Public License, v 1.
*/
import { Column, ColumnWithMeta } from '@kbn/visualizations-plugin/common';
import {
convertToLensModule,
getDataViewByIndexPatternId,
} from '@kbn/visualizations-plugin/public';
import { excludeMetaFromColumn } from '@kbn/visualizations-plugin/common/convert_to_lens';
import { v4 as uuidv4 } from 'uuid';
import { getDataViewsStart } from '../services';
import { getConfiguration } from './configurations';
import { ConvertHeatmapToLensVisualization } from './types';
export const isColumnWithMeta = (column: Column): column is ColumnWithMeta => {
if ((column as ColumnWithMeta).meta) {
return true;
}
return false;
};
export const excludeMetaFromColumn = (column: Column) => {
if (isColumnWithMeta(column)) {
const { meta, ...rest } = column;
return rest;
}
return column;
};
export const convertToLens: ConvertHeatmapToLensVisualization = async (vis, timefilter) => {
if (!timefilter) {
return null;

View file

@ -14,7 +14,6 @@ import { VIS_EVENT_TO_TRIGGER, VisTypeDefinition } from '@kbn/visualizations-plu
import { HeatmapTypeProps, HeatmapVisParams, AxisType, ScaleType } from '../types';
import { toExpressionAst } from '../to_ast';
import { getHeatmapOptions } from '../editor/components';
import { convertToLens } from '../convert_to_lens';
export const getHeatmapVisTypeDefinition = ({
showElasticChartsOptions = false,
@ -145,8 +144,12 @@ export const getHeatmapVisTypeDefinition = ({
],
},
requiresSearch: true,
navigateToLens: async (vis, timefilter) => (vis ? convertToLens(vis, timefilter) : null),
navigateToLens: async (vis, timefilter) => {
const { convertToLens } = await import('../convert_to_lens');
return vis ? convertToLens(vis, timefilter) : null;
},
getExpressionVariables: async (vis, timeFilter) => {
const { convertToLens } = await import('../convert_to_lens');
return {
canNavigateToLens: Boolean(vis?.params ? await convertToLens(vis, timeFilter) : null),
};

View file

@ -7,28 +7,14 @@
*/
import { v4 as uuidv4 } from 'uuid';
import { Column, ColumnWithMeta } from '@kbn/visualizations-plugin/common';
import {
convertToLensModule,
getDataViewByIndexPatternId,
} from '@kbn/visualizations-plugin/public';
import { excludeMetaFromColumn } from '@kbn/visualizations-plugin/common/convert_to_lens';
import { getDataViewsStart } from '../services';
import { ConvertMetricVisToLensVisualization } from './types';
export const isColumnWithMeta = (column: Column): column is ColumnWithMeta => {
if ((column as ColumnWithMeta).meta) {
return true;
}
return false;
};
export const excludeMetaFromColumn = (column: Column) => {
if (isColumnWithMeta(column)) {
const { meta, ...rest } = column;
return rest;
}
return column;
};
import { getConfiguration } from './configurations';
export const convertToLens: ConvertMetricVisToLensVisualization = async (vis, timefilter) => {
if (!timefilter) {
@ -42,8 +28,7 @@ export const convertToLens: ConvertMetricVisToLensVisualization = async (vis, ti
return null;
}
const [{ getColumnsFromVis, getPalette, getPercentageModeConfig }, { getConfiguration }] =
await Promise.all([convertToLensModule, import('./configurations')]);
const { getColumnsFromVis, getPalette, getPercentageModeConfig } = await convertToLensModule;
const percentageModeConfig = getPercentageModeConfig(vis.params.metric);
const layers = getColumnsFromVis(

View file

@ -13,7 +13,6 @@ import { AggGroupNames } from '@kbn/data-plugin/public';
import { MetricVisOptions } from './components';
import { toExpressionAst } from './to_ast';
import { VisParams } from './types';
import { convertToLens } from './convert_to_lens';
export const createMetricVisTypeDefinition = (): VisTypeDefinition<VisParams> => ({
name: 'metric',
@ -103,8 +102,12 @@ export const createMetricVisTypeDefinition = (): VisTypeDefinition<VisParams> =>
],
},
requiresSearch: true,
navigateToLens: async (vis, timefilter) => (vis ? convertToLens(vis, timefilter) : null),
navigateToLens: async (vis, timefilter) => {
const { convertToLens } = await import('./convert_to_lens');
return vis ? convertToLens(vis, timefilter) : null;
},
getExpressionVariables: async (vis, timeFilter) => {
const { convertToLens } = await import('./convert_to_lens');
return {
canNavigateToLens: Boolean(vis?.params ? await convertToLens(vis, timeFilter) : null),
};

View file

@ -6,31 +6,16 @@
* Side Public License, v 1.
*/
import { Column, ColumnWithMeta } from '@kbn/visualizations-plugin/common';
import {
convertToLensModule,
getDataViewByIndexPatternId,
} from '@kbn/visualizations-plugin/public';
import { excludeMetaFromColumn } from '@kbn/visualizations-plugin/common/convert_to_lens';
import { v4 as uuidv4 } from 'uuid';
import { getDataViewsStart } from '../services';
import { getConfiguration } from './configurations';
import { ConvertPieToLensVisualization } from './types';
export const isColumnWithMeta = (column: Column): column is ColumnWithMeta => {
if ((column as ColumnWithMeta).meta) {
return true;
}
return false;
};
export const excludeMetaFromColumn = (column: Column) => {
if (isColumnWithMeta(column)) {
const { meta, ...rest } = column;
return rest;
}
return column;
};
export const convertToLens: ConvertPieToLensVisualization = async (vis, timefilter) => {
if (!timefilter) {
return null;

View file

@ -21,7 +21,6 @@ import { DEFAULT_PERCENT_DECIMALS } from '../../common';
import { PieTypeProps } from '../types';
import { toExpressionAst } from '../to_ast';
import { getPieOptions } from '../editor/components';
import { convertToLens } from '../convert_to_lens';
export const getPieVisTypeDefinition = ({
showElasticChartsOptions = false,
@ -122,8 +121,12 @@ export const getPieVisTypeDefinition = ({
},
hierarchicalData: true,
requiresSearch: true,
navigateToLens: async (vis, timefilter) => (vis ? convertToLens(vis, timefilter) : null),
navigateToLens: async (vis, timefilter) => {
const { convertToLens } = await import('../convert_to_lens');
return vis ? convertToLens(vis, timefilter) : null;
},
getExpressionVariables: async (vis, timeFilter) => {
const { convertToLens } = await import('../convert_to_lens');
return {
canNavigateToLens: Boolean(vis?.params ? await convertToLens(vis, timeFilter) : null),
};

View file

@ -7,32 +7,18 @@
*/
import { METRIC_TYPES } from '@kbn/data-plugin/common';
import { Column, ColumnWithMeta, SchemaConfig } from '@kbn/visualizations-plugin/common';
import { SchemaConfig } from '@kbn/visualizations-plugin/common';
import {
convertToLensModule,
getVisSchemas,
getDataViewByIndexPatternId,
} from '@kbn/visualizations-plugin/public';
import { excludeMetaFromColumn } from '@kbn/visualizations-plugin/common/convert_to_lens';
import { v4 as uuidv4 } from 'uuid';
import { getDataViewsStart } from '../services';
import { getConfiguration } from './configurations';
import { ConvertTableToLensVisualization } from './types';
export const isColumnWithMeta = (column: Column): column is ColumnWithMeta => {
if ((column as ColumnWithMeta).meta) {
return true;
}
return false;
};
export const excludeMetaFromColumn = (column: Column) => {
if (isColumnWithMeta(column)) {
const { meta, ...rest } = column;
return rest;
}
return column;
};
export const convertToLens: ConvertTableToLensVisualization = async (vis, timefilter) => {
if (!timefilter) {
return null;

View file

@ -13,7 +13,6 @@ import { VIS_EVENT_TO_TRIGGER, VisTypeDefinition } from '@kbn/visualizations-plu
import { TableVisParams, VIS_TYPE_TABLE } from '../common';
import { TableOptions } from './components/table_vis_options_lazy';
import { toExpressionAst } from './to_ast';
import { convertToLens } from './convert_to_lens';
export const tableVisTypeDefinition: VisTypeDefinition<TableVisParams> = {
name: VIS_TYPE_TABLE,
@ -103,8 +102,12 @@ export const tableVisTypeDefinition: VisTypeDefinition<TableVisParams> = {
hasPartialRows: (vis) => vis.params.showPartialRows,
hierarchicalData: (vis) => vis.params.showPartialRows || vis.params.showMetricsAtAllLevels,
requiresSearch: true,
navigateToLens: async (vis, timefilter) => (vis ? convertToLens(vis, timefilter) : null),
navigateToLens: async (vis, timefilter) => {
const { convertToLens } = await import('./convert_to_lens');
return vis ? convertToLens(vis, timefilter) : null;
},
getExpressionVariables: async (vis, timeFilter) => {
const { convertToLens } = await import('./convert_to_lens');
return {
canNavigateToLens: Boolean(vis?.params ? await convertToLens(vis, timeFilter) : null),
};

View file

@ -11,11 +11,13 @@
"data",
"expressions",
"visualizations",
"charts"
"charts",
"dataViews"
],
"requiredBundles": [
"kibanaReact",
"visDefaultEditor"
"visDefaultEditor",
"kibanaUtils"
]
}
}

View file

@ -0,0 +1,96 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/
jest.mock('uuid', () => ({
v4: jest.fn().mockReturnValue('12345'),
}));
jest.mock('@kbn/visualizations-plugin/public', () => ({
convertToLensModule: Promise.resolve({
getColumnsFromVis: jest.fn(() => {
return [
{
metrics: ['0cdf0372-a78f-438f-9fc0-df9ad83796df'],
buckets: {
all: ['8a2556cf-dfb2-49f1-83cb-8892e1eace1c'],
},
columns: [
{
columnId: '8a2556cf-dfb2-49f1-83cb-8892e1eace1c',
meta: {
aggId: '2',
},
},
],
},
];
}),
}),
getDataViewByIndexPatternId: jest.fn(() => ({ id: 'myDataViewId' })),
}));
jest.mock('../services', () => ({
getDataViewsStart: () => ({ get: () => ({}), getDefault: () => ({}) }),
}));
import type { Vis } from '@kbn/visualizations-plugin/public';
import type { TagCloudVisParams } from '../types';
import type { TimefilterContract } from '@kbn/data-plugin/public';
import { convertToLens } from '.';
test('should convert legacy tag cloud vis into navigate to lens context', async () => {
const mockVis = {
data: {
indexPattern: {
id: 'myDataViewId',
},
},
params: {
maxFontSize: 81,
minFontSize: 27,
orientation: 'right angled',
palette: {
name: 'status',
type: 'palette',
},
scale: 'linear',
showLabel: true,
},
} as unknown as Vis<TagCloudVisParams>;
expect(await convertToLens(mockVis, {} as unknown as TimefilterContract)).toEqual({
type: 'lnsTagcloud',
layers: [
{
indexPatternId: 'myDataViewId',
layerId: '12345',
columns: [
{
columnId: '8a2556cf-dfb2-49f1-83cb-8892e1eace1c',
},
],
columnOrder: [],
ignoreGlobalFilters: false,
},
],
configuration: {
layerId: '12345',
layerType: 'data',
valueAccessor: '0cdf0372-a78f-438f-9fc0-df9ad83796df',
tagAccessor: '8a2556cf-dfb2-49f1-83cb-8892e1eace1c',
maxFontSize: 81,
minFontSize: 27,
orientation: 'right angled',
palette: {
name: 'status',
type: 'palette',
},
showLabel: true,
},
indexPatternIds: ['myDataViewId'],
});
});

View file

@ -0,0 +1,78 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/
import { v4 as uuidv4 } from 'uuid';
import {
convertToLensModule,
getDataViewByIndexPatternId,
} from '@kbn/visualizations-plugin/public';
import { excludeMetaFromColumn } from '@kbn/visualizations-plugin/common/convert_to_lens';
import type { TimefilterContract } from '@kbn/data-plugin/public';
import type { Vis } from '@kbn/visualizations-plugin/public';
import { NavigateToLensContext, TagcloudVisConfiguration } from '@kbn/visualizations-plugin/common';
import type { TagCloudVisParams } from '../types';
import { getDataViewsStart } from '../services';
export const convertToLens = async (
vis: Vis<TagCloudVisParams>,
timefilter?: TimefilterContract
) => {
if (!timefilter) {
return null;
}
const dataViews = getDataViewsStart();
const dataView = await getDataViewByIndexPatternId(vis.data.indexPattern?.id, dataViews);
if (!dataView) {
return null;
}
const { getColumnsFromVis } = await convertToLensModule;
const layers = getColumnsFromVis(vis, timefilter, dataView, {
splits: ['segment'],
});
if (layers === null) {
return null;
}
const [layerConfig] = layers;
if (!layerConfig.buckets.all.length || !layerConfig.metrics.length) {
return null;
}
const layerId = uuidv4();
const indexPatternId = dataView.id!;
return {
type: 'lnsTagcloud',
layers: [
{
indexPatternId,
layerId,
columns: layerConfig.columns.map(excludeMetaFromColumn),
columnOrder: [],
ignoreGlobalFilters: false,
},
],
configuration: {
layerId,
layerType: 'data',
valueAccessor: layerConfig.metrics[0],
tagAccessor: layerConfig.buckets.all[0],
maxFontSize: vis.params.maxFontSize,
minFontSize: vis.params.minFontSize,
orientation: vis.params.orientation,
palette: vis.params.palette,
showLabel: vis.params.showLabel,
},
indexPatternIds: [indexPatternId],
} as NavigateToLensContext<TagcloudVisConfiguration>;
};

View file

@ -9,9 +9,10 @@
import { PluginInitializerContext, CoreSetup, CoreStart, Plugin } from '@kbn/core/public';
import { VisualizationsSetup } from '@kbn/visualizations-plugin/public';
import { ChartsPluginSetup } from '@kbn/charts-plugin/public';
import { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public';
import { getTagCloudVisTypeDefinition } from './tag_cloud_type';
import { TagcloudPublicConfig } from '../config';
import { setDataViewsStart } from './services';
/** @internal */
export interface TagCloudPluginSetupDependencies {
@ -19,13 +20,19 @@ export interface TagCloudPluginSetupDependencies {
charts: ChartsPluginSetup;
}
export interface TagCloudPluginStartDependencies {
dataViews: DataViewsPublicPluginStart;
}
/** @internal */
export interface TagCloudVisDependencies {
palettes: ChartsPluginSetup['palettes'];
}
/** @internal */
export class TagCloudPlugin implements Plugin<void, void> {
export class TagCloudPlugin
implements Plugin<void, void, TagCloudPluginSetupDependencies, TagCloudPluginStartDependencies>
{
initializerContext: PluginInitializerContext<TagcloudPublicConfig>;
constructor(initializerContext: PluginInitializerContext<TagcloudPublicConfig>) {
@ -45,5 +52,7 @@ export class TagCloudPlugin implements Plugin<void, void> {
});
}
public start(core: CoreStart) {}
public start(core: CoreStart, { dataViews }: TagCloudPluginStartDependencies) {
setDataViewsStart(dataViews);
}
}

View file

@ -0,0 +1,13 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/
import { createGetterSetter } from '@kbn/kibana-utils-plugin/public';
import { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public';
export const [getDataViewsStart, setDataViewsStart] =
createGetterSetter<DataViewsPublicPluginStart>('dataViews');

View file

@ -9,7 +9,9 @@
import { i18n } from '@kbn/i18n';
import { AggGroupNames } from '@kbn/data-plugin/public';
import { VIS_EVENT_TO_TRIGGER } from '@kbn/visualizations-plugin/public';
import type { TimefilterContract } from '@kbn/data-plugin/public';
import type { Vis } from '@kbn/visualizations-plugin/public';
import type { TagCloudVisParams } from './types';
import { getTagCloudOptions } from './components/get_tag_cloud_options';
import { toExpressionAst } from './to_ast';
import { TagCloudVisDependencies } from './plugin';
@ -80,5 +82,18 @@ export const getTagCloudVisTypeDefinition = ({ palettes }: TagCloudVisDependenci
],
},
requiresSearch: true,
navigateToLens: async (vis?: Vis<TagCloudVisParams>, timefilter?: TimefilterContract) => {
const { convertToLens } = await import('./convert_to_lens');
return vis ? convertToLens(vis, timefilter) : null;
},
getExpressionVariables: async (
vis?: Vis<TagCloudVisParams>,
timeFilter?: TimefilterContract
) => {
const { convertToLens } = await import('./convert_to_lens');
return {
canNavigateToLens: Boolean(vis?.params ? await convertToLens(vis, timeFilter) : null),
};
},
};
};

View file

@ -19,6 +19,8 @@
"@kbn/i18n",
"@kbn/coloring",
"@kbn/config-schema",
"@kbn/kibana-utils-plugin",
"@kbn/data-views-plugin",
],
"exclude": [
"target/**/*",

View file

@ -28,7 +28,6 @@ import { toExpressionAst } from './to_ast';
import { getDataViewsStart, getUISettings } from './services';
import type { TimeseriesVisDefaultParams, TimeseriesVisParams } from './types';
import type { IndexPatternValue, Panel } from '../common/types';
import { convertTSVBtoLensConfiguration } from './convert_to_lens';
export const withReplacedIds = (
vis: Vis<TimeseriesVisParams | TimeseriesVisDefaultParams>
@ -168,6 +167,7 @@ export const metricsVisDefinition: VisTypeDefinition<
return [];
},
getExpressionVariables: async (vis, timeFilter) => {
const { convertTSVBtoLensConfiguration } = await import('./convert_to_lens');
return {
canNavigateToLens: Boolean(
vis?.params
@ -176,9 +176,12 @@ export const metricsVisDefinition: VisTypeDefinition<
),
};
},
navigateToLens: async (vis, timeFilter) =>
vis?.params ? await convertTSVBtoLensConfiguration(vis, timeFilter?.getAbsoluteTime()) : null,
navigateToLens: async (vis, timeFilter) => {
const { convertTSVBtoLensConfiguration } = await import('./convert_to_lens');
return vis?.params
? await convertTSVBtoLensConfiguration(vis, timeFilter?.getAbsoluteTime())
: null;
},
inspectorAdapters: () => ({
requests: new RequestAdapter(),
}),

View file

@ -7,15 +7,17 @@
*/
import { METRIC_TYPES } from '@kbn/data-plugin/public';
import { CollapseFunction, Column, ColumnWithMeta } from '@kbn/visualizations-plugin/common';
import { CollapseFunction, Column } from '@kbn/visualizations-plugin/common';
import {
convertToLensModule,
getVisSchemas,
getDataViewByIndexPatternId,
} from '@kbn/visualizations-plugin/public';
import { excludeMetaFromColumn } from '@kbn/visualizations-plugin/common/convert_to_lens';
import { getDataViewsStart } from '../services';
import { getSeriesParams } from '../utils/get_series_params';
import { ConvertXYToLensVisualization } from './types';
import { getConfiguration } from './configurations';
export interface Layer {
indexPatternId: string;
@ -36,21 +38,6 @@ const SIBBLING_PIPELINE_AGGS: string[] = [
METRIC_TYPES.MIN_BUCKET,
];
export const isColumnWithMeta = (column: Column): column is ColumnWithMeta => {
if ((column as ColumnWithMeta).meta) {
return true;
}
return false;
};
export const excludeMetaFromColumn = (column: Column) => {
if (isColumnWithMeta(column)) {
const { meta, ...rest } = column;
return rest;
}
return column;
};
export const convertToLens: ConvertXYToLensVisualization = async (vis, timefilter) => {
if (!timefilter) {
return null;
@ -86,10 +73,7 @@ export const convertToLens: ConvertXYToLensVisualization = async (vis, timefilte
(param) => param.show && visSchemas.metric.some((m) => m.aggId?.split('.')[0] === param.data.id)
);
const [{ getColumnsFromVis, createStaticValueColumn }, { getConfiguration }] = await Promise.all([
convertToLensModule,
import('./configurations'),
]);
const { getColumnsFromVis, createStaticValueColumn } = await convertToLensModule;
const dataLayers = getColumnsFromVis(
vis,
timefilter,

View file

@ -12,7 +12,6 @@ import { areaVisTypeDefinition } from './area';
import { lineVisTypeDefinition } from './line';
import { histogramVisTypeDefinition } from './histogram';
import { horizontalBarVisTypeDefinition } from './horizontal_bar';
import { convertToLens } from '../convert_to_lens';
export const visTypesDefinitions = [
areaVisTypeDefinition,
@ -22,8 +21,12 @@ export const visTypesDefinitions = [
].map<VisTypeDefinition<VisParams>>((defenition) => {
return {
...defenition,
navigateToLens: async (vis, timefilter) => (vis ? convertToLens(vis, timefilter) : null),
navigateToLens: async (vis, timefilter) => {
const { convertToLens } = await import('../convert_to_lens');
return vis ? convertToLens(vis, timefilter) : null;
},
getExpressionVariables: async (vis, timeFilter) => {
const { convertToLens } = await import('../convert_to_lens');
return {
canNavigateToLens: Boolean(vis?.params ? await convertToLens(vis, timeFilter) : null),
};

View file

@ -333,10 +333,23 @@ export type HeatmapConfiguration = HeatmapLayerState & {
palette?: Palette;
};
export interface TagcloudVisConfiguration {
layerId: string;
layerType: LayerType;
valueAccessor: string;
tagAccessor: string;
maxFontSize: number;
minFontSize: number;
orientation: string;
palette: PaletteOutput;
showLabel: boolean;
}
export type Configuration =
| XYConfiguration
| TableVisConfiguration
| PartitionVisConfiguration
| MetricVisConfiguration
| GaugeVisConfiguration
| HeatmapConfiguration;
| HeatmapConfiguration
| TagcloudVisConfiguration;

View file

@ -9,7 +9,14 @@
import type { DataViewField } from '@kbn/data-views-plugin/common';
import { CollapseFunctions } from './constants';
import type { SupportedMetric } from './lib/convert/supported_metrics';
import type { CollapseFunction, Layer, XYAnnotationsLayerConfig, XYLayerConfig } from './types';
import type {
CollapseFunction,
Column,
ColumnWithMeta,
Layer,
XYAnnotationsLayerConfig,
XYLayerConfig,
} from './types';
export const isAnnotationsLayer = (
layer: Pick<XYLayerConfig, 'layerType'>
@ -45,3 +52,18 @@ export const isFieldValid = (
export const isCollapseFunction = (candidate: string | undefined): candidate is CollapseFunction =>
Boolean(candidate && CollapseFunctions.includes(candidate as CollapseFunction));
const isColumnWithMeta = (column: Column): column is ColumnWithMeta => {
if ((column as ColumnWithMeta).meta) {
return true;
}
return false;
};
export const excludeMetaFromColumn = (column: Column) => {
if (isColumnWithMeta(column)) {
const { meta, ...rest } = column;
return rest;
}
return column;
};

View file

@ -11,7 +11,7 @@ import type { SuggestionRequest, VisualizationSuggestion } from '../../types';
import type { TagcloudState } from './types';
import { DEFAULT_STATE, TAGCLOUD_LABEL } from './constants';
export function suggestions({
export function getSuggestions({
table,
state,
keptLayerIds,

View file

@ -24,7 +24,7 @@ import { IconChartTagcloud } from '@kbn/chart-icons';
import { SystemPaletteExpressionFunctionDefinition } from '@kbn/charts-plugin/common';
import type { OperationMetadata, Visualization } from '../..';
import type { TagcloudState } from './types';
import { suggestions } from './suggestions';
import { getSuggestions } from './suggestions';
import { TagcloudToolbar } from './tagcloud_toolbar';
import { TagsDimensionEditor } from './tags_dimension_editor';
import { DEFAULT_STATE, TAGCLOUD_LABEL } from './constants';
@ -79,7 +79,19 @@ export const getTagcloudVisualization = ({
};
},
getSuggestions: suggestions,
getSuggestions,
getSuggestionFromConvertToLensContext({ suggestions, context }) {
return !suggestions.length
? undefined
: {
...suggestions[0],
visualizationState: {
...(suggestions[0].visualizationState as TagcloudState),
...(context.configuration as unknown as TagcloudState),
},
};
},
triggers: [VIS_EVENT_TO_TRIGGER.filter],