- {getRowRenderer(event.ecs, rowRenderers).renderRow({
- browserFields,
- data: event.ecs,
- timelineId,
- })}
+ () =>
+ rowRenderer && (
+ // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions
+
+
+
+
+ {i18n.YOU_ARE_IN_AN_EVENT_RENDERER(ariaRowindex)}
+
+
+ {rowRenderer.renderRow({
+ browserFields,
+ data: event.ecs,
+ timelineId,
+ })}
+
+
+
-
- ),
- [ariaRowindex, browserFields, event.ecs, focusOwnership, onKeyDown, rowRenderers, timelineId]
+ ),
+ [
+ ariaRowindex,
+ browserFields,
+ event.ecs,
+ focusOwnership,
+ onFocus,
+ onKeyDown,
+ onOutsideClick,
+ rowRenderer,
+ timelineId,
+ ]
);
- return (
- // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions
-
- {content}
-
- );
+ return content;
};
diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/helpers.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/helpers.tsx
index 3470dba636aa8..0295d44b646d7 100644
--- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/helpers.tsx
+++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/helpers.tsx
@@ -160,3 +160,9 @@ const InvestigateInResolverActionComponent: React.FC
{
setSelected: (jest.fn() as unknown) as StatefulBodyProps['setSelected'],
sort: mockSort,
showCheckboxes: false,
- activeTab: TimelineTabs.query,
+ tabType: TimelineTabs.query,
totalPages: 1,
};
diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/index.tsx
index f6190b39214e9..4a33d0d3af33e 100644
--- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/index.tsx
+++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/index.tsx
@@ -21,7 +21,7 @@ import { BrowserFields } from '../../../../common/containers/source';
import { TimelineItem } from '../../../../../common/search_strategy/timeline';
import { inputsModel, State } from '../../../../common/store';
import { useManageTimeline } from '../../manage_timeline';
-import { ColumnHeaderOptions, TimelineModel } from '../../../store/timeline/model';
+import { ColumnHeaderOptions, TimelineModel, TimelineTabs } from '../../../store/timeline/model';
import { timelineDefaults } from '../../../store/timeline/defaults';
import { timelineActions, timelineSelectors } from '../../../store/timeline';
import { OnRowSelected, OnSelectAll } from '../events';
@@ -43,6 +43,7 @@ interface OwnProps {
isEventViewer?: boolean;
sort: Sort[];
refetch: inputsModel.Refetch;
+ tabType: TimelineTabs;
totalPages: number;
onRuleChange?: () => void;
}
@@ -60,7 +61,6 @@ export type StatefulBodyProps = OwnProps & PropsFromRedux;
export const BodyComponent = React.memo(
({
- activeTab,
activePage,
browserFields,
columnHeaders,
@@ -79,6 +79,7 @@ export const BodyComponent = React.memo(
showCheckboxes,
refetch,
sort,
+ tabType,
totalPages,
}) => {
const containerRef = useRef(null);
@@ -200,7 +201,6 @@ export const BodyComponent = React.memo(
(
onRuleChange={onRuleChange}
selectedEventIds={selectedEventIds}
showCheckboxes={showCheckboxes}
+ tabType={tabType}
/>
@@ -225,7 +226,6 @@ export const BodyComponent = React.memo(
);
},
(prevProps, nextProps) =>
- prevProps.activeTab === nextProps.activeTab &&
deepEqual(prevProps.browserFields, nextProps.browserFields) &&
deepEqual(prevProps.columnHeaders, nextProps.columnHeaders) &&
deepEqual(prevProps.data, nextProps.data) &&
@@ -238,7 +238,8 @@ export const BodyComponent = React.memo(
prevProps.id === nextProps.id &&
prevProps.isEventViewer === nextProps.isEventViewer &&
prevProps.isSelectAllChecked === nextProps.isSelectAllChecked &&
- prevProps.showCheckboxes === nextProps.showCheckboxes
+ prevProps.showCheckboxes === nextProps.showCheckboxes &&
+ prevProps.tabType === nextProps.tabType
);
BodyComponent.displayName = 'BodyComponent';
@@ -253,7 +254,6 @@ const makeMapStateToProps = () => {
const mapStateToProps = (state: State, { browserFields, id }: OwnProps) => {
const timeline: TimelineModel = getTimeline(state, id) ?? timelineDefaults;
const {
- activeTab,
columns,
eventIdToNoteIds,
excludedRowRendererIds,
@@ -265,7 +265,6 @@ const makeMapStateToProps = () => {
} = timeline;
return {
- activeTab: id === TimelineId.active ? activeTab : undefined,
columnHeaders: memoizedColumnHeaders(columns, browserFields),
eventIdToNoteIds,
excludedRowRendererIds,
diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/get_row_renderer.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/get_row_renderer.test.tsx
index b4fdc427d9db3..f3a914ff4be29 100644
--- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/get_row_renderer.test.tsx
+++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/get_row_renderer.test.tsx
@@ -48,7 +48,7 @@ describe('get_column_renderer', () => {
test('renders correctly against snapshot', () => {
const rowRenderer = getRowRenderer(nonSuricata, rowRenderers);
- const row = rowRenderer.renderRow({
+ const row = rowRenderer?.renderRow({
browserFields: mockBrowserFields,
data: nonSuricata,
timelineId: 'test',
@@ -60,7 +60,7 @@ describe('get_column_renderer', () => {
test('should render plain row data when it is a non suricata row', () => {
const rowRenderer = getRowRenderer(nonSuricata, rowRenderers);
- const row = rowRenderer.renderRow({
+ const row = rowRenderer?.renderRow({
browserFields: mockBrowserFields,
data: nonSuricata,
timelineId: 'test',
@@ -75,7 +75,7 @@ describe('get_column_renderer', () => {
test('should render a suricata row data when it is a suricata row', () => {
const rowRenderer = getRowRenderer(suricata, rowRenderers);
- const row = rowRenderer.renderRow({
+ const row = rowRenderer?.renderRow({
browserFields: mockBrowserFields,
data: suricata,
timelineId: 'test',
@@ -93,7 +93,7 @@ describe('get_column_renderer', () => {
test('should render a suricata row data if event.category is network_traffic', () => {
suricata.event = { ...suricata.event, ...{ category: ['network_traffic'] } };
const rowRenderer = getRowRenderer(suricata, rowRenderers);
- const row = rowRenderer.renderRow({
+ const row = rowRenderer?.renderRow({
browserFields: mockBrowserFields,
data: suricata,
timelineId: 'test',
@@ -111,7 +111,7 @@ describe('get_column_renderer', () => {
test('should render a zeek row data if event.category is network_traffic', () => {
zeek.event = { ...zeek.event, ...{ category: ['network_traffic'] } };
const rowRenderer = getRowRenderer(zeek, rowRenderers);
- const row = rowRenderer.renderRow({
+ const row = rowRenderer?.renderRow({
browserFields: mockBrowserFields,
data: zeek,
timelineId: 'test',
@@ -129,7 +129,7 @@ describe('get_column_renderer', () => {
test('should render a system row data if event.category is network_traffic', () => {
system.event = { ...system.event, ...{ category: ['network_traffic'] } };
const rowRenderer = getRowRenderer(system, rowRenderers);
- const row = rowRenderer.renderRow({
+ const row = rowRenderer?.renderRow({
browserFields: mockBrowserFields,
data: system,
timelineId: 'test',
@@ -147,7 +147,7 @@ describe('get_column_renderer', () => {
test('should render a auditd row data if event.category is network_traffic', () => {
auditd.event = { ...auditd.event, ...{ category: ['network_traffic'] } };
const rowRenderer = getRowRenderer(auditd, rowRenderers);
- const row = rowRenderer.renderRow({
+ const row = rowRenderer?.renderRow({
browserFields: mockBrowserFields,
data: auditd,
timelineId: 'test',
diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/get_row_renderer.ts b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/get_row_renderer.ts
index 779d54216e26c..1662cf4037cac 100644
--- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/get_row_renderer.ts
+++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/get_row_renderer.ts
@@ -7,15 +7,5 @@
import { Ecs } from '../../../../../../common/ecs';
import { RowRenderer } from './row_renderer';
-const unhandledRowRenderer = (): never => {
- throw new Error('Unhandled Row Renderer');
-};
-
-export const getRowRenderer = (ecs: Ecs, rowRenderers: RowRenderer[]): RowRenderer => {
- const renderer = rowRenderers.find((rowRenderer) => rowRenderer.isInstance(ecs));
- if (renderer == null) {
- return unhandledRowRenderer();
- } else {
- return renderer;
- }
-};
+export const getRowRenderer = (ecs: Ecs, rowRenderers: RowRenderer[]): RowRenderer | null =>
+ rowRenderers.find((rowRenderer) => rowRenderer.isInstance(ecs)) ?? null;
diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/index.ts b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/index.ts
index 8e95fc3ad238a..f4498b10e4c8d 100644
--- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/index.ts
+++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/index.ts
@@ -9,7 +9,6 @@ import { ColumnRenderer } from './column_renderer';
import { emptyColumnRenderer } from './empty_column_renderer';
import { netflowRowRenderer } from './netflow/netflow_row_renderer';
import { plainColumnRenderer } from './plain_column_renderer';
-import { plainRowRenderer } from './plain_row_renderer';
import { RowRenderer } from './row_renderer';
import { suricataRowRenderer } from './suricata/suricata_row_renderer';
import { unknownColumnRenderer } from './unknown_column_renderer';
@@ -29,7 +28,6 @@ export const rowRenderers: RowRenderer[] = [
suricataRowRenderer,
zeekRowRenderer,
netflowRowRenderer,
- plainRowRenderer, // falls-back to the plain row renderer
];
export const columnRenderers: ColumnRenderer[] = [
diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/pinned_tab_content/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/pinned_tab_content/index.tsx
index 45c190c42605c..a0d2ca57f90b3 100644
--- a/x-pack/plugins/security_solution/public/timelines/components/timeline/pinned_tab_content/index.tsx
+++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/pinned_tab_content/index.tsx
@@ -23,7 +23,7 @@ import { EventDetailsWidthProvider } from '../../../../common/components/events_
import { SourcererScopeName } from '../../../../common/store/sourcerer/model';
import { timelineDefaults } from '../../../store/timeline/defaults';
import { useSourcererScope } from '../../../../common/containers/sourcerer';
-import { TimelineModel } from '../../../store/timeline/model';
+import { TimelineModel, TimelineTabs } from '../../../store/timeline/model';
import { EventDetails } from '../event_details';
import { ToggleExpandedEvent } from '../../../store/timeline/actions';
import { State } from '../../../../common/store';
@@ -183,6 +183,7 @@ export const PinnedTabContentComponent: React.FC = ({
id={timelineId}
refetch={refetch}
sort={sort}
+ tabType={TimelineTabs.pinned}
totalPages={calculateTotalPages({
itemsCount: totalCount,
itemsPerPage,
diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/query_tab_content/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/query_tab_content/index.tsx
index f6d6654d7fece..c0840d58174b3 100644
--- a/x-pack/plugins/security_solution/public/timelines/components/timeline/query_tab_content/index.tsx
+++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/query_tab_content/index.tsx
@@ -330,6 +330,7 @@ export const QueryTabContentComponent: React.FC = ({
id={timelineId}
refetch={refetch}
sort={sort}
+ tabType={TimelineTabs.query}
totalPages={calculateTotalPages({
itemsCount: totalCount,
itemsPerPage,
diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs_content/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs_content/index.tsx
index 7f0809cf9b9d8..c97571fbbd6f3 100644
--- a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs_content/index.tsx
+++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs_content/index.tsx
@@ -199,7 +199,7 @@ const TabsContentComponent: React.FC = ({ timelineId, graphEve
disabled={!graphEventId}
key={TimelineTabs.graph}
>
- {i18n.GRAPH_TAB}
+ {i18n.ANALYZER_TAB}