Skip to content

Commit 14828f6

Browse files
[Discover] Add unsaved changes modal (#218500) (#225252)
## Summary Closes #218500 When there are unsaved changes in Discover a modal will prompt the user to either risk losing them or not leaving the page. https://github.com/user-attachments/assets/c516b3a7-0954-496b-8494-574ba8547d27 ### Checklist Check the PR satisfies following conditions. Reviewers should verify this PR satisfies this list as well. - [x] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/src/platform/packages/shared/kbn-i18n/README.md) - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [x] The PR description includes the appropriate Release Notes section, and the correct `release_note:*` label is applied per the [guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --------- Co-authored-by: kibanamachine <[email protected]>
1 parent 4256f8e commit 14828f6

File tree

12 files changed

+409
-102
lines changed

12 files changed

+409
-102
lines changed

src/platform/plugins/shared/discover/public/__mocks__/discover_state.mock.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export function getDiscoverStateMock({
4444
history?: History<HistoryLocationState>;
4545
customizationContext?: DiscoverCustomizationContext;
4646
services?: DiscoverServices;
47-
}) {
47+
} = {}) {
4848
if (!history) {
4949
history = createBrowserHistory<HistoryLocationState>();
5050
history.push('/');

src/platform/plugins/shared/discover/public/application/discover_router.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ const renderWithRouter = (path: string) => {
4747
});
4848
render(
4949
<Router history={history}>
50-
<DiscoverRoutes customizationContext={mockCustomizationContext} />
50+
<DiscoverRoutes onAppLeave={jest.fn()} customizationContext={mockCustomizationContext} />
5151
</Router>
5252
);
5353

src/platform/plugins/shared/discover/public/application/discover_router.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { Router, Routes, Route } from '@kbn/shared-ux-router';
1212
import React from 'react';
1313
import { EuiErrorBoundary } from '@elastic/eui';
1414
import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public';
15+
import type { AppMountParameters } from '@kbn/core/public';
1516
import { ContextAppRoute } from './context';
1617
import { SingleDocRoute } from './doc';
1718
import { NotFoundRoute } from './not_found';
@@ -23,6 +24,7 @@ import { DiscoverMainRoute } from './main';
2324
export interface DiscoverRouterProps {
2425
services: DiscoverServices;
2526
customizationContext: DiscoverCustomizationContext;
27+
onAppLeave: AppMountParameters['onAppLeave'];
2628
}
2729

2830
export const DiscoverRouter = ({ services, ...routeProps }: DiscoverRouterProps) => {
@@ -40,7 +42,7 @@ export const DiscoverRouter = ({ services, ...routeProps }: DiscoverRouterProps)
4042
// this exists as a separate component to allow the tests to gather the routes
4143
export const DiscoverRoutes = ({
4244
...routeProps
43-
}: Pick<DiscoverRouterProps, 'customizationContext'>) => {
45+
}: Pick<DiscoverRouterProps, 'customizationContext' | 'onAppLeave'>) => {
4446
return (
4547
<Routes>
4648
<Route path="/context/:dataViewId/:id">

src/platform/plugins/shared/discover/public/application/index.tsx

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,24 @@
1010
import React from 'react';
1111
import { i18n } from '@kbn/i18n';
1212
import { toMountPoint } from '@kbn/react-kibana-mount';
13+
import type { AppMountParameters } from '@kbn/core/public';
1314
import { DiscoverRouter } from './discover_router';
1415
import type { DiscoverServices } from '../build_services';
1516
import type { DiscoverCustomizationContext } from '../customizations';
1617

1718
export interface RenderAppProps {
1819
element: HTMLElement;
20+
onAppLeave: AppMountParameters['onAppLeave'];
1921
services: DiscoverServices;
2022
customizationContext: DiscoverCustomizationContext;
2123
}
2224

23-
export const renderApp = ({ element, services, customizationContext }: RenderAppProps) => {
25+
export const renderApp = ({
26+
element,
27+
onAppLeave,
28+
services,
29+
customizationContext,
30+
}: RenderAppProps) => {
2431
const { capabilities, chrome, data, core } = services;
2532

2633
if (!capabilities.discover_v2.save) {
@@ -36,7 +43,11 @@ export const renderApp = ({ element, services, customizationContext }: RenderApp
3643
}
3744

3845
const unmount = toMountPoint(
39-
<DiscoverRouter services={services} customizationContext={customizationContext} />,
46+
<DiscoverRouter
47+
onAppLeave={onAppLeave}
48+
services={services}
49+
customizationContext={customizationContext}
50+
/>,
4051
core
4152
)(element);
4253

0 commit comments

Comments
 (0)