Skip to content

Commit e754fb7

Browse files
Tim Roeskibanamachine
Tim Roes
andauthored
Improve visualization typings (#79128) (#79636)
* Improve visualization typings * Fix vis selection dialog * Fix broken getInfoMessage type Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
1 parent d851039 commit e754fb7

File tree

25 files changed

+696
-196
lines changed

25 files changed

+696
-196
lines changed

src/plugins/tile_map/public/components/tile_map_options.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ function TileMapOptions(props: TileMapOptionsProps) {
7676
<BasicOptions {...props} />
7777

7878
<SwitchOption
79-
disabled={!vis.type.visConfig.canDesaturate}
79+
disabled={!vis.type.visConfig?.canDesaturate}
8080
label={i18n.translate('tileMap.visParams.desaturateTilesLabel', {
8181
defaultMessage: 'Desaturate tiles',
8282
})}

src/plugins/tile_map/public/tile_map_type.js

-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ export function createTileMapTypeDefinition(dependencies) {
5555
wms: uiSettings.get('visualization:tileMap:WMSdefaults'),
5656
},
5757
},
58-
requiresPartialRows: true,
5958
visualization: CoordinateMapsVisualization,
6059
responseHandler: convertToGeoJson,
6160
editorConfig: {

src/plugins/vis_default_editor/public/components/sidebar/sidebar.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
*/
1919

2020
import React, { useMemo, useState, useCallback, KeyboardEventHandler, useEffect } from 'react';
21-
import { get, isEqual } from 'lodash';
21+
import { isEqual } from 'lodash';
2222
import { i18n } from '@kbn/i18n';
2323
import { keys, EuiButtonIcon, EuiFlexGroup, EuiFlexItem } from '@elastic/eui';
2424
import { EventEmitter } from 'events';
@@ -71,7 +71,7 @@ function DefaultEditorSideBar({
7171
]);
7272
const metricSchemas = (vis.type.schemas.metrics || []).map((s: Schema) => s.name);
7373
const metricAggs = useMemo(
74-
() => responseAggs.filter((agg) => metricSchemas.includes(get(agg, 'schema'))),
74+
() => responseAggs.filter((agg) => agg.schema && metricSchemas.includes(agg.schema)),
7575
[responseAggs, metricSchemas]
7676
);
7777
const hasHistogramAgg = useMemo(() => responseAggs.some((agg) => agg.type.name === 'histogram'), [

src/plugins/vis_type_metric/public/to_ast.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ export const toExpressionAst = (vis: Vis, params: any) => {
3939
const esaggs = buildExpressionFunction<EsaggsExpressionFunctionDefinition>('esaggs', {
4040
index: vis.data.indexPattern!.id!,
4141
metricsAtAllLevels: vis.isHierarchical(),
42-
partialRows: vis.type.requiresPartialRows || vis.params.showPartialRows || false,
42+
partialRows: vis.params.showPartialRows || false,
4343
aggConfigs: JSON.stringify(vis.data.aggs!.aggs),
4444
includeFormatHints: false,
4545
});

src/plugins/vis_type_table/public/table_vis_controller.test.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -249,13 +249,13 @@ describe('Table Vis - Controller', () => {
249249
const vis = getRangeVis({ showPartialRows: true });
250250
initController(vis);
251251

252-
expect(vis.type.hierarchicalData(vis)).toEqual(true);
252+
expect((vis.type.hierarchicalData as Function)(vis)).toEqual(true);
253253
});
254254

255255
test('passes partialRows:false to tabify based on the vis params', () => {
256256
const vis = getRangeVis({ showPartialRows: false });
257257
initController(vis);
258258

259-
expect(vis.type.hierarchicalData(vis)).toEqual(false);
259+
expect((vis.type.hierarchicalData as Function)(vis)).toEqual(false);
260260
});
261261
});

src/plugins/vis_type_table/public/table_vis_type.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import { CoreSetup, PluginInitializerContext } from 'kibana/public';
2020
import { i18n } from '@kbn/i18n';
2121
import { AggGroupNames } from '../../data/public';
2222
import { Schemas } from '../../vis_default_editor/public';
23-
import { BaseVisTypeOptions, Vis } from '../../visualizations/public';
23+
import { BaseVisTypeOptions } from '../../visualizations/public';
2424
import { tableVisResponseHandler } from './table_vis_response_handler';
2525
// @ts-ignore
2626
import tableVisTemplate from './table_vis.html';
@@ -99,7 +99,7 @@ export function getTableVisTypeDefinition(
9999
]),
100100
},
101101
responseHandler: tableVisResponseHandler,
102-
hierarchicalData: (vis: Vis) => {
102+
hierarchicalData: (vis) => {
103103
return Boolean(vis.params.showPartialRows || vis.params.showMetricsAtAllLevels);
104104
},
105105
};

src/plugins/vis_type_table/public/vis_controller.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,9 @@ export function getTableVisualizationControllerClass(
103103
this.$scope = this.$rootScope.$new();
104104
this.$scope.uiState = this.vis.getUiState();
105105
updateScope();
106-
this.el.find('div').append(this.$compile(this.vis.type!.visConfig.template)(this.$scope));
106+
this.el
107+
.find('div')
108+
.append(this.$compile(this.vis.type.visConfig?.template ?? '')(this.$scope));
107109
this.$scope.$apply();
108110
} else {
109111
updateScope();

src/plugins/vis_type_tagcloud/public/to_ast.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ export const toExpressionAst = (vis: Vis<TagCloudVisParams>, params: BuildPipeli
3838
const esaggs = buildExpressionFunction<EsaggsExpressionFunctionDefinition>('esaggs', {
3939
index: vis.data.indexPattern!.id!,
4040
metricsAtAllLevels: vis.isHierarchical(),
41-
partialRows: vis.type.requiresPartialRows || false,
41+
partialRows: false,
4242
aggConfigs: JSON.stringify(vis.data.aggs!.aggs),
4343
includeFormatHints: false,
4444
});

src/plugins/vis_type_vega/public/vega_type.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
*/
1919

2020
import { i18n } from '@kbn/i18n';
21+
import { BaseVisTypeOptions } from 'src/plugins/visualizations/public';
2122
import { DefaultEditorSize } from '../../vis_default_editor/public';
2223
import { VegaVisualizationDependencies } from './plugin';
2324
import { VegaVisEditor } from './components';
@@ -31,7 +32,9 @@ import { VIS_EVENT_TO_TRIGGER } from '../../visualizations/public';
3132

3233
import { getInfoMessage } from './components/experimental_map_vis_info';
3334

34-
export const createVegaTypeDefinition = (dependencies: VegaVisualizationDependencies) => {
35+
export const createVegaTypeDefinition = (
36+
dependencies: VegaVisualizationDependencies
37+
): BaseVisTypeOptions => {
3538
const requestHandler = createVegaRequestHandler(dependencies);
3639
const visualization = createVegaVisualization(dependencies);
3740

src/plugins/visualizations/public/components/visualization_chart.tsx

+6
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,12 @@ class VisualizationChart extends React.Component<VisualizationChartProps> {
9090
const { vis } = this.props;
9191
const Visualization = vis.type.visualization;
9292

93+
if (!Visualization) {
94+
throw new Error(
95+
'Tried to use VisualizationChart component with a vis without visualization property.'
96+
);
97+
}
98+
9399
this.visualization = new Visualization(this.chartDiv.current, vis);
94100

95101
// We know that containerDiv.current will never be null, since we will always

src/plugins/visualizations/public/expressions/vis.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ import { VisType } from '../vis_types';
3636

3737
export interface ExprVisState {
3838
title?: string;
39-
type: VisType | string;
39+
type: VisType<unknown> | string;
4040
params?: VisParams;
4141
}
4242

@@ -52,7 +52,7 @@ export interface ExprVisAPI {
5252

5353
export class ExprVis extends EventEmitter {
5454
public title: string = '';
55-
public type: VisType;
55+
public type: VisType<unknown>;
5656
public params: VisParams = {};
5757
public sessionState: Record<string, any> = {};
5858
public API: ExprVisAPI;
@@ -92,7 +92,7 @@ export class ExprVis extends EventEmitter {
9292
};
9393
}
9494

95-
private getType(type: string | VisType) {
95+
private getType(type: string | VisType<unknown>) {
9696
if (_.isString(type)) {
9797
const newType = getTypes().get(type);
9898
if (!newType) {

src/plugins/visualizations/public/legacy/build_pipeline.ts

+8-4
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,10 @@ const vislibCharts: string[] = [
8686
'line',
8787
];
8888

89-
export const getSchemas = (vis: Vis, { timeRange, timefilter }: BuildPipelineParams): Schemas => {
89+
export const getSchemas = <TVisParams>(
90+
vis: Vis<TVisParams>,
91+
{ timeRange, timefilter }: BuildPipelineParams
92+
): Schemas => {
9093
const createSchemaConfig = (accessor: number, agg: IAggConfig): SchemaConfig => {
9194
if (isDateHistogramBucketAggConfig(agg)) {
9295
agg.params.timeRange = timeRange;
@@ -155,7 +158,8 @@ export const getSchemas = (vis: Vis, { timeRange, timefilter }: BuildPipelinePar
155158
}
156159
}
157160
if (schemaName === 'split') {
158-
schemaName = `split_${vis.params.row ? 'row' : 'column'}`;
161+
// TODO: We should check if there's a better way then casting to `any` here
162+
schemaName = `split_${(vis.params as any).row ? 'row' : 'column'}`;
159163
skipMetrics = responseAggs.length - metrics.length > 1;
160164
}
161165
if (!schemas[schemaName]) {
@@ -410,7 +414,7 @@ export const buildPipeline = async (vis: Vis, params: BuildPipelineParams) => {
410414
pipeline += `esaggs
411415
${prepareString('index', indexPattern!.id)}
412416
metricsAtAllLevels=${vis.isHierarchical()}
413-
partialRows=${vis.type.requiresPartialRows || vis.params.showPartialRows || false}
417+
partialRows=${vis.params.showPartialRows || false}
414418
${prepareJson('aggConfigs', vis.data.aggs!.aggs)} | `;
415419
}
416420

@@ -433,7 +437,7 @@ export const buildPipeline = async (vis: Vis, params: BuildPipelineParams) => {
433437
pipeline += `visualization type='${vis.type.name}'
434438
${prepareJson('visConfig', visConfig)}
435439
metricsAtAllLevels=${vis.isHierarchical()}
436-
partialRows=${vis.type.requiresPartialRows || vis.params.showPartialRows || false} `;
440+
partialRows=${vis.params.showPartialRows || false} `;
437441
if (indexPattern) {
438442
pipeline += `${prepareString('index', indexPattern.id)} `;
439443
if (vis.data.aggs) {

src/plugins/visualizations/public/vis.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ describe('Vis Class', function () {
121121
});
122122

123123
it('should return true for hierarchical vis (like pie)', function () {
124-
vis.type.hierarchicalData = true;
124+
(vis.type as any).hierarchicalData = true;
125125
expect(vis.isHierarchical()).toBe(true);
126126
});
127127
});

src/plugins/visualizations/public/vis.ts

+5-9
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ const getSearchSource = async (inputSearchSource: ISearchSource, savedSearchId?:
8484
type PartialVisState = Assign<SerializedVis, { data: Partial<SerializedVisData> }>;
8585

8686
export class Vis<TVisParams = VisParams> {
87-
public readonly type: VisType;
87+
public readonly type: VisType<TVisParams>;
8888
public readonly id?: string;
8989
public title: string = '';
9090
public description: string = '';
@@ -97,14 +97,14 @@ export class Vis<TVisParams = VisParams> {
9797
public readonly uiState: PersistedState;
9898

9999
constructor(visType: string, visState: SerializedVis = {} as any) {
100-
this.type = this.getType(visType);
100+
this.type = this.getType<TVisParams>(visType);
101101
this.params = this.getParams(visState.params);
102102
this.uiState = new PersistedState(visState.uiState);
103103
this.id = visState.id;
104104
}
105105

106-
private getType(visType: string) {
107-
const type = getTypes().get(visType);
106+
private getType<TVisParams>(visType: string) {
107+
const type = getTypes().get<TVisParams>(visType);
108108
if (!type) {
109109
const errorMessage = i18n.translate('visualizations.visualizationTypeInvalidMessage', {
110110
defaultMessage: 'Invalid visualization type "{visType}"',
@@ -118,7 +118,7 @@ export class Vis<TVisParams = VisParams> {
118118
}
119119

120120
private getParams(params: VisParams) {
121-
return defaults({}, cloneDeep(params || {}), cloneDeep(this.type.visConfig.defaults || {}));
121+
return defaults({}, cloneDeep(params ?? {}), cloneDeep(this.type.visConfig?.defaults ?? {}));
122122
}
123123

124124
async setState(state: PartialVisState) {
@@ -202,10 +202,6 @@ export class Vis<TVisParams = VisParams> {
202202
};
203203
}
204204

205-
toExpressionAst() {
206-
return this.type.toExpressionAst(this.params);
207-
}
208-
209205
// deprecated
210206
isHierarchical() {
211207
if (isFunction(this.type.hierarchicalData)) {

0 commit comments

Comments
 (0)