Skip to content

Commit c57297c

Browse files
authored
Bugfix clear saved query crashes kibana on Discover in some cases (#63554)
* actual hotfix * clean up redundant code * add functional test
1 parent b670851 commit c57297c

File tree

6 files changed

+46
-9
lines changed

6 files changed

+46
-9
lines changed

src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.js

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -828,13 +828,9 @@ function discoverController(
828828
if (newSavedQueryId) {
829829
setAppState({ savedQuery: newSavedQueryId });
830830
} else {
831-
//reset filters and query string, remove savedQuery from state
831+
// remove savedQueryId from state
832832
const state = {
833833
...appStateContainer.getState(),
834-
query: getDefaultQuery(
835-
localStorage.get('kibana.userQueryLanguage') || config.get('search:queryLanguage')
836-
),
837-
filters: [],
838834
};
839835
delete state.savedQuery;
840836
appStateContainer.set(state);

src/plugins/data/public/ui/query_string_input/language_switcher.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ export function QueryLanguageSwitcher(props: Props) {
6161
size="xs"
6262
onClick={() => setIsPopoverOpen(!isPopoverOpen)}
6363
className="euiFormControlLayout__append"
64+
data-test-subj={'switchQueryLanguageButton'}
6465
>
6566
{props.language === 'lucene' ? luceneLabel : kqlLabel}
6667
</EuiButtonEmpty>

src/plugins/data/public/ui/search_bar/create_search_bar.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,8 @@ export function createSearchBar({ core, storage, data }: StatefulSearchBarDeps)
124124
const onQuerySubmitRef = useRef(props.onQuerySubmit);
125125
const defaultQuery = {
126126
query: '',
127-
language: core.uiSettings.get('search:queryLanguage'),
127+
language:
128+
storage.get('kibana.userQueryLanguage') || core.uiSettings.get('search:queryLanguage'),
128129
};
129130
const [query, setQuery] = useState<Query>(props.query || defaultQuery);
130131

@@ -161,7 +162,7 @@ export function createSearchBar({ core, storage, data }: StatefulSearchBarDeps)
161162
setQuery,
162163
savedQueryId: props.savedQueryId,
163164
notifications: core.notifications,
164-
uiSettings: core.uiSettings,
165+
defaultLanguage: defaultQuery.language,
165166
});
166167

167168
// Fire onQuerySubmit on query or timerange change

src/plugins/data/public/ui/search_bar/lib/use_saved_query.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ interface UseSavedQueriesProps {
2929
queryService: DataPublicPluginStart['query'];
3030
setQuery: Function;
3131
notifications: CoreStart['notifications'];
32-
uiSettings: CoreStart['uiSettings'];
3332
savedQueryId?: string;
33+
defaultLanguage: string;
3434
}
3535

3636
interface UseSavedQueriesReturn {
@@ -41,7 +41,7 @@ interface UseSavedQueriesReturn {
4141

4242
export const useSavedQuery = (props: UseSavedQueriesProps): UseSavedQueriesReturn => {
4343
// Handle saved queries
44-
const defaultLanguage = props.uiSettings.get('search:queryLanguage');
44+
const defaultLanguage = props.defaultLanguage;
4545
const [savedQuery, setSavedQuery] = useState<SavedQuery | undefined>();
4646

4747
// Effect is used to convert a saved query id into an object

test/functional/apps/discover/_saved_queries.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,25 @@ export default function({ getService, getPageObjects }) {
147147
await savedQueryManagementComponent.clearCurrentlyLoadedQuery();
148148
expect(await queryBar.getQueryString()).to.eql('');
149149
});
150+
151+
// https://github.com/elastic/kibana/issues/63505
152+
it('allows clearing if non default language was remembered in localstorage', async () => {
153+
await queryBar.switchQueryLanguage('lucene');
154+
await PageObjects.common.navigateToApp('discover'); // makes sure discovered is reloaded without any state in url
155+
await queryBar.expectQueryLanguageOrFail('lucene'); // make sure lucene is remembered after refresh (comes from localstorage)
156+
await savedQueryManagementComponent.loadSavedQuery('OkResponse');
157+
await queryBar.expectQueryLanguageOrFail('kql');
158+
await savedQueryManagementComponent.clearCurrentlyLoadedQuery();
159+
await queryBar.expectQueryLanguageOrFail('lucene');
160+
});
161+
162+
// fails: bug in discover https://github.com/elastic/kibana/issues/63561
163+
// unskip this test when bug is fixed
164+
it.skip('changing language removes saved query', async () => {
165+
await savedQueryManagementComponent.loadSavedQuery('OkResponse');
166+
await queryBar.switchQueryLanguage('lucene');
167+
expect(await queryBar.getQueryString()).to.eql('');
168+
});
150169
});
151170
});
152171
}

test/functional/services/query_bar.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
* under the License.
1818
*/
1919

20+
import expect from '@kbn/expect';
2021
import { FtrProviderContext } from '../ftr_provider_context';
2122

2223
export function QueryBarProvider({ getService, getPageObjects }: FtrProviderContext) {
@@ -25,6 +26,7 @@ export function QueryBarProvider({ getService, getPageObjects }: FtrProviderCont
2526
const log = getService('log');
2627
const PageObjects = getPageObjects(['header', 'common']);
2728
const find = getService('find');
29+
const browser = getService('browser');
2830

2931
class QueryBar {
3032
async getQueryString(): Promise<string> {
@@ -62,6 +64,24 @@ export function QueryBarProvider({ getService, getPageObjects }: FtrProviderCont
6264
public async clickQuerySubmitButton(): Promise<void> {
6365
await testSubjects.click('querySubmitButton');
6466
}
67+
68+
public async switchQueryLanguage(lang: 'kql' | 'lucene'): Promise<void> {
69+
await testSubjects.click('switchQueryLanguageButton');
70+
const kqlToggle = await testSubjects.find('languageToggle');
71+
const currentLang =
72+
(await kqlToggle.getAttribute('aria-checked')) === 'true' ? 'kql' : 'lucene';
73+
if (lang !== currentLang) {
74+
await kqlToggle.click();
75+
}
76+
77+
await browser.pressKeys(browser.keys.ESCAPE); // close popover
78+
await this.expectQueryLanguageOrFail(lang); // make sure lang is switched
79+
}
80+
81+
public async expectQueryLanguageOrFail(lang: 'kql' | 'lucene'): Promise<void> {
82+
const queryLanguageButton = await testSubjects.find('switchQueryLanguageButton');
83+
expect((await queryLanguageButton.getVisibleText()).toLowerCase()).to.eql(lang);
84+
}
6585
}
6686

6787
return new QueryBar();

0 commit comments

Comments
 (0)