From 818bef9fda20d6235dc1149373524de92147b88d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Yulia=20=C4=8Cech?=
<6585477+yuliacech@users.noreply.github.com>
Date: Wed, 23 Sep 2020 14:12:49 +0200
Subject: [PATCH] [Ingest Pipelines] Add url generator for ingest pipelines app
(#77872)
* [Ingest Pipelines] Add url generator for ingest pipelines app
* [Ingest Pipelines] Fix type check error
* [Ingest Pipelines] Fix import errors
* [Ingest Pipelines] Fix type check errors
* [Ingest Pipelines] Fix type check errors
* [ILM] Update UrlGenerator interface, clean up internal navigation service
* [ILM] Fix function export
* [ILM] Update functions signatures
* [ILM] Fix errors
* [ILM] Fix errors
* [ILM] Rename ROUTES_CONFIG and export MANAGEMENT_APP_ID
Co-authored-by: Elastic Machine
---
src/plugins/management/common/contants.ts | 20 ++++
src/plugins/management/public/index.ts | 2 +
src/plugins/management/public/plugin.ts | 3 +-
.../helpers/pipelines_clone.helpers.ts | 6 +-
.../helpers/pipelines_create.helpers.ts | 6 +-
.../helpers/pipelines_edit.helpers.ts | 6 +-
.../helpers/pipelines_list.helpers.ts | 6 +-
.../ingest_pipelines/common/constants.ts | 4 +-
x-pack/plugins/ingest_pipelines/kibana.json | 2 +-
.../public/application/app.tsx | 9 +-
.../pipelines_create/pipelines_create.tsx | 6 +-
.../pipelines_edit/pipelines_edit.tsx | 8 +-
.../sections/pipelines_list/empty_list.tsx | 7 +-
.../sections/pipelines_list/main.tsx | 12 +-
.../public/application/services/navigation.ts | 44 +++++++
.../plugins/ingest_pipelines/public/index.ts | 7 ++
.../plugins/ingest_pipelines/public/plugin.ts | 5 +-
.../plugins/ingest_pipelines/public/types.ts | 2 +
.../public/url_generator.test.ts | 107 ++++++++++++++++++
.../ingest_pipelines/public/url_generator.ts | 98 ++++++++++++++++
20 files changed, 325 insertions(+), 35 deletions(-)
create mode 100644 src/plugins/management/common/contants.ts
create mode 100644 x-pack/plugins/ingest_pipelines/public/application/services/navigation.ts
create mode 100644 x-pack/plugins/ingest_pipelines/public/url_generator.test.ts
create mode 100644 x-pack/plugins/ingest_pipelines/public/url_generator.ts
diff --git a/src/plugins/management/common/contants.ts b/src/plugins/management/common/contants.ts
new file mode 100644
index 0000000000000..6ff585510dab1
--- /dev/null
+++ b/src/plugins/management/common/contants.ts
@@ -0,0 +1,20 @@
+/*
+ * Licensed to Elasticsearch B.V. under one or more contributor
+ * license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright
+ * ownership. Elasticsearch B.V. licenses this file to you under
+ * the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+export const MANAGEMENT_APP_ID = 'management';
diff --git a/src/plugins/management/public/index.ts b/src/plugins/management/public/index.ts
index f6c23ccf0143f..f3e25b90b73c7 100644
--- a/src/plugins/management/public/index.ts
+++ b/src/plugins/management/public/index.ts
@@ -32,3 +32,5 @@ export {
ManagementStart,
DefinedSections,
} from './types';
+
+export { MANAGEMENT_APP_ID } from '../common/contants';
diff --git a/src/plugins/management/public/plugin.ts b/src/plugins/management/public/plugin.ts
index 808578c470ae1..122e73796753c 100644
--- a/src/plugins/management/public/plugin.ts
+++ b/src/plugins/management/public/plugin.ts
@@ -33,6 +33,7 @@ import {
AppNavLinkStatus,
} from '../../../core/public';
+import { MANAGEMENT_APP_ID } from '../common/contants';
import {
ManagementSectionsService,
getSectionsServiceStartPrivate,
@@ -72,7 +73,7 @@ export class ManagementPlugin implements Plugin & {
actions: ReturnType;
@@ -29,8 +29,8 @@ export const PIPELINE_TO_CLONE = {
const testBedConfig: TestBedConfig = {
memoryRouter: {
- initialEntries: [`${BASE_PATH}create/${PIPELINE_TO_CLONE.name}`],
- componentRoutePath: `${BASE_PATH}create/:name`,
+ initialEntries: [getClonePath({ clonedPipelineName: PIPELINE_TO_CLONE.name })],
+ componentRoutePath: ROUTES.clone,
},
doMountAsync: true,
};
diff --git a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_create.helpers.ts b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_create.helpers.ts
index ce5ab1faa01be..22f68f12804d6 100644
--- a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_create.helpers.ts
+++ b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_create.helpers.ts
@@ -5,10 +5,10 @@
*/
import { registerTestBed, TestBedConfig, TestBed } from '../../../../../test_utils';
-import { BASE_PATH } from '../../../common/constants';
import { PipelinesCreate } from '../../../public/application/sections/pipelines_create';
import { getFormActions, PipelineFormTestSubjects } from './pipeline_form.helpers';
import { WithAppDependencies } from './setup_environment';
+import { getCreatePath, ROUTES } from '../../../public/application/services/navigation';
export type PipelinesCreateTestBed = TestBed & {
actions: ReturnType;
@@ -16,8 +16,8 @@ export type PipelinesCreateTestBed = TestBed & {
const testBedConfig: TestBedConfig = {
memoryRouter: {
- initialEntries: [`${BASE_PATH}/create`],
- componentRoutePath: `${BASE_PATH}/create`,
+ initialEntries: [getCreatePath()],
+ componentRoutePath: ROUTES.create,
},
doMountAsync: true,
};
diff --git a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_edit.helpers.ts b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_edit.helpers.ts
index 31c9630086178..5e0739f78eecd 100644
--- a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_edit.helpers.ts
+++ b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_edit.helpers.ts
@@ -5,10 +5,10 @@
*/
import { registerTestBed, TestBedConfig, TestBed } from '../../../../../test_utils';
-import { BASE_PATH } from '../../../common/constants';
import { PipelinesEdit } from '../../../public/application/sections/pipelines_edit';
import { getFormActions, PipelineFormTestSubjects } from './pipeline_form.helpers';
import { WithAppDependencies } from './setup_environment';
+import { getEditPath, ROUTES } from '../../../public/application/services/navigation';
export type PipelinesEditTestBed = TestBed & {
actions: ReturnType;
@@ -29,8 +29,8 @@ export const PIPELINE_TO_EDIT = {
const testBedConfig: TestBedConfig = {
memoryRouter: {
- initialEntries: [`${BASE_PATH}edit/${PIPELINE_TO_EDIT.name}`],
- componentRoutePath: `${BASE_PATH}edit/:name`,
+ initialEntries: [getEditPath({ pipelineName: PIPELINE_TO_EDIT.name })],
+ componentRoutePath: ROUTES.edit,
},
doMountAsync: true,
};
diff --git a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_list.helpers.ts b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_list.helpers.ts
index 03ffe361bb5a6..43ca849e61aee 100644
--- a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_list.helpers.ts
+++ b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_list.helpers.ts
@@ -6,7 +6,6 @@
import { act } from 'react-dom/test-utils';
-import { BASE_PATH } from '../../../common/constants';
import {
registerTestBed,
TestBed,
@@ -16,11 +15,12 @@ import {
} from '../../../../../test_utils';
import { PipelinesList } from '../../../public/application/sections/pipelines_list';
import { WithAppDependencies } from './setup_environment';
+import { getListPath, ROUTES } from '../../../public/application/services/navigation';
const testBedConfig: TestBedConfig = {
memoryRouter: {
- initialEntries: [BASE_PATH],
- componentRoutePath: BASE_PATH,
+ initialEntries: [getListPath()],
+ componentRoutePath: ROUTES.list,
},
doMountAsync: true,
};
diff --git a/x-pack/plugins/ingest_pipelines/common/constants.ts b/x-pack/plugins/ingest_pipelines/common/constants.ts
index 4c6c6fefaad83..0d6f977bfbfed 100644
--- a/x-pack/plugins/ingest_pipelines/common/constants.ts
+++ b/x-pack/plugins/ingest_pipelines/common/constants.ts
@@ -9,9 +9,9 @@ const basicLicense: LicenseType = 'basic';
export const PLUGIN_ID = 'ingest_pipelines';
-export const PLUGIN_MIN_LICENSE_TYPE = basicLicense;
+export const MANAGEMENT_APP_ID = 'management';
-export const BASE_PATH = '/';
+export const PLUGIN_MIN_LICENSE_TYPE = basicLicense;
export const API_BASE_PATH = '/api/ingest_pipelines';
diff --git a/x-pack/plugins/ingest_pipelines/kibana.json b/x-pack/plugins/ingest_pipelines/kibana.json
index 1eec8cf87bf47..28d7b89ee05bc 100644
--- a/x-pack/plugins/ingest_pipelines/kibana.json
+++ b/x-pack/plugins/ingest_pipelines/kibana.json
@@ -3,7 +3,7 @@
"version": "kibana",
"server": true,
"ui": true,
- "requiredPlugins": ["licensing", "management", "features"],
+ "requiredPlugins": ["licensing", "management", "features", "share"],
"optionalPlugins": ["security", "usageCollection"],
"configPath": ["xpack", "ingest_pipelines"],
"requiredBundles": ["esUiShared", "kibanaReact"]
diff --git a/x-pack/plugins/ingest_pipelines/public/application/app.tsx b/x-pack/plugins/ingest_pipelines/public/application/app.tsx
index 55b59caab8d60..e78c4d3983183 100644
--- a/x-pack/plugins/ingest_pipelines/public/application/app.tsx
+++ b/x-pack/plugins/ingest_pipelines/public/application/app.tsx
@@ -21,13 +21,14 @@ import {
} from '../shared_imports';
import { PipelinesList, PipelinesCreate, PipelinesEdit, PipelinesClone } from './sections';
+import { ROUTES } from './services/navigation';
export const AppWithoutRouter = () => (
-
-
-
-
+
+
+
+
{/* Catch all */}
diff --git a/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_create/pipelines_create.tsx b/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_create/pipelines_create.tsx
index acca1c4e03f40..d4aa11715248e 100644
--- a/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_create/pipelines_create.tsx
+++ b/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_create/pipelines_create.tsx
@@ -16,7 +16,7 @@ import {
EuiSpacer,
} from '@elastic/eui';
-import { BASE_PATH } from '../../../../common/constants';
+import { getListPath } from '../../services/navigation';
import { Pipeline } from '../../../../common/types';
import { useKibana } from '../../../shared_imports';
import { PipelineForm } from '../../components';
@@ -50,11 +50,11 @@ export const PipelinesCreate: React.FunctionComponent {
- history.push(BASE_PATH);
+ history.push(getListPath());
};
useEffect(() => {
diff --git a/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_edit/pipelines_edit.tsx b/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_edit/pipelines_edit.tsx
index e09cf4820771f..35ca1635ab9c3 100644
--- a/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_edit/pipelines_edit.tsx
+++ b/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_edit/pipelines_edit.tsx
@@ -17,11 +17,11 @@ import {
} from '@elastic/eui';
import { EuiCallOut } from '@elastic/eui';
-import { BASE_PATH } from '../../../../common/constants';
import { Pipeline } from '../../../../common/types';
import { useKibana, SectionLoading } from '../../../shared_imports';
-import { PipelineForm } from '../../components';
+import { getListPath } from '../../services/navigation';
+import { PipelineForm } from '../../components';
import { attemptToURIDecode } from '../shared';
interface MatchParams {
@@ -56,11 +56,11 @@ export const PipelinesEdit: React.FunctionComponent {
- history.push(BASE_PATH);
+ history.push(getListPath());
};
useEffect(() => {
diff --git a/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_list/empty_list.tsx b/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_list/empty_list.tsx
index eba69ff454911..7f4caa09b6df0 100644
--- a/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_list/empty_list.tsx
+++ b/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_list/empty_list.tsx
@@ -11,6 +11,7 @@ import { useHistory } from 'react-router-dom';
import { ScopedHistory } from 'kibana/public';
import { reactRouterNavigate } from '../../../../../../../src/plugins/kibana_react/public';
import { useKibana } from '../../../shared_imports';
+import { getCreatePath } from '../../services/navigation';
export const EmptyList: FunctionComponent = () => {
const { services } = useKibana();
@@ -44,7 +45,11 @@ export const EmptyList: FunctionComponent = () => {
}
actions={
-
+
{i18n.translate('xpack.ingestPipelines.list.table.emptyPrompt.createButtonLabel', {
defaultMessage: 'Create a pipeline',
})}
diff --git a/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_list/main.tsx b/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_list/main.tsx
index 88148f1bc5746..be31f86e30c27 100644
--- a/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_list/main.tsx
+++ b/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_list/main.tsx
@@ -24,9 +24,9 @@ import {
} from '@elastic/eui';
import { Pipeline } from '../../../../common/types';
-import { BASE_PATH } from '../../../../common/constants';
import { useKibana, SectionLoading } from '../../../shared_imports';
import { UIM_PIPELINES_LIST_LOAD } from '../../constants';
+import { getEditPath, getClonePath, getListPath } from '../../services/navigation';
import { EmptyList } from './empty_list';
import { PipelineTable } from './table';
@@ -67,17 +67,17 @@ export const PipelinesList: React.FunctionComponent = ({
}
}, [pipelineNameFromLocation, data]);
- const goToEditPipeline = (name: string) => {
- history.push(`${BASE_PATH}/edit/${encodeURIComponent(name)}`);
+ const goToEditPipeline = (pipelineName: string) => {
+ history.push(getEditPath({ pipelineName }));
};
- const goToClonePipeline = (name: string) => {
- history.push(`${BASE_PATH}/create/${encodeURIComponent(name)}`);
+ const goToClonePipeline = (clonedPipelineName: string) => {
+ history.push(getClonePath({ clonedPipelineName }));
};
const goHome = () => {
setShowFlyout(false);
- history.push(BASE_PATH);
+ history.push(getListPath());
};
if (data && data.length === 0) {
diff --git a/x-pack/plugins/ingest_pipelines/public/application/services/navigation.ts b/x-pack/plugins/ingest_pipelines/public/application/services/navigation.ts
new file mode 100644
index 0000000000000..3ac3de6eac710
--- /dev/null
+++ b/x-pack/plugins/ingest_pipelines/public/application/services/navigation.ts
@@ -0,0 +1,44 @@
+/*
+ * 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.
+ */
+
+const BASE_PATH = '/';
+
+const EDIT_PATH = 'edit';
+
+const CREATE_PATH = 'create';
+
+const _getEditPath = (name: string, encode = true): string => {
+ return `${BASE_PATH}${EDIT_PATH}/${encode ? encodeURIComponent(name) : name}`;
+};
+
+const _getCreatePath = (): string => {
+ return `${BASE_PATH}${CREATE_PATH}`;
+};
+
+const _getClonePath = (name: string, encode = true): string => {
+ return `${BASE_PATH}${CREATE_PATH}/${encode ? encodeURIComponent(name) : name}`;
+};
+const _getListPath = (name?: string): string => {
+ return `${BASE_PATH}${name ? `?pipeline=${encodeURIComponent(name)}` : ''}`;
+};
+
+export const ROUTES = {
+ list: _getListPath(),
+ edit: _getEditPath(':name', false),
+ create: _getCreatePath(),
+ clone: _getClonePath(':sourceName', false),
+};
+
+export const getListPath = ({
+ inspectedPipelineName,
+}: {
+ inspectedPipelineName?: string;
+} = {}): string => _getListPath(inspectedPipelineName);
+export const getEditPath = ({ pipelineName }: { pipelineName: string }): string =>
+ _getEditPath(pipelineName, true);
+export const getCreatePath = (): string => _getCreatePath();
+export const getClonePath = ({ clonedPipelineName }: { clonedPipelineName: string }): string =>
+ _getClonePath(clonedPipelineName, true);
diff --git a/x-pack/plugins/ingest_pipelines/public/index.ts b/x-pack/plugins/ingest_pipelines/public/index.ts
index 7247973703804..637d4aad7264a 100644
--- a/x-pack/plugins/ingest_pipelines/public/index.ts
+++ b/x-pack/plugins/ingest_pipelines/public/index.ts
@@ -9,3 +9,10 @@ import { IngestPipelinesPlugin } from './plugin';
export function plugin() {
return new IngestPipelinesPlugin();
}
+
+export {
+ INGEST_PIPELINES_APP_ULR_GENERATOR,
+ IngestPipelinesUrlGenerator,
+ IngestPipelinesUrlGeneratorState,
+ INGEST_PIPELINES_PAGES,
+} from './url_generator';
diff --git a/x-pack/plugins/ingest_pipelines/public/plugin.ts b/x-pack/plugins/ingest_pipelines/public/plugin.ts
index 339068f185d1d..6c2f4a0898327 100644
--- a/x-pack/plugins/ingest_pipelines/public/plugin.ts
+++ b/x-pack/plugins/ingest_pipelines/public/plugin.ts
@@ -10,10 +10,11 @@ import { CoreSetup, Plugin } from 'src/core/public';
import { PLUGIN_ID } from '../common/constants';
import { uiMetricService, apiService } from './application/services';
import { Dependencies } from './types';
+import { registerUrlGenerator } from './url_generator';
export class IngestPipelinesPlugin implements Plugin {
public setup(coreSetup: CoreSetup, plugins: Dependencies): void {
- const { management, usageCollection } = plugins;
+ const { management, usageCollection, share } = plugins;
const { http, getStartServices } = coreSetup;
// Initialize services
@@ -46,6 +47,8 @@ export class IngestPipelinesPlugin implements Plugin {
};
},
});
+
+ registerUrlGenerator(coreSetup, management, share);
}
public start() {}
diff --git a/x-pack/plugins/ingest_pipelines/public/types.ts b/x-pack/plugins/ingest_pipelines/public/types.ts
index 91783ea04fa9a..e968c87226d07 100644
--- a/x-pack/plugins/ingest_pipelines/public/types.ts
+++ b/x-pack/plugins/ingest_pipelines/public/types.ts
@@ -6,8 +6,10 @@
import { ManagementSetup } from 'src/plugins/management/public';
import { UsageCollectionSetup } from 'src/plugins/usage_collection/public';
+import { SharePluginSetup } from '../../../../src/plugins/share/public';
export interface Dependencies {
management: ManagementSetup;
usageCollection: UsageCollectionSetup;
+ share: SharePluginSetup;
}
diff --git a/x-pack/plugins/ingest_pipelines/public/url_generator.test.ts b/x-pack/plugins/ingest_pipelines/public/url_generator.test.ts
new file mode 100644
index 0000000000000..1267d526fb7d4
--- /dev/null
+++ b/x-pack/plugins/ingest_pipelines/public/url_generator.test.ts
@@ -0,0 +1,107 @@
+/*
+ * 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 { IngestPipelinesUrlGenerator, INGEST_PIPELINES_PAGES } from './url_generator';
+
+describe('IngestPipelinesUrlGenerator', () => {
+ const getAppBasePath = (absolute: boolean = false) => {
+ if (absolute) {
+ return Promise.resolve('http://localhost/app/test_app');
+ }
+ return Promise.resolve('/app/test_app');
+ };
+ const urlGenerator = new IngestPipelinesUrlGenerator(getAppBasePath);
+
+ describe('Pipelines List', () => {
+ it('generates relative url for list without pipelineId', async () => {
+ const url = await urlGenerator.createUrl({
+ page: INGEST_PIPELINES_PAGES.LIST,
+ });
+ expect(url).toBe('/app/test_app/');
+ });
+
+ it('generates absolute url for list without pipelineId', async () => {
+ const url = await urlGenerator.createUrl({
+ page: INGEST_PIPELINES_PAGES.LIST,
+ absolute: true,
+ });
+ expect(url).toBe('http://localhost/app/test_app/');
+ });
+ it('generates relative url for list with a pipelineId', async () => {
+ const url = await urlGenerator.createUrl({
+ page: INGEST_PIPELINES_PAGES.LIST,
+ pipelineId: 'pipeline_name',
+ });
+ expect(url).toBe('/app/test_app/?pipeline=pipeline_name');
+ });
+
+ it('generates absolute url for list with a pipelineId', async () => {
+ const url = await urlGenerator.createUrl({
+ page: INGEST_PIPELINES_PAGES.LIST,
+ pipelineId: 'pipeline_name',
+ absolute: true,
+ });
+ expect(url).toBe('http://localhost/app/test_app/?pipeline=pipeline_name');
+ });
+ });
+
+ describe('Pipeline Edit', () => {
+ it('generates relative url for pipeline edit', async () => {
+ const url = await urlGenerator.createUrl({
+ page: INGEST_PIPELINES_PAGES.EDIT,
+ pipelineId: 'pipeline_name',
+ });
+ expect(url).toBe('/app/test_app/edit/pipeline_name');
+ });
+
+ it('generates absolute url for pipeline edit', async () => {
+ const url = await urlGenerator.createUrl({
+ page: INGEST_PIPELINES_PAGES.EDIT,
+ pipelineId: 'pipeline_name',
+ absolute: true,
+ });
+ expect(url).toBe('http://localhost/app/test_app/edit/pipeline_name');
+ });
+ });
+
+ describe('Pipeline Clone', () => {
+ it('generates relative url for pipeline clone', async () => {
+ const url = await urlGenerator.createUrl({
+ page: INGEST_PIPELINES_PAGES.CLONE,
+ pipelineId: 'pipeline_name',
+ });
+ expect(url).toBe('/app/test_app/create/pipeline_name');
+ });
+
+ it('generates absolute url for pipeline clone', async () => {
+ const url = await urlGenerator.createUrl({
+ page: INGEST_PIPELINES_PAGES.CLONE,
+ pipelineId: 'pipeline_name',
+ absolute: true,
+ });
+ expect(url).toBe('http://localhost/app/test_app/create/pipeline_name');
+ });
+ });
+
+ describe('Pipeline Create', () => {
+ it('generates relative url for pipeline create', async () => {
+ const url = await urlGenerator.createUrl({
+ page: INGEST_PIPELINES_PAGES.CREATE,
+ pipelineId: 'pipeline_name',
+ });
+ expect(url).toBe('/app/test_app/create');
+ });
+
+ it('generates absolute url for pipeline create', async () => {
+ const url = await urlGenerator.createUrl({
+ page: INGEST_PIPELINES_PAGES.CREATE,
+ pipelineId: 'pipeline_name',
+ absolute: true,
+ });
+ expect(url).toBe('http://localhost/app/test_app/create');
+ });
+ });
+});
diff --git a/x-pack/plugins/ingest_pipelines/public/url_generator.ts b/x-pack/plugins/ingest_pipelines/public/url_generator.ts
new file mode 100644
index 0000000000000..043d449a0440a
--- /dev/null
+++ b/x-pack/plugins/ingest_pipelines/public/url_generator.ts
@@ -0,0 +1,98 @@
+/*
+ * 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 { CoreSetup } from 'src/core/public';
+import { MANAGEMENT_APP_ID } from '../../../../src/plugins/management/public';
+import { UrlGeneratorsDefinition } from '../../../../src/plugins/share/public';
+import {
+ getClonePath,
+ getCreatePath,
+ getEditPath,
+ getListPath,
+} from './application/services/navigation';
+import { Dependencies } from './types';
+import { PLUGIN_ID } from '../common/constants';
+
+export const INGEST_PIPELINES_APP_ULR_GENERATOR = 'INGEST_PIPELINES_APP_URL_GENERATOR';
+
+export enum INGEST_PIPELINES_PAGES {
+ LIST = 'pipelines_list',
+ EDIT = 'pipeline_edit',
+ CREATE = 'pipeline_create',
+ CLONE = 'pipeline_clone',
+}
+
+interface UrlGeneratorState {
+ pipelineId: string;
+ absolute?: boolean;
+}
+export interface PipelinesListUrlGeneratorState extends Partial {
+ page: INGEST_PIPELINES_PAGES.LIST;
+}
+
+export interface PipelineEditUrlGeneratorState extends UrlGeneratorState {
+ page: INGEST_PIPELINES_PAGES.EDIT;
+}
+
+export interface PipelineCloneUrlGeneratorState extends UrlGeneratorState {
+ page: INGEST_PIPELINES_PAGES.CLONE;
+}
+
+export interface PipelineCreateUrlGeneratorState extends UrlGeneratorState {
+ page: INGEST_PIPELINES_PAGES.CREATE;
+}
+
+export type IngestPipelinesUrlGeneratorState =
+ | PipelinesListUrlGeneratorState
+ | PipelineEditUrlGeneratorState
+ | PipelineCloneUrlGeneratorState
+ | PipelineCreateUrlGeneratorState;
+
+export class IngestPipelinesUrlGenerator
+ implements UrlGeneratorsDefinition {
+ constructor(private readonly getAppBasePath: (absolute: boolean) => Promise) {}
+
+ public readonly id = INGEST_PIPELINES_APP_ULR_GENERATOR;
+
+ public readonly createUrl = async (state: IngestPipelinesUrlGeneratorState): Promise => {
+ switch (state.page) {
+ case INGEST_PIPELINES_PAGES.EDIT: {
+ return `${await this.getAppBasePath(!!state.absolute)}${getEditPath({
+ pipelineName: state.pipelineId,
+ })}`;
+ }
+ case INGEST_PIPELINES_PAGES.CREATE: {
+ return `${await this.getAppBasePath(!!state.absolute)}${getCreatePath()}`;
+ }
+ case INGEST_PIPELINES_PAGES.LIST: {
+ return `${await this.getAppBasePath(!!state.absolute)}${getListPath({
+ inspectedPipelineName: state.pipelineId,
+ })}`;
+ }
+ case INGEST_PIPELINES_PAGES.CLONE: {
+ return `${await this.getAppBasePath(!!state.absolute)}${getClonePath({
+ clonedPipelineName: state.pipelineId,
+ })}`;
+ }
+ }
+ };
+}
+
+export const registerUrlGenerator = (
+ coreSetup: CoreSetup,
+ management: Dependencies['management'],
+ share: Dependencies['share']
+) => {
+ const getAppBasePath = async (absolute = false) => {
+ const [coreStart] = await coreSetup.getStartServices();
+ return coreStart.application.getUrlForApp(MANAGEMENT_APP_ID, {
+ path: management.sections.section.ingest.getApp(PLUGIN_ID)!.basePath,
+ absolute: !!absolute,
+ });
+ };
+
+ share.urlGenerators.registerUrlGenerator(new IngestPipelinesUrlGenerator(getAppBasePath));
+};