Skip to content

Commit 76105cc

Browse files
authored
[User Experience] Move ux app to new nav (#101005)
1 parent bc36318 commit 76105cc

File tree

12 files changed

+112
-89
lines changed

12 files changed

+112
-89
lines changed

.github/CODEOWNERS

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@
8989
# Client Side Monitoring / Uptime (lives in APM directories but owned by Uptime)
9090
/x-pack/plugins/apm/e2e/cypress/support/step_definitions/csm @elastic/uptime
9191
/x-pack/plugins/apm/e2e/cypress/integration/csm_dashboard.feature @elastic/uptime
92-
/x-pack/plugins/apm/public/application/csmApp.tsx @elastic/uptime
92+
/x-pack/plugins/apm/public/application/uxApp.tsx @elastic/uptime
9393
/x-pack/plugins/apm/public/components/app/RumDashboard @elastic/uptime
9494
/x-pack/plugins/apm/server/lib/rum_client @elastic/uptime
9595
/x-pack/plugins/apm/server/routes/rum_client.ts @elastic/uptime

x-pack/plugins/apm/public/application/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ export const renderApp = ({
4343
config,
4444
core: coreStart,
4545
plugins: pluginsSetup,
46+
observability: pluginsStart.observability,
4647
observabilityRuleTypeRegistry,
4748
};
4849

x-pack/plugins/apm/public/application/csmApp.tsx renamed to x-pack/plugins/apm/public/application/uxApp.tsx

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ import React from 'react';
1212
import ReactDOM from 'react-dom';
1313
import { Route, Router } from 'react-router-dom';
1414
import { DefaultTheme, ThemeProvider } from 'styled-components';
15+
import { i18n } from '@kbn/i18n';
1516
import type { ObservabilityRuleTypeRegistry } from '../../../observability/public';
16-
import { euiStyled } from '../../../../../src/plugins/kibana_react/common';
1717
import {
1818
KibanaContextProvider,
1919
RedirectAppLinks,
@@ -24,21 +24,16 @@ import { ScrollToTopOnPathChange } from '../components/app/Main/ScrollToTopOnPat
2424
import { RumHome, UX_LABEL } from '../components/app/RumDashboard/RumHome';
2525
import { ApmPluginContext } from '../context/apm_plugin/apm_plugin_context';
2626
import { UrlParamsProvider } from '../context/url_params_context/url_params_context';
27-
import { useBreadcrumbs } from '../hooks/use_breadcrumbs';
2827
import { ConfigSchema } from '../index';
2928
import { ApmPluginSetupDeps, ApmPluginStartDeps } from '../plugin';
3029
import { createCallApmApi } from '../services/rest/createCallApmApi';
31-
import { px, units } from '../style/variables';
3230
import { createStaticIndexPattern } from '../services/rest/index_pattern';
3331
import { UXActionMenu } from '../components/app/RumDashboard/ActionMenu';
3432
import { redirectTo } from '../components/routing/redirect_to';
33+
import { useBreadcrumbs } from '../../../observability/public';
34+
import { useApmPluginContext } from '../context/apm_plugin/use_apm_plugin_context';
3535

36-
const CsmMainContainer = euiStyled.div`
37-
padding: ${px(units.plus)};
38-
height: 100%;
39-
`;
40-
41-
export const rumRoutes: APMRouteDefinition[] = [
36+
export const uxRoutes: APMRouteDefinition[] = [
4237
{
4338
exact: true,
4439
path: '/',
@@ -47,10 +42,20 @@ export const rumRoutes: APMRouteDefinition[] = [
4742
},
4843
];
4944

50-
function CsmApp() {
45+
function UxApp() {
5146
const [darkMode] = useUiSetting$<boolean>('theme:darkMode');
5247

53-
useBreadcrumbs(rumRoutes);
48+
const { core } = useApmPluginContext();
49+
const basePath = core.http.basePath.get();
50+
51+
useBreadcrumbs([
52+
{ text: UX_LABEL, href: basePath + '/app/ux' },
53+
{
54+
text: i18n.translate('xpack.apm.ux.overview', {
55+
defaultMessage: 'Overview',
56+
}),
57+
},
58+
]);
5459

5560
return (
5661
<ThemeProvider
@@ -60,20 +65,20 @@ function CsmApp() {
6065
darkMode,
6166
})}
6267
>
63-
<CsmMainContainer data-test-subj="csmMainContainer" role="main">
68+
<div data-test-subj="csmMainContainer" role="main">
6469
<Route component={ScrollToTopOnPathChange} />
6570
<RumHome />
66-
</CsmMainContainer>
71+
</div>
6772
</ThemeProvider>
6873
);
6974
}
7075

71-
export function CsmAppRoot({
76+
export function UXAppRoot({
7277
appMountParameters,
7378
core,
7479
deps,
7580
config,
76-
corePlugins: { embeddable, maps },
81+
corePlugins: { embeddable, maps, observability },
7782
observabilityRuleTypeRegistry,
7883
}: {
7984
appMountParameters: AppMountParameters;
@@ -91,6 +96,7 @@ export function CsmAppRoot({
9196
config,
9297
core,
9398
plugins,
99+
observability,
94100
observabilityRuleTypeRegistry,
95101
};
96102

@@ -101,7 +107,7 @@ export function CsmAppRoot({
101107
<i18nCore.Context>
102108
<Router history={history}>
103109
<UrlParamsProvider>
104-
<CsmApp />
110+
<UxApp />
105111
<UXActionMenu appMountParameters={appMountParameters} />
106112
</UrlParamsProvider>
107113
</Router>
@@ -142,7 +148,7 @@ export const renderApp = ({
142148
});
143149

144150
ReactDOM.render(
145-
<CsmAppRoot
151+
<UXAppRoot
146152
appMountParameters={appMountParameters}
147153
core={core}
148154
deps={deps}

x-pack/plugins/apm/public/components/app/RumDashboard/CsmSharedContext/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export const CsmSharedContext = createContext(defaultContext);
3030
export function CsmSharedContextProvider({
3131
children,
3232
}: {
33-
children: JSX.Element[];
33+
children: JSX.Element;
3434
}) {
3535
const [newData, setNewData] = useState<SharedData>({ totalPageViews: 0 });
3636

x-pack/plugins/apm/public/components/app/RumDashboard/Panels/MainFilters.tsx

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,10 @@
66
*/
77

88
import React from 'react';
9-
import { EuiFlexItem } from '@elastic/eui';
10-
import { EnvironmentFilter } from '../../../shared/EnvironmentFilter';
119
import { ServiceNameFilter } from '../URLFilter/ServiceNameFilter';
1210
import { useFetcher } from '../../../../hooks/use_fetcher';
1311
import { RUM_AGENT_NAMES } from '../../../../../common/agent_name';
1412
import { useUrlParams } from '../../../../context/url_params_context/use_url_params';
15-
import { UserPercentile } from '../UserPercentile';
16-
import { useBreakPoints } from '../../../../hooks/use_break_points';
1713

1814
export function MainFilters() {
1915
const {
@@ -39,25 +35,11 @@ export function MainFilters() {
3935
);
4036

4137
const rumServiceNames = data?.rumServices ?? [];
42-
const { isSmall } = useBreakPoints();
43-
44-
// on mobile we want it to take full width
45-
const envStyle = isSmall ? {} : { maxWidth: 200 };
4638

4739
return (
48-
<>
49-
<EuiFlexItem grow={false}>
50-
<ServiceNameFilter
51-
loading={status !== 'success'}
52-
serviceNames={rumServiceNames}
53-
/>
54-
</EuiFlexItem>
55-
<EuiFlexItem grow={false} style={envStyle}>
56-
<EnvironmentFilter />
57-
</EuiFlexItem>
58-
<EuiFlexItem grow={false}>
59-
<UserPercentile />
60-
</EuiFlexItem>
61-
</>
40+
<ServiceNameFilter
41+
loading={status !== 'success'}
42+
serviceNames={rumServiceNames}
43+
/>
6244
);
6345
}

x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,33 +5,58 @@
55
* 2.0.
66
*/
77

8-
import { EuiFlexGroup, EuiFlexItem, EuiTitle } from '@elastic/eui';
8+
import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui';
99
import React from 'react';
1010
import { i18n } from '@kbn/i18n';
1111
import { RumOverview } from '../RumDashboard';
1212
import { CsmSharedContextProvider } from './CsmSharedContext';
1313
import { MainFilters } from './Panels/MainFilters';
1414
import { DatePicker } from '../../shared/DatePicker';
15+
import { useApmPluginContext } from '../../../context/apm_plugin/use_apm_plugin_context';
16+
import { EnvironmentFilter } from '../../shared/EnvironmentFilter';
17+
import { UserPercentile } from './UserPercentile';
18+
import { useBreakPoints } from '../../../hooks/use_break_points';
1519

1620
export const UX_LABEL = i18n.translate('xpack.apm.ux.title', {
1721
defaultMessage: 'User Experience',
1822
});
1923

2024
export function RumHome() {
25+
const { observability } = useApmPluginContext();
26+
const PageTemplateComponent = observability.navigation.PageTemplate;
27+
28+
const { isSmall } = useBreakPoints();
29+
30+
const envStyle = isSmall ? {} : { maxWidth: 200 };
31+
2132
return (
2233
<CsmSharedContextProvider>
23-
<EuiFlexGroup wrap justifyContent={'flexEnd'} responsive={true}>
24-
<EuiFlexItem>
25-
<EuiTitle>
26-
<h1 className="eui-textNoWrap">{UX_LABEL}</h1>
27-
</EuiTitle>
28-
</EuiFlexItem>
29-
<MainFilters />
30-
<EuiFlexItem grow={false}>
31-
<DatePicker />
32-
</EuiFlexItem>
33-
</EuiFlexGroup>
34-
<RumOverview />
34+
<PageTemplateComponent
35+
pageHeader={{
36+
pageTitle: UX_LABEL,
37+
rightSideItems: [
38+
<DatePicker />,
39+
<div style={envStyle}>
40+
<EnvironmentFilter />
41+
</div>,
42+
<UserPercentile />,
43+
<MainFilters />,
44+
],
45+
}}
46+
>
47+
<RumOverview />
48+
</PageTemplateComponent>
3549
</CsmSharedContextProvider>
3650
);
3751
}
52+
53+
export function UxHomeHeaderItems() {
54+
return (
55+
<EuiFlexGroup wrap justifyContent={'flexEnd'} responsive={true}>
56+
<MainFilters />
57+
<EuiFlexItem grow={false}>
58+
<DatePicker />
59+
</EuiFlexItem>
60+
</EuiFlexGroup>
61+
);
62+
}

x-pack/plugins/apm/public/components/app/RumDashboard/index.tsx

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,19 +25,16 @@ export function RumOverview() {
2525
}, []);
2626

2727
return (
28-
<>
29-
<EuiSpacer size="m" />
30-
<EuiFlexGroup>
31-
<EuiFlexItem grow={1}>
32-
<LocalUIFilters {...localUIFiltersConfig} showCount={true}>
33-
<URLFilter />
34-
<EuiSpacer size="s" />
35-
</LocalUIFilters>
36-
</EuiFlexItem>
37-
<EuiFlexItem grow={7}>
38-
<RumDashboard />
39-
</EuiFlexItem>
40-
</EuiFlexGroup>
41-
</>
28+
<EuiFlexGroup>
29+
<EuiFlexItem grow={1}>
30+
<LocalUIFilters {...localUIFiltersConfig} showCount={true}>
31+
<URLFilter />
32+
<EuiSpacer size="s" />
33+
</LocalUIFilters>
34+
</EuiFlexItem>
35+
<EuiFlexItem grow={7}>
36+
<RumDashboard />
37+
</EuiFlexItem>
38+
</EuiFlexGroup>
4239
);
4340
}

x-pack/plugins/apm/public/context/apm_plugin/apm_plugin_context.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,15 @@ import type { ObservabilityRuleTypeRegistry } from '../../../../observability/pu
1111
import { ConfigSchema } from '../..';
1212
import { ApmPluginSetupDeps } from '../../plugin';
1313
import { MapsStartApi } from '../../../../maps/public';
14+
import { ObservabilityPublicStart } from '../../../../observability/public';
1415

1516
export interface ApmPluginContextValue {
1617
appMountParameters: AppMountParameters;
1718
config: ConfigSchema;
1819
core: CoreStart;
1920
plugins: ApmPluginSetupDeps & { maps?: MapsStartApi };
2021
observabilityRuleTypeRegistry: ObservabilityRuleTypeRegistry;
22+
observability: ObservabilityPublicStart;
2123
}
2224

2325
export const ApmPluginContext = createContext({} as ApmPluginContextValue);

x-pack/plugins/apm/public/plugin.ts

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ export interface ApmPluginStartDeps {
6767
licensing: void;
6868
maps?: MapsStartApi;
6969
ml?: MlPluginStart;
70-
observability: ObservabilityPublicStart;
7170
triggersActionsUi: TriggersAndActionsUIPublicPluginStart;
71+
observability: ObservabilityPublicStart;
7272
}
7373

7474
export class ApmPlugin implements Plugin<ApmPluginSetup, ApmPluginStart> {
@@ -150,6 +150,26 @@ export class ApmPlugin implements Plugin<ApmPluginSetup, ApmPluginStart> {
150150
},
151151
});
152152

153+
plugins.observability.navigation.registerSections(
154+
of([
155+
{
156+
label: 'User Experience',
157+
sortKey: 201,
158+
entries: [
159+
{
160+
label: i18n.translate('xpack.apm.ux.overview.heading', {
161+
defaultMessage: 'Overview',
162+
}),
163+
app: 'ux',
164+
path: '/',
165+
matchFullPath: true,
166+
ignoreTrailingSlash: true,
167+
},
168+
],
169+
},
170+
])
171+
);
172+
153173
core.application.register({
154174
id: 'apm',
155175
title: 'APM',
@@ -231,7 +251,7 @@ export class ApmPlugin implements Plugin<ApmPluginSetup, ApmPluginStart> {
231251
async mount(appMountParameters: AppMountParameters<unknown>) {
232252
// Load application bundle and Get start service
233253
const [{ renderApp }, [coreStart, corePlugins]] = await Promise.all([
234-
import('./application/csmApp'),
254+
import('./application/uxApp'),
235255
core.getStartServices(),
236256
]);
237257

x-pack/plugins/observability/public/hooks/use_kibana_ui_settings.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,17 @@
55
* 2.0.
66
*/
77

8-
import { usePluginContext } from './use_plugin_context';
98
import { UI_SETTINGS } from '../../../../../src/plugins/data/public';
9+
import { useKibana } from '../../../../../src/plugins/kibana_react/public';
1010

1111
export { UI_SETTINGS };
1212

1313
type SettingKeys = keyof typeof UI_SETTINGS;
1414
type SettingValues = typeof UI_SETTINGS[SettingKeys];
1515

1616
export function useKibanaUISettings<T>(key: SettingValues): T {
17-
const { core } = usePluginContext();
18-
return core.uiSettings.get<T>(key);
17+
const {
18+
services: { uiSettings },
19+
} = useKibana();
20+
return uiSettings!.get<T>(key);
1921
}

0 commit comments

Comments
 (0)