Skip to content

Commit acbe581

Browse files
[Security Solution][Timeline] Add Empty view to the Timelines page (#72576) (#72697)
1 parent 987beee commit acbe581

File tree

2 files changed

+70
-48
lines changed

2 files changed

+70
-48
lines changed

x-pack/plugins/security_solution/public/timelines/pages/timelines_page.test.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,16 @@ jest.mock('react-router-dom', () => {
2121
};
2222
});
2323
jest.mock('../../overview/components/events_by_dataset');
24+
jest.mock('../../common/containers/source', () => {
25+
const originalModule = jest.requireActual('../../common/containers/source');
26+
27+
return {
28+
...originalModule,
29+
useWithSource: jest.fn().mockReturnValue({
30+
indicesExist: true,
31+
}),
32+
};
33+
});
2434
jest.mock('../../common/lib/kibana', () => {
2535
const originalModule = jest.requireActual('../../common/lib/kibana');
2636

x-pack/plugins/security_solution/public/timelines/pages/timelines_page.tsx

Lines changed: 60 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import { WrapperPage } from '../../common/components/wrapper_page';
1515
import { useKibana } from '../../common/lib/kibana';
1616
import { SpyRoute } from '../../common/utils/route/spy_routes';
1717
import { useApolloClient } from '../../common/utils/apollo_context';
18+
import { useWithSource } from '../../common/containers/source';
19+
import { OverviewEmpty } from '../../overview/components/overview_empty';
1820

1921
import { StatefulOpenTimeline } from '../components/open_timeline';
2022
import { NEW_TEMPLATE_TIMELINE } from '../components/timeline/properties/translations';
@@ -36,61 +38,71 @@ export const TimelinesPageComponent: React.FC = () => {
3638
const onImportTimelineBtnClick = useCallback(() => {
3739
setImportDataModalToggle(true);
3840
}, [setImportDataModalToggle]);
41+
const { indicesExist } = useWithSource();
3942

4043
const apolloClient = useApolloClient();
41-
const uiCapabilities = useKibana().services.application.capabilities;
42-
const capabilitiesCanUserCRUD: boolean = !!uiCapabilities.siem.crud;
44+
const capabilitiesCanUserCRUD: boolean = !!useKibana().services.application.capabilities.siem
45+
.crud;
4346

4447
return (
4548
<>
46-
<WrapperPage>
47-
<HeaderPage border title={i18n.PAGE_TITLE}>
48-
<EuiFlexGroup gutterSize="s" alignItems="center">
49-
<EuiFlexItem>
50-
{capabilitiesCanUserCRUD && (
51-
<EuiButton
52-
iconType="indexOpen"
53-
onClick={onImportTimelineBtnClick}
54-
data-test-subj="open-import-data-modal-btn"
55-
>
56-
{i18n.ALL_TIMELINES_IMPORT_TIMELINE_TITLE}
57-
</EuiButton>
58-
)}
59-
</EuiFlexItem>
60-
{tabName === TimelineType.default ? (
61-
<EuiFlexItem>
62-
{capabilitiesCanUserCRUD && (
63-
<NewTimeline
64-
timelineId="timeline-1"
65-
outline={true}
66-
data-test-subj="create-default-btn"
67-
/>
49+
{indicesExist ? (
50+
<>
51+
<WrapperPage>
52+
<HeaderPage border title={i18n.PAGE_TITLE}>
53+
<EuiFlexGroup gutterSize="s" alignItems="center">
54+
<EuiFlexItem>
55+
{capabilitiesCanUserCRUD && (
56+
<EuiButton
57+
iconType="indexOpen"
58+
onClick={onImportTimelineBtnClick}
59+
data-test-subj="open-import-data-modal-btn"
60+
>
61+
{i18n.ALL_TIMELINES_IMPORT_TIMELINE_TITLE}
62+
</EuiButton>
63+
)}
64+
</EuiFlexItem>
65+
{tabName === TimelineType.default ? (
66+
<EuiFlexItem>
67+
{capabilitiesCanUserCRUD && (
68+
<NewTimeline
69+
timelineId="timeline-1"
70+
outline={true}
71+
data-test-subj="create-default-btn"
72+
/>
73+
)}
74+
</EuiFlexItem>
75+
) : (
76+
<EuiFlexItem>
77+
<NewTemplateTimeline
78+
outline={true}
79+
title={NEW_TEMPLATE_TIMELINE}
80+
data-test-subj="create-template-btn"
81+
/>
82+
</EuiFlexItem>
6883
)}
69-
</EuiFlexItem>
70-
) : (
71-
<EuiFlexItem>
72-
<NewTemplateTimeline
73-
outline={true}
74-
title={NEW_TEMPLATE_TIMELINE}
75-
data-test-subj="create-template-btn"
76-
/>
77-
</EuiFlexItem>
78-
)}
79-
</EuiFlexGroup>
80-
</HeaderPage>
84+
</EuiFlexGroup>
85+
</HeaderPage>
8186

82-
<TimelinesContainer>
83-
<StatefulOpenTimeline
84-
apolloClient={apolloClient!}
85-
defaultPageSize={DEFAULT_SEARCH_RESULTS_PER_PAGE}
86-
isModal={false}
87-
importDataModalToggle={importDataModalToggle && capabilitiesCanUserCRUD}
88-
setImportDataModalToggle={setImportDataModalToggle}
89-
title={i18n.ALL_TIMELINES_PANEL_TITLE}
90-
data-test-subj="stateful-open-timeline"
91-
/>
92-
</TimelinesContainer>
93-
</WrapperPage>
87+
<TimelinesContainer>
88+
<StatefulOpenTimeline
89+
apolloClient={apolloClient!}
90+
defaultPageSize={DEFAULT_SEARCH_RESULTS_PER_PAGE}
91+
isModal={false}
92+
importDataModalToggle={importDataModalToggle && capabilitiesCanUserCRUD}
93+
setImportDataModalToggle={setImportDataModalToggle}
94+
title={i18n.ALL_TIMELINES_PANEL_TITLE}
95+
data-test-subj="stateful-open-timeline"
96+
/>
97+
</TimelinesContainer>
98+
</WrapperPage>
99+
</>
100+
) : (
101+
<WrapperPage>
102+
<HeaderPage border title={i18n.PAGE_TITLE} />
103+
<OverviewEmpty />
104+
</WrapperPage>
105+
)}
94106

95107
<SpyRoute pageName={SecurityPageName.timelines} />
96108
</>

0 commit comments

Comments
 (0)