{indicesExist ? (
diff --git a/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/navigation/countries_query_tab_body.tsx b/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/navigation/countries_query_tab_body.tsx
index e7c378f19768b..cd19ab18956c5 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/navigation/countries_query_tab_body.tsx
+++ b/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/navigation/countries_query_tab_body.tsx
@@ -56,7 +56,6 @@ export const CountriesQueryTabBody = ({
fakeTotalCount={getOr(50, 'fakeTotalCount', pageInfo)}
flowTargeted={flowTarget}
id={id}
- indexPattern={indexPattern}
inspect={inspect}
isInspect={isInspected}
loading={loading}
diff --git a/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/navigation/network_routes.tsx b/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/navigation/network_routes.tsx
index ca9d7d4a7b085..6e49c65454239 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/navigation/network_routes.tsx
+++ b/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/navigation/network_routes.tsx
@@ -5,12 +5,13 @@
* 2.0.
*/
-import React from 'react';
+import React, { useMemo } from 'react';
import { Routes, Route } from '@kbn/shared-ux-router';
import { EuiFlexItem, EuiSpacer } from '@elastic/eui';
import { TableId } from '@kbn/securitysolution-data-table';
+import { dataViewSpecToViewBase } from '../../../../common/lib/kuery';
import { FlowTargetSourceDest } from '../../../../../common/search_strategy/security_solution/network';
import {
@@ -30,7 +31,9 @@ import { NetworkRouteType } from './types';
import { NETWORK_PATH } from '../../../../../common/constants';
export const NetworkRoutes = React.memo
(
- ({ type, to, filterQuery, isInitializing, from, indexPattern, indexNames, setQuery }) => {
+ ({ type, to, filterQuery, isInitializing, from, dataViewSpec, indexNames, setQuery }) => {
+ const index = useMemo(() => dataViewSpecToViewBase(dataViewSpec), [dataViewSpec]);
+
const networkAnomaliesFilterQuery = {
bool: {
should: [
@@ -61,7 +64,7 @@ export const NetworkRoutes = React.memo(
const tabProps = {
...commonProps,
- indexPattern,
+ indexPattern: index,
};
const anomaliesProps = {
diff --git a/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/navigation/types.ts b/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/navigation/types.ts
index 2ed0756634707..339ad2fc71acc 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/navigation/types.ts
+++ b/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/navigation/types.ts
@@ -5,9 +5,10 @@
* 2.0.
*/
-import type { DataViewBase } from '@kbn/es-query';
import type { Optional } from 'utility-types';
+import type { DataViewBase } from '@kbn/es-query';
+import type { DataViewSpec } from '@kbn/data-plugin/common';
import type { ESTermQuery } from '../../../../../common/typed_json';
import type { NavTab } from '../../../../common/components/navigation/types';
@@ -45,7 +46,7 @@ export type HttpQueryTabBodyProps = QueryTabBodyProps;
export type NetworkRoutesProps = GlobalTimeArgs & {
type: networkModel.NetworkType;
filterQuery?: string | ESTermQuery;
- indexPattern: DataViewBase;
+ dataViewSpec: DataViewSpec;
indexNames: string[];
};
diff --git a/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/network.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/network.test.tsx
index acecfe9001a62..c80fb0997609c 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/network.test.tsx
+++ b/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/network.test.tsx
@@ -227,6 +227,7 @@ describe('Network page - rendering', () => {
selectedPatterns: [],
indicesExist: true,
indexPattern: { fields: [], title: 'title' },
+ sourcererDataView: {},
});
const myStore = createMockStore();
render(
diff --git a/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/network.tsx b/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/network.tsx
index ef525e41a54d9..93e8b231d67cd 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/network.tsx
+++ b/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/network.tsx
@@ -88,8 +88,7 @@ const NetworkComponent = React.memo(
return globalFilters;
}, [tabName, globalFilters]);
- const { indicesExist, indexPattern, selectedPatterns, sourcererDataView } =
- useSourcererDataView();
+ const { indicesExist, selectedPatterns, sourcererDataView } = useSourcererDataView();
const onSkipFocusBeforeEventsTable = useCallback(() => {
containerElement.current
@@ -117,14 +116,14 @@ const NetworkComponent = React.memo(
const [filterQuery, kqlError] = convertToBuildEsQuery({
config: getEsQueryConfig(kibana.services.uiSettings),
- indexPattern,
+ dataViewSpec: sourcererDataView,
queries: [query],
filters: globalFilters,
});
const [tabsFilterQuery] = convertToBuildEsQuery({
config: getEsQueryConfig(kibana.services.uiSettings),
- indexPattern,
+ dataViewSpec: sourcererDataView,
queries: [query],
filters: tabsFilters,
});
@@ -175,7 +174,7 @@ const NetworkComponent = React.memo(
- {capabilitiesFetched && !isInitializing ? (
+ {capabilitiesFetched && !isInitializing && sourcererDataView ? (
<>
@@ -187,7 +186,7 @@ const NetworkComponent = React.memo(
filterQuery={tabsFilterQuery}
from={from}
isInitializing={isInitializing}
- indexPattern={indexPattern}
+ dataViewSpec={sourcererDataView}
indexNames={selectedPatterns}
setQuery={setQuery}
type={networkModel.NetworkType.page}
diff --git a/x-pack/solutions/security/plugins/security_solution/public/explore/users/pages/details/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/explore/users/pages/details/index.tsx
index 5f184a80574ef..8d86a92894231 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/explore/users/pages/details/index.tsx
+++ b/x-pack/solutions/security/plugins/security_solution/public/explore/users/pages/details/index.tsx
@@ -21,6 +21,7 @@ import type { Filter } from '@kbn/es-query';
import { buildEsQuery } from '@kbn/es-query';
import { dataTableSelectors, TableId } from '@kbn/securitysolution-data-table';
import { LastEventIndexKey } from '@kbn/timelines-plugin/common';
+import { dataViewSpecToViewBase } from '../../../../common/lib/kuery';
import { useCalculateEntityRiskScore } from '../../../../entity_analytics/api/hooks/use_calculate_entity_risk_score';
import {
useAssetCriticalityData,
@@ -116,14 +117,13 @@ const UsersDetailsComponent: React.FC = ({
[detailName]
);
- const { indicesExist, indexPattern, selectedPatterns, sourcererDataView } =
- useSourcererDataView();
+ const { indicesExist, selectedPatterns, sourcererDataView } = useSourcererDataView();
const [rawFilteredQuery, kqlError] = useMemo(() => {
try {
return [
buildEsQuery(
- indexPattern,
+ dataViewSpecToViewBase(sourcererDataView),
[query],
[...usersDetailsPageFilters, ...globalFilters],
getEsQueryConfig(uiSettings)
@@ -132,7 +132,7 @@ const UsersDetailsComponent: React.FC = ({
} catch (e) {
return [undefined, e];
}
- }, [globalFilters, indexPattern, query, uiSettings, usersDetailsPageFilters]);
+ }, [globalFilters, sourcererDataView, query, uiSettings, usersDetailsPageFilters]);
const stringifiedAdditionalFilters = JSON.stringify(rawFilteredQuery);
useInvalidFilterQuery({
@@ -292,7 +292,7 @@ const UsersDetailsComponent: React.FC = ({
filterQuery={stringifiedAdditionalFilters}
from={from}
indexNames={selectedPatterns}
- indexPattern={indexPattern}
+ dataViewSpec={sourcererDataView}
isInitializing={isInitializing}
userDetailFilter={usersDetailsPageFilters}
setQuery={setQuery}
diff --git a/x-pack/solutions/security/plugins/security_solution/public/explore/users/pages/details/types.ts b/x-pack/solutions/security/plugins/security_solution/public/explore/users/pages/details/types.ts
index 002d1339a1898..8b531af663990 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/explore/users/pages/details/types.ts
+++ b/x-pack/solutions/security/plugins/security_solution/public/explore/users/pages/details/types.ts
@@ -7,7 +7,8 @@
import type { ActionCreator } from 'typescript-fsa';
-import type { DataViewBase, Filter, Query } from '@kbn/es-query';
+import { type DataViewSpec } from '@kbn/data-plugin/common';
+import type { Filter, Query } from '@kbn/es-query';
import type { UsersQueryProps } from '../types';
import type { NavTab } from '../../../../common/components/navigation/types';
@@ -47,6 +48,6 @@ export type UsersDetailsTabsProps = UserBodyComponentDispatchProps &
indexNames: string[];
userDetailFilter: Filter[];
filterQuery?: string;
- indexPattern: DataViewBase;
+ dataViewSpec?: DataViewSpec;
type: usersModel.UsersType;
};
diff --git a/x-pack/solutions/security/plugins/security_solution/public/explore/users/pages/users.tsx b/x-pack/solutions/security/plugins/security_solution/public/explore/users/pages/users.tsx
index 2078fd9e90979..c141ed7f06cf9 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/explore/users/pages/users.tsx
+++ b/x-pack/solutions/security/plugins/security_solution/public/explore/users/pages/users.tsx
@@ -99,27 +99,26 @@ const UsersComponent = () => {
return globalFilters;
}, [severitySelection, tabName, globalFilters]);
- const { indicesExist, indexPattern, selectedPatterns, sourcererDataView } =
- useSourcererDataView();
+ const { indicesExist, selectedPatterns, sourcererDataView } = useSourcererDataView();
const [globalFiltersQuery, kqlError] = useMemo(
() =>
convertToBuildEsQuery({
config: getEsQueryConfig(uiSettings),
- indexPattern,
+ dataViewSpec: sourcererDataView,
queries: [query],
filters: globalFilters,
}),
- [globalFilters, indexPattern, uiSettings, query]
+ [globalFilters, sourcererDataView, uiSettings, query]
);
const [tabsFilterQuery] = useMemo(
() =>
convertToBuildEsQuery({
config: getEsQueryConfig(uiSettings),
- indexPattern,
+ dataViewSpec: sourcererDataView,
queries: [query],
filters: tabsFilters,
}),
- [indexPattern, query, tabsFilters, uiSettings]
+ [sourcererDataView, query, tabsFilters, uiSettings]
);
useInvalidFilterQuery({
diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/entities_details.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/entities_details.test.tsx
index d9d468649a221..f79dfcec7b27b 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/entities_details.test.tsx
+++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/entities_details.test.tsx
@@ -65,7 +65,9 @@ jest.mock('../../../../helper_hooks', () => ({
}));
jest.mock('../../../../sourcerer/containers', () => ({
- useSourcererDataView: jest.fn().mockReturnValue({ selectedPatterns: ['index'] }),
+ useSourcererDataView: jest
+ .fn()
+ .mockReturnValue({ selectedPatterns: ['index'], sourcererDataView: {} }),
}));
jest.mock('../../../../common/components/ml/anomaly/anomaly_table_provider', () => ({
diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/host_details.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/host_details.test.tsx
index b35a22d6e1d54..86d04a9c94a77 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/host_details.test.tsx
+++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/host_details.test.tsx
@@ -84,7 +84,9 @@ jest.mock('../../../../helper_hooks', () => ({
}));
jest.mock('../../../../sourcerer/containers', () => ({
- useSourcererDataView: jest.fn().mockReturnValue({ selectedPatterns: ['index'] }),
+ useSourcererDataView: jest
+ .fn()
+ .mockReturnValue({ selectedPatterns: ['index'], sourcererDataView: {} }),
}));
jest.mock('../../../../common/components/ml/anomaly/anomaly_table_provider', () => ({
diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/session_view.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/session_view.test.tsx
index d46bad45e8a43..5ec4f6f478912 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/session_view.test.tsx
+++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/session_view.test.tsx
@@ -88,8 +88,7 @@ describe('', () => {
loading: false,
indicesExist: true,
selectedPatterns: ['index'],
- indexPattern: { fields: [], title: '' },
- sourcererDataView: undefined,
+ sourcererDataView: {},
});
});
it('renders session view correctly', () => {
diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/user_details.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/user_details.test.tsx
index 2ba6345cb1663..993e9101ba0f0 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/user_details.test.tsx
+++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/user_details.test.tsx
@@ -76,7 +76,9 @@ jest.mock('../../../../common/components/ml/hooks/use_ml_capabilities');
const mockUseMlUserPermissions = useMlCapabilities as jest.Mock;
jest.mock('../../../../sourcerer/containers', () => ({
- useSourcererDataView: jest.fn().mockReturnValue({ selectedPatterns: ['index'] }),
+ useSourcererDataView: jest
+ .fn()
+ .mockReturnValue({ selectedPatterns: ['index'], sourcererDataView: {} }),
}));
jest.mock('../../../../common/components/ml/anomaly/anomaly_table_provider', () => ({
diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/hooks/use_threat_intelligence_details.test.ts b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/hooks/use_threat_intelligence_details.test.ts
index 522fd74765fd8..75b76adae787d 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/hooks/use_threat_intelligence_details.test.ts
+++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/hooks/use_threat_intelligence_details.test.ts
@@ -50,8 +50,7 @@ describe('useThreatIntelligenceDetails', () => {
loading: false,
indicesExist: true,
selectedPatterns: [],
- indexPattern: { fields: [], title: '' },
- sourcererDataView: undefined,
+ sourcererDataView: {},
});
jest
diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/hooks/use_threat_intelligence_details.ts b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/hooks/use_threat_intelligence_details.ts
index a7b8256b502f5..7826d98b65a3a 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/hooks/use_threat_intelligence_details.ts
+++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/hooks/use_threat_intelligence_details.ts
@@ -71,7 +71,7 @@ export const useThreatIntelligenceDetails = (): ThreatIntelligenceDetailsResult
const [isEventDataLoading, eventData] = useTimelineEventsDetails({
indexName,
eventId,
- runtimeMappings: sourcererDataView.sourcererDataView?.runtimeFieldMap as RunTimeMappings,
+ runtimeMappings: sourcererDataView.sourcererDataView.runtimeFieldMap as RunTimeMappings,
skip: !eventId,
});
diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/shared/hooks/use_event_details.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/shared/hooks/use_event_details.test.tsx
index 6e4cab20f013c..4582469fbd9cc 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/shared/hooks/use_event_details.test.tsx
+++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/shared/hooks/use_event_details.test.tsx
@@ -53,6 +53,7 @@ describe('useEventDetails', () => {
(useSourcererDataView as jest.Mock).mockReturnValue({
browserFields: {},
indexPattern: {},
+ sourcererDataView: {},
});
(useTimelineEventsDetails as jest.Mock).mockReturnValue([false, [], {}, {}, jest.fn()]);
jest.mocked(useGetFieldsData).mockReturnValue({ getFieldsData: (field: string) => field });
@@ -63,7 +64,6 @@ describe('useEventDetails', () => {
expect(hookResult.result.current.dataAsNestedObject).toEqual({});
expect(hookResult.result.current.dataFormattedForFieldBrowser).toEqual([]);
expect(hookResult.result.current.getFieldsData('test')).toEqual('test');
- expect(hookResult.result.current.indexPattern).toEqual({});
expect(hookResult.result.current.loading).toEqual(false);
expect(hookResult.result.current.refetchFlyoutData()).toEqual(undefined);
expect(hookResult.result.current.searchHit).toEqual({});
diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/shared/hooks/use_event_details.ts b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/shared/hooks/use_event_details.ts
index 40acb8690ce64..3c2f4b7acb745 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/shared/hooks/use_event_details.ts
+++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/shared/hooks/use_event_details.ts
@@ -8,7 +8,6 @@
import type { BrowserFields, TimelineEventsDetailsItem } from '@kbn/timelines-plugin/common';
import type { EcsSecurityExtension as Ecs } from '@kbn/securitysolution-ecs';
import { SecurityPageName } from '@kbn/security-solution-navigation';
-import type { DataViewBase } from '@kbn/es-query';
import { DEFAULT_ALERTS_INDEX, DEFAULT_PREVIEW_INDEX } from '../../../../../common/constants';
import type { RunTimeMappings } from '../../../../../common/api/search_strategy';
import { useSpaceId } from '../../../../common/hooks/use_space_id';
@@ -63,10 +62,6 @@ export interface UseEventDetailsResult {
* Retrieves searchHit values for the provided field
*/
getFieldsData: GetFieldsData;
- /**
- * Index pattern for rule details
- */
- indexPattern: DataViewBase;
/**
* Whether the data is loading
*/
@@ -102,7 +97,7 @@ export const useEventDetails = ({
useTimelineEventsDetails({
indexName: eventIndex,
eventId: eventId ?? '',
- runtimeMappings: sourcererDataView?.sourcererDataView?.runtimeFieldMap as RunTimeMappings,
+ runtimeMappings: sourcererDataView.sourcererDataView.runtimeFieldMap as RunTimeMappings,
skip: !eventId,
});
const { getFieldsData } = useGetFieldsData({ fieldsData: searchHit?.fields });
@@ -112,7 +107,6 @@ export const useEventDetails = ({
dataAsNestedObject,
dataFormattedForFieldBrowser,
getFieldsData,
- indexPattern: sourcererDataView.indexPattern,
loading,
refetchFlyoutData,
searchHit,
diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/network_details/components/network_details.tsx b/x-pack/solutions/security/plugins/security_solution/public/flyout/network_details/components/network_details.tsx
index 2e9a99683902f..4d6f85c7012da 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/flyout/network_details/components/network_details.tsx
+++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/network_details/components/network_details.tsx
@@ -73,10 +73,10 @@ export const NetworkDetails = ({ ip, flowTarget }: NetworkDetailsProps) => {
services: { uiSettings },
} = useKibana();
- const { indicesExist, indexPattern, selectedPatterns } = useSourcererDataView();
+ const { indicesExist, sourcererDataView, selectedPatterns } = useSourcererDataView();
const [filterQuery, kqlError] = convertToBuildEsQuery({
config: getEsQueryConfig(uiSettings),
- indexPattern,
+ dataViewSpec: sourcererDataView,
queries: [query],
filters,
});
diff --git a/x-pack/solutions/security/plugins/security_solution/public/kubernetes/pages/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/kubernetes/pages/index.tsx
index c2d84e543dc0f..55c8a4472379b 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/kubernetes/pages/index.tsx
+++ b/x-pack/solutions/security/plugins/security_solution/public/kubernetes/pages/index.tsx
@@ -25,12 +25,13 @@ import { convertToBuildEsQuery } from '../../common/lib/kuery';
import { useInvalidFilterQuery } from '../../common/hooks/use_invalid_filter_query';
import { SessionsView } from '../../common/components/sessions_viewer';
import { kubernetesSessionsHeaders } from './constants';
+import { dataViewSpecToIndexPattern } from './utils/data_view_spec_to_index_pattern';
export const KubernetesContainer = React.memo(() => {
const { kubernetesSecurity, uiSettings } = useKibana().services;
const { globalFullScreen } = useGlobalFullScreen();
- const { indexPattern, sourcererDataView, dataViewId } = useSourcererDataView();
+ const { sourcererDataView, dataViewId } = useSourcererDataView();
const { from, to } = useGlobalTime();
const getGlobalFiltersQuerySelector = useMemo(
@@ -45,11 +46,11 @@ export const KubernetesContainer = React.memo(() => {
() =>
convertToBuildEsQuery({
config: getEsQueryConfig(uiSettings),
- indexPattern,
+ dataViewSpec: sourcererDataView,
queries: [query],
filters,
}),
- [filters, indexPattern, uiSettings, query]
+ [filters, sourcererDataView, uiSettings, query]
);
useInvalidFilterQuery({
@@ -84,7 +85,7 @@ export const KubernetesContainer = React.memo(() => {
),
- indexPattern,
+ indexPattern: dataViewSpecToIndexPattern(sourcererDataView),
globalFilter: {
filterQuery,
startDate: from,
diff --git a/x-pack/solutions/security/plugins/security_solution/public/kubernetes/pages/utils/data_view_spec_to_index_pattern.ts b/x-pack/solutions/security/plugins/security_solution/public/kubernetes/pages/utils/data_view_spec_to_index_pattern.ts
new file mode 100644
index 0000000000000..f4cb604ec3d8f
--- /dev/null
+++ b/x-pack/solutions/security/plugins/security_solution/public/kubernetes/pages/utils/data_view_spec_to_index_pattern.ts
@@ -0,0 +1,15 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+import type { DataViewSpec } from '@kbn/data-plugin/common';
+import type { IndexPattern } from '@kbn/kubernetes-security-plugin/public/types';
+
+export const dataViewSpecToIndexPattern = (
+ dataViewSpec?: DataViewSpec
+): IndexPattern | undefined => {
+ return dataViewSpec as IndexPattern | undefined;
+};
diff --git a/x-pack/solutions/security/plugins/security_solution/public/overview/components/event_counts/index.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/overview/components/event_counts/index.test.tsx
index 843c5250bf26c..f061ead1073ae 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/overview/components/event_counts/index.test.tsx
+++ b/x-pack/solutions/security/plugins/security_solution/public/overview/components/event_counts/index.test.tsx
@@ -8,7 +8,7 @@
import { render } from '@testing-library/react';
import React from 'react';
-import { mockIndexPattern, TestProviders } from '../../../common/mock';
+import { mockDataViewSpec, TestProviders } from '../../../common/mock';
import { OverviewHost } from '../overview_host';
import { OverviewNetwork } from '../overview_network';
@@ -35,7 +35,7 @@ describe('EventCounts', () => {
filters: [],
from,
indexNames: [],
- indexPattern: mockIndexPattern,
+ dataViewSpec: mockDataViewSpec,
setQuery: jest.fn(),
to,
query: {
diff --git a/x-pack/solutions/security/plugins/security_solution/public/overview/components/event_counts/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/overview/components/event_counts/index.tsx
index 34692b8cc12d3..3f20d3365537f 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/overview/components/event_counts/index.tsx
+++ b/x-pack/solutions/security/plugins/security_solution/public/overview/components/event_counts/index.tsx
@@ -8,8 +8,8 @@
import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui';
import React, { useMemo } from 'react';
-import type { DataViewBase, Filter, Query } from '@kbn/es-query';
-import { getEsQueryConfig } from '@kbn/data-plugin/common';
+import type { Filter, Query } from '@kbn/es-query';
+import { type DataViewSpec, getEsQueryConfig } from '@kbn/data-plugin/common';
import { ID as OverviewHostQueryId } from '../../containers/overview_host';
import { OverviewHost } from '../overview_host';
import { OverviewNetwork } from '../overview_network';
@@ -26,7 +26,7 @@ import { SecurityPageName } from '../../../../common/constants';
interface Props extends Pick {
filters: Filter[];
indexNames: string[];
- indexPattern: DataViewBase;
+ dataViewSpec?: DataViewSpec;
query: Query;
}
@@ -34,7 +34,7 @@ const EventCountsComponent: React.FC = ({
filters,
from,
indexNames,
- indexPattern,
+ dataViewSpec,
query,
setQuery,
to,
@@ -45,22 +45,22 @@ const EventCountsComponent: React.FC = ({
() =>
convertToBuildEsQuery({
config: getEsQueryConfig(uiSettings),
- indexPattern,
+ dataViewSpec,
queries: [query],
filters: [...filters, ...fieldNameExistsFilter(SecurityPageName.hosts)],
}),
- [filters, indexPattern, query, uiSettings]
+ [dataViewSpec, filters, query, uiSettings]
);
const [networkFilterQuery] = useMemo(
() =>
convertToBuildEsQuery({
config: getEsQueryConfig(uiSettings),
- indexPattern,
+ dataViewSpec,
queries: [query],
filters: [...filters, ...sourceOrDestinationIpExistsFilter],
}),
- [filters, indexPattern, uiSettings, query]
+ [uiSettings, dataViewSpec, query, filters]
);
useInvalidFilterQuery({
diff --git a/x-pack/solutions/security/plugins/security_solution/public/overview/components/events_by_dataset/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/overview/components/events_by_dataset/index.tsx
index f53e552c7537c..a37e6adda8ad5 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/overview/components/events_by_dataset/index.tsx
+++ b/x-pack/solutions/security/plugins/security_solution/public/overview/components/events_by_dataset/index.tsx
@@ -9,9 +9,10 @@ import { Position } from '@elastic/charts';
import numeral from '@elastic/numeral';
import React, { useEffect, useMemo, useCallback } from 'react';
-import type { DataViewBase, Filter, Query } from '@kbn/es-query';
+import type { Filter, Query } from '@kbn/es-query';
import styled from '@emotion/styled';
import { EuiButton } from '@elastic/eui';
+import type { DataViewSpec } from '@kbn/data-plugin/common';
import { getEsQueryConfig } from '@kbn/data-plugin/common';
import { DEFAULT_NUMBER_FORMAT, APP_UI_ID } from '../../../../common/constants';
import { SHOWING, UNIT } from '../../../common/components/events_viewer/translations';
@@ -46,7 +47,7 @@ interface Props extends Pick {
filterQuery?: string;
filters: Filter[];
headerChildren?: React.ReactNode;
- indexPattern: DataViewBase;
+ dataViewSpec?: DataViewSpec;
onlyField?: string;
paddingSize?: 's' | 'm' | 'l' | 'none';
query: Query;
@@ -76,7 +77,7 @@ const EventsByDatasetComponent: React.FC = ({
filters,
from,
headerChildren,
- indexPattern,
+ dataViewSpec,
onlyField,
paddingSize,
query,
@@ -129,13 +130,13 @@ const EventsByDatasetComponent: React.FC = ({
if (filterQueryFromProps == null) {
return convertToBuildEsQuery({
config: getEsQueryConfig(kibana.services.uiSettings),
- indexPattern,
+ dataViewSpec,
queries: [query],
filters,
});
}
return [filterQueryFromProps];
- }, [filterQueryFromProps, kibana, indexPattern, query, filters]);
+ }, [filterQueryFromProps, kibana.services.uiSettings, dataViewSpec, query, filters]);
useInvalidFilterQuery({
id: uniqueQueryId,
diff --git a/x-pack/solutions/security/plugins/security_solution/public/overview/pages/overview.tsx b/x-pack/solutions/security/plugins/security_solution/public/overview/pages/overview.tsx
index 6bee36dfdbb6f..ea1f5321a87db 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/overview/pages/overview.tsx
+++ b/x-pack/solutions/security/plugins/security_solution/public/overview/pages/overview.tsx
@@ -50,8 +50,7 @@ const OverviewComponent = () => {
const filters = useDeepEqualSelector(getGlobalFiltersQuerySelector);
const { from, deleteQuery, setQuery, to } = useGlobalTime();
- const { indicesExist, sourcererDataView, indexPattern, selectedPatterns } =
- useSourcererDataView();
+ const { indicesExist, sourcererDataView, selectedPatterns } = useSourcererDataView();
const endpointMetadataIndex = useMemo(() => {
return [ENDPOINT_METADATA_INDEX];
@@ -114,7 +113,7 @@ const OverviewComponent = () => {
deleteQuery={deleteQuery}
filters={filters}
from={from}
- indexPattern={indexPattern}
+ dataViewSpec={sourcererDataView}
query={query}
queryType="overview"
to={to}
@@ -126,7 +125,7 @@ const OverviewComponent = () => {
filters={filters}
from={from}
indexNames={selectedPatterns}
- indexPattern={indexPattern}
+ dataViewSpec={sourcererDataView}
query={query}
setQuery={setQuery}
to={to}
diff --git a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/alerts_sourcerer.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/alerts_sourcerer.test.tsx
index 60bbe58824e41..619f7e91eae82 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/alerts_sourcerer.test.tsx
+++ b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/alerts_sourcerer.test.tsx
@@ -72,6 +72,7 @@ describe('sourcerer on alerts page or rules details page', () => {
(useSourcererDataView as jest.Mock).mockReturnValue({
...sourcererDataView,
indicesExist: true,
+ sourcererDataView: {},
});
render(
diff --git a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/index.tsx
index 8b45d96669793..ad5a939b69995 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/index.tsx
+++ b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/index.tsx
@@ -152,8 +152,8 @@ export const Sourcerer = React.memo(({ scope: scopeId }
const { indicesExist, loading, sourcererDataView } = useSourcererDataView(scopeId);
const activePatterns = useMemo(
- () => (sourcererDataView?.title || '')?.split(',').filter(Boolean) as string[],
- [sourcererDataView?.title]
+ () => (sourcererDataView.title || '')?.split(',').filter(Boolean) as string[],
+ [sourcererDataView.title]
);
const [missingPatterns, setMissingPatterns] = useState(
diff --git a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/sourcerer_integration.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/sourcerer_integration.test.tsx
index d43a3a47ed267..5f21a814da363 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/sourcerer_integration.test.tsx
+++ b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/sourcerer_integration.test.tsx
@@ -72,6 +72,7 @@ const patternListNoSignals = sortWithExcludesAtEnd(
const sourcererDataView = {
indicesExist: true,
loading: false,
+ sourcererDataView: {},
};
describe('Sourcerer integration tests', () => {
diff --git a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/timeline_sourcerer.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/timeline_sourcerer.test.tsx
index ff86241164631..35a26856f4930 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/timeline_sourcerer.test.tsx
+++ b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/timeline_sourcerer.test.tsx
@@ -56,6 +56,7 @@ const { id } = mockGlobalState.sourcerer.defaultDataView;
const sourcererDataView = {
indicesExist: true,
loading: false,
+ sourcererDataView: {},
};
describe('timeline sourcerer', () => {
diff --git a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/use_get_sourcerer_data_view.test.ts b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/use_get_sourcerer_data_view.test.ts
index 977ee35310031..bf687fa361db5 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/use_get_sourcerer_data_view.test.ts
+++ b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/use_get_sourcerer_data_view.test.ts
@@ -37,7 +37,7 @@ describe('useGetScopedSourcererDataView', () => {
it('should return undefined when no spec is provided', () => {
mockGetSourcererDataView.mockReturnValueOnce({
...mockSourcererScope,
- sourcererDataView: undefined,
+ sourcererDataView: {},
});
const { result } = renderHookCustom({ sourcererScope: SourcererScopeName.timeline });
expect(result.current).toBeUndefined();
@@ -45,7 +45,7 @@ describe('useGetScopedSourcererDataView', () => {
it('should return undefined when no spec is provided and should update the return when spec is updated to correct value', () => {
mockGetSourcererDataView.mockReturnValueOnce({
...mockSourcererScope,
- sourcererDataView: undefined,
+ sourcererDataView: {},
});
const { rerender, result } = renderHookCustom({ sourcererScope: SourcererScopeName.timeline });
expect(result.current).toBeUndefined();
diff --git a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/use_get_sourcerer_data_view.tsx b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/use_get_sourcerer_data_view.tsx
index 869b9d68e27ac..52b5ca9717e8d 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/use_get_sourcerer_data_view.tsx
+++ b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/use_get_sourcerer_data_view.tsx
@@ -30,7 +30,7 @@ export const useGetScopedSourcererDataView = ({
const { sourcererDataView } = useSourcererDataView(sourcererScope);
const dataView = useMemo(() => {
- if (sourcererDataView) {
+ if (Object.keys(sourcererDataView).length) {
return new DataView({ spec: sourcererDataView, fieldFormats });
} else {
return undefined;
diff --git a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/containers/hooks.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/containers/hooks.test.tsx
index c1c6c46b4cd92..e74a117403f8c 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/containers/hooks.test.tsx
+++ b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/containers/hooks.test.tsx
@@ -649,7 +649,6 @@ describe('Sourcerer Hooks', () => {
'-filebeat-*',
'-packetbeat-*',
]);
- expect(result.current.indexPattern).toHaveProperty('getName');
});
});
@@ -658,7 +657,7 @@ describe('Sourcerer Hooks', () => {
wrapper: StoreProvider,
});
- expect(result.current.sourcererDataView?.title).toBe(
+ expect(result.current.sourcererDataView.title).toBe(
'apm-*-transaction*,auditbeat-*,endgame-*,filebeat-*,logs-*,packetbeat-*,traces-apm*,winlogbeat-*,-*elastic-cloud-logs-*'
);
@@ -675,8 +674,8 @@ describe('Sourcerer Hooks', () => {
rerender();
- expect(result.current.sourcererDataView?.title).toBe(testPatterns.join(','));
- expect(result.current.sourcererDataView?.name).toBe(testPatterns.join(','));
+ expect(result.current.sourcererDataView.title).toBe(testPatterns.join(','));
+ expect(result.current.sourcererDataView.name).toBe(testPatterns.join(','));
});
});
});
diff --git a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/containers/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/containers/index.tsx
index 621141cccfb26..ba4e0eced4dd3 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/containers/index.tsx
+++ b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/containers/index.tsx
@@ -7,6 +7,7 @@
import { useCallback, useEffect, useMemo, useState } from 'react';
import { useSelector } from 'react-redux';
+import type { FieldSpec } from '@kbn/data-plugin/common';
import { sourcererSelectors } from '../store';
import type { SelectedDataView, SourcererDataView, RunTimeMappings } from '../store/model';
import { SourcererScopeName } from '../store/model';
@@ -56,8 +57,7 @@ export const useSourcererDataView = (
id: fetchIndexReturn.dataView?.id ?? null,
loading: indexPatternsLoading,
patternList: fetchIndexReturn.indexes,
- indexFields: fetchIndexReturn.indexPatterns
- .fields as SelectedDataView['indexPattern']['fields'],
+ indexFields: fetchIndexReturn.indexPatterns.fields as FieldSpec[],
fields: fetchIndexReturn.dataView?.fields,
}),
[fetchIndexReturn, indexPatternsLoading]
@@ -120,28 +120,12 @@ export const useSourcererDataView = (
() => ({
browserFields: browserFields(),
dataViewId: sourcererDataView.id,
- indexPattern: {
- fields: Object.values(sourcererDataView.fields || {}),
- title: selectedPatterns.join(','),
- getName: () => selectedPatterns.join(','),
- },
indicesExist,
loading: loading || sourcererDataView.loading,
- // all active & inactive patterns in DATA_VIEW
- patternList: sourcererDataView.title.split(','),
// selected patterns in DATA_VIEW including filter
selectedPatterns,
- // if we have to do an update to data view, tell us which patterns are active
- ...(legacyPatterns.length > 0 ? { activePatterns: sourcererDataView.patternList } : {}),
sourcererDataView: sourcererDataView.dataView,
}),
- [
- browserFields,
- sourcererDataView,
- selectedPatterns,
- indicesExist,
- loading,
- legacyPatterns.length,
- ]
+ [browserFields, sourcererDataView, selectedPatterns, indicesExist, loading]
);
};
diff --git a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/containers/mocks.ts b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/containers/mocks.ts
index 283f41bc8be67..4d331ebab65ff 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/containers/mocks.ts
+++ b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/containers/mocks.ts
@@ -38,19 +38,6 @@ export const mockSourcererScope: SelectedDataView = {
},
},
},
- indexPattern: {
- fields: [
- {
- aggregatable: false,
- esTypes: undefined,
- name: '_id',
- searchable: true,
- subType: undefined,
- type: 'string',
- },
- ],
- title: mockPatterns.join(),
- },
sourcererDataView: mockGlobalState.sourcerer.defaultDataView,
selectedPatterns: mockPatterns,
indicesExist: true,
diff --git a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/store/model.ts b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/store/model.ts
index 3b3f8c56b261c..807c74a9c3f8f 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/store/model.ts
+++ b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/store/model.ts
@@ -9,7 +9,6 @@ import type { BrowserFields } from '@kbn/timelines-plugin/common';
import { EMPTY_BROWSER_FIELDS } from '@kbn/timelines-plugin/common';
import type { DataViewSpec } from '@kbn/data-views-plugin/public';
import type { RuntimeFieldSpec, RuntimePrimitiveTypes } from '@kbn/data-views-plugin/common';
-import type { SecuritySolutionDataViewBase } from '../../common/types';
/** Uniquely identifies a Sourcerer Scope */
export enum SourcererScopeName {
@@ -88,11 +87,6 @@ export interface SelectedDataView {
*/
browserFields: BrowserFields;
dataViewId: string | null; // null if legacy pre-8.0 timeline
- /**
- * @deprecated use sourcererDataView
- * DataViewBase with enhanced index fields used in timelines
- */
- indexPattern: SecuritySolutionDataViewBase;
/** do the selected indices exist */
indicesExist: boolean;
/** is an update being made to the data view */
@@ -103,7 +97,7 @@ export interface SelectedDataView {
* Easier to add this additional data rather than
* try to extend the SelectedDataView type from DataView.
*/
- sourcererDataView: DataViewSpec | undefined;
+ sourcererDataView: DataViewSpec;
}
/**
diff --git a/x-pack/solutions/security/plugins/security_solution/public/timelines/components/modal/actions/open_timeline_button.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/timelines/components/modal/actions/open_timeline_button.test.tsx
index e36d1ba83f2fc..9ce4e70ce2edd 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/timelines/components/modal/actions/open_timeline_button.test.tsx
+++ b/x-pack/solutions/security/plugins/security_solution/public/timelines/components/modal/actions/open_timeline_button.test.tsx
@@ -63,7 +63,11 @@ describe('OpenTimelineButton', () => {
it('should open the modal after clicking on the button', async () => {
(useParams as jest.Mock).mockReturnValue({ tabName: TimelineTypeEnum.template });
(useStartTransaction as jest.Mock).mockReturnValue({ startTransaction: jest.fn() });
- (useSourcererDataView as jest.Mock).mockReturnValue({ dataViewId: '', selectedPatterns: [] });
+ (useSourcererDataView as jest.Mock).mockReturnValue({
+ dataViewId: '',
+ selectedPatterns: [],
+ sourcererDataView: {},
+ });
(useTimelineStatus as jest.Mock).mockReturnValue({
timelineStatus: 'active',
templateTimelineFilter: null,
diff --git a/x-pack/solutions/security/plugins/security_solution/public/timelines/components/modal/header/index.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/timelines/components/modal/header/index.test.tsx
index 1816fb47a102a..793cd12f99451 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/timelines/components/modal/header/index.test.tsx
+++ b/x-pack/solutions/security/plugins/security_solution/public/timelines/components/modal/header/index.test.tsx
@@ -59,6 +59,7 @@ describe('TimelineModalHeader', () => {
(useSourcererDataView as jest.Mock).mockReturnValue({
browserFields: {},
indexPattern: { fields: [], title: '' },
+ sourcererDataView: {},
});
const { getByTestId, getByText } = renderTimelineModalHeader();
@@ -78,6 +79,7 @@ describe('TimelineModalHeader', () => {
(useSourcererDataView as jest.Mock).mockReturnValue({
browserFields: {},
indexPattern: { fields: [], title: '' },
+ sourcererDataView: {},
});
(useKibana as jest.Mock).mockReturnValue({
services: {
@@ -107,6 +109,7 @@ describe('TimelineModalHeader', () => {
(useSourcererDataView as jest.Mock).mockReturnValue({
browserFields: {},
indexPattern: { fields: [], title: '' },
+ sourcererDataView: {},
});
const spy = jest.spyOn(timelineActions, 'showTimeline');
diff --git a/x-pack/solutions/security/plugins/security_solution/public/timelines/components/modal/header/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/timelines/components/modal/header/index.tsx
index 9477bef2b2904..88d959a1804e9 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/timelines/components/modal/header/index.tsx
+++ b/x-pack/solutions/security/plugins/security_solution/public/timelines/components/modal/header/index.tsx
@@ -70,7 +70,7 @@ interface FlyoutHeaderPanelProps {
export const TimelineModalHeader = React.memo(
({ timelineId, openToggleRef }) => {
const dispatch = useDispatch();
- const { browserFields, indexPattern } = useSourcererDataView(SourcererScopeName.timeline);
+ const { browserFields, sourcererDataView } = useSourcererDataView(SourcererScopeName.timeline);
const { cases, uiSettings } = useKibana().services;
const esQueryConfig = useMemo(() => getEsQueryConfig(uiSettings), [uiSettings]);
const userCasesPermissions = useMemo(() => cases.helpers.canUseCases([APP_ID]), [cases]);
@@ -88,13 +88,21 @@ export const TimelineModalHeader = React.memo(
combineQueries({
config: esQueryConfig,
dataProviders,
- indexPattern,
+ dataViewSpec: sourcererDataView,
browserFields,
filters: filters ? filters : [],
kqlQuery: kqlQueryObj,
kqlMode,
}),
- [browserFields, dataProviders, esQueryConfig, filters, indexPattern, kqlMode, kqlQueryObj]
+ [
+ browserFields,
+ dataProviders,
+ esQueryConfig,
+ filters,
+ kqlMode,
+ kqlQueryObj,
+ sourcererDataView,
+ ]
);
const isInspectDisabled = !isDataInTimeline || combinedQueries?.filterQuery === undefined;
diff --git a/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/kpi/kpi_container.tsx b/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/kpi/kpi_container.tsx
index 47d79c1ba71c3..6b95b0ac1cf63 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/kpi/kpi_container.tsx
+++ b/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/kpi/kpi_container.tsx
@@ -32,7 +32,7 @@ interface KpiExpandedProps {
}
export const TimelineKpisContainer = ({ timelineId }: KpiExpandedProps) => {
- const { browserFields, indexPattern, selectedPatterns } = useSourcererDataView(
+ const { browserFields, sourcererDataView, selectedPatterns } = useSourcererDataView(
SourcererScopeName.timeline
);
@@ -82,13 +82,13 @@ export const TimelineKpisContainer = ({ timelineId }: KpiExpandedProps) => {
combineQueries({
config: esQueryConfig,
dataProviders,
- indexPattern,
+ dataViewSpec: sourcererDataView,
browserFields,
filters: filters ? filters : [],
kqlQuery,
kqlMode,
}),
- [browserFields, dataProviders, esQueryConfig, filters, indexPattern, kqlMode, kqlQuery]
+ [browserFields, dataProviders, esQueryConfig, filters, sourcererDataView, kqlMode, kqlQuery]
);
const isBlankTimeline: boolean = useMemo(
diff --git a/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/query_bar/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/query_bar/index.tsx
index 3ac5ba0cb5ac8..1bb39aa4796d2 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/query_bar/index.tsx
+++ b/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/query_bar/index.tsx
@@ -17,7 +17,10 @@ import { InputsModelId } from '../../../../common/store/inputs/constants';
import { useSourcererDataView } from '../../../../sourcerer/containers';
import { SourcererScopeName } from '../../../../sourcerer/store/model';
-import { convertKueryToElasticSearchQuery } from '../../../../common/lib/kuery';
+import {
+ convertKueryToElasticSearchQuery,
+ dataViewSpecToViewBase,
+} from '../../../../common/lib/kuery';
import type { KqlMode } from '../../../store/model';
import { useSavedQueryServices } from '../../../../common/utils/saved_query_services';
import type { DispatchUpdateReduxTime } from '../../../../common/components/super_date_picker';
@@ -107,7 +110,7 @@ export const QueryBarTimeline = memo(
const [dateRangeTo, setDateRangTo] = useState(
toStr != null ? toStr : new Date(to).toISOString()
);
- const { browserFields, indexPattern } = useSourcererDataView(SourcererScopeName.timeline);
+ const { browserFields, sourcererDataView } = useSourcererDataView(SourcererScopeName.timeline);
const [savedQuery, setSavedQuery] = useState(undefined);
const [filterQueryConverted, setFilterQueryConverted] = useState({
query: filterQuery != null ? filterQuery.expression : '',
@@ -115,6 +118,11 @@ export const QueryBarTimeline = memo(
});
const queryBarFilters = useMemo(() => getNonDropAreaFilters(filters), [filters]);
+ const indexPattern = useMemo(
+ () => dataViewSpecToViewBase(sourcererDataView),
+ [sourcererDataView]
+ );
+
const [dataProvidersDsl, setDataProvidersDsl] = useState(
convertKueryToElasticSearchQuery(buildGlobalQuery(dataProviders, browserFields), indexPattern)
);
@@ -259,6 +267,10 @@ export const QueryBarTimeline = memo(
[dataProvidersDsl, savedQueryId, savedQueryServices]
);
+ if (!indexPattern) {
+ return null;
+ }
+
return (
(
services: { data },
} = useKibana();
- const { indexPattern } = useSourcererDataView(SourcererScopeName.timeline);
+ const { sourcererDataView } = useSourcererDataView(SourcererScopeName.timeline);
const getIsDataProviderVisible = useMemo(
() => timelineSelectors.dataProviderVisibilitySelector(),
@@ -86,25 +86,22 @@ const StatefulSearchOrFilterComponent = React.memo(
useEffect(() => {
let dv: DataView;
- if (isDataView(indexPattern)) {
- setDataView(indexPattern);
- } else if (!filterQuery) {
- const createDataView = async () => {
- try {
- dv = await data.dataViews.create({ title: indexPattern.title });
- setDataView(dv);
- } catch (error) {
- addError(error, { title: i18n.ERROR_PROCESSING_INDEX_PATTERNS });
- }
- };
- createDataView();
- }
+ const createDataView = async () => {
+ try {
+ dv = await data.dataViews.create(sourcererDataView);
+ setDataView(dv);
+ } catch (error) {
+ addError(error, { title: i18n.ERROR_PROCESSING_INDEX_PATTERNS });
+ }
+ };
+ createDataView();
+
return () => {
if (dv?.id) {
data.dataViews.clearInstanceCache(dv?.id);
}
};
- }, [data.dataViews, indexPattern, filterQuery, addError]);
+ }, [data.dataViews, filterQuery, addError, sourcererDataView]);
const arrDataView = useMemo(() => (dataView != null ? [dataView] : []), [dataView]);
diff --git a/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/tabs/pinned/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/tabs/pinned/index.tsx
index a9d08764779f5..33e1807f90686 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/tabs/pinned/index.tsx
+++ b/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/tabs/pinned/index.tsx
@@ -148,7 +148,7 @@ export const PinnedTabContentComponent: React.FC = ({
fields: timelineQueryFields,
limit: itemsPerPage,
filterQuery,
- runtimeMappings: sourcererDataView?.runtimeFieldMap as RunTimeMappings,
+ runtimeMappings: sourcererDataView.runtimeFieldMap as RunTimeMappings,
skip: filterQuery === '',
startDate: '',
sort: timelineQuerySortField,
diff --git a/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/tabs/query/events_count.tsx b/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/tabs/query/events_count.tsx
index 89d886108d777..1734e38f5828d 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/tabs/query/events_count.tsx
+++ b/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/tabs/query/events_count.tsx
@@ -90,7 +90,6 @@ export const TimelineQueryTabEventsCountComponent: React.FC<{ timelineId: string
browserFields,
dataViewId,
loading: loadingSourcerer,
- indexPattern,
// important to get selectedPatterns from useSourcererDataView
// in order to include the exclude filters in the search that are not stored in the timeline
selectedPatterns,
@@ -117,13 +116,13 @@ export const TimelineQueryTabEventsCountComponent: React.FC<{ timelineId: string
return combineQueries({
config: esQueryConfig,
dataProviders,
- indexPattern,
+ dataViewSpec: sourcererDataView,
browserFields,
filters,
kqlQuery,
kqlMode,
});
- }, [esQueryConfig, dataProviders, indexPattern, browserFields, filters, kqlQuery, kqlMode]);
+ }, [esQueryConfig, dataProviders, sourcererDataView, browserFields, filters, kqlQuery, kqlMode]);
useInvalidFilterQuery({
id: timelineId,
diff --git a/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/tabs/query/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/tabs/query/index.tsx
index e8f9fa7c04196..c3dcc91077201 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/tabs/query/index.tsx
+++ b/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/tabs/query/index.tsx
@@ -87,7 +87,6 @@ export const QueryTabContentComponent: React.FC = ({
browserFields,
dataViewId,
loading: loadingSourcerer,
- indexPattern,
// important to get selectedPatterns from useSourcererDataView
// in order to include the exclude filters in the search that are not stored in the timeline
selectedPatterns,
@@ -127,13 +126,13 @@ export const QueryTabContentComponent: React.FC = ({
return combineQueries({
config: esQueryConfig,
dataProviders,
- indexPattern,
+ dataViewSpec: sourcererDataView,
browserFields,
filters,
kqlQuery,
kqlMode,
});
- }, [esQueryConfig, dataProviders, indexPattern, browserFields, filters, kqlQuery, kqlMode]);
+ }, [esQueryConfig, dataProviders, sourcererDataView, browserFields, filters, kqlQuery, kqlMode]);
useInvalidFilterQuery({
id: timelineId,
diff --git a/x-pack/solutions/security/plugins/security_solution/public/timelines/pages/timelines_page.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/timelines/pages/timelines_page.test.tsx
index ba975711debc5..ae82e2a381010 100644
--- a/x-pack/solutions/security/plugins/security_solution/public/timelines/pages/timelines_page.test.tsx
+++ b/x-pack/solutions/security/plugins/security_solution/public/timelines/pages/timelines_page.test.tsx
@@ -32,6 +32,7 @@ describe('TimelinesPage', () => {
it('should render landing page if no indicesExist', () => {
(useSourcererDataView as unknown as jest.Mock).mockReturnValue({
indicesExist: false,
+ sourcererDataView: {},
});
(useUserPrivileges as jest.Mock).mockReturnValue({
timelinePrivileges: {
@@ -49,6 +50,7 @@ describe('TimelinesPage', () => {
it('should show the correct elements if user has crud', () => {
(useSourcererDataView as unknown as jest.Mock).mockReturnValue({
indicesExist: true,
+ sourcererDataView: {},
});
(useUserPrivileges as jest.Mock).mockReturnValue({
timelinePrivileges: {
diff --git a/x-pack/solutions/security/plugins/threat_intelligence/public/containers/field_types_provider.tsx b/x-pack/solutions/security/plugins/threat_intelligence/public/containers/field_types_provider.tsx
index bff41a2a4ef01..ef3c72cd0ba0d 100644
--- a/x-pack/solutions/security/plugins/threat_intelligence/public/containers/field_types_provider.tsx
+++ b/x-pack/solutions/security/plugins/threat_intelligence/public/containers/field_types_provider.tsx
@@ -16,16 +16,18 @@ export const FieldTypesContext = createContext> = ({ children }) => {
- const { indexPattern } = useSourcererDataView();
+ const {
+ sourcererDataView: { fields = {} },
+ } = useSourcererDataView();
// field name to field type map to allow the cell_renderer to format dates
const fieldTypes: FieldTypesContextValue = useMemo(
() =>
- indexPattern.fields.reduce((acc, field) => {
+ Object.values(fields).reduce((acc, field) => {
acc[field.name] = field.type;
return acc;
}, {} as FieldTypesContextValue),
- [indexPattern.fields]
+ [fields]
);
return {children};
diff --git a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector.stories.tsx b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector.stories.tsx
index d6e620430962b..f8f9bbf513422 100644
--- a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector.stories.tsx
+++ b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector.stories.tsx
@@ -7,24 +7,10 @@
import React from 'react';
import type { StoryFn } from '@storybook/react';
-import { DataView, DataViewField } from '@kbn/data-views-plugin/common';
import { EuiComboBoxOptionOption } from '@elastic/eui';
import { RawIndicatorFieldId } from '../../../../../common/types/indicator';
import { IndicatorsFieldSelector } from './field_selector';
-const mockIndexPattern: DataView = {
- fields: [
- {
- name: '@timestamp',
- type: 'date',
- } as DataViewField,
- {
- name: 'threat.feed.name',
- type: 'string',
- } as DataViewField,
- ],
-} as DataView;
-
export default {
component: IndicatorsFieldSelector,
title: 'IndicatorsFieldSelector',
@@ -33,7 +19,6 @@ export default {
export const Default: StoryFn = () => {
return (
) =>
window.alert(`${label} selected`)
}
@@ -44,7 +29,6 @@ export const Default: StoryFn = () => {
export const WithDefaultValue: StoryFn = () => {
return (
) =>
window.alert(`${label} selected`)
}
@@ -54,5 +38,5 @@ export const WithDefaultValue: StoryFn = () => {
};
export const NoData: StoryFn = () => {
- return {}} />;
+ return {}} />;
};
diff --git a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector.test.tsx b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector.test.tsx
index afb47dbfbedd5..880d242c74bbf 100644
--- a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector.test.tsx
+++ b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector.test.tsx
@@ -7,31 +7,16 @@
import React from 'react';
import { render } from '@testing-library/react';
-import { DataView, DataViewField } from '@kbn/data-views-plugin/common';
import { TestProvidersComponent } from '../../../../mocks/test_providers';
import { IndicatorsFieldSelector } from './field_selector';
import { EuiComboBoxOptionOption } from '@elastic/eui';
import { DROPDOWN_TEST_ID } from './test_ids';
-const mockIndexPattern: DataView = {
- fields: [
- {
- name: '@timestamp',
- type: 'date',
- } as DataViewField,
- {
- name: 'threat.feed.name',
- type: 'string',
- } as DataViewField,
- ],
-} as DataView;
-
describe('', () => {
it('should handle empty array of indexPatterns', () => {
const { getByTestId } = render(
) => console.log(value)}
/>
@@ -45,7 +30,6 @@ describe('', () => {
const { getByTestId } = render(
) => console.log(value)}
/>
diff --git a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector.tsx b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector.tsx
index cceccc918ba37..c6d8fa096d675 100644
--- a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector.tsx
+++ b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector.tsx
@@ -7,16 +7,15 @@
import React, { memo, useCallback, useMemo, useState } from 'react';
import { EuiComboBox } from '@elastic/eui';
-import { DataViewField } from '@kbn/data-views-plugin/common';
+import { FieldSpec } from '@kbn/data-views-plugin/common';
import { EuiComboBoxOptionOption } from '@elastic/eui/src/components/combo_box/types';
-import { SecuritySolutionDataViewBase } from '../../../../types';
import { RawIndicatorFieldId } from '../../../../../common/types/indicator';
import { useStyles } from './styles';
import { DROPDOWN_TEST_ID } from './test_ids';
import { COMBOBOX_PREPEND_LABEL } from './translations';
+import { useCurrentDataViewFields } from '../../hooks/use_current_data_view_fields';
export interface IndicatorsFieldSelectorProps {
- indexPattern: SecuritySolutionDataViewBase;
valueChange: (value: EuiComboBoxOptionOption) => void;
defaultStackByValue?: RawIndicatorFieldId;
}
@@ -25,10 +24,12 @@ const DEFAULT_STACK_BY_VALUE = RawIndicatorFieldId.Feed;
const COMBOBOX_SINGLE_SELECTION = { asPlainText: true };
export const IndicatorsFieldSelector = memo(
- ({ indexPattern, valueChange, defaultStackByValue = DEFAULT_STACK_BY_VALUE }) => {
+ ({ valueChange, defaultStackByValue = DEFAULT_STACK_BY_VALUE }) => {
+ const rawFields = useCurrentDataViewFields();
+
const styles = useStyles();
- const defaultStackByValueInfo = indexPattern.fields.find(
- (f: DataViewField) => f.name === defaultStackByValue
+ const defaultStackByValueInfo = rawFields.find(
+ (f: FieldSpec) => f.name === defaultStackByValue
);
const [selectedField, setSelectedField] = useState>>([
{
@@ -38,13 +39,11 @@ export const IndicatorsFieldSelector = memo(
]);
const fields: Array> = useMemo(
() =>
- indexPattern
- ? indexPattern.fields.map((f: DataViewField) => ({
- label: f.name,
- value: f.type,
- }))
- : [],
- [indexPattern]
+ rawFields.map((f: FieldSpec) => ({
+ label: f.name,
+ value: f.type,
+ })),
+ [rawFields]
);
const selectedFieldChange = useCallback(
diff --git a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/wrapper.stories.tsx b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/wrapper.stories.tsx
index c817070dd5ed5..bfbe15b40cbf6 100644
--- a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/wrapper.stories.tsx
+++ b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/wrapper.stories.tsx
@@ -10,7 +10,6 @@ import React from 'react';
import { MemoryRouter } from 'react-router-dom';
import { of } from 'rxjs';
import type { StoryObj } from '@storybook/react';
-import { DataView, DataViewField } from '@kbn/data-views-plugin/common';
import { TimeRange } from '@kbn/es-query';
import { DataPublicPluginStart } from '@kbn/data-plugin/public';
import { IUiSettingsClient } from '@kbn/core/public';
@@ -28,19 +27,6 @@ export default {
const mockTimeRange: TimeRange = { from: '', to: '' };
-const mockIndexPattern: DataView = {
- fields: [
- {
- name: '@timestamp',
- type: 'date',
- } as DataViewField,
- {
- name: 'threat.feed.name',
- type: 'string',
- } as DataViewField,
- ],
-} as DataView;
-
const validDate: string = '1 Jan 2022 00:00:00 GMT';
const numberOfDays: number = 1;
const aggregation1: Aggregation = {
@@ -139,7 +125,6 @@ export const Default: StoryObj = {
series={[]}
field={mockField}
onFieldChange={mockOnFieldChange}
- indexPattern={mockIndexPattern}
/>
);
@@ -167,7 +152,6 @@ export const InitialLoad: StoryObj = {
isFetching={false}
field={mockField}
onFieldChange={mockOnFieldChange}
- indexPattern={mockIndexPattern}
/>
);
@@ -218,7 +202,6 @@ export const UpdatingData: StoryObj = {
isFetching={true}
field={mockField}
onFieldChange={mockOnFieldChange}
- indexPattern={mockIndexPattern}
/>
);
diff --git a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/wrapper.test.tsx b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/wrapper.test.tsx
index ce393de12c32f..58c4fe6bd7bd9 100644
--- a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/wrapper.test.tsx
+++ b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/wrapper.test.tsx
@@ -8,7 +8,6 @@
import React from 'react';
import { render } from '@testing-library/react';
import { TimeRange } from '@kbn/es-query';
-import { DataView, DataViewField } from '@kbn/data-views-plugin/common';
import { TestProvidersComponent } from '../../../../mocks/test_providers';
import { IndicatorsBarChartWrapper } from './wrapper';
import {
@@ -21,19 +20,6 @@ import { DROPDOWN_TEST_ID } from './test_ids';
jest.mock('../../../query_bar/hooks/use_filters');
-const mockIndexPattern: DataView = {
- fields: [
- {
- name: '@timestamp',
- type: 'date',
- } as DataViewField,
- {
- name: 'threat.feed.name',
- type: 'string',
- } as DataViewField,
- ],
-} as DataView;
-
const mockTimeRange: TimeRange = { from: '', to: '' };
const mockField = { label: 'host.name', value: 'string' };
@@ -47,7 +33,6 @@ describe('', () => {
series={[]}
field={mockField}
onFieldChange={jest.fn()}
- indexPattern={mockIndexPattern}
timeRange={mockTimeRange}
isFetching={false}
isLoading={false}
@@ -70,7 +55,6 @@ describe('', () => {
series={[]}
field={mockField}
onFieldChange={jest.fn()}
- indexPattern={mockIndexPattern}
timeRange={mockTimeRange}
isFetching={false}
isLoading={true}
@@ -92,7 +76,6 @@ describe('', () => {
series={[]}
field={mockField}
onFieldChange={jest.fn()}
- indexPattern={mockIndexPattern}
timeRange={mockTimeRange}
isFetching={true}
isLoading={false}
diff --git a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/wrapper.tsx b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/wrapper.tsx
index 1a2f04f59cb85..7df328e04bb94 100644
--- a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/wrapper.tsx
+++ b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/wrapper.tsx
@@ -18,7 +18,6 @@ import {
import { FormattedMessage } from '@kbn/i18n-react';
import { TimeRange } from '@kbn/es-query';
import { TimeRangeBounds } from '@kbn/data-plugin/common';
-import { SecuritySolutionDataViewBase } from '../../../../types';
import { RawIndicatorFieldId } from '../../../../../common/types/indicator';
import { IndicatorsFieldSelector } from './field_selector';
import { IndicatorsBarChart } from './barchart';
@@ -36,10 +35,6 @@ export interface IndicatorsBarChartWrapperProps {
* From and to values received from the KQL bar and passed down to the hook to query data.
*/
timeRange?: TimeRange;
- /**
- * List of fields coming from the Security Solution sourcerer data view, passed down to the {@link IndicatorsFieldSelector} to populate the dropdown.
- */
- indexPattern: SecuritySolutionDataViewBase;
series: ChartSeries[];
@@ -61,7 +56,7 @@ export interface IndicatorsBarChartWrapperProps {
* and handles retrieving aggregated indicator data.
*/
export const IndicatorsBarChartWrapper = memo(
- ({ timeRange, indexPattern, isLoading, isFetching, series, dateRange, field, onFieldChange }) => {
+ ({ timeRange, isLoading, isFetching, series, dateRange, field, onFieldChange }) => {
if (isLoading) {
return (
@@ -89,7 +84,6 @@ export const IndicatorsBarChartWrapper = memo(
diff --git a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/table/table.stories.tsx b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/table/table.stories.tsx
index 579f409fc94e6..da44f8bd7513e 100644
--- a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/table/table.stories.tsx
+++ b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/table/table.stories.tsx
@@ -6,7 +6,6 @@
*/
import React from 'react';
-import { DataView } from '@kbn/data-views-plugin/common';
import { mockIndicatorsFiltersContext } from '../../../../mocks/mock_indicators_filters_context';
import { StoryProvidersComponent } from '../../../../mocks/story_providers';
import { generateMockIndicator, Indicator } from '../../../../../common/types/indicator';
@@ -19,8 +18,6 @@ export default {
title: 'IndicatorsTable',
};
-const mockIndexPattern: DataView = undefined as unknown as DataView;
-
const stub = () => void 0;
const columnSettings = {
@@ -54,7 +51,6 @@ export function IndicatorsFullyLoaded() {
onChangePage={stub}
onChangeItemsPerPage={stub}
indicatorCount={indicatorsFixture.length * 2}
- indexPattern={mockIndexPattern}
columnSettings={columnSettings}
/>
@@ -77,7 +73,6 @@ export function FirstLoad() {
onChangeItemsPerPage={stub}
indicatorCount={0}
isLoading={true}
- indexPattern={mockIndexPattern}
columnSettings={columnSettings}
/>
@@ -103,7 +98,6 @@ export function DataUpdateInProgress() {
onChangePage={stub}
onChangeItemsPerPage={stub}
indicatorCount={indicatorsFixture.length * 2}
- indexPattern={mockIndexPattern}
columnSettings={columnSettings}
/>
@@ -126,7 +120,6 @@ export function WithNoIndicators() {
onChangeItemsPerPage={stub}
indicatorCount={0}
isLoading={false}
- indexPattern={mockIndexPattern}
columnSettings={columnSettings}
/>
diff --git a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/table/table.test.tsx b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/table/table.test.tsx
index 2a2f9e61852be..86196706c882e 100644
--- a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/table/table.test.tsx
+++ b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/table/table.test.tsx
@@ -11,7 +11,6 @@ import { IndicatorsTable, IndicatorsTableProps } from './table';
import { TestProvidersComponent } from '../../../../mocks/test_providers';
import { generateMockIndicator, Indicator } from '../../../../../common/types/indicator';
import { BUTTON_TEST_ID, TABLE_UPDATE_PROGRESS_TEST_ID } from './test_ids';
-import { SecuritySolutionDataViewBase } from '../../../../types';
import { INDICATORS_FLYOUT_TITLE_TEST_ID } from '../flyout/test_ids';
const stub = () => {};
@@ -24,7 +23,6 @@ const tableProps: IndicatorsTableProps = {
indicatorCount: 0,
isLoading: false,
browserFields: {},
- indexPattern: { fields: [], title: '' } as SecuritySolutionDataViewBase,
columnSettings: {
columnVisibility: {
visibleColumns: [],
diff --git a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/table/table.tsx b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/table/table.tsx
index 9b64090048bb9..b4578d4423478 100644
--- a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/table/table.tsx
+++ b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/table/table.tsx
@@ -25,7 +25,7 @@ import {
import { CellActions } from './cell_actions';
import { cellPopoverRendererFactory } from './cell_popover_renderer';
import { cellRendererFactory } from './cell_renderer';
-import { BrowserFields, SecuritySolutionDataViewBase } from '../../../../types';
+import { BrowserFields } from '../../../../types';
import { Indicator, RawIndicatorFieldId } from '../../../../../common/types/indicator';
import { EmptyState } from '../../../../components/empty_state';
import { IndicatorsTableContext, IndicatorsTableContextValue } from '../../hooks/use_table_context';
@@ -51,7 +51,6 @@ export interface IndicatorsTableProps {
*/
isLoading?: boolean;
isFetching?: boolean;
- indexPattern: SecuritySolutionDataViewBase;
browserFields: BrowserFields;
columnSettings: ColumnSettingsValue;
}
diff --git a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/hooks/use_current_data_view_fields.test.ts b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/hooks/use_current_data_view_fields.test.ts
new file mode 100644
index 0000000000000..fe0407137907a
--- /dev/null
+++ b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/hooks/use_current_data_view_fields.test.ts
@@ -0,0 +1,35 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+import { renderHook } from '@testing-library/react';
+import { useCurrentDataViewFields } from './use_current_data_view_fields';
+import { useSourcererDataView } from './use_sourcerer_data_view';
+
+jest.mock('./use_sourcerer_data_view');
+
+describe('useFields', () => {
+ it('should return fields from sourcererDataView', () => {
+ const mockFields = { field1: {}, field2: {} };
+ (useSourcererDataView as jest.Mock).mockReturnValue({
+ sourcererDataView: { fields: mockFields },
+ });
+
+ const { result } = renderHook(() => useCurrentDataViewFields());
+
+ expect(result.current).toEqual(Object.values(mockFields));
+ });
+
+ it('should return an empty array if fields are undefined', () => {
+ (useSourcererDataView as jest.Mock).mockReturnValue({
+ sourcererDataView: { fields: undefined },
+ });
+
+ const { result } = renderHook(() => useCurrentDataViewFields());
+
+ expect(result.current).toEqual([]);
+ });
+});
diff --git a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/hooks/use_current_data_view_fields.ts b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/hooks/use_current_data_view_fields.ts
new file mode 100644
index 0000000000000..e332dae52fac1
--- /dev/null
+++ b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/hooks/use_current_data_view_fields.ts
@@ -0,0 +1,19 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+import { useMemo } from 'react';
+import { FieldSpec } from '@kbn/data-views-plugin/common';
+import { useSourcererDataView } from './use_sourcerer_data_view';
+
+/**
+ * Custom hook to retrieve fields from the sourcerer data view.
+ */
+export const useCurrentDataViewFields = (): FieldSpec[] => {
+ const { sourcererDataView } = useSourcererDataView();
+
+ return useMemo(() => Object.values(sourcererDataView.fields ?? {}), [sourcererDataView.fields]);
+};
diff --git a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/hooks/use_sourcerer_data_view.ts b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/hooks/use_sourcerer_data_view.ts
index d2e12d545036c..e5998c00c99fe 100644
--- a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/hooks/use_sourcerer_data_view.ts
+++ b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/hooks/use_sourcerer_data_view.ts
@@ -7,7 +7,6 @@
import { useMemo } from 'react';
import { RawIndicatorFieldId } from '../../../../common/types/indicator';
-import { SecuritySolutionDataViewBase } from '../../../types';
import { useSecurityContext } from '../../../hooks/use_security_context';
import { DESCRIPTION } from './translations';
@@ -27,17 +26,6 @@ const indicatorNameField = {
export const useSourcererDataView = () => {
const { sourcererDataView } = useSecurityContext();
- const updatedPattern = useMemo(() => {
- const fields = [...sourcererDataView.indexPattern.fields, indicatorNameField];
-
- return {
- ...sourcererDataView.indexPattern,
- fields,
- } as SecuritySolutionDataViewBase;
- }, [sourcererDataView.indexPattern]);
-
- const indexPatterns = useMemo(() => [updatedPattern], [updatedPattern]);
-
const browserFields = useMemo(() => {
const { threat = { fields: {} } } = sourcererDataView.browserFields;
@@ -55,10 +43,9 @@ export const useSourcererDataView = () => {
return useMemo(
() => ({
...sourcererDataView,
- indexPatterns,
- indexPattern: updatedPattern,
browserFields,
+ patternList: sourcererDataView.selectedPatterns,
}),
- [browserFields, indexPatterns, sourcererDataView, updatedPattern]
+ [browserFields, sourcererDataView]
);
};
diff --git a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/pages/indicators.tsx b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/pages/indicators.tsx
index f2a7b566bd5d6..8e5321aab5a2e 100644
--- a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/pages/indicators.tsx
+++ b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/pages/indicators.tsx
@@ -37,7 +37,7 @@ const IndicatorsPageProviders: FC> = ({ children }) =
const IndicatorsPageContent: VFC = () => {
const { blockListIndicatorValue } = useBlockListContext();
- const { browserFields, indexPattern, sourcererDataView } = useSourcererDataView();
+ const { sourcererDataView, browserFields } = useSourcererDataView();
const columnSettings = useColumnSettings();
@@ -91,7 +91,6 @@ const IndicatorsPageContent: VFC = () => {
dateRange={dateRange}
series={series}
timeRange={timeRange}
- indexPattern={indexPattern}
field={selectedField}
onFieldChange={onFieldChange}
isFetching={isFetchingAggregatedIndicators}
@@ -100,7 +99,6 @@ const IndicatorsPageContent: VFC = () => {
;
-}
-
// eslint-disable-next-line @typescript-eslint/no-empty-interface
export interface ThreatIntelligencePluginSetup {}
@@ -65,8 +56,7 @@ export interface LicenseAware {
export type BrowserFields = Readonly>>;
export interface SelectedDataView {
- sourcererDataView: DataViewSpec | undefined;
- indexPattern: SecuritySolutionDataViewBase;
+ sourcererDataView: DataViewSpec;
browserFields: BrowserFields;
selectedPatterns: string[];
loading: boolean;