Skip to content

Commit

Permalink
clean up
Browse files Browse the repository at this point in the history
  • Loading branch information
VladLasitsa committed Sep 23, 2021
1 parent 1560e50 commit 7cd5973
Show file tree
Hide file tree
Showing 14 changed files with 153 additions and 46 deletions.
2 changes: 1 addition & 1 deletion src/plugins/visualizations/kibana.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
"inspector",
"savedObjects"
],
"optionalPlugins": ["usageCollection"],
"optionalPlugins": ["usageCollection", "spaces"],
"requiredBundles": ["kibanaUtils", "discover"],
"extraPublicDirs": ["common/constants", "common/prepare_log_table", "common/expression_functions"],
"owner": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ import { getExpressions, getUiActions } from '../services';
import { VIS_EVENT_TO_TRIGGER } from './events';
import { VisualizeEmbeddableFactoryDeps } from './visualize_embeddable_factory';
import { SavedObjectAttributes } from '../../../../core/types';
import { SavedVisualizationsLoader } from '../saved_visualizations';
import { getSavedVisualization } from '../utils/saved_visualize_utils';
import { VisSavedObject } from '../types';
import { toExpressionAst } from './to_ast';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,7 @@ import type {
import { VISUALIZE_EMBEDDABLE_TYPE } from './constants';
import type { SerializedVis, Vis } from '../vis';
import { createVisAsync } from '../vis_async';
import {
getCapabilities,
getTypes,
getUISettings,
} from '../services';
import { getCapabilities, getTypes, getUISettings } from '../services';
import { showNewVisModal } from '../wizard';
import {
convertToSerializedVis,
Expand Down Expand Up @@ -149,13 +145,28 @@ export class VisualizeEmbeddableFactory
input: Partial<VisualizeInput> & { id: string },
parent?: IContainer
): Promise<VisualizeEmbeddable | ErrorEmbeddable | DisabledLabEmbeddable> {
const { savedObjectsClient, data } = await this.deps.start().plugins;
const startDeps = await this.deps.start();

try {
const savedObject = await getSavedVisualization(
{ savedObjectsClient, search: data.search, dataViews: data.dataViews },
{
savedObjectsClient: startDeps.core.savedObjects.client,
search: startDeps.plugins.data.search,
dataViews: startDeps.plugins.data.dataViews,
},
savedObjectId
);

if (savedObject.sharingSavedObjectProps?.outcome === 'conflict') {
return new ErrorEmbeddable(
i18n.translate('visualizations.embeddable.legacyURLConflict.errorMessage', {
defaultMessage: `This object has the same URL as a legacy alias. Disable the alias to resolve this error : {json}`,
values: { json: savedObject.sharingSavedObjectProps?.errorJSON },
}),
input,
parent
);
}
const visState = convertToSerializedVis(savedObject);
const vis = await createVisAsync(savedObject.visState.type, visState);

Expand Down Expand Up @@ -219,12 +230,9 @@ export class VisualizeEmbeddableFactory
if (visObj) {
savedVis.uiStateJSON = visObj?.uiState.toString();
}
const {
plugins: { savedObjectsClient },
core,
} = await this.deps.start();
const { core } = await this.deps.start();
const id = await saveVisualization(savedVis, saveOptions, {
savedObjectsClient,
savedObjectsClient: core.savedObjects.client,
chrome: core.chrome,
overlays: core.overlays,
});
Expand Down
4 changes: 3 additions & 1 deletion src/plugins/visualizations/public/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,5 +54,7 @@ export {
convertFromSerializedVis,
getSavedVisualization,
saveVisualization,
findListItems
findListItems,
urlFor,
getFullPath
} from './utils/saved_visualize_utils';
6 changes: 5 additions & 1 deletion src/plugins/visualizations/public/plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,14 @@ import {
setSavedSearchLoader,
setEmbeddable,
setDocLinks,
setSpaces,
} from './services';
import {
VISUALIZE_EMBEDDABLE_TYPE,
VisualizeEmbeddableFactory,
createVisEmbeddableFromObject,
} from './embeddable';
import type { SpacesPluginStart } from '../../../../x-pack/plugins/spaces/public';
import { TypesService } from './vis_types/types_service';
import { range as rangeExpressionFunction } from '../common/expression_functions/range';
import { visDimension as visDimensionExpressionFunction } from '../common/expression_functions/vis_dimension';
Expand Down Expand Up @@ -103,6 +105,7 @@ export interface VisualizationsStartDeps {
getAttributeService: EmbeddableStart['getAttributeService'];
savedObjects: SavedObjectsStart;
savedObjectsClient: SavedObjectsClientContract;
spaces: SpacesPluginStart;
}

/**
Expand Down Expand Up @@ -149,7 +152,7 @@ export class VisualizationsPlugin

public start(
core: CoreStart,
{ data, expressions, uiActions, embeddable, savedObjects }: VisualizationsStartDeps
{ data, expressions, uiActions, embeddable, savedObjects, spaces }: VisualizationsStartDeps
): VisualizationsStart {
const types = this.types.start();
setTypes(types);
Expand All @@ -166,6 +169,7 @@ export class VisualizationsPlugin
setAggs(data.search.aggs);
setOverlays(core.overlays);
setChrome(core.chrome);
setSpaces(spaces);
const savedVisualizationsLoader = createSavedVisLoader({
savedObjectsClient: core.savedObjects.client,
indexPatterns: data.indexPatterns,
Expand Down
3 changes: 3 additions & 0 deletions src/plugins/visualizations/public/services.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import type {
SavedObjectsStart,
DocLinksStart,
} from '../../../core/public';
import type { SpacesPluginStart } from '../../../../x-pack/plugins/spaces/public';
import type { TypesStart } from './vis_types';
import { createGetterSetter } from '../../../plugins/kibana_utils/public';
import { DataPublicPluginStart, TimefilterContract } from '../../../plugins/data/public';
Expand Down Expand Up @@ -66,3 +67,5 @@ export const [getChrome, setChrome] = createGetterSetter<ChromeStart>('Chrome');

export const [getSavedSearchLoader, setSavedSearchLoader] =
createGetterSetter<SavedObjectLoader>('savedSearchLoader');

export const [getSpaces, setSpaces] = createGetterSetter<SpacesPluginStart>('Spaces');
18 changes: 17 additions & 1 deletion src/plugins/visualizations/public/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
* Side Public License, v 1.
*/

import type { SavedObjectsMigrationVersion } from 'kibana/public';
import {
IAggConfigs,
SearchSourceFields,
Expand Down Expand Up @@ -35,9 +36,24 @@ export interface ISavedVis {
uiStateJSON?: string;
savedSearchRefName?: string;
savedSearchId?: string;
sharingSavedObjectProps?: {
outcome?: 'aliasMatch' | 'exactMatch' | 'conflict';
aliasTargetId?: string;
errorJSON?: string;
};
}

export interface VisSavedObject extends ISavedVis {}
export interface VisSavedObject extends ISavedVis {
lastSavedTitle: string;
copyOnSave?: boolean;
getEsType: () => string;
getDisplayName?: () => string;
displayName: string;
migrationVersion?: SavedObjectsMigrationVersion;
searchSource?: any;
version?: string;
isSaving?: boolean;
}

export interface VisToExpressionAstParams {
timefilter: TimefilterContract;
Expand Down
62 changes: 36 additions & 26 deletions src/plugins/visualizations/public/utils/saved_visualize_utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,27 +6,29 @@
* Side Public License, v 1.
*/

import _, { assign, cloneDeep, defaults } from 'lodash';
import _ from 'lodash';
import type {
SavedObjectsFindOptionsReference,
SavedObjectsFindOptions,
SavedObjectsClientContract,
SavedObjectAttributes,
} from 'kibana/public';
import type { ChromeStart, OverlayStart } from '../../../../core/public';
import { SavedObjectNotFound } from '../../../../plugins/kibana_utils/public';
import {
extractSearchSourceReferences,
injectSearchSourceReferences,
parseSearchSourceJSON,
DataPublicPluginStart,
} from '../../../../plugins/data/public';
import {
checkForDuplicateTitle,
saveWithConfirmation,
isErrorNonFatal,
} from '../../../../plugins/saved_objects/public';
import { getTypes } from '../services';
import { getTypes, getSpaces, getSavedSearchLoader } from '../services';
import { VisualizationsAppExtension } from '../vis_types/vis_type_alias_registry';
import type { ISavedVis, SerializedVis } from '../types';
import type { VisSavedObject, SerializedVis, ISavedVis } from '../types';
// @ts-ignore
import { updateOldState } from '../legacy/vis_update_state';
import { injectReferences, extractReferences } from './saved_visualization_references';
Expand All @@ -42,7 +44,7 @@ const getDefaults = (opts: Record<string, unknown>) => ({
version: 1,
});

function getFullPath(id: string) {
export function getFullPath(id: string) {
return `/app/visualize#/edit/${id}`;
}

Expand Down Expand Up @@ -90,7 +92,7 @@ export function mapHitSource(
return attributes;
}

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

const aggs = searchSourceFields && searchSourceFields.index ? visState.aggs || [] : visState.aggs;
Expand Down Expand Up @@ -180,11 +182,11 @@ export async function findListItems(
export async function getSavedVisualization(
services: {
savedObjectsClient: SavedObjectsClientContract;
search: any;
dataViews: any;
search: DataPublicPluginStart['search'];
dataViews: DataPublicPluginStart['dataViews'];
},
opts?: any
) {
): Promise<VisSavedObject> {
if (typeof opts !== 'object') {
opts = { id: opts };
}
Expand All @@ -203,8 +205,8 @@ export async function getSavedVisualization(
const defaultsProps = getDefaults(opts);

if (!id) {
assign(savedObject, defaultsProps);
return Promise.resolve(savedObject);
_.assign(savedObject, defaultsProps);
return Promise.resolve(savedObject as VisSavedObject);
}

const {
Expand All @@ -217,27 +219,27 @@ export async function getSavedVisualization(
throw new SavedObjectNotFound(SAVED_VIS_TYPE, id || '');
}

savedObject._source = cloneDeep(resp.attributes);
savedObject._source = _.cloneDeep(resp.attributes);

if (savedObject._source.visState) {
savedObject._source.visState = JSON.parse(savedObject._source.visState);
}

// assign the defaults to the response
defaults(savedObject._source, defaultsProps);
_.defaults(savedObject._source, defaultsProps);

assign(savedObject, savedObject._source);
_.assign(savedObject, savedObject._source);
savedObject.lastSavedTitle = savedObject.title;

savedObject.sharingSavedObjectProps = {
aliasTargetId,
outcome,
errorJSON:
outcome === 'conflict'
outcome === 'conflict' && getSpaces()
? JSON.stringify({
targetType: SAVED_VIS_TYPE,
sourceId: id,
targetSpace: '',
targetSpace: (await getSpaces().getActiveSpace()).id,
})
: undefined,
};
Expand All @@ -263,24 +265,36 @@ export async function getSavedVisualization(
}

if (resp.references && resp.references.length > 0) {
injectReferences(savedObject as ISavedVis, resp.references);
injectReferences(savedObject as VisSavedObject, resp.references);
}

savedObject.visState = await updateOldState(savedObject.visState);
if (savedObject.searchSourceFields?.index) {
await services.dataViews.get(savedObject.searchSourceFields.index as any);
}

return savedObject as ISavedVis;
if (savedObject.savedSearchId && getSavedSearchLoader()) {
await getSavedSearchLoader().get(savedObject.savedSearchId);
}

return savedObject as VisSavedObject;
}

export async function saveVisualization(
savedObject: any,
{ confirmOverwrite = false, isTitleDuplicateConfirmed = false, onTitleDuplicate }: any = {},
savedObject: VisSavedObject,
{
confirmOverwrite = false,
isTitleDuplicateConfirmed = false,
onTitleDuplicate,
}: {
confirmOverwrite?: boolean;
isTitleDuplicateConfirmed?: boolean;
onTitleDuplicate?: () => void;
},
services: {
savedObjectsClient: SavedObjectsClientContract;
chrome: any;
overlays: any;
chrome: ChromeStart;
overlays: OverlayStart;
}
) {
// Save the original id in case the save fails.
Expand Down Expand Up @@ -323,10 +337,6 @@ export async function saveVisualization(
references.push(...searchSourceReferences);
}

if (savedObject.unresolvedIndexPatternReference) {
references.push(savedObject.unresolvedIndexPatternReference);
}

const extractedRefs = extractReferences({ attributes, references });

if (!extractedRefs.references) {
Expand Down Expand Up @@ -360,7 +370,7 @@ export async function saveVisualization(
savedObject.isSaving = false;
savedObject.lastSavedTitle = savedObject.title;
return savedObject.id;
} catch (err) {
} catch (err: any) {
savedObject.isSaving = false;
savedObject.id = originalId;
if (isErrorNonFatal(err)) {
Expand Down
1 change: 1 addition & 0 deletions src/plugins/visualizations/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,6 @@
{ "path": "../usage_collection/tsconfig.json" },
{ "path": "../kibana_utils/tsconfig.json" },
{ "path": "../discover/tsconfig.json" },
{ "path": "../../../x-pack/plugins/spaces/tsconfig.json" },
]
}
3 changes: 2 additions & 1 deletion src/plugins/visualize/kibana.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@
"home",
"share",
"savedObjectsTaggingOss",
"usageCollection"
"usageCollection",
"spaces"
],
"requiredBundles": [
"kibanaUtils",
Expand Down
Loading

0 comments on commit 7cd5973

Please sign in to comment.