mirror of
https://github.com/elastic/kibana.git
synced 2025-04-24 01:38:56 -04:00
This reverts commit e6f3f06f82
.
See
https://buildkite.com/elastic/kibana-artifacts-snapshot/builds/3610#018c22ec-6c1e-4b63-92de-58d63d688f94
This commit is contained in:
parent
e6f3f06f82
commit
6fceda6351
10 changed files with 66 additions and 201 deletions
|
@ -124,7 +124,6 @@ enabled:
|
|||
- test/functional/apps/kibana_overview/config.ts
|
||||
- test/functional/apps/management/config.ts
|
||||
- test/functional/apps/saved_objects_management/config.ts
|
||||
- test/functional/apps/sharing/config.ts
|
||||
- test/functional/apps/status_page/config.ts
|
||||
- test/functional/apps/visualize/group1/config.ts
|
||||
- test/functional/apps/visualize/group2/config.ts
|
||||
|
|
|
@ -1,13 +0,0 @@
|
|||
/*
|
||||
* 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 and the Server Side Public License, v 1; you may not use this file except
|
||||
* in compliance with, at your election, the Elastic License 2.0 or the Server
|
||||
* Side Public License, v 1.
|
||||
*/
|
||||
|
||||
import type { HttpSetup, IUiSettingsClient } from '@kbn/core/public';
|
||||
|
||||
export function getHomeHref(http: HttpSetup, uiSettings: IUiSettingsClient) {
|
||||
return http.basePath.prepend(uiSettings.get('defaultRoute'));
|
||||
}
|
|
@ -1,68 +0,0 @@
|
|||
/*
|
||||
* 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 and the Server Side Public License, v 1; you may not use this file except
|
||||
* in compliance with, at your election, the Elastic License 2.0 or the Server
|
||||
* Side Public License, v 1.
|
||||
*/
|
||||
|
||||
import * as React from 'react';
|
||||
|
||||
import { EuiButtonEmpty } from '@elastic/eui';
|
||||
import { i18n } from '@kbn/i18n';
|
||||
|
||||
import { ChromeDocTitle } from '@kbn/core-chrome-browser';
|
||||
import { NotFoundPrompt } from '@kbn/shared-ux-prompt-not-found';
|
||||
|
||||
const defaultTitle = i18n.translate('share.urlService.redirect.components.Error.title', {
|
||||
defaultMessage: 'Unable to open URL',
|
||||
description:
|
||||
'Title displayed to user in redirect endpoint when redirection cannot be performed successfully.',
|
||||
});
|
||||
|
||||
const defaultBody = i18n.translate('share.urlService.redirect.components.Error.body', {
|
||||
defaultMessage:
|
||||
`Sorry, the object you're looking for can't be found at this URL.` +
|
||||
` It might have been removed or maybe it never existed.`,
|
||||
});
|
||||
|
||||
export interface ErrorProps {
|
||||
title?: string;
|
||||
body?: string;
|
||||
homeHref: string;
|
||||
docTitle: ChromeDocTitle;
|
||||
error: Error;
|
||||
}
|
||||
|
||||
export const RedirectEmptyPrompt: React.FC<ErrorProps> = ({
|
||||
title = defaultTitle,
|
||||
body = defaultBody,
|
||||
homeHref,
|
||||
docTitle,
|
||||
error,
|
||||
}) => {
|
||||
// eslint-disable-next-line no-console
|
||||
console.error('Short URL redirect error', error);
|
||||
|
||||
docTitle.change(
|
||||
i18n.translate('share.urlService.redirect.components.docTitle', { defaultMessage: 'Not Found' })
|
||||
);
|
||||
|
||||
return (
|
||||
<NotFoundPrompt
|
||||
title={<h2>{title}</h2>}
|
||||
body={<p data-test-subj="redirectErrorEmptyPromptBody">{body}</p>}
|
||||
actions={
|
||||
<EuiButtonEmpty
|
||||
iconType="arrowLeft"
|
||||
href={homeHref}
|
||||
data-test-subj="redirectErrorEmptyPromptButton"
|
||||
>
|
||||
{i18n.translate('share.urlService.redirect.components.Error.homeButton', {
|
||||
defaultMessage: 'Back to home',
|
||||
})}
|
||||
</EuiButtonEmpty>
|
||||
}
|
||||
/>
|
||||
);
|
||||
};
|
|
@ -0,0 +1,53 @@
|
|||
/*
|
||||
* 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 and the Server Side Public License, v 1; you may not use this file except
|
||||
* in compliance with, at your election, the Elastic License 2.0 or the Server
|
||||
* Side Public License, v 1.
|
||||
*/
|
||||
|
||||
import * as React from 'react';
|
||||
import {
|
||||
EuiEmptyPrompt,
|
||||
EuiCallOut,
|
||||
EuiCodeBlock,
|
||||
EuiSpacer,
|
||||
EuiFlexGroup,
|
||||
EuiFlexItem,
|
||||
EuiText,
|
||||
} from '@elastic/eui';
|
||||
import { i18n } from '@kbn/i18n';
|
||||
|
||||
const defaultTitle = i18n.translate('share.urlService.redirect.components.Error.title', {
|
||||
defaultMessage: 'Redirection error',
|
||||
description:
|
||||
'Title displayed to user in redirect endpoint when redirection cannot be performed successfully.',
|
||||
});
|
||||
|
||||
export interface ErrorProps {
|
||||
title?: string;
|
||||
error: Error;
|
||||
}
|
||||
|
||||
export const Error: React.FC<ErrorProps> = ({ title = defaultTitle, error }) => {
|
||||
return (
|
||||
<EuiEmptyPrompt
|
||||
iconType={'error'}
|
||||
iconColor={'danger'}
|
||||
title={<h2>{title}</h2>}
|
||||
body={
|
||||
<EuiCallOut color="danger">
|
||||
<EuiFlexGroup justifyContent="spaceAround">
|
||||
<EuiFlexItem>
|
||||
<EuiText color="danger">{error.message}</EuiText>
|
||||
</EuiFlexItem>
|
||||
</EuiFlexGroup>
|
||||
<EuiSpacer size={'l'} />
|
||||
<EuiCodeBlock language="bash" className="eui-textBreakAll" isCopyable>
|
||||
{error.stack ? error.stack : ''}
|
||||
</EuiCodeBlock>
|
||||
</EuiCallOut>
|
||||
}
|
||||
/>
|
||||
);
|
||||
};
|
|
@ -8,31 +8,21 @@
|
|||
|
||||
import * as React from 'react';
|
||||
import useObservable from 'react-use/lib/useObservable';
|
||||
|
||||
import { EuiPageTemplate } from '@elastic/eui';
|
||||
import type { CustomBrandingSetup } from '@kbn/core-custom-branding-browser';
|
||||
import type { ChromeDocTitle, ThemeServiceSetup } from '@kbn/core/public';
|
||||
import { ThemeServiceSetup } from '@kbn/core/public';
|
||||
import { KibanaThemeProvider } from '@kbn/react-kibana-context-theme';
|
||||
|
||||
import type { RedirectManager } from '../redirect_manager';
|
||||
import { RedirectEmptyPrompt } from './empty_prompt';
|
||||
import { CustomBrandingStart } from '@kbn/core-custom-branding-browser';
|
||||
import { Error } from './error';
|
||||
import { RedirectManager } from '../redirect_manager';
|
||||
import { Spinner } from './spinner';
|
||||
|
||||
export interface PageProps {
|
||||
homeHref: string;
|
||||
docTitle: ChromeDocTitle;
|
||||
customBranding: CustomBrandingSetup;
|
||||
manager: Pick<RedirectManager, 'error$'>;
|
||||
theme: ThemeServiceSetup;
|
||||
customBranding: CustomBrandingStart;
|
||||
}
|
||||
|
||||
export const Page: React.FC<PageProps> = ({
|
||||
manager,
|
||||
homeHref,
|
||||
customBranding,
|
||||
docTitle,
|
||||
theme,
|
||||
}) => {
|
||||
export const Page: React.FC<PageProps> = ({ manager, theme, customBranding }) => {
|
||||
const error = useObservable(manager.error$);
|
||||
const hasCustomBranding = useObservable(customBranding.hasCustomBranding$);
|
||||
|
||||
|
@ -40,7 +30,7 @@ export const Page: React.FC<PageProps> = ({
|
|||
return (
|
||||
<KibanaThemeProvider theme={{ theme$: theme.theme$ }}>
|
||||
<EuiPageTemplate>
|
||||
<RedirectEmptyPrompt docTitle={docTitle} error={error} homeHref={homeHref} />
|
||||
<Error error={error} />
|
||||
</EuiPageTemplate>
|
||||
</KibanaThemeProvider>
|
||||
);
|
||||
|
|
|
@ -8,16 +8,15 @@
|
|||
|
||||
import type { CoreSetup } from '@kbn/core/public';
|
||||
import { i18n } from '@kbn/i18n';
|
||||
import { migrateToLatest } from '@kbn/kibana-utils-plugin/common';
|
||||
import type { Location } from 'history';
|
||||
import { BehaviorSubject } from 'rxjs';
|
||||
import type { Location } from 'history';
|
||||
import { migrateToLatest } from '@kbn/kibana-utils-plugin/common';
|
||||
import type { UrlService } from '../../../common/url_service';
|
||||
import { parseSearchParams, RedirectOptions } from '../../../common/url_service/locators/redirect';
|
||||
import {
|
||||
LEGACY_SHORT_URL_LOCATOR_ID,
|
||||
LegacyShortUrlLocatorParams,
|
||||
} from '../../../common/url_service/locators/legacy_short_url_locator';
|
||||
import { parseSearchParams, RedirectOptions } from '../../../common/url_service/locators/redirect';
|
||||
import { getHomeHref } from '../../lib/get_home_href';
|
||||
|
||||
export interface RedirectManagerDependencies {
|
||||
url: UrlService;
|
||||
|
@ -29,27 +28,18 @@ export class RedirectManager {
|
|||
constructor(public readonly deps: RedirectManagerDependencies) {}
|
||||
|
||||
public registerLocatorRedirectApp(core: CoreSetup) {
|
||||
const { application, customBranding, http, theme } = core;
|
||||
|
||||
application.register({
|
||||
core.application.register({
|
||||
id: 'r',
|
||||
title: 'Redirect endpoint',
|
||||
chromeless: true,
|
||||
mount: async (params) => {
|
||||
const { render } = await import('./render');
|
||||
const [start] = await core.getStartServices();
|
||||
const { chrome, uiSettings } = start;
|
||||
|
||||
const unmount = render(params.element, {
|
||||
manager: this,
|
||||
customBranding,
|
||||
docTitle: chrome.docTitle,
|
||||
theme,
|
||||
homeHref: getHomeHref(http, uiSettings),
|
||||
theme: core.theme,
|
||||
customBranding: core.customBranding,
|
||||
});
|
||||
|
||||
this.onMount(params.history.location);
|
||||
|
||||
return () => {
|
||||
unmount();
|
||||
};
|
||||
|
|
|
@ -17,8 +17,6 @@
|
|||
"@kbn/react-kibana-context-theme",
|
||||
"@kbn/core-analytics-browser",
|
||||
"@kbn/shared-ux-error-boundary",
|
||||
"@kbn/core-chrome-browser",
|
||||
"@kbn/shared-ux-prompt-not-found",
|
||||
],
|
||||
"exclude": [
|
||||
"target/**/*",
|
||||
|
|
|
@ -1,51 +0,0 @@
|
|||
/*
|
||||
* 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 and the Server Side Public License, v 1; you may not use this file except
|
||||
* in compliance with, at your election, the Elastic License 2.0 or the Server
|
||||
* Side Public License, v 1.
|
||||
*/
|
||||
|
||||
import expect from '@kbn/expect';
|
||||
import { FtrProviderContext } from '../../ftr_provider_context';
|
||||
|
||||
export default function ({ getPageObjects, getService }: FtrProviderContext) {
|
||||
describe('Short URLs', () => {
|
||||
const PageObjects = getPageObjects(['common']);
|
||||
const browser = getService('browser');
|
||||
const log = getService('log');
|
||||
const testSubjects = getService('testSubjects');
|
||||
const retry = getService('retry');
|
||||
|
||||
it('shows Page for missing short URL', async () => {
|
||||
await PageObjects.common.navigateToApp('home');
|
||||
|
||||
// go to 404
|
||||
const currentUrl = await browser.getCurrentUrl();
|
||||
log.info('Changing URL to missing short URL...');
|
||||
const newUrl = currentUrl.replace(/\/app\/home/, '/app/r/s/foofoo');
|
||||
await browser.get(newUrl);
|
||||
|
||||
// check the page for 404 contents
|
||||
log.info('Checking page title...');
|
||||
await retry.try(async () => {
|
||||
const title = await browser.getTitle();
|
||||
expect(title).to.be('Not Found - Elastic');
|
||||
});
|
||||
|
||||
await retry.try(async () => {
|
||||
await testSubjects.existOrFail('redirectErrorEmptyPromptBody');
|
||||
});
|
||||
|
||||
// click "back to home" button
|
||||
log.info('Clicking the prompt button...');
|
||||
await testSubjects.click('redirectErrorEmptyPromptButton');
|
||||
|
||||
// check the page
|
||||
await retry.try(async () => {
|
||||
const title = await browser.getTitle();
|
||||
expect(title).to.be('Home - Elastic');
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
/*
|
||||
* 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 and the Server Side Public License, v 1; you may not use this file except
|
||||
* in compliance with, at your election, the Elastic License 2.0 or the Server
|
||||
* Side Public License, v 1.
|
||||
*/
|
||||
|
||||
import { FtrConfigProviderContext } from '@kbn/test';
|
||||
|
||||
export default async function ({ readConfigFile }: FtrConfigProviderContext) {
|
||||
const functionalConfig = await readConfigFile(require.resolve('../../config.base.js'));
|
||||
|
||||
return {
|
||||
...functionalConfig.getAll(),
|
||||
testFiles: [require.resolve('.')],
|
||||
};
|
||||
}
|
|
@ -1,15 +0,0 @@
|
|||
/*
|
||||
* 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 and the Server Side Public License, v 1; you may not use this file except
|
||||
* in compliance with, at your election, the Elastic License 2.0 or the Server
|
||||
* Side Public License, v 1.
|
||||
*/
|
||||
|
||||
import { FtrProviderContext } from '../../ftr_provider_context';
|
||||
|
||||
export default function ({ loadTestFile }: FtrProviderContext) {
|
||||
describe('Sharing features', () => {
|
||||
loadTestFile(require.resolve('./_short_urls'));
|
||||
});
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue