mirror of
https://github.com/elastic/kibana.git
synced 2025-04-25 02:09:32 -04:00
Fix saved query modal overlay (#68826)
This commit is contained in:
parent
113962e12a
commit
5fcf803d3d
2 changed files with 115 additions and 31 deletions
|
@ -33,7 +33,7 @@ import {
|
||||||
} from '@elastic/eui';
|
} from '@elastic/eui';
|
||||||
|
|
||||||
import { i18n } from '@kbn/i18n';
|
import { i18n } from '@kbn/i18n';
|
||||||
import React, { useEffect, useState, Fragment, useRef } from 'react';
|
import React, { useCallback, useEffect, useState, Fragment, useRef } from 'react';
|
||||||
import { sortBy } from 'lodash';
|
import { sortBy } from 'lodash';
|
||||||
import { SavedQuery, SavedQueryService } from '../..';
|
import { SavedQuery, SavedQueryService } from '../..';
|
||||||
import { SavedQueryListItem } from './saved_query_list_item';
|
import { SavedQueryListItem } from './saved_query_list_item';
|
||||||
|
@ -88,10 +88,52 @@ export function SavedQueryManagementComponent({
|
||||||
}
|
}
|
||||||
}, [isOpen, activePage, savedQueryService]);
|
}, [isOpen, activePage, savedQueryService]);
|
||||||
|
|
||||||
const goToPage = (pageNumber: number) => {
|
const handleTogglePopover = useCallback(() => setIsOpen((currentState) => !currentState), [
|
||||||
setActivePage(pageNumber);
|
setIsOpen,
|
||||||
|
]);
|
||||||
|
|
||||||
|
const handleClosePopover = useCallback(() => setIsOpen(false), []);
|
||||||
|
|
||||||
|
const handleSave = useCallback(() => {
|
||||||
|
handleClosePopover();
|
||||||
|
onSave();
|
||||||
|
}, [handleClosePopover, onSave]);
|
||||||
|
|
||||||
|
const handleSaveAsNew = useCallback(() => {
|
||||||
|
handleClosePopover();
|
||||||
|
onSaveAsNew();
|
||||||
|
}, [handleClosePopover, onSaveAsNew]);
|
||||||
|
|
||||||
|
const handleSelect = useCallback(
|
||||||
|
(savedQueryToSelect) => {
|
||||||
|
handleClosePopover();
|
||||||
|
onLoad(savedQueryToSelect);
|
||||||
|
},
|
||||||
|
[handleClosePopover, onLoad]
|
||||||
|
);
|
||||||
|
|
||||||
|
const handleDelete = useCallback(
|
||||||
|
(savedQueryToDelete: SavedQuery) => {
|
||||||
|
const onDeleteSavedQuery = async (savedQuery: SavedQuery) => {
|
||||||
|
cancelPendingListingRequest.current();
|
||||||
|
setSavedQueries(
|
||||||
|
savedQueries.filter((currentSavedQuery) => currentSavedQuery.id !== savedQuery.id)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (loadedSavedQuery && loadedSavedQuery.id === savedQuery.id) {
|
||||||
|
onClearSavedQuery();
|
||||||
|
}
|
||||||
|
|
||||||
|
await savedQueryService.deleteSavedQuery(savedQuery.id);
|
||||||
|
setActivePage(0);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
onDeleteSavedQuery(savedQueryToDelete);
|
||||||
|
handleClosePopover();
|
||||||
|
},
|
||||||
|
[handleClosePopover, loadedSavedQuery, onClearSavedQuery, savedQueries, savedQueryService]
|
||||||
|
);
|
||||||
|
|
||||||
const savedQueryDescriptionText = i18n.translate(
|
const savedQueryDescriptionText = i18n.translate(
|
||||||
'data.search.searchBar.savedQueryDescriptionText',
|
'data.search.searchBar.savedQueryDescriptionText',
|
||||||
{
|
{
|
||||||
|
@ -113,25 +155,13 @@ export function SavedQueryManagementComponent({
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
const onDeleteSavedQuery = async (savedQuery: SavedQuery) => {
|
const goToPage = (pageNumber: number) => {
|
||||||
cancelPendingListingRequest.current();
|
setActivePage(pageNumber);
|
||||||
setSavedQueries(
|
|
||||||
savedQueries.filter((currentSavedQuery) => currentSavedQuery.id !== savedQuery.id)
|
|
||||||
);
|
|
||||||
|
|
||||||
if (loadedSavedQuery && loadedSavedQuery.id === savedQuery.id) {
|
|
||||||
onClearSavedQuery();
|
|
||||||
}
|
|
||||||
|
|
||||||
await savedQueryService.deleteSavedQuery(savedQuery.id);
|
|
||||||
setActivePage(0);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const savedQueryPopoverButton = (
|
const savedQueryPopoverButton = (
|
||||||
<EuiButtonEmpty
|
<EuiButtonEmpty
|
||||||
onClick={() => {
|
onClick={handleTogglePopover}
|
||||||
setIsOpen(!isOpen);
|
|
||||||
}}
|
|
||||||
aria-label={i18n.translate('data.search.searchBar.savedQueryPopoverButtonText', {
|
aria-label={i18n.translate('data.search.searchBar.savedQueryPopoverButtonText', {
|
||||||
defaultMessage: 'See saved queries',
|
defaultMessage: 'See saved queries',
|
||||||
})}
|
})}
|
||||||
|
@ -159,11 +189,8 @@ export function SavedQueryManagementComponent({
|
||||||
key={savedQuery.id}
|
key={savedQuery.id}
|
||||||
savedQuery={savedQuery}
|
savedQuery={savedQuery}
|
||||||
isSelected={!!loadedSavedQuery && loadedSavedQuery.id === savedQuery.id}
|
isSelected={!!loadedSavedQuery && loadedSavedQuery.id === savedQuery.id}
|
||||||
onSelect={(savedQueryToSelect) => {
|
onSelect={handleSelect}
|
||||||
onLoad(savedQueryToSelect);
|
onDelete={handleDelete}
|
||||||
setIsOpen(false);
|
|
||||||
}}
|
|
||||||
onDelete={(savedQueryToDelete) => onDeleteSavedQuery(savedQueryToDelete)}
|
|
||||||
showWriteOperations={!!showSaveQuery}
|
showWriteOperations={!!showSaveQuery}
|
||||||
/>
|
/>
|
||||||
));
|
));
|
||||||
|
@ -175,9 +202,7 @@ export function SavedQueryManagementComponent({
|
||||||
id="savedQueryPopover"
|
id="savedQueryPopover"
|
||||||
button={savedQueryPopoverButton}
|
button={savedQueryPopoverButton}
|
||||||
isOpen={isOpen}
|
isOpen={isOpen}
|
||||||
closePopover={() => {
|
closePopover={handleClosePopover}
|
||||||
setIsOpen(false);
|
|
||||||
}}
|
|
||||||
anchorPosition="downLeft"
|
anchorPosition="downLeft"
|
||||||
panelPaddingSize="none"
|
panelPaddingSize="none"
|
||||||
buffer={-8}
|
buffer={-8}
|
||||||
|
@ -235,7 +260,7 @@ export function SavedQueryManagementComponent({
|
||||||
<EuiButton
|
<EuiButton
|
||||||
size="s"
|
size="s"
|
||||||
fill
|
fill
|
||||||
onClick={() => onSave()}
|
onClick={handleSave}
|
||||||
aria-label={i18n.translate(
|
aria-label={i18n.translate(
|
||||||
'data.search.searchBar.savedQueryPopoverSaveChangesButtonAriaLabel',
|
'data.search.searchBar.savedQueryPopoverSaveChangesButtonAriaLabel',
|
||||||
{
|
{
|
||||||
|
@ -256,7 +281,7 @@ export function SavedQueryManagementComponent({
|
||||||
<EuiFlexItem grow={false}>
|
<EuiFlexItem grow={false}>
|
||||||
<EuiButton
|
<EuiButton
|
||||||
size="s"
|
size="s"
|
||||||
onClick={() => onSaveAsNew()}
|
onClick={handleSaveAsNew}
|
||||||
aria-label={i18n.translate(
|
aria-label={i18n.translate(
|
||||||
'data.search.searchBar.savedQueryPopoverSaveAsNewButtonAriaLabel',
|
'data.search.searchBar.savedQueryPopoverSaveAsNewButtonAriaLabel',
|
||||||
{
|
{
|
||||||
|
@ -280,7 +305,7 @@ export function SavedQueryManagementComponent({
|
||||||
<EuiButton
|
<EuiButton
|
||||||
size="s"
|
size="s"
|
||||||
fill
|
fill
|
||||||
onClick={() => onSave()}
|
onClick={handleSave}
|
||||||
aria-label={i18n.translate(
|
aria-label={i18n.translate(
|
||||||
'data.search.searchBar.savedQueryPopoverSaveButtonAriaLabel',
|
'data.search.searchBar.savedQueryPopoverSaveButtonAriaLabel',
|
||||||
{ defaultMessage: 'Save a new saved query' }
|
{ defaultMessage: 'Save a new saved query' }
|
||||||
|
@ -299,7 +324,7 @@ export function SavedQueryManagementComponent({
|
||||||
<EuiButtonEmpty
|
<EuiButtonEmpty
|
||||||
size="s"
|
size="s"
|
||||||
flush="left"
|
flush="left"
|
||||||
onClick={() => onClearSavedQuery()}
|
onClick={onClearSavedQuery}
|
||||||
aria-label={i18n.translate(
|
aria-label={i18n.translate(
|
||||||
'data.search.searchBar.savedQueryPopoverClearButtonAriaLabel',
|
'data.search.searchBar.savedQueryPopoverClearButtonAriaLabel',
|
||||||
{ defaultMessage: 'Clear current saved query' }
|
{ defaultMessage: 'Clear current saved query' }
|
||||||
|
|
|
@ -376,4 +376,63 @@ describe('QueryBar ', () => {
|
||||||
expect(onSubmitQueryRef).toEqual(wrapper.find(SearchBar).props().onQuerySubmit);
|
expect(onSubmitQueryRef).toEqual(wrapper.find(SearchBar).props().onQuerySubmit);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('SavedQueryManagementComponent state', () => {
|
||||||
|
test('popover should hidden when "Save current query" button was clicked', () => {
|
||||||
|
const KibanaWithStorageProvider = createKibanaContextProviderMock();
|
||||||
|
|
||||||
|
const Proxy = (props: QueryBarComponentProps) => (
|
||||||
|
<TestProviders>
|
||||||
|
<KibanaWithStorageProvider
|
||||||
|
services={{
|
||||||
|
data: {
|
||||||
|
query: {
|
||||||
|
savedQueries: {
|
||||||
|
findSavedQueries: jest.fn().mockResolvedValue({ total: 0, queries: [] }),
|
||||||
|
getAllSavedQueries: jest.fn().mockResolvedValue([]),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<QueryBar {...props} />
|
||||||
|
</KibanaWithStorageProvider>
|
||||||
|
</TestProviders>
|
||||||
|
);
|
||||||
|
|
||||||
|
const wrapper = mount(
|
||||||
|
<Proxy
|
||||||
|
dateRangeFrom={DEFAULT_FROM}
|
||||||
|
dateRangeTo={DEFAULT_TO}
|
||||||
|
hideSavedQuery={false}
|
||||||
|
indexPattern={mockIndexPattern}
|
||||||
|
isRefreshPaused={true}
|
||||||
|
filterQuery={{
|
||||||
|
query: 'here: query',
|
||||||
|
language: 'kuery',
|
||||||
|
}}
|
||||||
|
filterManager={new FilterManager(mockUiSettingsForFilterManager)}
|
||||||
|
filters={[]}
|
||||||
|
onChangedQuery={mockOnChangeQuery}
|
||||||
|
onSubmitQuery={mockOnSubmitQuery}
|
||||||
|
onSavedQuery={mockOnSavedQuery}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
|
||||||
|
const isSavedQueryPopoverOpen = () =>
|
||||||
|
wrapper.find('EuiPopover[id="savedQueryPopover"]').prop('isOpen');
|
||||||
|
|
||||||
|
expect(isSavedQueryPopoverOpen()).toBeFalsy();
|
||||||
|
|
||||||
|
wrapper
|
||||||
|
.find('button[data-test-subj="saved-query-management-popover-button"]')
|
||||||
|
.simulate('click');
|
||||||
|
|
||||||
|
expect(isSavedQueryPopoverOpen()).toBeTruthy();
|
||||||
|
|
||||||
|
wrapper.find('button[data-test-subj="saved-query-management-save-button"]').simulate('click');
|
||||||
|
|
||||||
|
expect(isSavedQueryPopoverOpen()).toBeFalsy();
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue