Skip to content

Commit 7fb9d4d

Browse files
[7.x] [ML] Migrate internal urls to non-hash paths (#76735) (#77792)
Co-authored-by: Elastic Machine <[email protected]> Co-authored-by: Elastic Machine <[email protected]>
1 parent a0b9342 commit 7fb9d4d

File tree

121 files changed

+2284
-1028
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

121 files changed

+2284
-1028
lines changed

x-pack/plugins/ml/common/constants/app.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44
* you may not use this file except in compliance with the Elastic License.
55
*/
66

7+
import { i18n } from '@kbn/i18n';
8+
79
export const PLUGIN_ID = 'ml';
810
export const PLUGIN_ICON = 'machineLearningApp';
911
export const PLUGIN_ICON_SOLUTION = 'logoKibana';
12+
export const ML_APP_NAME = i18n.translate('xpack.ml.navMenu.mlAppNameText', {
13+
defaultMessage: 'Machine Learning',
14+
});

x-pack/plugins/ml/common/constants/data_frame_analytics.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,9 @@
44
* you may not use this file except in compliance with the Elastic License.
55
*/
66

7+
export const ANALYSIS_CONFIG_TYPE = {
8+
OUTLIER_DETECTION: 'outlier_detection',
9+
REGRESSION: 'regression',
10+
CLASSIFICATION: 'classification',
11+
} as const;
712
export const DEFAULT_RESULTS_FIELD = 'ml';

x-pack/plugins/ml/common/constants/ml_url_generator.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,16 @@ export const ML_PAGES = {
3131
* Open index data visualizer viewer page
3232
*/
3333
DATA_VISUALIZER_INDEX_VIEWER: 'jobs/new_job/datavisualizer',
34+
ANOMALY_DETECTION_CREATE_JOB: `jobs/new_job`,
3435
ANOMALY_DETECTION_CREATE_JOB_SELECT_TYPE: `jobs/new_job/step/job_type`,
36+
ANOMALY_DETECTION_CREATE_JOB_SELECT_INDEX: `jobs/new_job/step/index_or_search`,
3537
SETTINGS: 'settings',
3638
CALENDARS_MANAGE: 'settings/calendars_list',
39+
CALENDARS_NEW: 'settings/calendars_list/new_calendar',
40+
CALENDARS_EDIT: 'settings/calendars_list/edit_calendar',
3741
FILTER_LISTS_MANAGE: 'settings/filter_lists',
42+
FILTER_LISTS_NEW: 'settings/filter_lists/new_filter_list',
43+
FILTER_LISTS_EDIT: 'settings/filter_lists/edit_filter_list',
44+
ACCESS_DENIED: 'access-denied',
45+
OVERVIEW: 'overview',
3846
} as const;

x-pack/plugins/ml/common/types/data_frame_analytics.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import Boom from 'boom';
88
import { EsErrorBody } from '../util/errors';
9+
import { ANALYSIS_CONFIG_TYPE } from '../constants/data_frame_analytics';
910

1011
export interface DeleteDataFrameAnalyticsWithIndexStatus {
1112
success: boolean;
@@ -81,8 +82,4 @@ export interface DataFrameAnalyticsConfig {
8182
allow_lazy_start?: boolean;
8283
}
8384

84-
export enum ANALYSIS_CONFIG_TYPE {
85-
OUTLIER_DETECTION = 'outlier_detection',
86-
REGRESSION = 'regression',
87-
CLASSIFICATION = 'classification',
88-
}
85+
export type DataFrameAnalysisConfigType = typeof ANALYSIS_CONFIG_TYPE[keyof typeof ANALYSIS_CONFIG_TYPE];

x-pack/plugins/ml/common/types/ml_url_generator.ts

Lines changed: 52 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,21 @@
55
*/
66

77
import { RefreshInterval, TimeRange } from '../../../../../src/plugins/data/common/query';
8-
import { JobId } from '../../../reporting/common/types';
8+
import { JobId } from './anomaly_detection_jobs/job';
99
import { ML_PAGES } from '../constants/ml_url_generator';
10+
import { DataFrameAnalysisConfigType } from './data_frame_analytics';
1011

1112
type OptionalPageState = object | undefined;
1213

1314
export type MLPageState<PageType, PageState> = PageState extends OptionalPageState
14-
? { page: PageType; pageState?: PageState }
15+
? { page: PageType; pageState?: PageState; excludeBasePath?: boolean }
1516
: PageState extends object
16-
? { page: PageType; pageState: PageState }
17-
: { page: PageType };
18-
19-
export const ANALYSIS_CONFIG_TYPE = {
20-
OUTLIER_DETECTION: 'outlier_detection',
21-
REGRESSION: 'regression',
22-
CLASSIFICATION: 'classification',
23-
} as const;
24-
25-
type DataFrameAnalyticsType = typeof ANALYSIS_CONFIG_TYPE[keyof typeof ANALYSIS_CONFIG_TYPE];
17+
? { page: PageType; pageState: PageState; excludeBasePath?: boolean }
18+
: { page: PageType; excludeBasePath?: boolean };
2619

2720
export interface MlCommonGlobalState {
2821
time?: TimeRange;
22+
refreshInterval?: RefreshInterval;
2923
}
3024
export interface MlCommonAppState {
3125
[key: string]: any;
@@ -42,16 +36,28 @@ export interface MlGenericUrlPageState extends MlIndexBasedSearchState {
4236
[key: string]: any;
4337
}
4438

45-
export interface MlGenericUrlState {
46-
page:
47-
| typeof ML_PAGES.DATA_VISUALIZER_INDEX_VIEWER
48-
| typeof ML_PAGES.ANOMALY_DETECTION_CREATE_JOB_SELECT_TYPE;
49-
pageState: MlGenericUrlPageState;
50-
}
39+
export type MlGenericUrlState = MLPageState<
40+
| typeof ML_PAGES.DATA_VISUALIZER_INDEX_VIEWER
41+
| typeof ML_PAGES.ANOMALY_DETECTION_CREATE_JOB
42+
| typeof ML_PAGES.ANOMALY_DETECTION_CREATE_JOB_SELECT_TYPE
43+
| typeof ML_PAGES.ANOMALY_DETECTION_CREATE_JOB_SELECT_INDEX
44+
| typeof ML_PAGES.OVERVIEW
45+
| typeof ML_PAGES.CALENDARS_MANAGE
46+
| typeof ML_PAGES.CALENDARS_NEW
47+
| typeof ML_PAGES.FILTER_LISTS_MANAGE
48+
| typeof ML_PAGES.FILTER_LISTS_NEW
49+
| typeof ML_PAGES.SETTINGS
50+
| typeof ML_PAGES.ACCESS_DENIED
51+
| typeof ML_PAGES.DATA_VISUALIZER
52+
| typeof ML_PAGES.DATA_VISUALIZER_FILE
53+
| typeof ML_PAGES.DATA_VISUALIZER_INDEX_SELECT,
54+
MlGenericUrlPageState | undefined
55+
>;
5156

5257
export interface AnomalyDetectionQueryState {
5358
jobId?: JobId;
5459
groupIds?: string[];
60+
globalState?: MlCommonGlobalState;
5561
}
5662

5763
export type AnomalyDetectionUrlState = MLPageState<
@@ -86,7 +92,7 @@ export interface ExplorerUrlPageState {
8692
/**
8793
* Job IDs
8894
*/
89-
jobIds: JobId[];
95+
jobIds?: JobId[];
9096
/**
9197
* Optionally set the time range in the time picker.
9298
*/
@@ -104,6 +110,7 @@ export interface ExplorerUrlPageState {
104110
*/
105111
mlExplorerSwimlane?: ExplorerAppState['mlExplorerSwimlane'];
106112
mlExplorerFilter?: ExplorerAppState['mlExplorerFilter'];
113+
globalState?: MlCommonGlobalState;
107114
}
108115

109116
export type ExplorerUrlState = MLPageState<typeof ML_PAGES.ANOMALY_EXPLORER, ExplorerUrlPageState>;
@@ -122,6 +129,7 @@ export interface TimeSeriesExplorerAppState {
122129
to?: string;
123130
};
124131
mlTimeSeriesExplorer?: {
132+
forecastId?: string;
125133
detectorIndex?: number;
126134
entities?: Record<string, string>;
127135
};
@@ -131,10 +139,12 @@ export interface TimeSeriesExplorerAppState {
131139
export interface TimeSeriesExplorerPageState
132140
extends Pick<TimeSeriesExplorerAppState, 'zoom' | 'query'>,
133141
Pick<TimeSeriesExplorerGlobalState, 'refreshInterval'> {
134-
jobIds: JobId[];
142+
jobIds?: JobId[];
135143
timeRange?: TimeRange;
136144
detectorIndex?: number;
137145
entities?: Record<string, string>;
146+
forecastId?: string;
147+
globalState?: MlCommonGlobalState;
138148
}
139149

140150
export type TimeSeriesExplorerUrlState = MLPageState<
@@ -145,32 +155,43 @@ export type TimeSeriesExplorerUrlState = MLPageState<
145155
export interface DataFrameAnalyticsQueryState {
146156
jobId?: JobId | JobId[];
147157
groupIds?: string[];
158+
globalState?: MlCommonGlobalState;
148159
}
149160

150161
export type DataFrameAnalyticsUrlState = MLPageState<
151162
typeof ML_PAGES.DATA_FRAME_ANALYTICS_JOBS_MANAGE,
152163
DataFrameAnalyticsQueryState | undefined
153164
>;
154165

155-
export interface DataVisualizerUrlState {
156-
page:
157-
| typeof ML_PAGES.DATA_VISUALIZER
158-
| typeof ML_PAGES.DATA_VISUALIZER_FILE
159-
| typeof ML_PAGES.DATA_VISUALIZER_INDEX_SELECT;
160-
}
161-
162166
export interface DataFrameAnalyticsExplorationQueryState {
163167
ml: {
164168
jobId: JobId;
165-
analysisType: DataFrameAnalyticsType;
169+
analysisType: DataFrameAnalysisConfigType;
166170
};
167171
}
168172

169173
export type DataFrameAnalyticsExplorationUrlState = MLPageState<
170174
typeof ML_PAGES.DATA_FRAME_ANALYTICS_EXPLORATION,
171175
{
172176
jobId: JobId;
173-
analysisType: DataFrameAnalyticsType;
177+
analysisType: DataFrameAnalysisConfigType;
178+
globalState?: MlCommonGlobalState;
179+
}
180+
>;
181+
182+
export type CalendarEditUrlState = MLPageState<
183+
typeof ML_PAGES.CALENDARS_EDIT,
184+
{
185+
calendarId: string;
186+
globalState?: MlCommonGlobalState;
187+
}
188+
>;
189+
190+
export type FilterEditUrlState = MLPageState<
191+
typeof ML_PAGES.FILTER_LISTS_EDIT,
192+
{
193+
filterId: string;
194+
globalState?: MlCommonGlobalState;
174195
}
175196
>;
176197

@@ -183,5 +204,6 @@ export type MlUrlGeneratorState =
183204
| TimeSeriesExplorerUrlState
184205
| DataFrameAnalyticsUrlState
185206
| DataFrameAnalyticsExplorationUrlState
186-
| DataVisualizerUrlState
207+
| CalendarEditUrlState
208+
| FilterEditUrlState
187209
| MlGenericUrlState;

x-pack/plugins/ml/common/util/analytics_utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ import {
99
ClassificationAnalysis,
1010
OutlierAnalysis,
1111
RegressionAnalysis,
12-
ANALYSIS_CONFIG_TYPE,
1312
} from '../types/data_frame_analytics';
13+
import { ANALYSIS_CONFIG_TYPE } from '../../common/constants/data_frame_analytics';
1414

1515
export const isOutlierAnalysis = (arg: any): arg is OutlierAnalysis => {
1616
const keys = Object.keys(arg);

x-pack/plugins/ml/kibana.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
"embeddable",
1717
"uiActions",
1818
"kibanaLegacy",
19-
"indexPatternManagement"
19+
"indexPatternManagement",
20+
"discover"
2021
],
2122
"optionalPlugins": [
2223
"home",

x-pack/plugins/ml/public/application/app.tsx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { MlSetupDependencies, MlStartDependencies } from '../plugin';
2020
import { MlRouter } from './routing';
2121
import { mlApiServicesProvider } from './services/ml_api_service';
2222
import { HttpService } from './services/http_service';
23+
import { ML_APP_URL_GENERATOR, ML_PAGES } from '../../common/constants/ml_url_generator';
2324

2425
export type MlDependencies = Omit<MlSetupDependencies, 'share' | 'indexPatternManagement'> &
2526
MlStartDependencies;
@@ -50,11 +51,21 @@ export interface MlServicesContext {
5051
export type MlGlobalServices = ReturnType<typeof getMlGlobalServices>;
5152

5253
const App: FC<AppProps> = ({ coreStart, deps, appMountParams }) => {
54+
const redirectToMlAccessDeniedPage = async () => {
55+
const accessDeniedPageUrl = await deps.share.urlGenerators
56+
.getUrlGenerator(ML_APP_URL_GENERATOR)
57+
.createUrl({
58+
page: ML_PAGES.ACCESS_DENIED,
59+
});
60+
await coreStart.application.navigateToUrl(accessDeniedPageUrl);
61+
};
62+
5363
const pageDeps = {
5464
history: appMountParams.history,
5565
indexPatterns: deps.data.indexPatterns,
5666
config: coreStart.uiSettings!,
5767
setBreadcrumbs: coreStart.chrome!.setBreadcrumbs,
68+
redirectToMlAccessDeniedPage,
5869
};
5970
const services = {
6071
appName: 'ML',

x-pack/plugins/ml/public/application/capabilities/check_capabilities.ts

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,12 @@ export function checkGetManagementMlJobsResolver() {
3333
});
3434
}
3535

36-
export function checkGetJobsCapabilitiesResolver(): Promise<MlCapabilities> {
36+
export function checkGetJobsCapabilitiesResolver(
37+
redirectToMlAccessDeniedPage: () => Promise<void>
38+
): Promise<MlCapabilities> {
3739
return new Promise((resolve, reject) => {
3840
getCapabilities()
39-
.then(({ capabilities, isPlatinumOrTrialLicense }) => {
41+
.then(async ({ capabilities, isPlatinumOrTrialLicense }) => {
4042
_capabilities = capabilities;
4143
// the minimum privilege for using ML with a platinum or trial license is being able to get the transforms list.
4244
// all other functionality is controlled by the return capabilities object.
@@ -46,21 +48,23 @@ export function checkGetJobsCapabilitiesResolver(): Promise<MlCapabilities> {
4648
if (_capabilities.canGetJobs || isPlatinumOrTrialLicense === false) {
4749
return resolve(_capabilities);
4850
} else {
49-
window.location.href = '#/access-denied';
51+
await redirectToMlAccessDeniedPage();
5052
return reject();
5153
}
5254
})
53-
.catch((e) => {
54-
window.location.href = '#/access-denied';
55+
.catch(async (e) => {
56+
await redirectToMlAccessDeniedPage();
5557
return reject();
5658
});
5759
});
5860
}
5961

60-
export function checkCreateJobsCapabilitiesResolver(): Promise<MlCapabilities> {
62+
export function checkCreateJobsCapabilitiesResolver(
63+
redirectToJobsManagementPage: () => Promise<void>
64+
): Promise<MlCapabilities> {
6165
return new Promise((resolve, reject) => {
6266
getCapabilities()
63-
.then(({ capabilities, isPlatinumOrTrialLicense }) => {
67+
.then(async ({ capabilities, isPlatinumOrTrialLicense }) => {
6468
_capabilities = capabilities;
6569
// if the license is basic (isPlatinumOrTrialLicense === false) then do not redirect,
6670
// allow the promise to resolve as the separate license check will redirect then user to
@@ -69,34 +73,36 @@ export function checkCreateJobsCapabilitiesResolver(): Promise<MlCapabilities> {
6973
return resolve(_capabilities);
7074
} else {
7175
// if the user has no permission to create a job,
72-
// redirect them back to the Transforms Management page
73-
window.location.href = '#/jobs';
76+
// redirect them back to the Anomaly Detection Management page
77+
await redirectToJobsManagementPage();
7478
return reject();
7579
}
7680
})
77-
.catch((e) => {
78-
window.location.href = '#/jobs';
81+
.catch(async (e) => {
82+
await redirectToJobsManagementPage();
7983
return reject();
8084
});
8185
});
8286
}
8387

84-
export function checkFindFileStructurePrivilegeResolver(): Promise<MlCapabilities> {
88+
export function checkFindFileStructurePrivilegeResolver(
89+
redirectToMlAccessDeniedPage: () => Promise<void>
90+
): Promise<MlCapabilities> {
8591
return new Promise((resolve, reject) => {
8692
getCapabilities()
87-
.then(({ capabilities }) => {
93+
.then(async ({ capabilities }) => {
8894
_capabilities = capabilities;
8995
// the minimum privilege for using ML with a basic license is being able to use the datavisualizer.
9096
// all other functionality is controlled by the return _capabilities object
9197
if (_capabilities.canFindFileStructure) {
9298
return resolve(_capabilities);
9399
} else {
94-
window.location.href = '#/access-denied';
100+
await redirectToMlAccessDeniedPage();
95101
return reject();
96102
}
97103
})
98-
.catch((e) => {
99-
window.location.href = '#/access-denied';
104+
.catch(async (e) => {
105+
await redirectToMlAccessDeniedPage();
100106
return reject();
101107
});
102108
});

0 commit comments

Comments
 (0)