kibana/x-pack/plugins/lens/public/plugin.ts

259 lines
9.3 KiB
TypeScript
Raw Normal View History

2020-05-01 12:57:29 +02:00
/*
* 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; you may not use this file except in compliance with the Elastic License
* 2.0.
2020-05-01 12:57:29 +02:00
*/
import { AppMountParameters, CoreSetup, CoreStart } from 'kibana/public';
import { DataPublicPluginSetup, DataPublicPluginStart } from '../../../../src/plugins/data/public';
import { EmbeddableSetup, EmbeddableStart } from '../../../../src/plugins/embeddable/public';
import { DashboardStart } from '../../../../src/plugins/dashboard/public';
import { ExpressionsSetup, ExpressionsStart } from '../../../../src/plugins/expressions/public';
import {
VisualizationsSetup,
VisualizationsStart,
} from '../../../../src/plugins/visualizations/public';
import { NavigationPublicPluginStart } from '../../../../src/plugins/navigation/public';
import { UrlForwardingSetup } from '../../../../src/plugins/url_forwarding/public';
import { GlobalSearchPluginSetup } from '../../global_search/public';
import { ChartsPluginSetup, ChartsPluginStart } from '../../../../src/plugins/charts/public';
import { PresentationUtilPluginStart } from '../../../../src/plugins/presentation_util/public';
import { EmbeddableStateTransfer } from '../../../../src/plugins/embeddable/public';
2020-05-01 12:57:29 +02:00
import { EditorFrameService } from './editor_frame_service';
import {
IndexPatternDatasource,
IndexPatternDatasourceSetupPlugins,
} from './indexpattern_datasource';
import { XyVisualization, XyVisualizationPluginSetupPlugins } from './xy_visualization';
import { MetricVisualization, MetricVisualizationPluginSetupPlugins } from './metric_visualization';
import {
DatatableVisualization,
DatatableVisualizationPluginSetupPlugins,
} from './datatable_visualization';
import { PieVisualization, PieVisualizationPluginSetupPlugins } from './pie_visualization';
import { AppNavLinkStatus } from '../../../../src/core/public';
SavedObjects tagging MVP (#79096) * create xpack plugin skeleton, start to implement management section * add tag creation modal * first implementation of the tags table * use InMemoryTable * add edit modal and delete action * update plugin list * add tag list, fix types * add capabilities check on client-side * add tag combo box component * add missing i18n keys * fix privilege FTR tests * add base structure for FTR tests * fix feature ftr test * use string literals for i18n * create savedObjectsTaggingOss plugin, move API types to oss plugin, start to wire to SO management page. * update plugin list * fix types * allow to use `_find` with multiple references * add FTR test for _find API on references fields * add _find integration tests * update generated doc * start to implement tag filtering on SO management section * update generated docs * wire tagging API to dashboard listing page * fix i18n namespace * fix type & tests * update dashboard listing snapshots * adapt FTR listingTable service to search for parsable queries * wite tagging API to visualize listing * update tagging plugin limits * add server-side and client-side validation for tag create/edit * rename title field to name * fix types * fix types bis * add removeReferencesTo API to SOR/SOC * update generated doc * add server-side unit test for `savedObjectsTagging` plugin * move tagging API types to its own file * add savedObjectsTaggingOss mock * add tags_cache tests * add tests for client-side tag client * extract uiApi to distinct files * various API improvements * add more tests * add link between tag and so management sections + add connection counts * add base functional test suite for tagging * add more FTR tests * improve feature control func test * update codeowners * update generated doc * fix access to proxy modal * adapt SO save modal to allow to add tag field * add SO decorator registry and tag implementation * add unit tests for SO tag decorator * add functional tests for visualize integration * add tag SO read permission for vis/dash feature * add RBAC api integ tests * add API integration tests * add test for getTagConnectionsUrl * add SOM test suite * add dashboard integration suite * remove test line * add missing unit tests * improve API types doc * fix create modal save button label * remove console.log * improve doc * self review * add refresh interval for tag cache * improve page object doc * minor cleanup * address review comments * small layout fixes * add initial focus * use lazy accessor for tag request handler context * adapt SOM export and export route to handle references * remove icon from feature config due to master changes * fix SO table tests * update generated docs * sort tags by name in filter dropdown and listing component * wire SO tagging to dashboard save modal * fix types * - add 'create tag' action in tag selector - add notifications on update/create/delete from management - delete modal wording * add description max length validation * remove real-time validation * fix i18n bundle id * update expected size of savedObjectsTagging plugin * use own useIfMounted * update limit again, contract components cannot be lazy loaded atm. * math is hard * remove single usage of lodash for bundle size * add async imports for create/edit modal * add FTR test for 'create tag' action from tag selector * allow 'create new' option to prepopulate name field * extract savedObjectToTag * add advancedSettings read user for security api_integ suite * add audit login for security client wrapper * use import type when possible * wire SO tagging to lens visualization * fix lens jest test * Fix `create tag` option being selected when closing the selector dropdown * add sorting to tag column from getTableColumnDef * address some of restrry comments * rename tag selector's setSelected option to onTagsSelected * fix audit logging even type for saved_object_remove_references * update plugin size limit to current size * adapt maxlength validation wording * remove selection column until we have batch action menu * remove connections link when user lack read privilege to savedObjectManagement * forbid registering multiple SO decorators with the same priority * add so decorator test * extract getTagFindReferences and create API mock * update audit-logging ascidoc * doc nit * throw conflict error if update returns any failure * use refresh=true as default * wording nits * export: rename `references` to `hasReference` * update generated doc * set description max length to 100 * do not initialize tag cache on anonymous pages * split fetchObjectsToExport into two distinct functions * change tag client `delete` call order * tsdoc nits * more nits * add README for oss plugin * add oss plugin start tests * SavedObject.find: rename `references` to `hasReference` * change section description label * remove url prefix constants * last nits and comments * update generated doc
2020-11-03 10:33:18 +01:00
import type { SavedObjectTaggingPluginStart } from '../../saved_objects_tagging/public';
2020-05-01 12:57:29 +02:00
import {
UiActionsStart,
ACTION_VISUALIZE_FIELD,
VISUALIZE_FIELD_TRIGGER,
} from '../../../../src/plugins/ui_actions/public';
import { APP_ID, getEditPath, NOT_INTERNATIONALIZED_PRODUCT_NAME } from '../common';
2020-05-01 12:57:29 +02:00
import { EditorFrameStart } from './types';
import { getLensAliasConfig } from './vis_type_alias';
import { visualizeFieldAction } from './trigger_actions/visualize_field_actions';
import { getSearchProvider } from './search_provider';
2020-05-01 12:57:29 +02:00
import { LensAttributeService } from './lens_attribute_service';
import { LensEmbeddableInput } from './editor_frame_service/embeddable';
import {
EmbeddableComponentProps,
getEmbeddableComponent,
} from './editor_frame_service/embeddable/embeddable_component';
2020-05-01 12:57:29 +02:00
export interface LensPluginSetupDependencies {
urlForwarding: UrlForwardingSetup;
2020-05-01 12:57:29 +02:00
expressions: ExpressionsSetup;
data: DataPublicPluginSetup;
embeddable?: EmbeddableSetup;
visualizations: VisualizationsSetup;
charts: ChartsPluginSetup;
globalSearch?: GlobalSearchPluginSetup;
2020-05-01 12:57:29 +02:00
}
export interface LensPluginStartDependencies {
data: DataPublicPluginStart;
expressions: ExpressionsStart;
navigation: NavigationPublicPluginStart;
uiActions: UiActionsStart;
dashboard: DashboardStart;
[Visualize] New visualization wizard (#79627) * [Visualizations] New vis wizard * Update functional tests * Create oss plugins for maps and lens and unregister alias function * Add new plugins to .i18nrc.json * Add readme and codeowners to the new plugins * update docs * fix tests * fix types * fixes * Update development docs * fix oss functional tests * Fix jest and x-pack functional tests * Fix functional test * changes on the layout * Cleanup and responsiveness * cleanup unecessary code * add common folder to the new OSS plugins * remove unecessary translations * Update limits.yml file * Fix basic label * Add experimental badge on controls vis * Nice improvements * fixes * Improving styles * Making modal go full height on smaller screens * Fixing sass lint warning * fix lint error * fix internationalization error * PR fixes * PR changes * Use useCallback where possible * Remove translations that need to be translated again * Lazy Load wizard modal * Remove legacyMapVisualizationWarning * Import the OSS plugins constants from the plugins * Export constant from lensOss * Change the new oss plugins from OSS to Oss * Add a new line to the kibana.json files of the new plugins * New nit fix * Fix spaces * Change the texts for the first step of the modal * Fix test * Fixes some of the PR comments * Add onClick funtionality to the entire aggregation based card * Cards description changes, introduce a copyFromRoot method to solve the problem of when disabling the x-pack plugic, to also disable the oss * Create new FTR for testing the functionality of the wizard when both maps and lens apps are disabled * fix eslint error * Change groupTitles and descriptions * Change input vis description * Remove the copyFromRoot from the signature of the ConfigDeprecationFactory and export it from the main entrypoint * Make the disabled cards badge clickable * Changes from code review * Fix functional tests failures * Rename groupTitle to titleInWizard to be more specific * Change vega vis note * minor design changes * fix problem with plugins list docs * Retrieve maps and lens landing page from docs service and add tracking url param * Fix funtional test for the new dashboard flow * Fix logic in alias registry for removing the discardOnRegister alias * no need to remove the alias entry from the discardOnRegister array Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: miukimiu <elizabet.oliveira@elastic.co>
2020-11-06 17:03:44 +01:00
visualizations: VisualizationsStart;
embeddable: EmbeddableStart;
charts: ChartsPluginStart;
SavedObjects tagging MVP (#79096) * create xpack plugin skeleton, start to implement management section * add tag creation modal * first implementation of the tags table * use InMemoryTable * add edit modal and delete action * update plugin list * add tag list, fix types * add capabilities check on client-side * add tag combo box component * add missing i18n keys * fix privilege FTR tests * add base structure for FTR tests * fix feature ftr test * use string literals for i18n * create savedObjectsTaggingOss plugin, move API types to oss plugin, start to wire to SO management page. * update plugin list * fix types * allow to use `_find` with multiple references * add FTR test for _find API on references fields * add _find integration tests * update generated doc * start to implement tag filtering on SO management section * update generated docs * wire tagging API to dashboard listing page * fix i18n namespace * fix type & tests * update dashboard listing snapshots * adapt FTR listingTable service to search for parsable queries * wite tagging API to visualize listing * update tagging plugin limits * add server-side and client-side validation for tag create/edit * rename title field to name * fix types * fix types bis * add removeReferencesTo API to SOR/SOC * update generated doc * add server-side unit test for `savedObjectsTagging` plugin * move tagging API types to its own file * add savedObjectsTaggingOss mock * add tags_cache tests * add tests for client-side tag client * extract uiApi to distinct files * various API improvements * add more tests * add link between tag and so management sections + add connection counts * add base functional test suite for tagging * add more FTR tests * improve feature control func test * update codeowners * update generated doc * fix access to proxy modal * adapt SO save modal to allow to add tag field * add SO decorator registry and tag implementation * add unit tests for SO tag decorator * add functional tests for visualize integration * add tag SO read permission for vis/dash feature * add RBAC api integ tests * add API integration tests * add test for getTagConnectionsUrl * add SOM test suite * add dashboard integration suite * remove test line * add missing unit tests * improve API types doc * fix create modal save button label * remove console.log * improve doc * self review * add refresh interval for tag cache * improve page object doc * minor cleanup * address review comments * small layout fixes * add initial focus * use lazy accessor for tag request handler context * adapt SOM export and export route to handle references * remove icon from feature config due to master changes * fix SO table tests * update generated docs * sort tags by name in filter dropdown and listing component * wire SO tagging to dashboard save modal * fix types * - add 'create tag' action in tag selector - add notifications on update/create/delete from management - delete modal wording * add description max length validation * remove real-time validation * fix i18n bundle id * update expected size of savedObjectsTagging plugin * use own useIfMounted * update limit again, contract components cannot be lazy loaded atm. * math is hard * remove single usage of lodash for bundle size * add async imports for create/edit modal * add FTR test for 'create tag' action from tag selector * allow 'create new' option to prepopulate name field * extract savedObjectToTag * add advancedSettings read user for security api_integ suite * add audit login for security client wrapper * use import type when possible * wire SO tagging to lens visualization * fix lens jest test * Fix `create tag` option being selected when closing the selector dropdown * add sorting to tag column from getTableColumnDef * address some of restrry comments * rename tag selector's setSelected option to onTagsSelected * fix audit logging even type for saved_object_remove_references * update plugin size limit to current size * adapt maxlength validation wording * remove selection column until we have batch action menu * remove connections link when user lack read privilege to savedObjectManagement * forbid registering multiple SO decorators with the same priority * add so decorator test * extract getTagFindReferences and create API mock * update audit-logging ascidoc * doc nit * throw conflict error if update returns any failure * use refresh=true as default * wording nits * export: rename `references` to `hasReference` * update generated doc * set description max length to 100 * do not initialize tag cache on anonymous pages * split fetchObjectsToExport into two distinct functions * change tag client `delete` call order * tsdoc nits * more nits * add README for oss plugin * add oss plugin start tests * SavedObject.find: rename `references` to `hasReference` * change section description label * remove url prefix constants * last nits and comments * update generated doc
2020-11-03 10:33:18 +01:00
savedObjectsTagging?: SavedObjectTaggingPluginStart;
presentationUtil: PresentationUtilPluginStart;
2020-05-01 12:57:29 +02:00
}
export interface LensPublicStart {
/**
* React component which can be used to embed a Lens visualization into another application.
* See `x-pack/examples/embedded_lens_example` for exemplary usage.
*
* This API might undergo breaking changes even in minor versions.
*
* @experimental
*/
EmbeddableComponent: React.ComponentType<EmbeddableComponentProps>;
/**
* Method which navigates to the Lens editor, loading the state specified by the `input` parameter.
* See `x-pack/examples/embedded_lens_example` for exemplary usage.
*
* This API might undergo breaking changes even in minor versions.
*
* @experimental
*/
navigateToPrefilledEditor: (input: LensEmbeddableInput) => void;
/**
* Method which returns true if the user has permission to use Lens as defined by application capabilities.
*/
canUseEditor: () => boolean;
}
2020-05-01 12:57:29 +02:00
export class LensPlugin {
private datatableVisualization: DatatableVisualization;
private editorFrameService: EditorFrameService;
private createEditorFrame: EditorFrameStart['createInstance'] | null = null;
private attributeService: (() => Promise<LensAttributeService>) | null = null;
2020-05-01 12:57:29 +02:00
private indexpatternDatasource: IndexPatternDatasource;
private xyVisualization: XyVisualization;
private metricVisualization: MetricVisualization;
private pieVisualization: PieVisualization;
2020-05-01 12:57:29 +02:00
private stopReportManager?: () => void;
2020-05-01 12:57:29 +02:00
constructor() {
this.datatableVisualization = new DatatableVisualization();
this.editorFrameService = new EditorFrameService();
this.indexpatternDatasource = new IndexPatternDatasource();
this.xyVisualization = new XyVisualization();
this.metricVisualization = new MetricVisualization();
this.pieVisualization = new PieVisualization();
2020-05-01 12:57:29 +02:00
}
setup(
core: CoreSetup<LensPluginStartDependencies, void>,
{
urlForwarding,
expressions,
data,
embeddable,
visualizations,
charts,
globalSearch,
}: LensPluginSetupDependencies
2020-05-01 12:57:29 +02:00
) {
this.attributeService = async () => {
const { getLensAttributeService } = await import('./async_services');
const [coreStart, startDependencies] = await core.getStartServices();
return getLensAttributeService(coreStart, startDependencies);
};
const editorFrameSetupInterface = this.editorFrameService.setup(
core,
{
data,
embeddable,
charts,
expressions,
},
this.attributeService
);
const dependencies: IndexPatternDatasourceSetupPlugins &
XyVisualizationPluginSetupPlugins &
DatatableVisualizationPluginSetupPlugins &
MetricVisualizationPluginSetupPlugins &
PieVisualizationPluginSetupPlugins = {
2020-05-01 12:57:29 +02:00
expressions,
data,
charts,
2020-05-01 12:57:29 +02:00
editorFrame: editorFrameSetupInterface,
formatFactory: core
.getStartServices()
.then(([_, { data: dataStart }]) => dataStart.fieldFormats.deserialize),
};
this.indexpatternDatasource.setup(core, dependencies);
this.xyVisualization.setup(core, dependencies);
this.datatableVisualization.setup(core, dependencies);
this.metricVisualization.setup(core, dependencies);
this.pieVisualization.setup(core, dependencies);
2020-05-01 12:57:29 +02:00
visualizations.registerAlias(getLensAliasConfig());
const getByValueFeatureFlag = async () => {
const [, deps] = await core.getStartServices();
return deps.dashboard.dashboardFeatureFlagConfig;
};
const getPresentationUtilContext = async () => {
const [, deps] = await core.getStartServices();
const { ContextProvider } = deps.presentationUtil;
return ContextProvider;
};
core.application.register({
id: APP_ID,
2020-05-01 12:57:29 +02:00
title: NOT_INTERNATIONALIZED_PRODUCT_NAME,
navLinkStatus: AppNavLinkStatus.hidden,
2020-05-01 12:57:29 +02:00
mount: async (params: AppMountParameters) => {
const { mountApp, stopReportManager } = await import('./async_services');
this.stopReportManager = stopReportManager;
return mountApp(core, params, {
createEditorFrame: this.createEditorFrame!,
attributeService: this.attributeService!,
getByValueFeatureFlag,
getPresentationUtilContext,
});
2020-05-01 12:57:29 +02:00
},
});
if (globalSearch) {
globalSearch.registerResultProvider(
getSearchProvider(
core.getStartServices().then(
([
{
application: { capabilities },
},
]) => capabilities
)
)
);
}
urlForwarding.forwardApp('lens', 'lens');
2020-05-01 12:57:29 +02:00
}
start(core: CoreStart, startDependencies: LensPluginStartDependencies): LensPublicStart {
const frameStart = this.editorFrameService.start(core, startDependencies);
this.createEditorFrame = frameStart.createInstance;
// unregisters the Visualize action and registers the lens one
if (startDependencies.uiActions.hasAction(ACTION_VISUALIZE_FIELD)) {
startDependencies.uiActions.unregisterAction(ACTION_VISUALIZE_FIELD);
}
startDependencies.uiActions.addTriggerAction(
VISUALIZE_FIELD_TRIGGER,
visualizeFieldAction(core.application)
);
return {
EmbeddableComponent: getEmbeddableComponent(startDependencies.embeddable),
navigateToPrefilledEditor: (input: LensEmbeddableInput) => {
if (input.timeRange) {
startDependencies.data.query.timefilter.timefilter.setTime(input.timeRange);
}
const transfer = new EmbeddableStateTransfer(
core.application.navigateToApp,
core.application.currentAppId$
);
transfer.navigateToEditor('lens', {
path: getEditPath(undefined),
state: {
originatingApp: '',
valueInput: input,
},
});
},
canUseEditor: () => {
return Boolean(core.application.capabilities.visualize?.show);
},
};
2020-05-01 12:57:29 +02:00
}
stop() {
if (this.stopReportManager) {
this.stopReportManager();
}
2020-05-01 12:57:29 +02:00
}
}