Skip to content

Commit

Permalink
[ML] Add ML deep links to navigational search (#88958)
Browse files Browse the repository at this point in the history
* [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 <[email protected]>
  • Loading branch information
peteharverson and kibanamachine authored Jan 25, 2021
1 parent 6391ef9 commit 4bc5f01
Show file tree
Hide file tree
Showing 5 changed files with 172 additions and 17 deletions.
37 changes: 24 additions & 13 deletions x-pack/plugins/ml/public/plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ export interface MlSetupDependencies {
export type MlCoreSetup = CoreSetup<MlStartDependencies, 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>;

constructor(private initializerContext: PluginInitializerContext) {}
Expand All @@ -85,7 +85,7 @@ export class MlPlugin implements Plugin<MlPluginSetup, MlPluginStart> {
euiIconType: PLUGIN_ICON_SOLUTION,
appRoute: '/app/ml',
category: DEFAULT_APP_CATEGORIES.kibana,
updater$: this.appUpdater,
updater$: this.appUpdater$,
mount: async (params: AppMountParameters) => {
const [coreStart, pluginsStart] = await core.getStartServices();
const kibanaVersion = this.initializerContext.env.packageInfo.version;
Expand Down Expand Up @@ -133,23 +133,34 @@ export class MlPlugin implements Plugin<MlPluginSetup, MlPluginStart> {
});
} else {
// if ml is disabled in elasticsearch, disable ML in kibana
this.appUpdater.next(() => ({
this.appUpdater$.next(() => ({
status: AppStatus.inaccessible,
}));
}

// register various ML plugin features which require a full license
const { registerEmbeddables, registerManagementSection, registerMlUiActions } = await import(
'./register_helper'
);

if (isMlEnabled(license) && isFullLicense(license)) {
const canManageMLJobs = capabilities.management?.insightsAndAlerting?.jobsListLink ?? false;
if (canManageMLJobs && pluginsSetup.management !== undefined) {
registerManagementSection(pluginsSetup.management, core).enable();
// note including registerFeature in register_helper would cause the page bundle size to increase significantly
const {
registerEmbeddables,
registerManagementSection,
registerMlUiActions,
registerSearchLinks,
} = await import('./register_helper');

const mlEnabled = isMlEnabled(license);
const fullLicense = isFullLicense(license);
if (mlEnabled) {
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);
}
});

Expand Down
10 changes: 10 additions & 0 deletions x-pack/plugins/ml/public/register_helper/index.ts
Original file line number Diff line number Diff line change
@@ -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';
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,4 @@
* you may not use this file except in compliance with the Elastic License.
*/

export { registerEmbeddables } from './embeddables';
export { registerFeature } from './register_feature';
export { registerManagementSection } from './application/management';
export { registerMlUiActions } from './ui_actions';
export { registerSearchLinks } from './register_search_links';
Original file line number Diff line number Diff line change
@@ -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),
},
}));
}
Original file line number Diff line number Diff line change
@@ -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;
}

0 comments on commit 4bc5f01

Please sign in to comment.