mirror of
https://github.com/elastic/kibana.git
synced 2025-04-24 17:59:23 -04:00
[SecuritySolution] Clean up CaseContext (#130036)
* clean up casecontext * update snapshot
This commit is contained in:
parent
fce2df0485
commit
5ee7c3d25a
10 changed files with 700 additions and 762 deletions
|
@ -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>
|
||||||
|
|
|
@ -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>
|
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
@ -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" />,
|
||||||
|
|
|
@ -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}>
|
||||||
|
|
|
@ -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>
|
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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>
|
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
@ -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>
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -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>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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 />
|
||||||
</>
|
</>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue