kibana/x-pack/plugins/security_solution/public/timelines/pages/timelines_page.tsx
Xavier Mouligneau 304670c3a8
[SECURITY SOLUTION] two bugs fix for threat hunting (#76060)
* fix read only issue with timeline

* fix no feeds url for kibana setting + remove the no-index-laert index from the timeline query so you do not have to add permissions to it

* Add test + add logic to not show advance settings if user does not have access

* remove no alert indices from the timeline query

* review I

* no needs of that

Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com>
2020-08-31 11:50:35 -04:00

111 lines
4.1 KiB
TypeScript

/*
* 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 { EuiButton, EuiFlexGroup, EuiFlexItem } from '@elastic/eui';
import React, { useCallback, useState } from 'react';
import styled from 'styled-components';
import { useParams } from 'react-router-dom';
import { TimelineType } from '../../../common/types/timeline';
import { HeaderPage } from '../../common/components/header_page';
import { WrapperPage } from '../../common/components/wrapper_page';
import { useKibana } from '../../common/lib/kibana';
import { SpyRoute } from '../../common/utils/route/spy_routes';
import { useApolloClient } from '../../common/utils/apollo_context';
import { useWithSource } from '../../common/containers/source';
import { OverviewEmpty } from '../../overview/components/overview_empty';
import { StatefulOpenTimeline } from '../components/open_timeline';
import { NEW_TEMPLATE_TIMELINE } from '../components/timeline/properties/translations';
import { NewTemplateTimeline } from '../components/timeline/properties/new_template_timeline';
import { NewTimeline } from '../components/timeline/properties/helpers';
import * as i18n from './translations';
import { SecurityPageName } from '../../app/types';
const TimelinesContainer = styled.div`
width: 100%;
`;
export const DEFAULT_SEARCH_RESULTS_PER_PAGE = 10;
export const TimelinesPageComponent: React.FC = () => {
const { tabName } = useParams<{ pageName: SecurityPageName; tabName: string }>();
const [importDataModalToggle, setImportDataModalToggle] = useState<boolean>(false);
const onImportTimelineBtnClick = useCallback(() => {
setImportDataModalToggle(true);
}, [setImportDataModalToggle]);
const { indicesExist } = useWithSource();
const apolloClient = useApolloClient();
const capabilitiesCanUserCRUD: boolean = !!useKibana().services.application.capabilities.siem
.crud;
return (
<>
{indicesExist ? (
<>
<WrapperPage>
<HeaderPage border title={i18n.PAGE_TITLE}>
<EuiFlexGroup gutterSize="s" alignItems="center">
<EuiFlexItem>
{capabilitiesCanUserCRUD && (
<EuiButton
iconType="indexOpen"
onClick={onImportTimelineBtnClick}
data-test-subj="open-import-data-modal-btn"
>
{i18n.ALL_TIMELINES_IMPORT_TIMELINE_TITLE}
</EuiButton>
)}
</EuiFlexItem>
{tabName === TimelineType.default ? (
<EuiFlexItem>
<NewTimeline
timelineId="timeline-1"
outline={true}
data-test-subj="create-default-btn"
/>
</EuiFlexItem>
) : (
<EuiFlexItem>
<NewTemplateTimeline
outline={true}
title={NEW_TEMPLATE_TIMELINE}
data-test-subj="create-template-btn"
/>
</EuiFlexItem>
)}
</EuiFlexGroup>
</HeaderPage>
<TimelinesContainer>
<StatefulOpenTimeline
apolloClient={apolloClient!}
defaultPageSize={DEFAULT_SEARCH_RESULTS_PER_PAGE}
isModal={false}
importDataModalToggle={importDataModalToggle && capabilitiesCanUserCRUD}
setImportDataModalToggle={setImportDataModalToggle}
title={i18n.ALL_TIMELINES_PANEL_TITLE}
data-test-subj="stateful-open-timeline"
/>
</TimelinesContainer>
</WrapperPage>
</>
) : (
<WrapperPage>
<HeaderPage border title={i18n.PAGE_TITLE} />
<OverviewEmpty />
</WrapperPage>
)}
<SpyRoute pageName={SecurityPageName.timelines} />
</>
);
};
export const TimelinesPage = React.memo(TimelinesPageComponent);