Skip to content

Commit f6bc61f

Browse files
authored
[Security solution] [Timeline] Bug fix for "Collapse event" button (#72552)
1 parent 4abe864 commit f6bc61f

File tree

3 files changed

+59
-162
lines changed

3 files changed

+59
-162
lines changed

x-pack/plugins/security_solution/public/common/components/event_details/__snapshots__/event_details.test.tsx.snap

Lines changed: 7 additions & 27 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

x-pack/plugins/security_solution/public/common/components/event_details/event_details.test.tsx

Lines changed: 21 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import '../../mock/match_media';
1111
import { mockDetailItemData, mockDetailItemDataId } from '../../mock/mock_detail_item';
1212
import { TestProviders } from '../../mock/test_providers';
1313

14-
import { EventDetails } from './event_details';
14+
import { EventDetails, View } from './event_details';
1515
import { mockBrowserFields } from '../../containers/source/mock';
1616
import { defaultHeaders } from '../../mock/header';
1717
import { useMountAppended } from '../../utils/use_mount_appended';
@@ -20,47 +20,35 @@ jest.mock('../link_to');
2020

2121
describe('EventDetails', () => {
2222
const mount = useMountAppended();
23+
const onEventToggled = jest.fn();
24+
const defaultProps = {
25+
browserFields: mockBrowserFields,
26+
columnHeaders: defaultHeaders,
27+
data: mockDetailItemData,
28+
id: mockDetailItemDataId,
29+
view: 'table-view' as View,
30+
onEventToggled,
31+
onUpdateColumns: jest.fn(),
32+
onViewSelected: jest.fn(),
33+
timelineId: 'test',
34+
toggleColumn: jest.fn(),
35+
};
36+
const wrapper = mount(
37+
<TestProviders>
38+
<EventDetails {...defaultProps} />
39+
</TestProviders>
40+
);
2341

2442
describe('rendering', () => {
2543
test('should match snapshot', () => {
26-
const wrapper = shallow(
27-
<EventDetails
28-
browserFields={mockBrowserFields}
29-
columnHeaders={defaultHeaders}
30-
data={mockDetailItemData}
31-
id={mockDetailItemDataId}
32-
view="table-view"
33-
onEventToggled={jest.fn()}
34-
onUpdateColumns={jest.fn()}
35-
onViewSelected={jest.fn()}
36-
timelineId="test"
37-
toggleColumn={jest.fn()}
38-
/>
39-
);
40-
expect(wrapper).toMatchSnapshot();
44+
const shallowWrap = shallow(<EventDetails {...defaultProps} />);
45+
expect(shallowWrap).toMatchSnapshot();
4146
});
4247
});
4348

4449
describe('tabs', () => {
4550
['Table', 'JSON View'].forEach((tab) => {
4651
test(`it renders the ${tab} tab`, () => {
47-
const wrapper = mount(
48-
<TestProviders>
49-
<EventDetails
50-
browserFields={mockBrowserFields}
51-
columnHeaders={defaultHeaders}
52-
data={mockDetailItemData}
53-
id={mockDetailItemDataId}
54-
view="table-view"
55-
onEventToggled={jest.fn()}
56-
onUpdateColumns={jest.fn()}
57-
onViewSelected={jest.fn()}
58-
timelineId="test"
59-
toggleColumn={jest.fn()}
60-
/>
61-
</TestProviders>
62-
);
63-
6452
expect(
6553
wrapper
6654
.find('[data-test-subj="eventDetails"]')
@@ -71,48 +59,12 @@ describe('EventDetails', () => {
7159
});
7260

7361
test('the Table tab is selected by default', () => {
74-
const wrapper = mount(
75-
<TestProviders>
76-
<EventDetails
77-
browserFields={mockBrowserFields}
78-
columnHeaders={defaultHeaders}
79-
data={mockDetailItemData}
80-
id={mockDetailItemDataId}
81-
view="table-view"
82-
onEventToggled={jest.fn()}
83-
onUpdateColumns={jest.fn()}
84-
onViewSelected={jest.fn()}
85-
timelineId="test"
86-
toggleColumn={jest.fn()}
87-
/>
88-
</TestProviders>
89-
);
90-
9162
expect(
9263
wrapper.find('[data-test-subj="eventDetails"]').find('.euiTab-isSelected').first().text()
9364
).toEqual('Table');
9465
});
9566

9667
test('it invokes `onEventToggled` when the collapse button is clicked', () => {
97-
const onEventToggled = jest.fn();
98-
99-
const wrapper = mount(
100-
<TestProviders>
101-
<EventDetails
102-
browserFields={mockBrowserFields}
103-
columnHeaders={defaultHeaders}
104-
data={mockDetailItemData}
105-
id={mockDetailItemDataId}
106-
view="table-view"
107-
onEventToggled={onEventToggled}
108-
onUpdateColumns={jest.fn()}
109-
onViewSelected={jest.fn()}
110-
timelineId="test"
111-
toggleColumn={jest.fn()}
112-
/>
113-
</TestProviders>
114-
);
115-
11668
wrapper.find('[data-test-subj="collapse"]').first().simulate('click');
11769
wrapper.update();
11870

x-pack/plugins/security_solution/public/common/components/event_details/event_details.tsx

Lines changed: 31 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,7 @@
44
* you may not use this file except in compliance with the Elastic License.
55
*/
66

7-
import { noop } from 'lodash/fp';
8-
import {
9-
EuiButtonIcon,
10-
EuiPopover,
11-
EuiTabbedContent,
12-
EuiTabbedContentTab,
13-
EuiToolTip,
14-
} from '@elastic/eui';
7+
import { EuiLink, EuiTabbedContent, EuiTabbedContentTab } from '@elastic/eui';
158
import React, { useMemo } from 'react';
169
import styled from 'styled-components';
1710

@@ -26,22 +19,11 @@ import { COLLAPSE, COLLAPSE_EVENT } from '../../../timelines/components/timeline
2619

2720
export type View = 'table-view' | 'json-view';
2821

29-
const PopoverContainer = styled.div`
30-
left: -40px;
31-
position: relative;
32-
top: 10px;
33-
34-
.euiPopover {
35-
position: fixed;
36-
z-index: 10;
37-
}
22+
const CollapseLink = styled(EuiLink)`
23+
margin: 20px 0;
3824
`;
3925

40-
const CollapseButton = styled(EuiButtonIcon)`
41-
border: 1px solid;
42-
`;
43-
44-
CollapseButton.displayName = 'CollapseButton';
26+
CollapseLink.displayName = 'CollapseLink';
4527

4628
interface Props {
4729
browserFields: BrowserFields;
@@ -75,59 +57,42 @@ export const EventDetails = React.memo<Props>(
7557
timelineId,
7658
toggleColumn,
7759
}) => {
78-
const button = useMemo(
79-
() => (
80-
<EuiToolTip content={COLLAPSE_EVENT}>
81-
<CollapseButton
82-
aria-label={COLLAPSE}
83-
data-test-subj="collapse"
84-
iconType="cross"
85-
size="s"
86-
onClick={onEventToggled}
87-
/>
88-
</EuiToolTip>
89-
),
90-
[onEventToggled]
60+
const tabs: EuiTabbedContentTab[] = useMemo(
61+
() => [
62+
{
63+
id: 'table-view',
64+
name: i18n.TABLE,
65+
content: (
66+
<EventFieldsBrowser
67+
browserFields={browserFields}
68+
columnHeaders={columnHeaders}
69+
data={data}
70+
eventId={id}
71+
onUpdateColumns={onUpdateColumns}
72+
timelineId={timelineId}
73+
toggleColumn={toggleColumn}
74+
/>
75+
),
76+
},
77+
{
78+
id: 'json-view',
79+
name: i18n.JSON_VIEW,
80+
content: <JsonView data={data} />,
81+
},
82+
],
83+
[browserFields, columnHeaders, data, id, onUpdateColumns, timelineId, toggleColumn]
9184
);
9285

93-
const tabs: EuiTabbedContentTab[] = [
94-
{
95-
id: 'table-view',
96-
name: i18n.TABLE,
97-
content: (
98-
<EventFieldsBrowser
99-
browserFields={browserFields}
100-
columnHeaders={columnHeaders}
101-
data={data}
102-
eventId={id}
103-
onUpdateColumns={onUpdateColumns}
104-
timelineId={timelineId}
105-
toggleColumn={toggleColumn}
106-
/>
107-
),
108-
},
109-
{
110-
id: 'json-view',
111-
name: i18n.JSON_VIEW,
112-
content: <JsonView data={data} />,
113-
},
114-
];
115-
11686
return (
11787
<Details data-test-subj="eventDetails">
118-
<PopoverContainer>
119-
<EuiPopover
120-
button={button}
121-
isOpen={false}
122-
closePopover={noop}
123-
repositionOnScroll={true}
124-
/>
125-
</PopoverContainer>
12688
<EuiTabbedContent
12789
tabs={tabs}
12890
selectedTab={view === 'table-view' ? tabs[0] : tabs[1]}
12991
onTabClick={(e) => onViewSelected(e.id as View)}
13092
/>
93+
<CollapseLink aria-label={COLLAPSE} data-test-subj="collapse" onClick={onEventToggled}>
94+
{COLLAPSE_EVENT}
95+
</CollapseLink>
13196
</Details>
13297
);
13398
}

0 commit comments

Comments
 (0)