Skip to content

Commit a8bcfe7

Browse files
authored
Fix browser navigation not restoring the previous search. (#24538)
* Properly notmalize empty query string. This fixes an error where going back to a search qithout a query string, did not update the view. * Properly update view and execute new search when URL query oparams change. For example when using the browser navigation. * Avoid executing search twice when using browser navigation. * Properly update browser history when creating a new search. * Ignore order of query params when comparing Uris. * Rever change that caused query input to be empty on replay search page. * Udpate tests * Extend tests * Improve tests * Adding changelog
1 parent d359c5a commit a8bcfe7

File tree

8 files changed

+268
-182
lines changed

8 files changed

+268
-182
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
type = "f"
2+
message = "Fix browser navigation not restoring the previous search"
3+
4+
issues = ["22105", "18484"]
5+
pulls = ["24583"]

graylog2-web-interface/src/views/components/Search.test.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import mockSearchesClusterConfig from 'fixtures/searchClusterConfig';
3030

3131
import OriginalSearch from './Search';
3232

33-
import { useSyncWithQueryParameters } from '../hooks/SyncWithQueryParameters';
33+
import useSyncWithQueryParameters from '../hooks/useSyncWithQueryParameters';
3434

3535
jest.mock('views/logic/fieldtypes/useFieldTypes');
3636

@@ -49,7 +49,7 @@ jest.mock('views/components/DashboardSearchBar', () => () => (
4949
</button>
5050
));
5151

52-
jest.mock('views/hooks/SyncWithQueryParameters');
52+
jest.mock('views/hooks/useSyncWithQueryParameters');
5353

5454
jest.mock('routing/withLocation', () => (Component) => (props) => (
5555
<Component location={{ query: {}, pathname: '', search: '' }} {...props} />

graylog2-web-interface/src/views/components/SynchronizeUrl.tsx

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,33 @@
1616
*/
1717
import { useEffect } from 'react';
1818

19-
import { useSyncWithQueryParameters } from 'views/hooks/SyncWithQueryParameters';
19+
import useSyncWithQueryParameters from 'views/hooks/useSyncWithQueryParameters';
2020
import bindSearchParamsFromQuery from 'views/hooks/BindSearchParamsFromQuery';
2121
import type { ViewsDispatch } from 'views/stores/useViewsDispatch';
22+
import useViewsDispatch from 'views/stores/useViewsDispatch';
2223
import type { RootState } from 'views/types';
2324
import { selectView } from 'views/logic/slices/viewSelectors';
24-
import useViewsDispatch from 'views/stores/useViewsDispatch';
2525
import { selectSearchExecutionState } from 'views/logic/slices/searchExecutionSelectors';
2626
import useLocation from 'routing/useLocation';
2727
import useQuery from 'routing/useQuery';
28+
import { updateView } from 'views/logic/slices/viewSlice';
2829

2930
const bindSearchParamsFromQueryThunk =
30-
(query: { [key: string]: unknown }) => (_dispatch: ViewsDispatch, getState: () => RootState) => {
31+
(query: { [key: string]: unknown }) => async (dispatch: ViewsDispatch, getState: () => RootState) => {
3132
const view = selectView(getState());
3233
const executionState = selectSearchExecutionState(getState());
33-
bindSearchParamsFromQuery({ view, query, retry: () => Promise.resolve(), executionState });
34+
35+
const result = await bindSearchParamsFromQuery({ view, query, retry: () => Promise.resolve(), executionState });
36+
37+
if (!result) {
38+
return Promise.resolve();
39+
}
40+
41+
const [newView] = result;
42+
43+
if (newView !== view) {
44+
return dispatch(updateView(newView, true));
45+
}
3446
};
3547

3648
const useBindSearchParamsFromQuery = (query: { [key: string]: unknown }) => {

graylog2-web-interface/src/views/hooks/BindSearchParamsFromQuery.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import isDeepEqual from 'stores/isDeepEqual';
2020
import type { ViewHook, ViewHookArguments } from 'views/logic/hooks/ViewHook';
2121
import View from 'views/logic/views/View';
2222
import normalizeSearchURLQueryParams from 'views/logic/NormalizeSearchURLQueryParams';
23-
import createSearch from 'views/logic/slices/createSearch';
2423

2524
const bindSearchParamsFromQuery: ViewHook = async ({ query, view, executionState }: ViewHookArguments) => {
2625
if (view.type !== View.Type.Search) {
@@ -68,11 +67,8 @@ const bindSearchParamsFromQuery: ViewHook = async ({ query, view, executionState
6867
return [view, executionState];
6968
}
7069

71-
const newSearch = view.search.toBuilder().newId().queries([newQuery]).build();
72-
73-
const savedSearch = await createSearch(newSearch);
74-
75-
const newView = view.toBuilder().search(savedSearch).build();
70+
const newSearch = view.search.toBuilder().queries([newQuery]).build();
71+
const newView = view.toBuilder().search(newSearch).build();
7672

7773
return [newView, executionState];
7874
};

graylog2-web-interface/src/views/hooks/SyncWithQueryParameters.test.tsx

Lines changed: 0 additions & 152 deletions
This file was deleted.

0 commit comments

Comments
 (0)