Skip to content

Commit

Permalink
Fix missing import on build for kibana 7.14 (#3665)
Browse files Browse the repository at this point in the history
* changed import of saved searches

* local copy of legacy/vis_update_state
  • Loading branch information
frankeros committed Oct 27, 2021
1 parent 53fe3f9 commit 025ce3e
Show file tree
Hide file tree
Showing 5 changed files with 215 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,12 @@
* specific language governing permissions and limitations
* under the License.
*/
import {
createSavedObjectClass,
SavedObject,
SavedObjectKibanaServices,
} from '../../../../../../src/plugins/saved_objects/public';

export function createSavedSearchClass(services: SavedObjectKibanaServices) {
const SavedObjectClass = createSavedObjectClass(services);
import { SavedObject, SavedObjectsStart } from '../../../../../../src/plugins/saved_objects/public';;

class SavedSearch extends SavedObjectClass {
export function createSavedSearchClass(savedObjects: SavedObjectsStart) {

class SavedSearch extends savedObjects.SavedObjectClass {
public static type: string = 'search';
public static mapping = {
title: 'text',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,18 @@
* under the License.
*/

import { SavedObjectLoader, SavedObjectKibanaServices } from '../../../../../../src/plugins/saved_objects/public';
import { SavedObjectsClientContract } from 'kibana/public';
import { SavedObjectLoader, SavedObjectsStart } from '../../../../../../src/plugins/saved_objects/public';
import { createSavedSearchClass } from './_saved_search';

export function createSavedSearchesLoader(services: SavedObjectKibanaServices) {
const SavedSearchClass = createSavedSearchClass(services);
const savedSearchLoader = new SavedObjectLoader(SavedSearchClass, services.savedObjectsClient);
interface Services {
savedObjectsClient: SavedObjectsClientContract;
savedObjects: SavedObjectsStart;
}

export function createSavedSearchesLoader({ savedObjectsClient, savedObjects }: Services) {
const SavedSearchClass = createSavedSearchClass(savedObjects);
const savedSearchLoader = new SavedObjectLoader(SavedSearchClass, savedObjectsClient);
// Customize loader properties since adding an 's' on type doesn't work for type 'search' .
savedSearchLoader.loaderProperties = {
name: 'searches',
Expand Down
10 changes: 5 additions & 5 deletions public/kibana-integrations/visualizations/_saved_vis.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,11 @@ import { SavedObject } from '../../../../../src/plugins/saved_objects/public';
// @ts-ignore
import { extractReferences, injectReferences } from './saved_visualization_references';
import { IIndexPattern } from '../../../../../src/plugins/data/public';
import { ISavedVis, SerializedVis, updateOldState } from '../../../../../src/plugins/visualizations/public';
import { createSavedSearchesLoader } from '../../../../../src/plugins/discover/public';
import { updateOldState } from './vis_update_state';
import { createSavedSearchesLoader } from '../discover/saved_searches';
import { getPlugins } from '../../kibana-services';

export const convertToSerializedVis = (savedVis: ISavedVis): SerializedVis => {
export const convertToSerializedVis = (savedVis) => {
const { id, title, description, visState, uiStateJSON, searchSourceFields } = savedVis;

const aggs = searchSourceFields && searchSourceFields.index ? visState.aggs || [] : visState.aggs;
Expand All @@ -52,7 +52,7 @@ export const convertToSerializedVis = (savedVis: ISavedVis): SerializedVis => {
};
};

export const convertFromSerializedVis = (vis: SerializedVis): ISavedVis => {
export const convertFromSerializedVis = (vis) => {
return {
id: vis.id,
title: vis.title,
Expand Down Expand Up @@ -107,7 +107,7 @@ export function createSavedVisClass(services) {
version: 1,
},
afterESResp: async (savedObject: SavedObject) => {
const savedVis = (savedObject as any) as ISavedVis;
const savedVis = (savedObject as any);
savedVis.visState = await updateOldState(savedVis.visState);
if (savedVis.searchSourceFields?.index) {
await services.indexPatterns.get(savedVis.searchSourceFields.index as any);
Expand Down
195 changes: 195 additions & 0 deletions public/kibana-integrations/visualizations/vis_update_state.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,195 @@
/*
* 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 { set } from '@elastic/safer-lodash-set';
import _ from 'lodash';

/**
* Will figure out if an heatmap state was saved before the auto coloring
* feature of heatmaps was created. If so it will set the overwriteColor flag
* for the label to true if labels are enabled and a non default color has been used.
* So that those earlier created heatmaps will still use the manual specified color.
*/
function convertHeatmapLabelColor(visState) {
const hasOverwriteColorParam =
_.get(visState, 'params.valueAxes[0].labels.overwriteColor') !== undefined;
if (visState.type === 'heatmap' && visState.params && !hasOverwriteColorParam) {
const showLabels = _.get(visState, 'params.valueAxes[0].labels.show', false);
const color = _.get(visState, 'params.valueAxes[0].labels.color', '#555');
set(visState, 'params.valueAxes[0].labels.overwriteColor', showLabels && color !== '#555');
}
}

/**
* Update old terms aggregation format to new terms aggregation format. This will
* update the following things:
* - Rewrite orderBy: _term to orderBy: _key (new API in Elasticsearch)
*/
function convertTermAggregation(visState) {
if (visState.aggs) {
visState.aggs.forEach((agg) => {
if (agg.type === 'terms' && agg.params && agg.params.orderBy === '_term') {
agg.params.orderBy = '_key';
}
});
}
}

function convertPropertyNames(visState) {
// 'showMeticsAtAllLevels' is a legacy typo we'll fix by changing it to 'showMetricsAtAllLevels'.
if (typeof _.get(visState, 'params.showMeticsAtAllLevels') === 'boolean') {
visState.params.showMetricsAtAllLevels = visState.params.showMeticsAtAllLevels;
delete visState.params.showMeticsAtAllLevels;
}
}

function convertDateHistogramScaleMetrics(visState) {
if (visState.aggs) {
visState.aggs.forEach((agg) => {
if (
agg.type === 'date_histogram' &&
agg.params &&
agg.params.interval !== 'auto' &&
agg.params.scaleMetricValues === undefined
) {
// Set scaleMetricValues to true for existing date histograms, that haven't had it defined and used an interval that's not equal auto,
// so that we keep the previous metric scaling example for existing visualizations that might be effected.
agg.params.scaleMetricValues = true;
}
});
}
}

function convertSeriesParams(visState) {
if (visState.params.seriesParams) {
return;
}

// update value axis options
const isUserDefinedYAxis = visState.params.setYExtents;
const defaultYExtents = visState.params.defaultYExtents;
const mode = ['stacked', 'overlap'].includes(visState.params.mode)
? 'normal'
: visState.params.mode || 'normal';

if (!visState.params.valueAxes || !visState.params.valueAxes.length) {
visState.params.valueAxes = [
{
id: 'ValueAxis-1',
name: 'LeftAxis-1',
type: 'value',
position: 'left',
show: true,
style: {},
scale: {
type: 'linear',
mode: 'normal',
},
labels: {
show: true,
rotate: 0,
filter: false,
truncate: 100,
},
title: {
text: 'Count',
},
},
];
}

visState.params.valueAxes[0].scale = {
...visState.params.valueAxes[0].scale,
type: visState.params.scale || 'linear',
setYExtents: visState.params.setYExtents || false,
defaultYExtents: visState.params.defaultYExtents || false,
boundsMargin: defaultYExtents ? visState.params.boundsMargin : 0,
min: isUserDefinedYAxis ? visState.params.yAxis.min : undefined,
max: isUserDefinedYAxis ? visState.params.yAxis.max : undefined,
mode: mode,
};

// update series options
const interpolate = visState.params.smoothLines ? 'cardinal' : visState.params.interpolate;
const stacked = ['stacked', 'percentage', 'wiggle', 'silhouette'].includes(visState.params.mode);
visState.params.seriesParams = [
{
show: true,
type: visState.params.type || 'line',
mode: stacked ? 'stacked' : 'normal',
interpolate: interpolate,
drawLinesBetweenPoints: visState.params.drawLinesBetweenPoints,
showCircles: visState.params.showCircles,
radiusRatio: visState.params.radiusRatio,
data: {
label: 'Count',
id: '1',
},
lineWidth: 2,
valueAxis: 'ValueAxis-1',
},
];
}

/**
* This function is responsible for updating old visStates - the actual saved object
* object - into the format, that will be required by the current Kibana version.
* This method will be executed for each saved vis object, that will be loaded.
* It will return the updated version as Kibana would expect it. It does not modify
* the passed state.
*/
export const updateOldState = (visState) => {
if (!visState) return visState;
const newState = _.cloneDeep(visState);

convertTermAggregation(newState);
convertPropertyNames(newState);
convertDateHistogramScaleMetrics(newState);

if (visState.params && ['line', 'area', 'histogram'].includes(visState.params.type)) {
convertSeriesParams(newState);
}

if (visState.type === 'gauge' && visState.fontSize) {
delete newState.fontSize;
set(newState, 'gauge.style.fontSize', visState.fontSize);
}

// update old metric to the new one
// Changed from 6.0 -> 6.1
if (
['gauge', 'metric'].includes(visState.type) &&
_.get(visState.params, 'gauge.gaugeType', null) === 'Metric'
) {
newState.type = 'metric';
newState.params.addLegend = false;
newState.params.type = 'metric';
newState.params.metric = newState.params.gauge;
delete newState.params.gauge;
delete newState.params.metric.gaugeType;
delete newState.params.metric.gaugeStyle;
delete newState.params.metric.backStyle;
delete newState.params.metric.scale;
delete newState.params.metric.type;
delete newState.params.metric.orientation;
delete newState.params.metric.verticalSplit;
delete newState.params.metric.autoExtend;
newState.params.metric.metricColorMode = newState.params.metric.gaugeColorMode;
delete newState.params.metric.gaugeColorMode;
} else if (
visState.type === 'metric' &&
_.get(visState.params, 'gauge.gaugeType', 'Metric') !== 'Metric'
) {
newState.type = 'gauge';
newState.params.type = 'gauge';
}

convertHeatmapLabelColor(newState);

return newState;
};
2 changes: 1 addition & 1 deletion public/services/resolves/get-saved-search.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
* Find more information about this on the LICENSE file.
*/
import { healthCheck } from './health-check';
import { createSavedSearchesLoader } from '../../../../../src/plugins/discover/public';
import { createSavedSearchesLoader } from '../../kibana-integrations/discover/saved_searches';
import {
getToasts,
getChrome,
Expand Down

0 comments on commit 025ce3e

Please sign in to comment.