[ML] Add ML deep links to navigational search (#88958)
* [ML] Add ML deep links to navigational search * [ML] Refactor register helper files * [ML] Edit import in search_deep_links * [ML] Move register_feature out of register_helper * [ML] Add comment about registerFeature Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
This commit is contained in:
parent
6391ef9c45
commit
4bc5f01428
|
@ -70,7 +70,7 @@ export interface MlSetupDependencies {
|
||||||
export type MlCoreSetup = CoreSetup<MlStartDependencies, MlPluginStart>;
|
export type MlCoreSetup = CoreSetup<MlStartDependencies, MlPluginStart>;
|
||||||
|
|
||||||
export class MlPlugin implements Plugin<MlPluginSetup, MlPluginStart> {
|
export class MlPlugin implements Plugin<MlPluginSetup, MlPluginStart> {
|
||||||
private appUpdater = new BehaviorSubject<AppUpdater>(() => ({}));
|
private appUpdater$ = new BehaviorSubject<AppUpdater>(() => ({}));
|
||||||
private urlGenerator: undefined | UrlGeneratorContract<typeof ML_APP_URL_GENERATOR>;
|
private urlGenerator: undefined | UrlGeneratorContract<typeof ML_APP_URL_GENERATOR>;
|
||||||
|
|
||||||
constructor(private initializerContext: PluginInitializerContext) {}
|
constructor(private initializerContext: PluginInitializerContext) {}
|
||||||
|
@ -85,7 +85,7 @@ export class MlPlugin implements Plugin<MlPluginSetup, MlPluginStart> {
|
||||||
euiIconType: PLUGIN_ICON_SOLUTION,
|
euiIconType: PLUGIN_ICON_SOLUTION,
|
||||||
appRoute: '/app/ml',
|
appRoute: '/app/ml',
|
||||||
category: DEFAULT_APP_CATEGORIES.kibana,
|
category: DEFAULT_APP_CATEGORIES.kibana,
|
||||||
updater$: this.appUpdater,
|
updater$: this.appUpdater$,
|
||||||
mount: async (params: AppMountParameters) => {
|
mount: async (params: AppMountParameters) => {
|
||||||
const [coreStart, pluginsStart] = await core.getStartServices();
|
const [coreStart, pluginsStart] = await core.getStartServices();
|
||||||
const kibanaVersion = this.initializerContext.env.packageInfo.version;
|
const kibanaVersion = this.initializerContext.env.packageInfo.version;
|
||||||
|
@ -133,23 +133,34 @@ export class MlPlugin implements Plugin<MlPluginSetup, MlPluginStart> {
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
// if ml is disabled in elasticsearch, disable ML in kibana
|
// if ml is disabled in elasticsearch, disable ML in kibana
|
||||||
this.appUpdater.next(() => ({
|
this.appUpdater$.next(() => ({
|
||||||
status: AppStatus.inaccessible,
|
status: AppStatus.inaccessible,
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
// register various ML plugin features which require a full license
|
// register various ML plugin features which require a full license
|
||||||
const { registerEmbeddables, registerManagementSection, registerMlUiActions } = await import(
|
// note including registerFeature in register_helper would cause the page bundle size to increase significantly
|
||||||
'./register_helper'
|
const {
|
||||||
);
|
registerEmbeddables,
|
||||||
|
registerManagementSection,
|
||||||
|
registerMlUiActions,
|
||||||
|
registerSearchLinks,
|
||||||
|
} = await import('./register_helper');
|
||||||
|
|
||||||
if (isMlEnabled(license) && isFullLicense(license)) {
|
const mlEnabled = isMlEnabled(license);
|
||||||
const canManageMLJobs = capabilities.management?.insightsAndAlerting?.jobsListLink ?? false;
|
const fullLicense = isFullLicense(license);
|
||||||
if (canManageMLJobs && pluginsSetup.management !== undefined) {
|
if (mlEnabled) {
|
||||||
registerManagementSection(pluginsSetup.management, core).enable();
|
registerSearchLinks(this.appUpdater$, fullLicense);
|
||||||
|
|
||||||
|
if (fullLicense) {
|
||||||
|
const canManageMLJobs =
|
||||||
|
capabilities.management?.insightsAndAlerting?.jobsListLink ?? false;
|
||||||
|
if (canManageMLJobs && pluginsSetup.management !== undefined) {
|
||||||
|
registerManagementSection(pluginsSetup.management, core).enable();
|
||||||
|
}
|
||||||
|
registerEmbeddables(pluginsSetup.embeddable, core);
|
||||||
|
registerMlUiActions(pluginsSetup.uiActions, core);
|
||||||
}
|
}
|
||||||
registerEmbeddables(pluginsSetup.embeddable, core);
|
|
||||||
registerMlUiActions(pluginsSetup.uiActions, core);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
10
x-pack/plugins/ml/public/register_helper/index.ts
Normal file
10
x-pack/plugins/ml/public/register_helper/index.ts
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
/*
|
||||||
|
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
||||||
|
* or more contributor license agreements. Licensed under the Elastic License;
|
||||||
|
* you may not use this file except in compliance with the Elastic License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
export { registerEmbeddables } from '../embeddables';
|
||||||
|
export { registerManagementSection } from '../application/management';
|
||||||
|
export { registerMlUiActions } from '../ui_actions';
|
||||||
|
export { registerSearchLinks } from './register_search_links';
|
|
@ -4,7 +4,4 @@
|
||||||
* you may not use this file except in compliance with the Elastic License.
|
* you may not use this file except in compliance with the Elastic License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export { registerEmbeddables } from './embeddables';
|
export { registerSearchLinks } from './register_search_links';
|
||||||
export { registerFeature } from './register_feature';
|
|
||||||
export { registerManagementSection } from './application/management';
|
|
||||||
export { registerMlUiActions } from './ui_actions';
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
/*
|
||||||
|
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
||||||
|
* or more contributor license agreements. Licensed under the Elastic License;
|
||||||
|
* you may not use this file except in compliance with the Elastic License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { i18n } from '@kbn/i18n';
|
||||||
|
import { BehaviorSubject } from 'rxjs';
|
||||||
|
|
||||||
|
import { AppUpdater } from 'src/core/public';
|
||||||
|
import { getSearchDeepLinks } from './search_deep_links';
|
||||||
|
|
||||||
|
export function registerSearchLinks(
|
||||||
|
appUpdater: BehaviorSubject<AppUpdater>,
|
||||||
|
isFullLicense: boolean
|
||||||
|
) {
|
||||||
|
appUpdater.next(() => ({
|
||||||
|
meta: {
|
||||||
|
keywords: [
|
||||||
|
i18n.translate('xpack.ml.keyword.ml', {
|
||||||
|
defaultMessage: 'ML',
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
searchDeepLinks: getSearchDeepLinks(isFullLicense),
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
}
|
|
@ -0,0 +1,110 @@
|
||||||
|
/*
|
||||||
|
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
||||||
|
* or more contributor license agreements. Licensed under the Elastic License;
|
||||||
|
* you may not use this file except in compliance with the Elastic License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { i18n } from '@kbn/i18n';
|
||||||
|
|
||||||
|
import type { AppSearchDeepLink } from 'src/core/public';
|
||||||
|
import { ML_PAGES } from '../../../common/constants/ml_url_generator';
|
||||||
|
|
||||||
|
const OVERVIEW_LINK_SEARCH_DEEP_LINK: AppSearchDeepLink = {
|
||||||
|
id: 'mlOverviewSearchDeepLink',
|
||||||
|
title: i18n.translate('xpack.ml.searchDeepLink.overview', {
|
||||||
|
defaultMessage: 'Overview',
|
||||||
|
}),
|
||||||
|
path: `/${ML_PAGES.OVERVIEW}`,
|
||||||
|
};
|
||||||
|
|
||||||
|
const ANOMALY_DETECTION_SEARCH_DEEP_LINK: AppSearchDeepLink = {
|
||||||
|
id: 'mlAnomalyDetectionSearchDeepLink',
|
||||||
|
title: i18n.translate('xpack.ml.searchDeepLink.anomalyDetection', {
|
||||||
|
defaultMessage: 'Anomaly Detection',
|
||||||
|
}),
|
||||||
|
path: `/${ML_PAGES.ANOMALY_DETECTION_JOBS_MANAGE}`,
|
||||||
|
};
|
||||||
|
|
||||||
|
const DATA_FRAME_ANALYTICS_SEARCH_DEEP_LINK: AppSearchDeepLink = {
|
||||||
|
id: 'mlDataFrameAnalyticsSearchDeepLink',
|
||||||
|
title: i18n.translate('xpack.ml.searchDeepLink.dataFrameAnalytics', {
|
||||||
|
defaultMessage: 'Data Frame Analytics',
|
||||||
|
}),
|
||||||
|
path: `/${ML_PAGES.DATA_FRAME_ANALYTICS_JOBS_MANAGE}`,
|
||||||
|
searchDeepLinks: [
|
||||||
|
{
|
||||||
|
id: 'mlTrainedModelsSearchDeepLink',
|
||||||
|
title: i18n.translate('xpack.ml.searchDeepLink.trainedModels', {
|
||||||
|
defaultMessage: 'Trained Models',
|
||||||
|
}),
|
||||||
|
path: `/${ML_PAGES.DATA_FRAME_ANALYTICS_MODELS_MANAGE}`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
const DATA_VISUALIZER_SEARCH_DEEP_LINK: AppSearchDeepLink = {
|
||||||
|
id: 'mlDataVisualizerSearchDeepLink',
|
||||||
|
title: i18n.translate('xpack.ml.searchDeepLink.dataVisualizer', {
|
||||||
|
defaultMessage: 'Data Visualizer',
|
||||||
|
}),
|
||||||
|
path: `/${ML_PAGES.DATA_VISUALIZER}`,
|
||||||
|
};
|
||||||
|
|
||||||
|
const FILE_UPLOAD_SEARCH_DEEP_LINK: AppSearchDeepLink = {
|
||||||
|
id: 'mlFileUploadSearchDeepLink',
|
||||||
|
title: i18n.translate('xpack.ml.searchDeepLink.fileUpload', {
|
||||||
|
defaultMessage: 'File Upload',
|
||||||
|
}),
|
||||||
|
path: `/${ML_PAGES.DATA_VISUALIZER_FILE}`,
|
||||||
|
};
|
||||||
|
|
||||||
|
const INDEX_DATA_VISUALIZER_SEARCH_DEEP_LINK: AppSearchDeepLink = {
|
||||||
|
id: 'mlIndexDataVisualizerSearchDeepLink',
|
||||||
|
title: i18n.translate('xpack.ml.searchDeepLink.indexDataVisualizer', {
|
||||||
|
defaultMessage: 'Index Data Visualizer',
|
||||||
|
}),
|
||||||
|
path: `/${ML_PAGES.DATA_VISUALIZER_INDEX_SELECT}`,
|
||||||
|
};
|
||||||
|
|
||||||
|
const SETTINGS_SEARCH_DEEP_LINK: AppSearchDeepLink = {
|
||||||
|
id: 'mlSettingsSearchDeepLink',
|
||||||
|
title: i18n.translate('xpack.ml.searchDeepLink.settings', {
|
||||||
|
defaultMessage: 'Settings',
|
||||||
|
}),
|
||||||
|
path: `/${ML_PAGES.SETTINGS}`,
|
||||||
|
searchDeepLinks: [
|
||||||
|
{
|
||||||
|
id: 'mlCalendarSettingsSearchDeepLink',
|
||||||
|
title: i18n.translate('xpack.ml.searchDeepLink.calendarSettings', {
|
||||||
|
defaultMessage: 'Calendars',
|
||||||
|
}),
|
||||||
|
path: `/${ML_PAGES.CALENDARS_MANAGE}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'mlFilterListsSettingsSearchDeepLink',
|
||||||
|
title: i18n.translate('xpack.ml.searchDeepLink.filterListsSettings', {
|
||||||
|
defaultMessage: 'Filter Lists',
|
||||||
|
}),
|
||||||
|
path: `/${ML_PAGES.SETTINGS}`, // Link to settings page as read only users cannot view filter lists.
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
export function getSearchDeepLinks(isFullLicense: boolean) {
|
||||||
|
const deepLinks: AppSearchDeepLink[] = [
|
||||||
|
DATA_VISUALIZER_SEARCH_DEEP_LINK,
|
||||||
|
FILE_UPLOAD_SEARCH_DEEP_LINK,
|
||||||
|
INDEX_DATA_VISUALIZER_SEARCH_DEEP_LINK,
|
||||||
|
];
|
||||||
|
|
||||||
|
if (isFullLicense === true) {
|
||||||
|
deepLinks.push(
|
||||||
|
OVERVIEW_LINK_SEARCH_DEEP_LINK,
|
||||||
|
ANOMALY_DETECTION_SEARCH_DEEP_LINK,
|
||||||
|
DATA_FRAME_ANALYTICS_SEARCH_DEEP_LINK,
|
||||||
|
SETTINGS_SEARCH_DEEP_LINK
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return deepLinks;
|
||||||
|
}
|
Loading…
Reference in a new issue