[SecuritySolution] Clean up CaseContext (#130036)

* clean up casecontext

* update snapshot
This commit is contained in:
Angela Chuang 2022-04-12 20:19:46 +01:00 committed by GitHub
parent fce2df0485
commit 5ee7c3d25a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 700 additions and 762 deletions

View file

@ -15,11 +15,16 @@ import { KibanaThemeProvider } from '../../../../../src/plugins/kibana_react/pub
import { AppLeaveHandler, AppMountParameters } from '../../../../../src/core/public'; import { AppLeaveHandler, AppMountParameters } from '../../../../../src/core/public';
import { ManageUserInfo } from '../detections/components/user_info'; import { ManageUserInfo } from '../detections/components/user_info';
import { DEFAULT_DARK_MODE, APP_NAME } from '../../common/constants'; import { DEFAULT_DARK_MODE, APP_NAME, APP_ID } from '../../common/constants';
import { ErrorToastDispatcher } from '../common/components/error_toast_dispatcher'; import { ErrorToastDispatcher } from '../common/components/error_toast_dispatcher';
import { MlCapabilitiesProvider } from '../common/components/ml/permissions/ml_capabilities_provider'; import { MlCapabilitiesProvider } from '../common/components/ml/permissions/ml_capabilities_provider';
import { GlobalToaster, ManageGlobalToaster } from '../common/components/toasters'; import { GlobalToaster, ManageGlobalToaster } from '../common/components/toasters';
import { KibanaContextProvider, useKibana, useUiSetting$ } from '../common/lib/kibana'; import {
KibanaContextProvider,
useGetUserCasesPermissions,
useKibana,
useUiSetting$,
} from '../common/lib/kibana';
import { State } from '../common/store'; import { State } from '../common/store';
import { StartServices } from '../types'; import { StartServices } from '../types';
@ -48,9 +53,11 @@ const StartAppComponent: FC<StartAppComponent> = ({
const { const {
i18n, i18n,
application: { capabilities }, application: { capabilities },
cases,
} = useKibana().services; } = useKibana().services;
const [darkMode] = useUiSetting$<boolean>(DEFAULT_DARK_MODE); const [darkMode] = useUiSetting$<boolean>(DEFAULT_DARK_MODE);
const casesPermissions = useGetUserCasesPermissions();
const CasesContext = cases.ui.getCasesContext();
return ( return (
<EuiErrorBoundary> <EuiErrorBoundary>
<i18n.Context> <i18n.Context>
@ -62,13 +69,18 @@ const StartAppComponent: FC<StartAppComponent> = ({
<UserPrivilegesProvider kibanaCapabilities={capabilities}> <UserPrivilegesProvider kibanaCapabilities={capabilities}>
<ManageUserInfo> <ManageUserInfo>
<ReactQueryClientProvider> <ReactQueryClientProvider>
<PageRouter <CasesContext
history={history} owner={[APP_ID]}
onAppLeave={onAppLeave} userCanCrud={casesPermissions?.crud ?? false}
setHeaderActionMenu={setHeaderActionMenu}
> >
{children} <PageRouter
</PageRouter> history={history}
onAppLeave={onAppLeave}
setHeaderActionMenu={setHeaderActionMenu}
>
{children}
</PageRouter>
</CasesContext>
</ReactQueryClientProvider> </ReactQueryClientProvider>
</ManageUserInfo> </ManageUserInfo>
</UserPrivilegesProvider> </UserPrivilegesProvider>

View file

@ -12,7 +12,7 @@ import type { Filter } from '@kbn/es-query';
import { inputsModel, State } from '../../store'; import { inputsModel, State } from '../../store';
import { inputsActions } from '../../store/actions'; import { inputsActions } from '../../store/actions';
import { ControlColumnProps, RowRenderer, TimelineId } from '../../../../common/types/timeline'; import { ControlColumnProps, RowRenderer, TimelineId } from '../../../../common/types/timeline';
import { APP_ID, APP_UI_ID } from '../../../../common/constants'; import { APP_UI_ID } from '../../../../common/constants';
import { timelineActions } from '../../../timelines/store/timeline'; import { timelineActions } from '../../../timelines/store/timeline';
import type { SubsetTimelineModel } from '../../../timelines/store/timeline/model'; import type { SubsetTimelineModel } from '../../../timelines/store/timeline/model';
import { Status } from '../../../../common/detection_engine/schemas/common/schemas'; import { Status } from '../../../../common/detection_engine/schemas/common/schemas';
@ -26,7 +26,7 @@ import type { EntityType } from '../../../../../timelines/common';
import { TGridCellAction } from '../../../../../timelines/common/types'; import { TGridCellAction } from '../../../../../timelines/common/types';
import { CellValueElementProps } from '../../../timelines/components/timeline/cell_rendering'; import { CellValueElementProps } from '../../../timelines/components/timeline/cell_rendering';
import { FIELDS_WITHOUT_CELL_ACTIONS } from '../../lib/cell_actions/constants'; import { FIELDS_WITHOUT_CELL_ACTIONS } from '../../lib/cell_actions/constants';
import { useGetUserCasesPermissions, useKibana } from '../../lib/kibana'; import { useKibana } from '../../lib/kibana';
import { GraphOverlay } from '../../../timelines/components/graph_overlay'; import { GraphOverlay } from '../../../timelines/components/graph_overlay';
import { import {
useFieldBrowserOptions, useFieldBrowserOptions,
@ -114,7 +114,7 @@ const StatefulEventsViewerComponent: React.FC<Props> = ({
} = defaultModel, } = defaultModel,
} = useSelector((state: State) => eventsViewerSelector(state, id)); } = useSelector((state: State) => eventsViewerSelector(state, id));
const { timelines: timelinesUi, cases } = useKibana().services; const { timelines: timelinesUi } = useKibana().services;
const { const {
browserFields, browserFields,
dataViewId, dataViewId,
@ -201,62 +201,58 @@ const StatefulEventsViewerComponent: React.FC<Props> = ({
editorActionsRef, editorActionsRef,
}); });
const casesPermissions = useGetUserCasesPermissions();
const CasesContext = cases.ui.getCasesContext();
const isLive = input.policy.kind === 'interval'; const isLive = input.policy.kind === 'interval';
return ( return (
<> <>
<CasesContext owner={[APP_ID]} userCanCrud={casesPermissions?.crud ?? false}> <FullScreenContainer $isFullScreen={globalFullScreen}>
<FullScreenContainer $isFullScreen={globalFullScreen}> <InspectButtonContainer>
<InspectButtonContainer> {timelinesUi.getTGrid<'embedded'>({
{timelinesUi.getTGrid<'embedded'>({ additionalFilters,
additionalFilters, appId: APP_UI_ID,
appId: APP_UI_ID, browserFields,
browserFields, bulkActions,
bulkActions, columns,
columns, dataProviders,
dataProviders, dataViewId,
dataViewId, defaultCellActions,
defaultCellActions, deletedEventIds,
deletedEventIds, disabledCellActions: FIELDS_WITHOUT_CELL_ACTIONS,
disabledCellActions: FIELDS_WITHOUT_CELL_ACTIONS, docValueFields,
docValueFields, end,
end, entityType,
entityType, fieldBrowserOptions,
fieldBrowserOptions, filters: globalFilters,
filters: globalFilters, filterStatus: currentFilter,
filterStatus: currentFilter, globalFullScreen,
globalFullScreen, graphEventId,
graphEventId, graphOverlay,
graphOverlay, hasAlertsCrud,
hasAlertsCrud, id,
id, indexNames: selectedPatterns,
indexNames: selectedPatterns, indexPattern,
indexPattern, isLive,
isLive, isLoadingIndexPattern,
isLoadingIndexPattern, itemsPerPage,
itemsPerPage, itemsPerPageOptions,
itemsPerPageOptions, kqlMode,
kqlMode, leadingControlColumns,
leadingControlColumns, onRuleChange,
onRuleChange, query,
query, renderCellValue,
renderCellValue, rowRenderers,
rowRenderers, runtimeMappings,
runtimeMappings, setQuery,
setQuery, sort,
sort, start,
start, tGridEventRenderedViewEnabled,
tGridEventRenderedViewEnabled, trailingControlColumns,
trailingControlColumns, type: 'embedded',
type: 'embedded', unit,
unit, })}
})} </InspectButtonContainer>
</InspectButtonContainer> </FullScreenContainer>
</FullScreenContainer> {DetailsPanel}
{DetailsPanel}
</CasesContext>
</> </>
); );
}; };

View file

@ -18,7 +18,6 @@ import { useRouteSpy } from '../../utils/route/use_route_spy';
import { useQueryToggle } from '../../containers/query_toggle'; import { useQueryToggle } from '../../containers/query_toggle';
jest.mock('../../containers/query_toggle'); jest.mock('../../containers/query_toggle');
jest.mock('../../lib/kibana');
jest.mock('./matrix_loader', () => ({ jest.mock('./matrix_loader', () => ({
MatrixLoader: () => <div className="matrixLoader" />, MatrixLoader: () => <div className="matrixLoader" />,

View file

@ -31,8 +31,7 @@ import { InputsModelId } from '../../store/inputs/constants';
import { HoverVisibilityContainer } from '../hover_visibility_container'; import { HoverVisibilityContainer } from '../hover_visibility_container';
import { HISTOGRAM_ACTIONS_BUTTON_CLASS, VisualizationActions } from '../visualization_actions'; import { HISTOGRAM_ACTIONS_BUTTON_CLASS, VisualizationActions } from '../visualization_actions';
import { GetLensAttributes, LensAttributes } from '../visualization_actions/types'; import { GetLensAttributes, LensAttributes } from '../visualization_actions/types';
import { useKibana, useGetUserCasesPermissions } from '../../lib/kibana'; import { SecurityPageName } from '../../../../common/constants';
import { APP_ID, SecurityPageName } from '../../../../common/constants';
import { useRouteSpy } from '../../utils/route/use_route_spy'; import { useRouteSpy } from '../../utils/route/use_route_spy';
import { useQueryToggle } from '../../containers/query_toggle'; import { useQueryToggle } from '../../containers/query_toggle';
@ -104,10 +103,6 @@ export const MatrixHistogramComponent: React.FC<MatrixHistogramComponentProps> =
skip, skip,
}) => { }) => {
const dispatch = useDispatch(); const dispatch = useDispatch();
const { cases } = useKibana().services;
const CasesContext = cases.ui.getCasesContext();
const userPermissions = useGetUserCasesPermissions();
const userCanCrud = userPermissions?.crud ?? false;
const handleBrushEnd = useCallback( const handleBrushEnd = useCallback(
({ x }) => { ({ x }) => {
@ -267,18 +262,16 @@ export const MatrixHistogramComponent: React.FC<MatrixHistogramComponentProps> =
<EuiFlexGroup alignItems="center" gutterSize="none"> <EuiFlexGroup alignItems="center" gutterSize="none">
{onHostOrNetworkOrUserPage && (getLensAttributes || lensAttributes) && timerange && ( {onHostOrNetworkOrUserPage && (getLensAttributes || lensAttributes) && timerange && (
<EuiFlexItem grow={false}> <EuiFlexItem grow={false}>
<CasesContext owner={[APP_ID]} userCanCrud={userCanCrud ?? false}> <VisualizationActions
<VisualizationActions className="histogram-viz-actions"
className="histogram-viz-actions" getLensAttributes={getLensAttributes}
getLensAttributes={getLensAttributes} isInspectButtonDisabled={filterQuery === undefined}
isInspectButtonDisabled={filterQuery === undefined} lensAttributes={lensAttributes}
lensAttributes={lensAttributes} queryId={id}
queryId={id} stackByField={selectedStackByOption.value}
stackByField={selectedStackByOption.value} timerange={timerange}
timerange={timerange} title={title}
title={title} />
/>
</CasesContext>
</EuiFlexItem> </EuiFlexItem>
)} )}
<EuiFlexItem grow={false}> <EuiFlexItem grow={false}>

View file

@ -10,7 +10,6 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react';
import { connect, ConnectedProps, useDispatch } from 'react-redux'; import { connect, ConnectedProps, useDispatch } from 'react-redux';
import { Dispatch } from 'redux'; import { Dispatch } from 'redux';
import type { Filter } from '@kbn/es-query'; import type { Filter } from '@kbn/es-query';
import { APP_ID } from '../../../../common/constants';
import { getEsQueryConfig } from '../../../../../../../src/plugins/data/common'; import { getEsQueryConfig } from '../../../../../../../src/plugins/data/common';
import { Status } from '../../../../common/detection_engine/schemas/common/schemas'; import { Status } from '../../../../common/detection_engine/schemas/common/schemas';
import { RowRendererId, TimelineIdLiteral } from '../../../../common/types/timeline'; import { RowRendererId, TimelineIdLiteral } from '../../../../common/types/timeline';
@ -25,7 +24,7 @@ import { useAppToasts } from '../../../common/hooks/use_app_toasts';
import { useIsExperimentalFeatureEnabled } from '../../../common/hooks/use_experimental_features'; import { useIsExperimentalFeatureEnabled } from '../../../common/hooks/use_experimental_features';
import { useInvalidFilterQuery } from '../../../common/hooks/use_invalid_filter_query'; import { useInvalidFilterQuery } from '../../../common/hooks/use_invalid_filter_query';
import { defaultCellActions } from '../../../common/lib/cell_actions/default_cell_actions'; import { defaultCellActions } from '../../../common/lib/cell_actions/default_cell_actions';
import { useGetUserCasesPermissions, useKibana } from '../../../common/lib/kibana'; import { useKibana } from '../../../common/lib/kibana';
import { inputsModel, inputsSelectors, State } from '../../../common/store'; import { inputsModel, inputsSelectors, State } from '../../../common/store';
import { SourcererScopeName } from '../../../common/store/sourcerer/model'; import { SourcererScopeName } from '../../../common/store/sourcerer/model';
import * as i18nCommon from '../../../common/translations'; import * as i18nCommon from '../../../common/translations';
@ -365,34 +364,29 @@ export const AlertsTableComponent: React.FC<AlertsTableComponentProps> = ({
const leadingControlColumns = useMemo(() => getDefaultControlColumn(ACTION_BUTTON_COUNT), []); const leadingControlColumns = useMemo(() => getDefaultControlColumn(ACTION_BUTTON_COUNT), []);
const casesPermissions = useGetUserCasesPermissions();
const CasesContext = kibana.services.cases.ui.getCasesContext();
if (loading || isEmpty(selectedPatterns)) { if (loading || isEmpty(selectedPatterns)) {
return null; return null;
} }
return ( return (
<CasesContext owner={[APP_ID]} userCanCrud={casesPermissions?.crud ?? false}> <StatefulEventsViewer
<StatefulEventsViewer additionalFilters={additionalFiltersComponent}
additionalFilters={additionalFiltersComponent} currentFilter={filterGroup}
currentFilter={filterGroup} defaultCellActions={defaultCellActions}
defaultCellActions={defaultCellActions} defaultModel={alertsDefaultModel}
defaultModel={alertsDefaultModel} end={to}
end={to} entityType="events"
entityType="events" hasAlertsCrud={hasIndexWrite && hasIndexMaintenance}
hasAlertsCrud={hasIndexWrite && hasIndexMaintenance} id={timelineId}
id={timelineId} leadingControlColumns={leadingControlColumns}
leadingControlColumns={leadingControlColumns} onRuleChange={onRuleChange}
onRuleChange={onRuleChange} pageFilters={defaultFiltersMemo}
pageFilters={defaultFiltersMemo} renderCellValue={RenderCellValue}
renderCellValue={RenderCellValue} rowRenderers={defaultRowRenderers}
rowRenderers={defaultRowRenderers} scopeId={SourcererScopeName.detections}
scopeId={SourcererScopeName.detections} start={from}
start={from} utilityBar={utilityBarCallback}
utilityBar={utilityBarCallback} />
/>
</CasesContext>
); );
}; };

View file

@ -28,7 +28,7 @@ import { alertsPreviewDefaultModel } from '../../alerts_table/default_config';
import { SourcererScopeName } from '../../../../common/store/sourcerer/model'; import { SourcererScopeName } from '../../../../common/store/sourcerer/model';
import { defaultRowRenderers } from '../../../../timelines/components/timeline/body/renderers'; import { defaultRowRenderers } from '../../../../timelines/components/timeline/body/renderers';
import { TimelineId } from '../../../../../common/types'; import { TimelineId } from '../../../../../common/types';
import { APP_ID, APP_UI_ID, DEFAULT_PREVIEW_INDEX } from '../../../../../common/constants'; import { APP_UI_ID, DEFAULT_PREVIEW_INDEX } from '../../../../../common/constants';
import { FIELDS_WITHOUT_CELL_ACTIONS } from '../../../../common/lib/cell_actions/constants'; import { FIELDS_WITHOUT_CELL_ACTIONS } from '../../../../common/lib/cell_actions/constants';
import { useSourcererDataView } from '../../../../common/containers/sourcerer'; import { useSourcererDataView } from '../../../../common/containers/sourcerer';
import { DetailsPanel } from '../../../../timelines/components/side_panel'; import { DetailsPanel } from '../../../../timelines/components/side_panel';
@ -74,7 +74,7 @@ export const PreviewHistogram = ({
}: PreviewHistogramProps) => { }: PreviewHistogramProps) => {
const dispatch = useDispatch(); const dispatch = useDispatch();
const { setQuery, isInitializing } = useGlobalTime(); const { setQuery, isInitializing } = useGlobalTime();
const { timelines: timelinesUi, cases } = useKibana().services; const { timelines: timelinesUi } = useKibana().services;
const from = useMemo(() => `now-1${timeFrame}`, [timeFrame]); const from = useMemo(() => `now-1${timeFrame}`, [timeFrame]);
const to = useMemo(() => 'now', []); const to = useMemo(() => 'now', []);
const startDate = useMemo(() => formatDate(from), [from]); const startDate = useMemo(() => formatDate(from), [from]);
@ -155,8 +155,6 @@ export const PreviewHistogram = ({
const chartData = useMemo((): ChartSeriesData[] => [{ key: 'hits', value: data }], [data]); const chartData = useMemo((): ChartSeriesData[] => [{ key: 'hits', value: data }], [data]);
const CasesContext = cases.ui.getCasesContext();
return ( return (
<> <>
<Panel height={DEFAULT_HISTOGRAM_HEIGHT} data-test-subj={'preview-histogram-panel'}> <Panel height={DEFAULT_HISTOGRAM_HEIGHT} data-test-subj={'preview-histogram-panel'}>
@ -194,54 +192,52 @@ export const PreviewHistogram = ({
</EuiFlexGroup> </EuiFlexGroup>
</Panel> </Panel>
<EuiSpacer /> <EuiSpacer />
<CasesContext owner={[APP_ID]} userCanCrud={false}> <FullScreenContainer $isFullScreen={globalFullScreen}>
<FullScreenContainer $isFullScreen={globalFullScreen}> <InspectButtonContainer>
<InspectButtonContainer> {timelinesUi.getTGrid<'embedded'>({
{timelinesUi.getTGrid<'embedded'>({ additionalFilters: <></>,
additionalFilters: <></>, appId: APP_UI_ID,
appId: APP_UI_ID, browserFields,
browserFields, columns,
columns, dataProviders,
dataProviders, deletedEventIds,
deletedEventIds, disabledCellActions: FIELDS_WITHOUT_CELL_ACTIONS,
disabledCellActions: FIELDS_WITHOUT_CELL_ACTIONS, docValueFields,
docValueFields, end: endDate,
end: endDate, entityType: 'events',
entityType: 'events', filters: [],
filters: [], globalFullScreen,
globalFullScreen, hasAlertsCrud: false,
hasAlertsCrud: false, id: TimelineId.rulePreview,
id: TimelineId.rulePreview, indexNames: [`${DEFAULT_PREVIEW_INDEX}-${spaceId}`],
indexNames: [`${DEFAULT_PREVIEW_INDEX}-${spaceId}`], indexPattern,
indexPattern, isLive: false,
isLive: false, isLoadingIndexPattern,
isLoadingIndexPattern, itemsPerPage,
itemsPerPage, itemsPerPageOptions,
itemsPerPageOptions, kqlMode,
kqlMode, query: { query: `kibana.alert.rule.uuid:${previewId}`, language: 'kuery' },
query: { query: `kibana.alert.rule.uuid:${previewId}`, language: 'kuery' }, renderCellValue: PreviewRenderCellValue,
renderCellValue: PreviewRenderCellValue, rowRenderers: defaultRowRenderers,
rowRenderers: defaultRowRenderers, runtimeMappings,
runtimeMappings, setQuery: () => {},
setQuery: () => {}, sort,
sort, start: startDate,
start: startDate, tGridEventRenderedViewEnabled,
tGridEventRenderedViewEnabled, type: 'embedded',
type: 'embedded', leadingControlColumns: getPreviewTableControlColumn(1.5),
leadingControlColumns: getPreviewTableControlColumn(1.5), })}
})} </InspectButtonContainer>
</InspectButtonContainer> </FullScreenContainer>
</FullScreenContainer> <DetailsPanel
<DetailsPanel browserFields={browserFields}
browserFields={browserFields} entityType={'events'}
entityType={'events'} docValueFields={docValueFields}
docValueFields={docValueFields} isFlyoutView
isFlyoutView runtimeMappings={runtimeMappings}
runtimeMappings={runtimeMappings} timelineId={TimelineId.rulePreview}
timelineId={TimelineId.rulePreview} isReadOnly
isReadOnly />
/>
</CasesContext>
</> </>
); );
}; };

View file

@ -22,8 +22,6 @@ import {
StatItems, StatItems,
} from '../../../../common/components/stat_items'; } from '../../../../common/components/stat_items';
import { UpdateDateRange } from '../../../../common/components/charts/common'; import { UpdateDateRange } from '../../../../common/components/charts/common';
import { useKibana, useGetUserCasesPermissions } from '../../../../common/lib/kibana';
import { APP_ID } from '../../../../../common/constants';
import { UserskKpiStrategyResponse } from '../../../../../common/search_strategy/security_solution/users'; import { UserskKpiStrategyResponse } from '../../../../../common/search_strategy/security_solution/users';
const kpiWidgetHeight = 247; const kpiWidgetHeight = 247;
@ -47,11 +45,6 @@ interface KpiBaseComponentProps {
export const KpiBaseComponent = React.memo<KpiBaseComponentProps>( export const KpiBaseComponent = React.memo<KpiBaseComponentProps>(
({ fieldsMapping, data, id, loading = false, from, to, narrowDateRange, setQuerySkip }) => { ({ fieldsMapping, data, id, loading = false, from, to, narrowDateRange, setQuerySkip }) => {
const { cases } = useKibana().services;
const CasesContext = cases.ui.getCasesContext();
const userPermissions = useGetUserCasesPermissions();
const userCanCrud = userPermissions?.crud ?? false;
const statItemsProps: StatItemsProps[] = useKpiMatrixStatus( const statItemsProps: StatItemsProps[] = useKpiMatrixStatus(
fieldsMapping, fieldsMapping,
data, data,
@ -65,11 +58,9 @@ export const KpiBaseComponent = React.memo<KpiBaseComponentProps>(
return ( return (
<EuiFlexGroup wrap> <EuiFlexGroup wrap>
<CasesContext owner={[APP_ID]} userCanCrud={userCanCrud ?? false}> {statItemsProps.map((mappedStatItemProps) => (
{statItemsProps.map((mappedStatItemProps) => ( <StatItemsComponent {...mappedStatItemProps} showInspectButton={false} />
<StatItemsComponent {...mappedStatItemProps} showInspectButton={false} /> ))}
))}
</CasesContext>
</EuiFlexGroup> </EuiFlexGroup>
); );
}, },

View file

@ -19,8 +19,6 @@ import styled from 'styled-components';
import deepEqual from 'fast-deep-equal'; import deepEqual from 'fast-deep-equal';
import { MappingRuntimeFields } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { MappingRuntimeFields } from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
import { BrowserFields, DocValueFields } from '../../../../common/containers/source'; import { BrowserFields, DocValueFields } from '../../../../common/containers/source';
import { useKibana, useGetUserCasesPermissions } from '../../../../common/lib/kibana';
import { APP_ID } from '../../../../../common/constants';
import { ExpandableEvent, ExpandableEventTitle } from './expandable_event'; import { ExpandableEvent, ExpandableEventTitle } from './expandable_event';
import { useTimelineEventsDetails } from '../../../containers/details'; import { useTimelineEventsDetails } from '../../../containers/details';
import { TimelineTabs } from '../../../../../common/types/timeline'; import { TimelineTabs } from '../../../../../common/types/timeline';
@ -100,13 +98,6 @@ const EventDetailsPanelComponent: React.FC<EventDetailsPanelProps> = ({
'isolateHost' 'isolateHost'
); );
const {
services: { cases },
} = useKibana();
const CasesContext = cases.ui.getCasesContext();
const casesPermissions = useGetUserCasesPermissions();
const [isIsolateActionSuccessBannerVisible, setIsIsolateActionSuccessBannerVisible] = const [isIsolateActionSuccessBannerVisible, setIsIsolateActionSuccessBannerVisible] =
useState(false); useState(false);
@ -195,7 +186,7 @@ const EventDetailsPanelComponent: React.FC<EventDetailsPanelProps> = ({
} }
return isFlyoutView ? ( return isFlyoutView ? (
<CasesContext owner={[APP_ID]} userCanCrud={casesPermissions?.crud ?? false}> <>
<EuiFlyoutHeader hasBorder={isHostIsolationPanelOpen}> <EuiFlyoutHeader hasBorder={isHostIsolationPanelOpen}>
{isHostIsolationPanelOpen ? ( {isHostIsolationPanelOpen ? (
backToAlertDetailsLink backToAlertDetailsLink
@ -254,9 +245,9 @@ const EventDetailsPanelComponent: React.FC<EventDetailsPanelProps> = ({
timelineId={timelineId} timelineId={timelineId}
/> />
)} )}
</CasesContext> </>
) : ( ) : (
<CasesContext owner={[APP_ID]} userCanCrud={casesPermissions?.crud ?? false}> <>
<ExpandableEventTitle <ExpandableEventTitle
isAlert={isAlert} isAlert={isAlert}
loading={loading} loading={loading}
@ -290,7 +281,7 @@ const EventDetailsPanelComponent: React.FC<EventDetailsPanelProps> = ({
timelineId={timelineId} timelineId={timelineId}
/> />
)} )}
</CasesContext> </>
); );
}; };

View file

@ -9,8 +9,6 @@ import { noop, isEmpty } from 'lodash/fp';
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
import { useDispatch, useSelector } from 'react-redux'; import { useDispatch, useSelector } from 'react-redux';
import { APP_ID } from '../../../../../common/constants';
import { useGetUserCasesPermissions, useKibana } from '../../../../common/lib/kibana';
import { import {
FIRST_ARIA_INDEX, FIRST_ARIA_INDEX,
ARIA_COLINDEX_ATTRIBUTE, ARIA_COLINDEX_ATTRIBUTE,
@ -229,65 +227,60 @@ export const StatefulBody = React.memo<Props>(
}, },
[columnHeaders.length, containerRef, data.length] [columnHeaders.length, containerRef, data.length]
); );
const kibana = useKibana();
const casesPermissions = useGetUserCasesPermissions();
const CasesContext = kibana.services.cases.ui.getCasesContext();
return ( return (
<> <>
<TimelineBody data-test-subj="timeline-body" ref={containerRef}> <TimelineBody data-test-subj="timeline-body" ref={containerRef}>
<CasesContext owner={[APP_ID]} userCanCrud={casesPermissions?.crud ?? false}> <EventsTable
<EventsTable $activePage={activePage}
$activePage={activePage} $columnCount={columnCount}
$columnCount={columnCount} data-test-subj={`${tabType}-events-table`}
data-test-subj={`${tabType}-events-table`} columnWidths={totalWidth}
columnWidths={totalWidth} onKeyDown={onKeyDown}
onKeyDown={onKeyDown} $rowCount={data.length}
$rowCount={data.length} $totalPages={totalPages}
$totalPages={totalPages} >
> <ColumnHeaders
<ColumnHeaders actionsColumnWidth={actionsColumnWidth}
actionsColumnWidth={actionsColumnWidth} browserFields={browserFields}
browserFields={browserFields} columnHeaders={columnHeaders}
columnHeaders={columnHeaders} isEventViewer={isEventViewer}
isEventViewer={isEventViewer} isSelectAllChecked={isSelectAllChecked}
isSelectAllChecked={isSelectAllChecked} onSelectAll={onSelectAll}
onSelectAll={onSelectAll} show={show}
show={show} showEventsSelect={false}
showEventsSelect={false} showSelectAllCheckbox={showCheckboxes}
showSelectAllCheckbox={showCheckboxes} sort={sort}
sort={sort} tabType={tabType}
tabType={tabType} timelineId={id}
timelineId={id} leadingControlColumns={leadingControlColumns}
leadingControlColumns={leadingControlColumns} trailingControlColumns={trailingControlColumns}
trailingControlColumns={trailingControlColumns} />
/>
<Events <Events
containerRef={containerRef} containerRef={containerRef}
actionsColumnWidth={actionsColumnWidth} actionsColumnWidth={actionsColumnWidth}
browserFields={browserFields} browserFields={browserFields}
columnHeaders={columnHeaders} columnHeaders={columnHeaders}
data={data} data={data}
eventIdToNoteIds={eventIdToNoteIds} eventIdToNoteIds={eventIdToNoteIds}
id={id} id={id}
isEventViewer={isEventViewer} isEventViewer={isEventViewer}
lastFocusedAriaColindex={lastFocusedAriaColindex} lastFocusedAriaColindex={lastFocusedAriaColindex}
loadingEventIds={loadingEventIds} loadingEventIds={loadingEventIds}
onRowSelected={onRowSelected} onRowSelected={onRowSelected}
pinnedEventIds={pinnedEventIds} pinnedEventIds={pinnedEventIds}
refetch={refetch} refetch={refetch}
renderCellValue={renderCellValue} renderCellValue={renderCellValue}
rowRenderers={enabledRowRenderers} rowRenderers={enabledRowRenderers}
onRuleChange={onRuleChange} onRuleChange={onRuleChange}
selectedEventIds={selectedEventIds} selectedEventIds={selectedEventIds}
showCheckboxes={showCheckboxes} showCheckboxes={showCheckboxes}
leadingControlColumns={leadingControlColumns} leadingControlColumns={leadingControlColumns}
trailingControlColumns={trailingControlColumns} trailingControlColumns={trailingControlColumns}
tabType={tabType} tabType={tabType}
/> />
</EventsTable> </EventsTable>
</CasesContext>
</TimelineBody> </TimelineBody>
<TimelineBodyGlobalStyle /> <TimelineBodyGlobalStyle />
</> </>