Skip to content

Commit ca8a4b3

Browse files
Fix saved query modal overlay (#68826) (#70667)
# Conflicts: # x-pack/plugins/security_solution/public/common/components/query_bar/index.test.tsx
1 parent 3bf5d95 commit ca8a4b3

File tree

2 files changed

+115
-31
lines changed

2 files changed

+115
-31
lines changed

src/plugins/data/public/ui/saved_query_management/saved_query_management_component.tsx

Lines changed: 56 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ import {
3333
} from '@elastic/eui';
3434

3535
import { i18n } from '@kbn/i18n';
36-
import React, { useEffect, useState, Fragment, useRef } from 'react';
36+
import React, { useCallback, useEffect, useState, Fragment, useRef } from 'react';
3737
import { sortBy } from 'lodash';
3838
import { SavedQuery, SavedQueryService } from '../..';
3939
import { SavedQueryListItem } from './saved_query_list_item';
@@ -88,9 +88,51 @@ export function SavedQueryManagementComponent({
8888
}
8989
}, [isOpen, activePage, savedQueryService]);
9090

91-
const goToPage = (pageNumber: number) => {
92-
setActivePage(pageNumber);
93-
};
91+
const handleTogglePopover = useCallback(() => setIsOpen((currentState) => !currentState), [
92+
setIsOpen,
93+
]);
94+
95+
const handleClosePopover = useCallback(() => setIsOpen(false), []);
96+
97+
const handleSave = useCallback(() => {
98+
handleClosePopover();
99+
onSave();
100+
}, [handleClosePopover, onSave]);
101+
102+
const handleSaveAsNew = useCallback(() => {
103+
handleClosePopover();
104+
onSaveAsNew();
105+
}, [handleClosePopover, onSaveAsNew]);
106+
107+
const handleSelect = useCallback(
108+
(savedQueryToSelect) => {
109+
handleClosePopover();
110+
onLoad(savedQueryToSelect);
111+
},
112+
[handleClosePopover, onLoad]
113+
);
114+
115+
const handleDelete = useCallback(
116+
(savedQueryToDelete: SavedQuery) => {
117+
const onDeleteSavedQuery = async (savedQuery: SavedQuery) => {
118+
cancelPendingListingRequest.current();
119+
setSavedQueries(
120+
savedQueries.filter((currentSavedQuery) => currentSavedQuery.id !== savedQuery.id)
121+
);
122+
123+
if (loadedSavedQuery && loadedSavedQuery.id === savedQuery.id) {
124+
onClearSavedQuery();
125+
}
126+
127+
await savedQueryService.deleteSavedQuery(savedQuery.id);
128+
setActivePage(0);
129+
};
130+
131+
onDeleteSavedQuery(savedQueryToDelete);
132+
handleClosePopover();
133+
},
134+
[handleClosePopover, loadedSavedQuery, onClearSavedQuery, savedQueries, savedQueryService]
135+
);
94136

95137
const savedQueryDescriptionText = i18n.translate(
96138
'data.search.searchBar.savedQueryDescriptionText',
@@ -113,25 +155,13 @@ export function SavedQueryManagementComponent({
113155
}
114156
);
115157

116-
const onDeleteSavedQuery = async (savedQuery: SavedQuery) => {
117-
cancelPendingListingRequest.current();
118-
setSavedQueries(
119-
savedQueries.filter((currentSavedQuery) => currentSavedQuery.id !== savedQuery.id)
120-
);
121-
122-
if (loadedSavedQuery && loadedSavedQuery.id === savedQuery.id) {
123-
onClearSavedQuery();
124-
}
125-
126-
await savedQueryService.deleteSavedQuery(savedQuery.id);
127-
setActivePage(0);
158+
const goToPage = (pageNumber: number) => {
159+
setActivePage(pageNumber);
128160
};
129161

130162
const savedQueryPopoverButton = (
131163
<EuiButtonEmpty
132-
onClick={() => {
133-
setIsOpen(!isOpen);
134-
}}
164+
onClick={handleTogglePopover}
135165
aria-label={i18n.translate('data.search.searchBar.savedQueryPopoverButtonText', {
136166
defaultMessage: 'See saved queries',
137167
})}
@@ -159,11 +189,8 @@ export function SavedQueryManagementComponent({
159189
key={savedQuery.id}
160190
savedQuery={savedQuery}
161191
isSelected={!!loadedSavedQuery && loadedSavedQuery.id === savedQuery.id}
162-
onSelect={(savedQueryToSelect) => {
163-
onLoad(savedQueryToSelect);
164-
setIsOpen(false);
165-
}}
166-
onDelete={(savedQueryToDelete) => onDeleteSavedQuery(savedQueryToDelete)}
192+
onSelect={handleSelect}
193+
onDelete={handleDelete}
167194
showWriteOperations={!!showSaveQuery}
168195
/>
169196
));
@@ -175,9 +202,7 @@ export function SavedQueryManagementComponent({
175202
id="savedQueryPopover"
176203
button={savedQueryPopoverButton}
177204
isOpen={isOpen}
178-
closePopover={() => {
179-
setIsOpen(false);
180-
}}
205+
closePopover={handleClosePopover}
181206
anchorPosition="downLeft"
182207
panelPaddingSize="none"
183208
buffer={-8}
@@ -235,7 +260,7 @@ export function SavedQueryManagementComponent({
235260
<EuiButton
236261
size="s"
237262
fill
238-
onClick={() => onSave()}
263+
onClick={handleSave}
239264
aria-label={i18n.translate(
240265
'data.search.searchBar.savedQueryPopoverSaveChangesButtonAriaLabel',
241266
{
@@ -256,7 +281,7 @@ export function SavedQueryManagementComponent({
256281
<EuiFlexItem grow={false}>
257282
<EuiButton
258283
size="s"
259-
onClick={() => onSaveAsNew()}
284+
onClick={handleSaveAsNew}
260285
aria-label={i18n.translate(
261286
'data.search.searchBar.savedQueryPopoverSaveAsNewButtonAriaLabel',
262287
{
@@ -280,7 +305,7 @@ export function SavedQueryManagementComponent({
280305
<EuiButton
281306
size="s"
282307
fill
283-
onClick={() => onSave()}
308+
onClick={handleSave}
284309
aria-label={i18n.translate(
285310
'data.search.searchBar.savedQueryPopoverSaveButtonAriaLabel',
286311
{ defaultMessage: 'Save a new saved query' }
@@ -299,7 +324,7 @@ export function SavedQueryManagementComponent({
299324
<EuiButtonEmpty
300325
size="s"
301326
flush="left"
302-
onClick={() => onClearSavedQuery()}
327+
onClick={onClearSavedQuery}
303328
aria-label={i18n.translate(
304329
'data.search.searchBar.savedQueryPopoverClearButtonAriaLabel',
305330
{ defaultMessage: 'Clear current saved query' }

x-pack/plugins/siem/public/components/query_bar/index.test.tsx

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,4 +376,63 @@ describe('QueryBar ', () => {
376376
expect(onSubmitQueryRef).toEqual(wrapper.find(SearchBar).props().onQuerySubmit);
377377
});
378378
});
379+
380+
describe('SavedQueryManagementComponent state', () => {
381+
test('popover should hidden when "Save current query" button was clicked', () => {
382+
const KibanaWithStorageProvider = createKibanaContextProviderMock();
383+
384+
const Proxy = (props: QueryBarComponentProps) => (
385+
<TestProviders>
386+
<KibanaWithStorageProvider
387+
services={{
388+
data: {
389+
query: {
390+
savedQueries: {
391+
findSavedQueries: jest.fn().mockResolvedValue({ total: 0, queries: [] }),
392+
getAllSavedQueries: jest.fn().mockResolvedValue([]),
393+
},
394+
},
395+
},
396+
}}
397+
>
398+
<QueryBar {...props} />
399+
</KibanaWithStorageProvider>
400+
</TestProviders>
401+
);
402+
403+
const wrapper = mount(
404+
<Proxy
405+
dateRangeFrom={DEFAULT_FROM}
406+
dateRangeTo={DEFAULT_TO}
407+
hideSavedQuery={false}
408+
indexPattern={mockIndexPattern}
409+
isRefreshPaused={true}
410+
filterQuery={{
411+
query: 'here: query',
412+
language: 'kuery',
413+
}}
414+
filterManager={new FilterManager(mockUiSettingsForFilterManager)}
415+
filters={[]}
416+
onChangedQuery={mockOnChangeQuery}
417+
onSubmitQuery={mockOnSubmitQuery}
418+
onSavedQuery={mockOnSavedQuery}
419+
/>
420+
);
421+
422+
const isSavedQueryPopoverOpen = () =>
423+
wrapper.find('EuiPopover[id="savedQueryPopover"]').prop('isOpen');
424+
425+
expect(isSavedQueryPopoverOpen()).toBeFalsy();
426+
427+
wrapper
428+
.find('button[data-test-subj="saved-query-management-popover-button"]')
429+
.simulate('click');
430+
431+
expect(isSavedQueryPopoverOpen()).toBeTruthy();
432+
433+
wrapper.find('button[data-test-subj="saved-query-management-save-button"]').simulate('click');
434+
435+
expect(isSavedQueryPopoverOpen()).toBeFalsy();
436+
});
437+
});
379438
});

0 commit comments

Comments
 (0)